扩展欧几里得及其应用
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的逆元
相关文章推荐
- 扩展欧几里得、求乘法逆元及其应用、中国剩余定理(互质版和非互质版)、欧拉函数、快速判素数模板
- [置顶] 扩展欧几里得定理及其应用
- 扩展欧几里得应用分析
- Android SAX API: XmlResourceParser及其扩展应用
- hdu_1222_欧几里得_gcd简单应用_欧几里得扩展性质
- Android SAX API: XmlResourceParser及其扩展应用
- 卡特兰数的性质及其应用扩展
- C# Note21: 扩展方法(Extension Method)及其应用
- 张宴:Tokyo Cabinet数据库及其扩展应用
- 图像滤波函数imfilter函数的应用及其扩展
- SGU 106 The Equation 扩展欧几里得应用
- [POJ1845&POJ1061]扩展欧几里得应用两例
- SGU261 一些数学知识入门与应用结合 原根 快速幂 离散对数 扩展欧几里得 单边元模线性方程
- 欧几里得及其扩展
- 扩展欧几里德算法及其应用
- 扩展欧几里德算法、证明及其应用
- 关于欧几里得及其扩展算法(C语言实现)
- POJ 2115 C Looooops(扩展欧几里得应用)
- poj--1061青蛙的约会(扩展欧几里得公式的应用)
- python解释器实现及其嵌入式应用:内部模块定义及扩展