大军列在旷野上,黑压压一片,头看不见尾。要造册点清人数,一个一个地点,数到天黑也数不完。
古人想出一个巧办法:不必一个个数,只让兵排队——每三人一排、每五人一排、每七人一排,每次只记下排到最后、多出来的那几个人。数了三次,竟能把人数算出来。
这一册讲的,就是这件奇事:只见三个「零头」,怎能反推出整支大军的人数。
故事层——跟着画面往下读,先读故事。
数学层——暖金色的框里,是这一页真正的数学。
注疏层——页面下方的小字,抄着古书里的原话,给一起读的大人。
军中要造一册名簿了:这支大军,究竟有多少人?
将军登上高坡,往下一望——黑压压一片,头看不见尾。
一个一个地点数,数到天黑也数不完;何况兵还在走动,数着数着就乱了。
营里有个少年兵阿余,平日最爱摆弄石子算数,凑上来说:「不必一个个数,让兵排队就成。」
「每三人一排!」——排到最后,多出两个兵。
「再每五人一排!」——排到最后,多出三个。
「每七人一排!」——排到最后,多出两个。
三次排完,只记住三个零头:余二、余三、余二。
可这点消息,还看不出人有多少——「余二」的队伍,可以是五人,也可以是八人、十一人……排下去没完没了。
奇怪的是:三个零头合在一起看,答案就只剩一个了。这一册,就讲这「合起来」里头的道理。
将军要在天亮前造好名簿,可这兵,一时数不清。
少年兵阿余凑上来,说自家摆弄石子时得过一个法子:「将军,让兵排队试试。」
将军一挥手:「排!」
「每三人一排!」士兵飞快排好。排到最后,队尾多出两个,站不成排。
阿余把这两个记在石子上:「三三数之,剩二。」
把人数记作 N。每三人一排、最后剩二,就是:N 除以 3 余 2。
换一句话说:N 减去 2,能被 3 整除。
数学家用一个记号把它写短:
N ≡ 2 (mod 3)
读作「N 与 2,对 3 同余」。
「再每五人一排!」——排好,队尾空出三个。
「每七人一排!」——排好,队尾空出两个。
三次排队,得了三个数:余二、余三、余二。阿余一一记下。
三次排队,就是同一支人数 N 的三种「余数」:
N ≡ 2 (mod 3)
N ≡ 3 (mod 5)
N ≡ 2 (mod 7)
这样的一组式子,古人叫「同余式组」。问题变成:找一个 N,同时满足这三条。
三条线索摆上案。阿余看着看着,眼睛亮了:三个石子堆一齐指,指向的是同一个地方。
三个模数 3、5、7 互质,乘起来得 105。
可以证明:在 0 到 104 之间,满足这三条的数只有一个。
这叫「模 105 意义下唯一」。放宽到更大范围,答案就是「那个数,再加 105 的整数倍」——像月亮每月重来一次。
3 ✕ 5 ✕ 7 = 105
《周易》说:天下人走向同一个归宿,走的却是不同的路;达成同一个结果,动的是百样的心思。
三个余数,正是三条不同的路——模 3 一条、模 5 一条、模 7 一条。每条路都只看清一角,合起来却指向同一个终点。
看一样东西看不清,就换几个角度去量它——这是古人对付难题的老办法。
将军看着案上那三小堆石子,将信将疑:就凭三个零头?
阿余说:「三把尺子量同一根竹竿,尺子各不相同,量出的余头也不同;可三下一比,竹竿有多长,就藏不住了。」
看清一件东西,有时不必死盯着它——换几把尺子,去量它的四周。
同一画面里,站着两种眼光:一种想「一眼看穿」,一种肯「换个角度」。
将军问:「只排一次队,成不成?」
阿余摇头:「不成。只看一次,合得上『余二』的人会排成长长一串——五人、八人、十一人……全对得上,可全不是真数。」
「一把尺子太短,量不到那根长竹竿的尽头。」
「三三数之剩二」的人,到底长什么样?阿余在纸上排出一列数。
满足 N ≡ 2(模 3)的数,一个个排下去是:
2,5,8,11,14,17,20,……
规律很简单:从 2 起,每次加 3。
它是一列等差之数,无穷无尽——单看这一条,N 可能是其中任何一个。
再看「五五数之剩三」。阿余另排一列。
满足 N ≡ 3(模 5)的数:
3,8,13,18,23,28,……
同样是一列无穷的数,只是这回想加的数是 5。
两条路各自都指不到一个确定的数——它们都太宽了。
阿余把两列数上下对齐:「看,两条一起算,能对上号的,一下子少了好多。」
两条一起看:既要 N ≡ 2(模 3),又要 N ≡ 3(模 5)。
这样的数,每隔 15 才出现一次;
3 ✕ 5 = 15
可每隔 15 一次,还是很多——仍定不下一个数。要三条一起上,才够。
《周易》说:同一件事,仁厚的人见了说是仁,聪明的人见了说是智——各人只看见自己那一面。
模 3、模 5、模 7,正像三个站在不同地方的人,各看见大石的一角。
一角看不清全貌,不是眼睛不好,而是站的地方只够看见一角。要见全貌,得把几个地方都站过。
阿余把三列数对着看。三个零头单看都糊涂,合在一起,轮廓却一点点清楚起来。
「原来不是要一眼看穿它,是要把它拼出来。」
一种眼光求「一瞥即明」,一种眼光信「积少成多」——算家选后者。
三列数排在案上。阿余顺着往下数,数到第二十三,停住了——三列数,都在这里踩着同一个点。
「二十三。」他抬头,「按这法子,兵是二十三人。」
将军一愣:「就这么点?」阿余笑:「这是最小的一个数。往后每隔一百零五,又是这么一支兵。」
怎么找那个「同时对得上三条」的数?阿余有笨办法:一条一条往上加。
要找 N 同时满足三条。先看只满足前两条的数:
8,23,38,53,68,……
从 8 起,每次加 15(即 3 ✕ 5)。
再从中挑出还满足第三条「模 7 余 2」的——第一个便是 23。
验一验:23 ÷ 3 余 2、23 ÷ 5 余 3、23 ÷ 7 余 2,三条全中。
「那要是兵更多呢?」将军追问。阿余指了指纸上那一长串:「加一百零五就是了。」
最小正解是 23。接着是 23+105=128,再接着是 233……
N = 23 + 105k (k = 0, 1, 2, …)
为什么每隔 105 重来一次?因为 105 是 3、5、7 的最小公倍数——三个条件在这里走完一整圈。
「三个零头,凭什么锁得住一个数?」阿余在纸上画了三道刻痕。
「合起来唯一」,意思是:在 0 到 104 这一段里,满足三条的数有且只有一个。
三个条件像三把锁,一把比一把严;三把一齐扣上,整段 105 个数里,就只剩一把钥匙开得动。
3 ✕ 5 ✕ 7 = 105 | 0…104 内唯一
《中庸》说:万物一同生长,彼此不妨害;大路各走各的,并不相冲突。
模 3、模 5、模 7,三条路各走各的,谁也不挡谁;可它们同时指着同一个数,一点也不矛盾。
「同归」不是把三条路强行并成一条,而是容它们并行——走到头,自会相遇。
三条路都通到 23 这个点。阿余忽然明白了「殊涂同归」四个字的意思。
不必让所有的路合成一条——让它们各自平行着走,走到头,自会相遇。
阿余手里捏着三小堆石子,心里想的是同一句话:各走各的路,走到一处。
阿余那套「一条一条往上加」的笨办法,人少时还成;兵要是成千上万、条件加到十三条呢?
五百多年后,南宋的秦九韶也想到了这道题。他不满足于「碰巧算出一个」,要把这法子写成一套人人能照做的算法。
他把算法记进《数书九章》,起名叫「大衍总数术」。
秦九韶的算法分四步。头一步,先把题里的几个除数端端正正记下来。
秦九韶把题里的除数叫「定数」——好比几把刻度不同的尺子。
本题的定数就是 3、5、7,三个两两互质的数。
(若几个除数不互质,要先化简成互质的一组,这一步他叫「约」;本册不深究。)
定数:3 5 7
第二步,把三个定数合成一个「大数」,再由它分出三份。
把定数全部乘起来,叫「衍母」:
衍母 = 3 ✕ 5 ✕ 7 = 105
再用衍母去除每一个定数,得「衍数」:
105 ÷ 3 = 35 105 ÷ 5 = 21 105 ÷ 7 = 15
三个衍数 35、21、15,各是「除自己那一条以外,其余定数的乘积」。
第三步最要紧:给每个衍数配上一个数,让它们「配成一对」。
要给衍数找一个「乘率」,使衍数乘上它以后,对相应的定数余 1。
先把 35 试起:要让 35 乘某数后对 3 余 1。
35 ✕ 2 = 70,70 ≡ 1 (mod 3)
同理,21 的乘率是 1(21 ≡ 1,模 5);15 的乘率也是 1(15 ≡ 1,模 7)。
于是得三个「用数」:70、21、15。
孔子说:我的道理,用「一」贯穿到底。
秦九韶的算法也正是这般:不管三个余数还是三十个,动手的次序一模一样——定数、衍母、衍数、乘率,一步步走下来,永不用改。
变的是题,不变的是那「一」条路子。这就是「一以贯之」:一套办法,贯通万般情形。
阿余的笨办法,与秦九韶的巧办法,走的是同一条路——只是一个用脚一步步量,一个把步子记成了一本谱。
谱有了,再多的零头,也不过是照着走一遍。
同一条路子,一副是随手而行,一副是落笔成法。数学的进步,常就藏在「把它写成谱」这一步里。
秦九韶的算法,好是好,只是步骤太多,寻常人不耐烦记。
又过了三百多年,明代程大位编《算法统宗》,把这道题的关键几步,编成四句顺口溜——像童谣一样,念几遍就忘不掉。
歌诀里的三个数,打哪儿来?其实正是上一幕求得的三个「用数」。
70 21 15
这三个数各有一个了不起的性子——「只管自己那条,别条一概不碰」:
70:÷3 余 1,却被 5、7 整除;
21:÷5 余 1,却被 3、7 整除;
15:÷7 余 1,却被 3、5 整除。
正因为如此,拿它们分别去乘对应的余数,再一加,三个零头就各归其位、谁也不搅谁。
阿余要是念过这四句,大约也会拍手叫好。
三人同行七十稀,五树梅花廿一枝,
七子团圆正半月,除百零五便得知。
三人同行七十稀——「三三数之」那一条,用 70 去乘它的余数;
五树梅花廿一枝——「五五数之」那一条,用 21;
七子团圆正半月——「七七数之」那一条,用 15(半个月正是十五);
除百零五便得知——三个乘积加起来,再减 105 的整数倍,剩下的便是答案。
把三个零头代进去,亲手算一遍。
余数是 2、3、2,各配用数 70、21、15:
70 ✕ 2 + 21 ✕ 3 + 15 ✕ 2 = 140 + 63 + 30 = 233
233 太大了,再减掉 105 的整数倍:
233 − 105 ✕ 2 = 233 − 210 = 23
得 23——与阿余一条条数出来的,分毫不差。
再念一遍开篇那句话,意思比先前厚了一层。
三个人量同一块石,三条路通同一个点,三道算式拼同一个数——殊涂,同归。
从孙子的三个余数,到秦九韶的四步算法,再到程大位的四句歌诀,是同一件事的三种说法。形式变了又变,那个「一」始终没变。
三百年,从纸上的算法,走到口边的歌谣。
一支军队的人数,就这样被三个零头钉死;而这法子,一路传到了民间的算盘铺子里。
一道题,三个时代,一条路。
算法成为歌诀,是学问落地的样子:不好记的,编成好念的——这也是一种「殊涂同归」。
回望这一册,是一条线串起的三站。
校场上,三个零头最先露面;灯下,它们合起来拼出一个数;再往后,这法子被写成算法、又编成歌谣,一路传了下去。
三个余数,一个答案,一条路——人就是这样,从「看不全」走到「看得清」的。
这道题,我们是「早到的客人」。
别处的算师还在为三个余数犯难时,中国算家已把它的解法写成了通法。这法子后来被称作「中国剩余定理」——名字里的「中国」,正是对它出处的记认。
学问不怕早到,只怕没有人肯把它接过来。
这一册留一个问题。
古法用的是三个互质的模数——3、5、7,两两不共因数,所以答案被钉得死死的。
可要是模数并不互质呢?比如「四四数之剩二、六六数之剩四」——它们有公因数。这时答案还有没有?又还剩几个?
歌诀里那三个数,家里也背得下来。
材料:纸、笔,外加一捧石子或豆子。
一 随手抓一把石子,先别数;只记「三三数之、五五数之、七七数之」三次各余几。
二 照歌诀写:三个余数分别乘 70、21、15,把三个积相加。
三 从和里减 105 的整数倍,减到不能再减(但仍留正数)。
四 得数报出来,再去数一数石子。若石子多于一百零五,得数要再加上 105 的若干倍。
换几个模数,也能编一首自己的歌诀。以「四、五、九」为例。
一 衍母=4 ✕ 5 ✕ 9=180。
二 衍数:180÷4=45、180÷5=36、180÷9=20。
三 求乘率:45 对 4 余 1(乘率 1);36 对 5 余 1(乘率 1);20 对 9 余 2,2 ✕ 5=10 ≡ 1(乘率 5)。
四 三个用数:45、36、100(=20 ✕ 5)。照此三数各乘余数、相加、再减 180 的整数倍,答案就出来了。
同余——两数之差若能被某数整除,就说它们对这数「同余」。记号 ≡:N ≡ 2 (mod 3) 读作「N 与 2 对 3 同余」。
模——同余里的那个除数(这里就是 3)。模 3 的世界里,数只分「余 0、余 1、余 2」三类。
剩余类——同一模下「余数相同」的一族数,如 2, 5, 8, 11, … 属于模 3 的「余 2」那一类。
同余式组——若干个同余式联立,要求同一个数同时满足它们;本册的核心问题。
物不知数——《孙子算经》的名题:「三三数之剩二,五五数之剩三,七七数之剩二」,答二十三。
定数 / 衍母 / 衍数 / 乘率 / 用数——大衍总数术的五件术语:定数即模(3、5、7);衍母即模之积(105);衍数即衍母除以各模(35、21、15);乘率使衍数乘它对本家模余 1(2、1、1);用数=衍数×乘率(70、21、15)。
大衍求一术——秦九韶用以求乘率的辗转相除之法,是整个算法的关键一笔。
中国剩余定理——模数两两互质时,同余式组在模其积的意义下有唯一解;即本册所讲的「合起来就唯一了」。
「物不知数」的要害,是把一个未知的数「换个说法」:不问它究竟是多少,只问它被几把尺子量过之后各剩多少。三个互质的模数合起来,能认住 105 以内唯一的那个数——于是「看不全」变成了「看得清」。秦九韶的贡献,是把这套想法整理成一步步照做即可的算法;歌诀,则是它的民间简本。
(托名)孙子——《孙子算经》作者,生平不详,「孙子」盖为后人托名,其书约成于公元三至五世纪。
秦九韶(约 1208–1268,南宋)——著《数书九章》,创「大衍总数术」与「大衍求一术」,系统解决一次同余式组。
程大位(1533–1606,明)——著《算法统宗》,载「物不知数」解法歌诀,使古法广传民间。
高斯(1777–1855,德国)——在《算术研究》(1801)中给出同类结果的近代形式,晚于秦九韶约五个半世纪。
《孙子算经》——「物不知数」的出处;《数书九章》——大衍总数术的出处;《算法统宗》——歌诀的出处;《周易·系辞》——「同归而殊涂,一致而百虑」;《礼记·中庸》——「道并行而不相悖」;《论语·里仁》——「吾道一以贯之」。
「同余」离生活一点也不远。
钟表按十二小时一圈转,星期按七天一轮回——都是「到了头就重来」。
「现在几点」其实是一个模 12 的问题;「今天星期几」是模 7。
书号、身份证号末尾的校验码,也是拿整串数按不同模去算,用来查有没有抄错。
——都是同一件事:把无穷多的数,收进有限的几个「余数」里。
门前那几堆石子,后来走了很远。
今天加密信息用的许多方法,底下站着的,正是「同余」这门看家功夫。
有一类加密,靠的是「两个大数相乘容易,反过来拆解极难」;而拆解与还原,用到的正是同余与大数取余。
发信、收信各持一把「钥匙」,其中的一把摆在明处也无人能仿——这钥匙的牢靠,就架在同余的性质上。
古人「换观点看数」的巧思,隔着一千多年,成了今日守密的一道门锁。
这一册有两条线,一明一暗。
明线(暖金):同余的说法、《孙子算经》「物不知数」、逐条叠加取交集、秦九韶「大衍总数术」四步、程大位歌诀——四件出自中国算学的看家功夫,串在「点兵」这一桩巧事上。
暗线(青绿):「同归而殊涂,一致而百虑」——看不全一样东西时,换几个角度去量它周围。这既是中国哲学对「殊途同归」的洞察,也是同余算法的魂。
· 先读故事层,不必急着讲算式;
· 数学层里「余数乘用数再相加」的一段,最宜带孩子用石子亲手做一遍(见动手做两页);
· 五页暗线页与每幕的交汇页(偏青绿),适合慢读——只问不答,让画面自己说话。
三个可以不急着回答的问题,留给亲子一起慢慢聊。
一 只数三次零头,为什么能知道总数?
因为三个互质的模数合起来,像三把刻度不同的尺子,把答案的范围一路收窄,直到只剩一个——「看不全」不妨碍「算得清」。
二 同一个数,为什么换个看法就清楚了?
数的「真身」没变,换的是量它的尺子。难题解不开时,常常不是难题太硬,而是取的视角太单一——这也是「换位思考」在算术里的化身。
三 一个道理,为什么要既写成算法、又编成歌谣?
算法给人照做,歌诀帮人记牢。学问要生根,既得有严整的谱,也得有顺口的调——「殊涂」之中,藏着让道理走得更远的两条路。
《中国古代数学故事绘本》第 06 册
殊途同归 · 将军的兵有多少
明线:同余 · 物不知数 · 大衍求一术
暗线:同归而殊涂 · 一致而百虑
时代:南北朝—南宋(约 3–5 世纪至 1247 年)
主典:《孙子算经》;《数书九章》秦九韶;《算法统宗》程大位;《周易·系辞》
体例:扉页与题解 2 页 · 引子 3 页 · 五幕 35 页(每幕:故事 1 · 数学 3 · 暗线 1 · 交汇 1 · 小结 1)· 收束与留问 3 页 · 动手做 2 页 · 小典 2 页 · 延伸 2 页 · 家长导读 2 页 · 版权 1 页,共 52 页。
全套十册,依历史时序,自先秦至明清。本册为第六册。