☰
九章算术方程术:两千年前的矩阵消元与高斯消元法雏形
2026/10/2 14:49:49 网站建设 项目流程

“今有上禾三秉,中禾二秉,下禾一秉,实三十九斗;上禾二秉,中禾三秉,下禾一秉,实三十四斗;上禾一秉,中禾二秉,下禾三秉,实二十六斗。问上、中、下禾实一秉各几何?”

这是《九章算术》方程章的第一问。如果只看文字,可能觉得只是古代粮食算账,但如果把它翻译成现代数学语言,你会得到一组三元一次方程组。而《九章算术》里解这组方程的方法,本质上就是矩阵的初等行变换,也就是现在线性代数课本里高斯消元法的雏形。这篇博文我就带大家把“方程术”和“正负术”一步步拆开,看看两千年前的算筹是怎么完成这套运算的,也顺便聊聊为什么这套方法在世界数学史上这么重要。

文章适合真正对古代数学史、算法思想或者矩阵原理感兴趣的读者,不管你是理工科背景想回头看看“祖师爷”怎么想问题,还是文科生想搞清楚中国古代数学到底厉害在哪,都能从里面拿到干货。

1. “方程”这两个字,和今天课本里的方程不是一回事

1.1 先搞清楚概念,不然容易闹笑话

《九章算术》里说的“方程”,并不是现在中学课本里那个含有未知数的等式。现代数学里的方程,核心是“等号”两边数量相等的关系;而《九章算术》里的“方程”,指的是把一组数据按照某种规则排列成方阵。

“方”就是方形、方正,“程”就是课程、标准、计算过程。合起来,就是把条件和数据排列成一张方形数表,再按固定程序去算。换句话说,古人说的“方程”,更接近今天“矩阵”或者“线性方程组系数表”的概念。这一点特别关键,因为只有理解了“排成方阵”这个动作,才能明白直除法的操作逻辑。

1.2 方程章里藏着一个朴素的核心思想:多物混合计费

方程章一共18个问题,全部是一个套路:若干种东西混在一起,给出几次不同组合的总量,要求每种东西的单价。这放到现代生活里就是“鸡兔同笼”的高级版,但比鸡兔同笼复杂得多。鸡兔同笼只有两种动物、两个条件,方程章里经常是三种、四种、五种物品混合,条件也更多。

这种问题为什么会在汉代被大量研究?因为当时官府管理田赋、征收粮食、分配徭役,经常要面对这类“混合总量反推单项”的问题。一头牛加两只羊多少钱,两头牛加三只羊多少钱,不止一组条件,求牛羊各自的价钱。这种需求在今天的超市折扣、库存盘点、物流配比里也随处可见,本质上就是线性方程组的实际应用。

1.3 方程章的技术内核,一句话概括

把每一个条件写成一行数字,把不同物品的数量排成列,比如上禾、中禾、下禾各一列,最后加一列表示总量。这样整个题目就变成一张数字方阵。解题过程就是通过有规律的相减,一层一层消去某些列的数字,直到只剩下一个未知数,然后从下往上代回去,把每个未知数都算清楚。

这个过程在现代线性代数里的术语叫“消元”,也叫“高斯消元法”。很多人第一次学矩阵时觉得那是外国人发明的,实际上《九章算术》方程术干的就是这种事,而且比高斯早了大约一千八百年。

2. 直除术:古人消元的核心算法

2.1 “直除”两个字怎么理解

“直除”的“除”,在古文里是“减去”“移除”的意思,并不是现代数学里的除法。所谓“直除”,就是把另一行的若干倍直接减到当前行上,让某一列的系数变成零。用现代线性代数的语言说,就是对增广矩阵做行之间的线性组合,目标是把它化成阶梯形。

《九章算术》给出的操作规则是:选定一行作为基准(通常是第一列系数最大的那行),然后用其他行的首项系数去乘基准行,再用其他行减去乘出来的结果。这样其他行的第一列系数就会变成零。原理并不复杂:如果有两行,第一列分别是3和2,要让第二个的第一列变成0,就把第一行乘以2、第二行乘以3,两个数都变成6,然后相减就消掉了。这个思路和现代高斯消元的本质完全一致,只是古人在算筹板上操作,现代人在纸上和计算机里操作。

2.2 手把手演算第一题:从三元方程组到三角形数阵

我们用第一题做个完整推演,体会一下古人是怎么算的。

题目还原成方程组是:

  • 3上禾 + 2中禾 + 1下禾 = 39
  • 2上禾 + 3中禾 + 1下禾 = 34
  • 1上禾 + 2中禾 + 3下禾 = 26

排成的数阵就是:

3 2 1 39 2 3 1 34 1 2 3 26

古人习惯把每一行从右往左排,最左边一列是总数,这里为了读者理解方便,我按照现代习惯从左往右排列。

第一步,消掉第二行的首项“2”和第三行的首项“1”。

消第二行:第一行乘以2,得“6 4 2 78”;第二行乘以3,得“6 9 3 102”。用第二行变换后的结果减去第一行变换后的结果,得到“0 5 1 24”。

消第三行:第一行乘以1,还是“3 2 1 39”;第三行乘以3,得“3 6 9 78”。用第三行变换后的结果减去第一行变换后的结果,得到“0 4 8 39”。

于是数阵变成:

3 2 1 39 0 5 1 24 0 4 8 39

第二步,消第三行的首项“4”。第二行乘以4,得“0 20 4 96”;第三行乘以5,得“0 20 40 195”。用第三行变换后的结果减去第二行变换后的结果,得到“0 0 36 99”。

数阵变成:

3 2 1 39 0 5 1 24 0 0 36 99

到这一步,第三行表示的是一个非常干净的等式:36份下禾的总量是99斗,那么1份下禾就是 99÷36 = 11/4,也就是2又3/4斗。

第三步,回代。第二行是“5中禾 + 1下禾 = 24”,把下禾 11/4 代进去:

5中禾 = 24 - 11/4 = 85/4,中禾 = 17/4 = 4又1/4斗。

第一行是“3上禾 + 2中禾 + 1下禾 = 39”,把中禾 17/4、下禾 11/4 代进去:

3上禾 + 34/4 + 11/4 = 39,3上禾 = 111/4,上禾 = 37/4 = 9又1/4斗。

答案就是:上禾每秉9又1/4斗,中禾每秉4又1/4斗,下禾每秉2又3/4斗。

整道题的思路走下来,和现代矩阵消元完全就是一个模子。古人用算筹在板上摆来摆去,摆的其实就是今天的矩阵行变换。

2.3 为什么这种变换总是可靠:核心是“等量替换”

很多人学消元法时会疑惑:我凭什么能在等式两边同时乘一个数、同时减去另一个等式?万一算错了怎么办?

这个可靠性建立在“等量替换”原则上。假设有两个等式同时成立:

A = B C = D

那么自然有:A - kC = B - kD。也就是说,一个等式两边同时减去另一个等式的倍数,等号关系依然成立。这是方程术最底层的逻辑,也是所有消元法能够成立的根本原因。

《九章算术》没有明确写这条公理,但直除法的每一步操作都默认了这个原则。更难得的是,古人操作的对象不是抽象的字母,而是算筹板上具体的数字排列。他们用“两行相减”的方式,把这种复杂的等价变换变成了一套机械、稳定、可重复执行的程序。这种程序化思维,恰恰是算法思想的精髓。

注意:直除法消元时,基准行的选择会影响计算量。古代没有“选主元”的概念,一律用第一列最大系数那行做基准。这在编程实现里可能导致数值不稳定,但对算筹手算来说,反而把流程固定下来,不容易出错。

3. 正负术:没有负数符号,方程照样算得下去

3.1 负数的出现:算筹板上的红黑两色

方程术能运转起来,有一个关键前提:减法过程中会减出负数。比如某一步可能得到“-2上禾 + 0中禾 + 5下禾 = 10”。如果处理不了负数,消元流程就会卡壳。于是《九章算术》专门在方程章之后讲了“正负术”,这是中国数学史上关于负数的系统规定。

正负术的规则以古代算筹为载体:用红色算筹表示正数,用黑色算筹表示负数,称为“正算赤,负算黑”;也可以把算筹斜放区分正负。这就是最早的正负号表示法。今天数学课上的负号,在两千年前的中国是一根黑色的算筹。

3.2 正负术的完整运算法则

《九章算术》用极为凝练的文字记录了一套正负数加减法则,翻译成现代语言大致如下:

同名相除:同号相减,绝对值相减,符号不变。

异名相益:异号相减,绝对值相加,符号跟随被减数。

正无人负之,负无人正之:正数减零仍为正,零减正数得负数。反过来也一样。

其异名相除:异号相加,绝对值相减,符号跟随绝对值大的一方。

同名相益:同号相加,绝对值相加,符号不变。

正无人正之,负无人负之:正数加零仍为正,零加负数仍为负。

这些规则放到今天的初中课本里,就是“同号相加取相同符号、异号相加取绝对值较大者的符号”那一套。但在当时,这是全世界最早的负数运算系统,它给方程术提供了完整的运算基础。没有正负术,直除法解到一半就可能因为负系数而被迫中断,方程术的通用性会大打折扣。

3.3 正负术里藏着“移项”的影子

值得一提的是,正负术已经隐约包含了“移项”的概念。方程里的某一项要从等式一边移到另一边,其实就是利用“等式两边同时加上或减去同一个量”的性质。古人虽然没有把它抽象成一个独立规则,但在直除法的实际操作中,负数不断被加来减去,本质上就是在做移项变形。

这也解释了为什么方程章在古代数学里地位很高:直线性的代数运算,包括加减、乘倍数、负数处理,全在这两章里成了一个闭环体系。

实操心得:如果在算筹板上做正负运算,最容易出错的是“红色算筹减去黑色算筹”这种异号相消的环节。古人实际操作时并不会一个个数“几正几负”,而是直接利用“正负相抵”的物理特性:红黑筹码一一配对,剩下多的那种就是结果。这个手法看着原始,效率却极高,也直观体现了正负数互为相反数的几何意义。

4. 从算筹到矩阵:方程的“排版美学”

4.1 算筹板上的系数排列规则

《九章算术》时代没有纸张普及,数学运算主要借助算筹。算筹是一根根小竹棍,摆在专用的算板上,通过不同的位置和方向表示数字。方程术在算筹板上的布局是这样的:每一行摆一个等式,物品的种类一列一列摆开,最右侧一列是常数项。

为什么要把常数项放在最右边?因为古代文字从右往左书写,整个数阵也顺着这个习惯。这和我们今天矩阵的习惯恰好相反,但本质上没有任何区别。

关键操作来了:直除法在算筹板上表现为“把第一行整体乘以一个数,然后与第二行逐位相减”。算筹是物理的,所以这个过程需要动手操作:先复制出一行放旁边,乘以倍数,再一对一地抵减。这其实是把矩阵的行变换变成了一套身体记忆式的操作流程,有点像现在程序员在表格软件里用公式拖动一样,熟练之后可以做到不出错、不漏步。

4.2 与高斯消元法、现代矩阵理论的直接对照

我在大学第一次学高斯消元法时,教授在黑板上写了增广矩阵,然后一行一行做初等行变换。当时我脑子里一下子闪过《九章算术》的直除术,这两者在操作层面简直是一对双胞胎。

差别主要在两点。

第一,主元选择策略。高斯消元法的某些变体(如部分主元法)为了提高数值稳定性,会优先选绝对值最大的元素作主元。《九章算术》的直除法没有这一步,直接取第一列首项做基准。对古代的手算和整数运算来说,路径固定反而更稳妥。

第二,表达方式。高斯消元法用现代符号写,直观但抽象;算筹板用实物排列,具象但笨重。两种方式背后都是同一套线性代数性质:行之间的线性组合不改变方程组的解。

所以,如果说莱布尼茨、高斯等人是线性代数成熟的推动者,那么《九章算术》就是最早的系统实践者。古代数学家们在没有矩阵概念、没有代数符号的情况下,硬是靠着算筹和口诀,完成了一套通用线性方程组求解算法。

4.3 一个更惊艳的细节:增广矩阵意识

现代解线性方程组时,要把系数矩阵和常数向量合并成增广矩阵,写成 [A|b]。《九章算术》里每个方程一行,常数放在最右列,就是一份不折不扣的增广矩阵。这说明古人虽然没有“矩阵”这个词,但已经直觉式地理解了“把未知数系数与常数项放在一起整体操作”的数学实质。

这种整体操作意识非常关键,因为如果只单独操作系数而忽略常数,答案肯定不对;但如果两者混在一起同步变换,每一步都能保持等价性。《九章算术》从第一问就默认了这个设定,说明这套算法不是偶然的一时灵感,而是经过反复检验的成熟方法。

5. 方程章里的应用题,映射的是汉代官府的真实算账场景

5.1 禾、黍、米背后是粮食与税收管理

方程章里的“禾”指粟、稻等粮食作物,“实”指粮食的实际数量。题目反复出现上、中、下三等禾,这对应当时的粮食等级。为什么要算不同等级粮食混在一起的总量?因为农民交税时往往用不同等级粮食搭配,官府需要折算成标准单位入账。这就必须解多元一次方程组。

还有一道题和“黍”“米”“饭”有关,涉及不同粮食加工比例换算。这类问题在现代就是原材料与产成品的转化系数问题,在古代则是粮仓管理和赋税征收的刚需。可以说,方程术在当时就是官府“数据库算法”,负责把一堆混合数据还原成单项数据。

5.2 从实用算术到纯粹算法思维

一个值得注意的点是,方程章虽然题目都是实际应用题,但解法却已经超越了具体问题。它不是针对“上禾中禾下禾”的特殊技巧,而是一个通用程序:任何多元线性方程组,都能通过同一套直除流程求解。

这就是算法思维的萌芽。古希腊数学强调几何推理和公式推演,中国古代数学则更重视给出“可操作的解题程序”。这两种路径各有优势,但就线性方程组求解这件事来看,《九章算术》的方程术是程序化思路的极致代表。

后来刘徽为《九章算术》作注时,对方程术的正确性给予了高度评价,还进一步解释了为什么直除法能保持解的等价性。这说明至少在魏晋时期,中国数学家已经对这种算法有了相当深刻的理论反思,不只是停留在“这么做能算出答案”的经验层面。

6. 方程术的遗产:从东方算板到现代课堂

6.1 一部影响了世界数学进程的古代文本

《九章算术》成书年代大约在公元一世纪前后,但内容的来源可以追溯到更早。方程章里的直除法,是目前已知世界上最早的系统线性方程组解法。在西方,直到十世纪左右,阿拉伯数学家才开始讨论类似的消元技巧;而高斯提出完整的消元法则已经是十九世纪初的事。

这并不是说中国古代数学领先世界多少年这么简单,而是说,在人类处理多元数量关系的历史上,中国古人率先找到了一条通用路。这条路后来沿着丝绸之路往西传播,和阿拉伯、欧洲的数学传统交汇,才慢慢演变成现代线性代数的基石。

6.2 今天你学的线性代数,其实离《九章算术》不远

有一个很直观的观察角度:你学矩阵、行列式和消元法时,感觉抽象难懂,是因为这些概念被塞进了一套符号化体系里。可如果你回到算筹板上,把每行当成一个个筹码,矩阵乘法就是反复的“行乘加”,消元就是反复的“行相减”,一下就接地气多了。

我教别人线性代数时,经常拿《九章算术》的直除法做引子。先让学生用算筹思维解一个三元方程组,再让他们抽象成矩阵记号,很多人都觉得“原来是这么回事”。这其实也说明了一个道理:数学概念再抽象,背后都有一层能用手比划、用眼观察的具体模型。《九章算术》提供的正是这个模型。

6.3 方阵思维的现实延伸

方程术的“方阵”思维并不只活在古代。今天的电子表格、数据库表、图像矩阵、神经网络参数运算,本质上都在处理“数字方阵”的结构。理解《九章算术》里的方程术,不只是在读古书,而是在看一种思维模式的源头:把复杂问题组织成行列结构,再用固定操作流程消元求解。

尤其在现代工程计算里,面对几十万甚至上百万个变量的大型线性方程组,算法依然是从“消元”这一条旧路出发,只不过把人类的算筹换成了计算机的浮点运算。这个思想没有变过。

注意:如果要在现代环境中复现《九章算术》的直除法,直接用循环做初等行变换即可,不需要任何花哨工具。但有一点必须警惕:整数运算时代不会出现精度问题,而一旦换成浮点数,消元顺序会影响误差大小。这也是为什么现代数值线性代数里,主元选择和矩阵预处理会成为一门大学问。

7. 一些思考:为什么中国古代数学的“算法基因”常被低估

我经常看到一种说法,认为中国古代数学只有“应用题技巧”,缺乏“理论体系”。这句话一半对一半不对。就《九章算术》而言,它的确不像欧几里得《几何原本》那样有公理化演绎框架,但它拥有的是一种完全不同的理论形态:算法理论。这种理论的载体不是定理和证明,而是“算则”——一套确保正确、可反复执行的运算规则。

更难得的是,方程术已经具备了“复杂度意识”的雏形。古人知道,直除法每消去一列,需要做的乘减运算次数是随未知数个数增长的。虽然他们没有明确写出“计算复杂度”这个概念,但从问题编排和运算组织来看,他们已经本能地在追求更高效、更简洁的消元路径。到了刘徽时代,他甚至改进了某些多变量题目的计算顺序,以减少运算量。

所以,看待《九章算术》方程术,我个人的体会是:它不是一段被淘汰的古代算技,而是一条值得回味的算法思想源头。今天写代码解决线性方程组时,各种库函数调用起来毫不费力,但如果我们能回头看看算筹板上那根根竹棍是怎么一步步消元的,会对“算法”这件事多一层敬畏,也多一层理解。

下次遇到一个复杂的方程组,不妨在草稿纸上试一次“直除法”的原始操作。你会发现,两千年前的人,已经把你正在做的事情做得极好。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询