中国剩余定理(孙子定理)
1.来源
该定理出自《孙子算经》的问题:“今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之剩二(除以7余2),问物几何?”也有一说为韩信点兵
2.分析过程
分析该题的性质,可将该题转化为S=3*k1+2=5*k2+3=7*k3+2的式子。设n1=3*k+2,n2=5*k+3,n3=7*k+2,因为n1除以3余2,如果使n1+n2也满足除以3余2,进而使得n1+n2+n3的和也满足除以3余2,那么n2的值应为3的倍数(因为n1+3k mod 3=2,k为随机的正整数),n3同理。所以再从n2,n3的角度出发,可以得到:
a. 为使n1+n2+n3的和满足除以3余2,n2和n3必须是3的倍数。
b. 为使n1+n2+n3的和满足除以5余3,n1和n3必须是5的倍数。
c. 为使n1+n2+n3的和满足除以7余2,n1和n2必须是7的倍数。
最终,若使得n1+n2+n3为孙子问题的一个解,则需要满足:
a. n1 除以3余2,且是5和7的公倍数。
b. n2 除以5余3,且是3和7的公倍数。
c. n3 除以7余2,且是3和5的公倍数。
所以,孙子问题解法的本质是从5和7的公倍数中找一个除以3余2的数n1,从3和7的公倍数中找一个除以5余3的数n2,从3和5的公倍数中找一个除以7余2的数n3,再将三个数相加得到解。
在求n1,n2,n3时又用了一个小技巧,以n1为例,并非从5和7的公倍数中直接找一个除以3余2的数,而是先找一个除以3余1的数(通过公式(5*7)*b≡1(mod 3)求出的b),再乘以2(b*2只满足了mod 3余2),再乘以5*7(到这一步才满足了既mod 3余2,又是5和7的倍数),才得到n1。也就是先求出5和7的公倍数模3下的逆元,再用逆元去乘余数。证明这个技巧需要用到一个公式:
如果a%b=c,那么:
(a∗k)%b=a%b+a%b+…+a%b=c+c+…+c=k∗c(k>0,且k*c应该小于b)
最后,n1+n2+n3只是问题的一个解,不一定就是最小解,将n1+n2+n3变为最小解的方法则是(n1+n2+n3)mod (3*5*7)。依据的方法则是若a%b=c,则有(a-k*b)%b=c。
综上,可知中国剩余定理的公式如下:
有同余方程组如下:
x≡a1(mod m1)
x≡a2(mod m2)
x≡a3(mod m3)
x≡a4(mod m4)
……
x≡an(mod mn)
且有条件:m1、m2、m3、……、mn互素,则有公式:
x=(a1*M1*M1-1+a2*M2*M2-1+a3*M3*M3-1+……+an*Mn*Mn-1)mod (M)
M=m1*m2*m3*……*mn
Mi=M/mi
参考链接:
中国剩余定理学习笔记