陳鍾誠

Version 1.0

數學是計算嗎?

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

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

一定有人覺得:阿!有嗎? 中學有學過《歐氏幾何》嗎?

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

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

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

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

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

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

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

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

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

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

然後呢? …

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

那麼、數學對我來說,有甚麼用呢?

….

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

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

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

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

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

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

def 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 作為起點,然後透過以下程式找出其不動點:


def fixPoint(A, x, gap = 0.0000001):
    while (True):
        ax = A(x)
        if distance(x, ax) < gap:
            break
        x = ax

    return x

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

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

所以、數學是計算嗎?

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

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

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

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