谈韩信点兵问题
数学的解题,包括问题、答案、求得答案的思路过程,以及过程中所结晶出来的普遍概念、 方法和数学理论。只有答案与计算技巧的堆积无法显现数学的妙趣。
在《孙子算经》里(共三卷,据推测约成书于西元400年左右), 下卷的第26题,就是鼎鼎有名的“孙子问题”:
今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?
将它翻译成白话:这里有一堆东西,不知道有几个;三个三个去数它们,剩余二个;五个五个去数它们,剩余三个;七个七个去数它们,剩余二个;问这堆东西有几个?精简一点来说:有一个数,用 3 除之余 2;用 5 除之余 3;用 7 除之余 2;试求此数。
用现代的记号来表达:假设待求数为 x,则孙子问题就是求解方程式:
其中 a=b (mod n) 表示 a−b 可被 n 整除。
这个问题俗称为“韩信点兵”(又叫做“秦王暗点兵”、“鬼谷算”、“隔墙算”、“剪管术”、“神奇妙算”、“大衍求一术”等等),它属于数论 (Number theory) 中的“不定方程问题”(Indeterminate equations)。
孙子给出答案:
答曰:二十三
事实上,这是最小的正整数解答。他又说出计算技巧:
术曰:三三数之剩二,置一百四十;五五数之剩三,置六十三;七七之数剩二,置三十。 并之得二百三十三。以二百一十减之,即得。 凡三三数之剩一,则置七十;五五数之剩一,则置二十一;七七数之剩一,则置十五。 一百六以上,以一百五减之,即得。
这段话翻译成数学式就是:
为了突显 70、21、15、105 这些数目,明朝的程大位在《算法统宗》(1592年)中,把它们及解答编成歌诀:
三人同行七十稀,五树梅花廿一枝,
七子团圆正半月,除百零五便得知。
另外,在宋代已有人编成这样的四句诗:
三岁孩儿七十稀,五留廿一事尤奇,
七度上元重相会,寒食清明便可知。
这些都流传很广。“上元”是指正月十五日,即元宵节,暗指“15”;而“寒食”是节令名,从冬至到清明,间隔105日,这段期间叫做“寒食”,故“寒食”暗指“105”。
本文我们要来探索韩信点兵问题的各种解法,它们的思路过程与背后所涉及的数学概念和方法。
观察、试误与系统列表
按思考的常理,面对一个问题,最先想到的办法就是观察、试误 (trial and error)、投石问路、收集资讯,再经系统化处理,这往往就能够解决一个问题;即使不能解决,对该问题也有了相当的理解,方便于往后的研究或吸收新知。
首先考虑被 3 除之余 2 的问题。正整数可被 3 整除的有 3,6,9,12,,所以被 3 除之余 2 的正整数有 2,5,8,11,14,。其次,被 5 除之余 3 的正整数有 3,8,13,18,。最后,被 7 除之余 2 的正整数有 2,9,16,23,。将其系统地列成表一,以利观察与比较。
表一
我们马上可从表一看出23是最小的正整数解。
有一位四年级的小学生,他耐心地继续计算下去,得到第二个答案是128,第三个答案是233,接着又归纳出一条规律从23开始,逐次加105都是答案(这是磨练四则运算的好机会)。从而,他知道孙子问题有无穷多个解答。不过,小学生还没有能力把所有的解答写成一般公式:
其中, N0={ 0,1,2,3,⋯⋯} 。
根据机率论,一只猴子在打字机前随机地打字,终究会打出莎士比亚全集, 其机率为 1。这是试误法中,最令人惊奇的一个例子。人为万物之灵, 使用试误法当然更高明、更有效。总之,我们可以(且必须)从错误中学习。
分析与综合
根据笛卡儿(Descartes, 1596~1650)的解题方法论:面对一个难题,尽可能把它分解成许多部分,然后由最简单、最容易下手的地方开始,一步一步地拾级而上,直到原来的难题解决。换言之,你问我一个问题,我就自问更多相关的问题,由简易至复杂,铺成一条探索之路。
现在我们考虑比孙子问题更一般的问题:
问题1. 试求出满足下式之整数 x :

孙子问题是

为了求解这个特例,我们进一步考虑一连串更简单的特例。 基本上,这有两个方向:剩余为 0 或只有单独一个方程式。
单独一个方程式
欲求
的整数解x,显然解答的全体为
这些解答可以写成一个通式:
其中Z表示整数集,事实上,(5)式只是(4)的重述。
进一步,通解公式(5)也可以写成
或
等等,换言之,通解公式可以表成 x=3n,n∈Z ,与 x=2(或x=−4等等 )这两部分之和。前一部分是 x=3q1 之通解,后一部分是 x=3q1+2 的任何一个解答(叫做特解)。
这告诉我们,欲求 x=3q1+2 之通解,可以分成两个简单的步骤: 先求 x=3q1 的通解,再求 x=3q1+2 的任何一个特解,最后将两者加起来就是 x=3