中国剩余定理详解

中国剩余定理又叫孙子定理.孙子算经中有问题:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?

  • 意思就是说求一个数,这个数除以3余2,除以5余3,除以7余2,求这个数是多少?当然这个解有无数多种,我们只求出那个最小的那个数.

  • 原处的解法说明是:三人同行七十稀,五树梅花廿一枝,七子团圆月正半,除百零五便可知。这个就是运用中国剩余定理的解法.下面具体说明:

首先我们容易知道如果x是这个其中的一个解,那么x+140*k也是这里面的解,140是这三个模的最小公倍数,k是整数.运用这个我们可以把三个式子给合并成两个式子,进而把解表示成 k1*2+k2*3+k3*4.其中k1%3=1且是5,7的最小公倍数,k2%=1且是3和7的最小公倍数,k3%7=2且是3和5的最小公倍数.容易验证每当除以3,5或7的时候,里面有两个为0,剩下一个和解一样.因此,改题就变为了如何求k1,k2,k3了.并为了保证最后的结果是最小的,要模上所有模数的最小公倍数

对与k1,k2,k3.我们容易想到用扩展欧几里得算法取求解,当然也可以用费马小定理去求.例如求k1我们可以转换成 35x+3y=1,其中35*x=k1.求法可以参考 逆元求法 同样的我们可以求出k2,k3.

附上个代码:

int  CRT(){
	int ans=0,M=m[1];
	for(int i=0;i<n;i++)M=M*m[i];
	for(int i=0;i<n;i++){
		int x,y,c;c=M/m[i];
		exgcd(c,m[i],x,y);
		ans+=x*c*b[i];
	}
	return ans%M;
}
posted @ 2018-10-05 22:41  i-Curve  阅读(1458)  评论(0编辑  收藏  举报