同構——程式設計中的數學

劉新宇發表於2019-05-12

我講一個從馬爺爺那裡聽來的故事。有一年春節的時候,北京地壇公園的廟會裡人山人海,小朋友們拿著壓歲錢在各種攤位上買自己喜歡的玩具。有一個攤位上圍了一群人。地上一字排開擺了九個小玩具,每個玩具上依次貼著一元、二元、三元……直到九元的標籤。攤主一邊向大家吆喝,一邊講解遊戲規則:“大家快來玩套圈遊戲!一次一元錢,你扔一個,我扔一個,一個玩具只能套一個圈。你要是有三個套中的玩具加到一起值十五元,就可以把玩具都贏走。”

|中國結 | 風車 | 不倒翁 | 孫悟空面具 | 小豬存錢罐 | 九連環 | 汽車 | 兔爺 | 走馬燈 |
|  1   |  2  |   3   |     4    |     5     |   6   |  7  |  8   |   9   |

有個小男孩掏出一元錢,拿了一個紅色的圈,使勁一扔。真準!正好套在了七塊錢的玩具汽車上,攤主拿出一個藍色的圈,一下子套中了八塊錢的兔爺。

|中國結 | 風車 | 不倒翁 | 孫悟空面具 | 小豬存錢罐 | 九連環 | 汽車 | 兔爺 | 走馬燈 |
|  1   |  2  |   3   |     4     |    5     |    6  | [7] | (8)  |   9   |

小男孩又花了一元錢,這次他套中了價值兩元的一個風車,這樣只要他下次再套中那個六元的九連環就贏了。可這次攤主不慌不忙地套住了那隻九連環。

|中國結 | 風車 | 不倒翁 | 孫悟空面具 | 小豬存錢罐 | 九連環 | 汽車 | 兔爺 | 走馬燈 |
|  1   | [2] |   3   |     4     |    5     |  (6)  | [7] | (8)  |   9   |

這下可糟了,如果接下來攤主再套中那個一元錢的中國結,小男孩就要輸了。小男孩漲紅了臉,只能搶先去套那個中國結,他試了兩次終於套中了。

|中國結 | 風車 | 不倒翁 | 孫悟空面具 | 小豬存錢罐 | 九連環 | 汽車 | 兔爺 | 走馬燈 |
|  [1] | [2] |   3   |     4     |    5     |  (6)  | [7] | (8)  |  9   |

攤主接下來扔了一個圈,套住了四元錢的孫悟空面具。小男孩套住了五元錢的小豬存錢罐。

|中國結 | 風車 | 不倒翁 | 孫悟空面具 | 小豬存錢罐 | 九連環 | 汽車 | 兔爺 | 走馬燈 |
| [1]  | [2] |   3    |   (4)   |   [5]    |  (6)  |  [7]  | (8) |  9  |

但是攤主扔出一個圈,套住了三元的不倒翁。由於3 + 4 + 8 = 15,小男孩輸了。

|中國結 | 風車 | 不倒翁 | 孫悟空面具 | 小豬存錢罐 | 九連環 | 汽車 | 兔爺 | 走馬燈 |
| [1]  | [2] |  (3)  |   (4)   |   [5]    |  (6)  |  [7]  | (8)  |   9  |

周圍的人看著很好玩,也紛紛掏錢套圈玩。馬爺爺看了一陣,覺得很奇怪,大多數情況下都是攤主贏,偶爾會平局。馬爺爺懷疑攤主一定有什麼祕密,他只是為了避免人們懷疑,有時才故意輸掉遊戲。

馬爺爺回到家,電視里正在講中國古老的《河圖洛書》,據說在文字尚未發明之前,伏羲治理天下的時候,在黃河支流,有烏龜揹負著神祕的圖案爬上岸來。如果把圖案中的圓點數目用現代的方法表示出來,就是一個數學上的三階幻方。

enter image description here

-------------
| 4 | 9 | 2 |
-------------
| 3 | 5 | 7 |
-------------
| 8 | 1 | 6 |
-------------

可別被這個名字嚇到,就是方形的九個格子裡每行、每列、兩個對角線上的三個數字加起來都相等,都等於十五。例如第一行的數字相加是4 + 9 + 2 = 15,第三列的數字相加是2 + 7 + 6 = 15,左上右下的對角線的數字相加是4 + 5 + 6 = 15。等一等——馬爺爺想,我現在知道廟會裡套圈遊戲背後的祕密了。如果要套中的三個玩具加起來等於十五元,那麼就相當於套中了幻方的一行、一列、或一個對角線。如果攤主在櫃檯裡偷偷藏一張三階幻方的圖,那麼他實際上相當於在和遊人玩俗稱“一條龍”的井字棋遊戲。

X |   | O
----------
X | X |
----------
O | X | O

廟會中那個小男孩和攤主的套圈遊戲相當於下面的井字棋對局。攤主在關鍵的第三步中給小男孩設定了一個陷阱,他在第一列上和一個對角線上同時可能連成直線,如果小男孩套中3,則攤主套中5依然能贏。如果瞭解過博弈遊戲,或者知道一點程式設計,你就知道井字棋遊戲沒有必勝的策略,如果遊戲雙方都足夠小心,結果一定是平局。偷偷擁有三階幻方圖的攤主這樣就站在了不敗的地位上,而其他遊客一無所知。

  |   |  
----------
  |   | X 
----------
O |   |  

第一步,男孩套中7,攤主套中8

  |   | X
----------
  |   | X 
----------
O |   | O

第二步,男孩套中2,攤主套中6

O |   | X
----------
  |   | X 
----------
O | X | O

第三步,男孩套中1,攤主套中4

O |   | X
----------
O | X | X 
----------
O | X | O

第四步,男孩套中5,攤主套中3,攤主勝

這個故事是真的麼?當然不是,馬爺爺是個虛構的人物,他在真實世界中名叫馬丁.加德納——舉世聞名的美國趣味數學大師。這個故事來自他的《啊哈!靈機一動》。故事不是發生在北京的地壇公園,而是美國的鄉村小鎮。攤主名叫卡內,而玩遊戲的小男孩實際是一位女士。這個遊戲也不是中國傳統的套圈遊戲,而是用硬幣蓋住一排數字。

這個故事和其中所講的遊戲不斷在說著一個重要的概念——同構。一行九個數字和三行三列的格子同構,相加等於15的目標與行、列、對角線同構,古老的《洛書》和數學幻方同構,馬爺爺和加德納同構,中國的春節廟會和美國鄉村遊樂同構……這其實也是本書想傳達的概念,程式設計和數學同構,和藝術同構,和音樂同構。偉大的發現背後有曲折的故事和性格迥異的數學家。

這個故事還有一層隱喻,問題的表象下隱藏著和它同構的理論實質,我們需要了解抽象的本質而不被具體的現象矇住眼睛。在人工智慧和機器學習日新月異的今天,我們能否還靠著一點點聰明和工程實踐繼續前行?我們是否要開啟那些神祕的黑盒子找到那個指引我們前進的地圖?

同構——程式設計中的數學》中文版已可以從github上下載:https://github.com/liuxinyu95/unplugged

二零一九年五月於北京

enter image description here

相關文章