资讯详情

资讯详情

九章算术少广章:从分数通分到开方算法的古算智慧

1. 少广章到底在解决什么问题1.1 从“广”和“少”两个字说起第一次翻开《九章算术》第四卷很多人都会被“少广”这两个字骗到。“广”在古代数学里是“宽”的意思所以乍一看“少广”很容易被误会成一块比较窄的田或者某种缩短宽度的方法。真正读进去才发现这一卷做的是更抽象、也更有意思的事情它不直接算面积、体积而是反过来从已知的总量往回推把边长找出来。也就是说“少广”的重点不是“少”也不是“广”而是那个“反过来”的思维。放到今天的语境里它就是一个典型的“逆运算”篇章。你面对的不是“长乘宽等于多少”而是“面积知道边长是多少”不是“底面乘高等于多少体积”而是“体积知道正方体的棱是什么”。前者一乘就有结果后者就需要一套能逐步逼近答案的算法也就是开平方和开立方。这个定位在整本书里非常关键但初读时不容易看出来。很多人把它当成一堆复杂的分数题目或者只是机械地记住“某数开方等于某数”结果错过了其中最核心的算法思想。“少广”真正的价值是它把“逐位试商、层层剥余数”的思维方式完整展现了出来这套思路几乎就是后来程序语言里循环结构的雏形。1.2 在全书中的位置与知识衔接《九章算术》按内容分成九个专题前三章分别是田地面积计算、粮食交换比例、按比例分配解决的是相对直接的乘除法。到第四章“少广”突然从一个新的维度压过来前面给你确定的长宽高这里只给你一个结果让你自己还原过程。再往后几章比如工程土方、赋税运输、盈亏问题又会用到开方和比例推理。所以第四章像是整套知识链条里的一个“转向机构”如果没有它后面的立体体积计算就少了一把钥匙。从知识衔接看这一章至少承担了三件事。第一把数域从整数扩充到分数而且不是简单“认识”分数而是能用通分、约分做实质运算。第二把乘法结果逆向拆解形成真正意义上的“开方术”。第三为后续的体积、比例问题提供工具。以今天的课程类比前面的“方田”像算术入门第四章则接近“代数方法”的雏形因为它关心的是未知数的求解过程。理解这个位置再看章名就有意思了所谓“少广”字面意思是把广从宽变小实际含义更接近“由面缩回到边”。一个矩形有广有纵已知广和面积时求纵是除法已知全部面积而要求某一边就要从“广”里反推。更复杂的版本是边长不是整数可能是一步半、三分之一步于是必须先处理分数再决定开方怎么继续。这种将形状、数值、运算三者缠在一起的问题结构正是“少广”章读起来比前几章费劲但收获也更大的原因。2. 分数计算少广章的“基本功”2.1 古人对分数的记录方法现代人写分数脑子里有清晰的分子、分母和分数线。古人不是这么记的他们用算筹摆数用文字描述数量关系。看到一个分数第一反应不是“这是几分之几”而是“这个数是由多少份组成的整体又被分成了多少份”。这种表达方式今天看似笨拙其实很符合运算逻辑。比如“三分之一”古人会理解为“把一个单位平均分成三份后取其中一份”“三分之二”则是“取其中两份”。于是两个分数相加本质上就是两堆不同大小的“份”合并到一起。问题是两堆份的“单位大小”不一样二分之一的一份和三分之一的一份粗细完全不同。要把它们加在一起就必须先让它们每一份一样大。这就引出了“少广”章里非常重要的处理手法通分。古人虽然在文字上绕来绕去但做法和今天的通分几乎一致找出一个能被所有分母整除的数把每个分数都改写成“以这个共同单位为基础”的等价形式。用算筹操作时他们会把各个分母列成一排再通过相乘或约分来寻找共同的标准。这个过程看起来很繁琐却非常程序化每一步都可以检查。真正难的地方还不在于“算”而在于“理解为什么”。很多人直接背下了通分规则却不知道分母扩大几倍、分子就要跟着扩大几倍。这里的原理并不复杂你改变了整体被切成的份数每一份变小了为了保证数量不变就必须多拿几份。古人虽然不画饼图但他们的算筹操作天然体现了这一点分母变了分子同步变整个量的逻辑关系才保持稳定。2.2 更相减损、齐同与通分读“少广”不得不提两个词一个叫“更相减损”一个叫“齐同”。它们听起来像文言文考点实际上是两个极其现代的操作约分和统一比例。“更相减损”解决的问题是约分。两个数有公共因子时分数可以变小。古人用“以少减多更相减损求其等也”来描写这个过程。不妨直接看数字要化简 12/18先看 18 和 12大的减小的18 减 12 得 6再用 12 减 6得 6减到两个数相等这个相等的数就是最大公约数。 12 和 18 约到相等得到 6于是 12/18 上下同除以 6化简为 2/3。你可能会觉得这比现代分解质因数还麻烦但它有一个巨大的好处不需要事先会分解质因数只需要反复做减法就能自动得到结果。这个方法后来被各种数学传统反复使用本质上就是辗转相除法。在算筹时代它不需要写在纸上只要反复拿掉较少数量的筹就能得到最终答案非常容易机械执行。“齐同”则处理加法中的比例一致性。比如要算二分之一加三分之一古人不会直接写一个分母 6 然后去套而是把“齐同”拆成两层意思“同”是让分母相同“齐”是让分子跟上分母变化的幅度。分母从 2 变成 6相当于每一份被切得更小原来的一份现在是三小份所以 1/2 要等价改写成 3/6同理 1/3 改写为 2/6。两个量都用“六分之一”这一共同单位来度量直接相加得到 5/6。把“更相减损”放在“齐同”之前是有道理的先约分再通分可以让最终运算的数字更小。今天的学生做分数加法也习惯先看能不能约分。古人虽然没有现代教科书里的“约分再通分”口诀操作顺序却完全一致。2.3 一次通分实例为了看清楚整套流程用一个有单位 1 参加的例子。假设要计算1 1/2 1/3 1/4这一步在少广章里很典型因为很多时候不仅要处理几个分数还要连带着整数“1”一起合成一个新单位。直接心算当然不困难但古代算筹场景下人们需要通过统一分母来避免混乱这里正好展示完整步骤。第一步看分母 2、3、4。这三个数的最小公倍数是 12所以把整体拆成 12 份。第二步逐个改写1 等于 12/121/2分母 2 变 12扩大了 6 倍分子也乘 6得 6/121/3分母扩大 4 倍分子跟着乘 4得 4/121/4分母扩大 3 倍分子跟着乘 3得 3/12。第三步把改写后的分子相加12 6 4 3 25。结果就是 25/12也就是 2 又 1/12。这个例子虽然简单背后的“少广”思路却很值得注意先把所有参与的量放到同一个单位体系里再进行合并。这种做法放到今天的编程里就是典型的数据对齐过程。不同来源的数据单位不一致时不能直接相加必须先统一单位。古人用算筹完成这一套说起来容易实际摆起来却需要细心尤其当分母数字很大的时候谁漏乘了一步后面整个数就乱了。3. 开方算法的原理与手工演算3.1 为什么要按“两位一组”开平方开平方在“少广”章里是重头戏。今天按计算器答案瞬间出来根本不需要关心内部过程。但如果自己动手算一遍就会发现古代算法不仅可行而且逻辑非常干净。先讲一个最关键的习惯从个位开始每两位分成一组。比如 55225从右往左分组得到 55225。为什么偏偏是两位一组因为一个一位数的平方最多可能有两位比如 9 的平方是 81而两位数平方时结果的低位两位只跟这个两位数的个位有关。换句话说现在要求的平方根每增加一位对应的原数就相当于扩大了 100 倍所以被开方数按两位一组切分恰好对应根的一次“进位”。这个道理放到几何里更直观。假设你已经找到平方根的前几位 a这个 a 代表若干个“十”。下一步要加一位 b相当于边长从 10a 变成 10a b。面积从 (10a)² 变为 (10ab)²增加的部分为(10ab)² - (10a)² 20ab b² (20a b)·b也就是说每试一位数 b要验证的就是 (20ab)×b 能否被当前的余数容纳。20a 这个数看起来奇怪其实就是“二倍原边长扩大十倍”的意思新的边长增加 b 后会多出两个长条形的面积每个长条的尺寸是 10a×b再补上角落的 b×b。算筹时代的人显然是从面积图的切分里悟出了这一步所以他们的开方术一直带有几何直觉。确认了分组规则和公式整个开平方就变成一件很机械的事情分段、试商、做乘法、求余数、继续下一段。这也是为什么它能被反复使用而不需要每次靠猜。3.2 用实例完整走一遍开平方用 55225 作为例子完整走一遍。先把数分组55225。第一步看最高组 5。找一个平方不超过 5 的最大整数是 2因为 2²43²9 已经超过 5。于是平方根的第一位取 2余数是 5 - 4 1。第二步把下一组 52 接上余数变成 152。此时的根 a2。按公式要试第二位 b条件为(20×2 b)×b (40b)×b ≤ 152试 b3得 43×3129刚好没过试 b4得 44×4176超过 152。所以 b 取 3余数变成 152 - 129 23。第三步把第三组 25 接上余数变成 2325。此时根 a23要试第三位 b。条件是(20×23 b)×b (460b)×b ≤ 2325试 b5得 465×52325刚好等于余数为 0。于是开方结束平方根为 235。把整个过程列成表格会更清楚步骤已得根 a当前余数试商 b校验算式新余数第一步05522522²415225第二步2152343×312923第三步2323255465×523250看到最后一步的 465×5对应的是边长从 23 增到 235 造成的额外面积这和代数展开完全吻合。整个过程里没有出现任何“猜小数点”的环节纯粹的整数逐步推进。这也正是古代算筹魅力所在只要规定好分组和试商流程哪怕是很大的数也能一步一步算到底。3.3 开立方算法的自然延伸开平方会了开立方其实不需要重新学一套逻辑只要把分组和公式换成三维版本。平方根按两位一组立方根自然按三位一组原因是三位数的立方最多有九位而平方根和立方根的位权不同。举个例子46656从右往左按三位分组得到 46|656。因为最高组只有两位说明立方根是两位数。第一步找最高组 46 里的最大整数立方根。3³274³64 超过 46所以根的第一位是 3。剩余部分为 46 - 27 19接上下一组 656余数为 19656。第二步根 a3要试第二位 b。这里用到立方展开式(10ab)³ - (10a)³ 300a²b 30ab² b³代入 a3得到 300×9×b 30×3×b² b³ 2700b 90b² b³。试 b62700×61620090×3632406³216总和 16200324021619656刚好等于余数。于是 46656 的立方根是 36。这个系数 300、30、1 背后就是立体几何的切分当边长从 30 增加到 36 时体积的增加由三块厚度为 6 的大面、三条与厚度相关的棱以及一个角上的小立方体构成。正方体三条棱每个方向的面积贡献系数自然就带 3面积再和长度相乘尺度调整就得到 300 和 30。理解了这幅立体图就不会觉得系数是硬记的。3.4 开不尽的数怎么办不是所有数都能刚好开尽。比如 2 的平方根手工开方会一直有余数永远除不完。这个问题古人在“少广”章里给出了非常务实的处理方式开不尽的余数直接用来表示近似数不再强求更小的小数位。这个处理方式在数学史上极其重要因为它事实上承认了无理数的存在。虽然古人没有现代的无理数符号也不会直接写根号 2但他们知道有些平方根无法用整数精确刻画只能在误差允许的范围内继续逼近。用今天的眼光看这已经是极限思想的雏形了。如果你手工开 2分组是 2.00000000每一步都能算出下一位小数而且永远不会归零。实际操作中通常算到需要的精度就停下余数说明误差大小。这种“近似但不强行闭合”的态度在当时非常先进。很多后来的数学传统反而更喜欢用分数强行逼近而没有清楚意识到有些数本质上无法被有限表示。4. 经典问题类型与几何含义4.1 面积反推边长的实际场景“少广”章里大量题目起点都是一个很现实的问题我有一块正方形的田知道它有多少平方步想知道每一边有多长。为什么要问这个问题古代丈量土地、分配田亩时面积是管理者和农户都关心的核心指标。如果面积已知地形又比较规整官员往往需要快速还原边长来确认边界。更常见的情形是田垄不是标准正方形而是由多个分数宽度拼接而成这时候需要先把宽度加起来再反推长度。比如已知一块田的总面积宽度是若干步加三分之一步问你长度是多少。这其实是“少广”章的拿手戏第一步把分数部分合成一个统一的量第二步根据总量做除法或开方。初学者容易把这两个步骤分开看待实际上它们经常出现在同一道题里而且前后顺序不能乱。先统一宽度再反推长度否则后面的计算会失去参照。这类问题的几何含义并不复杂面积公式是“广乘以纵”现在知道面积和一个因子求另一个因子。但如果宽本身是一堆分数就需要先通过通分把“零头”整理成单一数值。这就像先统一度量衡再量尺寸道理朴素执行起来却很考验对分数的熟练度。4.2 体积反推边长从平面走向立体平面问题解决之后第四章把场景拓展到立体。已知一个立方体的体积反推它的棱长这是开立方的直接应用。古代工程中筑墙、挖渠、堆土都需要估算土方量土方常常被近似成正方体或长方体。知道总体积想知道每一段墙的高度或者土堆的边长就必须用开立方。一个典型的思路是如果土方体积是某个数边长为整步直接开方如果边长带分数就在开方之前把分数部分处理干净。实际操作时古人会先估算整数部分再看余数能精确到多少。这种“先粗后细”的顺序和现代数值计算中的迭代思路很接近。立体问题的难度比平面高因为立方计算中每一位数字对应的量级跨度更大。按三位一组分组后试商时要同时考虑一次项、二次项和三次项手算复杂度明显上升。但只要每一步严格按公式检查最终的可靠性仍然很高。古人能在没有计算器的条件下持续处理这类问题说明他们对公式的理解并不停留在背记层面。4.3 少广与除法的关系“宽”的逆向如果把“少广”这两个字继续深挖会发现它和除法有着剪不断的关系。除法本身也是已知总量和一个因子求另一个因子开方则是更特殊的情况两个因子相同。而“少广”章的独特之处在于它允许因子是分数的组合体。假设矩形面积是 1 亩宽是 1 步半问长是多少。宽是分数 1 1/2要先统一成 3/2。面积除以宽度得到长度 2/3 步。这个过程本质上就是分数除法。从“广”的角度看宽度是一堆分数拼起来的现在要把这个“广”缩成单位宽度看看长度如何变化这大概就是“少广”名称的由来。这个概念容易被忽略但它确实值得专门提出来很多看似高深的开方问题底子其实就是“分数除法”和“分数乘法”的组合。“少广”章没有把分数除法单独作为一章讲而是把它揉进具体题目里让读者在解决问题的过程中自然掌握。这种学习方式早期会显得绕一旦适应对运算本质的理解会深刻得多。5. 从古法到现代程序手算开方为什么不过时5.1 算筹、位值与逐位算法很多人困惑古人没有纸笔演算这么大的开方运算怎么做关键在于算筹系统和位值制。算筹就是一根根小棍用不同摆法表示 0 到 9 十个数字再按位置表示十位、百位、千位。因为算筹天然支持位值制所以古人做开方时每一步都清晰对应一个数位试商得到的数字直接作为新的一位置入根中余数继续在算筹棋盘上滚动。这种“逐位处理”的方式看似手工实际具有现代算法的一切特征状态明确、步骤可重复、误差可控。位值制的重要性怎么强调都不过分。如果没有它大数的开方将难以推进因为每位数字都可能和其他位发生混淆。而位值制一旦建立开方和乘方都变成了按位操作难度从“理解逻辑”降到“按流程执行”。这也是为什么“少广”章能在古代数学传统中占据核心位置它不是孤立技巧而是整套计算体系的自然延伸。5.2 用 Python 把古人算法还原出来如果你觉得手算开方太慢可以用程序把“少广”的算法完整还原出来。下面是一段按两位分组、逐位试商的开平方示例def sqrt_by_pairs(n: int): s str(n) # 从个位起每两位一组不足两位的最高组保留一位或两位 groups [] i len(s) while i 0: start max(0, i - 2) groups.append(int(s[start:i])) i - 2 groups.reverse() root 0 remainder 0 for g in groups: # 余数补充一组相当于乘以100后加入新数字 remainder remainder * 100 g b 0 # 试商满足 (20*root b) * b remainder 的最大整数 while (20 * root b 1) * (b 1) remainder: b 1 remainder - (20 * root b) * b root root * 10 b return root, remainder print(sqrt_by_pairs(55225)) # 输出 (235, 0)这段代码忠实还原了 3.2 节的手算过程。变量 root 表示已经确定的根remainder 表示当前余数。每读入一组数字就把余数乘 100再通过试商找到最大的 b最后更新余数和根。如果你把输出过程打印出来会看到和手算表格完全一致。用代码实现的好处是你能立刻尝试不同数字观察余数变化。比如随便输一个不是完全平方数的数返回的第二个值就是余数它告诉你在当前位数下误差还有多大。这个“余数即误差”的概念和很多数值算法是一脉相承的。5.3 容易踩的坑与处理办法学习“少广”和手算开方时有几类错误反复出现整理成速查表会更方便常见现象原因处理办法分组时分错最高组只有一位数字没有从右往左对齐永远从个位开始向左分组最左边一组可以不够两位试商结果偏大只算了 b²忘了算 20a×b严格使用 (20ab)×b 这条完整公式中间位取 0 时出错根中某位为零后续计算未及时下落当试商为 0 时直接把下一组接到余数后根写 0开立方时系数记混把平方算法硬套到立方上记住三项300a²b、30ab²、b³余数符号混乱校验超过余数时不回退试商必须满足条件才算成立超过则 b 减一再试其中最容易翻车的就是根中间出现 0。比如开一个形如 102 的平方根第二位试商会是 0此时必须把第三组数字原封不动地接到余数后面否则后面的计算会错位。这个细节在算筹时代也经常让人措手不及稍不注意整套数的位值就会乱掉。我的个人建议是先手算几个两位数、三位数的开方把“分组、试商、更新余数”三步内化成肌肉记忆再用代码批量验证。等你能完全解释为什么是 (20ab)×b而不是直接用 20a×b b²再去看“少广”章里的分数部分思路会顺很多。千万不要一开始就背公式因为公式背得再好不理解“每一步剥掉的是哪一块面积”遇到开不尽的数还是要懵。最后再分享一个我常用的小技巧手动开方时把已经确定的根 a 当作一个整体来对待不要把它拆成各位数字。计算 20a 时直接用当前根整体去乘 20比如根是 23就算 460。这能避免很多因位权混乱导致的计算错误也让你更接近古人用算筹操作时的真实状态。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →