九章格数学 PhiloMath · 数学家的故事绘本 · 第一辑

秦九韶 · 数书九章

第 04 册 · 数学家的故事 · 第一辑 · 1208—1268 · 南宋 · 明线:大衍求一术、正负开方术与三斜求积 暗线:乱世里的秩序
明线 · 大衍求一术、正负开方术与三斜求积暗线 · 乱世里的秩序1208—1268 · 南宋全龄通识 · 三层可读
题解这一册怎么读p.2

秦九韶,字道古,普州安岳人——今四川安岳。约生于一二〇八年,卒年有异说,约在一二六八年前后。

他的父亲做过官,在临安(今杭州)的秘书省任职。少年秦九韶随父居京,得以出入太史局,跟掌天文历法的人学星象、学律吕、学营造。周密《癸辛杂识》记他「性极机巧,星象、音律、算术,以至营造等事,无不精究」——这句评语出自一位并不喜欢他的人之手,反而更可信。

一二四四年,母丧。他居湖州守孝,三年不得任官。就在这三年里,他把平生所习写成一部书:九类,每类九问,共八十一问,题名《数书九章》。书成于一二四七年。

这部书在他生前没有刊行。此后五百年,它靠抄本流传,入《永乐大典》,再由清代馆臣辑出;直到一八四二年,才有第一个完整的刻本。

三层

故事层——跟着画面往下读:一队兵、一张账、一盏守孝时的灯。

数学层——暖金色的框里,是这一页真正的数学:同余、大衍求一术、正负开方、三斜求积。

注疏层——页面下方的小字,标注年代、出处与真伪,给一起读的大人。

五幕一览
第一幕 营门外的余数 · 第二幕 先凑两条 · 第三幕 大衍求一术
第四幕 三件用场 · 第五幕 八百年后
引子守孝三年的那盏灯p.3

淳祐四年,湖州。这一年秦九韶三十七岁,母丧居家,按制三年不得任官。

屋外的消息一天比一天坏。北边的战报一封接一封:端平年间宋军北上失利,蒙古铁骑南下,四川屡遭兵火——那是他的老家。亲族流散,田庐焚毁,书信一年比一年少。

他不出门。白天料理丧事,夜里就着灯摆算筹。

摆的是什么?不是高深的题目,是官府里那些永远算不清的账:一块不方不正的田有多大,一仓米折成几石几斗,一段城墙要多少工,一队兵有多少人。他把这些账一道一道写成题,写完一道,再写一道。

三年下来,八十一问。

引子三堆石子p.4

军营里点兵,有个省力的老办法。

不必一个一个报数,只让兵站队:三人一排,站完看余下几个;五人一排,再看余下几个;七人一排,再看余下几个。三次站完,余数记下来,总数就出来了。

那天余下的数是:三三数之,剩二;五五数之,剩三;七七数之,剩二。

队正张口就报:「三千零六十八。」

秦九韶问他:怎么知道?队正答不上来。他说这是老规矩,祖父就这么教,祖父的祖父也这么教。至于为什么——没人问过。

这三个余数,凭什么钉死一个数?

引子数与道非二本p.5

《数书九章》的序里,有一句话很短,却很硬:

数与道非二本也。

意思是:算术与「道」,不是两件事。

这句话在当时是要顶人的。士大夫读经史、谈性理,把算账看作吏胥的杂役;会算的人地位不高,算得再准,也只是「能吏」。秦九韶偏不认这个分法:在他看来,能把一件事算清,与能把一个道理讲明,是同一种功夫。

所以这部书不只是给官府用的账本。他把每一道题都写全:为什么这样问、凭什么这样算、算完怎么验。八十一问,问问答答,像八十一级台阶。

故事 · 第一幕老规矩说不出道理p.6

那年秋天,秦九韶随军到江边一处营寨清点兵员。

营门外的沙地上,队正让兵站队。三人一排,站完,余下两个;五人一排,余下三个;七人一排,余下两个。他低头在沙上划了两道,抬头就报:三千零六十八。

秦九韶在旁边看了半晌,问:「凭什么?」

队正愣了。他想了一会儿,说:「三三数剩二,五五数剩三,七七数剩二——就这三个数,一报就知道。老规矩了。」

「老规矩从哪里来?」

队正笑了:「先生,这我可说不上。我爹这么教,我爹的爹也这么教。会用的多,说得出道理的,没见过。」

