为什么要重读四元玉鉴
第 1 章 为什么要重读四元玉鉴
打开 Mathematica,输入 `Solve[{x^2 + y^2 == 25, x*y == 12}, {x, y}]`,回车。结果在零点几秒内返回,$\{(x \to -4, y \to -3), \ldots\}$,精确无误。再打开《四元玉鉴》卷一,翻到"勾股形"类问题:已知弦与勾,求股。手工操作时,需要先以勾为天元 $x$,列方程 $x^2 + 7 = a^2$,再开方。整个过程在算盘上需要十几步,并且每一步都可能因符号错误而失败。
这种对比乍看对朱世杰极为不利。一个十三世纪的中国算学家,怎么能与装了二十多年工程量的计算软件相提并论?但这个对比的预设本身就是错的。我们不是在比较谁算得快,而是在问一个更尖锐的问题:朱世杰采用的消元程序,今天还在被使用吗?他所代表的那种"把世界方程化"的认知路径,今天还在数学内部运行吗?如果答案是肯定的,那么重读这本书就不是怀旧,而是补课。
更具体地说,这本 1303 年的书里,至少有三个东西没有被时间磨损:第一,它的消元程序与现代代数几何中的结式(resultant)思想高度同构,今天仍出现在 Mathematica 与 Maple 的内核实现中;第二,它处理多项式方程数值根的方法,"增乘开方法",是今天仍在使用的秦九韶-霍纳方法的成熟形态;第三,它建立了一种"立式、消元、开方"的三段式认知路径,这种路径在二十世纪计算机科学兴起之后,反而显出了与生俱来的算法亲和性。
这三点构成本章的核心论断。本章余下部分的任务,是把这三点逐条展开,并在结尾把它们凝聚成一个具体的阅读动机清单。
一、站在 1303 年的世界数学坐标里
要回答"朱世杰站在哪里",首先要承认一件常被回避的事:十三世纪初的世界数学,是多中心的,不是欧洲中心主义的。
阿拉伯世界的代数学刚刚经历过它的鼎盛期。花拉子米(al-Khwārizmī, c. 780–850)的"还原与对消"两步骤奠定了方程处理的语法;奥马尔·海亚姆(Omar Khayyam, 1048–1131)用圆锥曲线几何方法系统解出了三次方程的全部正根。欧洲此时的代数还在襁褓之中:斐波那契(Leonardo Fibonacci, c. 1170–1250)的《算术宝书》(Liber Abaci, 1202)虽然传入了阿拉伯算术与代数,但缺乏处理符号多项式的传统。中国这边,秦九韶(c. 1202–1261)的《数书九章》(1247)已经把任意次多项式方程的数值求解程序写到了一种成熟形态,后来被英国人霍纳(William George Horner, 1786–1837)于 1819 年"重新发现"的逐次逼近法,在秦九韶那里叫做"正负开方术"。
在这种多极格局中,朱世杰的《四元玉鉴》做了什么?它把多项式系统的处理,从"单变量高次"推进到了"多变量系统"。具体而言,秦九韶的《数书九章》处理的是单个变量 $x$ 的高次方程 $f(x) = 0$;朱世杰要处理的是含有两到四个未知数的方程组。从单变量到多变量,看起来只是多了几个字母,实际上是程序设计的质变:单变量情形下,问题的核心是"开方"(即求解),多变量情形下,问题的核心变成"消元"(即把多变量化为单变量)。
消元的难度远高于开方。开方处理的是一个多项式,可以借助秦九韶已建立的稳定算法;消元处理的是多个多项式之间的关系,需要一种新的程序语言。《四元玉鉴》卷一到卷二处理二元问题,卷三到卷六处理三元和四元问题,逐步发展出了系统的"剔消法"。这部书的体例安排本身就透露了作者的程序设计思路:先处理最简单的二元情形,建立基本动作;再处理三元,加入新动作;最后处理四元,把所有动作组装成完整程序。这种由浅入深的结构,与今天算法教科书的写法惊人地相似。
举一个具体的例子。卷一"勾股形"问题之一:已知勾股和与弦,求勾与股。设勾为天元 $x$,股为地元 $y$,则有 $$x^2 + y^2 = s^2, \quad x + y = t$$ 其中 $s$、$t$ 为已知数。朱世杰的处理方法是:先把第二式改写为 $y = t - x$,代入第一式,整理为 $$x^2 + (t - x)^2 = s^2$$ 展开得 $$2x^2 - 2tx + (t^2 - s^2) = 0$$ 这是一个关于 $x$ 的二次方程,可以用增乘开方法求解。整个消元过程清晰、确定,并且对任意 $s$、$t$ 都成立。换句话说,朱世杰的程序具有一般性,不是针对某个特殊数值的技巧。
这个性质至关重要。十九世纪以前的许多代数著作,处理的都是数值特例,而非一般程序。朱世杰的程序可以输入任意参数,得到任意解,这是现代意义下的算法定义。因此,把《四元玉鉴》称为一部"算法文本"而非"算术文本",在文献学上是站得住的。
更进一步说,朱世杰的剔消程序,在数学结构上与现代代数几何中的结式思想高度同构。所谓结式,是两个多项式 $f(x, y)$ 和 $g(x, y)$ 通过消去 $x$ 后得到的一个新多项式 $R(f, g)(y)$,其零点恰对应原方程组的解。十九世纪的 Sylvester(James Joseph Sylvester, 1814–1897)和 Bézout(Étienne Bézout, 1730–1783)才把这一思想形式化,而朱世杰在十三世纪末已经在算筹盘上系统使用类似的程序。把这两个时间点并置起来看,不是要制造"中国人早就领先"的廉价民族自豪感,而是要看到:同一类数学结构,在世界两端独立地被发现、被使用,这本身就是数学史上最值得注意的事实之一。
这种独立性还有一层更深的意义。朱世杰的结式程序与 Sylvester 的结式理论之间,隔着至少五个世纪的静默。中间的失传不是因为朱世杰的算法有错误,而是因为中华代数传统缺乏一个连续的学术机构把它传承下去。这提示我们,数学的发展不是一条直线,而是多条断断续续的线段;每一条线段都曾经达到过某种高度,线段之间的失联则是历史条件所致,与"先进/落后"无关。
二、把现实方程化:一种被低估的认知传统
技术上的等价性之外,《四元玉鉴》更深的意义在于它代表的认知路径。整部书从第一卷到最末一卷,背后的逻辑都是一个:把现实问题转化为多项式方程,再用程序化的代数操作求解。这个路径在中文数学史里被称为"方程章"传统,与希腊的"几何证明"传统、阿拉伯的"还原-对消"传统都有所不同。
具体来说,《四元玉鉴》的每一道题,几乎都遵循同一个三段式结构。
先是布列算式,即根据题意,把已知量与未知量之间的关系表达为方程。这一步要求算学家对几何、商业、土地测量等现实问题具有高度抽象能力。他要能在"一块田地"和"一个多项式"之间建立同构。例如,卷二"田亩测量"类问题中,"四不等田"(四边互不相等的田)的面积需要分两步列方程:先用勾股求对角线,再用三角形面积公式拼合。两次列方程,都需要把土地的几何性质翻译成代数关系。这种翻译能力,在当时的欧洲并不常见,希腊几何传统强调的是证明,而非建模。
然后是消元,即在多变量情形下消去多余的未知数。这一步是朱世杰最精彩的贡献所在。《四元玉鉴》卷三到卷六处理三元和四元问题时,发展出了一套系统的"剔消"程序。所谓"剔消",是把高维的筹式(多项式的几何-算术双重表示)通过逐步操作化简为低维筹式,每一步"剔消"对应一次线性组合或代入。整个程序的设计原理,与今天线性代数中的行简化(row reduction)在精神上是相通的。一个具体的"剔消"动作:若有两个三元多项式 $f(x, y, z)$ 和 $g(x, y, z)$,且它们都包含 $z$ 项,则朱世杰会把 $f$ 减去 $g$ 与某个系数的乘积,使得结果中 $z$ 的最高次幂下降;然后再把新得到的筹式与原式组合,继续下降。这个动作循环下去,最终可以得到一个不包含 $z$ 的二元多项式。这一步骤在结构上等价于现代结式计算中的 Sylvester 矩阵消元。
最后是开方,即对单变量方程数值求解。这一步继承秦九韶的"正负开方术",程序稳定可靠,几乎可以处理任意次的多项式方程。"增乘开方法"在《四元玉鉴》里被反复调用,是整部书运转的引擎。
把现实问题按"立式-消元-开方"三段式处理,是中国代数传统最具识别性的方法论骨架。它不同于欧几里得的演绎-证明骨架,也不同于阿拉伯的还原-平衡骨架。它是程序性的,而不是断言性的。换句话说,中国数学家不倾向于追问"这条性质为什么成立"(定理式思维),而是追问"这一步怎么做出来"(程序式思维)。
这种差异在二十世纪以前没有被充分理解。一方面,欧洲中心主义的数学史观,把"证明"看作数学的最高形式,从而贬低了"程序"的价值;另一方面,十九世纪后期崛起的代数几何,又确实要求"证明"作为理论合法性的来源。两个传统各有其位,但把它们简单排序为"高/低",是错误的。
《四元玉鉴》代表的程序传统,在算法可计算性、计算复杂性等二十世纪新兴议题下,反倒显出优势。它天然就是为机器执行而设计的。一个具体的例子:1980 年代中期,计算机科学家在研究符号代数系统的算法复杂度时,发现"用结式消元"和"用 Gröbner 基消元"在复杂度上有数量级差异;进一步追溯到《四元玉鉴》中的"剔消"程序,会发现朱世杰使用的消元策略与现代最优结式算法在结构上是同源的。换句话说,十三世纪中国算学家选择的消元路径,与二十世纪算法工程师在无数次试错后选定的最优路径,殊途同归。这种跨时代的算法收敛,本身就是一个值得深思的现象。
再举一个更具体的认知差异例子。《九章算术》中的"方程章",已经在处理线性方程组的求解问题,它使用的是直观的"遍乘-对消"程序,类似现代高斯消去法的雏形。这一传统到朱世杰的《四元玉鉴》时,已经扩展到了非线性方程组。中间的过渡人物是秦九韶、李冶(1192–1279)等金元数学家,他们在十二到十三世纪之交完成了从线性到非线性的关键跳跃。这个跳跃在欧洲,直到十九世纪才被 Galois 理论、结式理论系统覆盖,比中国晚了至少五百年。
三、三种多项式哲学:朱世杰、牛顿与莱布尼茨
如果把《四元玉鉴》放在一个更长的历史时间轴上,与牛顿(Isaac Newton, 1643–1727)、莱布尼茨(Gottfried Wilhelm Leibniz, 1646–1716)处理多项式系统的方式做对照,差异会显得格外清晰。
三人都面对多项式 $f(x)$,但切入点完全不同。
朱世杰从"现实问题"出发:先有现实约束,再把它转化为多项式方程;多项式方程的求解只是整个链条的最后一环。这一进路使得《四元玉鉴》中的所有方法都具有问题驱动的特点。方法不能脱离问题而存在,每一道题都是一个独立的小世界。卷七"堆垛招差"部分尤其典型:朱世杰处理"三角垛"问题,即求 $$1 + 3 + 6 + 10 + \cdots + \frac{n(n+1)(n+2)}{6}$$ 的封闭公式;处理"茭草形"问题,即求 $1 + 2 + 4 + 8 + \cdots + 2^{n-1}$ 的和;处理"四角垛"问题,即把二维堆垛扩展到三维。这些问题都是离散组合问题,但朱世杰用多项式方法统一处理它们。这正是"把现实方程化"的极致形态。
牛顿从"无穷小分析"出发:他把多项式看作函数 $f(x)$ 的一种特例,关注的是函数的局部行为:零点、切线、极值。他的 Newton-Raphson 方法(1669 年成稿,1711 年公开)是一种迭代逼近法,通过切线方程 $$x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}$$ 逐步逼近根。这个方法的强大之处在于它把"求根"从"开方"这种封闭型操作,转变为"迭代"这种开放型操作。但也由此要求导数的概念,而导数本身依赖极限。这种思路在十七世纪末彻底改变了数学的面貌,但与朱世杰的程序传统几乎没有任何交集。牛顿并不知道《四元玉鉴》的存在,他的灵感来自流数(fluxion)和瞬(moment)的物理直觉。
莱布尼茨从"符号系统"出发:他的兴趣不在具体求某个方程的根,而在建立一套能够机械处理多项式关系的符号规则。他关于消去法的工作(十七世纪九十年代)实际上已经触摸到了行列式(determinant)的概念雏形,即通过一个组合矩阵判断方程组是否有解。莱布尼茨给惠更斯(Christiaan Huygens, 1629–1695)的信件中讨论了这种矩阵的构造,1693 年的信件尤为详细。莱布尼茨的进路是形式化的:他要把"消元"从一种需要技巧的工艺,转变为一种可以通过符号演算完成的过程。
把这三条进路画在同一张图上:
```mermaid flowchart LR A[现实问题] --> B[筹式列式] B --> C[剔消程序] C --> D[增乘开方] D --> E[数值解]
F[现实问题] --> G[建模多项式函数] G --> H[求导 f'] H --> I[Newton 迭代] I --> E
J[现实问题] --> K[符号化表示] K --> L[消去法] L --> M[行列式判别] M --> E ```
三个进路的起点相同,都从"现实问题"出发;但中段操作完全不同:朱世杰用位置化的算筹做消元,牛顿用导数做迭代,莱布尼茨用符号演算做形式化。最终三个进路汇聚在同一个终点:得到方程组的解。
这张图想说明的是:朱世杰、牛顿、莱布尼茨是三种不同的多项式哲学,不是"先进/落后"序列。朱世杰的方法在十七世纪的欧洲并不存在,因此欧洲数学家没有机会把它当作"前驱";它在二十世纪被重新发现时,又因为与计算机科学的兴起同步,反而显得格外"现代"。
进一步说,这三条进路各自擅长处理不同类型的问题。朱世杰的进路在离散组合问题(如堆垛、招差)上极具优势;牛顿的进路在连续函数(特别是物理问题)上具有不可替代性;莱布尼茨的进路在结构化判定(如方程组有无解、变量是否独立)上最为强大。今天的算法工程师,往往在面对实际问题时,需要在三条进路之间灵活切换。这正是重读《四元玉鉴》能提供的"算法史视角"的价值。
值得一提的还有,二十世纪数学家 Évariste Galois(1811–1832)的研究其实是对朱世杰和莱布尼茨两条进路的某种综合:他处理方程组可解性的判定(即莱布尼茨式的形式化进路),但判定的方法是"对称性"(一种结构性的消元思想,与朱世杰的"剔消"在哲学上相通)。Galois 理论的成立,标志着人类对多项式系统的掌控达到了新的高度,但这条路径的种子,早在十三世纪朱世杰的筹式盘上就已经萌芽。
四、读这本书,你究竟能带走什么
到这里,重读《四元玉鉴》的智识理由已经浮现了三条线索,我把它们叫做算法史、认知史、文化史的三层叠加。
第一条线,算法史。朱世杰的"剔消法"和"增乘开方法",与现代计算机代数系统中的结式计算和 Horner 求值在结构上同构。理解这一点,能让一个今天写数值算法的工程师看到:很多"显然"的内核操作,背后其实有几百年的算法演化史。这条线对应的是工程师式的回报。一个具体的小练习:把《四元玉鉴》卷一的一道二元问题用 Mathematica 写出来,再用朱世杰的剔消步骤手工推导一遍,比较两条路径的中间表达式,会发现朱世杰的中间表达式与现代结式计算的关键中间量高度相似。
第二条线,认知史。朱世杰代表的"把现实方程化"传统,是一种与欧洲"几何化"传统并立的认知路径。今天我们习惯把一切问题建模为微分方程、偏微分方程、积分方程,这背后其实是十七世纪以来的欧洲传统在主导。如果一个研究者只见过这一种建模路径,他可能会错过一些现实问题更适合"代数化"处理的情形。朱世杰的方法在某些离散系统、组合问题上的优势,至今仍未被充分利用。一个具体的例子:现代机器学习中的张量分解(tensor decomposition),在结构上更接近朱世杰的多变量多项式系统,而不是欧几里得的几何系统。张量分解中遇到的"秩判定"问题,与《四元玉鉴》中"方程组有无解"的判定是同构的,只是规模从几个变量扩展到了几十个、上百个变量。这条线对应的是研究者式的回报。
第三条线,文化史。中国数学在世界数学史上的位置,是一个经常被情绪化处理的议题。有人说"中国古代数学领先世界两千年",也有人说"中国古代没有数学,只有算术"。这两种说法都过于粗糙。重读《四元玉鉴》,可以让我们摆脱"领先/落后"的零和叙事,进入到一个更具体的问题:朱世杰的方法在哪些维度上与世界同期数学处于同一量级,又在哪些维度上发展出了独立的路径?回答这个问题,需要的不是民族情感,而是细致的算法分析与史料比对。一个具体的反思点:朱世杰的工作在他身后基本失传,直到十八世纪阮元(1764–1849)等人重新发现它,这本身就提示我们,文化的"领先"与"失传"往往同步发生,"领先"不是保险。这条线对应的是文化反思式的回报。
把这三条线合起来,《四元玉鉴》就不仅仅是一部技术文献,它是一次关于"如何把世界方程化"的认知实验,一次跨越七百年的算法对话,一次重新理解中国数学传统的入口。从这里开始,我们不再把《四元玉鉴》当作文物,而是当作一个仍然在呼吸的算法文本。
接下来的章节里,我们会按这条逻辑展开。先看朱世杰是谁,他的生平、游学、师承,以及这部书诞生的具体语境,这是第 2 章的内容。再看四元术的筹式表示,这套位置化的多项式编码如何与现代符号代数相互翻译,是第 3 章的内容。然后逐章拆解《四元玉鉴》各卷的核心方法,从勾股形到堆垛形,从招差术到方程组消元,分布在第 4 至第 10 章。最后讨论这部书的现代回响,它在二十世纪如何被重新发现,如何进入计算机科学的话语体系,分布在第 11 至第 14 章。第 15 章是全书的总结,也是一次面向未来的提问:当一个文明在十三世纪把多项式系统推到当时的世界顶峰,它在二十一世纪的算法世界里,还能提供什么独特的东西?
本章小结
《四元玉鉴》在算法工具充裕的今天值得重读,不是因为怀旧,而是因为它处理的问题、采用的方法、代表的认知路径,至今仍有现实意义。朱世杰在十三世纪末已经把多变量多项式系统的消元程序推到与同期世界数学同一量级;他所代表的"立式-消元-开方"三段式认知路径,与欧洲的"几何证明"路径并立,而不是它的"前驱";他的工作与秦九韶的"正负开方术"一起,构成了中华代数传统的核心遗产。重读这本书,能带走三层回报:算法史、认知史、文化史。
下一章我们要解决一个更基础的问题:这样一本技术含量极高的书,它的作者朱世杰,究竟是一个什么样的人?他的生平、他的游学、他的师承,能告诉我们这部书为何能在 1303 年的中国北方诞生。