1扩展gcd用于求解方程ax + by = gcd(a,b)的解x0,y0
1.显然当 b=0,gcd(a,b)=a。此时 x=1,y=0;
2.以下式子基于递归性质:
要求ax1+by1=gcd(a,b)的解:
由于gcd(a,b)=gcd(b,a%b)等量代换有:bx2+(a%b)y2=gcd(b,a%b)
而a%b = a- (a/b)*b
所以bx2+(a-(a/b)*b)*y2=gcd(b,a%b)=gcd(a,b)
整理得:ay2+b(x2-(a/b)*y2) = gcd(b,a%b) = gcd(a,b)
而ax1+by1=gcd(a,b)。
所以有x1=y2 , y1=x2-(a/b)*y2。
ll gcd(ll a, ll b){
return b ? gcd(b, a % b) : a;
}
template<typename T>
T exgcd(T a,T b,T &x,T &y){//这一层为x1,y1
if(b == 0){
x = 1; y = 0;
return a;
}
T d = exgcd(b, a%b, x, y);//这一层为x2,y2,下面赋值语句后面的都是修改过的值
T xt= x;//先存下x2的值,后面会修改
x = y;//x1=y2
y = xt - a / b * y;//y1=x2-a/b*y2
//此时修改后得到本层的x,y的值
return d;
}
2使用扩展欧几里德算法求解不定方程ax + by = c
结论:对于不定整数方程ax + by = c,若 c mod gcd(a,b) = 0,则该方程存在整数解,否则不存在整数解。
假设ax +by = gcd(a,b)*c/gcd(a,b) -> 令c/gcd(a,b)=t -> a(x/t) + b(y/t) = gcd(a,b) ->
假设,方程ax + by =gcd(a,b) 的解为x0,y0,
那么ax + by = c 的解为 x=tx0,y=ty0
3解同余方程ax
b (mod m)
设余数为r,
ax = k1m+r, 变形得ax-k1m-r=0
b=k2m+r, k2m+r=b
两式子相加得ax+(k2-k1)m=b,从而转换为问题2:ax + by = c
设ax + my=gcd(a,m)的解为x0,y0,t=b/gcd(a,m)
x = tx0 , y= ty0