| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 欧几里德算法及其扩展 -> 正文阅读 |
|
[数据结构与算法]欧几里德算法及其扩展 |
欧几里德算法其实就是辗转相除法,求最大公因数。 具体做法是:用较大数除以较小数,再用所得的余数(第一余数)去除除数,再用所得的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。最后的除数就是这两个数的最大公约数。 记gcd(a,b)为整数a和b的最大公因数。
欧几里德算法的扩展——裴蜀(贝祖)等式 (最下方有相关知识点的代码实现模板,请自行选择是否越过文字解释) 对任何整数a,b和它们的最大公约数d,关于未知数x和y的线性方程(裴蜀等式): ax+by=m(m为d的倍数)当且仅当gcd(a,b)=d时有整数解 裴蜀等式有解时必然有无穷多个整数解,每组解x、y都称裴蜀数 特别地,方程ax+by=1有整数解当且仅当整数a,b互素。 x,y可以通过扩展欧几里德求解: 欧几里德算法停止的状态是:a=gcd ,b=0 ,那么,a'x+b'y=gcd 此时x=1,y为任意数。 因为,这时候只要a=gcd的系数是1,那么只要b的系数是0或者其他值(无所谓是多少,反正任意数乘以0都等于0但是a 的系数一定是1),这时,我们可以得到:a*1+b*0=gcd。 当然这是最终状态,但是我们可以以此反推到最初状态。 假设当前我们要处理的是求出a和b的最大公约数,并求出x和y使得ax+by=gcd,而我们已经求出了下一个状态:b和a%b的最大公约数,并求出了一组X1和Y1使得:b*X1+(a%b)*Y1=gcd,那么这两个相邻的状态之间是否存在一种关系呢? 令a%b=k,==> a = b*(a/b)+k 即 a%b?= a - (a/b)*b 那么:?gcd=b*X1 + (a-(a/b)*b)*Y1 ? ?? ?? ? ? ? =b*X1 + a*Y1 - (a/b)*b*Y1 ? ?? ?? ? ? ? =a*Y1 + b*(X1 - a/b*Y1) 对比 a*Y1 + b*(X1 - a/b*Y1) 和 ax+by=gcd ,求一组x和y使得ax+by=gcd 由此得到递推公式: ? ? ? ? x=Y1 ? ? ? ? y=X1-a/b*Y1 但是需要注意的是,根据这个递推所求的x是ax+by=d的解,而扩展欧几里德算法就是在求a,b的最大公约数d=gcd(a,b)的同时,求出贝祖等式ax+by=m的一个解(X0,Y0) 所以实际上,X0=x*m*(d^(-1)) 通项:(t是一个倍数) ? ? ? ? x=X0 + (b/gcd) * t? ? ? ? (所有的x对b同模)? ? ? ? 求得的x1、x2、x3、x4之间是k倍的(b/d) ? ? ? ? y=Y0 - (a/gcd)* t? ? ? ? ?(所有的y对a同模)????????求得的y1、y2、y3、y4之间是k倍的(a/d) 相关知识点代码实现模板如下:
?如果想要得到x大于0的第一个解: b/=d;? ? x = (x0%b+b)%b |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 17:28:55- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |