Shen Kuo · 1031–1095

沈括

他在一部随笔里顺手写下两条「古书所不到」的算术,又把围棋的局数数到了头

S=n6[(2a+c)b+(2c+a)d]+n6(db)S = \frac{n}{6}\big[(2a+c)\,b + (2c+a)\,d\big] + \frac{n}{6}\,(d-b)
隙积术 ·《梦溪笔谈》卷十八 · 前一项是刍童的体积公式,后一项是他「思而得之」补上的——有空隙的一堆,照刍童算总是少

沈括字存中,钱塘人,1031 年生,1095 年卒于润州,《宋史》把他附在同族沈遘的传后,说他「居润八年卒,年六十五」。以父荫做沭阳主簿,在那里疏水为「百渠九堰」、得上田七十顷;1063 年中进士,入馆阁校书。熙宁年间受神宗与王安石赏识,提举司天监——《宋史》说当时的日官「皆市井庸贩,法象图器,大抵漫不知」,他置浑仪、景表、五壶浮漏,招布衣卫朴造新历。1075 年出使辽国争河东黄嵬的地界,事先在枢密院翻出旧档,谈判时让随行吏士把几十件地界文书背熟,对方问一句就答一句,六次会谈后辽人让了步。后来做到翰林学士、权三司使,出知延州守边;1082 年徐禧筑永乐城兵败,他因救援不及被贬为团练副使(《宋史》作均州,四库提要作筠州),此后退居润州城外自己买下的园子,名之曰梦溪。

《梦溪笔谈》二十六卷就写在梦溪,按他自己的说法是「与宾客言者」的笔记:官制、音律、医药、地理、器物、异闻,十七门里算学只占「象数」「技艺」的几条。可就是这几条,让他进了数学史:卷十八里两条「古书所不到」的术——算有空隙的一堆东西有几个的隙积术,由弦与矢求弧长的会圆术——是宋元垛积术与弧矢割圆术的源头;同一卷里他把唐人一行算过的「棋局都数」重算一遍,给出 3 的 361 次方,还说「只五次乘,便尽三百六十一路」。补笔谈里他主张废掉阴历月,改用以节气定月的「十二气历」,自己料定「尤当取怪怒攻骂」。同时代的张耒在《明道杂志》里记他「博学多能,天文、历数、钟律、壬遁皆极其妙,尤善用算,然甚好弈棋,终不能高」——算得出棋盘上一共有多少局的人,自己下棋下不好。本馆收的六件,五件是这几条算术本身,第六件是那部没人肯用的历。

沈括肖像
《梦溪笔谈》卷十八 ·《四部丛刊续编》影印明刊本(张元济校勘),Wikimedia Commons,公有领域。沈括没有同时代的画像传世,今天常见的那几幅都是后人的想象画,所以这里放他自己的书。这一页上是隙积术的正文:右起先是立方的末句与堑堵、刍童两种「古法」;右数第八行开头印着「之六而二」,紧接着就是「隙积者,谓积之有隙者,如累棋、层坛及酒家积罂之类」;末两行是他自己的那一条「予思而得之,用刍童法为上行,下行别列下广,以上广减之,余者以高」——下一页接「乘之,六而一,并入上行」。那个「六而二」是刍童公式的末尾,本该是六而一,明刊本与四库本都印错了

生平

  1. 1031
    生于钱塘

    据《宋史》「居润八年卒,年六十五」倒推。

  2. 早年
    沭阳主簿:百渠九堰

    以父荫得官。沭水故道漫为污泽,他疏为百渠九堰,得上田七十顷。

  3. 1063
    中进士

    嘉祐八年。其后编校昭文馆书籍,为馆阁校勘。

  4. 熙宁中
    提举司天监

    置浑仪、景表、五壶浮漏,招卫朴造奉元历。《笔谈》说卫朴「不用算推古今日月蚀,但口诵乘除,不差一算」。

  5. 1075
    使辽,争黄嵬地界

    先在枢密院翻出旧议疆界文书,指古长城为界;到辽廷凡六会,辽人舍黄嵬而改请天池。归途画成《使契丹图》。

  6. 1082
    永乐城之败,贬官

    徐禧不听他先筑石堡的议,先城永乐,城陷。他因救援不及,谪为团练副使。

  7. 1086
    十二气历的样本年

    补笔谈里拿元祐元年作例:孟春小,一日壬寅,三日望,十九日朔;仲春大,一日壬申。

  8. 约1088
    退居润州梦溪园

    园子是他早年梦中所见、后来在京口买下的,名之梦溪。《梦溪笔谈》二十六卷、《补笔谈》《续笔谈》都写在这里。

  9. 1095
    卒于润州

    年六十五。

  10. 1261
    杨辉把隙积推成一系列

    三角垛、四隅垛各配一句口诀;1303 年朱世杰《四元玉鉴》再往上推一层。

  11. 13 世纪
    李冶照他的棋局法算字数

    《敬斋古今黈》卷五:「用沈存中括棋局法求之,亦自可尽」——拿来算世间文字的组合,引文里也写着「连书万字五十二」。

  12. 1280
    郭守敬的弧矢割圆

    《授时历》由弦矢求弧、再把黄道度换成赤道度,一般认为这一路的起点就是会圆术。

  13. 1887
    黄遵宪抄出十二气历

    《日本国志》卷九:有人说置闰出于不得已、中国无人创论及此,他「乃举沈存中用十二气为一年之说以告之」,全文附录,「以塞专尚西法者之口」。

