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;
}
(未完待续)

浙公网安备 33010602011771号