鬼谷演演算法

出自《孫子算經》的解題方法

“鬼谷演演算法”是《孫子算經》上有名的“孫子問題”(又稱“物不知數題”)編寫而成的。

基本信息


漢高祖劉邦曾問大將韓信:“你看我能帶多少兵?”韓信斜了劉邦一眼說:“你頂多能帶十萬兵吧!”漢高祖心中有三分不悅,心想:你竟敢小看我!“那你呢?”韓信傲氣十足地說:“我呀,當然是多多益善啰!”劉邦心中又添了三分不高興,勉強說:“將軍如此大才,我很佩服。現在,我有一個小小的問題向將軍請教,憑將軍的大才,答起來一定不費吹灰之力的。”韓信滿不在乎地說:“可以可以。”劉邦狡黠地一笑,傳令叫來一小隊士兵隔牆站隊,劉邦發令:“每三人站成一排。”隊站好后,小隊長進來報告:“最後一排只有二人。”“劉邦又傳令:“每五人站成一排。”小隊長報告:“最後一排只有三人。”劉邦再傳令:“每七人站成一排。”小隊長報告:“最後一排只有二人。”劉邦轉臉問韓信:“敢問將軍,這隊士兵有多少人?”韓信脫口而出:“二十三人。”劉邦大驚,心中的不快已增至十分,心想:“此人本事太大,我得想法找個岔子把他殺掉,免生後患。”一面則佯裝笑臉誇了幾句,並問:“你是怎樣算的?”韓信說:“臣幼得黃石公傳授《孫子算經》,這孫子乃鬼谷子的弟子,算經中載有此題之演演算法。”

基本介紹


鬼谷子,姓王名詡(或利),又名王禪,號玄微子,春秋戰國初時人。祖籍朝歌(今河南省淇縣)城南,出生於河北省臨漳縣香菜營鄉鹽食村,童年生活在河北省臨漳縣香菜營鄉穀子村,兩村是近鄰。鹽食村古代叫王家莊。“王禪老祖”是後人對鬼谷子的稱呼,是先秦諸子之一。鬼谷子為縱橫鼻祖(其實也是兵家的著名代表人物之一),蘇秦張儀為其最傑出的兩個弟子(見《戰國策》)。另有孫臏龐涓亦為其弟子之說(見《孫龐演義》)。他通天徹地,兼顧數家學問,人不能及。一是神學:日星象緯,占卜八卦,預算世故,十分精確;二是兵學,六韜三略,變化無窮,布陣行軍,鬼神莫測;三是遊學,廣記多聞,明理審勢,出口成章,萬人難當;四是出世學,修身養性,祛病延壽,學究精深。
“鬼谷算”是《孫子算經》上有名的“孫子問題”(又稱“物不知數題”)編寫而成的。原來的題目是:
“今有物不知其數,三三數之剩二,五五數之剩三,七七數之剩二。問物幾何?”
用通俗的話來說,題目的意思就是
有一些物品,不知道有多少個,只知道將它們三個三個地數,會剩下2個;五個五個地數,會剩下3個;七個七個地數,也會剩下2個。這些物品的數量至少是多少個?
(註:詩題及題目原文都無“至少”二字,但“孫子問題”都是些求“最少”或者求“至少”的問題,否則就會有無數多個答案。所以,解釋題目意思時,在語句中加上了“至少”二字。)
《孫子算經》解這道題目的“術文”和答案是:
“三三數之剩二,置一百四十;五五數之剩三,置六十三;七七數之剩二,置三十。並之,得二百三十三,以二百十減之,即得。”“答曰:二十三。”
這些話是什麼意思呢?用通俗的話來說,就是:
先求被3除餘2,並能同時被5、7整除的數,這樣的數最小是140;
再求被5除餘3,並能同時被3、7整除的數,這樣的數最小是63;
然後求被7除餘2,並能同時被3、5整除的數,這樣的數最小是30。
於是,由140+63+30=233,得到的233就是一個所要求得的數。但這個數並不是最小的。
再用求得的“233”減去或者加上3、5、7的最小公倍數“105”的倍數,就得到許許多多這樣的數:
{23,128,233,338,443,…}
從而可知,23、128、233、338、443、…都是這一道題目的解,而其中最小的解是23。
答:這些物品的數目至少是23個。
需要指出的是,在《孫子算經》上,有一段關於這類題目的解題“術文”:
“凡三三數之剩一則置七十,五五數之剩一則置二十一,七七數之剩一則置十五,一百六以上以一百五減之,即得。”
(註:古稱“106”和“105”為“一百六”和“一百五”,而稱“160”和“150”為“一百六十”和“一百五十”。所以,這裡的“一百六”和“一百五”分別指“106”和“105”,而不是“160”和“150”。)
明代著名的大數學家程大位,在他所著的《演演算法統宗》中,對於這種解一般“孫子問題”的方法,還編出了四句歌訣,名曰《孫子歌》:
三人同行七十稀,
五樹梅花廿一枝;
七子團圓正半月,
除百零五便得知。
歌中的“廿”,讀音與“念”音相同。“廿”即二十的意思。
這一歌訣的“詩意”,我們可以不去理會,只需注意它的數字就行了。歌訣中的每一句話,都指出了一步解題方法:
“三(3)人同行七十(70)稀”——是說除以3所得的餘數,要用“70”去乘它;
“五(5)樹梅花廿一(21)枝”——是說除以5所得的餘數,要用“21”去乘它;
“七(7)子團圓正半月(15)”——“半月”是一個月30天的一半,即15日,這是說,除以 7所得的餘數,要用“ 15”去乘它;
“除百零五(105)便得知”——這是說要把上面所乘得的三個數相加,加得的和如果大於105,便應減去105,或者減去105的倍數。這也就是《孫子算經》上的“一百六(106)以上,以一百五(105)減之”。這樣得出的差,便是所要求的這個最小的未知數了。
運用這一歌訣來解答這道“物不知數”問題,便是
2×70+3×21+2×15=140+63+30=233
233-105-105=23(答略)
不過,用這種方法解這類問題,有它的局限性,它只能解答用3、5、7作除數的題目,遇到用其他數作除數的算題,它就行不通了。這一點必須引起我們的注意。

鬼谷演演算法的推廣


若某個數X分別被d1,d2,d3,、、、、、、,dn除得的餘數分別為r1,r2,r3,、、、、、、,rn,則可表示為下式:
X=R1r1+R2r2+R3r3+、、、、、、+Rnrn-RD
其中R1是d2,d3,、、、、、、,dn的公倍數,而且被d1除,餘數為1;
R2是d1,d3,、、、、、、,dn的公倍數,而且被d2除,餘數為1;
R3是d1,d2,、、、、、、,dn的公倍數,而且被d3除,餘數為1;
。。。。。。。。。。。。。。。。。。。。。。。。。。。。
Rn是d1,d2,、、、、、、,dn-1的公倍數,而且被dn除,餘數為1;
D是d1,d2,d3,、、、、、、,dn的最小公倍數;
R是任意正整數,可以根據實際需要決定;
而且d1,d2,d3,、、、、、、,dn必須是互質的,以保證每個Ri(i=1、2、3,、、、,n)都能求得。
自從《孫子演演算法》中提出這個“物不知數”問題之後,他便引起了人們很大的興趣。南宋數學家秦九韶對此加以推廣,又發現一種新的解法,叫“大衍求一術”。這種解法後來傳入歐洲,歐洲學者發現此解法和高斯的解法基本一致,但比高斯早了500餘年。