Qin Jiushao · 约1202–1261

秦九韶

只知道几个余数,他也能把那个数反推出来——而且任意一组除数都管用

NirikiMmi(modM)N \equiv \sum_i r_i \, k_i \, \frac{M}{m_i} \pmod{M}
大衍求一术 · 《数书九章》卷一,1247 · 中国剩余定理的完整算法

秦九韶字道古,自序里说自己祖上是鲁郡人,生地一般定在普州安岳(今四川安岳)。生年有 1202 与 1208 两说,都是从零星记载里推出来的,至今没有定论(本馆按 1202 排序);卒年一般定在 1261 年,另有 1268 年一说。他不是书斋里的人,一生都在地方上做官:通判建康府,知琼州,最后被贬到梅州,死在任所。数学从哪里来,他在《数书九章》的自序里自己交代了一句:「早岁侍亲中都,因得访习于太史,又尝从隐君子受数学。」——跟着朝廷的天文官学历算,又跟一位不肯留名的人学数学。

淳祐四年(1244)他因母丧解官回湖州守制,三年闭门,写出了这部书;自序署淳祐七年九月(1247)。全书九类八十一题:大衍、天时、田域、测望、赋役、钱谷、营建、军旅、市易——题目多半是他自己经手过的事,筑堤要摊派多少人夫,仓里的米被偷了多少,雨下了几寸,敌营有多大。两件事让它站进了世界数学史:大衍求一术把一次同余方程组的解法写成了任意除数都能照做的通法,比高斯的《算术研究》早五百五十四年;正负开方术把高次方程的逐位求根推到任意次、任意正负系数,他自己解到了十次。这本书后来差点没传下来:原本只在抄本间流传,靠《永乐大典》抄存,清代四库馆臣从中辑出,一直要到 1842 年郁松年刻进《宜稼堂丛书》,它才第一次有了印本。

秦九韶肖像
《数书九章》四库全书本(题《数学九章》)卷一上的一叶 · Wikimedia Commons,公有领域。秦九韶没有画像传世,流传的塑像都是今人所造。这一叶版心题「钦定四库全书」「卷一上」,正文在讲衍母、衍数与奇数怎么互相度尽,末行接着引出那句「大衍求一数云:置奇右上,定居右下,立天元一于左上」——中国剩余定理的那套算法,就从这一句摆开。

生平

  1. 约1202
    约生于普州安岳

    1202 与 1208 两说都是据零星记载推的,至今没有定论。自序称其先为鲁郡人,那是祖贯。

  2. 早岁
    访习于太史,受数学于隐君子

    《数书九章》序:「早岁侍亲中都,因得访习于太史,又尝从隐君子受数学。」这两位老师是谁,他没有说。

  3. 1244
    丁母忧,归湖州守制

    是年任建康府通判,因母丧解官。此后三年闭门,书就是在这段时间里写成的。

  4. 1247
    《数书九章》成

    自序署淳祐七年九月。九类八十一题,每类九题;后人分作十八卷。

  5. 卷一 大衍类
    大衍求一术

    「置奇右上,定居右下,立天元一于左上」——求乘率的算筹表,也就是今天的扩展欧几里得算法。

  6. 卷四 天时类
    天池测雨

    「不知器形不同,则受雨多少亦异」——盆口大盆底小,盆里的水深不等于地上的雨深,他给了换算。

  7. 卷五 田域类
    尖田求积与三斜求积

    前者化成一个四次方程用正负开方术解出 840 步;后者只用三条边求三角形面积,与海伦公式等价。

  8. 卷八 测望类
    遥度圆城

    望得见走不到的圆城,他列出一个十次方程,得数自乘就是城径九里。全书方程次数最高的一题。

  9. 1258
    知琼州,数月而罢

    这一任的年份有 1258、1259 两说。李曾伯的奏状说他是持淮阃(吴潜时督视江淮)的书信来的;吴潜 1259 年罢相、次年被贬,他也随之贬为梅州守。

  10. 1261
    卒于梅州任所

    卒年通行定在 1261 年,另有 1268 年一说。同时代的刘克庄与稍后的周密都留下过对他人品极坏的记载,清代以来对这些记载一直有争议。

  11. 1408
    抄进《永乐大典》

    这部书从未刻板印行,只在抄本间流传。今天还读得到它,靠的是《永乐大典》这一次抄存。

  12. 1784
    四库馆臣从《永乐大典》辑出

    戴震、陈际新等人辑录,四库全书本题作《数学九章》,提要署乾隆四十九年;正文下附了大量按语——其中几条直接批评他把题目算复杂了。

  13. 1842
    《宜稼堂丛书》刻本

    郁松年刻,沈钦裴校、宋景昌续校并撰《札记》。成书五百九十五年之后,这部书才第一次印出来。

  14. 1852
    大衍求一术传到西方

    这年八月到十一月,伟烈亚力在上海《北华捷报》上分九期连载一组介绍中国算学的札记,这套办法才为欧洲所知;此时距高斯的《算术研究》已过五十一年。

