珠算解難:退商法


筆者在上一章介紹了「歸除法」的基本原理,指出這種珠算除法包含「估商」和「減積」這兩個過程,其中「估商」過程是用「九歸歌」估計商數的某一個位,「減積」過程則是從被除數(或其餘下部分)減去剛才估得的商數的某一個位與除數的積(註1)。估計當然有可能出錯,對於不同的錯誤,要使用不同的方法予以糾正。如果商數的某一個位被估低了,那麼在「減積」後被除數的餘下部分必然很大,足以讓我們使用「九歸歌」中的口訣「逢n進一」,使用這個口訣的結果就是把商數調高。可是,如果商數的某一個位被估高了,「九歸歌」中沒有口訣讓我們把商數調低。在這種情況下,我們便要使用「退商法」或「撞歸法」,本章首先介紹「退商法」。

傳統珠算中有專門的「退商法」口訣,但由於這些口訣非常有規律,所以根本無需記憶(註2):

一歸:無除起一下還一
二歸:無除起一下還二
三歸:無除起一下還三
四歸:無除起一下還四
五歸:無除起一下還五
六歸:無除起一下還六
七歸:無除起一下還七
八歸:無除起一下還八
九歸:無除起一下還九

上述口訣可以概括為:對應於「n歸」我們有口訣「無除起一下還n」。這裡n代表除數中的第一個數字,「無除起一」的意思就是,由於當前商數的某一個位被估高了,被除數的餘下部分不足以減去這個高估了的數與除數的積,因此要從這個高估了的數減去1,從而把商數調低。「下還n」的意思則是,由於「估商」過程包含著「減積」的部分操作(見(註1)),把商數估高了便意味著減多了積,現在既然把商數調低1,所以便要在下一檔加n (這個n等於1與除數第一個位的乘積),以補回多減了的積。

以下用4002 / 69為例說明「退商法」的應用。開始時把除數69和被除數4002分別佈在算盤左端和右面,並根據上一章介紹的方法確定商數小數點(即「定位點」)和餘數小數點的位置,如下圖所示:

我們沿用上一章介紹的「歸除法」原理處理b檔,根據除數的第一位(即6)和b檔上的數字(即4)應用「九歸歌」口訣「六四六十四」,把b檔原有的數字4改為6,並在下一檔(即c檔)加4,如下圖所示(請注意這個運算實質上是估計4002 / 69的商數的第一位是6,並同時從被除數4002減去60 × 60 = 3600):

可是上述運算把商估高了,因為4002 / 69的商數的第一位應是5而非6。事實上,接下來當我們要進行「減積」時,便會發現問題所在。沿用「歸除法」,計算6 × 9,得54,當我們嘗試把這個積從c、d檔減去時,發現當前的c、d檔只有40,不夠減54,也不能向b檔借位(這是因為當前的b檔是用來記錄商數,所以不能借位給c檔)。這時我們便要運用口訣「無除起一下還六」,從b檔減1,並在c檔加6,如下圖所示(這實質上是把原來高估了的商數第一位從6調低至5,並同時補回剛才多減了的積600 (註3)。另請注意這裡我們要應用c檔下方最底的算珠,不能進位至b檔,這是因為當前的b檔和c檔是分別用來記錄商數和被除數的餘下部分):

接下來進行「減積」。計算5 × 9,得45,把這個積從c、d檔減去,如下圖所示(請注意這個運算實質上是從被除數的餘下部分減去50 × 9 = 450):

至此我們已完成對b檔的「估商」和「減積」過程。接著處理c檔,其方法跟上一章介紹的方法完全相同,讀者應不難自行完成計算並算出4002 / 69 = 58。

在某些情況下,我們需要連續運用「退商法」口訣數次,才能把高估了的商數調低至正確的數值。以下用1015 / 29為例以作說明。開始時先在算盤上佈數,如下圖所示:

首先處理b檔,根據除數的第一位(即2)和b檔上的數字(即1)應用口訣「二一添作五」,把b檔原有的數字1改為5,如下圖所示(請注意這個運算實質上是估計1015 / 29的商數的第一位是5,並同時從被除數1015減去50 × 20 = 1000):

接下來當我們要進行「減積」,嘗試從c、d檔減去5 × 9 = 45時,便發現當前的c、d檔只有1,不夠減45,也不能向b檔借位。這時我們便要運用口訣「無除起一下還二」,從b檔減1,並在c檔加2,如下圖所示(這實質上是把原來高估了的商數第一位從5調低至4,並同時補回剛才多減了的積200):

接下來當我們要進行「減積」,嘗試從c、d檔減去4 × 9 = 36時,便發現當前的c、d檔只有21,仍然不夠減36。這時我們便要再次運用口訣「無除起一下還二」,從b檔減1,並在c檔加2,如下圖所示(這實質上是把原來高估了的商數第一位從4再調低至3,並同時補回剛才多減了的積200):