那天晚上,秦九韶在灯下把这三个余数抄在纸上。他要的不是这一个答案——他要的是那句话背后的走法。

数学 · 第一幕把「剩几个」写成式子p.7

「三三数之剩二」,用一句更省的话说:这个数被三除,余二。

「五五数之剩三」:被五除,余三。「七七数之剩二」:被七除,余二。

三条话,就是三个条件。秦九韶把它们并排写在一张纸上——写下这一行的时候,那个「说不清」的兵数,忽然变成了一道题。

这是这一册的第一个转弯:不问「有多少」,先问「除几余几」。数不清的东西,只要肯换一个问法,就能清得出来。

数学

「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),只说中一堆——三分之二的可能,一句话就排除了。三个条件叠起来,剩下的可能极稀。

数学 · 第一幕先凑两条p.8

三条一起看,眼会花。秦九韶的法子是:一次只看两条。

先看「被三除余二」:二、五、八、十一、十四、十七、二十、二十三……一步一步加三。

再看「被五除余三」:三、八、十三、十八、二十三……一步一步加五。

两列一比,第一个同时出现的是八;再往后,二十三也同时出现。八与二十三差十五——正好是三乘五。原来这两条一旦同时满足,就每隔十五个数重现一次:八、二十三、三十八、五十三……

两条条件,合成了一条:被十五除余八。三条变两条,题就轻了一半。

数学

两条同余可以并成一条:

x ≡ 2 (mod 3) 且 x ≡ 3 (mod 5) ⟺ x ≡ 8 (mod 15)

为什么是十五?因为第一个条件每 3 个一循环,第二个每 5 个一循环;两个循环要重新对齐,得等 3 × 5 = 15 个。若两模不互素,等的是它们的最小公倍数。

这一步可以反复做:并出的新条件,再与下一条并。三条并两次,四条并三次——无论多少条,都能这样一条一条吞下去。

数学 · 第一幕第三条一并,答案就钉住了p.9

现在手里只剩下两件事:被十五除余八,被七除余二。

把「被十五除余八」的数一路写下去:八、二十三、三十八、五十三、六十八……挨个拿七去除,看谁余二。

八除七余一,不对;二十三除七,三七二十一,余二——对了。

于是最小的答案是二十三。再往后呢?每过 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)内恰有一个解。题目问「几何」,问的就是这个最小的正解。

暗线 · 乱世里的秩序算得清的那一小块p.10

这一册的暗线,只有一句:乱世里的秩序。

秦九韶生活的年代,什么都算不清。哪一年能回四川,不知道;明天这座城还在不在,不知道;一封家书能不能到,也不知道。天下大势,没有一个人算得出来。

但一道题的余数是算得清的。给三个条件,答案就钉在一个数上;换谁来算,都是这个数。它不因战报而改,不因官位而改,也不因谁说得好听而改。

人在乱世里能守的东西不多。守不住城,守不住家,甚至守不住一具遗体。可他能守住一小块算得清的地方——那是他自己造的秩序,谁也拿不走。

明暗交汇 · 第一幕兵与历,同一道题p.11

同余不只用来点兵。它还有一件更大的用场:定历。

古人编历,先要定一个「上元」——一个理想的起算点:那一刻,冬至与朔日同时发生,又恰好是甲子日的夜半。此后每过一年、一月、一日,都从这个点往上加。

可冬至有冬至的周期,朔望有朔望的周期,干支有六十日的周期;三个周期长短不一,要找一个三者同时「归零」的时刻,正是解一道同余式组。模数越大、条件越多,算起来越苦——而这正是大衍求一术的用武之地。

《数书九章》「大衍类」九问,一半与历法有关。兵与历,看似相隔千里,用的却是同一套走法。

小结 · 第一幕幕末 · 两句p.12
一数不清的东西,可以先问「除几余几」。余数把无穷的可能,压成有限的条件。
二多个条件不必一次满足:先凑两条,并成一条;再与第三条并。每并一次,周期变长,答案变窄。
故事 · 第二幕他要的不是这一题p.13

二十三这个答案,队正也会。会的人不少——这门手艺在军中、在官府、在市井,传了不知多少代。

可秦九韶把自己问住了:换一道题呢?

若模数是四、九、十一?若余数是一、七、五?若不止三条,有七条、十条?若有一条的余数是零?

