---
# System prepended metadata

title: Cunning 9 times table algorithms
tags: [' algorithm', extracted from each paragraph]

---

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







