【笔记】扩展欧几里得(exgcd)
最大公约数
记作 \(\gcd(a, b)\)。
重要性质:
- \(\gcd(a, b) = \gcd(b, a \operatorname{mod} b)\). 用来辗转相除法求最大公约数的方法。
递归写法:
inline ll gcd(ll a, ll b){
return b == 0 ? a : gcd(b, a % b);
}
也可以用迭代:
inline ll gcd_(ll a, ll b){
while(b){
ll tmp = b;
b = a % b, a = tmp;
}
return a;
}
- \(\operatorname{lcm}(a, b) = \frac{a\times b}{\gcd(a, b)}\)
用来求最小公倍数的方法,不常用。
裴蜀定理
若 \(a, b\) 为不全为 \(0\) 的整数,那么对于任意整数 \(x, y\) 都有 \(\gcd(x, y) | ax + by\) 成立,且不定方程 \(ax + by = \gcd(a, b)\) 必有解。
证明:设 \(d = \gcd(a, b)\),则可以将 \(a, b\) 表示为 \(pd, qd\)。那么 \(ax + by = adp + adq = d(ap + dq)\),所以 \(d | (ax + by)\)。
拓展欧几里得算法 (Exgcd)
用于求不定方程 \(ax + by = c\) 的解的算法。
由裴蜀定理,\(ax + by = \gcd(a, b)\) 必有整数解,求出一组特解。由辗转相除法,
为了一一对应,我们需要对这个式子进行处理使得两项系数分别为 \(a, b\),才可以用 \(x', y'\) 表示 \(x, y\)。
所以我们得到了 \(x, y\) 的递推式:
向下递归,直到 \(b = 0\),此时方程即 \(ax = a\),就得到了一组特解:
不断回溯的过程中按照上述方式计算每一层 \(x, y\) 的值,最后得到的结果就是 \(ax + by = \gcd(a, b)\) 的解\(x_0, y_0\)。
那么 \(ax + by = c\) 的一组解如下。
采取在原解的基础上变化的方式求通解。若 \(x\) 增加, 因为 \(c\) 不变,\(y\) 应当减小。设第一项增加了 \(p\),
因为要保证整数解,有 \(a\mid p, b\mid p\),所以 \(\operatorname{lcm}(a, b) \mid p\),一定可以将 \(p\) 表示为 \(k\operatorname{lcm}(a, b)\)。
所以:
对于 \(y\) 也是一样,
总结一下:
- 判断 \(\gcd(a, b)\) 是否能整除 \(c\),若不能,则原方程无解。
2.先求 \(ax + by = \gcd(a, b)\) 的特解 \(x_0, y_0\),采用递归,递推式为:
- 放大,得到 \(ax + by = c\) 的一组原解。
- 在原解基础上改变求出想要的任意一组解。

浙公网安备 33010602011771号