韩信点兵(算法描述与设计)

录入者:netlab 人气指数:次 发布时间:2008年01月28日

韩信点兵

汉高祖刘邦曾问大将韩信:你看我能带多少兵?韩信斜了刘邦一眼说:你顶多能带十万兵吧!汉高祖心中有三分不悦,心想:你竟敢小看我!那你呢?韩信傲气十足地说:我呀,当然是多多益善啰!刘邦心中又添了三分不高兴,勉强说:将军如此大才,我很佩服。现在,我有一个小小的问题向将军请教,凭将军的大才,答起来一定不费吹灰之力的。韩信满不在乎地说:可以可以。刘邦狡黠地一笑,传令叫来一小队士兵隔墙站队,刘邦发令:每三人站成一排。队站好后,小队长进来报告:最后一排只有二人。”“刘邦又传令:每五人站成一排。小队长报告:最后一排只有三人。刘邦再传令:每七人站成一排。小队长报告:最后一排只有二人。刘邦转脸问韩信:敢问将军,这队士兵有多少人?韩信脱口而出:二十三人。刘邦大惊,心中的不快已增至十分,心想:此人本事太大,我得想法找个岔子把他杀掉,免生后患。一面则佯装笑脸夸了几句,并问:你是怎样算的?韩信说:臣幼得黄石公传授《孙子算经》,这孙子乃鬼谷子的弟子,算经中载有此题之算法,口诀是:

三人同行七十稀,
五树梅花开一枝,
七子团圆正月半,
除百零五便得知。
刘邦出的这道题,可用现代语言这样表述:
一个正整数,被3除时余2,被5除时余3,被7除时余2,如果这数不超过100,求这个数。
《孙子算经》中给出这类问题的解法:三三数之剩二,则置一百四十;五五数之剩三,置六十三;七七数之剩二,置三十;并之得二百三十三,以二百一十减之,即得。凡三三数之剩一,则置七十;五五数之剩一,则置二十一;七七数之剩一,则置十五,一百六以上,以一百五减之,即得。用现代语言说明这个解法就是:
首先找出能被57整除而被3除余1的数70,被37整除而被5除余1的数21,被35整除而被7除余1的数15
所求数被3除余2,则取数70×2140140是被57整除而被3除余2的数。
所求数被5除余3,则取数21×36363是被37整除而被5除余3的数。
所求数被7除余2,则取数15×2=3030是被35整除而被7除余2的数。
又,1406330=233,由于6330都能被3整除,故233140这两数被3除的余数相同,都是余2,同理23363这两数被5除的余数相同,都是3233307除的余数相同,都是2。所以233是满足题目要求的一个数。
357的最小公倍数是105,故233加减105的整数倍后被357除的余数不会变,从而所得的数都能满足题目的要求。由于所求仅是一小队士兵的人数,这意味着人数不超过100,所以用233减去1052倍得23即是所求。
这个算法在我国有许多名称,如韩信点兵鬼谷算隔墙算剪管术神奇妙算等等,题目与解法都载于我国古代重要的数学著作《孙子算经》中。一般认为这是三国或晋时的著作,比刘邦生活的年代要晚近五百年,算法口诀诗则载于明朝程大位的《算法统宗》,诗中数字隐含的口诀前面已经解释了。宋朝的数学家秦九韶把这个问题推广,并把解法称之为大衍求一术,这个解法传到西方后,被称为孙子定理中国剩余定理。而韩信,则终于被刘邦的妻子吕后诛杀于未央宫。
请你试一试,用刚才的方法解下面这题:
一个数在200400之间,它被3除余2,被7除余3,被8除余5,求该数。
(解:112×2120×3105×5168k,取k-5得该数为269。)
什么叫做韩信点兵
韩信点兵是一个有趣的猜数游戏。如果你随便拿一把蚕豆(数目约在100粒左右),先33粒地数,直到不满3粒时,把余数记下来;第二次再55粒地数,最后把余数记下来;第三次是7粒一数,把余数记下来。然后根据每次的余数,就可以知道你原来拿了多少粒蚕豆了。不信的话,你还可以实地试验一下。例如,假如3粒一数余1粒,5粒一数余2粒,7粒一数余2粒,那么,原有蚕豆有多少粒呢?
这类题目看起来是很难计算的,可是我国有时候却流传着一种算法,综的名称也很多,宋朝周密叫它鬼谷算,又名隔墙算;杨辉叫它剪管术;而比较通行的名称是韩信点兵。最初记述这类算法的是一本名叫《孙子算经》的书,后来在宋朝经过数学家秦九韶的推广,又发现了一种算法,叫做大衍求一术。这在数学史上是极有名的问题,外国人一般把它称为中国剩余定理。至于它的算法,在《孙子算经》上就已经有了说明,而且后来还流传着这么一道歌诀:

三人同行七十稀,
五树梅花廿一枝,
七子团圆正半月,
除百零五便得知。
这就是韩信点兵的计算方法,它的意思是:凡是用3个一数剩下的余数,将它用70去乘(因为7057的倍数,而又是以3去除余1的数);5个一数剩下的余数,将它用21去乘(因为2137的倍数,又是以5去除余1的数);7个一数剩下的余数,将它用15去乘(因为1535的倍数,又是以7去除余1的数),将这些数加起来,若超过105,就减掉105,如果剩下来的数目还是比105大,就再减去105,直到得数比105小为止。这样,所得的数就是原来的数了。根据这个道理,你可以很容易地把前面的五个题目列成算式:

1×702×212×15105
142105
37
因此,你可以知道,原来这一堆蚕豆有37粒。
1900
年,德国大数学家大卫·希尔伯特归纳了当时世界上尚未解决的最困难的23个难题。后来,其中的第十问题在70年代被解决了,这是近代数学的五个重大成就。据证明人说,在解决问题的过程中,他是受到了中国剩余定理的启发的。

Baidu
map