资源描述:
《欧几里德算法及其扩展.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、欧几里德与扩展欧几里德算法欧几里德算法欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)。第一种证明:a可以表示成a=kb+r,则r=amodb 假设d是a,b的一个公约数,则有 d
2、a,d
3、b,而r=a-kb,因此d
4、r 因此d是(b,amodb)的公约数 假设d是(b,amodb)的公约数,则 d
5、b,d
6、r,但是a=kb+r 因此d也是(a,b)的公约数 因此(a,
7、b)和(b,amodb)的公约数是一样的,其最大公约数也必然相等,得证第二种证明:要证欧几里德算法成立,即证:gcd(a,b)=gcd(b,r),其中gcd是取最大公约数的意思,r=amodb下面证gcd(a,b)=gcd(b,r)设c是a,b的最大公约数,即c=gcd(a,b),则有a=mc,b=nc,其中m,n为正整数,且m,n互为质数由r=amodb可知,r=a-qb其中,q是正整数,则r=a-qb=mc-qnc=(m-qn)cb=nc,r=(m-qn)c,且n,(m-qn)互质(假设n,m-qn不互质,则n=xd,m-q
8、n=yd其中x,y,d都是正整数,且d>1则a=mc=(qx+y)dc,b=xdc,这时a,b的最大公约数变成dc,与前提矛盾,所以n,m-qn一定互质)则gcd(b,r)=c=gcd(a,b)得证。算法的实现:最简单的方法就是应用递归算法,代码如下:1intgcd(inta,intb)2{3if(b==0)4returna;5return6gcd(b,a%b);7}代码可优化如下:1intgcd(inta,intb)2{3returnb?gcd(b,a%b):a;4}当然你也可以用迭代形式:1intGcd(inta,intb)
9、2{3while(b!=0)4{5 intr=b;6 b=a%b;7 a=r;8}9returna;10}扩展欧几里德算法基本算法:对于不完全为0的非负整数a,b,gcd(a,b)表示a,b的最大公约数,必然存在整数对x,y,使得gcd(a,b)=ax+by。证明:设a>b。 1,显然当b=0,gcd(a,b)=a。此时x=1,y=0; 2,ab!=0时 设ax1+by1=gcd(a,b); bx2+(amodb)y2=gcd(b,amodb); 根据朴素的欧几里德原理有gcd(a,b)=gcd(b,amodb)
10、; 则:ax1+by1=bx2+(amodb)y2; 即:ax1+by1=bx2+(a-(a/b)*b)y2=ay2+bx2-(a/b)*by2; 根据恒等定理得:x1=y2;y1=x2-(a/b)*y2;这样我们就得到了求解x1,y1的方法:x1,y1的值基于x2,y2. 上面的思想是以递归定义的,因为gcd不断的递归求解一定会有个时候b=0,所以递归可以结束。扩展欧几里德的递归代码:1intexgcd(inta,intb,int&x,int&y)2{3if(b==0)4{5x=1;6y=0;7returna;8}9in
11、tr=exgcd(b,a%b,x,y);10intt=x;11x=y;12y=t-a/b*y;13returnr;14}扩展欧几里德非递归代码:1intexgcd(intm,intn,int&x,int&y)2{3intx1,y1,x0,y0;4x0=1;y0=0;5x1=0;y1=1;6x=0;y=1;7intr=m%n;8intq=(m-r)/n;9while(r)10{11x=x0-q*x1;y=y0-q*y1;12x0=x1;y0=y1;13x1=x;y1=y;14m=n;n=r;r=m%n;15q=(m-r)/n;16
12、}17returnn;18}扩展欧几里德算法的应用主要有以下三方面:(1)求解不定方程;(2)求解模线性方程(线性同余方程);(3)求解模的逆元;(1)使用扩展欧几里德算法解决不定方程的办法:对于不定整数方程pa+qb=c,若cmodGcd(p,q)=0,则该方程存在整数解,否则不存在整数解。上面已经列出找一个整数解的方法,在找到p*a+q*b=Gcd(p,q)的一组解p0,q0后,p*a+q*b=Gcd(p,q)的其他整数解满足:p=p0+b/Gcd(p,q)*tq=q0-a/Gcd(p,q)*t(其中t为任意整数)至于pa+
13、qb=c的整数解,只需将p*a+q*b=Gcd(p,q)的每个解乘上c/Gcd(p,q)即可。在找到p*a+q*b=Gcd(a,b)的一组解p0,q0后,应该是得到p*a+q*b=c的一组解p1=p0*(c/Gcd(a,b)),q1=q0*(c/Gcd(a,b)