跳轉到

1202 - Fibonacci 計算之書#

案件摘要#

1202 年,比薩商人之子 Leonardo of Pisa(綽號 Fibonacci)出版《Liber Abaci》(《計算之書》),把印度-阿拉伯數字與位值計算法引進歐洲。書中一道兔子繁殖習題意外誕生了 Fibonacci 數列與黃金比例的深層聯繫——一樁由商業算術引出的千古懸案。

前因 -- 為什麼會有這個案子#

  • 商業革命的需求:中世紀地中海貿易繁榮,比薩、威尼斯的商人需要快速計算匯率、利息、帳目,但歐洲還在用笨重的羅馬數字與算盤。
  • 北非求學:Fibonacci 的父親駐守阿爾及利亞布吉亞(Bougie)海關,Fibonacci 隨行求學,接觸到印度-阿拉伯記數法——他自述「發現印度人的九個數字比任何方法都優越」。
  • 遺產就位:al-Khwarizmi 的算術書(印度數字+演算法)已在地中海世界流傳,只差一個「推銷員」把它正式帶進歐洲。

線索與推理 -- 數學式、程式、理論#

線索一:印度-阿拉伯數字西傳——商業計算革命#

《Liber Abaci》第一章就教九個數字與 zephirum(零):

\[ 1, 2, 3, 4, 5, 6, 7, 8, 9, \text{ 以及記號 } 0 \]

推理:位值記數的威力在於——任何數都可由十個符號的位置組合表示,加減乘除只需背誦九九表+進退位規則。對照羅馬數字:MCMXLVII × XII 幾乎無法筆算,而 1947 × 12 任何小學生都能算。這是「計算複雜度」意義上的革命:把商業計算從專家技能變成大眾技能。書中大量示範匯率、合夥分帳、利息問題,直接催生了之後幾百年歐洲的「算術學校」。

線索二:兔子問題與 Fibonacci 數列#

書中第三部分的一道習題:一對兔子每月生一對新兔(一雌一雄),新兔兩個月後才有生育能力,問一年後共有幾對兔子?

推理:設 \(F_n\) 為第 \(n\) 月的兔子對數,第 \(n\) 月的兔子 = 上月的兔子( \(F_{n-1}\) )+ 上上月的兔子新生的後代( \(F_{n-2}\) ):

\[ F_n = F_{n-1} + F_{n-2}, \qquad F_1 = 1,\ F_2 = 1 \]

數列: \(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, \dots\) ——一年後 233 對。

這個遞迴數列在書中只是道小題,卻在之後八百年間到處現身:向日葵種子排列、松果螺線、植物葉序、退化的兔子模型、電腦演算法分析……成為「數學結構意外連通自然界」的頭號證據。

線索三:黃金比例與封閉式#

相鄰兩項之比的極限收斂到黃金比例:

\[ \phi = \lim_{n\to\infty} \frac{F_{n+1}}{F_n} = \frac{1+\sqrt{5}}{2} \approx 1.6180339887\ldots \]

推理: \(\phi\) 滿足 \(\phi^2 = \phi + 1\) (源自 \(\frac{F_{n+1}}{F_n} = 1 + \frac{F_{n-1}}{F_{n+1}}\) 取極限)。把它當作特徵方程 \(r^2 = r + 1\) ,兩根為 \(\phi = \frac{1+\sqrt5}{2}\) 與 \(\psi = \frac{1-\sqrt5}{2} = -\frac{1}{\phi}\) ,由初值條件定出係數,得封閉式(Binet 公式):

\[ F_n = \frac{\phi^n - \psi^n}{\sqrt{5}} \]

驚人結論:整數數列竟由兩個無理數的冪之差精確生成( \(\psi^n\) 的無理部分與 \(\phi^n\) 恰好對消)。

Python:迭代與矩陣冪快速計算#

def fib_iter(n):
    """迭代法:O(n)"""
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
    return a

def fib_matrix(n):
    """矩陣冪:O(log n)
    [F(n+1), F(n)]^T = [[1,1],[1,0]]^n * [1, 0]^T"""
    def mul(A, B):
        return [[A[0][0]*B[0][0]+A[0][1]*B[1][0], A[0][0]*B[0][1]+A[0][1]*B[1][1]],
                [A[1][0]*B[0][0]+A[1][1]*B[1][0], A[1][0]*B[0][1]+A[1][1]*B[1][1]]]
    R = [[1,0],[0,1]]          # 單位矩陣
    M = [[1,1],[1,0]]
    while n:
        if n & 1:
            R = mul(R, M)
        M = mul(M, M)
        n >>= 1
    return R[0][1]

import math
phi = (1 + math.sqrt(5)) / 2
def fib_binet(n):
    """Binet 封閉式(大 n 時有浮點誤差)"""
    psi = (1 - math.sqrt(5)) / 2
    return round((phi**n - psi**n) / math.sqrt(5))

print([fib_iter(k) for k in range(1, 13)])  # [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]
print(fib_matrix(100))   # 354224848179261915075 —— 精確!
print(fib_binet(10))     # 55
print(phi)               # 1.618033988749895

結案 -- 後果與影響#

  • 結案陳詞:印度-阿拉伯數字在 13 世紀正式立足歐洲。雖然佛羅倫斯曾一度禁用(1299 年,怕帳簿被竄改——0 容易把 0 改成 6 或 9),但商業計算的效率優勢不可逆轉,1500 年前後已全面勝出。
  • 《Liber Abaci》培養了整整幾代歐洲算術家,是文藝復興數學(包括 Cardano 一代)的商業計算基礎。
  • Fibonacci 數列成為組合數學、演算法分析(log n 快速冪)、數論( \(F_n\) 與模運算、Zeckendorf 表示)的基本對象。
  • 黃金比例連通了美學、建築、自然界與數論( \(\phi\) 是「最無理」的數,連分數全為 1)。

關鍵人物與文獻#

  • Leonardo of Pisa (Fibonacci)(約 1170–1250):商人數學家,印度-阿拉伯數字的「歐洲推銷員」。
  • al-Khwarizmi:印度數字算術的原始傳播者,本案的關鍵前因。
  • Jacques Binet(1786–1856):封閉式(Binet 公式)以其名命名(de Moivre 更早知道)。
  • Fibonacci, Liber Abaci(1202;L. Sigler 英譯本, Springer, 2002)。