Miller-Rabin 概率素性检验 - 概率与数论的完美联姻
米勒-拉宾:锻造密码学的牢不可破之钥
5W1H 发明者故事
Who(何人)- 发明者是谁?
核心发明者:
- 加里·米勒(Gary L. Miller):卡内基梅隆大学计算机科学教授,1976年在博士论文中提出了基于广义黎曼猜想(GRH)的确定性素性检验算法
- 迈克尔·拉宾(Michael O. Rabin,1931-):以色列-美国计算机科学家,图灵奖得主(1976年,与Dana Scott共同获奖),希伯来大学和哈佛大学教授,1977年将米勒的确定性算法改造为概率版本,使其无需依赖未经证明的猜想
背景:拉宾是理论计算机科学的奠基人之一,他对不确定性图灵机、概率算法有根本性贡献。他对素性检验问题的兴趣源于密码学的需求:RSA密码体制(1977年)需要生成大素数,而当时没有足够快的确定性算法。
When(何时)- 什么时候发明的?
时间线:
- 1975年:米勒在博士论文中基于GRH提出确定性算法
- 1976年:米勒算法发表于《JCSS》
- 1977年:RSA密码体制发表,大素数生成需求急剧增长
- 1980年:拉宾发表概率版本,完全去除了对GRH的依赖
时代背景:
- 1970年代是公钥密码学的诞生期(Diffie-Hellman 1976,RSA 1977)
- 大整数素性检验从纯数论问题变成了工程急需
- AKS确定性多项式时间算法要到2002年才出现,在此之前Miller-Rabin是业界标准
Where(何地)- 在哪里发明的?
地点:
- 米勒版本:卡内基梅隆大学(CMU),宾夕法尼亚州匹兹堡
- 拉宾版本:麻省理工学院(MIT)及耶路撒冷希伯来大学
What(何事)- 发明了什么?
算法:Miller-Rabin 概率素性检验(Probabilistic Primality Test)
数学基础:费马小定理的强化版------强概率素数条件
对奇素数 p,将 p-1 写成 2^s × d(d 为奇数)。对任意 a(1 < a < p-1),必有:
a^d ≡ 1 (mod p),或
a^(2^r × d) ≡ -1 (mod p),对某个 0 ≤ r < s
若 n 是合数,随机选取的 a 通过上述检验的概率至多为 1/4。
核心突破:
- 每轮测试的误报率至多 25%
- k 轮测试后,合数被误判为素数的概率至多 4^(-k)
- k=20 时误判概率约 10^(-12),对密码学应用完全足够
Carmichael数问题 :
费马素性检验(a^(n-1) ≡ 1 mod n)对Carmichael数(如561=3×11×17)失效,因为所有 a 都能通过。Miller-Rabin通过检验"强"条件解决了这个问题。
Why(何因)- 为什么发明?
密码学驱动:RSA、DSA、椭圆曲线密码等公钥体制都需要生成大素数(通常512位到4096位)。朴素试除法对这种量级完全不可行。
效率需求:生成一个1024位的RSA素数,需要测试约710个候选数(素数定理估计)。每次检验必须快速。
可靠性需求:即使是概率算法,也需要误判率可量化、可控制。
How(何果)- 如何实现?有什么影响?
时间复杂度:O(k × log²(n) × M(log n)),其中 M(log n) 是大数乘法时间
确定性使用:对小范围的 n,使用固定的基集合可保证100%正确:
- n < 3,215,031,751:只需测试 a ∈ {2, 3, 5, 7}
- n < 3,317,044,064,679,887,385,961,981:使用12个特定基
历史影响:
- OpenSSL、GnuPG、Java BigInteger、Python等均内置Miller-Rabin
- Knuth在TAOCP第二卷4.5.4节详细分析了概率素性测试
- 推动了概率算法理论(BPP复杂度类)的发展
自然语言需求定义
需求名称:实现Miller-Rabin概率素性检验,支持概率版本与确定性版本
功能需求
- 模幂运算:实现快速模幂 power_mod(base, exp, mod),防止溢出
- 单轮Miller-Rabin检验:给定 n 和见证者 a,检验 n 是否通过强概率素数测试
- 概率版本:miller_rabin_is_prime(n, k),用 k 轮随机见证者检验
- 确定性版本:对 n < 3,317,044,064,679,887,385,961,981 使用固定见证者集合,保证正确
- 辅助:处理 n < 2、n = 2、n 为偶数等边界情况
验收标准
| 编号 | 测试场景 | 预期结果 | 说明 |
|---|---|---|---|
| 1 | n = 2, 3, 5, 7, 11, 97, 997, 7919 | 均为素数 | 已知小素数 |
| 2 | n = 4, 6, 9, 15, 100 | 均为合数 | 已知合数 |
| 3 | Carmichael数 n = 561, 1105, 1729 | 均为合数 | 费马测试失效但Miller-Rabin正确 |
| 4 | 大素数 n = 1000000007 | 素数 | 常用模数 |
| 5 | 大素数 n = 999999937 | 素数 | 常用模数 |
| 6 | n = 1 | 非素数 | 边界条件 |
| 7 | 确定性版本:n = 7919 | 素数 | 确定性无误报 |
C语言实现文件
对应文件 : miller_rabin.c
编译运行:
bash
gcc -std=c99 -Wall -o /tmp/miller_rabin_test miller_rabin.c
./miller_rabin_test