展品厅

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

镇馆之宝 · 亲手玩

一堆有空隙的酒坛,刍童法总算少

上二下十二、共十一层的一堆坛子是 649 个;照刍童的体积公式算只有 630 又 2/3——他补上的正是那 18 又 1/3。

k=0n1(a+k)(b+k)=n6[(2a+c)b+(2c+a)d]+n6(db)\sum_{k=0}^{n-1}(a+k)(b+k) = \frac{n}{6}\big[(2a+c)b+(2c+a)d\big] + \frac{n}{6}(d-b)

《梦溪笔谈》卷十八技艺门:「算术求积尺之法,如刍甍、刍童、方池、冥谷、堑堵、鳖臑、圆锥、阳马之类,物形备矣,独未有隙积一术。」刍童是上下两个长方形、四面斜收的台体,《九章算术》早有公式:倍上长加下长、乘上广,倍下长加上长、乘下广,两位相加,乘高,六而一。可他要算的是另一种东西:「隙积者,谓积之有隙者,如累棋、层坛及酒家积罂之类。虽似覆斗,四面皆杀,缘有刻缺及虚隙之处,用刍童法求之,常失于数少。予思而得之:用刍童法为上行,下行别列下广,以上广减之,余者以高乘之,六而一,并入上行。」也就是在刍童公式后面补一项 n(d − b)/6。他自注的例子:酒坛最上一层纵横各二罂,最下一层各十二,层层相次,共十一层。刍童法:倍上长 4 加下长 12 得 16,乘上广得 32;倍下长 24 加上长得 26,乘下广得 312;并得 344,乘高 3784;另列下广 12 减上广 2 余 10,乘高 110,并入 3894,六而一得 649。逐层数一遍:4 + 9 + 16 + … + 144 = 649,一个不差;而单用刍童只有 3784 ÷ 6 = 630 又 2/3,少了 18 又 1/3。他的修正对任意的上长、上广、层数都精确成立(逐层相加的和式与这条公式是代数恒等),上长上广都取 1 时就是四隅垛 1² + 2² + … + n²——两百年后杨辉那两句口诀、再往后朱世杰的垛积招差,都从这里出发。他自己的解释是:「刍童求见实方之积,隙积求见合角不尽,益出羡积也。」传本有两处要说明:刍童公式的末尾,四部丛刊影明刊本与四库本都印作「六而二」,照它算会整整多出一倍,应作「六而一」;草里的中间数两本也有印错的(3784 都印作「二千七百八十四」),而最后的 3894 与 649 两个数是对的。

拨上长、上广与层数,看坛子一层层摞起来;右边并排印逐层数出来的个数、刍童法与隙积术,差的那一项就是他补上的

2×2、共 11 层的一堆,逐层数是 649 个;照刍童的体积公式算只有 630 又 2/3,少了 18 又 1/3。沈括「思而得之」的办法是另列一行:下广减上广、乘高、六而一,并进去——得 649,与逐层数的一个不差。他书上的例子是上二下十二、十一层,答六百四十九罂。

会圆术:由弦与矢求弧

径十步的圆割去二步,他算得弧长八步四尺,真值约九步一尺四寸——而割到半圆时,这条式子正好还原出「周三径一」。

sc+2v2d,c=2(d2)2(d2v)2s \approx c + \frac{2v^2}{d}, \qquad c = 2\sqrt{\left(\tfrac{d}{2}\right)^2 - \left(\tfrac{d}{2}-v\right)^2}

