扩展欧几里得主要是解决二元一次方程
即a*x + b*y + c = 0的解的问题
拓展欧几里得:
void ex_gcd(int a, int b, int& d, int& x, int& y){
if(!b){
d = a;
x = 1;
y = 0;
}
else{
ex_gcd(b, a%b, d, y, x);
y -= x*(a/b);
}
}
数学归纳法可证明正确,此处不再证明
最后得出的d是a和b的最大公约数,求得(x1, y1)是a*x + b*y = d的一组解,设另一组解x2,y2
a*x1 + b*y1 = a*x2 + b*y2(都等于d,即gcd(a, b)),变形得a*(x1 - x2) = b*(y2 - y1)
两边同除以d即gcd(a, b),(d不为0, 若d为0,则a,b均小于等于0,且有一个为0,需特判)
此时a1*(x1 - x2) = b1*(y2 - y1),a1 = a/d,b1 = b/d;
此时a1和b1互为素数,(x1 - x2)必然是b1的整数倍,设为k*b1;同理(y2 - y1) = k*a1
由此可得,对a*x + b*y = c的一组解是(x0, y0),则任意整数解可写为(x0+k*b1, y0-k*a1),a1 = a/gcd(a, b),b1 = b/gcd(a, b)
a*x + b*y = gcd(a, b)的一组解是(x0, y0),若c是gcd(a, b)的倍数,则a*x + b*y = c有唯一整数解(x0*c/d, y0*c/d),否则无整数解