会做题的人多,会做「所有同类题」的人少。他想要一套走法:不论模数是多少、余数是多少、有几条,照着走,都能走到底;而且每一步都能验,不靠猜、不靠记。

碰巧算对一次,是运气;能算对每一次,才叫术。

数学 · 第二幕把题写成一般的样子p.14

先给「一类题」起个名字。设模数为 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。

数学 · 第二幕定母与求衍p.15

第一步,把三个模数乘起来,得「总数」: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)。

数学 · 第二幕求一,然后合并p.16

衍数有了,可它不听话:三十五被三除余二,不是余一。要用它调第一条,得先把它「扳」成余一。

怎么扳?乘一个数。三十五乘几,被三除余一?三十五余二,二乘二得四,四被三除余一——乘二就行。这个二要记下,秦九韶叫它「乘率」。

五与七那两条省事:二十一再被五除,本来就余一,乘率是一;十五被七除也余一,乘率也是一。

三份「用数」就出来了: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。三条全中。

暗线 · 乱世里的秩序把聪明拆成步子p.17

算法是什么?说穿了不神秘:把一个人的聪明,拆成别人也能走的步子。

定母、求衍、求一、合并。四步,每一步只做一件小事:乘一乘、除一除、凑个余一、加总去零。每一步都能验,验不过就回头查那一步——不必整题重来。

队正的「老规矩」是一种聪明,可它在队正的脑子里,队正一走,规矩就断了。秦九韶要把它从脑子里搬出来,搬到纸上,变成任谁照着走都能走通的东西。

乱世里最靠得住的,从来不是聪明人,是能传下去的步骤。

明暗交汇 · 第二幕算筹与程序p.18

把秦九韶的四步写成今日的程序,不过几行:

先算总数与三个衍数;再对每个衍数求乘率——这一步,程序里叫「扩展欧几里得」;最后把「余数 × 用数」加起来,对总数取余。

八百年前的算筹,与今天的机器,做的是同一件事:照着步骤走,一步不错。区别只在速度:人摆一次算筹要几息,机器一息能走百万次。

这也是算法的好处——它不挑工具。竹筹、算盘、纸笔、电子管、芯片,换的是手,不换的是那四步。

小结 · 第二幕幕末 · 两句p.19
一一类题要有一个一般的架子:模数、余数、条数都可变,走法不变。架子立起来,题就不再是一道一道的。
二分头办事:每个衍数只管一条,互不干扰;各自扳成余一,再按余数配方相加。这是「分而治之」最古老的样子。
故事 · 第三幕一卷之首p.20

八十一问编成九类,秦九韶把最难的一类放在最前,题作「大衍」。

「大衍」二字出自《周易·系辞》:大衍之数五十,其用四十有九。那是揲蓍求卦的法子,讲的是从一个总数里分出余数、再由余数定吉凶。借这两个字作类名,意思很明白:从一个总数里,由余数定出答案。

这一类九问,用的都是同一套走法。走法要有个名字,他取作「大衍求一术」——「求一」,是四步里最要紧的那一步:凑出一个余一。

名字起定,这一术就不再属于某一个人了。谁翻开第一卷,都能照着走。

数学 · 第三幕四步,一张表p.21

把整件事排成一张表,四步一目了然。

第一行「定母」,写下三个模数;第二行「求衍」,用总数除各自模数;第三行「求一」,各凑乘率;第四行「用数」,衍数乘乘率,再乘余数,最后加起来。

表一填完,答案自己就浮出来了。这也是秦九韶的脾气:能排成表的,就不靠记性。

数学

例 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。答案二十三。

数学 · 第三幕求一:用减法造出一个一p.22

乘率不能靠碰。三十五一数,与三互素,凑出余一并不难;可若遇上大模数,试乘几十次也未必撞上。秦九韶用的是减法——更相减损,也就是今天的辗转相除。

拿三十五去减三:减十一次,剩二。再拿三去减二:减一次,剩一。到这里,余一出来了。

接着往回代:这个一是三减二得来的;而二是三十五减十一个三得来的。把二换回去,整理一下,就成了「十二个三,减去一个三十五,等于一」。

既是「减去一个三十五」还余一,那么「加两个三十五」自然也被三除余一——乘率是二。减法的尽头,就是乘率。

数学

