ax + by = gcd(a,b) = gcd(b,a%b) = b x 1 x_1 x1 + (a - a b b ) y 1 = a y 1 + b ( x 1 − a b y 1 \frac{a}{b}b)y_1 = ay_1 + b(x_1 - \frac{a}{b}y_1 bab)y1=ay1+b(x1−bay1)
考虑gcd的调用顺序 有 x = y 1 y_1 y1, y = ( x 1 x_1 x1 - a b y 1 \frac{a}{b}y_1 bay1)
当b == 0 时,则有 x = 1,y = 0;
故有代码为
int exgcd(int a,int b,int &x,int &y){
if(b == 0){
x = 1,y = 0;
return a;
}
int d = exgcd(b,a%b,y,x);// 这里直接交换了x,y
y -= a/b * x;
return d;
}
性质1:
假设求出了一组合法的解。(x,y) 对于另外的一组解 (m,n)
ax + by = am + bn -> a(x-m) = b(y-n)
设g = gcd(a,b) a 1 = a g a_1 = \frac{a}{g} a1=ga b 1 = b g b_1 = \frac{b}{g} b1=gb
a 1 a_1 a1(x-m) = b 1 b_1 b1(y-n)
因为 a 1 和 b 1 a_1 和 b_1 a1和b1 互质,故(x-m) = k b 1 kb_1 kb1 同时解除(y-n) = − k a 1 -ka_1 −ka1
故(m,n) = ( x − k b 1 x-kb_1 x−kb1, y + k a 1 y+ka_1 y+ka1)
性质2:
a x + b y = c ax + by = c ax+by=c 若 c | gcd(a,b) 则有解 反之,无解。
待更