022Miller-Rabin 概率素性检验 - 概率与数论的完美联姻

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概率素性检验,支持概率版本与确定性版本

功能需求

  1. 模幂运算:实现快速模幂 power_mod(base, exp, mod),防止溢出
  2. 单轮Miller-Rabin检验:给定 n 和见证者 a,检验 n 是否通过强概率素数测试
  3. 概率版本:miller_rabin_is_prime(n, k),用 k 轮随机见证者检验
  4. 确定性版本:对 n < 3,317,044,064,679,887,385,961,981 使用固定见证者集合,保证正确
  5. 辅助:处理 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
相关推荐
wuweijianlove1 小时前
算法与数据结构协同优化的设计思想的技术7
数据结构·算法
昵称小白1 小时前
二叉树专题(下)
算法·深度优先
故事和你911 小时前
洛谷-数据结构2-1-二叉堆与树状数组1
开发语言·数据结构·c++·算法·动态规划·图论
多加点辣也没关系2 小时前
数据结构与算法|第十七章:贪心算法
数据结构·算法·贪心算法
多加点辣也没关系2 小时前
数据结构与算法|第十四章:排序算法(上)— 比较类排序
数据结构·算法·排序算法
笨笨饿2 小时前
#72_聊聊I2C以及他们的变体
linux·c语言·网络·stm32·单片机·算法·个人开发
机器人图像处理2 小时前
6-自动白平衡(灰度世界算法)
opencv·算法·相机
Dr.Zeus2 小时前
从电芯到系统:BMS算法视角下的电池热管理深度解析作者署名
算法·能源
ulias2122 小时前
leetcode热题 - 6
linux·算法·leetcode