---
# System prepended metadata

title: 數學是計算嗎？

---

# 數學是計算嗎？

小學所學的數學，幾乎全部都是計算。

到了中學，大部分的數學也是計算，但是有少許例外，像是《歐氏幾何》！

一定有人覺得：阿！有嗎？ 中學有學過《歐氏幾何》嗎？

有的，只是很多人不知道那個叫《歐氏幾何》而已。

在台灣，中學三年級會學習如何用《圓規+直尺》作圖，然後證明出像《畢氏定理》這樣的數學，其實就是歐氏幾何。

你可以注意到《歐氏幾何》的重點，經常不是計算，而且通常連數字都沒有。

《歐氏幾何》透過一些基本的《幾何相等法則》，推導出各種定理與結論，這些《幾何相等法則》就是所謂的《公理系統》。

而《數學家》所做的事情，也常常不是計算，而是《證明一個又一個的定理》。

數學家透過《公理系統》，將數學分成許多領域，然後在每一個領域裡推導出那個領域的定理，再透過《公理+定理》推導出《更高層次的定理》，然後整個數學領域就被建構出來了。

於是、只要滿足該《公理系統》，我們就可以《套用這些定理》，而不需要再重新證明，因為數學家們已經都確認證明過了。

大學以後的數學，絕大部分都不是計算，而是證明。

所以如果一個高中生因為很會計算而念了數學系，那他可能會發現，數學系並不是給那些很會計算的人念的！ (這又是一個很容易選錯科系的陷阱)

但是如果你很會證明，可以快速《理解公理系統的意義》，然後《證明出一個又一個從來沒有證明過的重要定理》，那麼你絕對會非常適合念《數學系》，而且會是一位非常厲害的數學家！

## 然後呢？ ...

問題是，我不是個數學家，而是個教程式的大學老師 ...

那麼、數學對我來說，有甚麼用呢？

....

這個問題並不那麼容易回答 ....

如果只是寫一些《日常作業的程式，像是字串處理、資料儲存》之類的，那麼數學確實沒有甚麼幫助！

但是如果要做一些《科學類、智慧型、或者初看不知道該如何解決》的程式，那麼數學經常就有大用途了。

舉例而言，假如我們想計算《導數》，那麼根據數學定義，我們知道：

$$
f'(x) = \frac{d f(x)}{dx} = \lim_{h\to 0} \frac{f(x+h)-f(x)}{h}
$$

於是我們可以寫出下列程式碼：

```js
function df(f, x, h=0.00001) {
  return (f(x+h)-f(x))/h
}
```

這個函數 df 可以計算某函數 f 在特定點的 x 的導數。

但是如果我們想計算的是《導函數公式》，而不是《導數》，那麼就會困難許多了。

因為我們必須要知道《各種基本函數的導函數公式》，然後還要知道《鏈鎖規則》，接著透過某種《遞迴式的分解法則》，將該函數《不斷分解之後成為基本函數》，然後才能算出《指定函數的導函數》。

但是如果我們要《透過深度學習神經網路技術》做《影像辨識》，那麼我們就必須學會《反傳遞演算法》，而《反傳遞演算法》的核心觀念，一樣是《微積分的鏈鎖規則》，所以這時候數學還是很重要。

如果我們想要寫《影像壓縮程式》，那麼就必須用《傅立葉轉換或離散餘弦轉換》，這時就得知道這些轉換的計算公式。

雖然只要知道轉換公式就能寫出《影像壓縮程式》，但是若要進一步利用這些轉換後的數值，幫助改良《影像處理或辨識》程式的品質的話，那麼就得對《傅立葉轉換》背後的原理，像是《頻域》的概念有所理解了。

而且有很多高深的數學，是我之前從來沒弄懂的，直到很久很久以後的某一天，我突然發現這個數學可能對寫程式會有很大幫助時，才開始發現數學的美好。

## 泛函分析

舉例而言，最近我在看一本自己 1992 年買的《泛函分析》，其實當時我根本不知道《泛函分析》到底是在幹嘛？ (甚麼是泛函？又要分析些甚麼？)

昨天，我終於感覺到自己有點懂了《泛函分析》中，《完備距離空間》裡的《巴拿赫不動點定理》，我發現這個定理在影像辨識裏可能有很大的用途，請容我解釋如下：

## 距離空間

設 X是非空集合，對於X中的任意兩元素 x 與y，按某一法則都對應唯一的實數 ρ(x,y)，並滿足以下三條公理（距離公理）：

1. 非負性： ρ(x,y)≥0， ρ(x,y)=0當且僅當x=y；
2. 對稱性： ρ(x,y)=ρ(y,x)；
3. 三角不等式；對任意的 x,y,z ρ(x,y)≤ρ(x,z) +ρ(z,y)

則稱 ρ(x, y) 為 x 與 y 間的距離（或度量），並稱X是以ρ為距離的距離空間（或度量空間），記成(X,ρ)，或簡記為X；X中的元素稱為X中的點

## 不動點定理

不動點定理： 完備距離空間 X 上的壓縮映射 A ，必存唯一的不動點 $x*$ 使得 $A x*=x*$ 。

尋找不動點的方法： 

1. 任意取一個 $x \in X$
2. 計算 $x_2 = A(x_1), x_3 = A(x_2), ......, x_n = A(x_{n-1}) , ....$ 直到收斂為止。

其收斂點就是不動點 $x*$ 。

## 不動點定理對程式的用途

假如我們已經知道《壓縮映射 A》的 A 函數是甚麼，那麼我們就可以隨便取一點 x 作為起點，然後透過以下程式找出其不動點：

```js

function fixPoint(A, x, gap = 0.0000001) {
  while (true) {
    let ax = A(x)
    if (distance(x, ax) < gap) break
    x = ax
  }
  return x
}
```

反過來如果我們不知道 A 函數是甚麼，那麼我們就可以透過《機器學習技術》來尋找 A 函數，一旦尋找到 A 函數之後，我們就可以計算出其不動點，然後透過《平移、縮放、旋轉、變形》之類的方式，將《某待辨識影像與已知影像疊合》，這樣就能評估到底那個 A 函數轉換得對不對。

如果有一大堆 A 函數，那麼我們可以透過不動點計算後疊合的方式，計算這些 A 函數的分數，然後取分數最高的那個，就能透過《優化技術》學習出好的 A 函數了。

## 所以、數學是計算嗎？

這個問題我想並沒有絕對的答案，對於小學生而言，數學是計算，對於學過《歐氏幾何》的中學生而言，數學好像不只是計算。

但是對於數學家而言，證明在數學中的地位，應該比計算高很多。

而對於寫程式的人而言，數學除了是計算以外，還要會把數學家們證明完畢的東西拿來使用，然後寫成程式去計算，最後把計算的結果解讀出來，完成想要的程式功能。

所以我想，數學並不只是計算，而且還是理論體系的建構與證明，這些理論體系落實為計算之後，常常會發揮強大的能力，讓程式更有智慧！

