欧几里德 与 扩展欧几里得 学习笔记
最近学了学扩展欧几里得,总结一下
欧几里得算法
欧几里得算法主要用来求a,b的最大公约数,又称为gcd
代码
int Gcd(int a,int b)
{if(b==0) return a;else return Gcd(b,a%b);
}
就是用递归来求解,当 b==0 b == 0 b==0时退出,证明也非常易懂
证明
就是证明 gcd(a,b)=gcd(b,a g c d ( a , b ) = g c d ( b , a gcd(a,b)=gcd(b,a mod m o d mod b) b ) b)
设 d=gcd(a,b),即d|a,d|b d = g c d ( a , b ) , 即 d | a , d | b d=gcd(a,b),即d|a,d|b
∵ ∵ ∵a" role="presentation" style="position: relative;">aaa mod m o d mod b=a−b∗⌊a/b⌋),d|a,d|b b = a − b ∗ ⌊ a / b ⌋ ) , d | a , d | b b=a-b*\lfloor a/b\rfloor),d|a,d|b
∴d|(a−b∗⌊a/b⌋) ∴ d | ( a − b ∗ ⌊ a / b ⌋ ) ∴d|(a-b*\lfloor a/b\rfloor)
又∵d|b 又 ∵ d | b 又∵d|b
∴d|gcd(b, ∴ d | g c d ( b , ∴d|gcd(b, a a a mod" role="presentation" style="position: relative;">modmodmod b) b ) b)
应用
应用就是求 a,b a , b a,b的最大公约数。
扩展欧几里得算法
扩展欧几里得算法就是求一组 (x,y) ( x , y ) (x,y)使得 ax+by=gcd(a,b) a x + b y = g c d ( a , b ) ax+by=gcd(a,b),又称为 ex e x ex_ gcd. g c d . gcd.
代码
我们就是在求 gcd g c d gcd的过程中对 x,y x , y x,y进行计算。
当 b=0 b = 0 b=0时我们会发现 x=1,y=0 x = 1 , y = 0 x=1,y=0时,满足gcd的计算
然后我们再倒着推回去,证明下面;
int Ex_Gcd(int a,int b,int &x,int &y)
{if(b==0){x=1;y=0;return a;}int ans=Ex_Gcd(b,a%b,x,y);int temp=x;x=y;y=temp-(a/b)*y;return ans;
}
证明
我们就是来证明递归的时侯 x,y x , y x,y的计算式
首先我们设 ax+by=gcd(a,b) a x + b y = g c d ( a , b ) ax+by=gcd(a,b)
又因为 gcd(a,b)=gcd(b,a g c d ( a , b ) = g c d ( b , a gcd(a,b)=gcd(b,a mod m o d mod b)=ax+by b ) = a x + b y b)=ax+by
把 gcd(b,a g c d ( b , a gcd(b,a mod m o d mod b ) ) )代入得
bx1+(a−b∗⌊a/b⌋)y1=gcd(b,a" role="presentation" style="position: relative;">bx1+(a−b∗⌊a/b⌋)y1=gcd(b,abx1+(a−b∗⌊a/b⌋)y1=gcd(b,abx^1+(a-b*\lfloor a/b \rfloor )y^1=gcd(b,a mod m o d mod b) b ) b)
去括号得 ay1+b(x1−y1∗⌊a/b⌋)=gcd(a,b) a y 1 + b ( x 1 − y 1 ∗ ⌊ a / b ⌋ ) = g c d ( a , b ) ay^1+b(x^1-y^1*\lfloor a/b \rfloor)=gcd(a,b)
证完了
通解
我们使用扩展欧几里得算法求出来的解 x,y x , y x,y只是 ax+by=gcd(a,b) a x + b y = g c d ( a , b ) ax+by=gcd(a,b)其中的一组可行解,有时候题目会要求我们求出一些有限制的解这时候我们就要根据这一组解来求出满足限制的解
通解:
我们设 x,y x , y x,y是方程的解
x1=x+t∗lcm(a,b)a,t∈Z x 1 = x + t ∗ l c m ( a , b ) a , t ∈ Z x^1=x+t*\frac{lcm(a,b)}{a},t\in Z
y1=y−t∗lcm(a,b)b,t∈Z y 1 = y − t ∗ l c m ( a , b ) b , t ∈ Z y^1=y-t*\frac{lcm(a,b)}{b},t\in Z
lcm(a,b) l c m ( a , b ) lcm(a,b)表示 a,b a , b a,b的最小公倍数 lcm(a,b)=abgcd(a,b) l c m ( a , b ) = a b g c d ( a , b ) lcm(a,b)=\frac {ab}{gcd(a,b)}
应用
求解不定方程 ax+by=c a x + b y = c ax+by=c
这个看着和上面那一个差不多一样,我们先设 d=gcd(a,b) d = g c d ( a , b ) d=gcd(a,b)
我们把方程两遍同时 /gcd(a,b) / g c d ( a , b ) /gcd(a,b)就可以得到
a1x+b1y=c1 a 1 x + b 1 y = c 1 a^1x+b^1y=c^1
这时候我们发现因为 x,y x , y x,y都是整数,所以方程有解得条件是 d|c d | c d|c
然后再同时 /c1 / c 1 /c^1得到
a1xc1+b1yc1=1 a 1 x c 1 + b 1 y c 1 = 1 a^1\frac {x}{c^1}+b^1\frac{y}{c^1}=1
我们用Ex_gcd求出一组解再乘回去就可以了.求解逆元
我们用 inv(x) i n v ( x ) inv(x)来表示x在 mod m o d mod p p p下的逆元
扩展欧几里得还可以用来求解ax≡1((modp))" role="presentation" style="position: relative;">ax≡1((modp))ax≡1((modp))ax\equiv 1 (\pmod p)
转移一下得: ax−pk=1 a x − p k = 1 ax-pk=1然后我们就可以用扩展欧几里得算法来求出x的值
有不懂的或者有错误的可以留言,谢谢
欧几里德 与 扩展欧几里得 学习笔记相关推荐
- 扩展欧几里得学习笔记
简述Exgcd 要求关于\(x,y\)的方程\(ax+by=c\)的一组解. 假装显然我们要先求出\(ax+by=\mathrm{gcd}(a,b)\)的一组解,然后就可以找出所有的解\(x,y\). ...
- [数论]Gcd/ExGcd欧几里得学习笔记
\(Q\):什么是\(GCD\)? \(GCD\) \(GCD\),即最大公约数(\(Greatest\ Common\ Divisor\)) 对于两个自然数\(a,b\),定义\(GCD(a,b)\ ...
- 欧几里得原理及扩展欧几里得原理(Euclidean Theory and Extended Euclidean Theory)学习笔记
题记:这是我第四次复习扩展欧几里得原理,因为不常用到,想要使用的时候又想不起细节,总是要查资料,于是索性这次整理一下欧几里得原理及其扩展原理存档至博客以备查用. 一.欧几里得原理 欧几里得原理(Euc ...
- 【数论初步学习】扩展欧几里得定理
本章节不以理解算法为目的,更注重于使用. 首先需要了解扩展欧几里得的算法 ---找出一对(x,y),使得其能满足ax+by=gcd(a,b)这一式子. 下面给出实现此算法的代码 void gcd(in ...
- 求解线性同余方程--扩展欧几里得
资料来源:https://blog.csdn.net/ //求解ax=b(mod m) 返回0为无解,否则返回gcd(a,m)个mod m意义下的解,用X[]存 int mod(int a, int ...
- 欧几里得 扩展欧几里得
欧几里得 & 扩展欧几里得 时间复杂度T(n):O(log2n); 空间复杂度S(n):O(n); Advantages: 1. 时间复杂度不高,和普通欧几里得一样: 2. 代 ...
- 欧几里得算法扩展欧几里得
本文包括: 1.几里德算法 递归实现 2.扩展欧几里德算法 递归实现 -实际上就是把别人总结的,我认为有助于自己理解的内容copy过来,再加上几句自己的理解. 欧几里得算法 欧几里德算法又称辗转相除法 ...
- 【欧几里得扩展欧几里得】
欧几里得 LL gcd(LL a,LL b){return (b==0) ? a : gcd(b,a%b);} 扩展欧几里得 int ex_gcd(int a,int b,int &x,int ...
- 扩展欧几里得及其应用
欧几里得算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数.其计算原理依赖于下面的定理:gcd(a,b)=gcd(a,a mod b) gcd函数就是用来求(a,b)的最大公约数的. ...
最新文章
- LDAP 中 CN, OU, DC 的含义(ldap学习一)
- 在ChemDraw中输入千分号的方法
- Linux下压力测试工具Webbench介绍
- 图书网上商城blog
- 文献学习(part23)--双向聚类方法综述
- 男人都应该懂的一张图。。 | 今日趣图
- qt点击按钮本身,来删除自身
- 和电商有关的词语_电商描写的词语 形容“电”的词语有哪些?
- 工作的思考十六:层次的提升 - 团队
- github 仓库管理及代码上传
- NLP 事件抽取综述(中)—— 模型篇
- networkxpdf_1 NetworkX概述
- 仪表放大器 电流的检测
- Ubuntu20.04 conda安出错,成功解决:solving environment:failed with initial frozen solve.Retrying with flexibl
- Centos7服务器网络配置
- MGD 调试 Lives2d 文字破碎问题 (MX2)
- 夜班媒体人援助项目在京启动,陈于冰说:“一直以来.....
- Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day21】—— Linux命令
- RTM版,即Release To Manufacturing(发布到制造)
- 快收藏!高手Linux运维管理必备工具大全,你会吗?