百鸡题和中国剩余定理

在生产上和日常生活上,有时会遇到两种东西混合的数学问题。如果已知两种东西的总量和总价,又知每一种东西的单价,就可以求出它们各有多少数量,象《九章算术》的“善田恶田”、《孙子算经》的“雉兔同笼”和《张丘建算经》的“清酒醑酒”等都是。这些题目,每题都只有一组答案。《张丘建算经》又把上述的问题推广,创立了三种东西混合的“百鸡”题,书中列举了三组答案。另外,在《孙子算经》里有一个“物不知数”的题目,原书虽然只举一个答数,其实这仅是一个最小的正整数解。百鸡和物不知数两个问题,答数都是无限,而都要求正整数的解答。因此,在本篇里把它们放到一起来讨论。

《张丘建算经》的百鸡问题和它的三组答案是:

今有鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一,凡百钱买鸡百只,问鸡翁、母、雏各几何?答:鸡翁四,母十八,雏七十八。又答:鸡翁八,母十一,雏八十一。又答:鸡翁十二,母四,雏八十四。

原书所举的解法,仅有“鸡翁每增四,鸡母每减七,鸡雏每益三,即得”共十七个字。这一段话告诉我们这三种答数间的关系是:鸡翁顺次增加四(就是由第一答中的四增加到第二答中的八,再由此增加到第三答中的十二),鸡母顺次减少七,鸡雏顺次增加三,但第一种答案怎样求到,原书却没有交代。

在现传《张丘建算经》里有一条注,其中举出谢察微的一个解法,但这个解法是偶然凑巧,不适用于其它的同类问题。

宋代杨辉《续古摘奇算法》(1275年)转载了这一个百鸡题,把它称做“三率分身”法的问题。杨辉虽然只记录了《张丘建算经》中的部分字句,仍没有解法,但是后面另举两个同类问题,却各有合理的解法。现在把它们分别记述在下面。

第一个同类题据杨辉称出于《辩古通源》(现已失传)。我们如果用它的解法来解百鸡题,应该先由

100×3-100=200,5×3-1=14,3×3-1=8,

算出200,14,8三个数。这实际就是设鸡翁数是x,鸡母数是y,鸡雏数是z,依题意列方程

x+y+z=100,......................(1)

..................... (2)

用加减消元法消去z,得

14x+8y=200。(3)

这个方程里的三个数和上面算出来的完全一样。接下去计算200÷(14+8),得商数9,余数2,这个余数不是14或8的倍数,于是我们改用小于9的整数作为商数。如果8作商数,就得余数24,这个余数正好是方程(3)中y的系数8的3倍,由此可把商数8作为所求的鸡翁数。这个算法的原理是这样的:设,代入方程(3),得

14x+8(x+u)=200.

就是 (14+8)x+8u=200

既然200÷(14+8)=8余24,那么就可得x=8,8u=24,u=3。由此继续求得鸡母数是8+3=11,鸡雏数是100-8-11=81,就是前举的第二种解答。

第二个同类题出于杨辉所见的写本中,这个方法必须把三种物品中的某一种物品件数依次假定是1,2,3,4……,改原题为鸡兔类问题,分别仿照《张丘建算经》的“清酒醑酒”问题,用“交换法”来解(杨辉称这种算法为“双率分身”)。直到算得其它两种物品的件数也成整数,就得问题的解答。用这个方法来解百鸡题,依次假定鸡翁数是1,2,3,分别算得鸡母数都不是整数。继续假定鸡翁数是4,由此算得鸡母、鸡雏共100-4=96只,共值钱100-5×4=80。假定96只全是鸡雏,所值钱要比实际少,每换进鸡母1只,所值钱应增加,算得鸡母数是[①古法在解含有分数的问题时要用“通分”,在这个算中,所谓通分是把被除数和除数都依分母的数扩大3倍,就是(3×80-96)+(3×3-1)=18],鸡雏数是,就是前举的第一种解答。这种算法虽然合理,但嫌迂回曲折。

此后,直到清代,才有丁取忠用“二色差分”的方法来解百鸡题。二色差分也就是杨辉所称的双率分身,但是他不用从1起的各整数顺次假定是鸡翁数来计算,而是假定鸡翁数是零,算得鸡母、鸡雏数以后再用四、七、三来增减的。我们猜想,丁取忠的这个算法可能是由下述的过程创造出来的:

《张丘建算经》所示的四、七、三既然可以用来把一组答案增减而得另一答案,那么不妨再把最后一种答案继续增减,看它是否还有第四组答案,这样经过增减后,得鸡翁十六,鸡母负三,鸡雏八十七,因为鸡数不应该是负数,所以这一组数是不适用的。再用四、七、三从第一组答案逆推(即增改做减,减改做增),得鸡翁零,鸡母二十五,鸡雏七十五,其中没有鸡翁,虽然不合题意,但从此却可以推知原书解法所以会这样简略的原因。丁取忠大概是假定张丘建在开始计算时把鸡翁当作没有的。如果是这样,那么一百钱买两种鸡共一百只,就成了一个鸡兔类的问题,用交换法可求得鸡母二十五,鸡雏七十五,再用四、七、三增减,这个问题就完全解决了。

关于四、七、三这三个数的来历,在《张丘建算经》里也没有提到。我们认为这也可能是照上面所讲的方法推算出来的。这就是说,我们先假定没有鸡翁,用交换法求得鸡母数是25,鸡雏数是75;再假定没有鸡雏,用同法求得鸡翁数是-100,鸡母数是200,于是计算两个结果的差额(前者比后者增或减),得鸡翁增0-(-100)=100,鸡母减200-25=175,鸡雏增75-0=75,再以25约简就得。

由前面所举的方程(1)和(2)来考察,我们知道,百鸡问题有三个未知数而仅能列成两个方程,它是一个不定方程问题,不定方程的解答原来可以多到无穷,但因本题的答案限于正整数,所以仅有三种。