拓展欧几里得
在了解拓展欧几里得时,建议大家先去看一眼欧几里得算法(也叫辗转相除法)
过程大概如下图所示:
那么,我们因此也可以给出一段代码:
int gcd(int a,int b)
{
return b ? gcd(b,a%b) : a;
}
为什么成立这一块以后会来填坑的/qq
那么,什么是拓展欧几里得呢?
拓展欧几里得是一种算法,在不断的辗转相除中得到不定方程
的一组解;
我们借着上面的那个图来说明一下:
我们看最后一个式子: 这里,我们也可以写成:
也就是说, 可以被表示为 和 的线性组合。
那么我们接着看, 也可以成 和 的线性组合,因此,有:
那么一直往下推,我们就可以推出来: 就是 和 的线性组合;
那么,如果 是其他的数,能不能找到解呢?
其实 必须要是 的倍数,因此,尝试等式两边同时初以 ;
因为等式的左侧肯定是一个整数,为了使等式成立,等式的右侧也必然是一个整数
那么我们同样也来看一看这个的具体过程
这里呢,通过求 的解,就可以得出来 的解;
对比 的系数和 的系数,就是
这玩意其实就跟辗转相除差不多一回事,当 的时候结束递归,
最后令
int gcd(int a, int b,int &x,int &y) {
if (b == 0) {
x = 1, y = 0;
return a;
}
int ans = gcd(b, a % b, x, y);
int temp = x;
x = y;
y = temp - a / b * y;
return ans;
}
后续的证明正在施工中。
本文作者:zsdqwq
本文链接:https://www.cnblogs.com/wo-de-bo-ke-wo-zuo-zhu/p/exgcd.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步