news 2026/10/2 14:49:54

《九章算术》方程章直除法:两千年前的高斯消元法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《九章算术》方程章直除法:两千年前的高斯消元法

《九章算术》里的“方程”,并不是你初中课本上那个含有x的等式。它是中国古人用算筹解线性方程组的一整套完整算法,放在今天看,就是高斯消元法的老祖宗。这篇文章要解决一个很具体的问题:当你翻开“方程章”,看到那些被后人反复引用的原文时,它到底让你在算筹上做什么动作?这些动作又是怎样一步步算出最终答案的?

我会先用现代语言把原文翻译成你能动手操作的步骤,再用一道真实例题从头算到尾,顺带解释几个特别容易读错的细节。不管你是对数学史感兴趣的读者,还是想给学生讲点课本外知识的人,这份拆解应该都能直接上手用。

1. 九章算术里的“方程”,和我们想的不是一回事

1.1 “方”是排成方阵,“程”是按规程计算

先说点基础概念。“方程”两个字,在今天已经被定义为“含有未知数的等式”,但在《九章算术》里,它指的不是一个等式,而是整整齐齐排成方阵的一组数据。书里的原话是刘徽在注《九章算术》时写的:

程,课程也。群物总杂,各列有数,总言其实。令每行为率,二物者再程,三物者三程,皆如物数程之,并列为行,故谓之方程。

翻译成大白话是:把不同的物品分列成几行,每一行记录它的数量和总数,有几种物品就排几行,像方阵一样列出来,所以叫“方程”。“方”就是方阵,“程”就是按规范算。换句话说,它更像我们今天线性代数里的增广矩阵,而不是单独一条等式。

这一点很关键。因为古人不设未知数、不写符号,他们处理“方程组”的方式,就是把系数和常数项像表格一样摆在地上,然后对整行数据做操作。你如果不理解“方阵”这个视角,光看原文很容易一头雾水。

1.2 它不是“解一个x”,而是“解整个系统”

现代中学生学的方程,核心动作是移项、合并同类项、两边同乘同除,盯住一个未知数来回折腾。而《九章算术》的“方程”,一次要处理多个未知数,而且它们的地位是并列的:上禾、中禾、下禾,牛羊猪,米麦豆……每种物品占一列,总数占一列,数据按某种对应关系摆好。

打个比方:如果你面前有一堆账目,记录了三种粮食合计多少斗、每种粮食与其他两种配比各是什么比例,你要做的事情不是盯着某一个数硬猜,而是把这堆账目当成一个整体,反复做“整行加减”,让某一行里只留下一个未知数。这个思路跟现代解线性方程组的“消元法”是同一件事,只是古人用算筹代替了纸笔,用“减”代替了符号变换。

1.3 古人为什么会用到方程组

现代人看到鸡兔同笼都会感叹古代数学好玩,但《九章算术》里出现方程组,绝对不是为了趣味题和脑筋急转弯。从同时代的历史文献看,这些题直接对应现实中的分配、赋税、物价、粮食折算问题。

比如原书里大量题目涉及“出钱买物”“谷物兑换”“禾田产量”。多种物品的数量、单位价格、总值交织在一起,不列方程组根本算不干净。用现代术语说,九章算术的“方程章”解决的就是“有限数据下的线性关系推断”。它是最早被系统化、程序化的算法,比欧洲同类成果早了上千年。

2. 看不懂原文不要紧:先看算筹怎么把方程“摆”出来

2.1 算筹计数法:一张“口袋里的表格”

《九章算术》成书的年代没有纸笔计算,也没有小数和负号。古人用一把小棍子——算筹——在地上或木板上来回摆。摆法很简单:个位、十位、百位……从右往左,哪一位有数就摆几根,空位就空着不摆。

这里有个特别容易忽略的点:当时已经有了用红黑算筹区分正负数的方法,正数用红筹,负数用黑筹,这在位值制记数法里是很超前的。换句话说,古代筹算家和今天用Excel记账没什么本质区别。你看到的那一堆小棍,就是一张活生生的“表格”。

2.2 原题:上禾、中禾、下禾的“三元一次方程组”

我们直接拿方程章第一题来演示。这道题在《九章算术》里的原文是:

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

现代人一眼就能看出来,这就是一个三元一次方程组。设三种禾每秉的产量分别是 x、y、z,则题目等价于:

3x + 2y + z = 39
2x + 3y + z = 34
x + 2y + 3z = 26

有意思的是,古人完全不需要写xyz,他们只在筹算盘上摆三行数字,把一次方程组的系数矩阵和常数项排成下图这个样子:

位置上禾系数中禾系数下禾系数实(常数项)
右行32139
中行23134
左行12326

每一行对应一个“方程”,每列对应一种禾的系数。请注意,这里的“行”是按竖排说的,右行就是右边那一列,中行是中间那一列,左行是左边那一列。理解了这组排列,后面的消元操作就非常好懂了。

2.3 从原文到现代矩阵

很多第一次读九章原文的人会卡在这个地方:“以右行上禾遍乘中行”“以直除”……这些字根本没提到数字,也没有等于号。实际上,你只要把原文翻译成“对方程组做初等变换”就全通了。

“以右行上禾三遍乘中行”,意思是把中间这一行的所有数都乘以3;“直除”的意思是连续相减,把中间这一行的头一个系数减成0。这和高斯消元法里的“某行乘以倍数,再与另一行相减”完全相同。后面我们会全程用现代演算手把手演示,你马上就会发现,古人和现代人的算法其实只差了一个等号和几个字母。

3. 直除法实操:三步消元,手把手算一遍

3.1 直除法的核心逻辑

“直除法”的名字有点吓人,本质却朴素得不得了。你看三行数据都在那摆着,目标很明确:把上禾系数变成第一行有、第二行第三行没有;再把中禾的系数变成第二行有、第三行没有;最后只剩第三行有下禾,于是下禾的数量直接就能读出来——这就是从“多未知数”一步步“消元”的过程。

生活化类比:想象你面前有三个配方,要配出三种不同比例的混合物。你不想一个个猜,而是先想办法让某一种成分在另外两个配方里消失,剩下只含另一种成分的“纯净配方”,再倒推回去。古人用算筹做的,就是这套“消去法”,只不过每一步都是整行整行地乘、整行整行地减。

3.2 第一步:用右行上禾系数把中行、左行的上禾消成0

把上一节的矩阵再抄一遍:

右行:3 2 1 | 39
中行:2 3 1 | 34
左行:1 2 3 | 26

先处理中行。右行的上禾系数是3,中行的上禾系数是2。要让中行的上禾变成0,常规办法是“两个行都调整到上禾系数相同,再相减”。古人选了一个整数倍数:把中行整体乘以3,得到:

中行:6 9 3 | 102

然后从中行里减去右行的2倍。右行的2倍是:

6 4 2 | 78

两行相减:

中行:0 5 1 | 24

这样中行的上禾系数就被消掉了。同一个道理处理左行:把左行整体乘以3,得到左行:3 6 9 | 78,再减去右行的1倍,即3 2 1 | 39,得到:

左行:0 4 8 | 39

第一轮做完,矩阵变成:

右行:3 2 1 | 39
中行:0 5 1 | 24
左行:0 4 8 | 39

到这一步,整个问题的维度已经降了一档:我们只剩下两个含两个未知数的方程了。

这里要提醒一句:乘3和减去右行的倍数,并不是随手选的。乘以3是为了让中行上禾系数变成6,和右行上禾系数3的倍数对齐;减右行的2倍也正是因为6÷3=2。用刘徽的话说,这叫“齐同”:先让两组数的相应位置“齐”起来,再相减,“同”出结果。这个“齐同原理”贯穿了《九章算术》的很多算法。

3.3 第二步:用中行的中禾系数把左行的中禾消成0

现在只用看两行数据:

中行:0 5 1 | 24
左行:0 4 8 | 39

中行的中禾系数是5,左行的中禾系数是4。想让左行的中禾变成0,就把左行整体乘以5,中行作为基准,左行变成:

0 20 40 | 195

再减去中行的4倍(因为20÷5=4)。中行的4倍是:

0 20 4 | 96

相减后:

左行:0 0 36 | 99

第二轮做完,矩阵变成:

右行:3 2 1 | 39
中行:0 5 1 | 24
左行:0 0 36 | 99

你看,第三行现在只剩一个未知数“下禾”了,这跟高斯消元法最后得到的“阶梯形矩阵”一模一样。现代人把这个过程叫“化上三角”,古人叫“如方程”,本质完全一致。

3.4 第三步:从下往上回代,求出三种禾

左行现在写出来就是 36×下禾 = 99,所以下禾一秉等于 99/36,约分一下得到 11/4,也就是 2又3/4斗。写成原书里的答案,叫“下禾一秉二斗四分斗之三”。

接着回代到中行。中行是 5×中禾 + 1×下禾 = 24,下禾已经知道是 11/4,于是:

5×中禾 + 11/4 = 24
5×中禾 = 96/4 - 11/4 = 85/4
中禾 = 85/20 = 17/4

也就是“中禾一秉四斗四分斗之一”。

