Scratch & Math: 不能說的祕密(二)

Peter Wei
17 min readMay 6, 2017

--

沒有人想得到一個看似簡單的正方形對角線問題卻徹底粉碎了畢達哥拉斯學派的數學宇宙論,而純粹的數學計算竟然引來了殺身之禍!這是一個發生在古希臘著名的謀殺事件,發現這個數學祕密的人也從此改變了全世界。在這一章裡我們會用Scratch來深入瞭解正方形的對角線長度問題,也就是著名的畢氏定理計算。

數學關鍵字: 畢氏定理、有理數、無數數。

數學家: 畢達哥拉斯、希帕索斯、趙爽、愛因斯坦。

程式關鍵字: 變數的可視範圍、 模組化程式設計。

Scratch程式:https://scratch.mit.edu/projects/159323304/

不能說的祕密

故事要從畢達哥拉斯和畢氏定理說起。

畢達哥拉斯發現並證明了直角三角形三個邊長之間的關係:兩個直角邊邊長的平方和等於斜邊長的平方。這就是著名的畢氏定理。

如果直角三角形的兩條直角邊長為a和b,斜邊長為c,畢氏定理用數學式表達就會是下面的式子:

(取自維基百科Pythagorean_theorem CC BY-SA 3.0

相傳在西元前一千多年的中國周公與商高的對話中就有談到如何計算直角三角形的三個邊長,在中國被稱為「勾股定理」。古埃及西元前兩千六百年前的紙莎草和古巴比倫的泥板也都有相關的記載。研究數學的歷史會發現,對於畢氏定理的證明方法五花八門大約有四百種,應該是有證明方法最多的數學問題。

現在有一個等邊直角三角形,直角的兩邊相等而且長度都為1,我們想要計算斜邊c的長度。

根據畢氏定理,計算出c的平方等於2,

c的平方等於2,要求c的值就要引入一個新的數學定義叫做開根號。在這個例子裡c的值要對2開根號,求得2的平方根,數學記號記成:

那麼2的平方根究竟是多少呢?

我們先用根號的定義來列出幾條算式,

前面提過畢達哥拉斯學派認為宇宙是由整數所構成,2的平方根介於1和2之間,就不是一個整數。所以他們發明了比例的概念,同時認為如果一個數不是整數,那就會是一個整數的比例。

依照這個邏輯推論可以得到一個關係式,

繼續推導下去可以得到,

還記得畢達哥拉斯最愛的活動就是在地上排列小卵石嗎?最後這個方程式就可以想成有一個小卵石排成的平方數層數為m,可以分解排列為另外兩個層數都為n的平方數排列。

由最小的平方數開始排成一個數列就是1,4,9,16,25…

我們先設定m=9。9顆小卵石可以排成一個三層的平方數,但是能不能排成兩個同樣大小的平方數呢?

實際排列一下看起來是不可能的,9顆小卵石可以排成兩個各二層的平方數,但是會有1顆多餘的小卵石沒有用到。

那再來看看16顆小卵石的情況,

16顆小卵石可以排成一個四層的平方數。如果排成兩個三層的平方數,會不夠2顆小卵石。

看起來即使數目變多,結果都是一樣的。小卵石的排列說明了一個較大的平方數排列,沒有辦法完美地分解成兩個較小的平方數排列,而一定會留下幾顆零星的小卵石排不進去。

倒推回去,我們得到了和之前假設完全相反的結論,

結論就是2的平方根不可能是一個完美的整數比值,在數學上被稱為不可共度的 (incommensurable)。

畢達哥拉斯的學生希帕索斯(Hippasus)就推導出了這個結論:在宇宙中有些數是整數,有些數是整數的比值,但有些數既不是整數,也不是整數的比值,是不可共度的。

這是一個動搖國本的結論。要知道畢達哥拉斯主張構成線段的點是有大小的,假設一個具備大小的點長度為d,d是一個大於0的數,所以任何兩條線段的長度就可以寫成,

於是,

這也就是說,宇宙間的萬物都可以由兩個大於0的整數比值構成,是可共度的(commensurable)。

希帕索斯, 西元前六世紀的古希臘數學家,畢達哥拉斯的學生,發現了無理數。

現在希帕索斯說,有一種數不可能是整數的比值。畢達哥拉斯畢生鑽研的宇宙觀瞬間崩解,不復存在。

畢達哥拉斯學派崇拜以數為主體的思想,混合了神祕的敬神和禁忌儀式。

希帕索斯身為畢達哥拉斯學派的一員,發過誓遵守導師的教誨。他的發現得罪了神祇,神諭將希帕索斯淹沒水中。

希帕索斯的發現並沒有就此被淹沒,日後歐幾里得到亞里斯多德,都接納了他的發現,也就是推翻了點是有大小的觀點,替之以點是不具大小的概念。

在日後發展的數字系統裡,一個可以表示成整數比的數,被稱為有理數(rational number),例如:

反之一個數如果無法表示成整數比,這個數就被稱之為無理數(irrational number),例如:

破世界紀錄的畢氏定理證明

根據健力士世界的紀錄,畢氏定理是世界上最多證明方法的定理。美國的數學家盧米斯(Loomis)在1940年出版了「畢達哥拉斯命題(The Pythagorean Proposition)」一書,裡面蒐集了370種畢氏定理的證明法,蒐集了古希臘時歐幾里得的證明、古印度的證明、古中國的勾股定理證明、近代萊布尼茲的證明。除了這些古今中外的數學家證明過畢氏定理外,書中還收錄了1881年的美國總統加菲爾德(James Garfield)對於畢氏定理的證明方法,加菲爾德也成為唯一一位證明過數學定理的美國總統。

這洋洋灑灑的370種證明方法絕大部分都是以代數法證明(共109種)或是幾何法證明(共255種)。代數法是利用三角形的特性,對直角三角形的直角鄰邊長度平方和做計算,然後逐步化簡為斜邊的平方。幾何法則對直角三角形直角鄰邊畫出幾何面積,進一步設法等價於斜邊畫出的幾何面積。

趙爽的的勾股定理證明

中國古代對於直角三角形的兩個直角鄰邊分別叫做「勾」和「股」,斜邊則稱為「弦」。周代的「周髀算經」有「勾股圓方圖」閳述直角三角形的三邊關係,但是並沒有提出證明。

趙爽是三國時代的數學家,他為「周髀算經」做出詳細注解,同時也解釋並證明了勾股定理。

勾股定理的證明利用四個直角三角形排列成上圖的樣子,會利用面積的相等性導出一條式子,再利用代數運算化簡為直角三角形的邊長關係。

四個三角形排列構成一個菱形,邊長為c,面積為c²。

三角形直角邊邊長分別為a、b,斜邊長為c。三角形面積為(a+b)/2。

四個三角形中間圍成了一個小正方形,正方形的邊長為(a-b),面積為(a-b)²。

從圖中我們可以得知:菱形面積=小正方形面積+四個直角三角形面積。於是可以列出下面的式子,

證明了直角三角形的勾平方加股平方等於弦平方。

愛因斯坦的畢氏定理證明

愛因斯坦12歲的時候得到一本關於幾何的小書,之前他的叔叔和他提到過畢氏定理,因此當愛因斯坦拿到這本小書後便一頭鑽入了幾何的世界,並且試圖獨立地證明畢氏定理。

愛因斯坦畫了如上圖的三角形。事實上這個圖裡有三個直角三角形:三角形ABC,三角形ACD,三角形CBD。

這三個三角形互為相似三角形,例如三角形ABC和三角形ACD 共用角A而且都有一個直角,可以說明三角形ABC和三角形ACD是相似三角形。

相似三角形的邊長有等比例的關係,因為三角形ABC和三角形ACD 為相似三角形,可以列出下面的式子,

再利用三角形ABC和三角形CBD 的相似關係,可以列出式子,

將上面兩個化簡的式子相加可以得到,

經過了許多努力,12歲的愛因斯坦利用直角三角形的相似關係成功地證明了畢氏定理。在他的自傳中描述這是他第一次能夠透過純粹的思考而得到真確的知識,是一次神奇而美妙的經驗。

動手做3–2 以面積減算法證明畢氏定理

[程式設計需求規格]

前面介紹了幾個用代數計算的畢氏定理證明方法,現在我們要用幾何面積的挪移來證明畢氏定理。

下圖左右兩個正方形有相同的邊長(a+b)和相同的面積(a+b)²。

左邊的正方形內有四個面積相等的三角形,每個三角形的面積都是(ab)/2。 。另外有兩個較小的正方形,面積各為a²和b²。

右邊的正方形內也有四個面積相等的三角形,每個三角形的面積同樣都是

。和左邊的圖形相比,四個三角形的擺放位置不一樣,而中間利利用三角形斜邊圍成了一個面積為c²正方形。

由於左右兩個大正方形面積相等,內含的四個三個形面積也都相等。因此我們可以推斷左邊的兩個小正面形面積相加值a²+b² ,會等於右邊內含正方形的面積c²。

我們要用scratch畫出像上圖一樣的圖形,然後移動三角形,製做出面積減算法的動畫。

[程式設計角色和舞台]

在這個程式裡我們維持空白的舞台背景。

角色分為兩大類,第一類是用來畫方框和三角形的小黑點,第二類則是相關的字母標示。

[程式設計解決方案第一部分-畫出中間有面積為c2正方形的圖形]

程式分為兩大部分,第一部分是畫出中間有面積為c2正方形的圖形,第二部分則是依序移動三角形,然後畫出中間有面積為a2和b2正方形的圖形。

每個小黑點的角色各自負責繪製一部分的圖形。

畫方框的部分比較簡單,移動角色方框的小黑點到大正方形四個角的座標就完成了。

三角形由於要著色,我們的解決方案是先將角色三角形的小黑點設定在三角形直角的座標上,然後一條一條描出逐漸縮短的水平線條,直到畫出完整的三角形。

觀念平台:變數的可視範圍(variable scope)角色黑框負責流程控制,會傳遞訊息和資料給其他四個角色三角形。但是四個角色三角形之間並沒有互相傳遞訊息或資料。這五個角色的依存關係可以用下圖來表示,
角色間常常需要透過變數互相傳遞資料,但有些時候我們會希望變數只有某一個特定的角色可以看到和使用,其他角色都不能看到或改變這個變數的值。基於這樣的需求,在製做變數時就要區別變數的可視範圍。以變數方框來說,它的目的是用來設定大正方形大小和每角色的參考點,所以當我們製做新變數的時候會選擇「適用所有的角色」。如此一來,每一個角色都可以看到並且改變變數方框的值。這樣的變數被稱之為全域性變數(global variable)。
每一個角色三角形都會需要變數表示這個角色的座標,但是角色三角形右上的座標值和角色三角形左上的座標值會不一樣,彼此不能混淆。這個時候就需要製做區域性變數(local variable)。
如果勾選變數值顯示在舞台上會很清楚地看到區域性變數前面都會自動被加上角色的名字,而全域性變數則只顯示變數名。例如我們在角色三角形右上勾選變數。舞台上顯示的區域變數就都會被加上三角形右上的字串,來和一般的全域性變數做區別。
有了區域性變數的概念,每一個角色三角形就都可以定義相同名字的變數角色x和角色y,但是彼此不會互相干擾。區域性變數的可視範圍僅止於角色本身,對其他角色而言不屬於自己的區域性變數就像是一個黑盒子,既看不到也不可能去更動變數值。

[程式檢視]

每一個角色三角形都有一個「畫三角形」的客製方塊,例如程式[三角形右上3–2.3]就是一個例子。會設計這樣的客製方塊是想用同樣的方法為每一個三角形著色,程式會讓畫筆從三角形的底端水平移動,每畫一條線就往上或往下移動一個y座標點的距離,同時開始等比例地略略線短畫筆水平移動的距離。

這四個「畫三角形」客製方塊有兩個共同的特點:

  • 每個角色的「畫三角形」客製方塊有相同的輸入介面,分別是三角形的三個點座標。
  • 客製方塊裡面的程式幾乎一模一樣。

也就是說,「畫三角形」客製方塊有點像是一個生產機具,只要輸入不同的變數,就可以穩定而規律地生產我們想要的結果。這樣的一組程式指令就叫做「模組」。

模組的設計就要能讓所有可能的輸入組合透過同樣的程式運算得到同樣的結果。為了達到模組化生產結果的目的,找出所有可能輸入組合間的特性再做歸納是設計模組的關鍵。

我們先觀察如果要對三角形左上和三角形右上著色,會有什麼共通點,

  • 三角形左上和三角形右上底邊都朝上。也就是說,三角形有兩個頂點在上方的同一水平面上,一個頂點在下方。
  • 三角形越往下,畫筆著色的水平移動距離越小。

再來我們列出三角形左上和三角形右上著色時會有什麼不一樣的地方,

  • 三角形左上的直角點座標和三角形右上的直角點座標不一樣。
  • 三角形左上的底邊(最上面的邊)比較短,三角形右上的底邊比較長。
  • 三角形左上斜邊的斜率為正值,三角形右上斜邊的斜率為負值。代表兩個三角形的方向不一樣。
  • 三角形左上斜邊的斜率比較陡,三角形右上斜邊的斜率比較緩,代表兩個三角形畫筆著色水平移動距離縮短的輻度會不一樣。

設計模組的時候,凡是一樣的特性就可以用同樣的程式和演算法表達。而對於不一樣的特性,就要設定不同的變數值或用不同的程式處理。

總結上面對於三角形左上和三角形右上著色的觀察,我們大概可以把模組設計的重點記下來,

  • 三角形左上的直角點座標和三角形右上的直角點座標不一樣。

[解決方法]用不同的區域性變數設定直角點座標。程式[三角形左上3–2.1][三角形右上3–2.1]。

  • 三角形左上的底邊(最上面的邊)比較短,三角形右上的底邊比較長。

[解決方法]用不同的輸入值送給「畫三角形」客製方塊。程式[三角形左上3–2.2][三角形右上3–2.2]。

  • 三角形三角形斜邊的斜率影響畫筆水平移動的距離,程式需要計算斜邊的斜率。
  • 「畫三角形」客製方塊有相同的輸入介面,分別是三角形的三個點座標。

[解決方法]設定輸入的三個座標點有固定的順序,第一個點是直角座標點,第二個點是同一個水平線上的三角形頂點,第三個點是三角形下方的點。如此一來,我們可以固定用下面的程式計算這兩個三角形的斜率:

  • 三角形左上斜邊的斜率為正值,三角形右上斜邊的斜率為負值。代表兩個三角形的方向不一樣。

[解決方法]用點1(直角點)的x座標減去點2(和直角點水平的頂點)x座標來判斷畫筆的方筆順方向。同時計算第一筆的水平移動長度。

  • 三角形越往下,畫筆著色的水平移動距離越小。

[解決方法]設定迴圈,每畫一條水平線就往y移動-1的距離,因此一共移動點2的y座標減掉點3的y座標次。

  • 三角形左上斜邊的斜率比較陡,三角形右上斜邊的斜率比較緩,代表兩個三角形畫筆著色水平移動距離縮短的輻度會不一樣。

[解決方法]由於迴圈每一次都往y移動-1的距離,依照斜率的公式計算每一次x縮短的變化量。

下面的圖是解決方法的示意圖,可以清楚地看到三角形左上和三角形右上輸入三個頂點的順序,和畫筆水平移動的方向。

觀念平台:模組化程式設計模組化程式設計的一個重要目的是想把一個很大的問題切割成較小的問題分開處理,也就是要應用分治法(divide and conquer)的概念。例如在動手做3–2裡我們總共想畫出四個位置不同的三角形,如果用一段程式來畫這四個三角形,程式應該會很長很複雜,程式可讀性低,維護起來也不容易。但是應用模組化程式設計的概念,我們先分析畫三角形的特點,再將「同時畫四個三角形」的問題簡化成「設定一個三角形位置」和「畫一個三角形」兩個模組,整個程式的流程複雜度就會降低,程式也就變得清楚可讀。設計模組的重點在於讓模組的輸入介面維持簡潔,而模組內的資料處理使用區域性變數,儘量保持模組獨立性,不要被主程式和其他的模組影響。

[程式設計解決方案第二部分-移動三角形,畫出中間有面積為a2和b2正方形的圖形

程式解決方案的第一部分完成時,我們會看到一個中間有面積為c2正方形的圖形,

我們的目的是要以移動幾何圖形的方法證明畢氏定理。只要移動三個三角形就可以做出另一個中間有面積為a2和b2兩個正方形的圖形。

我們延續保留所有第一部分的程式,而對下面幾個角色增加新的程式方塊。

[程式檢視]

延續程式解決方案第一部分的模組架構,我們在第二部分主要是移動三角形。

當使用者按下1鍵:移動三角形右上到左下方。

當使用者按下2鍵:移動三角形右下到右上方。

當使用者按下3鍵:移動三角形左上到右上方。

當使用者按下4鍵:標註文字標籤。

每一次都只在x軸或y軸方向移動座標1格的距離,呼叫「畫三角形」客製方塊,並且重畫其他三個三角形,如此一來會有動畫的效果。

變數「移動中」是一個全域性變數,每一個角色都可以看到並修改。當一個三角形在移動的時候會將變數「移動中」設為1,這個時候即使按下數字鍵1、2、3也無法同時移動另一個三角形。

由於畫三角形的計算量大,要記得打開小綠旗turbo模式以加速程式的執行速度。

經過兩部分的程式設計,我們會畫出下面這兩個圖形,用幾何圖形的移動證明畢氏定理。

延伸閱讀:

Scratch & Math: 天花板上的蜘蛛(一) Scratch & Math: 天花板上的蜘蛛(二)

Scratch & Math: 直線裡的宇宙觀(一) Scratch & Math: 直線裡的宇宙觀(二)

Scratch & Math: 不能說的祕密(一) Scratch & Math: 不能說的祕密(二)

--

--

Peter Wei

DIY, Scratch, Math, Essay, Book, Travel, Movie, Music