2019年11月7日星期四

韓信點兵

程度: 高中
閱讀時間: 約 30分鐘

摘自︰劉薰宇的《數學趣味》民國二十三年版「韓信點兵」一章(p.195 - 236)


楔子


說起來已將近三十年了,那時我還只八歲,常常隨了我的祖父去會他的老友。有一次到一個小鹽商家去。他一見了我們祖孫倆走到攤頭,一邊拉長板凳一邊向祖父說:

「請坐請坐,好福氣,四孫少爺這般大了。」
「什麼福啊!奔忙福!」
「那裏,那裏,四孫少爺在進學校了吧!」
「不要這般叫孩子們……今年已隨着哥哥進學校了,在屋裏淘氣得很,還是去找個管頭的好。」

祖父說了,微笑着撫摸我的頭。鹽老闆和他說了一些古話,不知怎地,突然卻轉到了我的身上:

「在學校裏唸些什麼書?」
「國文算術.........」我這樣地回答。
「還學算嗎?好,給你算一個題,算得出,請你喫晚飯。」

這使我有點奇怪,我心裏猜不透他是叫我算乘法還是除法。我有些驚恐,怕他叫我算四則問題,我目不轉睛地看着他,他不慌不忙地說了出來:

「三個三個地數剩兩個,五個五個地數剩三個,七個七個地數也剩兩個,你算是幾個?」

我一聽了心裏非常高興,暗裏還有點驕傲,「這樣的題目,那個不會算!」這時我正好學完公倍數公約數,而且不久前還算過這樣的一個題目:

「某數以三除之餘二,以四除之餘三,以五除之餘四,以六除之餘五,問某數最小是若干?」

我把這兩個題目看着是一樣;牠們都是用幾個數去除一個數全除不盡。這第二個道題的算法,我還記得十分清楚,所以我覺得很有把握。不但這樣,我並且覺得這位老闆的題目有些不通,他不曾只問我一個最小的答數。當我這樣在肚裏尋思的時候,祖父便問道:

「算得出嗎?」
「算得出,不只一個答數。」

我這樣回答以後,那位老闆就恭維起我來了,向着祖父說:

「真好福氣!一想就想出來了,將來一定比大老爺還強。」

祖父又是一陣客氣,然後向着我,

「你說一個答數看。」

我所算過的題是先求出「三」「四」「五」「六」四個數的最小公倍數「六十」,然後減去「一」得「五十九」。我於是依樣先求「三」「五」「七」三個數的最小公倍數,心裏暗想着「三五一十 五、七五三十五、一百零五」。再就是要減去一個數了。我算過的題因為「以三除之餘二」 是差個一(3 - 2 = 1)就除盡,所以要減去「一」,現在「三個三個地數剩兩個」正是一樣的,也只要減去「一」,所以我就從一百零五當中減去一,而立刻回答道:

「頂小的一個數是一百零四,還有二百零九(104 + 105 = 209)也是的。」

我這時,在幼稚的心上感到得意,感到快樂,我期望着老闆的誇獎。豈知大出我意料之外!他說:

「一百零四,五個五個地數剩的是四個不是三個。」

這我怎麼不曾想到呢?於是我想那麼應當從一百零五當中減去二了(5 - 3 = 2)。我就說:

「一百零三。」
「三個三個的數只剩一了」

我窘極了,居然遭了這麼大的失敗。在我小時學數學,所遇到的窘迫,這是最大的兩次當中的一次,我覺得當着人失敗,非常害羞。我記得很清楚,我一隻手扯了衣角,一隻手揑緊拳頭,臉上如火燒一般地熱,低了頭儘管在心裏轉念頭,把我所算過的題目都想到。但是徒然,再和牠相像的一個也沒有了。我後來橫了心。很膽大地說:

「恐怕題目出錯了吧!」

然而得到的是一個更加使我窘迫的回答:

「不錯的,連我的祖父也這樣說。」

窮極智生,我居然得到了一條新路,我想三個去除剩兩個,五個去除剩三個,我可以先找三個去除剩兩個的一些數,再一個一個地拿五去除來試。這真是一條光明的路,第一個我想到「五」,這自然不對,用五去除並沒有剩的。挨了下去再就想到「八」,正好用三去除剩二,用五去除剩三。我真喜出望外:

「八!」

「還是不對,七個七個地數,只剩一個。」