更相减损(辗转相除):

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,回代即得乘率——总能求到,且步数有限。这是「求一术」敢称「术」的底气。

数学 · 第三幕模数为什么怕有公因数p.23

走法能走通,全靠一条前提:模数两两互素。

为什么?因为「求一」要凑出余一。若两个模数有公因数,比如四与六,公因数是二;那么无论怎样乘、怎样减,凑出来的数总是二的倍数,永远凑不出余一来——术就断在半路。

凑不出余一,未必是题无解。四与六的题有的有解、有的没解:判据在余数上。四除余一、六除余三,有解(九就是);四除余一、六除余二,无解——前者必奇,后者必偶。

秦九韶没有把这类题推开。他另立一法,叫「收数」:先把公因数约掉,把模数化小,再按常法走,最后把结果放大回去。

数学

无解之例 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 内唯一。

暗线 · 乱世里的秩序秩序是可以写下来的p.24

一个时代崩坏的时候,人最先失去的是「可预期」。

明天会不会来兵,不知道;今年的漕运能不能到,不知道;说好的事还算不算,也不知道。什么都在变,人便学会了不信任何一句准话。

算法给的,正是可预期。同样的条件,同样的答案;换一个人算,还是这个答案;隔一百年再算,仍是这个答案。它不承诺太平,只承诺:只要照着走,就不会错。

这就是乱世里,一个人能给自己造的一小块秩序——纸上的、四行的、谁也拿不走的。

明暗交汇 · 第三幕宋元四大家p.25

十三世纪的中国,算法忽然一起长高。

秦九韶在南方写《数书九章》;李冶在封龙山写《测圆海镜》,用「天元术」设未知数列方程;杨辉在钱塘写《详解九章算法》,把「开方作法本源图」画进书里——那正是贾宪的三角数表;朱世杰稍晚,写《四元玉鉴》,把未知数从一元推到四元。

四个人隔着山河,互不相识,写的却是同一件事:把「怎么算」讲成一套可传的步骤。那是一个战乱的时代,也是一个算法的时代。

小结 · 第三幕幕末 · 两句p.26
一「求一」是全术的关口:用更相减损造出余一,再回代成乘率。只要模数互素,这一步必定走得通。
二模数有公因数时,先看余数是否相容;相容则「收数」约小再算。术不因例外而废,只为例外添一条路。
故事 · 第四幕九类,八十一问p.27

《数书九章》分九类,每类九问。

大衍——同余与历元;天时——历法、雨雪、日食;田域——田地面积;测望——测量远近高深;赋役——税粮徭役的分派;钱谷——粮仓、米麦折算;营建——土木工程用工用料;军旅——行军、布阵、粮草;市物——买卖、利息、物价。

看这份目录,就知道这部书是给谁写的:一个县官、一个管仓的、一个领兵的、一个修城的。全是日常要算的账。

可秦九韶在每一问后面都写明「术」——不是这一问的答案,是这一类题的走法。账本是死的,术是活的。他要交出去的不是八十一笔账,是八十一套算法。

数学 · 第四幕开一个立方:正负开方术p.28

第四幕讲三件用场。第一件:开方。

营建要算城墙的立方、粮仓的容积,常常要问:什么数的立方等于这个数?若数不整,古法就一位一位地逼。

拿一千七百二十八来试。先看最高位:十的立方是一千,二十的立方是八千——答案在十与二十之间,十位定为一。从一千七百二十八里减去一千,剩七百二十八。

再定个位。设个位是 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。

数学 · 第四幕把高次拆成一层层p.29

开平方好懂,开四次、开十次呢?道理一样:一位一位地定,每定一位,就把方程「降」一层。

定下十位之后,原来的三次方程里,那个未知数已经「用掉」了一半。把 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… 逐层核至七百二十八,恰合。

数学 · 第四幕三斜求积:只量三条边p.30

第二件用场:量田。

田很少是方的。一块斜斜的三角田,要报面积,怎么算?量高最麻烦——高在田中间,没有实物可依,脚踩进去还会踩坏庄稼。可三条边好量:沿着田埂走一圈,绳子一拉就有。

秦九韶的法子只用三条边:把三边各自平方,两两相乘,再减去一个由三边凑出来的数,开方,取一半。

拿一块十三、十四、十五步的田来试:三边平方是一六九、一九六、二二五;前两者相乘得三万三千一百二十四;三边凑出的那个数是七十,平方四千九百;相减得二万八千二百二十四;开方得一百六十八;一半,八十四步。

不必量高,不必画图,三条边一报,面积就出来了。

数学

三斜求积术(秦九韶):三边为 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 夹角上的投影长乘积——古人以「勾股」代余弦,不必提三角函数。

暗线 · 乱世里的秩序量不出的,算得出p.31

田在乱世里是最要紧的东西,也是最难说清的东西。

一块田,界石可能被推倒,田埂可能被踏平,业主可能逃了,契书可能烧了。剩下来的,只有地本身:三条边还在,形状还在。

秦九韶的术,让「说清」不必依赖那些会消失的东西。不必有契,不必有界石,不必有高——只要还能走一圈,量出三条边,面积就算得出来,且算得一样。

这就是算法给人的另一种秩序:把说不清的事,变成量得出的事;把量得出的事,变成算得清的数。

明暗交汇 · 第四幕两条路,一个式子p.32

同样一件事,西方也有人做。

古希腊的海伦,約公元一世纪,写过一部《度量论》,里面有这样一个式子:三角形面积等于半周长乘上「半周长减每一边」三个数,再开方。

秦九韶的三斜求积,与海伦的式子,形状完全不同:一个从平方与开方入手,一个从半周长与连乘入手。可把两者展开、化简,竟是同一个式子。

两条路,一条从代数走,一条从几何走,走到同一处。这不是巧合——三角形的面积只有一个,路可以有很多条。

小结 · 第四幕幕末 · 两句p.33
一开方靠「分层」:每定一位,系数更新一次,高次降到一次。十次方程,也不过降十层。
二求积靠「转化」:不量高,只量边;以勾股代三角。量得出的,就能算得出。
故事 · 第五幕书成之后p.34

书成于淳祐七年,秦九韶约四十岁。他没有等到它印出来。

宋末兵火连年,抄本流散。这部书在元代不甚流传,明代被收入《永乐大典》——那部卷帙浩大的类书,收书七八千种,抄本仅两部。

清乾隆年间开四库馆,馆臣从《永乐大典》中辑出这部书,题作《数学九章》,收入《四库全书》。可辑本仍有阙误,世间少见。

又过了近百年,一八四二年,宋景昌重加校勘,郁松年以「宜稼堂丛书」刊行,题名《数书九章》。至此,这部书写成近六百年后,才有了第一个完整的刻本。

他死后十一年,南宋亡。

数学 · 第五幕五百年后,它成了「定理」p.35

一八〇一年,德国,二十四岁的高斯出版《算术研究》。

书里给同余立了一门语言:符号、运算、定理。其中一条说:若干个两两互素的模数,各配一个余数,这样的同余式组必有解,且解在模数之积以内唯一。

这就是今日的「中国剩余定理」。

高斯没有读过秦九韶。他走的是另一条路:从欧拉、拉格朗日一路下来的同余理论。可他得出的结论,与五百五十年前那个守孝的人所做的,是同一件事——只不过一个写成「术」,一个写成「定理」。

数学

中国剩余定理 设 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。一名之异,实质全同。

数学 · 第五幕今天在哪里用它p.36

这门八百年前的术,今天仍在做事。

一是算大数。密码里的大数有几百位,直接算很慢;把它拆成几个小模数分头算,再合回来,能快上数倍——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, …,太多,无法定夺。这就是「两把钥匙开锁,一把开不了」的算术根据。

数学 · 第五幕照着表算一道今天的题p.37

换一组数,把整张表重走一遍。

题:某数被三除余一,被五除余二,被七除余四,求最小正解。

总数仍是一百零五,三个衍数仍是三十五、二十一、十五,三个乘率仍是二、一、一——因为乘率只与模数有关,与余数无关。这是术的省力处:模数不变,前三步可以照抄。

只换最后一步的配方:余一配七十,余二配二十一,余四配十五,加起来一百七十二;减去一百零五,得六十七。

验一遍:六十七除三余一,除五余二,除七余四。全中。

数学

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.38

秦九韶没有等来太平。他死时,南宋已在最后十年;十一年后,崖山。

他也没有等来名声。书未刊行,抄本稀见,明清两代的算家多半只知道《九章算术》,不知道有过这样一部书。他的生平,甚至被后人写得颇为不堪(见 p.47)。

