提到扩展欧几里德算法,先简要介绍下欧几里德算法,又称辗转相除法,用于计算两个整数a和b的最大公约数(Greatest Common Divisor(GCD))。
为证明gcd(a,b)=gcd(b,a mod b),只需证明
(1)gcd(a,b) | gcd(b,a mod b)
设d=gcd(a,b) 则d|a且d|b
a mod b=a-qb (设q=[a/b])
由d|ax+by 则d|a mod b
所以d| gcd(b,a mod b)
(2)gcd(b,a mod b) | gcd(a,b)
设d=gcd(b,a mod b)
则d|b且d|a mod b
a=qb+(a mod b) (q=[a/b])
得d|a
所以d|gcd(a mod b)
求解a和b的最大公约数中,a可以表示为kb+r,则r =a mod b,假设d是a和b的一个公约数,则有d|a,d|b,r = a - kb,因此d|r(因为d是a的约数,又是b的约数,所以也是他们的多项式的约数),所以d是(b,a mod b)的公约数。所以在这不断代换中,a 必然>b,每次将a换成b,b换成amod b, a ,b 不断减小。直到b为0时,此时a为他们的最大公约数。
1 int euclid(int a,int b) 2 { 3 if (b==0) 4 return a; 5 else 6 return euclid(b,a%b); 7 }