--- titles: Cunning 9 times table algorithms tags: extracted from each paragraph, algorithm --- # Cunning 9 times table algorithms [src from @cs4fn](https://teachinglondoncomputing.org/cunning-9-times-table-algorithms/) 要讓數學更出色不外乎是多了解一些技巧和學習一些聰明的演算法,這裡有一些關於數字9的聰明演算法,包含: * 演算法的介紹 * 學習“乘9”的演算法 * 學習“加9” * 效率和選擇演算法 * 模式匹配(pattern matching) * Generalisation * 證明程式總是可以使用 * 代數實際應用 學習心算乘法表不僅僅讓除法比較容易,也能在思緒一片空白(mind goes blank)的時候,利用它來思考演算法,9的乘法表是我最愛的,因為它背後有個很美麗的模式。 學生在小學時花了很長時間學演算法,只是沒有這麼稱呼它,其實學習簡單的算術就是在學習演算法,大家都把套進公式得到答案視為理所當然(即使不懂它是如何運作),但那恰恰是電腦所做的事情。 這裡有一些解答神奇數字9的演算法: ## The repeated addition algorithm 大部分的人在還沒學乘法的時候都是學“累加”,乘法就是一直重複的“加”,9乘2就是9加9,等於18,9乘3就是再加一個9等於27 問題是這樣速度很慢,特別是你用手指算的時候,要更快速得到答案,我們需要更快的演算法,無論是給電腦或是給人的演算法,演算法的效率都很重要 改良演算法之後可以更快的得到結果,例如你記得9乘5和9乘10的話,就不用一直加9或減9了 還有更快的演算法 ## The 9 times table finger algorithm 利用你的手指來看看最整齊的9倍演算法,可以用在任何9*N(N<=10)的數字中 為什麼可以這樣運作? ## The 9 times table simple subtract-1 algorithm 這個演算法是手指法的變異,底下的概念(underlying pattern)是一樣的 * 在算9*N(N>10)的時候: - (N-1)*10 - 9-(N-1) - 兩數字相加 ## A variation on the algorithm 或許對你來說從10減會比從9減還簡單 * 改良一下,在算9*N(N>10)的時候: - (N-1)*10 - 10-N - 兩數字相加 以上這些演算法適用於N>10的時候,不要失誤的依照演算法,就可以得出解答 ## The underlying pattern 電腦執行演算法的時候不會好奇演算法如何運作的,但人類反而要知道如何運作才更容易記住,我們來看看它怎麼運作: ``` 1x9 = 09 2x9 = 18 3x9 = 27 4x9 = 36 5x9 = 45 6x9 = 54 7x9 = 63 8x9 = 72 9x9 = 81 10x9 = 90 ``` 我們來仔細分解(exploit)這個模式,每往下一行,十位數就加1,個位數就減1,因為從1x9=09開始,十位數總是比N小1,而加9就是(加10和減1)同時進行時,兩位數相加都等於第一行的9,這就代表只要知道一個數字,用9去減就知道另一個數字了 這其實是運用了很簡單的數學道理: ``` 9 = 10 - 1 ``` 乘法是重複的加法,加9就是(加10和減1)同時進行 ``` To add 9 to a number we just add 10 (increase the 10s column by 1) and subtract 1 (decrease the 1s column by 1). ``` 這個道理剛好意外的讓加9有一個簡單的演算法,在任何地方,加10減1算的可以比加9還快: ``` 78622315 + 9 = 78622325(加10) -1(減1) = 78622324 ``` ## A general 9 times table algorithm 電腦科學家(和數學家)喜歡概括(generalize)事情,讓演算法可以在儘可能多的狀態下運作,或許你知道如何改編我們的演算法,概括它之後,解決所有乘9的問題 我們如何改編我們的演算法,在概括它之後,用來解決所有乘9的問題? * 在算Nx9的時候(任何N): - N-1 ☞A - Ax10 ☞B - (9-A) ☞C - B+C ☞ Answer 虛擬碼(pseudocode)寫法如下: ``` To work out 9xN for any N: A := N-1 B := 10A C := 9-A Answer := B+C ``` 這看起來可以運作在任何數字了,但我們要如何確定? ## A variation of the general 9 times table algorithm 如果你比較偏好減10而不是減9,請看下列的虛擬碼(pseudocode): ``` To work out 9xN for any N: A := N-1 B := 10A C := 10-N Answer := B+C ``` ## Proving the algorithm works with a bit of algebra 我們可以用代數證明演算法總是有用,這遠比只測試幾個範例就得全盤相信好多了,我們必須展示計算與9xN一樣的計算,我們從結論往回推,將變數一個一個帶入: general 1: ``` Answer = B + C = 10A + C [Substituting for the value of B] = 10A + (9-A) [Substituting for C] = 10(N-1) + 9-(N-1) [Substituting for A] = 10N - 10 + 9 - N + 1 [Expanding brackets] = 10N - N [Simplifying -10+9+1] = 9N [Simplifying] ``` general 2: ``` Answer = B + C = 10A + C [Substituting for the value of B] = 10A + (10-N) [Substituting for C] = 10(N-1) + (10-N) [Substituting for A] = 10N - 10 + 10 - N [Expanding brackets] = 10N - N [Simplifying -10+10] = 9N [Simplifying] ``` 如此一來我們就證明了演算法與9xN相同 >>>Becoming an expert at mental maths is just a matter of knowing the tricks and that just means learning a bunch of cunning algorithms, and ideally proving they do always work.