浅谈扩展欧几里德
题外语:大后天就是复赛了,不负光阴,加油!
扩展欧几里德是一项较为基础的数论专项
定义:一个 \(ax+by=gcd(a,b)\) 的式子,\(a,b\)为给定的值,求\(x,y\)的解
首先,这个式子满足:解一定存在。
回忆我们知道的欧几里德算法,是把\(gcd(a,b)\)转化求解为\(gcd(b,a\mod b)\),类比一下,看看扩展欧几里德可不可以运用到这种方法呢?
当然可以。不然为什么叫扩展,数学同题不同问间都有关系
假设我们已经求解出了\(x_1,y_1\)的值,且\(bx_1+(a\mod b)y_1=gcd(a,b)\)
因为\(a\mod b==a-(a / b)*b\)
所以等量代换 \(bx_1+[a-(a / b)*b]y_1=gcd(a,b)\)
拆个括号,\(bx_1+ay_1-(a/b)*by_1=gcd(a,b)\)
转换: \(ay_1+b[x1-(a/b)y1]=gcd(a,b)\)
总觉得有点儿熟悉啊......
\(ax+by=gcd(a,b)\)
\(ay_1+b[x1-(a/b)y1]=gcd(a,b)\)
一模一样
所以\(x=y1,y=x1-(a/b)y1.\)
递推式就出来了——
1.\(x_n=y_n+1,y_n=x_{n+1}-(a/b)y_{n+1}\)
2.当 \(b\) 为 \(0\) 时,\(return\) \(a\)因为此时的\(a\)就是\(gcd\)
也就是说,欧几里得算法中\(gcd\)部分结束时变量a中存放的是gcd,变量b中存放的是0,因此此时显然有\(a\times 1+b\times 0=gcd\)成立,此时有\(x=1,y=0\)成立。
update:2022/03/05:20:43
至于通解:
\[x=x_0+ \frac{lcm(a,b)}{a},
\]
\[y=y_0- \frac{lcm(a,b)}{b}
\]
和
\[x=[(x_0 \mod \frac{b}{gcd(a,b)})+\frac{b}{gcd(a,b)}] \mod \frac{b}{gcd(a,b)}
\]
\[.............还是自己再推推吧.............
\]
核心代码如下:
int exgcd(int a, int b, int &x, int &y) {
if(b == 0) {
x = 1;
y = 0;
return a;
}
int r = exgcd(b, a % b, x, y);
int t = x;
x = y;
y = t - a / b * y;
return r;
}
2021.11.07:Ps:PJ-301一等,TG-55二等

浙公网安备 33010602011771号