标签:
话说以前我刷noip题的时候就想学这个东西了,结果却一直拖到了现在……
到了高二才会这种东西的我实在是个蒟蒻啊!
将扩展欧几里得算法之前,先讲讲欧几里得算法是什么:gcd(a,b)=gcd(b,a%b)。很显然是不?但我们还是要给出证明(设r=a%b):
设x是a,b的一个公约数,由于存在k使得a=k*b+r,又由于a|x,b|x,则有r|x,所以x是b,r的公约数
设x是b,r的一个公约数,因为存在k使得a=k*b+r,且b|x,r|x,那么a|x,所以x是a,b的公约数
综上所述,a和b的所有公约数 等于 b和a%b的所有公约数,于是得证。
所以,扩展欧几里得算法又是什么呢?这个算法就是用来求出整数解x,y,使得gcd(a,b)=a*x+b*y。
那么,如何求呢(用到的除号皆为整除,即1/3=0,6/4=1)?
①显然当b=0时有:x=1,y=0
②设r=a%b,有r=a-(a/b)*b
由于gcd(a,b)=a*x+b*y=gcd(b,r)
又因为gcd(b,r)=b*x1+r*y1
于是有a*x+b*y = b*x1+r*y1 = b*x1+(a-(a/b)*b)*y1 = y1*a+(x1-(a/b)*b)*b
所以x=y1,y=x1-(a/b)*b
递归地求下去即可
待更ing……
标签:
原文地址:http://www.cnblogs.com/lcf-2000/p/5847387.html