一封迟到的回信
一封迟到的回信
1303 年的某一天,朱世杰在《四元玉鉴》序文里写下"此书一出,海内学算者,当有取益焉"之类的话。这本被后世称为中国筹算代数巅峰的书,在它自己的时代里其实没掀起太大水花。真正在七百年后拿起这本书去"取益"的人,算下来也不会太多。我们今天做这件事,不是为了给朱世杰翻案,也不是为了补一份迟到的致敬,而是想回答一个更具体的问题:把一本七百年前的书当作正在被阅读的文本来读,而不是当作博物馆里的展品来读,这件事到底意味着什么?这一章是全书的读前说明,回答的就是这个问题。
一封写给未来的信
《四元玉鉴》成书那年,朱世杰大约五十岁上下,距离他师父刘汝谐在河北、山西一带讲学的日子过去了二三十年,距他在扬州刊刻《算学启蒙》也快十年了。从《算学启蒙》到《四元玉鉴》,朱世杰把天元术从一元推到四元,把方程从线性推到任意次,把一个原本只解决"勾股求日高"这类狭义几何问题的工具,推成了一台能做多项式运算的通用机器。这台机器在当时没有同等水平的对手:欧洲最早处理三次方程的 Tartaglia、Cardano 还要等两百多年,阿拉伯世界的 al-Tusi、Sharaf al-Dīn 在方程分类上的工作也要再过几百年才被欧洲数学家读到。
可问题在于,朱世杰根本不知道这些。他也不在乎。他写这本书,预设的读者是和他一样熟悉算筹布列、熟悉"太阴、太阳、少阳、少阴"那套术语的同代人。一旦这个读者群消失,这本书就成了一封没有收件人的信。
朱世杰把《四元玉鉴》交给刊刻者的时候,书的寿命并不完全由他自己决定。元代后期和明代初年的北方长期战乱,江浙一带的雕版业受了重创。永乐年间编《永乐大典》时,《四元玉鉴》整本没有被收入,散在别处的零星抄本也很少被引用。一个明显的对照是,秦九韶的《数书九章》(1247)虽然同样艰深,但凭借《数书九章》在明代被程大位《算法统宗》(1592)部分征引,至少有零星片段进入实用算书的传统;《四元玉鉴》没有这个运气,它的术语太专门,整套语言都没有别处可以挂靠。
于是这封信寄出之后,几乎在邮路上失踪了。它不是被销毁,是被遗忘。两者后果一样:直到十八世纪后半叶的某个抄写员从《永乐大典》里把它重新辑出之前,中文世界几乎没有人完整读过这本书。这件事在数学史里并不孤立,但确实比大多数"失而复得"的案例更极端。
书架上的七百年
把这七百年的"接收史"讲清楚,是建立"为什么我们今天还要重读"这个问题之前必须先做的工作。读者不需要记住每一个名字,但需要知道这条线索是怎样从散乱中渐渐聚拢的。
第一个节点是清乾隆年间。1773 年开设四库全书馆,《四元玉鉴》因为被征入《永乐大典》而重见天日。馆臣从《永乐大典》里抄出一个本子,编入《四库全书》子部天文算法类。这个抄本的质量谈不上好,错漏不少,但它的意义是决定性的:从此《四元玉鉴》有了一个"准官方"的存世版本,原书后来还是丢了,抄本反而成了主要的母本。
第二个节点是十九世纪初叶的罗士琳。他从 1820 年代起花了大约十年时间整理《四元玉鉴》,做校勘、补图、释义,成果是 1830 年代刊行的校本。罗士琳自己也懂一点天元术,他的工作带有清代学者典型的"经学式"色彩:把原文视同经文,校异同、注音义、考术语。他留下的校本是后世所有研究的起点。差不多同时,沈钦裴也做过一种校勘本,思路与罗士琳不同,更偏"复原朱世杰原来的演算过程"。这两个校本之间常有歧义,后人讨论《四元玉鉴》的时候,几乎不可能绕开它们的分歧。
第三个节点是二十世纪上半叶。钱宝琮、李俨、严敦杰这几位,是用现代数学史方法处理中国古典数学的第一代人。他们各自的工作方式不同:李俨更偏目录与编年,钱宝琮偏重数学概念的内部分析,严敦杰则在细读文本和复原演算上花了很多功夫。钱宝琮在 1930 年代写的几篇关于宋元数学的论文,是把《四元玉鉴》放进"中国古代数学史"这条主线的奠基工作。严敦杰在 1940 年代前后对《四元玉鉴》做了较为系统的注释尝试,但因环境动荡,成果没有完全出版。
第四个节点是二十世纪下半叶。1950 年代开始,沈康身长期从事《四元玉鉴》的校释与复原工作,出版了带详细算式解释的整理本(虽然完整的整理本到他去世时仍未完成)。这条线索上更值得专门说的是吴文俊。吴文俊在 1970 年代后期到 1980 年代初,明确主张中国古代数学的"消元法"传统是一项独立的算法体系,并在此基础上发展出了几何定理机器证明的"吴方法"。吴方法的核心思想,即把几何问题化为多项式方程并通过逐次消元判定其可满足性,与朱世杰在《四元玉鉴》里做的事情在算法层面是同构的。
吴文俊这条线的存在不是巧合。他在数学史的写作里反复强调:中国古代数学不是现代数学的"前身",不是西方数学的"中国版本",而是有自己算法内核的独立传统;理解这个传统最有用的方式不是用现代符号去"翻译"它,而是进入它自己的运算流程。这个立场直接影响了后来《四元玉鉴》研究的方法论。
把这条线串起来:1773 年的辑佚、1830 年代的校勘、1930 年代的现代史研究、1950 年代以来的逐题复原、1970 年代以来从消元法视角的反向重读,这是一条从"抢救文本"到"重建算法"再到"重新激活算法"的弧线。我们今天重读《四元玉鉴》,站在的是这条弧线的最末一环。这并不说明我们比前人看得更深,只是说我们读这本书的问题意识变了:前几代人问的是"它写的是什么",我们问的是"它是怎么算的,以及那个'怎么算'今天还能教我们什么"。
三种读法与第三条路
数学史里对一部古典文本通常有三种读法。这三种读法并不是相互排斥的,但它们的问题意识差别很大。把它们拆开来,有助于看清楚我们这本书走的是哪一条路。
第一种是"成就清单"式读法。读完之后输出的东西是:朱世杰是世界上最早处理四元高次方程组的人之一;他在某些特殊问题上的处理方法比欧洲早多少多少年;他在多项式消元上达到了某某水平。这种读法在科普文章里最常见,也是最容易做的。它的好处是给读者一个坐标,把一本陌生的书放进世界数学史的版图里。它的坏处是把书本身掏空了:《四元玉鉴》被压缩成几个数字和几个"最早",读者根本不知道这本书"长什么样"。朱世杰在卷首的"四象朝元"那首二十字的歌诀里塞了多少信息,卷一中"太衍"和"明天"两题之间算法逻辑怎么衔接,这些都被略掉了。
第二种是"史料"式读法。读完之后输出的东西是:朱世杰的术语从哪里来,他可能受过哪些前人的影响,他的"四元"体系在多大程度上是独创的,《四元玉鉴》各卷之间有没有编纂顺序的问题。这种读法是数学史家的标准做法,做得越细越有价值。它的好处是搞清楚书的来源、年代与传播,搭起一个稳固的考据架子。它的坏处是容易陷入"这本书是谁的"而不是"这本书做了什么"的提问习惯。当我们问"朱世杰是否受了阿拉伯代数影响"的时候,问的是书的归属;当我们问"朱世杰怎么把四个未知元消去三个"的时候,问的是书的工作方式。史料式读法停留在第一个问题。
第三种是"活的文本"式读法。读完之后输出的东西是:朱世杰在某一题里用的是什么布列、什么相消、什么开方,每一步的算筹图景是怎么样的,那个图景里如果某个步骤改变,结果会怎么变。这种读法是本书的立场。它的前提是承认一本古代算书作为"算书"的根本特征:它不是论文,是带操作的程序。一本算书的"意义"在很大程度上是它的算法意义。如果不能进入它的算法流程,这本书就只是文献;如果能进入,它就是一台可以重跑的机器。
把这三种读法区分开,关键不在于谁对谁错,而在于它们问的问题不一样。成就清单式问的是"它的位置在哪里",史料式问的是"它从哪里来",活的文本式问的是"它怎么跑"。本书的每一章都会同时处理这三种问题,但落脚点始终在第三种。我们也会反复援引吴文俊的判断:中国古代算书里的"演段""开方""相消"等步骤,本质上是算法的描述而不是数学的证明。算法可以独立于证明存在,也可以独立于证明被重新理解。这条判断让"活的文本"式读法成为可能。
进入算筹的世界
要说明"活的文本"到底是怎么读,最好用一个具体的例子。这里给一个简化了的例子,比《四元玉鉴》里实际遇到的题要简单,但足以展示"进入算筹"这件事的实质。
假设我们处理一个二元二次方程组: $$ \begin{cases} x^2 + xy + y = 0 \\ 2x + y^2 = 1 \end{cases} $$
在现代符号里这没什么复杂的。但在朱世杰的算筹上,第一件事不是"解",而是"布"。他把每一个方程在算盘上排成一个二维的方阵,行为地元 $y$ 的幂次,列为天元 $x$ 的幂次。第一个方程 $x^2 + xy + y = 0$ 在算盘上对应的是这样的图景:
| | $x^2$ | $x$ | 常数 | |---|---|---|---| | $y$ | 1 | 1 | 1 | | 常数 | 0 | 0 | 0 |
(这里我们用 1 表示该位置有一根算筹,0 表示没有。实际运算中系数可以是任意正整数或负数,负数用红色算筹表示。)
第二个方程 $2x + y^2 - 1 = 0$ 在算盘上是:
| | $x^2$ | $x$ | 常数 | |---|---|---|---| | $y$ | 0 | 0 | 1 | | 常数 | 0 | 2 | -1 |
朱世杰的"相消"操作,本质上是在算盘上对两个这样的二维排布做多项式除法。他处理二元高次方程组的方法叫"互隐通分相消",名字听上去复杂,实质就是现代代数里说的"对 $y$ 求结式"(resultant)——但他是在算盘上做的,没有结式这个概念。
对上面这个例题,相消的逻辑是:把两个方程都看作关于 $y$ 的多项式,第一个是 $y + (x^2 + xy)$(注意这里的 $y$ 项系数是 $1+x$),第二个是 $y^2 + (2x - 1)$。要把 $y$ 消掉,等价于求这两个关于 $y$ 的多项式的结式。具体步骤是:用第一个方程乘第二个方程的某些项,再用第二个方程乘第一个方程的某些项,逐项相减。
在算盘上,这种操作表现为移动算筹、改写系数。每移动一根算筹,对应的是一个具体的多项式乘法和一项展开。相消的结束条件是所有含 $y$ 的项都消失,最终只留下一个关于 $x$ 的方程。这个关于 $x$ 的方程就是原方程组的"消元结果"。
我没有把这一步算到底——这个例子的目的是让读者体会"活的文本"式读法的具体形状。关键点不是"我们会算这道题",而是"我们会想象朱世杰的算筹上正在发生什么"。这种想象不是修辞,是阅读姿态。一旦把算筹图景当作算法的执行环境,每一根算筹的位置就都有了功能意义,而不是装饰意义。我们不能"跳过算筹",因为跳过的不是图,是步骤。
这也是为什么我们这本书不绕开算筹。绕开算筹最直接的方式,是用现代符号把方程写出来,再交给读者去解。这种"翻译"看上去体贴,实际上做的是和朱世杰相反的工作:朱世杰是把抽象运算物化在算盘上,我们是把算盘上的物化运算重新抽象回方程。这个反向操作的代价是,算筹图景里那些本属于算法的视觉信息被丢掉了——比如一个未知元在不同方程里"占的位置"是否一致、两个方程相乘时算筹的相对移动有没有规律、负系数的红色算筹和正系数的黑色算筹怎么协调。这些都是算理的一部分,翻译的时候不会消失,但会被读者忽略。
阅读协议
进入下一章之前,我们把全书的"阅读协议"立几条规矩出来。这几条规矩不是免责声明,是阅读姿态的明确化。
第一条,不绕开算筹。凡涉及多项式布列的地方,我们都会给出算筹图景的等价描述(用表格或坐标矩阵),不会只用现代符号打发了事。算筹图景不是装饰,是运算的载体。
第二条,不简化符号。朱世杰的"天元、地元、人元、物元"在本书里会保留,不会被简化为 $x, y, z, w$。这不仅是为了"原汁原味",而是因为四元之间的层级关系(天元在中央,其他三元在外周)和它们的相对位置本身就是算理的一部分。一旦替换成 $x, y, z, w$,这种层级就消失了。
第三条,每次相消走到底。遇到一个相消步骤,我们不会"用现代方法三行解出,然后指出对应朱世杰哪一步"。我们会把相消在算筹上完整地走一遍,包括中间产物。慢读的代价是字数膨胀,收益是读者能在每一题里完整地"运行"一遍朱世杰的程序。
这三条规矩对读者是有要求的。本书预设的读者是愿意花时间和一个七百年前的算书较劲的人。如果你只想知道"朱世杰是第一个处理四元方程组的人之一"这种结论,你不需要这本书,任何一篇综述文章都能告诉你。如果你愿意进入算盘,想知道那个第一到底是怎么做出来的,这本书就是写给你的。
慢读还有一层不那么显性的理由。朱世杰的算法设计在某种意义上是空间化的:他把多项式的逻辑结构用算盘的二维空间映射出来。这种空间化设计的好坏,取决于读者能不能在脑子里"看见"算筹。看不见图景的读者,不是在读《四元玉鉴》,而是在读现代代数的中国古代译本。本书反复给图景的另一个目的是帮读者练出那双眼。
准备回信
把朱世杰的《四元玉鉴》比作一封信,是我们这本书的底层隐喻。信已经寄出了七百年。收件人不在朱世杰这一边——他那个时代的同代人已经走完了。收件人在我们这一边,但我们中的绝大多数此前也没接上这封信。这本书就是七百年后的一次回信。回信的内容不是"我收到了,谢谢",而是"我重读了一遍,把你的算法在算盘上又跑了一次,下面是我的笔记"。
下一章我们回到写信的人。朱世杰的生平细节留下来的不多,但零星拼图已经够用:他从河北到扬州的讲学路径、他在《算学启蒙》和《四元玉鉴》两本书之间的方法论选择、他所处的元代数学共同体是怎么运转的——这些是理解"他为什么这么写"的前提。下一章我们做这件事。
本章小结
本章处理的是三个相互嵌套的问题。第一,《四元玉鉴》在中文世界的接收史不是简单的"埋没与发现"二元结构,而是一条从 1773 年辑佚到 1980 年代消元法重构的多段弧线。第二,对这部算书可以有三种读法:成就清单式、史料式、活的文本式;本书走第三条路,问题意识是"它怎么算"而不是"它属于谁"或"它位置在哪"。第三,进入"活的文本"意味着不绕开算筹图景、不简化符号、每次相消走到底。这三条规矩是本书后续所有章节的阅读协议。
把这三个问题合在一起,答案是一个判断:重读《四元玉鉴》不是怀古,是回到一种仍在生效的算理。这种算理在吴文俊手里变成了几何定理机器证明的算法,在沈康身的校释里变成了对每一道题步骤级的复原工作,在本书里变成对每一个相消、每一次开方、每一层布列的慢读。这条线索不新,但还没做完。
下一章,我们先回到朱世杰这个人。
把相消走完
上一节我们停在一个中途点上——给出两个方程,画出两张算筹图,没有把消去做完。这里补完它。这一节的目的不是演示解的细节,而是把"走到底"这个动作在算筹上的物理对应补完整。读过这一节之后,读者应该能在脑子里重建一次完整的多项式相消流程,从两个二维图景坍缩成一个一维图景。
方程组重写为关于 $y$ 的多项式:
- 方程 (1):$y(1+x) + x^2 = 0$
- 方程 (2):$y^2 + (2x-1) = 0$
相消的第一件事是统一两个方程关于 $y$ 的最高次。方程 (1) 关于 $y$ 是一次,方程 (2) 关于 $y$ 是二次。要让两者最高次齐平,需要把方程 (1) 乘以 $y$,得到 $y^2(1+x) + y \cdot x^2 = 0$。这一步在算筹上对应的是整列下移一格:原方程 (1) 的 $y$ 系数列包含两个 1,分别落在 $x^1$ 行和常数行;下移一格之后,这两个 1 落在 $y^2$ 列,但 $x$ 的幂次不变。原方程 (1) 的常数项($y^0$ 列中 $x^2$ 行的那个 1)也下移一格,进入 $y^1$ 列的 $x^2$ 行。
到这里,方程 (1') 和方程 (2) 都是关于 $y$ 的二次方程。下一步是让两者的 $y^2$ 系数齐平。方程 (2) 的 $y^2$ 系数是常数 1,方程 (1') 的 $y^2$ 系数是 $(1+x)$。最直接的做法是把方程 (2) 整式乘以 $(1+x)$。在算筹上,这相当于对方程 (2) 的整张图做一次"乘以 $(1+x)$"的卷积——$y^2$ 项的常数 1 变成 $(1+x)$,常数项 $(2x-1)$ 变成 $(2x-1)(1+x)$,而 $y$ 项原本没有,仍没有。
卷积的过程不是一步到位的。$(2x-1)(1+x) = 2x^2 + x - 1$ 这一步要在算筹上重新分配:原常数项的 $x^1$ 系数 2 一拆为二,分别给 $x^2$ 和常数项贡献 2;原常数项的常数 $-1$ 也一拆为二,分别贡献 $-1$ 和 $-1$;最后再补上一个交叉项 $x$。这些操作在算盘上一根一根算筹地移动,每一根的位移都对应一个明确的多项式乘法规律。
至此两个方程的最高次已经对齐,可以开始逐项相减。思路是把 $y^2$ 项对齐、$y$ 项对齐、常数项对齐,每一项做减法。两个 $y^2$ 项相减后消失——这正是相消的目的。剩下的 $y$ 项和常数项要继续处理,直到所有 $y$ 都被消去。
把上述步骤在纸上完整跑一遍,最后剩下的方程是:
$$ x^4 + 2x^3 + 3x^2 - 1 = 0 $$
(四次方项来自 $x^2$ 与自身的卷积,交叉项和常数项来自卷积与相减的组合。验算:把 $y = -x^2/(1+x)$ 代入方程 (2),化简同样得到上式。)
这是一元四次方程。在算筹上,它对应一张单列的图景——所有原本涉及 $y$ 的列都被合并抵消,最后只剩 $y^0$ 这一列:
| | $1$ | |---|---| | $x^4$ | 1 | | $x^3$ | 2 | | $x^2$ | 3 | | $x$ | 0 | | $1$ | $-1$ |
这张单列图就是朱世杰所说的"开方式"——一个准备好被开方处理的方程。从这里开始,下一步是"开方"程序:用"开上廉、下廉、隅"等术语,按特定规则逐层逼近方程的数值根。这一步我们不演示,因为那会是另一章的内容。
把这道例题从头到尾走完,读者得到的不是一道题的答案,而是一次完整的相消的形状。这个形状在朱世杰的算盘上和在现代 CAS 的寄存器里是同构的:两端各是一组多项式,中间是消元,最后剩下一个一元的可解方程。算筹是一根一根的位移,CAS 是一组寄存器的状态转移;它们做的事情是同一件事,只是视觉化方式不同。慢读的回报正是这种"看见形状"的能力——一旦形状稳定,下次遇到另一道题,读者就能在脑子里预演相消的每一步,而不必每次都依赖外部计算。
三种读法对同一段文本
三种读法对同一段文本能产生三种不同的输出。这一节用《四元玉鉴》卷一中一类典型问题("勾股求日高"系列中的一题)演示三种读法的差异。我们不引用原文——原题的术语和算法都需要单独注释才能理解——而是用一个现代读者可以直接读懂的重述,说明三种读法"看到"的是不同的东西。
重述:已知直角三角形中勾 = 8、股 = 12,求日高(仰角所对应的对边长度)。
成就清单式读法的