可那套步骤活着。它活在抄本里,活在《永乐大典》的夹页里,活在四库馆臣的辑本里,活在一八四二年的刻版里,活在今天的教科书与程序库里。

王朝会亡,人会死,名声会烂。算法不会——它只要有人照着走一遍,就还在。

明暗交汇 · 第五幕同一件事,两种命运p.39

同一件事,两种命运。

秦九韶把它写进一部账本式的书里,题为「大衍求一术」,排在九类之首。他写得很细,每题列表、逐步演算,可这部书五百年无人接续。后来的算家读《九章》,不读《数书》。

高斯把它写成定理,放在《算术研究》第一卷。这部书成了欧洲数论的起点,同余成了全世界的语言;此后每一本讲数论的书,都要从这里开始。

不是中国人没想到。是想到了之后,那本书没有印出来,没有人接着往下走。

一件事要活下来,光有人想到不够,还得有人抄、有人印、有人读、有人接着做。

小结 · 第五幕幕末 · 两句p.40
一秦九韶的术与高斯的定理是同一件事:前者是走法,后者是说法。走法能算,说法能传。
二一门学问要活下来,需要四件事:有人想到,有人写下,有人印出,有人接着做。缺一件,就断一次。
收束回望:一条算路p.41

回望这一册,是一条越走越宽的算路。

起头只是营门外的一件小事:三个余数,一个兵数。为了说清「凭什么」,先把「剩几个」写成同余;为了不只解一道,先凑两条、再并第三条;为了不再靠碰,把走法拆成四步——定母、求衍、求一、合并;为了让它有用,拿去开方、量田、定历;最后,它走出了一部书,走到了八百年后。

五个环,扣在一起:余数 → 合并 → 求一 → 开方与求积 → 流传。

秦九韶一生没有打过一次胜仗,没有做过一件大事,也没有等到自己的书印出来。他做的只是把一件小事想到底——想到别人也能照着走。

收束他留下的那部书p.42

《数书九章》九卷,八十一问,今天读来仍不轻松。

其中最惊人的一题叫「遥度圆城」:远处一座圆城,只量得几段可见的距离,要算出城的周径。秦九韶列出一个十次方程,用正负开方术求到正根——十次方程,在十三世纪,用算筹,一位一位地开。

这部书里还有「蓍卦发微」,用同余解释《周易》揲蓍为什么十九、十七、十三这样取数;有「市物」类的利息与物价;有「军旅」类的行军与粮草。天文、田土、赋税、营造、买卖——一个南宋官府要办的事,几乎都在里面。

后来的人给它很高的评价,也给它很少的读者。它是一部「写得太早、传得太晚」的书。

收束 · 留问算法之后,还剩什么p.43

秦九韶把「怎么算」写到了极处。可他没有回答另一个问题:为什么要算。

他自己答过一次:数与道非二本。算得清,是一种通理。但这个回答还不够——八百年后,机器一息能算百万次,人反而更要问:哪些事该交给算法,哪些事不能?

一道题可以算得毫无差错,可题目本身可能是错的;一套术可以传八百年,可用它的人可能只想多收几斗米。算法是中性的,用算法的人不是。

秦九韶留下的,不只是四步走法,还有一个姿态:把手里这件事想到底,想到别人也能照着走;然后,别忘了问一句——走这条路,是为了什么。

动手做 一摆一个点兵盘p.44

材料:二十三枚豆子(或棋子、硬币)、一张纸、一支笔。

一 在纸上画三格、五格、七格三条横线,当作三张「队列表」。

二 把豆子三枚一行排开,排完看余几个(应余二);记下。

三 重新五枚一行排开,看余几个(应余三);再七枚一行排开,看余几个(应余二)。

四 现在反过来:只给三个余数(二、三、二),不许数豆子,看能不能把总数推出来。先凑「三余二、五余三」:两列并看,最小的共同数是八;再每加十五试一次,看哪一个七除余二。

五 试到二十三,正是。再把豆子加到一百二十八(二十三加一百零五),验一遍三个余数是否仍旧不变。

要点

为什么余数不变?因为一百零五同时是三、五、七的倍数——加上它,三条余数一条也不动。

若豆子是二十四枚呢?三个余数变成三、四、三;照同样走法,答案应是二十四本身。可见「余数」是一组坐标,把数钉在一条循环上。

