---
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.