展品厅

绝大多数展品都可以亲手把玩——这是本馆的立馆之本;少数以叙述为主的,做成故事展签。

镇馆之宝 · 亲手玩

只知道几个余数,把那个数找回来

大衍求一术——一次同余方程组的通法,任意一组除数都管用,比高斯的《算术研究》早五百五十四年。

NirikiMmi(modM)N \equiv \sum_i r_i \, k_i \, \frac{M}{m_i} \pmod{M}

《孙子算经》里有一道「物不知数」:三三数之剩二,五五数之剩三,七七数之剩二,问物几何。它给了答案 23,也给了一条口诀,可那条口诀只对 3、5、7 这一组数管用,换一组就不知道该乘什么。秦九韶补上的正是这个「换一组怎么办」。《数书九章》开篇第一类就叫大衍,九道题,前面立着一套通法:把各个除数(元数)两两「连环求等」,把公因子约掉,化成两两互素的定数;定数相乘为衍母;衍母除以每个定数得衍数;衍数满定数去之,剩下的叫奇;再拿奇与定数去求一个乘率,使乘率乘奇除以定数正好余一;乘率乘衍数为用数;最后各个余数乘上自己的用数,加起来,满衍母去之,剩下的就是要找的那个数。求乘率的那一步就是「大衍求一术」,术文写得像一张棋谱:「置奇右上,定居右下,立天元一于左上……须使右上末后奇一而止」——两个数在右行辗转相除,商数交互累乘到左行,直到右上剩下一个 1,左上那个数就是乘率。这正是今天的扩展欧几里得算法,「求一」两个字说的就是「一直除到余数为一」。演示用的是卷二「余米推数」:米铺被盗,三箩米各剩一合、一升四合、一合,三个贼分别拿马杓(容一升九合)、木履(一升七合)、漆碗(一升二合)舀米。定数 19、17、12,衍母 3876,奇 14、7、11,乘率 15、5、11,用数 3060、1140、3553,三项相加得 22573,满衍母去之余 3193 合——每箩三石一斗九升三合,这正是书上的答数。欧拉与高斯后来各自给出过同余方程组的解法,但《算术研究》处理的是除数两两互素的情形;秦九韶的「连环求等」先把不互素的一组化成互素的定数,这一步欧洲要晚得多才补上。今天 RSA 解密用中国剩余定理把一次大指数拆成两次小的,快出约四倍;纠错码、散列表、日程排班,用的也是同一件事。

拨动三个余数,看求一术的算筹表一步步把乘率求出来,再合成那个数

《孙子算经》的「物不知数」只给了 3、5、7 这一组的口诀;秦九韶给的是通法。三个除数(定数)相乘得衍母;衍母除以每个定数得衍数;衍数满定数去之得;再用求一术求出乘率,使乘率乘奇除以定数正好余一;乘率乘衍数得用数——用数的妙处在于,它被自己那个定数除余一,被另外两个除都整尽。于是各余数乘上自己的用数一加,满衍母去之,剩下的就是要找的数。求一术那张表就是今天的扩展欧几里得算法:右行辗转相除,商数交互累乘进左行,「须使右上末后奇一而止」。

一位一位,把根定出来

正负开方术:高次方程的逐位求根法,他解到十次;里面那套嵌套乘法,比霍纳早五百七十二年。

x4+763200x240642560000=0x=840-x^4 + 763200\,x^2 - 40642560000 = 0 \quad \Longrightarrow \quad x = 840

《数书九章》卷五「尖田求积」问的是一块两头尖的田:两条大斜三十九步,两条小斜二十五步,中广三十步,面积多少。术文开头写着「以少广求之,翻法入之」。他不去分别求两个三角形,而是直接把整块面积当未知数:半广十五自乘得二百二十五为半幂,小斜幂六百二十五减半幂余四百,乘半幂得九万,是小率;大斜幂一千五百二十一减半幂余一千二百九十六,乘半幂得二十九万一千六百,是大率。两率相减余二十万一千六百,自乘得四百零六亿四千二百五十六万,为实;两率相加倍之得七十六万三千二百,为从上廉;以一为益隅。翻成今天的写法就是一个四次方程:负的四次方加上七十六万三千二百倍的平方,再减四百零六亿四千二百五十六万,等于零。最高次系数是负的,他管这一档叫「翻法」;奇次项全是空位,算筹摆出来中间几格是空的,他管这叫「玲珑」。解法是逐位定商:先定百位,八百代进去,实从负四百零六亿翻成正三百八十二亿五百四十四万(照草文的写法,中间那个「零」不写);再定十位,续商四十,「命上续商四十除实适尽」——实正好减到零,根是 840 步。每定一位要把方程整个平移一次,也就是把 f(x) 换成 f(x+h),这一步他用「增乘」做:一列数自上而下依次乘上商再加下一个,走 n 轮。这正是今天的嵌套乘法——中国的教科书把它叫「秦九韶算法」,西方叫霍纳法,霍纳发表于 1819 年,晚了五百七十二年。省下来的是实打实的乘法次数:四次多项式求一次值,嵌套要 4 次乘法,照 ax⁴+bx³+cx²+dx 逐项展开要 4+3+2+1=10 次;到十次方程就是 10 次对 55 次。这套办法不是他一个人从头造的:十一世纪贾宪的增乘开方法已经有了骨架(原书失传,靠杨辉《详解九章算法》的转录留下——而《详解》本身也残了,今天读到的主要出自郁松年的《宜稼堂丛书》——与《数书九章》同一套丛书、同一个刻书人),十二世纪刘益的《议古根源》已经用上负系数;秦九韶把它推到任意次数、任意正负系数,并给每一档情形都配了规矩。四库馆臣读到这一题时忍不住加了一句按语:小率九万开平方得三百,大率二十九万一千六百开平方得五百四十,加起来就是八百四十,「其法甚易,然必如此费算者」,大概是他存心要让整块面积一次算出来,不必先求两块分积。

「以少广求之,翻法入之」——术文开头这七个字点明了这一题的两个脾气:用开方的办法做,而最高次系数是负的。奇次项一个都没有,算筹摆出来中间几格空着,他管这叫玲珑。盘上摆的不是系数本身,而是「超步」之后的数——定哪一位,就把各项乘上相应的位数,于是盘面读到的正是书里写的那几个:百位那一档益隅一亿、从上廉七十六亿三千二百万;商八百之后益下廉三十二亿、益上廉三百七亿六千八百万、益方八百二十六亿八千八百万、正实三百八十二亿五百四十四万;退位到十位,它们依次变成一万、三百二十万、三亿零七百六十八万、八十二亿六千八百八十万。续商四十,「命上续商四十除实适尽」——实正好减到零,根是 840 步。还有一件要当心的事:最高次系数为负,曲线两头朝下,正根有两个——840 是整块尖田的面积(540 加 300),240 是那两个三角形之差;每一位取到「实不翻成负」为止,走的就是 840 这一支。

三条边就够了:三斜求积术

与海伦公式逐位相同的一条式子——两边各自独立地写下它,隔着一千二百年。

S=14[a2c2(a2+c2b22)2]S = \sqrt{\frac{1}{4}\left[a^2c^2 - \left(\frac{a^2+c^2-b^2}{2}\right)^2\right]}

《数书九章》田域类「三斜求积」:一块沙田有三条边,小斜十三里,中斜十四里,大斜十五里,里法三百步,问田有多大。术文只有三句:「以小斜幂并大斜幂,减中斜幂,余半之,自乘,于上;以小斜幂乘大斜幂,减上,余四约之,为实;一为从隅,开平方,得积。」照着做:169 加 225 得 394,减 196 余 198,半之得 99,自乘得 9801;169 乘 225 得 38025,减去 9801 余 28224,四约之得 7056,开平方得 84 平方里。草里连开方的两步都留着——「于实上商置八十」,再「续商四里」,除实适尽。换算过去:一平方里是 300 乘 300 等于九万平方步,84 平方里是七百五十六万平方步,按二百四十平方步一亩得三万一千五百亩,合三百一十五顷,正是书上的答数。这条式子与海伦公式是同一条:把括号展开,两边逐项相同,随便挑一个三角形代进去,两个算法给出同一个数。有意思的是它们各自的来历。海伦写在《度量论》里,那本书中世纪之后就只剩别人书里的零星引用,1896 年才在伊斯坦布尔重新找到全本;这条公式在阿拉伯世界经由转述流传过,但没有证据表明它传到过宋代的中国。两边写下的是同一个事实,形式却不一样:海伦从半周长出发,四个因子连乘再开方;秦九韶从三个平方数出发,凑出一个差再开方——后者算起来更适合算筹,因为全程只用整数的乘减,不必先取半周长。他给这一类式子的名字也不同:不叫公式,叫「术」。

三角形面积是底乘高除以二,可在一块真实的地上,高最难量:要从一个角往对边作垂线,还得保证真的垂直。三条边却好量,拉一根绳子就行。秦九韶给的术只有三句:以小斜幂并大斜幂,减中斜幂,余半之,自乘,于上;以小斜幂乘大斜幂,减上,余四约之,为实;一为从隅,开平方,得积。把它展开,与海伦公式逐项相同——两边各自独立地写下了同一个事实,隔着一千二百年。形式却不一样:海伦从半周长出发,四个因子连乘;秦九韶从三个平方数出发,全程只有整数的乘与减,更适合算筹。

望得见,走不到:圆城有多大

北门外三里有棵树,出南门往东走九里回头正好看见它——城的直径是九里。

x10+15x8+72x6864x411664x234992=0x^{10} + 15x^8 + 72x^6 - 864x^4 - 11664x^2 - 34992 = 0

《数书九章》测望类「遥度圆城」:有一座圆城,不知周长与直径,四面城门开在正中;北门外三里有一棵乔木,出南门往东走九里,回头正好看见那棵树。问城的周与径。「正好看见」四个字是这道题的全部条件:视线擦着城墙过去,也就是与城相切。这是刘徽重差术的路子——量得到的量出来,量不到的用几何推——只是这一次推出来的不是一个除法,而是一个方程。秦九韶把它化成一个十次方程:一为从隅,十五为从七廉,七十二为从五廉,八百六十四为益三廉,一万一千六百六十四为益上廉,三万四千九百九十二为实。奇次项全是空位,所以他叫它「开玲珑九乘方」。解得 x = 3,而「得数自乘为径」——城径是 x 的平方,九里;再照他这题声明的古率(圆周率取 3)乘上去,周二十七里。这道题还留下了数学史上少见的一段:四库馆臣在正文下写按语,说凡勾股难题用天元术做,多到四次方程也就够了,元代李冶的《测圆海镜》一百七十问里只有一题用到六次方,作者自己还嫌烦;「此题非甚难者,乃取至九乘方,盖未得其要也」。馆臣接着另起炉灶,用天元术当场重做一遍,得到的是一个四次方程:四次方加六倍三次方加九倍平方,减九百七十二倍的一次项,再减二千九百一十六,等于零——它的正根也正是 9。同一道题,同一个答数,两条路,一条绕了十次,一条四次就到。演示里两条方程并排现算,挪动那棵树与往东走的路程,可以看见视线什么时候刚好擦着城墙。

「乃见木」三个字是这道题的全部条件:视线擦着城墙过去,也就是与城相切。这是刘徽重差术的路子——量得到的量出来,量不到的用几何推——只是这一次推出来的不是一个除法,而是一个方程。秦九韶把它化成十次:一为从隅,五因北外里为从七廉,北里幂八因为从五廉,二率差四乘北里为益三廉,倍负率乘五廉为益上廉,以北里乘上廉为实。奇次项一个都没有,算筹盘上中间几格空着,他叫它开玲珑九乘方;解得 x = 3,而「得数自乘为径」,城径九里。五百多年后,四库馆臣在这一题下写了句按语——「此题非甚难者,乃取至九乘方,盖未得其要也」——顺手用天元术重做一遍,只要四次方程,正根同样是 9。

盆里积了九寸水,地上下了几寸雨

已知最早的雨量换算题之一。他先把话说在前头:器形不同,接到的雨就不一样。

平地雨深=h(d12+d1d2+d22)3D2\text{平地雨深} = \frac{h\,(d_1^2 + d_1 d_2 + d_2^2)}{3\,D^2}

《数书九章》天时类「天池测雨」的题面,前半段不是题,是一段话:「今州郡多有天池盆以测雨水,但知以盆中之水为得雨之数,不知器形不同则受雨多少亦异,未可以所测便为平地得雨之数。」——各州郡都摆着天池盆量雨,可大家只把盆里积了多少水当作下了多少雨,不知道盆的形状不一样、接到的雨也就不一样,不能拿盆里量到的直接当平地的雨深。然后才是题:盆口径二尺八寸,底径一尺二寸,深一尺八寸,盆里接到的雨水深九寸,问平地雨降几何。答:三寸。他的术是:盆深乘底径为底率,两径之差乘水深再加底率为面率,面率除以盆深就是水面的直径;底率与面率相乘、各自平方,三项相加乘水深为实;盆深乘口径,自乘再乘三为法;实除以法就是平地雨深。照着算:底率 216,面率 360,水面径 20 寸;216×360 加 216² 加 360² 得 254016,乘九得 2286144 为实;18 乘 28 得 504,自乘得 254016,再乘三得 762048 为法;除得 3 寸。这套算法里有一件值得说的事:从头到尾没有出现圆周率。水体是一个圆台,圆台体积里的那个 π,与盆口圆面积里的那个 π,在相除时约掉了——所以答数与你取 3 还是取 3.14 毫无关系。同类的题他一口气出了四道:圆罂测雨(罐子肚子鼓,要分段算,那一题他声明「圆法用密率」,术里以十一乘、以四十二除,用的是 22/7)、竹器验雪、峻积验雪(山坡上的积雪折算成平地雪厚)。四库馆臣对后面几题并不客气,说竹器验雪那题「箩体通风」一句与算术不相干,按术算出来的数也对不上,怀疑是故意写来误人的。量雨这件事在中国由来已久,宋代已有州县上报「雨泽」的做法;秦九韶做的是把「盆里的水」换算成「地上的雨」,这一步今天的雨量计仍要做:承水口的面积是标称的,量到的水位再折算成毫米。

这道题的前半段不是题,是一句提醒:州郡都摆着天池盆量雨,可大家只把盆里积了多少水当作下了多少雨——器形不同,接到的雨就不一样。盆口大、盆底小,同样一场雨,盆里的水面会比平地高出一截。要还原平地的雨深,得把水的体积除以承雨的那个口的面积,而不是除以水面的面积。他的术里有一件容易忽略的事:从头到尾没有出现圆周率。圆台体积里的那个 π 与盆口圆面积里的那个 π 在相除时约掉了,所以答数与取古率 3 还是取 3.14159 毫无关系。同类的题他一口气出了四道:圆罂测雨、竹器验雪、峻积验雪——罐子肚子鼓、箩筐编得疏、山坡是斜的,每一种都要另算一遍。

