您的位置:首页 > 其它

扩展欧几里得及其应用

2018-01-29 21:38 351 查看

欧几里得算法

欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:gcd(a,b)=gcd(a,a mod b)

gcd函数就是用来求(a,b)的最大公约数的。

证明gcd(a,b)=gcd(a,a mod b)

设d为a,b的公约数,则有d|a,d|bd|a,d|b

设r=amodb=a−⌊ab⌋br=amodb=a−⌊ab⌋b

所以d|r

即(a,b)的公约数是(b,a mod b)的公约数

设d’为b, a mod b 的公约数,则d′|b,d′|(amodb)d′|b,d′|(amodb)

因为a=r+⌊ab⌋ba=r+⌊ab⌋b

所以d′|ad′|a

即(b,a mod b)的公约数是的(a,b)公约数

所以(b,a mod b),(a,b)公约数相同,其最大公约数也相同

code

int gcd(int a,int b) {
int c;
while (b!=0) {
c=a%b;a=b;b=c;
}
return a;
}


扩展欧几里得

扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足贝祖等式: ax+by = gcd(a, b) =d(解一定存在,根据裴蜀定理)。扩展欧几里德常用在求解模线性方程及方程组中。

分析:

设 a>b

当 b=0,gcd(a,b)=a, 所以此时 x=1,y=0;

当a>b>0 时

设 ax1+ by1= gcd(a,b);

bx2+ (a mod b)y2= gcd(b,a mod b);

根据朴素的欧几里德原理有 gcd(a,b) = gcd(b,a mod b);

则ax1+ by1= bx2+ (a mod b)y2;

即ax1+ by1= bx2+ (a - a / b * b)y2=ay2+ bx2- a / b * by2;

根据恒等定理得:x1=y2; y1=x2- a / b *y2;

恒等定理:两个多项式相等,则这两多项式最高次数相同,且对应次数项的系数相同.

通过递归我们可以不断的推出x1,y1,最终达到求解ax+by=gcd(a,b)的目的。

code:

int exgcd(int a,int b,int &x,int &y) {
if(b==0) {
x=1;y=0;return a;
}
int r=exgcd(b,a%b,x,y);
int z=x;
x=y;y=z-a/b*y;
return r;
}


扩展欧几里得的应用

扩展欧几里得的应用主要有三个方面:

解不定方程

求解线性同余方程

求模的逆元

1、解不定方程

求解不定方程ax+by=c

用扩展gcd求出ax′+by′=gcd(a,b)ax′+by′=gcd(a,b)的解x′,y′x′,y′

x′,y′x′,y′分别乘上c/gcd(a,b)c/gcd(a,b)则可得到ax+by=c的一组解x,y;

当cmodgcd(a,b)≠0cmodgcd(a,b)≠0方程无解

如何求通解?

设x=x0+p,y=y0−qx=x0+p,y=y0−q(x0,y0x0,y0为上述过程中解出的特解x,y),

则(ax0+ap)+(by0−bq)=c(ax0+ap)+(by0−bq)=c.

设k=apk=ap满足a|ka|k

因为要求通解,那么应为t∗lcm(a,b)t∗lcm(a,b),t为任意整数。

k=bqk=bq同理

那么我们可以得到

a(x0+t∗lcm(a,b)a)+b(y0−t∗lcm(a,b)b)=ca(x0+t∗lcm(a,b)a)+b(y0−t∗lcm(a,b)b)=c

所以得到通解

x=x0+t∗lcm(a,b)a,y=y0−t∗lcm(a,b)bx=x0+t∗lcm(a,b)a,y=y0−t∗lcm(a,b)b

因为lcm(a,b)=abgcd(a,b)lcm(a,b)=abgcd(a,b)

所以当lcm(a,b)lcm(a,b)过大时,我们可以将lcm(a,b)alcm(a,b)a变为bgcd(a,b)bgcd(a,b)

2、求解线性同余方程

求解:

ax≡b(modm)ax≡b(modm)

mod为取余数,那么原式可变为

ax−my=ax+m(−y)=bax−my=ax+m(−y)=b

使用前文的方法解ax+m(−y)=bax+m(−y)=b即可

3、求模的逆元

有ax≡1(modm)ax≡1(modm)

同2可得ax+my=1ax+my=1解出x即为a的逆元
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息