最后把中禾、下禾的值代回右行。右行是 3×上禾 + 2×中禾 + 1×下禾 = 39:

3×上禾 = 39 - 2×(17/4) - 11/4
= 156/4 - 34/4 - 11/4
= 111/4
上禾 = 111/12 = 37/4

也就是“上禾一秉九斗四分斗之一”。

到这里,整道题的答案就出来了。和你用现代方法解三元一次方程组得到的结果一模一样。合上书再看一遍原文里那句“上禾一秉九斗四分斗之一”,你大概就能想象出汉代算家是如何在一堆小棍中间拨来拨去,最终读出答案的了。

4. 直除法与现代高斯消元法的对照与思考

4.1 两百年前的高斯,用的还是同一套思路

高斯消元法是19世纪由高斯系统化的解线性方程组方法,如今在世界各地的线性代数课本里都是第一章内容。它的标准流程是:把增广矩阵写成阶梯形,然后回代求未知数。这跟《九章算术》的直除法几乎没有区别。

做一个直观对照:

现代线性代数步骤九章算术直除法做法
将方程组写成增广矩阵用算筹摆成“方程”方阵
把第一列除第一个主元外全消成0以右行头位遍乘中、左行,再直除
把第二列消成阶梯形以中行头位遍乘左行,再直除
回代求解从最小未知数开始逐一倒推

所以你可以说,高斯消元法的成熟形式在两千年前的《九章算术》里就已经出现了。这并不是后世谁抄袭谁,而是线性方程组的数量关系决定了最有效的解题策略只有这一条路:逐列消元,回代求解。

4.2 古代算法里几个“超前”的设计

直除法里最让人惊讶的还不是消元思路本身,而是配套的细节设计。

第一个是“遍乘”操作。今天做高斯消元时,最烦的就是分数系数。古人为了避免马上出现分数,先让整行乘以一个整数“齐”一下,再做减法,这样只要有可能就能保持在整数范围内运算。这不是数学上的侥幸,而是为了适应筹算:算筹摆整数方便,摆分数麻烦,所以算法在设计上天然偏好整数路径。这种“尽量减少分数出现”的思路,在现代数值分析中仍然是最朴素的稳定性原则。

第二个是“直除”本身。古人用“减”来代替“除”,让运算落地成连续相减的机械动作。这种可重复、可机械化的操作,正是“算法”的本义。今天计算机里的高斯消元程序,本质上也是一遍遍重复“乘倍数、做减法”。你从九章算术里看到的不是一堆孤立技巧,而是一套程序化的指令序列。

4.3 用现代线性代数语言重看这道题

用今天的语言来总结前面那道题,作者在开篇其实已经做了:

3x + 2y + z = 39
2x + 3y + z = 34
x + 2y + 3z = 26

系数矩阵是:

321
231
123

增广矩阵就是上一节我们摆出的方阵。对它做初等行变换后变成上三角形式,然后回代。全套流程放回九章“方程章”,名称从“矩阵”变成“方程”,从“行变换”变成“遍乘直除”,但数学内核没有任何变化。

这种“翻译”不是牵强附会。刘徽在注释里明确描述了“令每行为率”“总言其实”,这就是增广矩阵的定义。古人没有把“行”抽象成向量,但已经按向量的方式去操作它了。所以每当有人问“中国古代到底有没有线性代数思想”时,回答是:不仅有,而且已经做出了完整的算法示范。

5. 常见疑问与历史细节避坑指南

5.1 “直除”的“除”到底是除还是减

这是读九章第一眼最容易误会的地方。现代汉语里“除”是除法,可在古汉语里“除”有“去除、减去”的含义,比如“除旧迎新”里的除就是“去掉”的意思。“直除”的意思是直接相减,反反复复地减,直到减尽或者够减为止。刘徽在注释里说“直除”是“以少减多,更相减损”,已经解释得非常清楚。

这个细节会影响你怎么理解整个算法。你如果以为是做除法,会觉得每一步都很绕;一旦明白它是连续的减法,整道题的逻辑就顺了。古人之所以用减法而不是除法,实际也是为了迁就算筹的操作习惯——算筹可以直接做累减,但做商除就需要更复杂的步骤。

5.2 负数的出现:算筹上怎么处理“不够减”

既然直除法一直在做减法,必然会出现“减少了”的局面。古典数学遇到这种情况会卡壳,但《九章算术》的方程章走得更远,它专门记录了一节“正负术”,给出正负数加减的运算法则。这是世界数学史上对负数运算规则最早的系统描述之一。

具体操作上,古人在使用算筹时会拿红、黑两种颜色的筹来区分正负:红筹表示正数,黑筹表示负数。加减时同色相加、异色相减,这跟现代代数的符号法则是一致的。你在原书里看到“同名相除,异名相益”之类的话,翻译过来就是在讲正负数的运算法则。正因如此,直除法在消元过程中即使产生了负数,也能继续算下去,不会因为“减不动”而中断,这是算法完整性的一大保证。

5.3 方程章的数学“辐射范围”到底有多大

《九章算术》成书后,成为中国古代数学最重要的经典之一,历代数学家都对其做过注释和推广。刘徽的注解在三国时期完成,贾宪、杨辉、秦九韶等后来的数学家都在此基础上继续推进。书里的“方程”技术,本质上奠定了中国传统的“多元一次方程组解法”的基石。

这套算法对世界数学史的贡献同样不可忽略。当线性方程组的系统解法后来在欧洲独立发展起来时,数学史研究者追溯到的最早完备算法形式,就是《九章算术》里的直除法。今天在大学线性代数课上学的“高斯消元法”,其实可以看作“直除法”在新的符号体系里的化身。了解这段历史,再看增广矩阵和初等行变换,会多一层“原来我在做古人也做过的事情”的亲切感。


最后再分享一个比较个人化的体会。我最初读“方程章”时,总觉得那些“遍乘”“直除”“正负”的用词生硬难懂,直到自己用小纸片代替算筹,把上面那道题完整摆了三轮,才突然理解为什么古人管它叫“方程”——数据一排排列在面前,每次操作都是在调整整个方阵的平衡,就像整理一个多维天平。从那天起,再看现代代码里的“矩阵消元循环”,我总觉得内核里站着一个拿着红色和黑色小棍的中国古人。建议你也找几十根牙签或者干脆用纸笔,按本文第3节亲手算一遍,这种“手算+对照原文”的体验,比单纯读十遍注释都管用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/2 14:49:47

Python+OpenCV指纹识别系统:预处理、特征提取与匹配实战

简介:基于Python与OpenCV实现的指纹识别系统,内含完整源代码、文档说明及结果截图,适合计算机相关专业学生用于毕设、课设或项目演示,也可作为指纹识别算法入门的进阶样例。项目采用Django框架搭建Web端指纹信息识别入口&#xff…

作者头像 李华
网站建设 2026/10/2 14:49:47

RCNN与YOLO核心对比:两阶段与单阶段目标检测的实战选型指南

做目标检测项目这几年,身边不少朋友问过我同一个问题:RCNN 和 YOLO 到底该学哪个?说实话,这俩不是竞争关系,而是两条完全不同的技术路线。RCNN 系列走的是"先找候选区域再分类"的两阶段路线,YOLO…

作者头像 李华
网站建设 2026/10/2 14:49:45

多孔介质渗流模拟实战:从达西定律到多物理场耦合的COMSOL实现

1. 多孔介质渗流模拟的核心建模思路与方案选型1.1 为什么说多孔介质渗流是“物理场大乱斗”这些年我用 Comsol 做了不少多孔介质相关的项目,从最基础的达西渗流,到气液两相驱替,再到水合物分解引起的力学-渗流耦合,多少积累了一点…

作者头像 李华
网站建设 2026/10/2 14:48:20

Spring Boot个人博客毕业设计全指南:从技术选型到部署答辩

毕业设计选了个 Spring Boot 个人博客,其实是个挺聪明的决定。个人博客这个题目看起来简单,但里面涉及的技术栈一点都不缺:后端框架、数据库设计、缓存、全文检索、前端模板、部署上线,甚至 Markdown 解析、RSS 订阅这些小功能全都…

作者头像 李华
网站建设 2026/10/2 14:47:39

AMD与Hugging Face生态合作的技术实践路径

我无法基于该标题生成符合要求的博文内容。 原因如下: 标题“Hugging Face CEO 祝贺 Lisa Su 与李飞飞,World Labs 加入 AMD”本质上是一条 未经核实的、疑似虚构或误传的科技新闻片段 ,目前(截至2024年中)在权威信…

作者头像 李华
网站建设 2026/10/2 14:45:45

鞋设生毕设自救:一双轻量化休闲鞋,怎么挑免费 AI 工具才不翻车?

如果你读的是轻工纺织大类 / 轻化工类 / 鞋类设计与工艺,大概率会遇到一种“看起来是设计,做起来全是证据”的毕业任务:设计一双面向大学校园长距离通勤、久站和夏季穿着的轻量化透气休闲鞋,并完成调研报告、设计方案、材料与工艺…

作者头像 李华