数与道非二本也

序里那一句话,和八百年来关于他这个人的两种记载。

《数书九章》的自序是中国数学史上最好读的几篇文章之一。他从「周教六艺,数实成之」讲起,说数的用处大到可以通神明、顺性命,小到可以经世务、类万物,不是什么浅近的小技;讲到圣人把它神化了、只说个大概,常人又蒙在里头、天天用却不觉得,「要其归,则数与道非二本也」——说到底,数和道不是两回事。他也抱怨:汉代离古未远,还有张苍、许商、耿寿昌这些人,后世学者自以为高,不屑于讲,这门学问几乎断了;官府办事只好靠府史胥吏摆算筹,真懂的人反倒没人识得。他把当时的算学分成两半:天象历度叫「缀术」、太乙壬甲叫「三式」,这些是「内算」,讲究秘传;《九章》那一路是「外算」,是公开的;然后加了一句「其用相通,不可歧二」。紧接着他点出自己要补的空白:「独大衍法不载《九章》,未有能推之者」。序末还有一句常被引的话:「古之人先事而计,计定而行。」这个写下「数与道非二本也」的人,在同时代的记载里却是另一副样子。刘克庄有一篇《缴秦九韶知临江军奏状》,反对朝廷让他去知临江军,说他「暴如虎狼,毒如蛇蝎」;稍后周密的《癸辛杂识·续集》里有一条专记他的劣迹,从害人性命写到侵占田产。这两条是后世所有负面评价的源头。怎么看它们,一直有分歧:1946 年余嘉锡写《南宋算学家秦九韶事迹考》,拿刘克庄的奏状与周密的记载互相参证,认为那些罪状「固非横肆诬蔑」;近年为他辩诬的也有:有人把这种评价上的落差归到宋代的朋党之争上,蔡天新做过多次实地考察与求证,认为那些污名化站不住脚。两边都还在说,而可以确定的只有两件事:那些指控出自政敌与笔记,不是案卷;而那本书里的每一道题,八百年后仍算得出来。

故事展签故事展签:同一个人,留下了「数与道非二本也」,也留下了「暴如虎狼」——两种记载都传了下来。

传承

他的工作没有留在十八世纪——每条链的终点,都是你今天正在使用的东西。

《孙子算经》的「物不知数」大衍求一术:任意一组除数的通法RSA 解密的中国剩余定理加速与纠错码
贾宪的增乘开方法正负开方术:任意次、任意正负系数嵌套乘法(霍纳法)——今天每一次多项式求值
海伦公式三斜求积术:只用三条边,全程整数乘减计算几何里的面积公式与数值稳定的写法
刘徽的重差测望遥度圆城:把一次「正好看见」化成一个方程今天的几何约束求解,以及游戏引擎里那一句「它看得见你吗」
天池测雨、圆罂测雨把量器的形状折算成平地雨深今天的雨量计:承水口面积一定,水位再折算成毫米

语录

置奇右上,定居右下,立天元一于左上。

—— 《数书九章》卷一 大衍求一术 术文起首 · 求乘率的那张算筹表,就从这一句摆开;肖像位那一叶的末行引的正是它(四库全书本《数学九章》卷一上)

圣人神之,言而遗其粗;常人昧之,由而莫之觉。要其归,则数与道非二本也。

—— 《数书九章》序,淳祐七年九月(1247)· 说到底,数和道不是两回事

独大衍法不载《九章》,未有能推之者,历家演法颇用之,以为方程者误也。

—— 《数书九章》序 · 他知道自己在补哪一块空白:历算家天天在用,却说不出道理,还有人把它错当成方程术

古之人先事而计,计定而行。

—— 《数书九章》序 · 全书八十一题都是这句话的注脚:筑堤、屯田、量雨、测敌,都是先算再做