作用:
欧几里德扩展方程是用来求解二元一次线性方程的。ax+by=c
(a、b、c为已知数)
对于给定方程:
ax+by=c,令g=gcd(a,b)
因为a是g的倍数,b也是g的倍数,所以令a=m*g , b=n*g,则:
ax+by=g(m*x+n*y)=c
所得的结果c必然是g的倍数。
当且仅当mx+ny=1时,右边有最小值。而此时mn必定是互质的。
所以我们经常求的最小整数解就是求方程ax+by=gcd(a,b)的解。
解方程步骤:
对于方程
ax+by=gcd(a,b)
由欧几里德算法
gcd(a,b)=gcd(b,a%b)
分别用b和a%b去替换ab,则可以得到一对新的解:x’和y’
bx’+(a%b)y’=gcd(b,a%b)
因为两式右边都相等,所以我们让两式左边相等
ax+by=bx’+(a%b)y’
假设我们的a/b=k余a%b,则a%b=a-kb,那么上式可变为
ax+by=bx’+ay’-kby’
我们让对应项系数相等
x=y’
y=x’+ky’
这里我们可以发现,后一次的结果是由前一次结果决定的
一直化简下去会发现,方程会变成一个特解:
即x=1,y=0的情况。
最后我们再反过来求得最后的xy即可。
代码实现:
//ax+by=gcd(a,b)=c
void exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;
y=0;
return ;
}
exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t-y*(a/b);
}
因为x,y加了引用,所以最后xy的值会在递归后改变,就求得了最后的答案。
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-31 10:26:11