這真叫我走頭無路了!那天的晚飯雖則仍是那位老闆留我們喫,但當祖父答應留在那裏的時候,使我非常難過,眼巴巴地只望他領了我回家,我真是臉上熱一陣冷一陣的,那有心腸喫飯!我想得頭都脹了,總想不出這個方法來。羞愧氣悶,因而還有些惱怒,就滿心充塞着這些滋味,沒精打采地在夜裏随着祖父回家。我的祖父對我很慈愛,但督責也很嚴,他在外面雖不曾向我說什麼,一到家裏他就教訓我了:

「讀書要用心......在別人的面前不好誇口!......『寧在人前全不會,勿在人前會不全!』小小年紀曉得些什麼?別人問到就說不知道好了。......這時他的臉上嚴肅中還帶得有幾分生氣的樣兒。他給我這樣的教訓時,我的母親,嬸母,哥哥都在旁邊的,他後來慢慢地將我的遭遇說給他們聽,我的哥哥聽他說完了題目便衝口而出地:

「二十三。」

我非常不服氣 ,

「別人告訴過你的!」
「還這樣不上進,祖父真生氣了。」

從那夜起,一直兩三天,我見到祖父就怕,我沒有一個時候不想這個題的算法,真弄得喫、玩、睡、都是惝怳的。終於還是我的哥哥把算這個題目的秘訣告訴了我,而且說,這叫「韓信點兵」。這我纔雖是十分懊喪,卻慢慢地丟開了去。

現在想起來,那次的遭遇以及祖父所給我的教訓實在是我的年齡所不應當受的。不過這樣的硬教育,對於我也有很大的功勞,我對於數學能有較濃厚的興趣,一半固然由於別人所給的積極的鼓勵;而一半也由於這種差不多是我所擔受不起的遭遇和教訓。數學本來有時會叫人頭痛的,然而經過一次頭痛,總有一次的進益。這次的遭遇,對於本問題,我自己直接雖是一無所得,但對於思索問題的途徑,確實得到了不少的啓示。在當時,有些自以為有了理解的雖也不免浮泛或錯誤,但畢竟增長了一些趣味和能力。因此我願以十二分的誠意,將這段經過敘述出來,以慰勉一部分和我有相類的遭遇的讀者。

現在我們言歸正傳。

源考


所謂「韓信點兵」,就指的是那位鹽老闆所給我的問題的算法。「韓信點兵」這個名詞雖是到了程大位的《算法統宗》纔見到的。但這個問題在中國數學史上卻很有些來歷 ,到了賣鹽老闆都知道,也可以當得起「婦孺皆知」的榮譽了。

這題目最早是見於《孫子算經》,《孫子算經》確實是什麼時候什麼人所作的書,現在雖然難以攷證,大約是二千多年前的作品確實是不容懷疑。在《孫子算經》上這題目原是這樣的:

「今有物不知數,三三數之,賸二;五五數之,賸三;七七數之,賸二;問物幾何?」

在原書本歸在「大衍求一術」中,到了時,周密的書中卻有「鬼谷算」和「隔牆算」的名目,而楊輝又稱為「剪管術」,在那時便有「秦王暗點兵」的俗名,大約韓信就是從秦王變 來的,至於「明點」「暗點」那本沒有什麼多大關係。

算法


原書(編注:即《孫子算經》)上,跟着題目便有下面的段落:

「答曰二十三。

術曰:三三數之賸二,置一百四十;五五數之賸三,置六十三;七七數之賸二,置三十;併之,得二百三十三,以二百一十減之,即得。

凡三三數之賸一,則置七十;五五數之賸一,則置二十一;七七數之賸一,則置一十五;一百六以上以一百五減之,即得。」

後一小段可以說是這類問題的基本算法,而前一小段卻是本問題的解答,用現在的式子照寫出來便是:
70 x 2 + 21 x 3 + 15 x 2 = 140 + 63 + 30 = 233
233 - 105 x 2 = 233 - 210 = 23.
照前面的說法,自然是士大夫氣很重,也可以說是講義體,一般人當然很難明白,但到了周密的書便有詩歌形式的說明,那詩道:
三歲孩兒七十稀,五留廿一事尤奇,
七度上元重相會,寒食清明便可知。
這詩雖然容易記誦,但意義不很明白,而且說的也欠周到。到了程大位,牠就改了面目:
三人同行七十稀,五樹梅花廿一枝,
七子團圓正华月,除百令五便得知。
這詩流傳得非常廣,所以如賣鹽老闆之流也都知道,而我的哥哥所告訴我的秘訣就是牠。

