举世闻名的中国剩余定理

——兼谈南宋秦九韶及清朝黄宗宪工作

从“鬼谷算”的猜岁数游戏谈起

猜谜语这种民间游戏,在中国有几千年的历史了。可是你知道不知道还有一种猜岁数的游戏在一千多年前也曾是中国人民的一种游戏?

让我们借想像的羽翼飞到那古老的年代,飞到那位于富庶肥沃的关中平原,那《诗经》所说:“径以渭蜀”的径水、渭水流域上的古城长安。长安是个像杜甫的诗歌所描写的:“渔阳豪侠地,击鼓吹笙竽,云帆转辽海,粳稻来东吴。越罗与楚练,照耀与台躯”一个很热闹繁华的城市。

我们不单听到吹竽鼓瑟、击筑弹琴,也见到斗鸡走犬。而位于大街的酒家,高朋满座。最热闹的是靠南城门的墙脚地方,只见许多人围绕在一个竹竿高挂上写“鬼谷神算”的布条下。挤进去看,我们看到一个有仙风道骨模样的老人对另一位老观众说:“大爷不需告诉我岁数,只需讲你的岁数除以二、三、五后的余数是多少,就可以了。”

“用二除嘛,余一;用三除嘛,也是余一;用五除嘛是余三。”只见算命先生摆弄一下竹筹,就说:“大爷今年73岁了,有道是人生七十古来稀,大爷童颜鹤龄,龙马精神,真是有福。”他算对了,是怎么样算出来呢?

1970年国际数学界上流传一个轰动的消息:本世纪的德国大数学家希尔伯特(DHibert 1862-19431900年于巴黎举行的国际数学家会议上举出的23个重要数学难题,其中第十题是和数论有关,已被苏联一个才22岁的青年尤里、马蒂杰雪维奇(YBMatiyasevic)所解决了。

他在解决这问题时,利用了斐波那契数、美国数理逻辑家研究的成果,并在一个关键地方用到一个中国人在1500年前就发现的一个定理。

这个定理在18世纪时欧洲大数学家欧拉,高斯先后重新发现,而在1852年时英国来华的传教士伟烈亚力(AWylie)在《中国科学摘记》一书向欧洲人介绍中国古代劳动人民这个数学发现以及南宋时期的数学家秦九韶在这方面的工作。以后的数学家都公认这个定理是中国人民最早发现的,因此特别称它为“中国剩余定理”。(Chinese remainder theorem

今天,我尝试把这定理的来源简略地介绍给读者,而重点是放在秦九韶以及清朝黄宗宪两人在这方面的一些成果,这些东西不是“古董”可以放进博物院高高挂起,而是在现代的一些数学问题上还有应用的价值,还是可以“古为今用”,而不重视我们先人的文化财产,将只会出现“中为洋用”的现象。

同余的概念

首先让我介绍德国数学家高斯在200年前想出的一个数学上很重要的概念:“同余”(Congruence)。

给定一个正整数n,我们说两个数ab是对模n同余,如果a-bn的倍数。用符号abmod n)来表示。

比方说:74,是对模3同余,因为7-4=31652是对模6同余,因为16-52=-366×(-6)。2313是对模2,模5同余,因为231310=2×5写成数学式子是74mod 3),1652mod 6),2313mod 2)或 2313

我们现在令Z表示所有的整数集合,给定一个正整数n,我们看同余≡究竟有什么性质?

首先,对于任何整数a ,我们恒有aamod n

因为a-a00×n,以上的性质就是“同余具有自反性(Reflexive poperty)。

其次,如果abmod n),则一定有bamod n

因为由abmod n),我们得a-b=n×kk是一个整数,因此b-a=-a-b)=n×(-k),即bamodn)。我们说“同余具有对称性(Symmetry property)”。

另外如果有abmod n),bcmod n),则我们可以得到acmod n)。

这就是“同余具有传递性(Transitive property)”。

让我们看看下面的例子:

1n2,则我们把整数分成偶数或奇数,就是……

