秦九韶,字道古,普州安岳人——今四川安岳。约生于一二〇八年,卒年有异说,约在一二六八年前后。
他的父亲做过官,在临安(今杭州)的秘书省任职。少年秦九韶随父居京,得以出入太史局,跟掌天文历法的人学星象、学律吕、学营造。周密《癸辛杂识》记他「性极机巧,星象、音律、算术,以至营造等事,无不精究」——这句评语出自一位并不喜欢他的人之手,反而更可信。
一二四四年,母丧。他居湖州守孝,三年不得任官。就在这三年里,他把平生所习写成一部书:九类,每类九问,共八十一问,题名《数书九章》。书成于一二四七年。
这部书在他生前没有刊行。此后五百年,它靠抄本流传,入《永乐大典》,再由清代馆臣辑出;直到一八四二年,才有第一个完整的刻本。
故事层——跟着画面往下读:一队兵、一张账、一盏守孝时的灯。
数学层——暖金色的框里,是这一页真正的数学:同余、大衍求一术、正负开方、三斜求积。
注疏层——页面下方的小字,标注年代、出处与真伪,给一起读的大人。
淳祐四年,湖州。这一年秦九韶三十七岁,母丧居家,按制三年不得任官。
屋外的消息一天比一天坏。北边的战报一封接一封:端平年间宋军北上失利,蒙古铁骑南下,四川屡遭兵火——那是他的老家。亲族流散,田庐焚毁,书信一年比一年少。
他不出门。白天料理丧事,夜里就着灯摆算筹。
摆的是什么?不是高深的题目,是官府里那些永远算不清的账:一块不方不正的田有多大,一仓米折成几石几斗,一段城墙要多少工,一队兵有多少人。他把这些账一道一道写成题,写完一道,再写一道。
三年下来,八十一问。
军营里点兵,有个省力的老办法。
不必一个一个报数,只让兵站队:三人一排,站完看余下几个;五人一排,再看余下几个;七人一排,再看余下几个。三次站完,余数记下来,总数就出来了。
那天余下的数是:三三数之,剩二;五五数之,剩三;七七数之,剩二。
队正张口就报:「三千零六十八。」
秦九韶问他:怎么知道?队正答不上来。他说这是老规矩,祖父就这么教,祖父的祖父也这么教。至于为什么——没人问过。
这三个余数,凭什么钉死一个数?
《数书九章》的序里,有一句话很短,却很硬:
数与道非二本也。
意思是:算术与「道」,不是两件事。
这句话在当时是要顶人的。士大夫读经史、谈性理,把算账看作吏胥的杂役;会算的人地位不高,算得再准,也只是「能吏」。秦九韶偏不认这个分法:在他看来,能把一件事算清,与能把一个道理讲明,是同一种功夫。
所以这部书不只是给官府用的账本。他把每一道题都写全:为什么这样问、凭什么这样算、算完怎么验。八十一问,问问答答,像八十一级台阶。
那年秋天,秦九韶随军到江边一处营寨清点兵员。
营门外的沙地上,队正让兵站队。三人一排,站完,余下两个;五人一排,余下三个;七人一排,余下两个。他低头在沙上划了两道,抬头就报:三千零六十八。
秦九韶在旁边看了半晌,问:「凭什么?」
队正愣了。他想了一会儿,说:「三三数剩二,五五数剩三,七七数剩二——就这三个数,一报就知道。老规矩了。」
「老规矩从哪里来?」
队正笑了:「先生,这我可说不上。我爹这么教,我爹的爹也这么教。会用的多,说得出道理的,没见过。」
那天晚上,秦九韶在灯下把这三个余数抄在纸上。他要的不是这一个答案——他要的是那句话背后的走法。
「三三数之剩二」,用一句更省的话说:这个数被三除,余二。
「五五数之剩三」:被五除,余三。「七七数之剩二」:被七除,余二。
三条话,就是三个条件。秦九韶把它们并排写在一张纸上——写下这一行的时候,那个「说不清」的兵数,忽然变成了一道题。
这是这一册的第一个转弯:不问「有多少」,先问「除几余几」。数不清的东西,只要肯换一个问法,就能清得出来。
「a 被 m 除余 r」,记作
a ≡ r (mod m)
读作「a 与 r 对模 m 同余」。三个条件合起来,是一个同余式组:
x ≡ 2 (mod 3) x ≡ 3 (mod 5) x ≡ 2 (mod 7)
一个条件的力气有多大?以模 3 为例:它把全部整数分成三堆(余 0, 1, 2),只说中一堆——三分之二的可能,一句话就排除了。三个条件叠起来,剩下的可能极稀。
三条一起看,眼会花。秦九韶的法子是:一次只看两条。
先看「被三除余二」:二、五、八、十一、十四、十七、二十、二十三……一步一步加三。
再看「被五除余三」:三、八、十三、十八、二十三……一步一步加五。
两列一比,第一个同时出现的是八;再往后,二十三也同时出现。八与二十三差十五——正好是三乘五。原来这两条一旦同时满足,就每隔十五个数重现一次:八、二十三、三十八、五十三……
两条条件,合成了一条:被十五除余八。三条变两条,题就轻了一半。
两条同余可以并成一条:
x ≡ 2 (mod 3) 且 x ≡ 3 (mod 5) ⟺ x ≡ 8 (mod 15)
为什么是十五?因为第一个条件每 3 个一循环,第二个每 5 个一循环;两个循环要重新对齐,得等 3 × 5 = 15 个。若两模不互素,等的是它们的最小公倍数。
这一步可以反复做:并出的新条件,再与下一条并。三条并两次,四条并三次——无论多少条,都能这样一条一条吞下去。
现在手里只剩下两件事:被十五除余八,被七除余二。
把「被十五除余八」的数一路写下去:八、二十三、三十八、五十三、六十八……挨个拿七去除,看谁余二。
八除七余一,不对;二十三除七,三七二十一,余二——对了。
于是最小的答案是二十三。再往后呢?每过 15 × 7 = 105 个数,两条条件又同时重现。所以全部答案是:二十三,一百二十八,二百三十三……一直加一百零五。
三千零六十八,正是二十三加一百零五的二十九倍。队正那个「张口就报」,报的其实是这套循环里的一个数。
x ≡ 8 (mod 15) 且 x ≡ 2 (mod 7) ⟹ x ≡ 23 (mod 105)
验算:23 = 3 × 7 + 2,23 = 5 × 4 + 3,23 = 7 × 3 + 2。三条全中。
一般地:模数 m1, …, mn 两两互素时,同余式组在 0 ≤ x < M(M = m1 ⋯ mn)内恰有一个解。题目问「几何」,问的就是这个最小的正解。
这一册的暗线,只有一句:乱世里的秩序。
秦九韶生活的年代,什么都算不清。哪一年能回四川,不知道;明天这座城还在不在,不知道;一封家书能不能到,也不知道。天下大势,没有一个人算得出来。
但一道题的余数是算得清的。给三个条件,答案就钉在一个数上;换谁来算,都是这个数。它不因战报而改,不因官位而改,也不因谁说得好听而改。
人在乱世里能守的东西不多。守不住城,守不住家,甚至守不住一具遗体。可他能守住一小块算得清的地方——那是他自己造的秩序,谁也拿不走。
同余不只用来点兵。它还有一件更大的用场:定历。
古人编历,先要定一个「上元」——一个理想的起算点:那一刻,冬至与朔日同时发生,又恰好是甲子日的夜半。此后每过一年、一月、一日,都从这个点往上加。
可冬至有冬至的周期,朔望有朔望的周期,干支有六十日的周期;三个周期长短不一,要找一个三者同时「归零」的时刻,正是解一道同余式组。模数越大、条件越多,算起来越苦——而这正是大衍求一术的用武之地。
《数书九章》「大衍类」九问,一半与历法有关。兵与历,看似相隔千里,用的却是同一套走法。
二十三这个答案,队正也会。会的人不少——这门手艺在军中、在官府、在市井,传了不知多少代。
可秦九韶把自己问住了:换一道题呢?
若模数是四、九、十一?若余数是一、七、五?若不止三条,有七条、十条?若有一条的余数是零?
会做题的人多,会做「所有同类题」的人少。他想要一套走法:不论模数是多少、余数是多少、有几条,照着走,都能走到底;而且每一步都能验,不靠猜、不靠记。
碰巧算对一次,是运气;能算对每一次,才叫术。
先给「一类题」起个名字。设模数为 m1, m2, …, mn,余数为 r1, r2, …, rn,要找一个 x:
点兵那道题,就是把 3, 5, 7 与 2, 3, 2 填进这个架子。
但有一个前提必须先看:这些模数之间,不能有公因数。三、五、七两两互素,所以怎么凑都凑得出来。若模数是四与六——它们都能被二整除——条件就可能自己打架。
打不打架,怎么看?看余数:四除余一,数必是奇数;六除余二,数必是偶数。一个数不能又奇又偶,于是无解。
x ≡ ri (mod mi) (i = 1, 2, …, n)
相容判据 对任意 i, j,必须有
ri ≡ rj (mod gcd(mi, mj))
两模互素时 gcd = 1,任何整数都同余于模 1,条件自动满足——所以「两两互素」时,只要有解,就一定解得出。
反例:x ≡ 1 (mod 4) 与 x ≡ 2 (mod 6):gcd(4, 6) = 2,而 1 − 2 = −1 不被 2 整除,故无解。正例:x ≡ 1 (mod 4) 与 x ≡ 3 (mod 6),x = 9 即满足,通解为 9 + 12k。
第一步,把三个模数乘起来,得「总数」:3 × 5 × 7 = 105。
第二步,为每个模数各配一个「衍数」:用总数除以这个模数。三的衍数是 105 ÷ 3 = 35;五的是 105 ÷ 5 = 21;七的是 105 ÷ 7 = 15。
衍数有什么好?看三十五一数:它是五的倍数,也是七的倍数——所以往答案上加三十五个、加七十个,被五除、被七除的余数一点不变;可它被三除余二,正好能用来「调」第一条。
一句话:每个衍数只管一条,不碰其他。这就是分头办事的妙处。
总数 M = m1m2 ⋯ mn(模数两两互素时)。
衍数 Mi = M / mi。则 Mi 是除 mi 之外所有模数的倍数,故
Mi ≡ 0 (mod mj) (j ≠ i)
本例:M = 105,M1 = 35,M2 = 21,M3 = 15。三个衍数在各自的模下分别是 35 ≡ 2 (mod 3)、21 ≡ 1 (mod 5)、15 ≡ 1 (mod 7)。
衍数有了,可它不听话:三十五被三除余二,不是余一。要用它调第一条,得先把它「扳」成余一。
怎么扳?乘一个数。三十五乘几,被三除余一?三十五余二,二乘二得四,四被三除余一——乘二就行。这个二要记下,秦九韶叫它「乘率」。
五与七那两条省事:二十一再被五除,本来就余一,乘率是一;十五被七除也余一,乘率也是一。
三份「用数」就出来了:35 × 2 = 70、21 × 1 = 21、15 × 1 = 15。它们各管一条,且在本条上余一,在别的条上余零。
最后按余数配方:余二的那条配七十的两份,余三的配二十一份的三份,余二的配十五的两份,全加起来——二百三十三。去掉两个一百零五,得二十三。
求一 对每个 i,求乘率 ki 使
Mi ki ≡ 1 (mod mi)
用数 Ni = Mi ki。于是 Ni 在第 i 条上余 1,在其余各条上余 0。
合并 x ≡ Σ ri Ni (mod M)。
本例:k = (2, 1, 1),N = (70, 21, 15),故
x ≡ 2×70 + 3×21 + 2×15 = 140 + 63 + 30 = 233 ≡ 23 (mod 105)
验:233 ÷ 3 余 2,÷ 5 余 3,÷ 7 余 2。三条全中。
算法是什么?说穿了不神秘:把一个人的聪明,拆成别人也能走的步子。
定母、求衍、求一、合并。四步,每一步只做一件小事:乘一乘、除一除、凑个余一、加总去零。每一步都能验,验不过就回头查那一步——不必整题重来。
队正的「老规矩」是一种聪明,可它在队正的脑子里,队正一走,规矩就断了。秦九韶要把它从脑子里搬出来,搬到纸上,变成任谁照着走都能走通的东西。
乱世里最靠得住的,从来不是聪明人,是能传下去的步骤。
把秦九韶的四步写成今日的程序,不过几行:
先算总数与三个衍数;再对每个衍数求乘率——这一步,程序里叫「扩展欧几里得」;最后把「余数 × 用数」加起来,对总数取余。
八百年前的算筹,与今天的机器,做的是同一件事:照着步骤走,一步不错。区别只在速度:人摆一次算筹要几息,机器一息能走百万次。
这也是算法的好处——它不挑工具。竹筹、算盘、纸笔、电子管、芯片,换的是手,不换的是那四步。
八十一问编成九类,秦九韶把最难的一类放在最前,题作「大衍」。
「大衍」二字出自《周易·系辞》:大衍之数五十,其用四十有九。那是揲蓍求卦的法子,讲的是从一个总数里分出余数、再由余数定吉凶。借这两个字作类名,意思很明白:从一个总数里,由余数定出答案。
这一类九问,用的都是同一套走法。走法要有个名字,他取作「大衍求一术」——「求一」,是四步里最要紧的那一步:凑出一个余一。
名字起定,这一术就不再属于某一个人了。谁翻开第一卷,都能照着走。
把整件事排成一张表,四步一目了然。
第一行「定母」,写下三个模数;第二行「求衍」,用总数除各自模数;第三行「求一」,各凑乘率;第四行「用数」,衍数乘乘率,再乘余数,最后加起来。
表一填完,答案自己就浮出来了。这也是秦九韶的脾气:能排成表的,就不靠记性。
例 x ≡ 2 (mod 3),x ≡ 3 (mod 5),x ≡ 2 (mod 7)。
总数 M = 3 × 5 × 7 = 105。
定母 3 5 7
衍数 35 21 15
乘率 2 1 1
用数 70 21 15
余数 2 3 2
合并:2 × 70 + 3 × 21 + 2 × 15 = 233;以 105 约之,233 − 2 × 105 = 23。答案二十三。
乘率不能靠碰。三十五一数,与三互素,凑出余一并不难;可若遇上大模数,试乘几十次也未必撞上。秦九韶用的是减法——更相减损,也就是今天的辗转相除。
拿三十五去减三:减十一次,剩二。再拿三去减二:减一次,剩一。到这里,余一出来了。
接着往回代:这个一是三减二得来的;而二是三十五减十一个三得来的。把二换回去,整理一下,就成了「十二个三,减去一个三十五,等于一」。
既是「减去一个三十五」还余一,那么「加两个三十五」自然也被三除余一——乘率是二。减法的尽头,就是乘率。
更相减损(辗转相除):
35 = 3 × 11 + 2 → 3 = 2 × 1 + 1
回代:
1 = 3 − 2 = 3 − (35 − 3 × 11) = 12 × 3 − 1 × 35
即 −35 ≡ 1 (mod 3),两边乘 −1:35 × 2 ≡ 1 (mod 3),故 k1 = 2。
一般地,若 gcd(Mi, mi) = 1,辗转相除必终止于 1,回代即得乘率——总能求到,且步数有限。这是「求一术」敢称「术」的底气。
走法能走通,全靠一条前提:模数两两互素。
为什么?因为「求一」要凑出余一。若两个模数有公因数,比如四与六,公因数是二;那么无论怎样乘、怎样减,凑出来的数总是二的倍数,永远凑不出余一来——术就断在半路。
凑不出余一,未必是题无解。四与六的题有的有解、有的没解:判据在余数上。四除余一、六除余三,有解(九就是);四除余一、六除余二,无解——前者必奇,后者必偶。
秦九韶没有把这类题推开。他另立一法,叫「收数」:先把公因数约掉,把模数化小,再按常法走,最后把结果放大回去。
无解之例 x ≡ 1 (mod 4):x 为奇数;x ≡ 2 (mod 6):x 为偶数。二者不能并存,故无解。
判据 r1 ≡ r2 (mod gcd(m1, m2)) 时才有解。本例 gcd(4, 6) = 2,1 − 2 = −1 不被 2 整除,故无解。
有解之例 x ≡ 1 (mod 4)、x ≡ 3 (mod 6):1 − 3 = −2 被 2 整除,有解 x ≡ 9 (mod 12)。
若两两互素,则 gcd = 1,任何余数都「模 1 同余」,判据自动成立——所以互素时必有一解,且在 M 内唯一。
一个时代崩坏的时候,人最先失去的是「可预期」。
明天会不会来兵,不知道;今年的漕运能不能到,不知道;说好的事还算不算,也不知道。什么都在变,人便学会了不信任何一句准话。
算法给的,正是可预期。同样的条件,同样的答案;换一个人算,还是这个答案;隔一百年再算,仍是这个答案。它不承诺太平,只承诺:只要照着走,就不会错。
这就是乱世里,一个人能给自己造的一小块秩序——纸上的、四行的、谁也拿不走的。
十三世纪的中国,算法忽然一起长高。
秦九韶在南方写《数书九章》;李冶在封龙山写《测圆海镜》,用「天元术」设未知数列方程;杨辉在钱塘写《详解九章算法》,把「开方作法本源图」画进书里——那正是贾宪的三角数表;朱世杰稍晚,写《四元玉鉴》,把未知数从一元推到四元。
四个人隔着山河,互不相识,写的却是同一件事:把「怎么算」讲成一套可传的步骤。那是一个战乱的时代,也是一个算法的时代。
《数书九章》分九类,每类九问。
大衍——同余与历元;天时——历法、雨雪、日食;田域——田地面积;测望——测量远近高深;赋役——税粮徭役的分派;钱谷——粮仓、米麦折算;营建——土木工程用工用料;军旅——行军、布阵、粮草;市物——买卖、利息、物价。
看这份目录,就知道这部书是给谁写的:一个县官、一个管仓的、一个领兵的、一个修城的。全是日常要算的账。
可秦九韶在每一问后面都写明「术」——不是这一问的答案,是这一类题的走法。账本是死的,术是活的。他要交出去的不是八十一笔账,是八十一套算法。
第四幕讲三件用场。第一件:开方。
营建要算城墙的立方、粮仓的容积,常常要问:什么数的立方等于这个数?若数不整,古法就一位一位地逼。
拿一千七百二十八来试。先看最高位:十的立方是一千,二十的立方是八千——答案在十与二十之间,十位定为一。从一千七百二十八里减去一千,剩七百二十八。
再定个位。设个位是 b,那么整个数是十加 b,它的立方展开成四项:一千、三百 b、三十 b 的平方、b 的立方。要让这四项凑成七百二十八——试 b = 2:六百、一百二十、八,加起来正好七百二十八。
于是答案十二。
求 x3 = 1728。设 x = 10a + b,则
(10a + b)3 = 1000a3 + 300a2b + 30ab2 + b3
首位 a = 1:1000,余 728。
次位 b = 2:300 × 1 × 2 = 600,30 × 1 × 4 = 120,8;合计 728,恰尽。故 x = 12。
验:12 × 12 × 12 = 1728。
开平方好懂,开四次、开十次呢?道理一样:一位一位地定,每定一位,就把方程「降」一层。
定下十位之后,原来的三次方程里,那个未知数已经「用掉」了一半。把 10a 代进去,剩下的部分按 b 重新整理:b 的立方项、平方项、一次项,系数都变成已知的数——方程还是三次,可它已经变成「一个关于 b 的、系数全知的方程」。
再定下一位,再降一层。如此下去,无论多少次,最后都落到一次;一次方程,一眼就看得出答案。
秦九韶把这个「每步更新系数」的动作叫「增乘」:乘一次,加上去;再乘一次,再加上去。层层相因,不重算。
设 f(x) = 0 为所求,令 x = 10a + b,代入并按 b 的幂整理:
f(10a + b) = f(10a) + f′(10a)b + …
其中常数项 f(10a) 即「已定部分」代入后的余数;一次项系数由「增乘」逐层累出。因 0 ≤ b ≤ 9,只需在这十个数里试,试中了便定一位。
例:f(x) = x3 − 1728。定 a = 1 后,余 −728,一次项系数为 300 + 60b + b2;试 b = 2,得 300 + 120 + 4 = 424,424 × 2 = 848… 逐层核至七百二十八,恰合。
第二件用场:量田。
田很少是方的。一块斜斜的三角田,要报面积,怎么算?量高最麻烦——高在田中间,没有实物可依,脚踩进去还会踩坏庄稼。可三条边好量:沿着田埂走一圈,绳子一拉就有。
秦九韶的法子只用三条边:把三边各自平方,两两相乘,再减去一个由三边凑出来的数,开方,取一半。
拿一块十三、十四、十五步的田来试:三边平方是一六九、一九六、二二五;前两者相乘得三万三千一百二十四;三边凑出的那个数是七十,平方四千九百;相减得二万八千二百二十四;开方得一百六十八;一半,八十四步。
不必量高,不必画图,三条边一报,面积就出来了。
三斜求积术(秦九韶):三边为 a, b, c,则
S = ½ √( a2b2 − ( (a2 + b2 − c2) / 2 )2 )
例 a = 13, b = 14, c = 15:
a2b2 = 169 × 196 = 33124;(169 + 196 − 225)/2 = 70,702 = 4900;
33124 − 4900 = 28224,√28224 = 168,S = 84。
式中「(a2 + b2 − c2)/2」正是 a, b 夹角上的投影长乘积——古人以「勾股」代余弦,不必提三角函数。
田在乱世里是最要紧的东西,也是最难说清的东西。
一块田,界石可能被推倒,田埂可能被踏平,业主可能逃了,契书可能烧了。剩下来的,只有地本身:三条边还在,形状还在。
秦九韶的术,让「说清」不必依赖那些会消失的东西。不必有契,不必有界石,不必有高——只要还能走一圈,量出三条边,面积就算得出来,且算得一样。
这就是算法给人的另一种秩序:把说不清的事,变成量得出的事;把量得出的事,变成算得清的数。
同样一件事,西方也有人做。
古希腊的海伦,約公元一世纪,写过一部《度量论》,里面有这样一个式子:三角形面积等于半周长乘上「半周长减每一边」三个数,再开方。
秦九韶的三斜求积,与海伦的式子,形状完全不同:一个从平方与开方入手,一个从半周长与连乘入手。可把两者展开、化简,竟是同一个式子。
两条路,一条从代数走,一条从几何走,走到同一处。这不是巧合——三角形的面积只有一个,路可以有很多条。
书成于淳祐七年,秦九韶约四十岁。他没有等到它印出来。
宋末兵火连年,抄本流散。这部书在元代不甚流传,明代被收入《永乐大典》——那部卷帙浩大的类书,收书七八千种,抄本仅两部。
清乾隆年间开四库馆,馆臣从《永乐大典》中辑出这部书,题作《数学九章》,收入《四库全书》。可辑本仍有阙误,世间少见。
又过了近百年,一八四二年,宋景昌重加校勘,郁松年以「宜稼堂丛书」刊行,题名《数书九章》。至此,这部书写成近六百年后,才有了第一个完整的刻本。
他死后十一年,南宋亡。
一八〇一年,德国,二十四岁的高斯出版《算术研究》。
书里给同余立了一门语言:符号、运算、定理。其中一条说:若干个两两互素的模数,各配一个余数,这样的同余式组必有解,且解在模数之积以内唯一。
这就是今日的「中国剩余定理」。
高斯没有读过秦九韶。他走的是另一条路:从欧拉、拉格朗日一路下来的同余理论。可他得出的结论,与五百五十年前那个守孝的人所做的,是同一件事——只不过一个写成「术」,一个写成「定理」。
中国剩余定理 设 m1, …, mn 两两互素,M = m1 ⋯ mn,则对任意余数 ri,同余式组
x ≡ ri (mod mi) (i = 1, …, n)
在模 M 下恰有一解:
x ≡ Σ ri Mi ki (mod M)
其中 Mi = M/mi,ki 为 Mi 模 mi 的逆元。
与 p.21 的表逐项对照:定母即 mi,衍数即 Mi,乘率即 ki,用数即 Miki。一名之异,实质全同。
这门八百年前的术,今天仍在做事。
一是算大数。密码里的大数有几百位,直接算很慢;把它拆成几个小模数分头算,再合回来,能快上数倍——RSA 解密就用这个法子。
二是定历。农历的闰月、节气、朔望,本质都是周期对齐;十九年七闰,就是一道同余。
三是分钥匙。一份机密拆成三份,交给三个人;任取两份能拼回原样,缺一份则拼不出。这叫「秘密共享」,靠的正是同余式组:两份条件足以定解,一份则候选太多。
秘密共享(简例) 取模数 5, 7, 9(两两互素),秘密 23。三份钥匙为余数:
23 ≡ 3 (mod 5) 23 ≡ 2 (mod 7) 23 ≡ 5 (mod 9)
任取两份,例如模 5 与 7:解得 x ≡ 23 (mod 35)。因 23 < 35,秘密唯一确定。
只拿一份(模 5 余 3):候选是 3, 8, 13, 18, 23, 28, …,太多,无法定夺。这就是「两把钥匙开锁,一把开不了」的算术根据。
换一组数,把整张表重走一遍。
题:某数被三除余一,被五除余二,被七除余四,求最小正解。
总数仍是一百零五,三个衍数仍是三十五、二十一、十五,三个乘率仍是二、一、一——因为乘率只与模数有关,与余数无关。这是术的省力处:模数不变,前三步可以照抄。
只换最后一步的配方:余一配七十,余二配二十一,余四配十五,加起来一百七十二;减去一百零五,得六十七。
验一遍:六十七除三余一,除五余二,除七余四。全中。
x ≡ 1 (mod 3), x ≡ 2 (mod 5), x ≡ 4 (mod 7)
M = 105;Mi = (35, 21, 15);ki = (2, 1, 1);Ni = (70, 21, 15)。
x ≡ 1×70 + 2×21 + 4×15 = 70 + 42 + 60 = 172 ≡ 67 (mod 105)
验:67 = 3×22 + 1,67 = 5×13 + 2,67 = 7×9 + 4。
省力之处 乘率 ki 只依赖模数:模数一改,才需重求;余数改了,只需重配。若有一百道题共用同一组模数,前三步算一次就够。
秦九韶没有等来太平。他死时,南宋已在最后十年;十一年后,崖山。
他也没有等来名声。书未刊行,抄本稀见,明清两代的算家多半只知道《九章算术》,不知道有过这样一部书。他的生平,甚至被后人写得颇为不堪(见 p.47)。
可那套步骤活着。它活在抄本里,活在《永乐大典》的夹页里,活在四库馆臣的辑本里,活在一八四二年的刻版里,活在今天的教科书与程序库里。
王朝会亡,人会死,名声会烂。算法不会——它只要有人照着走一遍,就还在。
同一件事,两种命运。
秦九韶把它写进一部账本式的书里,题为「大衍求一术」,排在九类之首。他写得很细,每题列表、逐步演算,可这部书五百年无人接续。后来的算家读《九章》,不读《数书》。
高斯把它写成定理,放在《算术研究》第一卷。这部书成了欧洲数论的起点,同余成了全世界的语言;此后每一本讲数论的书,都要从这里开始。
不是中国人没想到。是想到了之后,那本书没有印出来,没有人接着往下走。
一件事要活下来,光有人想到不够,还得有人抄、有人印、有人读、有人接着做。
回望这一册,是一条越走越宽的算路。
起头只是营门外的一件小事:三个余数,一个兵数。为了说清「凭什么」,先把「剩几个」写成同余;为了不只解一道,先凑两条、再并第三条;为了不再靠碰,把走法拆成四步——定母、求衍、求一、合并;为了让它有用,拿去开方、量田、定历;最后,它走出了一部书,走到了八百年后。
五个环,扣在一起:余数 → 合并 → 求一 → 开方与求积 → 流传。
秦九韶一生没有打过一次胜仗,没有做过一件大事,也没有等到自己的书印出来。他做的只是把一件小事想到底——想到别人也能照着走。
《数书九章》九卷,八十一问,今天读来仍不轻松。
其中最惊人的一题叫「遥度圆城」:远处一座圆城,只量得几段可见的距离,要算出城的周径。秦九韶列出一个十次方程,用正负开方术求到正根——十次方程,在十三世纪,用算筹,一位一位地开。
这部书里还有「蓍卦发微」,用同余解释《周易》揲蓍为什么十九、十七、十三这样取数;有「市物」类的利息与物价;有「军旅」类的行军与粮草。天文、田土、赋税、营造、买卖——一个南宋官府要办的事,几乎都在里面。
后来的人给它很高的评价,也给它很少的读者。它是一部「写得太早、传得太晚」的书。
秦九韶把「怎么算」写到了极处。可他没有回答另一个问题:为什么要算。
他自己答过一次:数与道非二本。算得清,是一种通理。但这个回答还不够——八百年后,机器一息能算百万次,人反而更要问:哪些事该交给算法,哪些事不能?
一道题可以算得毫无差错,可题目本身可能是错的;一套术可以传八百年,可用它的人可能只想多收几斗米。算法是中性的,用算法的人不是。
秦九韶留下的,不只是四步走法,还有一个姿态:把手里这件事想到底,想到别人也能照着走;然后,别忘了问一句——走这条路,是为了什么。
材料:二十三枚豆子(或棋子、硬币)、一张纸、一支笔。
一 在纸上画三格、五格、七格三条横线,当作三张「队列表」。
二 把豆子三枚一行排开,排完看余几个(应余二);记下。
三 重新五枚一行排开,看余几个(应余三);再七枚一行排开,看余几个(应余二)。
四 现在反过来:只给三个余数(二、三、二),不许数豆子,看能不能把总数推出来。先凑「三余二、五余三」:两列并看,最小的共同数是八;再每加十五试一次,看哪一个七除余二。
五 试到二十三,正是。再把豆子加到一百二十八(二十三加一百零五),验一遍三个余数是否仍旧不变。
为什么余数不变?因为一百零五同时是三、五、七的倍数——加上它,三条余数一条也不动。
若豆子是二十四枚呢?三个余数变成三、四、三;照同样走法,答案应是二十四本身。可见「余数」是一组坐标,把数钉在一条循环上。
材料:方格纸、铅笔、直尺、剪刀。
一 要开一万二千一百六十七的立方。先估十位:二十的立方是八千,三十的立方是二万七千——十位是二。
二 八千减去,余四千一百六十七。
三 个位设为 b。展开式告诉我们,余数要由三块凑成:三块「二十乘二十乘 b」、三块「二十乘 b 乘 b」、一块「b 乘 b 乘 b」。
四 试 b = 3:三块大的各一千二百(共三千六百),三块中的各一百八十(共五百四十),小块二十七;合计四千一百六十七,恰尽。答案二十三。
五 用剪刀把五块纸片剪下来,试着拼成一个边长二十三的立方体展开图——拼得上,就说明这一步没有算错。
(20 + 3)3 = 8000 + 3 × 400 × 3 + 3 × 20 × 9 + 27 = 8000 + 3600 + 540 + 27 = 12167。
三块「大」的是三个面,三块「中」的是三条棱,一块「小」的是一个角——这正是立方体展开的五个部分。
再验:23 × 23 = 529,529 × 23 = 12167。
农历的难处,在于两个周期对不齐。
一个朔望月约二十九点五三日;一个回归年约三百六十五点二四日。十二个朔望月只有三百五十四日上下,比一年少了十一天。若只管月份,三年之后,正月就要跑到夏天去。
古人的办法是置闰:十九年里插进七个闰月。十九年若每年十二月,共二百二十八个月;加七个,得二百三十五个月。二百三十五乘二十九点五三,约六千九百四十日;十九乘三百六十五点二四,也约六千九百四十日——两者只差一个多时辰。
「十九年七闰」是这个差数被逼出来的结果;而「哪一年该闰、闰几月」,历代历法各有算法,其中的推算正是同余式组。
今天每一次网上付款,都在做两件事:把一个大数乘起来,把一个余数算出来。
密码的锁,建立在「乘起来容易、拆回去难」上:两个大素数一乘,几毫秒;要把乘积拆回那两个素数,几万年。而开锁的一步,需要算「模逆元」——正是秦九韶的「求一」。
于是八百年前的四步,成了今天芯片里的一小段指令:定母、求衍、求一、合并,改名叫模数、预计算、扩展欧几里得、Garner 合并。
同一套算术,还可以用来「分钥匙」:一份机密拆成几份,交给几个人;凑够份数才能拼回,少一份都不行。这不是比喻——它真的就是同余式组:条件够了,解唯一;条件不够,候选无穷。
这一册讲的不是「一位古代数学家的成就」,而是一个人怎样把「说不清」变成「算得清」。
秦九韶生活在南宋末年,四川残破,仕途坎坷,书成而不得刊行。他做的事,说到底是给自己造一小块秩序:三个余数,一道题;一道题,一套术;一套术,八十一问。
孩子读这本书,能拿到三样东西:一是「换个问法」的习惯——数不清就改问余数;二是「分头办事」的办法——一次只凑两条;三是「把聪明写下来」的意识——步骤比聪明更靠得住。
还有一层,值得与孩子慢慢说:这么好的东西,为什么埋了五百年?这问题没有简单答案,但它比任何一道题都重要。
给孩子的——看图,听故事:为什么点兵不用一个一个数?那个人为什么夜里不睡?那本书为什么五百年后才印出来?
给少年的——跟着算一次:p.9 的三条合并、p.16 的配方、p.30 的三斜求积、p.37 的六十七,都可以拿纸笔验。验过,就知道「术」不是背出来的。
给大人的——留意注里的分寸:哪些是秦九韶原文的术语,哪些是后人的命名(如「中国剩余定理」),哪一桩公案至今存疑(p.47)。
三个可以不急着回答的问题,留给亲子一起慢慢聊。
一 为什么「会算」的人,地位却不高?
因为算被看作手艺,理被看作学问。秦九韶不服这个分法,才写下「数与道非二本」。今天也有类似的偏见:会动手的不如会说话的。这一条,值得与孩子辨一辨。
二 一部书写得再好,没人读,算不算白写?
对作者是遗憾,对人类是浪费。可若没有那本书躺在《永乐大典》里,八百年后的人连遗憾的机会都没有。写下来,本身就是一种抵抗。
三 算法能替人做决定吗?
能算的,是「怎么走最快」;算不出的,是「该往哪里走」。秦九韶把「怎么算」写到了极处,可他留下的最后一问是「为什么算」。这一问,机器答不了。
《数学家的故事》第一辑 · 第 04 册
秦九韶 · 数书九章
明线:物不知数与同余 · 逐次合并 · 大衍求一术(定母、求衍、求一、合并)· 收数与相容判据 · 正负开方术与增乘 · 三斜求积 · 上元积年 · 中国剩余定理与其今用
暗线:乱世里的秩序 · 当世界算不清时,人还可以把余数算清
时代:约 1208—约 1268 · 南宋(下延至 1801 年高斯《算术研究》与今日密码学)
主典:《孙子算经》·《九章算术》刘徽注 ·《数书九章》·《测圆海镜》·《四元玉鉴》·《算术研究》
体例:扉页与题解 2 页 · 引子 3 页 · 五幕 35 页(每幕:故事 1 · 数学 3 · 暗线 1 · 交汇 1 · 小结 1)· 收束与留问 3 页 · 动手做 2 页 · 小典 2 页 · 延伸 2 页 · 家长导读 2 页 · 版权 1 页,共 52 页。
《数学家的故事》第一辑十册:欧几里得 · 刘徽 · 费马 · 秦九韶 · 笛卡尔 · 伽罗华 · 高斯 · 希尔伯特 · 黎曼 · 陈省身。本册为第四册。