本章对应B站视频链接/video/BV1Zf4y1T79i//video/BV1Zf4y1T79i/
小伙伴们大家好啊,我从这一次开始正式分享学习过程。这些内容我会以视频和专栏的形式各发布一次,小伙伴们可以根据需要查看。
读书要养成看前言的好习惯,这里也从魏晋数学家刘徽为《九章算术注》所作的序开始学习。
先看一下原文和译文(这里译文是在现有的译文版本基础上,我根据个人理解进行翻译的,有争议的地方也希望小伙伴们能够指出)。
原文:
《九章算术注》序刘徽
昔在庖牺氏[1]始画八卦[2],以通神明之德,以类万物之情,作九九之术[3],以合六爻之变[4]。暨于黄帝神而化之,引而伸之,于是建历纪,协律吕,用稽[5]道原,然后两仪四象精微之气可得而效焉。记称“隶首作数”[6],其详未之闻也。按周公制礼而有九数,九数之流,则《九章》是矣。往者暴秦焚书,经术散坏。自时厥后[7],汉北平侯张苍、大司农中丞耿寿昌皆以善算命世。苍等因[8]旧文之遗残,各称删补。故校其目则与古或异,而所论者多近语也。
注释:
【1】庖牺氏:即伏羲,传说中的“三皇”之首。相传伏羲有教民渔猎、驯养野兽,创立八卦,始创文字等功绩。
【2】八卦:我国古代八种有象征意义的符号,组成《易》的基本图像。由阳爻和阴爻排列而成,每三根爻组成一卦,其名称分别为:☰(乾),☷(坤),☳(震),☴(巽),☵(坎),☲(离),☶(艮),☱(兑)。
【3】九九之术:即九九乘法法则。
【4】六爻:为了表示更多现象,八卦中的两卦按照一上一下方式组合,构成复卦。复卦共六个爻位,所以称为“六爻”。六爻之变,此处指更多事物或现象的变化。
【5】稽:考核,计数。
【6】隶首:黄帝的史官,相传隶首始作算数。
【7】自时厥后:后来。
【8】因:根据。凭借。
译文:
从前伏羲创立八卦,用来通达神明的美好品质,模仿世间万物的情状。又创造了九九乘法,用来配合六爻的变化。到了黄帝将其(算术)变化引申,于是建立历法纲纪,调整音律,用来考察道的本源,然后两仪四象的精髓可以被获得并且效法。曾有记载说“隶首创立了算学”,但是我并没有听说过其中的细节。考察周公指定的礼乐制度,其中有九数,九数发展成为《九章算术》。过去暴戾的秦始皇焚书,致使经术散坏。后来,汉代的北平侯张苍、大司农中丞耿寿昌都以擅长算术而闻名于世。张苍等根据旧时残缺的遗文,进行删减补充。所以,其目录与古代版本有些不同,论述所采用的也多为近代的语言。
原文:徽幼习《九章》,长再详览。观阴阳之割裂[1],总算术之根源,探赜[2]之暇,遂悟其意。是以敢竭顽鲁,采其所见,为之作注。事类相推,各有攸归[3],故枝条虽分而同本干知,发其一端而已。又所析理以辞,解体用图,庶亦约而能周[4],通而不黩[5],览之者思过半矣。且算在六艺,古者以宾兴[6]贤能,教习国子[7]。虽曰九数,其能穷纤入微,探测无方[8]。至于以法相传,亦犹规矩度量可得而共,非特难为也。当今好之者寡,故世虽多通才达学,而未必能综于此耳。
注释:
【1】阴阳:古人为解释自然界中互相关联又对立的自然现象而归纳出的概念。割裂:区别。阴阳之割裂,此处指事物的正反区别。
【2】赜:读音[zé],精妙,深奥。
【3】各有攸归:各自有所归属。
【4】周:周密。
【5】黩:过多,此处引申为繁琐。
【6】宾兴:周代举荐人才的方法。
【7】国子:古代公卿大夫的子弟。
【8】无方:此处取无穷、无尽的含义。
译文:
我幼年学习《九章算术》,年长以后又详细钻研。观察事物的正反区别,总结算术的本源,在探索这些深奥道理的闲暇时间,逐渐领悟了其中的道理。所以冒昧的竭尽愚钝,收集我见到的资料,为它作注释。事物之间相互类推,各自有所归属。所以枝条虽然发散但有同一个主干,原因是他们发源于统一开端。再加上使用文辞分析数学原理,使用图形来解释立体,就会使它简明而周密,解释透彻却不繁琐,阅读它的人可以理解过半的内容。算学属于六艺之一,古代根据它来举荐人才,教育贵族子弟。虽然称为九数,却可以尽到极小极微,探测到无穷无尽。至于学习的方法,就像规矩度量一样可以找到共性,不是很困难。如今爱好算术的人很少,所以虽然学识渊博的人很多,但是未必能通晓算术。
原文:
《周官·大司徒》职[1],夏至日中立八尺之表[2]。其景[3]尺有五寸,谓之地中。说云[4],南戴日下万五千里。夫云尔者,以术推之。按[5]:《九章》立四表望远及因木望山之术,皆端旁互见,无有超邈若斯之类。然则苍等为术犹未足以博尽群数也。徽寻九数有重差之名,原其指趣[6]乃所以施于此也。凡望极高,测绝深而兼知其远者必用重差、勾股,则必以重差为率[7],故曰重差也。立两表于洛阳之城,令高八尺。南北各尽平地,同日度其正中之时。以景差为法[8],表高乘表间为实[9],实如法而一[10],所得加表高,即日去地也。以南表之景乘表间为实,实如法而一,即为从南表至南戴日下也。以南戴日下及日去地为勾、股,为之求弦,即日去人也。以径寸之筒南望日,日满筒空,则定筒之长短以为股率,以筒径为勾率,日去人之数为大股,大股之勾即日径也。虽夫圆穹之象犹曰可度,又况泰山之高与江海之广哉。徽以为今之史籍且略举天地之物,考论厥数,载之于志,以阐世术之美。辄造《重差》,并为注解,以究古人之意,缀于《勾股》之下。度高者重表,测深者累矩,孤离者三望,离而又旁求者四望。触类而长之,则虽幽遐诡伏[11],靡[12]所不入。博物君子,详而览焉。
注释:
【1】《周官》:即《周礼》。职:掌管。
【2】表:测量日影的标杆。
【3】景:读音[yǐng],同“影”。
【4】“说云”这两句是引述《周礼注》中的文字。
【5】按:考察。
【6】指趣:宗旨,意义。
【7】率:两个相关的数在一定条件下的比值。
【8】法:除数。
【9】实:被除数。
【10】实如法而一:可以理解为除法运算,被除数除以除数。
【11】幽遐:僻远;深幽。诡伏:隐藏不露。
【12】靡:无。
译文:
《周礼》中规定大司徒的职责之一,就是在夏至日的正午立一根八尺长的标杆,把影子长一尺五寸的地方,定为大地中心。《周礼注》中说,此刻太阳直射处在一万五千里的地方,这个结论是可以用算术推出来的。依据:《九章算术》中有立四根标杆求距离和根据树木求山高的方法,都是在近处设置参照,还没有距离这么远的。如此看来,张苍等人的计算方法还不足以覆盖全部的数学方法。我发现九数中有“重差”这一内容,它的宗旨就是为了解决这一类问题的。凡是测量极高、极深,又要求它们距离的情况,必须用到重差的方法。勾股必用“重差”的方法,所以称为“重差”。在洛阳城立两根八尺高的标杆,使它们在同一水平面上,在同一天正午测量它们的影子长度。把两个影子的差值作为除数,把标杆的高度乘标杆距离的积作为被除数,被除数除以除数,所得结果加上标尺高度,就是太阳距离地面的高度。使用南侧标杆的影长乘标杆距离作为被除数,除数不变,被除数除以除数所得结果,就是南侧标杆到太阳直射处的距离。分别以南标杆到太阳直射处的距离和太阳到地面的距离作为勾、股(直角三角形的两条直角边),所得的弦,就是太阳到人的距离。用直径一寸的圆筒向南观望太阳,阳光充满筒内的空间,则规定筒的长短为股率,以筒的直径作为勾率,以太阳到人的距离作为大股,大股对应的大勾就是太阳的直径。即便是圆穹也可以度量,更何况泰山的高度和江海的面积呢。我根据流传至今的史籍略举天地间的实物为证,考证论述其数理,记载在书上,以阐释算术的美妙。于是又作了《重差》的内容,并为其作注,来探究古人的真意,补充在《勾股》的章节里面。度量高度用重表法,测量深度用累矩法,对孤立的观测物须要观测三次,对孤立的观测物且要解决其他问题的需要观测四次。如果能够触类旁通,即便问题很难,也没有不能解决的。博学的君子们,请仔细阅读这本书吧。
我们可以看到,原文大致可以分为三部分,第一部分说明《九章算术》一书的发展历史,第二部分说明作者为《九章算术》作注的动机,第三部分则以一个实际的例子来说明算术的实用性以达到给读者种草的目的。
需要重点阅读的是第三部分,这里通过举例介绍了观测太阳的算术方法,我们来仔细分析一下。
这一段原文中提到的问题可以细分成两个问题。
1、首先是观测距离的问题,如图,在同一水平线上树立两个标杆,这里称为“南表”“北表”,根据文中叙述,可整理出公式:
日去地 = (表高*表间距)/(北表影长-南表影长)+ 表高
南表到太阳直射点(南戴日下)的距离 = (南表影*表间距)/(北表影长-南表影长)
日去人 = √(日去地^2 + 南表到太阳直射点距离^2)
这个问题实质上就是把测算太阳高度的问题,抽象为利用相似三角形求线段长度的问题模型,在上图基础上加一条辅助线,可以更直观的看懂公式的推导过程。
过D点做一条CG的平行线,则有线段HJ=FG=南表影长。
根据上图:
AG//DJ,BD//EI,可得出
ABC相似于DHJ
ACD相似于DJI
且两组相似三角形有公共边AC、DJ
AB/DH = CD/JI ==> AB = CD/JI*DH
AE = AB + BE ==> AE = CD*DH/JI + BE
AE为日去地高度,CD为表间距,DH、BE为表高,JI为北表影长与南表影长的差值
即 日去地 = (表高*表间距)/(北表影长-南表影长)+ 表高
BC/HJ = CD/JI ==> BC = CD*HJ/JI
BC为南表与太阳直射点的距离,CD为表间距,HJ为南表影长,JI为北表影长与南表影长的差值
即 南表到太阳直射点(南戴日下)的距离 = (南表影*表间距)/(北表影长-南表影长)
根据勾股定理,有
AE^2 + EF^2 = AF^2 ==> AF = √(AE^2 + EF^2)
AF为太阳到观测人的距离,AE为日去地高度,EF为南表与太阳直射点的距离
即 日去人 = √(日去地^2 + 南表到太阳直射点距离^2)
2、第二个问题是观测太阳直径,如图,根据文中叙述,可得出公式:
太阳直径 = (日去人 * 筒径)/筒长
这个问题也是一个相似三角形的问题,相较于上一个问题,更加直观。
根据上图,有:
太阳直径/筒径 = 日去人/筒长
即 太阳直径 = (日去人 * 筒径)/筒长
接下来把解决问题的公式转换为代码,我这里是把每部分相对独立的公式或者算法封装到一个方法中,已知条件作为输入参数,需要求的值作为返回值(为了命名方便,方法名使用“章节+序号”的格式命名):
需要代码源文件的小伙伴可以关注我的微信公众号: JianMing-95
1、输入:表高,表间距,南表影长,北表影长;
返回值:日去地距离,南表到太阳直射点的距离,日去人距离;
代码:
function pre01(input){ //以json格式输入参数:表高rh,表间距rd,南表影长sr,北表影长nrlet rh = input.rh;let rd = input.rd;let sr = input.sr;let nr = input.nr;if(typeof(rh) != "number" || typeof(rd) != "number" || typeof(sr) != "number" || typeof(nr) != "number"){ //简单过滤掉错误输入return "输入有误,请重新输入";}if(rh < 0 || rd < 0 || sr < 0 || nr < 0 || sr > nr){ //简单过滤掉错误输入return "输入有误,请重新输入";}let hOFs = 0,dOFs = 0,dOFp = 0;//声明要输出的变量:日去地距离hOFs,南表到太阳直射点的距离dOFs,日去人距离dOFphOFs = (rh * rd)/(nr - sr) + rh;//日去地 = (表高*表间距)/(北表影长-南表影长)+ 表高dOFs = (sr * rd)/(nr - sr);//南表到太阳直射点(南戴日下)的距离 = (南表影*表间距)/(北表影长-南表影长)dOFp = Math.sqrt(Math.pow(hOFs,2)+Math.pow(dOFs,2));//日去人 = √(日去地^2 + 表到太阳直射点距离^2)return {"hOFs":hOFs,"dOFs":dOFs,"dOFp":dOFp};//以json格式返回结果}
调用代码及运行结果:
let input = {"rh":2,"rd":3,"sr":1,"nr":4};console.log(pre01(input)); //调用方法在控制台输出结果运行结果:[Running] node "d:\WorkSpace\jsWork\NCMA\preface\pre01.js"{ hOFs: 4, dOFs: 1, dOFp: 4.123105625617661 }[Done] exited with code=0 in 0.254 seconds
2、输入:日去人距离,圆筒长度,圆筒直径
输出:太阳直径
代码:
function pre02(input){ //以json格式输入参数:日去人距离dOFp,圆筒长度l,圆筒直径dlet dOFp = input.dOFp;let l = input.l;let d = input.d;if(typeof(dOFp) != "number" || typeof(l) != "number" || typeof(d) != "number"){ //简单过滤掉错误输入return "输入有误,请重新输入";}if(dOFp < 0 || l < 0 || d < 0 || dOFp < l){ return "输入有误,请重新输入";}let sd = 0; //声明要输出的变量:太阳直径sd = (dOFp * d)/l; //太阳直径 = (日去人 * 筒径)/筒长return {"sd":sd}; //以json格式返回结果}
调用代码及运行结果:
let input = {"dOFp":1000,"l":20,"d":3};console.log(pre02(input)); //调用方法在控制台输出结果运行结果:[Running] node "d:\WorkSpace\jsWork\NCMA\preface\pre02.js"{ sd: 150 }[Done] exited with code=0 in 0.123 seconds
如果觉得《JAVASCRIPT遇到《九章算术》-《九章算术注》序》对你有帮助,请点赞、收藏,并留下你的观点哦!