gcd与exgcd
gcd
辗转相除法求gcd证明
\(gcd(a, b) == gcd(b, a\%b)\)
证明:
设: \(d\)为\(a\)与\(b\)的一个公约数, 则有\(d|b\) \(d|a\)
设: \(a = k \times b + r\) 则有\(r = a \% b\)
\(r = a - kb\) 同除以\(d\)可得
\(r\over d\) \(=\) \(a\over d\) \(-\) \(kb\over d\)
又\(\because d|b , d|a\)
\(\therefore d | r\)
即 \(d | a\%b\), \(d\)为\(a\%b\)的一个因数.
又 \(\because d|b\)
\(\therefore d\) 为\(b\)与\(a\%b\)的一个公约数,
若\(d\)最大,则\(d\)为\(b\)与\(a\%b\)的最大公约数,
\(\therefore gcd(a, b) = gcd(b, a \% b)\) 得证
然后就可以递归求解gcd了
exgcd
求出\(a*x+b*y=c\)(a,b,c为常量)的一组解,时间复杂度\(log(a)\)
证明:
\(a*x+b*y=c\) 有整数解的充要条件是\(c\)整除\(gcd(a,b)\)
设\(gcd(a,b)=p\)
1.充分性:
\(a*x+b*y=c\)
\(a'*p*x+b'*p*y=c(a'=a/p)\)
\(p(a'*x+b'*y)=c;\)
因为\(x,y\)必须为整数
所以\(c\)必须整除\(p\)
2.必要性
使用欧几里得和数学归纳法可证明
首先\(b*x_1+(a \% b)*y_1=c\),有整数解,
则\(a*x_2+b*y_2=c\)有整数解
\(a*x_2+b*y_2\)
\(=b*x_1+(a \% b)*y_1\)
\(=b*x_1+(a-\lfloor \frac{a}{b} \rfloor*b)*y_1\)
\(=a*y_1+b*(x_1-\lfloor \frac{a}{b} \rfloor*y_1)\)
然后就可以得到对应关系\(x_2=y_1,y_2=(1-\lfloor \frac{a}{b} \rfloor)*y_1\);
显然最后的\(p,0\)有解
所以求这个\(a*x+b*y=c\)整数解的过程只需要不断递归运行到底层即可
最后一层\(p*x+0*y=c\)的解为\(x=\frac {c}{p},y=0\);
之后再不断用关系\(x_2=y_1,y_2=(x_1-\lfloor \frac{a}{b} \rfloor*y_1)\)推出上一层的解即可
gcd与exgcd的更多相关文章
- gcd以及exgcd入门讲解
gcd就是最大公约数,gcd(x, y)一般用(x, y)表示.与此相对的是lcm,最小公倍数,lcm(x, y)一般用[x, y]表示. 人人都知道:lcm(x, y) = x * y / gcd( ...
- 从BZOJ2242看数论基础算法:快速幂,gcd,exgcd,BSGS
LINK 其实就是三个板子 1.快速幂 快速幂,通过把指数转化成二进制位来优化幂运算,基础知识 2.gcd和exgcd gcd就是所谓的辗转相除法,在这里用取模的形式体现出来 \(gcd(a,b)\) ...
- 【板子】gcd、exgcd、乘法逆元、快速幂、快速乘、筛素数、快速求逆元、组合数
1.gcd int gcd(int a,int b){ return b?gcd(b,a%b):a; } 2.扩展gcd )extend great common divisor ll exgcd(l ...
- gcd和exgcd和lcm
Gcd▪ 欧几里得算法又称辗转相除法,用于计算两个正整数 a, b 的最大公约数.▪ 计算公式为 gcd(a,b) = gcd(b,a mod b).▪ 公式无需证明,记忆即可.▪ 如果要求多个数的最 ...
- 数论入门2——gcd,lcm,exGCD,欧拉定理,乘法逆元,(ex)CRT,(ex)BSGS,(ex)Lucas,原根,Miller-Rabin,Pollard-Rho
数论入门2 另一种类型的数论... GCD,LCM 定义\(gcd(a,b)\)为a和b的最大公约数,\(lcm(a,b)\)为a和b的最小公倍数,则有: 将a和b分解质因数为\(a=p1^{a1}p ...
- 关于gcd和exgcd的一点心得,保证看不懂(滑稽)
网上看了半天……还是没把欧几里得算法和扩展欧几里得算法给弄明白…… 然后想了想自己写一篇文章好了…… 参考文献:https://www.cnblogs.com/hadilo/p/5914302.htm ...
- Algorithm: GCD、EXGCD、Inverse Element
数论基础 数论是纯数学的一个研究分支,主要研究整数的性质.初等数论包括整除理论.同余理论.连分数理论.这一篇主要记录的是同余相关的基础知识. 取模 取模是一种运算,本质就是带余除法,运算结果就是余数. ...
- 【模板】gcd和exgcd
1. gcd: int gcd(int a,int b) { return !b?a:gcd(b,a%b); } exgcd: int exgcd(int a,int b,int& x,int ...
- gcd&&exgcd&&斐蜀定理
gcd就是求a和b最大公约数,一般方法就是递推.不多说,上代码. 一.迭代法 int gcd(int m, int n) { ) { int c = n % m; n = m; m = c; } re ...
随机推荐
- update改数据详解
update修改数据的要素 : 改哪张表? 改哪几列的值? 分别改成什么值? 在哪些行生效?(这个很重要,否则所有行都会受影响) mysql> update class ; where 表达式 ...
- 集成Spring-Boot与gRPC,grpc-spring-boot-starter
项目地址:grpc-spring-boot-starter grpc是一个出身名门的RPC框架,性能高,灵活度高,支持多语言. 支持多语言,如果你的项目在使用多种语言做开发,非常推荐使用. 作为Jav ...
- 前端学习:学习笔记(JS部分)
前端学习:学习笔记(JS部分) 前端学习:JS学习总结(图解) JS的简介 JS基本语法 JS内置对象 JS的函数 JS的事件 JS的BOM JS的DOM JS的简介 新建步骤 <body ...
- Java中如何获取一个类中泛型的实际类型
本文链接:https://blog.csdn.net/kuuumo/article/details/83021158 _______________________________________ ...
- fancybit个人简介
程序员一枚 熟悉C C++ C# js lua等多种常见开发语言 熟悉Unity游戏开发 node.js pomelo和C# scut 网游后端框架 做过.net和php网站后端 二次元文化爱好者 有 ...
- 微服务架构 ------ DockerCompose从安装到项目部署
DockerCompose的目的:简化Docker的启动和停止流程,以及编排Docker启动服务与服务之间的关系 DockerCompose的安装:curl -L https://get.daoclo ...
- Java自学-I/O 字符流
Java的字符流 Reader Writer Reader字符输入流 Writer字符输出流 专门用于字符的形式读取和写入数据 步骤 1 : 使用字符流读取文件 FileReader 是Reader子 ...
- Unity Ioc 依赖倒置及Untity AOP被动拦截/自动拦截
各位博友金安,首先声明这是一篇转载的博客,原文链接:https://www.cnblogs.com/scottpei/archive/2013/01/08/2851087.html 十年河东,十年河西 ...
- 来自数组原型 Array.prototype 的遍历函数
1. Array.prototype.forEach() forEach() 是一个专为遍历数组而生的方法,它没有返回值,也不会改变原数组,只是简单粗暴的将数组遍历一次 参数: callback() ...
- PHP如何创建文件夹(mkdir的用法,mkdirs的语法)【转】
(PHPmkdir如何创建多级目录) 在开始之前,我先说明一下,可能许多朋友与我一样认为只要给一个路径,mkdir就可以创建文件夹,其它不是那样,单个的MKDIR只能创建一级目录,对于多级的就不 ...