欧几里德扩展方程 详解

来源:互联网 发布:建材软件 编辑:程序博客网 时间:2024/05/03 05:20

作用:

欧几里德扩展方程是用来求解二元一次线性方程的。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)=cvoid 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的值会在递归后改变,就求得了最后的答案。

0 0