[0]2={0,±2,±4,±6,…±2k,…}包含所有偶数。

[1]2={±1,±3,…±(2k+1),…}包含所有的奇数。

2 n3,则

[0]3={…,-9,-6,-30369,…}

[1]3={…,-8-5-214710,…}

[2]3={…,-7-4-125811,…}

现在让我问一个问题:“什么数被2除余1?”我想你一定会回答:是所有的奇数,奇数一般可以用2k1来表示k0,±1,±2,…。这就是在〔12的数。

现在让我再问一个问题:“什么数被3除余2?”

我想你一定会回答:所有形如3k2的数,这里k可以等于0,±1,±2,…,这就是在〔23里的数。

这两个问题都是很容易。现在让我们把这两个问题合成一个问题:“什么数被2除余1,被3除余2?”

这里你就必须在〔23里找所有的奇数,即-7,-1511,…等等。(如果你学过初等集合论,你就是要找交集〔12∩〔23的所有元素。)

而这些所有的数可以写成形如6k1。(k=0,±1,±2,…)

因为6k-1≡(mod 2

6k-12mod 3

以上的问题写成数学式子就是:“寻找x,使得x1mod 2),x2mod 3)。”

而答案是:所有形如6k-1的数。

中国古算书的一个问题

在成书差不多4世纪时的一本中国最古老的数学书之一——《孙子算经》里的下卷第26题,是一个闻名世界的数学问题。这问题有人称它为“孙子问题”(这孙子不是“公公和孙子”的那个“孙子”,而是写这书的“孙子”(先生)。)

现在我们看这问题(见图一):“今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?”

这问题翻译成现在的白话是:“现在有一些东西不知道它们的个数,三个三个一组剩下2个,五个五个一组剩下3个,七个七个一组剩下2个,问这些东西有多少?”

我们把这个问题再翻译成数学问题,就变成:“寻找x,使得x2mod 3),x3mod 5),x2mod 7)。”

你只要懂得〔23,〔35,〔27就在里面找那些数同时在这三个集合里就行了。因此由

23={…,-125811141720232629,…}

35={…,-2381318232833384347,…}

27={…,-5291623303744515863,…}读者很容易看到最小的正整数答案是23

这和《孙子算经》的答案:“答曰:二十三”是符合的。

《孙子算经》还给出解这题的方法:“术曰:三三数之剩二,置一百四十;五五数之剩三,置六十三;七七数之剩二,置三十;并之,得二百三十三,以二百十一减之即得。”

而在这书接下来就给这一类问题的一般解法:

“凡三三数之剩一,则置七十;五五数之剩一,则置二十一;七七数之剩一,则置十五;一百六以上,以一百五减之即得。”

这些解法的叙述,相信许多读者第一次看会觉得莫名其妙,究竟这是在说什么东西?我们现在研究一下。

同余的一些性质

同余这个关系还具有下面两个性质:

1)同余求和差性 如果abmod n),a1b1mod n)则 a±a1b±b1mod n

2)同余求积性 如果abmod n),a1b1mod n

aa1bb1mod n

〔证明〕因为aba1b1mod n)所以存在整数rs使得a-brna1-b1=sn,因此

a-b)±(a1-b1)=rn±sn=(r±sn

a±a1b±b1mod n

另外aa1=(brn)(b1sn

bb1nrb1bsrsn

所以n能整除aa1bb1,即aa1bb1mod n

我们知道在整数里有一个“消去律”:如果ab=ac,而a0bc(在ab=ac两边各除以a,就可以得到。)

很自然的我们猜想在同余关系也有这样的性质:如果abacmod

可是以上性质一般上是不成立的。例如这个例子所显示8×58

什么时候我们可以在同余式两边消去数字呢?

人们发现如果abacmod n),而d=GCDan),即dan的最大公约数,那么a可以在同余式两边消去,但这时同余式是这样的形式:

特别是当an互素,即GCDan)=1an没有公同的约数,此时由abacmod n)可推到

bcmod n

现在我们可以解释《孙子算经》的解法了。

《孙子算经》的解法

