数论领域有很多经典证明,如算数基本定理,欧拉定理,费马定理等。在这些定理中,有一个值得我们国人骄傲的定理——中国剩余定理。在维基百科中,被叫做Chinese remainder theorem,数论中唯一以Chinese开头命名的定理。而该定理出自《孙子算经》里的一个问题,因此在国内也被叫做“孙子问题”。

中国南北朝时期著作《孙子算经》卷下第二十六题,原文如下:


有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?

翻译过来便是,一个整数除以三余二,除以五余三,除以七余二,求这个整数。

对于该问题,宋朝数学家秦九韶于1247年《数书九章》卷一、二《大衍类》对“物不知数”问题做出了完整系统的解答。明朝数学家程大位将解法编成易于上口的《孙子歌诀》:


三人同行七十希,五树梅花廿一支,七子团圆正半月,除百零五使得知。

这首诗的具体解法是:


1. 找出三个数
从3和5的公倍数中找出被7除余1的最小数15
从3和7的公倍数中找出被5除余1的最小数21
最后从5和7的公倍数中找出除3余1的最小数70。
2. 乘以余数,再相加
15 * 2 = 30(七余二里的2)
21 * 3 = 63(五余三里的3)
70 * 2 = 140(三余二里的2)
30 + 63 + 140 = 233
3. 求余取最小
用233除以3,5,7三个数的最小公倍数105,得到余数23

上面的23便是孙子问题的最小解。记得上小学时候,我非常喜欢小学奥数,里面就有这类题,当时也是使用的这种解法。在这里就给大家讲解下此种解法的原理吧!

孙子问题的证明用到了两个简单地推导公式:
1. 数n除以m余t,那么这个数加减m的倍数后得到的数,除以m依旧余t。


如果整数n满足,除以3余2,那么
n = 3 * k + 2
如果整数n除以3余2,那么
n + 3 * k的值除以3依旧余2
如果整数n除以m余t,那么
n + m * k除以m,余数依旧为t

2. 数n除以m余1,那么n * t除以m的余数等于数t除以m的余数。


如果整数n除以3余1,那么
n * 2 除以3余2
因为
n = 3 * k + 1
n * 2 = 3 * 2k + 2
如果整数n除以m余1,那么
n * t 除以m余数和t除以m余数相等
因为
n = m * k + 1
n * t = m * tk + t
m * tk是m的倍数,n * t除以m,相当于t除以m求余数。

如果很清楚的理解了以上两个推导公式,接下来回归正题,孙子问题的解(用S作为标记),其实就是满足如下条件:


设N1除以3余2
S = N1 + 3 * k
设N2除以5余3
S = N2 + 5 * k
设N3除以7余2
S = N3 + 7 * k

那么,解S可以为以下算术式


S = N1 + N2 + N3
只需要保证:
N2 + N3 = 3 * k
N1 + N3 = 5 * k
N1 + N2 = 7 * k

另:


N2、N3是3的倍数
N1、N3是5的倍数
N1、N2是7的倍数
即可满足

因此,定理的解最终可以表示为:


S = N1 + N2 + N3
N1除以3余2,且是5和7的公倍数
N2除以5余3,且是3和7的公倍数
N3除以7余2,且是3和5的公倍数

所以,我们要从5和7的公倍数中找一个除以3余2的数N1,从3和7的公倍数中找一个除以5余3的数N2,从3和5的公倍数中找一个除以7余2的数N3。

如何找到,35的公倍数中除以3余2,这里有个方法,我们可以先找余数为1的,然后再乘以2即可(根据上面的推导公式2)。

根据辗转相除法,任何两个互质的数p、q,一定满足:a * p + b * q = 1,所以一定可以找到35的公倍数中除以3余1的数,其它也用同样方法。

由于我们得到的结果不是最小值,我们需要找到最小值,减去3/5/7的公倍数,得到最小值即可。

至此,中国剩余定理证明完毕。