动手做 二用方格纸开一个立方p.45

材料:方格纸、铅笔、直尺、剪刀。

一 要开一万二千一百六十七的立方。先估十位:二十的立方是八千,三十的立方是二万七千——十位是二。

二 八千减去,余四千一百六十七。

三 个位设为 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。

小典 一术语 · 记号p.46
同余
两数之差被某数整除,称二者对该模同余,记 a ≡ b (mod m)。例:23 ≡ 2 (mod 3)。
模
同余所依据的除数。「模 7」即只看被 7 除的余数,只有 0 到 6 七种。
互素
两数只有公因数 1。3 与 5 互素,4 与 6 不互素(公因数 2)。
大衍求一术
秦九韶所立一次同余式组的解法,四步:定母、求衍、求一、合并。
定母
即各个模数 mi。名「母」者,取其为本位之根。
衍数
总数除以本位之模,Mi = M/mi;它是其余各模的倍数,故只影响本条。
乘率
使 Miki ≡ 1 (mod mi) 的 ki,即今之「模逆元」。
用数
衍数乘乘率,Ni = Miki;在本条余一,在别条余零。
总数
各模数之积 M;答案以 M 为周期。
收数
模数不互素时,先约去公因数、化小再算的补救之法。
正负开方术
解任意次方程(系数可正可负)的逐位求根法;每定一位,系数更新一层。
增乘
开方时逐层更新系数的算法:乘一次、加上去,层层相因。
三斜求积
由三角形三边求面积之法,与海伦公式等价。
上元积年
取冬至、朔日、甲子日同起之理想历元,自其上推至所求年的年数;其推算即解同余式组。
中国剩余定理
西方对「两两互素模数的同余式组必有唯一解」的称法;其算法即大衍求一术。
记号 ≡ 同余 · (mod m) 模 m · gcd(a, b) 最大公约数 · Mi 衍数 · ki 乘率 · Ni 用数
小典 二人名 · 典籍 · 一桩公案p.47
秦九韶(约 1208—约 1268)
字道古,普州安岳人。南宋数学家、官员。著《数书九章》,立大衍求一术、正负开方术、三斜求积。
秦季槱
秦九韶之父,曾任秘书省官职,工词章;秦九韶随父居临安,因得接触太史局与皇家藏书。
李冶(1192—1279)
金元之际数学家,著《测圆海镜》《益古演段》,立「天元术」。
杨辉(约 1238—约 1298)
南宋数学家,著《详解九章算法》《算法通变本末》《续古摘奇算法》,录贾宪三角与纵横图。
朱世杰(约 1249—约 1314)
元代数学家,著《算学启蒙》《四元玉鉴》,推广「四元术」。
周密(1232—约 1298)
宋末元初文人,著《癸辛杂识》《武林旧事》;《癸辛杂识》续集载秦九韶行事,为后世争议所本。
高斯(1777—1855)
德国数学家,1801 年《算术研究》建立同余理论,给出中国剩余定理的现代表述。
典籍
《孙子算经》(约四、五世纪)·《九章算术》(约一世纪成书,魏刘徽注)· 秦九韶《数书九章》(1247)· 李冶《测圆海镜》(1248)· 朱世杰《四元玉鉴》(1303)· 高斯《算术研究》(1801)
一桩公案 周密《癸辛杂识》续集记秦九韶「性喜奢好大,嗜进谋身」,并载其贪墨、居家不检乃至毒杀其子诸事;刘克庄亦有类似记载。此说流传甚广,然出于政敌与文人之笔,细节多不可核。近世学者(如钱宝琮)多认为其中夹杂党争与传闻,不足尽信;亦有学者主张不宜全盘否定。本册不作断言,只标本末:凡属传闻,不作史实。
延伸 一闰月里的同余p.48

农历的难处,在于两个周期对不齐。

一个朔望月约二十九点五三日;一个回归年约三百六十五点二四日。十二个朔望月只有三百五十四日上下,比一年少了十一天。若只管月份,三年之后,正月就要跑到夏天去。

古人的办法是置闰:十九年里插进七个闰月。十九年若每年十二月,共二百二十八个月;加七个,得二百三十五个月。二百三十五乘二十九点五三,约六千九百四十日;十九乘三百六十五点二四,也约六千九百四十日——两者只差一个多时辰。

