「數學並不是只有在課本上的教學順序,祖母教給我的數學觀念,是不證自明的公理。」
大慶成(商)號,登記住址是花蓮縣新城鄉嘉里村四九二號。
064年12月08日 設立,營業項目: 什貨零售。
這是我童年的座標原點,也是數學啟蒙的第一間教室。
其實這間雜貨店在民國45年左右就存在了,那是我祖父母搬離花蓮市區後,在嘉里村軍營邊上靠著雜貨買賣營生。時至今日,軍營應該已經財測,而家前面的八零五醫院實際上是我出生後才遷至現地。
那是典型的台灣傳統雜貨店,印象中甚麼生活用品都有。
不像小說中看過,說這樣的店空氣中總是混雜著醃漬醬菜、味噌與米袋穀物香氣,我的印象是老舊竹架與木櫃上有酒、罐頭,各種小袋裝胡椒或咖哩調味,森永牛奶糖,幾罐被稱作多洛普西 (drops)的圓形糖果等等等。
在那個沒有條碼掃描器、收銀機的年代,這家店的運作全靠兩個大腦、算盤和秤。
祖父會操作傳統算盤。珠算——利用算珠的四則運算規則,得到計算結果。伴隨著劈哩啪啦的撥珠聲以及操作,別有一種當場可以看到重複運算的展示效果。
而我的祖母周安妹(或者該說朱安妹?這又是另一個故事。)採用的計算方法則截然不同。她不識字,沒上過一天學,不偏好使用算盤。
但在我的記憶裡,祖母才是那台隱藏在雜貨店裡的超級電腦。
湊十法的魔術
雖然絕大多數的客人一次購買的物件都不多,畢竟都是住在附近的鄰居。但每每遇到有人購買比較多品項的雜貨:可能是瓶醬油、鹽、糖、幾種罐頭、郵票,再加上零食,櫃台上堆滿了雜七雜八的商品,就像是一道未經整理的算術題。
如果按照學校老師教的方法,或是祖父的算盤,計算過程是從左到右,按照順序,
3 + 1 + 2.5 + 20 + 5 + 2 + 6 + … (我小時候的計價還有使用一角,那是一元的十分之一)。
祖父會撥一下算盤,記住一個數,再加下一個。這樣計算很穩妥,但很慢。
祖母的方法卻像是一場魔術。她會用那雙瘦細的手,在櫃台上快速移動商品。不急著加總,而是先分類。
她可能會把那包 4 元的餅乾和 6 元的糖果(三個2元)撥到一堆(4+6=10);把 2 元的火柴盒和 8 元的醋放在一起 (2+8=10)。她的嘴裡念念有詞,不單單是數字,那過程像是在唸詩。(容許我客語能力有限,寫不出全文發音聲韻)
「這兩個湊十塊,那邊三個拿過來也是十塊,這罐大的二十...」
我們在學習數學的過程中,一開始也是從具體感官文字敘述,到半具體圖像,再到抽象符號的操作。我祖母應該不知道"抽象"這個字的具體意義就是"抽取特徵"以及"簡化"。但轉眼間,凌亂的數字被她重組成了整齊的”十底”。
原本繁雜的連加法,被她簡化成了幾個整數的加總。
20 + 10 + 10 + ...
在祖父可能還在撥最後幾顆算珠時,祖母通常已經用念的,笑瞇瞇地報出了總數:「一共五十三塊半。(只是舉例。上面的數學式例子算起來是39塊半,請不要懷疑我祖母算錯了。)」
他們的分工使得兩人同時算帳的場面是很少見到,但我保證祖母在計算上絕對是比較快,一樣正確。
演算法的智慧
當時年幼的我,覺得祖母好厲害。
直到多年後,當我對數學有更深一點的認識,才驚訝地發現祖母用的正是現代電腦科學中最核心的概念——演算法 (Algorithm)。
在數學教科書裡,提到「結合律 (Associative Law)」與「交換律 (Commutative Law)」。
公式直觀但寫起來冷冰冰的: (A + B) + C = A + (B + C)。
在祖母的雜貨店裡,這條定律是活的。她知道,計算的順序並不影響結果,但聰明的順序可以大幅降低大腦的負擔(降低運算複雜度)。她將計算繁多的流水帳,轉換成容易處理的「湊十」模組。
這不就是電腦程式最佳化 (Optimization) (此處只以提升執行計算速度一點來看)嗎?
再複雜一點,就是代數結構---群,環,體的範疇了。
大石頭先裝桶
祖母的計算思維不僅用在結帳,也用在物品的裝袋上。
看祖母裝袋也是充滿驚奇。她絕不會隨便把客人的物品直接丟進國民提袋--紅白塑膠袋或台灣LV ( 茄芷袋)內。她總是先拿起最大的物件——比如沉甸甸的醬油,紙袋奶粉或大包的衛生紙——先「坐底」。接著,她會將小包的味精、糖果,見縫插針地塞進大物件旁的空隙裡,最後是不能重壓的雞蛋那類商品。
「大的先下去,小的自然有地方去。」我想像祖母應該曾這樣隨口說過。
在數學上,這是經典的「裝箱問題 (Bin Packing Problem)」。如果先放小東西,袋子的底部會變得凹凸不平,大東西就放不穩,空間也浪費了。祖母沒學過幾何,但她的直覺或經驗,是幾乎等效地達到空間利用的最佳解。
這有個類似的寓言,人生瓶子實驗(Glass Jar of Life),廣泛應用於勵志演講。最初的文字記錄已難以考證,通常是一位教授向學生示範「如何用高爾夫球、碎石子、細沙和啤酒裝滿玻璃瓶」。 若先把沙子(瑣事)裝滿,就裝不下高爾夫球(最重要的事)。人生應先專注核心事物,討論了時間管理與人生優先順序
雞兔同籠
祖母的算術不只能應用在流動的貨幣,有時甚至能解決小學生初遇的難題。
某個週六下午(以前還要上半天課)。我坐在祖父的竹編椅子上,趴著算錢的櫃台寫作業(或者是在某個課外讀物上的題目)。這應該是人生第一次遇到雞兔同籠問題。記憶中是祖母(或母親)解釋了這個問題。 (為了維持敘事一貫性,我把這個啟發歸功給祖母)。
「籠子裡有雞和兔子共 10 隻,數一數腳共有 28 隻。請問雞和兔子各幾隻?」
那時候還沒有學到代數的概念,更不用說是二元一次聯立方程式。大我兩歲的哥哥展示了解出 x,y 的手法,先設 x 和 y,一開始搞得我暈頭轉向。
祖母隨口問道:「什麼題目把你難成這樣?」
「阿婆妳不懂( 「毋」(mˇ)知(diˇ))啦,這是數學。」有點不耐煩,覺得祖母應該也不會解,「這是什麼雞兔同籠,要設未知數的。」
「你唸給我聽聽。」她堅持。
我嘆了口氣,把題目唸了一遍:「雞有兩隻腳,兔子有四隻腳,雞跟兔子一共有10 個頭,28 隻腳。請問有多少雞,多少兔子。」
祖母停下手裡的動作,大概只過了三四秒鐘——比我講完題目的時間還短——她就開口了:
「兔子四隻,雞六隻。」
我嚇了一跳,剛剛偷看過解答。答案正確無誤。
「妳怎麼算的?妳偷看解答?」
祖母笑了,那笑容裡有一種看透世事的狡黠:「這哪要算?你就當作那 10 隻全都是雞嘛!」
她把雞毛撢子當成教鞭,在空中比劃著:「你想想,如果籠子裡那 10 隻都是雞,會有幾隻腳?」
「一隻雞兩隻腳... 10 隻就是 20 隻腳。」我回答。
「對啊。但是題目說地上有 28 隻腳。多出來的 8 隻腳是哪來的?」
我愣了一下:「多出來的...?」
「因為裡面混了兔子啊!」祖母理所當然地說,「每一隻兔子比雞多兩隻腳。現在多出了 8 隻腳,你就把它兩隻、兩隻分給兔子。8 除以 2,不就是 4 隻兔子嗎?」
我看著祖母,嘴巴張得大大的。
在我的算式裡,這是一堆移項和消去法:



但在祖母的腦海裡,這是一個生動的畫面:先把大家都看成一樣(假設全是雞),然後再來分配多出來的資源(腳)。
後來我進了大學唸理工科,祖母這套正是演算法中經典的「假設與修正 (Hypothesis and Correction)」。
電腦在運算複雜問題時,往往先設定一個「初始值」(Initialization,假設全是雞),計算出誤差(Error,多出 8 隻腳),再透過迴圈去修正這個誤差(把雞變成兔子),直到符合條件。
祖母不懂代數,不知道什麼是變數置換。但她懂得簡化,比較差異並解釋之。
祖母的心算能力與數字直覺相當驚人。
即使沒有受過正規教育,腦袋裡裝著比教科書更直觀的數學引擎。
不插電的AI
現在我們談論 AI,談論算力。其實算力不只是計算的速度,更是處理資訊的策略。祖母沒有受過正規教育,她的腦中沒有暫存器(好吧,算是有,因為祖母幾乎可以說是過目不忘),也沒有符號公式。但透過幾十年的生活經驗,在大腦神經網路中訓練出了一套極高效率的模型。
她不懂 A+B=B+A ,但她知道怎麼讓客人最快且正確地付錢。
她不懂拓樸學,但她知道怎麼把最多的東西裝進袋子空間還考慮到攜帶上保全的原因。
祖母過世於2002年,沒能趕上智慧型手機和雲端運算的時代。但在我看來,她那間充滿醬菜味與人情味的雜貨店,就是最早的數據中心。而她,就是那台永不當機、充滿智慧的超級電腦。
這也是我人生中上的第一堂數學課:困難的問題不要硬碰硬,要先把它拆解成容易處理的小單元。
這句話體現了十七世紀法國哲學家笛卡兒(René Descartes)在《談談方法》中提出的「分解法」(分析法),(他應該任為這是一種萬能解法)。在面對複雜問題時,不要硬碰硬,而應將其拆解為若干個容易處理的小單元,逐一解決。此方法是其「懷疑、拆解、驗證、檢視」四步驟中關鍵的「拆解」原則,旨在將複雜事物細分為獨立個體,從而透徹了解問題本質。
-
懷疑(Doubting): 任何事物都從懷疑否定的角度檢視,避免先入為主的想法。
-
拆解(Decomposition): 將整體細分為獨立個體,將困難拆解為容易處理的小單元。
-
驗證(Verification): 從單純到複雜,逐項驗證被拆解的部份,排除疑點。
-
檢視(Review): 重新檢視整體,確認沒有在過程中產生疏失遺漏。
當然, Polya 在如何解題一書中提到的雖然類似,但是用了更多好的例子與技巧來說明,是一本每年都值得再看一次的書。
註解:
-
事實上,算盤的設計對應到計算的規則不同。一種是上二下五(適用於16進位制)跟一五珠(上一下四,適用於十進位制)。
-
除了量測,秤的使用隱含著公平交換的觀點。據說雞兔同籠問題 源自《孫子算經》的卷下第31題是雞兔同籠問題: 「今有雉、兔同籠,上有三十五頭,下九十四足。問雉、兔各幾何?」 這類題目訓練的不是死記公式,而是「先假設,後調整」的邏輯推理能力。
文章定位: