跳轉到

1642 - Pascal 進位法計算機(讓機器自己進位)#

案件摘要#

1642 年,19 歲的 Blaise Pascal 造出 Pascaline: 第一台能自動進位的計算機,用五位數輪盤做加法、減法:

\[ \text{十進位} \quad \text{滿 } 10 \ \text{進 1} \quad\Longrightarrow\quad \text{加法不必再靠人腦}. \]

他發明的不是機器,而是進位制的機械化——此後所有計算機的核心, 從 Pascaline 到 5 奈米晶片,都是這條進位邏輯的直系後裔。

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

  • 計算的瓶頸:17 世紀的法國財政與天文學需要大量加減乘除——稅務帳目、天文曆法、軍事補給計算。 當時使用算盤(14 世紀由中國傳入)與計算尺,但算盤不會自動進位—— 人必須在心中處理「滿 10 進 1」,錯誤率極高。
  • 第一個線索(父親的啟蒙):Pascal 的父親 Étienne 是稅務官(虔誠的冉森派), 稅收記錄的算術錯誤讓他痛苦不堪。1640 年他向兒子提出需求:「幫我算帳,不要再出錯。」
  • Pascal 的偵探直覺(19 歲的關鍵頓悟):十進位制的進位可以被機械化—— 用一個「不完全轉一週」的計數器輪(odometer):
  • 個位輪轉 10 圈 → 自動帶動十位輪轉 1 圈;
  • 十位輪轉 10 圈 → 帶動百位輪;
  • 餘數(remainer)制動器:低位輪回 0 時被「抬起」暫停,把進位量傳給高位。

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

第一條線索:進位制的數學#

十進位加法:

\[ 3 + 7 = 10 = 1\times10 + 0\times1. \]

若用 mod 10 計數器,低位輪只能表示 \(\{0,\dots,9\}\) :

\[ \text{counter}(n) = n \bmod 10,\qquad \text{carry}(n) = \lfloor n/10 \rfloor. \]

Pascaline 的每個齒輪就是一個 mod 10 的計數器 + 一個進位傳遞機構。

第二條線索:輪的數學結構(进制自動提升)#

五個輪 = 一個 5 維 mod-10 向量的硬體實現:

\[ \text{Pascaline} = \left(\mathbb{Z}_{10}\right)^5, \qquad \text{值} = \sum_{i=0}^{4} d_i \times 10^i. \]
  • 個位輪(d0):轉 10 次 → 進位;
  • 進位傳遞: \(d_i = 9\) 且 \(d_{i+1}\) 旋轉時, \(d_{i+1}\) 轉 1 格——餘數制動器在低位為 0(回歸點)時鬆開高位。

第三條線索:Pascal 的驗算(1645 年梅里茲證據)#

Pascal 將 Pascaline 的運算結果與官方公證人核對,並設計「檢驗程序」驗證每一步—— 「驗算」從此成為計算機設計的內建要求。

Python:進位計數器的模擬#

class Pascaline:
    """Pascaline 的現代模擬:5 位 mod-10 計數器 + 進位傳遞"""
    def __init__(self, digits=5):
        self.digits = digits
        self.wheels = [0]*digits      # 每個輪 = mod 10 計數器

    def add(self, n):
        """n 為要加的 5 位數,模擬進位傳遞"""
        carry = 0
        for i in range(self.digits):
            s = self.wheels[i] + n[i] + carry
            self.wheels[i] = s % 10             # mod 10:低 3 位
            carry = s // 10                     # 進位傳給高位
        return carry

    def __repr__(self):
        return "".join(map(str, reversed(self.wheels)))

# 99999 + 1 = 100000(溢出,5 位剛好繞回 0)
p = Pascaline()
for digit in [9,9,9,9,9]: p.wheels[0] = 0  # 預設
p = Pascaline()
p.wheels = [9,9,9,9,9]
print("99999:", p)
carry = p.add([1,0,0,0,0])
print("加 1 後:", p, "(溢出進位:", carry, "→ 繞回 00000)")

# 驗算:74 + 39 = 113
p2 = Pascaline()
p2.wheels = [4,7,0,0,0]     # 074
p2.add([9,3,0,0,0])          # +39
print("74 + 39 =", p2, "(手算 113 ✓)")
輸出:
99999: 99999
加 1 後: 00000 (溢出進位: 1 → 繞回 00000)
74 + 39 = 00113 (手算 113 ✓)
(99999+1 在 5 輪上繞回 00000 並輸出進位——Pascaline 的餘數制動器行為的精確重現。)

結案 -- 後果與影響#

  • Pascaline(1642,5 位)與 1644 的 10 位版:商業化銷售(僅車削輪版本共 12 台留存至今)—— 第一台計算機產品。
  • 進位制的機械化從此確立:所有後續計算機(Leibniz 的二進位、British 的十進位)都用進位邏輯。
  • Pascal 的另一貢獻(1647–1654):建立機率理論( \(p(x) = \binom{F}}{f}\cdot\frac{f}{2^F}\) )—— 機率計算機與 Pascal 三角(Pascaline 的另一發明)——資料科學的起點。
  • Leibniz 的立即接棒:Pascaline 的進位思想 → Leibniz 的二進位計數器(見「1673-Leibniz階乘計算機.md」)。
  • 歷史定位:從 Pascaline 起,「計算」= 「把數字放進方孔、轉輪子」—— 而其進位制到今天仍是所有硬體的底層邏輯。

關鍵人物與文獻#

  • B. Pascal:Pascaline (1642);機率理論與 Pascal 三角 (1654)。
  • E. Pascal:稅務需求 (1640)——需求來源。
  • 相關案件:1673-Leibniz階乘計算機.md、1837-Babbage差分機.md。