紧接着隙积术,同一条里还有第二件:「履亩之法,方圆曲直尽矣,未有会圆之术。凡圆田,既能拆之,须使会之复圆。」把圆田割出一块弓形,已知圆径与割去的深(矢),求那段弧长。他的术:以半径为弦(斜边),半径减去所割数为股,两者自乘相减、开方得勾,倍之为割田的直径(弦长);「以所割之数自乘,退一位倍之,又以圆径除所得,加入直径,为割田之弧」——写成今天的式子就是 弧 ≈ 弦 + 2·矢²/径。自注的例子:径十步,割二步。半径五、股三、勾四,弦八步;矢二自乘得四、倍之得八,退一位为八分之步即四尺(宋制一步五尺),以圆径十除——他说「今圆径十,已足盈数,无可除」,只把四尺加入,弧长八步四尺,即 8.8 步。照今天的算法,这段弧长是 10·arcsin(0.8) = 9.2730 步,他的式子少了 5.1%。把矢从零拨到半径扫一遍:误差始终是偏少,最大在矢约为径的 0.288 倍处,少 5.42%;一直割到半圆(矢等于半径、弦等于径),式子给出 径 + 径/2 = 1.5 倍径,恰好是周三径一的一半——这条近似与古率 π = 3 在端点上严丝合缝。它不是精确公式,可它是中国古算里已知最早的一条由弦与矢求弧的术,郭守敬《授时历》的弧矢割圆术一般认为由此而来。「此二类皆造微之术,古书所不到者,漫志于此」——两件都是他随手记下的。

径十步的圆割去 2.0 步:弦 8.0000 步,照会圆术「以所割之数自乘倍之,以圆径除,加入直径」,弧是 8.80008 步 4 尺);今天用反正弦算,真弧是 9.2730 步,他少了 5.10%。他书上的例子正是割二步,答「八步四尺」。

棋局都数:连书「万」字四十三

十九路的棋盘一共 3³⁶¹ 局,是个 173 位数;他说「大约连书万字」若干个——传本作五十二,照数算只有四十三。

33611.7409×10172=1.7409×(104)433^{361} \approx 1.7409 \times 10^{172} = 1.7409 \times (10^4)^{43}

「小说:唐僧一行曾算棋局都数,凡若干局尽之。予尝思之,此固易耳,但数多,非世间名数可能言之,今略举大数。」每个交叉点一黑、一白、一空三种,n 路的方盘就是 3 的 n² 次方局。他逐一写出:方二路八十一局,方三路一万九千六百八十三,方四路四千三百四万六千七百二十一,方五路八千四百七十二亿八千八百六十万九千四百四十三——拿 BigInt 逐一现算,这四个数一位不差(他注明用「算家数」:万万为亿、万万亿为兆、万万兆为垓)。方六路他写「十五兆九十四万六千三百五十二亿八千二百三万一千九百二十六局」,即 150094635282031926;真值是 3³⁶ = 150094635296999121,前十位对,末八位不对。「方七路以上,数多无名可纪。尽三百六十一路,大约连书万字」若干个,「即是局之大数」——3³⁶¹ = 1.7409×10¹⁷²,是个 173 位数,一个「万」字是四位,连书四十三个万字正好到 10¹⁷²。四部丛刊影明刊本、四库本,连同十三世纪李冶《敬斋古今黈》的引文,都写作「五十二」;通行的排印本(如维基文库的通行本)正文作「四十三」。五十二个万字是 10²⁰⁸,比真数大了三十几个数量级。是他自己写错,还是传抄早就错了,查不实,这里只摆出算出来的数。另一处可以从文本内部定下来:他给的「法」(循边一行十九路)印作「一十亿六千二百二十六万一千四百六十七」,即 1062261467,而 3¹⁹ = 1162261467——差的正是一个「一」字;他接着给的两行之数(3³⁸)前十位是 1350851717,与 1162261467 自乘的前十位相同,与 1062261467 自乘(1128399424…)对不上。所以脱字的是传本,不是他算错了法。

19 路的棋盘一共 3 的 361 次方局,是个 173 位数,四位一个「万」,要连书 43 个「万」字。沈括写出的方二路到方五路四个数一位不差;方六路前十位对、末八位不对;十九路他说「大约连书万字」若干,传本作五十二,照数算是 四十三

