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;
}

 

(未完待续)

 

 

 

 

posted @ 2011-02-15 09:44  谁也打不过  阅读(501)  评论(1编辑  收藏  举报