2011-2-15 扩展欧几里得算法及中国剩余定理
欧几里得算法:
欧几里得算法又称辗转相除法,用于计算两个整数a,b的最大公约数。
原理:gcd(a,b) = gcd(b,a mod b);
实现代码:
#include<stdio.h> int Euclid(int a,int b) { if(b==0) return a; else return Euclid(b,a%b); } int main() { int a,b,c; scanf("%d%d",&a,&b); c=Euclid(a,b); printf("%d\n",c); }
扩展欧几里得算法:
扩展欧几里得算法是用来在已知a,b的情况下求解一组p,q 使得 p*a + q*b = gcd(a,b)
原理:
因为gcd(a,b) = gcd(b, a%b)
所以 p*a + q*b = gcd(a,b) = gcd(b, a%b) = p*b + q*(a%b) = p*b + q*(a - (int)a/b*b) = q*a + (p - (int)a/b)*b (a%b = a - (int)a/b*b)
这样它就把a,b的线性组合化简为b与a%b的线性组合
根据我们前边的结论:a,b都在减小,当b 减小到 0时,我们就可以得出p=1,q=0. 然后递归回去就可以求出最终的p,q了。。
实现代码:
int extended_gcd(int a,int b,int &x,int &y) { int ret,tmp; if(!b) { x=1,y=0; return a; } ret=extended_gcd(b,a%b,x,y); tmp=x; x=y; y=tmp - a/b*y; return ret; }
(未完待续)