2002 - AKS 質數檢驗#
案件摘要#
2002 年 8 月,印度 IIT Kanpur 的教授 Agrawal 與兩位大學生 Kayal、Saxena 發表論文《PRIMES is in P》,給出第一個確定性多項式時間質數檢驗演算法(AKS)。這樁 30 年懸案——「質數檢驗是否在 P 中」——就此偵破,且由本科生完成,震驚學界。
前因 -- 為什麼會有這個案子#
- 17 世紀:Fermat 小定理給出質數的必要條件:若 \(p\) 為質數且 \(\gcd(a, p) = 1\) ,則
但其逆不真(Carmichael 數如 \(561 = 3 \times 11 \times 17\) 對所有 \(a\) 皆滿足)。 - 1976 年:Miller 提出確定性檢驗,但依賴「廣義 Riemann 假設(GRH)」。 - 1977 年:Rabin 將其改良為不依賴假設的機率式檢驗(Miller–Rabin),錯誤率 \(\leq 4^{-k}\) 。 - 1980 年:Solovay–Strassen 提出另一機率式檢驗(基於 Euler 判別式 \(\left(\frac{a}{p}\right) \equiv a^{(p-1)/2} \pmod p\) ),錯誤率 \(\leq 2^{-k}\) 。 - 疑案本質:機率式檢驗極快但「可能說謊」;確定性檢驗(試除法 \(O(\sqrt{n})\) )慢到不可用。「確定性 + 多項式」兩全其美的演算法是否存在?
線索與推理 -- 數學式、程式、理論#
1. 前代檢驗的數學#
Fermat 小定理(1640):
缺點:Carmichael 數會偽裝成質數。
Miller–Rabin(1977/1980):將 \(p-1 = 2^s \cdot d\) ( \(d\) 奇數),檢驗:
若對某 \(a\) 成立則 \(n\) 必為合數;機率式,錯誤率 \(\leq 4^{-k}\) 。
Solovay–Strassen(1980):基於 Jacobi 符號:
2. AKS 定理(2002)#
定理(Agrawal–Kayal–Saxena):存在確定性演算法,在 \(\tilde{O}(\log^6 n)\) 時間內判定 \(n\) 是否為質數。即:
( \(\tilde{O}\) 忽略對數因子。原始版本為 \(\tilde{O}(\log^{12} n)\) ,經 Lenstra–Pomerance 等改良後降至 \(\tilde{O}(\log^6 n)\) 。)
3. AKS 條件的數學內容#
AKS 的核心是一條「多項式恆等式」判別法。若 \(n\) 為質數,則對任意整數 \(a\) :
因為二項式係數 \(\binom{n}{k} \equiv 0 \pmod n\) ( \(0 < k < n\) )。其逆:若此恆等式對某 \(a\) 不成立,則 \(n\) 必為合數。
問題:直接展開 \((x+a)^n\) 需要 \(n\) 個係數,指數級。AKS 的妙手:在商環中模運算——取小整數 \(r\) ,對 \(x^r - 1\) 取模(即只保留次數 \(< r\) 的係數):
這是「代數壓縮」:把指數級資訊壓進 \(r\) 個係數裡。AKS 證明存在適當的 \(r = O(\log^5 n)\) ,使得此條件對足夠多的 \(a\) 成立當且僅當 \(n\) 是質數的純冪或質數——再篩掉純冪即可。
演算法骨架: 1. 檢查 \(n = a^b\) (純冪)?若是,合數。 2. 找最小 \(r\) ,使 \(\text{ord}_r(n) > \log^2 n\) 。 3. 檢查 \(1 < \gcd(a, n) < n\) 對 \(a \le r\) (找出小因子)。 4. 對 \(a = 1, \dots, \lfloor \sqrt{\varphi(r)} \log n \rfloor\) 驗證 \((x+a)^n \equiv x^n + a \pmod{x^r-1,\ n}\) 。 5. 通過全部檢驗 ⟹ \(n\) 是質數。
4. 程式碼範例:簡化版 AKS 與 Miller–Rabin 對照#
import random
def is_perfect_power(n):
for b in range(2, n.bit_length()):
a = round(n ** (1 / b))
if a ** b == n or (a + 1) ** b == n:
return True
return False
def aks_simplified(n):
"""簡化版 AKS:直接檢查多項式恆等式(未做 x^r-1 壓縮,僅教學用)"""
if n < 2: return False
if is_perfect_power(n): return False
for a in range(1, min(n, 20)): # 教學版只取少量 a
coeffs = [1]
for _ in range(n): # 二項式展開 (x+a)^n
coeffs = [c1 + c2 for c1, c2 in
zip([0] + coeffs, coeffs + [0])]
lhs = coeffs # (x+a)^n 的係數
rhs = [1] + [0] * (n - 1) + [a] # x^n + a 的係數
if (lhs[0] % n != rhs[0] % n or
(lhs[n] if n < len(lhs) else 0) % n != rhs[-1] % n):
return False
for k in range(1, n): # 中間係數必為 0 mod n
if coeffs[k] % n != 0:
return False
return True
def miller_rabin(n, k=10):
"""機率式:快但可能說謊,錯誤率 <= 4^-k"""
if n < 2: return False
for p in [2, 3, 5, 7, 11, 13]:
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
print(aks_simplified(101), miller_rabin(101)) # True True
print(aks_simplified(561), miller_rabin(561)) # False False(Carmichael 數)
對照表:
| 檢驗 | 時間 | 確定性 | 弱點 |
|---|---|---|---|
| 試除法 | \(O(\sqrt{n})\) | 確定 | 指數級(於輸入長度) |
| Fermat | \(\tilde{O}(\log^3 n)\) | 機率 | Carmichael 數 |
| Solovay–Strassen | \(\tilde{O}(\log^3 n)\) | 機率 | 錯誤率 \(2^{-k}\) |
| Miller–Rabin | \(\tilde{O}(\log^3 n)\) | 機率 | 錯誤率 \(4^{-k}\) (GRH 下可確定) |
| AKS | \(\tilde{O}(\log^6 n)\) | 確定 | 常數較大,實務上少用 |
結案 -- 後果與影響#
- 結案:PRIMES is in P,30 年懸案偵破。這是第一個「自然問題落入 P」的重大案例——此前已知的多項式演算法多是「問題本身的自然身份」,而質數檢驗是密碼學核心運算,地位特殊。
- 影響 1:理論上,RSA 的安全性不再能訴諸「質數產生可能不高效」——金鑰產生有確定性多項式保證(但分解仍難,故 RSA 仍安全)。
- 影響 2:實務上 Miller–Rabin 仍是最快選擇(AKS 常數太大),但 AKS 提供了「最壞情況保證」的理論基準線。
- 影響 3:證明技術啟發後續研究:AKS 用的「代數壓縮 + 恆等式驗證」與 GCT、IP = PSPACE 的代數技巧一脈相承。
- 影響 4:本科生 Neeraj Kayal、Nitin Saxena 一戰成名,後皆任職於 Microsoft Research 與頂尖學府,成為複雜性理論中堅。
- 影響 5:確立「多項式恆等式測試(PIT)」為重要工具——PIT 本身是另一個 P vs BPP 型懸案(AKS 是 PIT 的特例之確定解)。
關鍵人物與文獻#
- Manindra Agrawal(IIT Kanpur 教授,指導者)。
- Neeraj Kayal、Nitin Saxena(當時為大學生,後為知名複雜性理論學家)。
- Gary Miller(1976)、Michael Rabin(1980)、Solovay–Strassen(1980):前代檢驗。
- 文獻:M. Agrawal, N. Kayal, N. Saxena, "PRIMES is in P", Annals of Mathematics 160(2), 2004(2002 年 8 月首度發表於 IIT Kanpre 網站);原本的 2002 預印本即獲 2006 年 Gödel Prize。
- 延伸:Lenstra–Pomerance 的改良版 AKS( \(\tilde{O}(\log^6 n)\) )。