裴蜀定理:设(a,b) = d,,对于任意的整数x, y,ax + by都一定是d的倍数。特别地,一定存在整数x, y(不一定唯一),使ax + by = d成立。
另外,若a不等于b,则d为a和b的线性组合所能表示的最小整数。
扩展欧几里得算法:用于解决如何求出裴蜀定理中的x, y。对于两个整数a, b,我们都知道欧几里得算法可以用来求这两个数的最大公约数,扩展欧几里得可以在求得最大公约数的同时将系数x, y也求得,这也就是其称为扩展欧几里得算法的原因。
算法过程:要求ax + by = d,容易发现当b = 0时,答案是显然的,即x = 1,y可取任意值。现在考虑能否倒着推回去,假设现在我已经得到了一组x, y使得by + (a % b)x = d,将这个式子整理一下得到,ax + (y - a / b * x)b = d,由于当前a, x, y, b都是已知的,所以我可以得到当前的解为x = x,y = y - a / b * x。所以我调用的时候只需调用exgcd(b, a % b, y, x),在回溯的时候令y -= a / b * x即可。
通解为:x = x0 - kb/d
y = y0 + ka/d
代码:
int exgcd(int a, int b, int& x, int& y) {
if (b == 0) { x = 1, y = 0; return a; } //此处y可取任意值,但要注意防止爆int的情况
int d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}