是的,知道了牠,這類的題目便可以機械地算了,將三除所得的餘數去乘七十,五除所得的餘數去乘二十一,七除所得的餘數去乘十五,再把這三項乘積相加;如所得的和比一百零五小,那便是所求的答數;不然,則減去一百零五的倍數而得出比一百零五小的數來——這里所要求的只是一個最小的答數——例如三三數之賸一,五五數之賸四,七七數之賸三,那末,運算的程序便是:
70 x 1 + 21 x 4 + 15 x 3 = 7 + 84 + 5 = 199.
199 - 105 = 94.
若單只就實用或遊戲說,熟記這秘訣已很夠受用了;至於牠是從那兒來的,一般人那管得許多。但就數學的立場來說,這種知其然而不知其所以然的態度卻沒有多大的價值。並且即使熟記着這秘訣,所能應付的問題不過一百零五個,因為只能限於三三、五五、七七、三種數法;我們要默記這一百零五個答數並不是不可能;然而到得果真熟記着這一百零五個答數,那就更無意味了。

算法解釋


所以我們第一要問,為什麼這樣就是對的?要說明個中的理由,我們先記起算術裏面關於倍數的兩個定理:

(一)某數的倍數的倍數,還是某數的倍數。
(二)某數的若干倍數的和,還是某數的倍數。

依了這兩個定理來檢討上面的算法,設R3表示用三除所得的餘數,R5 和 R7 相應地表示用五除和用七除所得的餘數,那末:

(一)70 是 5 和 7 的倍數,而是 3 的倍數多 1,所以用R3去乘仍是 5 和 7 的倍數,而是三的倍數多R3
(二)21 是 7 和 3 的倍數,而是 5 的倍數多 1,所以用R5去乘仍是 7 和 3 的倍數,而是 5 的倍數多R5
(三)15 是 3 和 5 的倍數,而是 7 的倍數多 1,所以用R7去乘仍是 3 和 5 的倍數,而是 7 的倍數多R7
(四)所以這三項相加,就 3 說,是
70 x R3 + 21 x R5 + 15 x R7
= 3的倍數 + R3 + 3的倍數 + 3的倍數
= 3的倍數 + R3
若用 3 去除,所得的餘數正是R3。就 5 說,是

70 x R3 + 21 x R5 + 15 x R7
= 5的倍數 + 5的倍數 + R5 + 5的倍數
= 5的倍數 + R5
若用 5 去除,所得的餘數正是R5。就 7 說,是
70 x R3 + 21 x R5 + 15 x R7
= 7的倍數 + 7的倍數 + 7的倍數 + R7
= 7的倍數 + R7
若用 7 去除,所得的餘數正是R7

這就可以證明我們如法泡製出來的數是合題的。至於在比 105 大的時候,要減去牠的倍數,使得數小於 105,這只因為適合於題目的答數本來無窮,只得取最小的一個做代表的緣故。105 本是 3、5、7 的最小公倍數,在這最小的答數上加入牠的倍數,這是和除得的餘數無關係的。

經過這樣的證明,我們可以承認上面的算法是對了。但這還不夠;我們第二要問,那 70、21 和 15 三個數含有怎樣的性質?

70 是 5 和 7 的公倍數,而 21 是 7 和 3 的最小公倍數,15 是 3 和 5 的最小公倍數,為什麼兩個是最小公倍數而他一個卻只是公倍數呢?

這個問題並不難回答,因為 21 用 5 除,15 用 7 除都恰好剩 1,而 5 和 7 的最小公倍數 35 用 3 除卻剩的是 2,要 70 用 3 除纔剩 1。所以這個解法的要點是,要求出三個數來,每一個都是三個除數中的兩個的公倍數——最小公倍數是碰巧的——而同時是其他一個除數的倍數多一。

「求一術」


這樣,就到了第三步,我要問合於這種條件的數怎樣求法?

這里且將黄中憲所編《求一術通解》裏面的方法摘抄在下面,我們來認識認識中國數學書的面目,也是一件趣事。

「三位泛母俱是數根,不可析,即為定母。連乘之,得一零五為衍母。以一行三除之,得三十五為一行衍數;以二行定母五除之,得二十一為二行衍數;以三行定母七除之,得一十五為三行衍數。」

