中国剩余定理详解
中国剩余定理又叫孙子定理.孙子算经中有问题:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?
-
意思就是说求一个数,这个数除以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;
}