經連續兩次使用「退商法」口訣後,我們終於得到正確的商數,可以順利進行「減積」過程了(註4)。計算3 × 9,得27,把這個積從c、d檔減去,如下圖所示(請注意這個運算實質上是從被除數的餘下部分減去30 × 9 = 270):

至此我們已完成對b檔的「估商」和「減積」過程,接下來讀者應不難自行處理c檔,並算出1015 / 29 = 35。

在某些情況下,尤其是當除數位數頗多時,難以準確判斷是否需要退商,常常是在進行「減積」過程的中途,已減去商數某一位與除數首k個位的乘積後,才發現被除數的餘下部分不夠減。這時我們便要運用「中途退商法」,其口訣是一般「退商法」口訣的推廣:「無除起一下還n1...nk」,其中「n1...nk」代表除數的首k位數字。根據這個口訣,我們把商數減1,並在其後的k檔加上n1...nk。這個運算的實質就是把原來高估了的商數調低1,並且在被除數的餘下部分補回多減了的積。完成了上述「中途退商」過程後,接著便用新的商數繼續進行未完成的「減積」過程。

以下用2050328 / 683479為例以作說明。為作比較,首先看看如何用直式進行這個除法:

用直式進行上述除法沒有「退商」的問題,這是因為我們通常會以心算評估某個估得的商是否適合。如果估得的商不適合,便改試另一個商,直至估得的商適合,才把計算結果寫下來。

跟筆算不同,珠算力求做到「機械化」,讓計算者無需依賴心算來估商,以下讓我們看看如何用算盤進行上述除法。開始時先在算盤上佈數,如下圖所示:

首先處理b檔,根據除數的第一位(即6)和b檔上的數字(即2)應用口訣「六二三十二」,把b檔原有的數字2改為3,並在下一檔(即c檔)加2。接下來進行「減積」過程,先計算3 × 8,得24,把這個積從c、d檔減去;接著計算3 × 3,得9,把這個積從d、e檔減去;再接著計算3 × 4,得12,把這個積從e、f檔減去。以上運算都能順利進行,其中間結果如下圖所示(請注意以上運算實質上是估計2050328 / 683479的商數的第一位是3,並已從被除數2050328減去3 × 683400 = 2050200):

但接下來當我們嘗試從f、g檔減去3 × 7 = 21時,便發現當前的f、g檔只有12,不夠減21,也不能向b檔借位。這時我們便要運用「中途退商法」口訣「無除起一下還六八三四」,即從b檔減1,並在c至f檔加6834,如下圖所示(這實質上是把原來高估了的商數第一位從3調低至2,並同時補回剛才多減了的積683400):

完成了上述「中途退商」過程後,接著便用新的商數2繼續進行未完成的「減積」過程。計算2 × 7,得14,把這個積從f、g檔減去;接著計算2 × 9,得18,把這個積從g、h檔減去,如下圖所示(請注意上述運算實質上是從被除數的餘下部分減去2 × 79 = 158):

至此我們已完成對b檔的「估商」和「減積」過程,上圖顯示2050328 / 683479 = 2..683370,跟直式除法的結果吻合。

註1:嚴格地說,「估商」和「減積」並非截然分開的過程,而是「估商」過程已包含了「減積」的部分操作,這是因為當我們運用「九歸歌」時,實際上不只求商,而且還同時從被除數的餘下部分減去這個商與除數的第一個位的乘積。有關詳情請參閱上一章。

註2:這些口訣中的「起」字亦有作「退」字者,例如「無除退一下還一」。

註3:在使用口訣「六四六十四」時,我們是基於高估了的商數第一位從被除數減去了60 × 60 = 3600。但根據調低了的商數第一位,我們實應減去50 × 60 = 3000,所以應補回600。

註4:有時我們可能可以預先估計到應連續多次使用「退商法」口訣,這時便可以把多個「退商法」口訣合併為一個口訣,例如兩個「無除起一下還二」便可以合併為「無除起二下還四」。總括而言,「退商法」口訣可以概括為「無除起k下還n × k」(當然這裡的n × k不能太大)。不過,由於傳統的珠算是力求做到「機械化」,讓計算者無需預先估計後面將要使用甚麼口訣,所以上述合併口訣通當派不上用場。



返回數學專題
<script type="text/javascript">(function (d, w) {var x = d.getElementsByTagName('SCRIPT')[0];var f = function () {var s = d.createElement('SCRIPT');s.type = 'text/javascript';s.async = true;s.src = "//np.lexity.com/embed/YW/be0aa169de7f441c6473361be62c9ef6?id=ddad453e7753";x.parentNode.insertBefore(s, x);};w.attachEvent ? w.attachEvent('onload',f) :w.addEventListener('load',f,false);}(document, window));</script>