這里所謂泛母,用不到解釋,便可明白;析母就是將泛母分成質因數。至於定母便是各泛母所單獨含有的質因數的積。若是有一個質因數是兩個以上的泛母所共有的,那末只是含這個質因數的個數最多的泛母用牠;若是兩個泛母所含這質因數的個數相同,那末隨便在那一個泛母用牠都可以——注意後面的另一個例——衍母是各定母的連乘積,也就是各泛母的最小公倍數,衍數是用定母除衍母所得的商。

得了定母和衍數,就可以求乘率。所謂乘率便是乘了衍數所得的積恰等於泛母的倍數多一的數;而這個乘積稱為用數。求乘率的方法,在《求一術通解》裏面是這樣說的:

「列定母於右行,列衍數於左行(左角上預寄一數),輾轉累減,至衍數餘一為止,視左角上寄數為乘率。

「按兩數相減,必以少數為法,多數為實;其法上無寄數者,不論減若干次,減餘數上仍以一為寄數 (1);其實上無寄數者,減餘數上以所減次數為寄數 (2);其法實上俱有寄數者,視累減若干次,以法上寄數亦累加若干次於實上寄數中 (3);即得減餘數上之寄數矣。」

照這個法則我們來求所要的各乘率,為了容易明白,我將原式的中國數碼改成了亞拉伯數字:


依原書所說,是用累減法,但累減便是除,為什麼不老老實實地說除,而要說是累減呢?這個理由是因為最後衍數這一行必要保留一個餘數一 —— 所以即使除得盡也不許除盡;因此說除不如說累減來得統一。但我們這時要說明,還是用除好些。我們就用除法來檢查這個計算法。如第一式,衍數 35 左角上的 1,就是所謂預寄的一數,表示用一個衍數的意思。因為定母 3 比衍數 35 小,用 3(法)去除 35(實)得 11 剩 2;照 (1) 法上無寄數,仍以 1 為餘數 2 的寄數,所以 2 的左角上寫 1。接着以 2(法)除 3(實)得 1(商)剩 1;照 (2) 實上無寄數以所減次數(即商數)為餘數的寄數,所以 1 的右角上還是 1。再用這 1(法)去除 2(實),本來是除得盡的,但應當保留餘數 1,因此只能商 1 而剩 1。照 (3) 法實都有寄數,應當以商數 1 乘法數 1 的寄數 1 加上實數 2 的寄數 1 得 2 為餘數 1 的寄數,而牠便是乘率。

