拓展欧几里得
在了解拓展欧几里得时,建议大家先去看一眼欧几里得算法(也叫辗转相除法)
过程大概如下图所示:

那么,我们因此也可以给出一段代码:
int gcd(int a,int b)
{
return b ? gcd(b,a%b) : a;
}
为什么成立这一块以后会来填坑的/qq
那么,什么是拓展欧几里得呢?
拓展欧几里得是一种算法,在不断的辗转相除中得到不定方程
\(ax+by=c\) 的一组解;
我们借着上面的那个图来说明一下:
我们看最后一个式子:\(21=6×3+3\) 这里,我们也可以写成:\(3=6×(-3)+21\)
也就是说,\(3\) 可以被表示为 \(6\) 和 \(21\) 的线性组合。
那么我们接着看,\(6\) 也可以成 \(21\) 和 \(27\) 的线性组合,因此,有:
\[3=6×(-3)+21=(27-21)×(-3)+21=27×(-3)+21×4
\]
那么一直往下推,我们就可以推出来:\(3\) 就是 \(75\) 和 \(48\) 的线性组合;
那么,如果 \(c\) 是其他的数,能不能找到解呢?
其实 \(c\) 必须要是 \(\gcd(a,b)\) 的倍数,因此,尝试等式两边同时初以 \(\gcd(a,b)\);
\[\frac{a}{\gcd(a,b)}x+\frac{b}{\gcd(a,b)}y=\frac{c}{\gcd(a,b)}
\]
因为等式的左侧肯定是一个整数,为了使等式成立,等式的右侧也必然是一个整数
那么我们同样也来看一看这个的具体过程

这里呢,通过求 \(bx_0+(a \mod b)y_0=c\) 的解,就可以得出来 \(ax+by=c\) 的解;
对比 \(x\) 的系数和 \(y\) 的系数,就是
\(\begin{cases}x=y0\\y=x0-\left [ a /b \right ]y0 \end{cases}\)
这玩意其实就跟辗转相除差不多一回事,当 \(b=0\) 的时候结束递归,
最后令 \(x=1,y=0\)
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;
}
后续的证明正在施工中。

浙公网安备 33010602011771号