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 ...
随机推荐
- 在 ubuntu 下如何压缩与解压 7zip 文件。
1. 首先利用 ubuntu 软件中心搜索并下载 7zip.或者在终端中输入:sudo apt-get install p7zip 2. 压缩 3. 解压 谢谢浏览!
- JSONBuilder的用法
一.JSONBuilder可以向文件中写入写入json字符串.如下面的例子: 1 public class Test 2 { 3 public static void main(String args ...
- Java中Deque特性及API
美人如斯,文章如斯! 定义 双向队列:支持插入删除元素的线性集合 特性: 插入.删除.获取操作支持两种形式:快速失败和返回null或true/false 既具有FIFO特点又具有LIFO特点,即是队列 ...
- 《 .NET并发编程实战》阅读指南 - 第2章
先发表生成URL以印在书里面.等书籍正式出版销售后会公开内容.
- redis集群cluster简单设置
环境: 这里参考官方使用一台服务器:Centos 7 redis-5.0.4 192.168.10.10 redis集群cluster最少要3个主节点,所以本次需要创建6个实例:3个主节点,3 ...
- flex:1和flex:auto详解
flex:1和flex:auto详解 首先明确一点是, flex 是 flex-grow.flex-shrink.flex-basis的缩写. flex-grow属性定义项目的放大比例,默认为0,即如 ...
- vue项目开发遇见bug
1.附件的点击问题,与原生交互的问题: 原生的调用对象和vue的调用对象不同,注意原生方法的位置. 2.10.2以下fetch请求数据的问题(检查是否可以使用 can i use) 10.2以下ios ...
- react学习-react父组件给子组件传值与设置传值类型以及是否必传参数
react 父组件给子组件传参时,父组件直接在引入的子组件内写入要传递的参数即可 <HeaderComponent title={"传递的参数"}></Heade ...
- echarts 折线图百分比 tooltip 实例 两种方法
方法一 在知道有几个类型时:下面有五个类型 tooltip : { show : true, trigger: 'axis', formatter: '{b0}<br/>{a0}: {c0 ...
- 个人项目-WC(Java实现)
一.Github项目地址: https://github.com/kestrelcjx/-WC-Java- 二.PSP表格 PSP2.1 Personal Software Process Stage ...