现在假定“孙子问题”一般的情形:求x使得

xr1mod 3                 0r13

xr2mod 5                 0r25      I

xr3mod 7                 0r37

由于模357是两两互素,所以它们的最小公倍数

LCM357=3×5×73×35=5×21

=7×15105

因为  35×21mod 3

21×11mod 5

15×11mod 7

因此由同余的可乘性我们得

70r1r1mod 3

21r1r2mod 3

15r1r3mod 3

于是我们有

70r121r215r370r1r1mod 3

70r1+21r215r321r2r2mod 5

70r1+21r215r315r3r3mod 7

因此同余式组(I)的解是满足下面同余式组的整数值x

x70r121r215r3mod 3

x70r121r215r3mod 5                   (Ⅱ)

x70r121r215r3mod 7

由于x-(70r121r215r3)是357的倍数,它也会是LCM357)=105的倍数。故(Ⅱ)的解同样是和x70r121r215r3mod 105)一样。

现在回过头看“孙子问题”,r1=2r2=3r3=2。由算经的前半段解法是这样:

x=70×221×315×2-2×10523

在古代中国人民有猜岁数,“隔壁算”、“剪管术”、“秦王暗点兵”等数学游戏,就是属于“孙子问题”的范畴和解法。

明朝程大位在1583年写的一部后来流传很广的应用数学书《直指算法统宗》就有一首孙子歌:“三人同行七十稀,五树梅花甘一枝;七子团员正半月,除百零五便得知。”就在诗歌中点明解孙子问题所用到的一些数字。

中国剩余定理

以上的孙子问题解法可以推广为:

如果有同余式组:xr1mod n1

xr2mod n2

xr3mod n3

这里0r1n10r2n20r3u3,而且n1n2n3是两两互素,即GCDn1n2)=GCDn1n3=GCD

n2n3=1

如果能找到整数α,β,γ满足下面三式:

αn2n31mod n1

βn1n31mod n2

γn2n11mod n3

那么x≡αn2n3r1+βn1n3r2+rn2n1r3(modn1n2n3)是原同余式组的解。

迟于中国人,古代的印度数学家也考虑类似“孙子问题”,欧洲在1202年出的意大利数学家斐波那契的《算法之书》(Liber Abaci)才有两个一次同余问题。而上面的推广,欧洲人要到18世纪才被欧拉重新发现。因此欧洲数学家后来把这定理称为《中国剩余定理》,而不是“欧拉定理”以纪念中国数学家在这方面的成就。

在现代数学书上,“中国剩余定理”是写成这样的样子:“如果n1n2,…,nk是两两互素的数。令N=n1nk,如果ajj=12,…,k)是能使

xr1mod  n1

xr2mod  n2

……

xrkmod nk

我们现在举一些例子说明

1  找一个最小的正整数被3除余2,被4除余3

[]我们现在要解同余式组:

x2mod 3

x3mod 4

先找那些4的倍数被3除余1。从8121620,…我们看到最小的是16

再找3的倍数被4除余1。从91215,…我们试到最小的是9

4×41mod 3

3×31mod 4

所以由中国剩余定理我们知道

x16×2+9×3=59mod 12

因此最小的整数是59-4×12=11

2  让我们回到这篇文章前那个算命先生的玩意儿。算命先生要解x1mod 2),x1mod 3),x3mod 5)。

明显的3×5×11mod 2

2×5×11mod 3

2×3×11mod 5

所以由中国剩余定理可得x15+10+6×3=43mod 30),或x13mod 30),所以一般岁数公式是x=30k+13如果k=1,则x=30+13=43,这不会是老头子的年龄。因此取k=2,则x=60+13=73,就是老头子的岁数。

秦九韶的“大衍求一术”

中国古代的天文是很发达以及相当先进。孙子算经的“物不知数”问题及算法事实上是和古代历法推算有关系。

在古代历法有一种叫“上元积年”的东西:比方说在N年之前冬至夜半,日月五星同在一个方位上,我们可以把这日月五星看作在一个共同的起点,日月五星的运动周期是不一样,设它们各为n1n2n3n4n5,如果在N年之后的某一时刻(MPQ时)进行观测,我们用n1,…,n5除以MPQ时所得的余数r1r2…,r5刚好是日月五星从现在起点到轨道上共同起点之间的距离。

如果我们知道n1n2,…,n5以及剩余r1r2…,r5由《孙子算经》的问题的解法,我们就可以推算出总年数N。这样推算得到的以前那年称为“上元”,而N称为“上元积年”。

从现在的资料,我们知道在公元462年祖冲之的“大明历”就要计算到有十一个n1,…,n11的同余式联立一次方程。可以说从汉末到宋末一千多年许多中国天文学家都会这种推算“上元积年”的方法。真正第一个发展它的理论是南宋末年的四川人秦九韶。少年时他跟父亲到杭州(大约在公元1224年)何太史局供职的天文学家学习掌握了“上元积年”的方法。他人很聪明:“性极机巧,星象、音律、算术以及营造等事,无不精究。”后来在蒙古入侵中原,兵荒马乱的动荡时期写了一部名著《数书九章》,在书中说:“数理精微,不易窥识,穷年致志,感于梦寐,幸而得知,谨不敢隐。”就在这书里提出了解联立一次同余式的方法“大衍求一术”。这方法五百多年后德国大数学家高斯才重新发现。

读者可以看李俨、杜石然著:《中国古代数学简史》(第188193页)介绍这方法,以及1973Ulricht Libbrecht著的《中国十三世纪的数学——秦九韶的数书九章》(Chinese Mathemat-ics in the 13th CenturyThe Sho·Shu Chiu Chang of Chin ChiuShaoMIT Press)。

清朝黄宗宪的求乘率法

秦九韶的“大衍求一术”可能是曲高和寡,同时代的人不能充分理解,研究学习的人很少,到了明朝中叶这方法差一点就失传了。

直到清朝时中国数学家研究古籍重发掘这方法,加以解释、简化和改进,关于这方面工作的书有:1831年张敦仁的《求一算术》、焦循《大衍求一术》,1815年骆腾凤《艺术录》中的《大衍求一法》,1873年时曰谆的《求一术指》及1874年黄宗宪的《求一术通解》。

我这里想介绍黄宗宪在《求一术通解》里的求乘率的方法,这方法是很容易学会,而且我曾比较现在外国解一次同余式的方法,我发现是黄宗宪法更快能得到答案。

给出同余式αβ≡1mod  n)。根据黄宗宪的叫法,n是叫“定母”,β是叫“衍数”,α是叫“乘率”。黄宗宪在《求一术通解》这样写道:“列定母于右行,列衍数于左行(左角上预寄一数)辗转累减(凡定母与衍数辗转累减,则其上所寄数,必辗转累加),至衍数余一即止,视左角上之寄数为乘率。”

“按两数相减,必以少数为法(法是减数),多数为实(实是被减数)。其法上无寄数者,不论减若干次,减余数上仍以一为寄数;其实上无寄数者,减作数上,以所减次数为寄数;其法上实上俱有寄数者,视累减若干次,以法上寄数亦累加若干次于实上寄数中,即得减余数上之寄数矣!”

这里我们通过实际的例子来领会黄宗宪的方法,由这方法读者可以以后很迅速的解决一般“物不知数问题”。

1 x应该是什么数,才使25x1mod18

[]这里定母是18,衍数是25x就是所求的乘率。

①现在画三条纵线,将平面分成四部分,在最左边那部分写上寄数,由左到右依次在另外三部分填上衍数、定母、寄数。现在在定母那项填上18,衍数那项填上25,而衍数旁边的寄数项填上1

②由于定母18比衍数25还小,因此由衍数中减18(共减1次)。由于减数(即黄宗宪说的“法”)无寄数,所得的余数7旁边的寄数就写上1

③接着从18中累减7(共减2次),就在14的旁边寄数上写2×1=2(这个17旁的寄数,2是因为18累减“2次”7),1814的余数是4,就在这数旁的寄数项填上2

④然后从7中累减4(共一次),就在4的旁边寄数上写上1×2=2(这里的1是代表7累减一次42代表4旁的寄数)然后就在余数3的旁边寄数写上74的寄数和1+2=3

⑤接下来从4中累减3(共一次),就在3的旁边寄数写上3×1=3。(这里的3是余数3旁的寄数,1是代表4累减“一次”34-3=1,在这余数旁的寄数是减数和被减数的寄数和,即2+3=5

⑥然后从3中累减1(共二次),这样余数才会剩1,就在2的旁边寄数项填上2×5=10(这里5是减数1的寄数)。现在3-2=1旁的寄数是3+10=13,这就是所求的乘率。

2x,使得1155x1mod 13

所以乘率是6,即1155×61mod 11)。

3  x应该是什么使得7x1mod 17)。

[]这里定母17,衍数7,定母比衍数大,因此要从17中累减7

所以乘率是5,即5×71mod 17)。

你看我们用黄宗宪的方法可以马上就找到乘率了。

4  求一最小的正数,被103711除各剩下4231

[]我们要解x4mod 10                 x2mod 3

x3mod 7               x1mod 11

我们首先要寻找a1a2a3a4使得

231a11mod 10                  a110

770a2≡(mod 3                      a23

330a3≡(mod 7                      a37

210a4≡(mod 11                    a411

由黄宗宪求乘率法,得a1=1a2=1a3=1a4=1

由于余数r1=4r2=2r3=3r4=1因此由中国剩余定理我们得

x231×4+770×1×2+330×1×3+210×1×1mod2310

2894mod 2310

最小的正数是2894-2310584

动脑筋  算算看

1)古代印度的一个数学问题:

在一个盛鸡蛋的篮中取蛋,每次取2个,最后剩1个在篮中,每次取3个,最后剩2个;每次取4个,最后剩3个;每次取5个,最后剩4个;每次取6个,最后剩5个;如果每次取7个,则刚好可以取完,问有多少蛋在篮里面?

2)杨辉在1275年写的《续古摘奇算法》一书里有三个这样的问题,你试试解决它们:

(一)“七数剩一,八数剩二,九数剩三,问本数。”

(二)“十一数余三,十二数余二,十三数余一,问本数。”

(三)“二数余一,五数余二,七数余三,九数余四,问本数。”

3)生于6世纪的印度数学家巴拉马古达(Brahmagupta)或译“婆罗门笈多”)曾研究过这样的问题:一数用30除余29,用4除余3,求此数。[]59

4)寻找所有小于1000的整数,被2357除都剩下1

[]1211421631841

5)寻找所有小于1000的整数,使得被103711除各剩下4231,其中一个答案是584

61554年的一本欧洲数学书有这样的一个问题:一个数被aa+1除,其余数是rs,证明aa+1)除,其余数是(a+1r+a2s

7)下面两个问题是取自1925年中华书局出版的“新中学教科书”中的《初级混合算学》一书里的问题,读者试做做这些题目,可以“温故知新”!

(一)有数,以11累减之余9,以17累减之余2,求该数。

(二)某校学生有百人左右,7人一组余6人,9人一组余7人,12人一组余1人,问学生数。

[]97

8)证明255+1是能被11整除。这是波兰的中学数学比赛出过的问题。试试用同余式性质证明。

9)(波兰中学数学比赛的问题)证明当n是偶数时,13n+6可以被7整除。

如果你懂得二项式定理,你将13n写成(14-1n,然后展开这式子,你就可以得到答案。

你也可以试试用数学归纳法证明,当n=2时,132+6是等于169+6=175=7×25

最好是用同余式的性质来解决这问题。

10)(苏联中学数学比赛的问题)这里有一个数是以15进位写的1 2 3 4 5 6 7 8 910)(11)(12)(13)(14),如果以十进位写是14+13)·15+12)·152+11)·15  3++2)·1512+1513求这数被7除后的余数。(解决了再算被11除的情形。)