第一次的餘數:2 = 35 - 3 x 11
第二次的餘數:1 = 3 - 2 × 1
= 3 - 第一次的餘數 × 1
= 3 - ( 35 - 3 x 11 ) × 1
第三次的餘數:1 = 2 - 1 x 1
= 第一次的餘數 - 第二次的餘數 × 1
= 35 - 3 x 11 - [ 3 - ( 35 - 3 x 11 ) × 1 ] × 1
= 35 - 3 x 11 -  3 + 35 × 1  × 1 - 3 x 11
= 35 x ( 1 + 1  × 1) - 3 x ( 11 + 1 + 11 )
= 35 x 2 - 3 x 23
就是:3 x 23 = 35 x 2 - 1
∴ (35x2÷ 3  = 23 餘 1

上式中紅2表示所求得的乘率,橙色1和青色1分別表示第二次的寄數和第三次的商數。你看這求法多末巧妙!(編注:原書算式部份有誤,這裏作了最基本的修正。另利用網頁的彩色字體,取代原來的粗體和符號標記,說明只相應略作調整,儘量保持原文意思。)

現在用代數的方法一般証明如下.......(編注:証明部份在這裏省略,詳情請看原著。)

有了乘率,將牠去乘衍數就得用數,上面已經證明了。所以在本例題,三、五和七的用數相應地便是七十 (35 x 2) 、二十一 (21x1) 和一十五 (15x1)。


楊輝的「剪管術」中,同樣的題目有好幾個,試取兩個照樣演算於下。

 例題甲


 七數剩一,八數剩二,九數剩三;問本數幾何?

(一)求衍數


(二)求乘率


(三)求用數,就是將相應的乘率去乘衍數,所以七、八、九的用數相應地為二百八十八(72X4),四百四十一 (63x7) 和二百八十 (56 x 5)。

(四)求本數,就是將各除數所除得的剩餘相應地乘各用數,而將這三個乘積加起 來。倘若這所得的和比七、八、九的最小公倍數五百零四大,就將五百零四的倍數減去,也就是用這最小公倍數除所得的和而求餘數。

因而 288 x 1 + 441 x 2 + 280 x 3= 288 + 882 + 840
= 2010
2010 ÷ 504= 3 餘 498

所以四百九十八便是本數。

例題乙


二數餘一,五數餘二,七數餘三,九數餘四,問元總數幾何?

(一)求衍數


(二)求乘率
(三)求用數
2 的 .......... 315 x 1 = 315
5 的 .......... 126 x 1 = 126
7 的 .......... 90 x 6 = 540
9 的 .......... 70 x 4 = 280

(四)求本數

315 x 1 + 126 x 2 + 540 x 3 + 280 x 4= 315 + 252 + 1620 + 1120
= 3307
3307 ÷ 630= 5 餘 157

所以元總數是一百五十七。

例題丙


再由《求一術通解》上取一個較複雜的例,那更可以看明白這類題的算法了 。

「今有數不知總:以五累滅之,無賸;以七百一十五累減之,賸一十;以二百四十七累減之,賸一百四十;以三百九十一累減之,賸二百四十五;以一百八十七累減之,賸一百零九。問總數若干?

「答一萬零二十。」

(一)求衍數


(二)求乘率


(三)求用數
715 的 .......... 96577 x 18 = 1738386
247 的 .......... 215056 x 139 = 2989195
391 的 .......... 13585 x 43 = 584155

(四)求總數

1738386 x 10 + 2989195 x 140 + 584155 x 245

= 17383860 + 418487300 + 143117974 
= 578989135
578989135 ÷ 5311735= 109 餘 10020

這個計算所要注意的就是「廢位」;第一行的析母 5,第二行也有,第二行已用了(粗體數字就是表示採用的意思),所以第一行可廢去。又第五行的 11 和 17,一個已用在第二行,一個已用在第四行,所以這一行也廢去。前面已經說過兩個泛母若有相同的質因數而且所含的個數相同,無論在那個泛母採用都可以的,因此上面的求衍數只是方法中的一種,在《求一術通解》裏,就附有每種採用法的表(見下),比較起來這一種實在是最簡單的了。(表中的 O 表示廢位)

由這幾個例,可以看出韓信的點兵不限於三三、五五、七七地數。在中國的舊數學上,「大衍求一術」還有不少的應用,不過在這篇短文裏卻講不到了。

到了這一步,我們可以問「 韓信點兵這類的問題在西洋數學中怎樣解決呢?」

代數解法


要回答這個問題,你先要記起代數中聯立方程式的解法來..........(編按:省略解釋聯立方程式部份)..........我們就用韓信點兵的問題來做例吧。

設三三數所數的次數為 x,五五數所數的次數為 y,七七數所數的次數為 z;而原數為 N,則
N = 3x + 2 = 5y + 3 = 7z + 2
∴ 3x + 2 = 5v + 3 ...... (1), 3x + 2 = 7z + 2 ...... (2)
這有三個未知數而只有兩個方程式,但我們應當注意,x,y,z 都必須是正整數,這便是一個附帶的條件,

由 (1):
因為 x 和 z 是正整數,所以  雖是一個分數的形式,也必須是整數。設牠是 α,那末


因為 y 和 α 都是整數,所以 也必須是整數。設牠是 β,則

而 N = 3x + 2 = 3 (5β + 2) + 2 = 15β + 8

由 (2)    15β + 8 = 7z + 2,    ∴ 7z = 15β + 6,
因為 z 和 β 都是整數,所以 也必須是整數,設牠是 γ,則



現在 γ 旣是整數,而且不能是負的,因為牠若是負的,N 也便是負的,對於題目說便沒有意義了。所以 γ 至少須是 1,而

N = 105 - 82 = 23

自然 γ 可以是 2, 3, 4, 5, 6, ......而 N 隨着便是 128, 233, 338, 443, 548 ......但 N 的值雖無窮卻有一個限制。

.......(編注:原文這裏轉談代數方程式的其它技巧,於此從略)......

中國的老方法和現在我們所學的新法兩相比較,究竟那一種好些,這雖很難說,但由此可以知道,一個問題的解法決不只是一種。當學習數學的時候,能夠注意別人的算法以及自己另闢蹊徑去走,都是有興味而且有益處的。中國的「求一術」不但在中國數學史上佔着很重要的位置,若能發揮光大,正有不少的問題可以研究。


 
👉👉👉網上閱讀原書

沒有留言:

發佈留言