中国剩余定理
数学研究所 李文林 袁向东
在我国古代劳动人民中,长期流传着“隔墙算”、“剪管术”、“秦王暗点兵”等数学游戏。有一首“孙子歌”①,甚至远渡重洋,输入日本:
“三人同行七十稀,五树梅花廿一枝,
七子团圆正半月,除百令五便得知。”
这些饶有趣味的数学游戏,以各种不同形式,介绍世界闻名的“孙子问题”的解法,通俗地反映了中国古代数学一项卓越的成就。
“孙子问题”在现代数论中是一个一次同余问题,它最早出现在我国公元四世纪的数学著作《孙子算经》中。《孙子算经》卷下“物不知数”题说:有物不知其数,三个一数余二,五个一数余三,七个一数又余二,问该物总数几何?显然,这相当于求不定方程组
n=3x+2,n=5y+3,n=7x+2
的正整数解n,或用现代数论符号表示,等价于解下列的一次同余组:
n 2(mod3) 3(mod5) 2(mod7)②
《孙子算经》所给答案是n=23。由于孙子问题数据比较简单,这个答数通过试算也可以得到。但是《孙子算经》并不是这样做的。“物不知数”题的术文指出解题的方法:三三数之,取数七十,与余数二相乘;五五数之,取数二十一,与余数三相乘;七七数之,取数十五,与余数二相乘。将诸乘积相加,然后减去一百零五的倍数。列成算式就是:
n=70×3+21×3+15×2-2×105。
这里105是模数3、5、7的最小公倍数,容易看出,《孙子算经》给出的是符合条件的最小正整数。对于一般余数的情形,《孙子算经》术文指出,只要把上述算法中的余数2、3、2分别换成新的余数就行了。以r1、r2、r3表示这些余数,那么《孙子算经》相当于给出公式
n=70×r1+21×r2+15×r3-p×105(p是整数)。
孙子算法的关键,在于70、21和15这三个数的确定。后来流传的《孙子歌》中所说“七十稀”、“廿一枝”和“正半月”,就是暗指这三个关键的数字。《孙子算经》没有说明这三个数的来历。实际上,它们具有如下特性:
也就是说,这三个数可以从最小公倍数m=3×5×7=105中各约去模数3、5、7后,再分别乘以整数2、1、1而得到。假令k1=2,k2=1,k3=1,那么整数ki(i=1,2,3)的选取使所得到的三数70、21、15被相应模数相除的时候余数都是1。由此出发,立即可以推出,在余数是r1、r2、r3的情况下,
综合以上三式又可得到
因为m=3×5×7可被它的任一因子整除,于是又有:
这里p是整数。这就证明了《孙子算经》的公式。应用上述推理,可以完全类似地把孙子算法推广到一般情形:设有一数n,分别被两两互素的几个数a1、a2、……an相除得余数r1、r2、……rn,即
n≡ri(modai)(i=1、2、……n),
只需求出一组数ki,使满足
那么适合已给一次同余组的最小正数解是
(p是整数,m=a1×a2×……×an),这就是现代数论中著名的剩余定理。如上所说,它的基本形式已经包含在《孙子算经》“物不知数”题的解法之中。不过《孙子算经》没有明确地表述这个一般的定理。
孙子问题出现在公元四世纪的中国算书中,这并不是偶然的。我国古代天文历法资料表明,一次同余问题的研究,明显地受到天文、历法需要的推动,特别是和古代历法中所谓“上元积年”的计算密切相关。大家知道,一部历法,需要规定一个起算时间,我国古代历算家把这个起点叫做“历元”或“上元”,并且把从历元到编历年所累积的时间叫做“上元积年”。上元积年的推算需要求解一组一次同余式。以公元三世纪三国时期魏国施行的《景初历》做例,这部历法规定以冬至、朔旦(朔日子夜)和甲子日零时会合的时刻作为历元。设a是一回归年日数,b是一朔望月日数,当年冬至距甲子日零时是r1日,离平朔时刻是r2日,那么《景初历》上元积元数n就是同余组
an≡ri(mod60)≡r2(modb)
的解①。