跳轉到

1980 - Rabin 質數檢驗#

案件摘要#

1980 年,Michael O. Rabin 發表《Probabilistic Algorithm for Testing Primality》:把 Miller (1976) 的檢驗隨機化——隨機選基底 \(a\) ,錯誤機率 \(\le 4^{-k}\) 。這是歷史上第一個「隨機算法大幅超越已知確定性算法」的實用案例,確立了 BPP/RP 類的地位,也宣告了一個新範式:允許極小機率出錯,換取指數級的加速。

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

Miller 的檢驗(見 1976-Miller質數檢驗.md)吊在 ERH 上:沒有 ERH,已知需要 \(O(\sqrt{n})\) 試除。Rabin 的問題:能否不依賴任何未證明假設? 他的答案充滿智慧——不消除錯誤,而是控制錯誤:讓錯誤機率小到比硬體故障還低。

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

關鍵定理:證人很多#

定理:奇合數 \(n\) 中,使 Miller 檢驗通過的「說謊者」 \(a \in \mathbb{Z}_n^*\) 至多佔 1/4。

證明骨架(反證法,用到群論):設說謊者集合太大,利用 \(\mathbb{Z}_n^*\) 的子群結構——說謊者構成某個真子群的子集,而真子群大小至多為群的一半;對非循環群結構進一步分半,最終上界 1/4。(Rabin 的原始證明用了 \(\mathbb{Z}_n^*\) 至少有 \(\varphi(n)\) 個元素與根號鏈結構的組合計數。)

Miller–Rabin 演算法#

輸入:奇數 n;參數 k(安全參數)
重複 k 次:
    隨機選 a ∈ {2, ..., n-2}
    若 a 是合數性證人 => 回答「合數」(確定正確!)
回答「質數」

誤差分析(單邊錯誤,RP 風格): - 若 \(n\) 是合數:每輪抓包機率 \(\ge 3/4\) , \(k\) 輪全部漏掉機率 \(\le (1/4)^k = 4^{-k}\) - 若 \(n\) 是質數:永遠答對(無偽證)

\(k = 40\) 時錯誤機率 \(\le 4^{-40} \approx 10^{-24}\) ——比宇宙射線翻轉位元的機率還低。這不是「可能錯」的算法,是「錯了比硬體壞掉還罕見」的算法。

程式碼:完整的 Miller–Rabin#

import random

def is_probable_prime(n, k=40):
    if n < 2: return False
    for p in [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]:
        if n % p == 0: return n == p
    d, s = n - 1, 0
    while d % 2 == 0:
        d //= 2; s += 1
    for _ in range(k):
        a = random.randrange(2, n - 1)
        x = pow(a, d, n)
        if x in (1, n - 1): continue
        for _ in range(s - 1):
            x = pow(x, 2, n)
            if x == n - 1: break
        else:
            return False            # 證人 => 確定是合數
    return True                     # 錯誤機率 <= 4^-k

random.seed(42)
# 產生 RSA 模數的實戰流程
p = random.getrandbits(512) | 1
while not is_probable_prime(p): p = random.getrandbits(512) | 1
print("找到 512 位質數", p % 1000, "...")

# Carmichael 數無所遁形
print(is_probable_prime(561))            # False(費馬檢驗會被騙!)
print(is_probable_prime(341550071728321))  # False(更大的 Carmichael 數)

複雜度類的意義#

Miller–Rabin 屬於 co-RP:合數判定在 RP 中(一邊可能錯)。合成:

  • COMPOSITE ∈ RP ∩ co-RP ⟹ ZPP(Las Vegas:總是對,期望多項式)
  • PRIMES ∈ coRP ⟹ PRIMES ⊆ BPP

1976–2002 的懸案:PRIMES ∈ P 嗎?AKS (2002) 最終證明是——但 Miller–Rabin 仍是不二之選(快得多)。

偵探筆記:Rabin 的推理是「反守為攻」——Miller 試圖消除錯誤(依賴 ERH),Rabin 把錯誤當成資源用機率放大器壓縮。這個模式(隨機取樣 + 錯誤機率指數衰減)成為整個 Monte Carlo 算法的標準配置。

結案 -- 後果與影響#

  • 密碼學標配:RSA、Diffie–Hellman、橢圓曲線的金鑰生成全用 Miller–Rabin;OpenSSL 每天跑幾億次。
  • BPP 類的確立:隨機算法從「玩具」變成「工業標準」,隨機複雜度理論(RP、BPP、ZPP)有了殺手級應用。
  • 去隨機化懸案:PRIMES 被證明在 P(AKS, 2002),暗示 BPP 或許可去隨機化(見 1997-ImpagliazzoWigderson去隨機化.md)。
  • 單邊/雙邊錯誤的區分:Miller–Rabin(co-RP)成為複雜度類教學的標準例子。

關鍵人物與文獻#

  • Michael O. Rabin(1931–2025):Probabilistic Algorithm for Testing Primality (1980, J. Number Theory);圖靈獎 1976(與 Shamir,非確定性自動機)
  • Gary Miller:1976 基礎檢驗
  • Solovay & Strassen:1977 獨立提出機率質數檢驗(Euler 準則版本)
  • 交叉參照:1976-Miller質數檢驗.md、1981-Rabin指紋比對.md、../計算理論/2002-AKS質數檢驗.md