“鸡兔同笼”算法源流
2012-12-29郜舒竹
教学月刊·小学数学 2012年7期
在“鸡兔同笼”问题的教学中,教师通常会将我国古代《孙子算经》的简单介绍附加到教学过程中,意图在于体现数学的历史发展,向学生渗透数学历史中的文化因素。这种想法固然好,但这种“附加”式的介绍对于实现这样的目的很难有实质性的作用。为了变“附加”为“融入”,让数学史中的知识与文化更好地发挥育人功能,教师就需要对数学史的相关内容做较为广泛、深入的了解。
“鸡兔同笼”问题在我国古代可以说源远流长,从问题的叙述到问题的算法都经历了不同形式的变化,了解这些内容对于课程内容的编制和教学设计会有所裨益。
一、 《孙子算经》中的“雉兔同笼”
“鸡兔同笼”问题始见于公元3~4世纪的《孙子算经》,该书作者不详。从清代的《子部集成•科学技术•数理化学•孙子算经•孙子算经(宋刻本)•卷下》中看,“鸡兔同笼”问题的叙述为:“今有雉兔同笼,上有三十五头,下有九十四足。问雉兔各几何。”[1](见图1)
其中的“雉”是“野鸡”的意思,“几何”是“多少”的意思。用现在的语言可以把这个问题叙述为:“鸡和兔在同一个笼子中,总头数为35,总足数为94。问鸡和兔各有多少只?”《孙子算经》中对这个问题的解法分为如下的四个步骤:
第一步:上置三十五头,下置九十四足
我国古代是用算筹进行计算的,所谓“算筹”就是用于计算的小棒,是古人用于计算的一种工具。这里所说的“上置三十五头,下置九十四足”,就是把题目中的头数“35”和足数“94”用小棒分别摆在上面的位置(上位)和下面的位置(下位)。(见图2)
古人用算筹表示数时,摆放方式分纵式和横式两种。通常用纵向小棒摆放个位数字,横向小棒摆放十位数字,以后依次纵横交替摆放。比如“35”就摆放成如图3形式。
如果横向摆放的数大于5,就用纵向小棒代表5,比如图2中的“”就表示5+4=9。
第二步:半其足得四十七
意思是求出下位总足数94的一半等于47。图2就变成了图4的形式。
图4中“”上面的横向小棒表示“5”,下面两条纵向小棒表示“2”,因此“”表示5+2=7。
第三步:上三除下三,上五除下五
这里的“除”是“除去”或“减少”的意思,“上三除下三”就是“从下位四十七中除去与上位相同的三十”,“上五除下五”就是“从下位四十七中除去与上位相同的五”。(见图5)
用现在的语言说,就是从47中减去35为12,得到兔子的只数。这一过程在《孙子算经》的“术”中叫做“以少减多再命之”(见图1),意思是以少减多之后,下位“总足数”的含义发生了改变,需要重新命名,也就是把“总足数”重新命名为“兔头数”。(见图5)
第四步:下有一除上一,下有二除上二即得
与前面类似,这句话的意思是用总只数35减去兔只数12就得到鸡的只数了。上位的“总头数”需要重新命名为“鸡头数”。(见图6)
以上算法的合理性并不难理解。总足数94取半成为47,此时相当于所有鸡都成为了金鸡独立的“独足鸡”,所有兔都站立起来成为了“双足兔”。此时每只鸡的头数和足数都是1,每只兔的头数是1,足数是2,所以用47减去总头数35就得到兔的只数是12。最后用总头数35减去12就得到鸡的只数。《孙子算经》中把这一算法概括为:“上置头,下置足,半其足,以头除足,以足除头即得。”不妨称此方法为“半足法”,右上的表格可以更加清晰地呈现这一过程。
二、 《算法统宗》中的“鸡兔同笼”
“鸡兔同笼”问题后来又收录于明代程大位(1533年~1606年)所著《算法统宗》第八卷的“少广章”。[2](见图7)
其中对问题的叙述把“雉”改为了“鸡”,因此“鸡兔同笼”的说法沿用至今。《算法统宗》中对问题给出了两种算法,这两种算法与《孙子算经》中的算法是不一样的,相当于现在所说的“假设法”。第一种算法的过程为:
第一步:“置总头倍之得七十”,意思是将总头数35加倍,也就是乘2,得到70。
第二步:“与总足内减七十余二四”,也就是从总足数94中减去70得到24。
第三步:“折半得一十二是兔”,将24折半(也就是24除以2),得到12,这就是兔的只数。
第四步:“以四足乘之得四十八足”,用每只兔的足数4乘12,得到兔的总足数48。
第五步:“总足减之余四十六足为鸡足”,用总足数94减去兔的总足数48得到46,就是鸡的总足数。
第六步:“折半得二十三”,将鸡的总足数46折半(46除以2),就得到鸡的只数为23。
另外一个算法是先求鸡的只数,与前面先求兔只数的程序基本相同,这一算法可以用下面表格的形式呈现出来。
《算法统宗》中关于“鸡兔同笼”问题的两个算法,在书中概括为两句话:“倍头减足折半是兔”和“四头减足折半是鸡”(见图7)。第一句话的意思是把求兔只数的过程分为了倍头、减足和折半三个步骤,“倍头”就是把总头数35加倍变成70;“减足”是用总头数94减去70得到24;“减半”就是取24的一半得到兔子的只数为12。这个过程写成如今的算式就是:
(94-35×2)÷2=12(只)
第二句话的意思是把求鸡只数的过程分为了四头、减足和折半三个步骤,“四头”就是用4乘总头数35得到140;“减足”是用140减去总足数94得到46;与求兔只数的过程类似,“折半”就是取46的一半得到鸡的只数23。写成算式就是:
(35×4-94)÷2=23(只)
这样的过程显然与《孙子算经》中的“半足法”不同,半足法首先将总足数减半。这里的第一步是用每只鸡或兔的足数(2或4)去乘总头数,因此不妨把这个方法叫做“倍头法”。不难发现,“倍头法”背后的道理其实就是现在所说的“假设法”。
《算法统宗》中的鸡兔同笼问题出现于该书第八卷中,实际上在之前的第五卷中就已经出现了与“鸡兔同笼”问题数量关系类似的“米麦问题”:“今有米麦五百石,共价银四百零五两七钱,只云米每石价八钱六分,麦每石价七钱二分五厘。问米麦各若干。”[3](见图8)
用现在的语言叙述就是:“有大米和小麦共500石,总价格为405.7两。大米每石价格为0.86两,小麦每石价格为0.725两。问大米和小麦各有多少石?”
《算法统宗》中给出的算法为:“置米麦五百石,以米价八钱六分乘之得四百三十两,减去共价余二十四两三钱为实,以米价内减麦价余一钱三分五厘为法,除之得麦一百八十石,却以米麦五百石内减麦数余三百二十石为米数,各以原价乘之合问。”(见图9)
其中的“实”与“法”分别表示现在所说的“被除数”和“除数”。这一算法用现在的语言可以解释为,首先用大米和小麦的总数500与米的单价0.86相乘得到430两,然后减去实际总价格405.7,得到24.3两作为被除数,大米单价与小麦单价相减的差0.135两作为除数,除得的结果就是小麦有180石,用总数500减去180就得到大米数量为320石。写成算式就是:
(0.86×500-405.7)÷(0.86-
0.725)=180(石)
500-180=320(石)
不难看出,这一算法与前面解决“鸡兔同笼”问题的“倍头法”是一样的。《算法统宗》中将这一算法命名为“贵贱差分法”。在“米麦问题”中,大米是贵物,小麦是相对于贵物的贱物,所谓“贵贱差分法”就是一种能够将二者区分开的方法。《算法统宗》对这一方法的解释为:“差分贵贱法尤精,高价先乘共物,情却用都钱减今数,余留为实,甚分明别将二价也相减,用此余钱为法,行除了先为低物价,自余高价物方成。”意思是说:“差分贵贱法很精确,先用贵物单价与总数量相乘,而后减去实际总价格,这个差作为被除数,贵、贱物单价的差作为除数,除得的结果就是贱物的数量,而后不难求出贵物数量。”
三、 《镜花缘》中的“灯球问题”
在清代李汝珍所著《镜花缘》[4]的第九十三回“百花仙即景露禅机 众才女尽欢结酒令”中,也出现了两个与“鸡兔同笼”问题数量关系类似的问题。这两个问题均出现于众才女在小鳌山赏灯时的情景中。
问题1:楼下灯有两种:一种一大球,下缀二小球;另一种一个大球,下缀四个小球。大灯球共三百六十个,小灯球共一千二百个。问两种灯各有多少?
问题2:楼上灯有两种,一种上做三大球,下缀六小球,计大小球九个为一灯;(另)一种上做三大球,下缀十八小球,计大小球二十一个为一灯。大灯球共三百九十六个,小灯球共一千四百四十个。问两种灯各多少?
书中才女兰芬对问题1给出的解答为:“将小灯球一千二百折半为六百,以大球三百六十减之,余二百四十,是四小球灯二百四十盏;于三百六十内除二百四十,余一百二十,是二小球灯一百二十盏。”这一解法与《孙子算经》中“雉兔同笼”的“半足法”相同,先将1200个小灯球减半为600个,然后用600减去大灯球个数360得到240,这就是四小球的灯数。再用大灯球个数360减去240得到120,就是二小球的灯数。写成算式就是:
1200÷2=600
600-360=240
360-240=120
兰芬对问题2的解法为:“先将一千四百四十折半为七百二十,以大球三百九十六减之,余三百二十四,用六归,……得五十四,是缀十八小球灯五十四盏;以三乘五四,得一百六十二,减大球三百九十六,余二百三十四,以三归之,得七十八,是缀六小球灯数目。”
简单地说,就是先将小灯球数1440减半(1440÷2=720),之后用720减去大灯球数量396得到324(720-396=324),用6除324得到54(324÷6=54);用3乘54得162(54×3=162),用大灯球数396减去162得234(396-162=234),最后用3除234等于78(234÷3=78),就是缀六个小球的灯的个数。这一算法显然是采用了《孙子算经》中的“半足法”,而不是《算法统宗》中的“倍头法”。
在日本的数学教科书中有一个叫做“鹤龟算”的问题,[5]这一问题的原型其实就是中国古代的“鸡兔同笼”问题。1815年在日本出版的《算法点窜指南录》中记载的“鹤龟算”问题为:“某处有鹤龟百头,只云足数和为二百七十二,问鹤龟各几何?”其解法为:
“置龟之足数(4),减鹤足数(2),以余为法(4-2=2),置某处鹤龟之数(100),乘以龟足数(100×4=400),得四百,又减总足数(400-272=128),得余数一百二十八,用法除之(128÷2=64),得六十四,此为鹤之数。”[6]这一解决方法与《算法统宗》中的“倍头法”是一致的。
我国古代数学文献中的内容,通常是以问题及其算法的方式呈现的,很少有关于算法的道理的论述。问题的算法通常叫做“术”,类似于西方数学教育中所说的“程序性知识(Procedural Knowledge)”,指的是解决问题的工具和操作程序。前面介绍的算筹就是算法的工具,操作步骤就是程序。对于“鸡兔同笼”问题的解决,无论是《孙子算经》中的“半足法”,还是《算法统宗》中的“倍头法”,都具有“只叙术,不讲理”的特点。
由此带来的问题是,学习者可以按照操作程序解决问题,但不明白为什么可以这样操作的道理,也就是缺少了“概念性理解(Conceptual Understanding)”。因此,教师将数学史融入数学教学,就需要对数学史内容背后的道理进行研究,挖掘“术”背后的思维因素,也就是要回答“怎样想出方法”这样的问题。这些问题将在后续文章中继续讨论。
注释及参考文献:
[1] 引自:汉唐典藏. 子部集成•科学技术•数理化学•孙子算经•孙子算经(宋刻本)•卷下.
[2] 引自:汉唐典藏. 子部集成•类书集成•古今图书集成•历象汇编•历法典•第一百二十卷•算法统宗八•少广章第四下.
[3] 引自:汉唐典藏.子部集成•类书集成•古今图书集成•历象汇编•历法典•第一百十七卷•算法统宗五.
[4] 注释:《镜花缘》是清代才学小说的代表作,其中融入了诸如地理、历史、生物、数学、医药、水利、商业、神话、文学、音韵、艺术、游戏、星相等。作者李汝珍(约1763~1828)终生未举,小说中所写内容很多是他自身的研究成果。《镜花缘》前五十回写武则天时期落第秀才唐敖、商人林之洋、船工多九公游历海外几十个国家的故事,通过夸张、想象寄寓了作者对于政治、社会、文化的批判和理想。后五十回写武则天取中的一百名才女相聚游戏、呈技斗艺的故事。
[5] 参见:李淑文.日本新编中学数学教材的特点评析 [J]. 数学教育学报, 2003.11.
[6] 参见:[日本]平山谛. 代钦译. 东西数学物语[M]. 上海教育出版社, 2005. 3(1):49.
(首都师范大学初等教育学院 10004