只五次乘,便尽三百六十一路

一子一子地三因要乘三百六十一次,一行一行地乘法要十八次,他的最径捷的一法:自乘一次,再乘五次。

3361=F19=((F2)3)3F,F=3193^{361} = F^{19} = \big((F^2)^3\big)^3 \cdot F, \qquad F = 3^{19}

局数怎么算,他给了三种办法。第一种:「初一路可变三局,自后不以横直,但增一子,即三因之,凡三百六十一增,皆三因之,即是都局数。」第二种:「先计循边一行为法」——十九路一行 3¹⁹ 局,「凡加一行,即以法累乘之,乘终十九行,亦得上数。」第三种最省:「以自法相乘」得两行 3³⁸,「下位副置之,以下乘上,又以下乘下,置为上位;又副置之,以下乘上,以下乘下;加一法,亦得上数。有数法可求,唯此法最径捷。只五次乘,便尽三百六十一路。」照字面把上位、下位当成两个算盘,一步一步读下来(这是本馆的读法,指数都以「法」为单位):自法相乘得 2;副置,下位也是 2;以下乘上得 4,又乘下得 6,置为上位;再副置,下位 6,以下乘上得 12,又乘下得 18;加一法得 19——法的 19 次方,正是 3³⁶¹。自法相乘之后恰好五次乘,与他那句自注「只五次乘」对得上。三种办法的乘法次数是 361、18、6(连自法相乘那一次)。按今天加法链的已知结果,19 次方至少要 6 次乘法,这一套已经是最短的;今天的程序求幂用的是反复平方,19 = 10011(二进制)也要四次平方加两次乘,一样是 6 次。他没有把「反复平方」当成一般的方法说出来,可他为一个具体的数找到的,正是不能再短的那一条。

8 步「加一法——亦得上数」:上位是法的 19 次方(3 的 361 次方,173 位),已乘 6 次。走到底是法的 19 次方——3 的 361 次方,173 位——自法相乘之后恰好五次乘,与他的自注「只五次乘,便尽三百六十一路」对得上。

三人饷一卒,极矣

一夫背米六斗,供一个兵走十八日;三夫也只到三十一日——再加人,多出来的路一次比一次短。

Tn=17.5+30(n1)n+2    47.5T_n = 17.5 + \frac{30\,(n-1)}{n+2} \;\longrightarrow\; 47.5

卷十一官政门:「凡师行,因粮于敌,最为急务。运粮不但多费,而势难行远。予尝计之:人负米六斗,卒自携五日干粮,人饷一卒,一去可十八日。」账是这样算的:每人日食二升,一夫六斗(六十升)加兵自带的五日(十升),两人日食四升,17.5 日吃完,他记作十八日。二夫饷一卒:三人日食六升,走到第八日吃掉四十八升,再给一夫六日粮遣回,恰好是一夫所负的六十升;剩下两人再走十八日,一去二十六日。三夫饷一卒:四人日食八升,六日半吃掉五十二升,给一夫四日粮遣回;三人日食六升,再走七日吃掉四十二升,给一夫九日粮遣回;剩下两人再走十八日,一去三十一日。这里传本有一处要说明:四部丛刊影明刊本与四库本在「三人饷一卒」的自注里都写「十七日,三人食,日六升」,可 6.5 + 17 + 18 = 41.5,与他自己的「三十一日」对不上;按 6.5 + 7 + 18 = 31,且紧接着「若计复回」那条自注写的正是「中七日,日食六升」——「十七日」的「十」是衍字。十八、二十六、三十一,每多一夫多出的路是八日、五日。若照今天的办法把「遣回的人要吃够回程」也算进去,同样的口粮给出 17.5、25、29.5 日;夫数再往上加,这个上界是 47.5 日:最后放回的那一夫最远只能陪到第三十日——再远,一夫所负连他自己回程的口粮都不够;一去的日数是 17.5 + 30(n−1)/(n+2),夫一个个加上去,只是往这块天花板上贴。他的结论不从这条曲线来,而从人数来:「三人饷一卒,极矣。若兴师十万,辎重三之一,止得驻战之卒七万人,已用三十万人运粮,此外难复加矣。」遣回的人他给的口粮比来路的天数少(走了八日给六日),原文没有交代他们怎么回去,这里照原账摆出,不替他圆。

3 夫饷一卒:米 190 升,照他的账到第 31 日吃尽,他记「一去可 31 日」。每多一夫多出的路一次比一次短:一夫到二夫多八日,二夫到三夫多五日。若遣回者也要吃够回程,一去是 29.5 日;夫再多,也贴不过 47.5 日。他的「三人饷一卒,极矣」算的却是人:兴师十万,已用三十万人运粮。

十二气历:尤当取怪怒攻骂

以立春为一年之首,大月三十一日、小月三十日,永不置闰——他料定会挨骂,也料定将来会有人用。

《补笔谈》卷二象数:「闰生于不得已,犹暍舍之用磹楔也。自此气、朔交争,岁年错乱,四时失位,算数繁猥。」阴历月以朔望定,十二个月比一个回归年短十一天,三年不到就得插一个闰月,于是「时已谓之春矣,而犹行肃杀之政」。他的办法:「今为术,莫若用十二气为一年,更不用十二月。直以立春之日为孟春之一日,惊蛰为仲春之一日」,大尽小尽相间,「岁岁齐尽,永无闰余。十二月常一大、一小相间,纵有两小相并,一岁不过一次。」六个三十一日加六个三十日是 366,两小相并那一年是 365,平均正好压在回归年的 365.24 日上下。月亮的盈亏并不丢掉,只是降一格,写进历日里备查:「借以元祐元年为法,当孟春小,一日壬寅,三日望,十九日朔;仲春大,一日壬申,三日望,十八日朔。」这个例子本身还把传本的一处脱文定了下来:今存明刊本与四库本这一句都作「大尽三十日」,可壬寅往后数三十天正是壬申——孟春小月是三十天,大月就只能是三十一天;元人盛如梓《庶斋老学丛谈》的引文正作「大尽三十一日,小尽三十日」。两处望朔也对得上:孟春三日望,再过一个朔望月 29.53 日,落在仲春二日半,他记三日望;十九日朔落在仲春十八日半,他记十八日朔。他对这套历的下场心里有数:「予先验天百刻有余、有不足,人已疑其说;又谓十二次斗建当随岁差迁徙,人愈骇之。今此历论,尤当取怪怒攻骂。然异时必有用予之说者。」八百年后,黄遵宪在《日本国志》卷九里记下一场争论:有人说置闰出于不得已、中国无人创论及此,他就把沈括这一条全文抄出来,「以塞专尚西法者之口」。

故事展签故事展签:一部以节气定月、永不置闰的历,他自己料定会挨骂。

传承

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

隙积术:有空隙的一堆,比同样大小的实心台体多出一项杨辉的三角垛、四隅垛与朱世杰的垛积招差——高阶等差级数一次求和算法分析里数嵌套循环要跑几次,与数值积分里离散之和、连续之积差的那一项
会圆术:由弦与矢求弧郭守敬《授时历》的弧矢割圆术:把黄道度换成赤道度授时历用了三百多年(明代的大统历沿用其法)——历法推步里的球面三角
棋局都数:3 的 361 次方,173 位把「一共有几种可能」数到底——组合计数密码学里的密钥空间:AES 的 128 位密钥有 2 的 128 次方把,论的正是这种数量级
只五次乘:先自乘,再乘上自己反复平方求幂——指数有几位,就只要几倍的乘法RSA 加密与网上支付里的模幂运算:上千位的指数,几千次乘法就算完
运粮:三人饷一卒,极矣补给线越长,每多一个人多出的路越短——沙漠越野车问题今天的最优化与运筹:物流与车队调度的算法
十二气历:以节气定月,永无闰余1887 年黄遵宪拿它回应「专尚西法者」今天的公历也是纯阳历——历法只管回归年,不管朔望月

语录

隙积者,谓积之有隙者,如累棋、层坛及酒家积罂之类。虽似覆斗,四面皆杀,缘有刻缺及虚隙之处,用刍童法求之,常失于数少。予思而得之。

—— 《梦溪笔谈》卷十八技艺 · 据四部丛刊续编影印明刊本 · 肖像位那一页就是这一段

此二类皆造微之术,古书所不到者,漫志于此。

—— 同上,隙积、会圆两术之后的收尾一句

千变万化,不出此数,棋之局尽矣。

—— 同上,棋局都数一条的末句

然算术不患多学,见简即用,见繁即变,不胶一法,乃为通术也。

—— 同上,论增成法一条的末句

今此历论,尤当取怪怒攻骂。然异时必有用予之说者。

—— 《补笔谈》卷二象数,十二气历一条的末句