「十九年七闰」是这个差数被逼出来的结果;而「哪一年该闰、闰几月」,历代历法各有算法,其中的推算正是同余式组。

延伸 二从大衍到密码p.49

今天每一次网上付款,都在做两件事:把一个大数乘起来,把一个余数算出来。

密码的锁,建立在「乘起来容易、拆回去难」上:两个大素数一乘,几毫秒;要把乘积拆回那两个素数,几万年。而开锁的一步,需要算「模逆元」——正是秦九韶的「求一」。

于是八百年前的四步,成了今天芯片里的一小段指令:定母、求衍、求一、合并,改名叫模数、预计算、扩展欧几里得、Garner 合并。

同一套算术,还可以用来「分钥匙」:一份机密拆成几份,交给几个人;凑够份数才能拼回,少一份都不行。这不是比喻——它真的就是同余式组:条件够了,解唯一;条件不够,候选无穷。

家长导读 一这一册在讲什么p.50

这一册讲的不是「一位古代数学家的成就」,而是一个人怎样把「说不清」变成「算得清」。

秦九韶生活在南宋末年,四川残破,仕途坎坷,书成而不得刊行。他做的事,说到底是给自己造一小块秩序:三个余数,一道题;一道题,一套术;一套术,八十一问。

孩子读这本书,能拿到三样东西:一是「换个问法」的习惯——数不清就改问余数;二是「分头办事」的办法——一次只凑两条;三是「把聪明写下来」的意识——步骤比聪明更靠得住。

还有一层,值得与孩子慢慢说:这么好的东西,为什么埋了五百年?这问题没有简单答案,但它比任何一道题都重要。

三层读法

给孩子的——看图,听故事:为什么点兵不用一个一个数?那个人为什么夜里不睡?那本书为什么五百年后才印出来?

给少年的——跟着算一次:p.9 的三条合并、p.16 的配方、p.30 的三斜求积、p.37 的六十七,都可以拿纸笔验。验过,就知道「术」不是背出来的。

给大人的——留意注里的分寸:哪些是秦九韶原文的术语,哪些是后人的命名(如「中国剩余定理」),哪一桩公案至今存疑(p.47)。

家长导读 二留下的问题p.51

三个可以不急着回答的问题,留给亲子一起慢慢聊。

三问

一 为什么「会算」的人,地位却不高?
因为算被看作手艺,理被看作学问。秦九韶不服这个分法,才写下「数与道非二本」。今天也有类似的偏见:会动手的不如会说话的。这一条,值得与孩子辨一辨。

二 一部书写得再好,没人读,算不算白写?
对作者是遗憾,对人类是浪费。可若没有那本书躺在《永乐大典》里,八百年后的人连遗憾的机会都没有。写下来,本身就是一种抵抗。

三 算法能替人做决定吗?
能算的,是「怎么走最快」;算不出的,是「该往哪里走」。秦九韶把「怎么算」写到了极处,可他留下的最后一问是「为什么算」。这一问,机器答不了。

写下想法
(此处留给亲子手写。读完这一册,最想留住的一句话是什么?)
版权版权与编目p.52
编目

《数学家的故事》第一辑 · 第 04 册
秦九韶 · 数书九章

明线:物不知数与同余 · 逐次合并 · 大衍求一术(定母、求衍、求一、合并)· 收数与相容判据 · 正负开方术与增乘 · 三斜求积 · 上元积年 · 中国剩余定理与其今用
暗线:乱世里的秩序 · 当世界算不清时,人还可以把余数算清

时代:约 1208—约 1268 · 南宋(下延至 1801 年高斯《算术研究》与今日密码学)
主典:《孙子算经》·《九章算术》刘徽注 ·《数书九章》·《测圆海镜》·《四元玉鉴》·《算术研究》

体例:扉页与题解 2 页 · 引子 3 页 · 五幕 35 页(每幕:故事 1 · 数学 3 · 暗线 1 · 交汇 1 · 小结 1)· 收束与留问 3 页 · 动手做 2 页 · 小典 2 页 · 延伸 2 页 · 家长导读 2 页 · 版权 1 页,共 52 页。

《数学家的故事》第一辑十册:欧几里得 · 刘徽 · 费马 · 秦九韶 · 笛卡尔 · 伽罗华 · 高斯 · 希尔伯特 · 黎曼 · 陈省身。本册为第四册。