基本流程
简单来说,Miller-Rabin 测试是一种(非确定)素性测试算法.对于给定的
n,算法的具体流程如下:
- 在 (1,n−1)∩N 中随机选择一个数 a(假定 n 较大,不考虑边界情况);
- 将 n 写成 s⋅2t 的形式,其中 2∤s,t∈N;
- 计算 a0=asmodn,若 a0=1,返回 false;
- 依次计算序列 ⟨a0,a1,a2,…,at⟩,其中 ai=2⋅ai−1modn(i⩾1);
- 若 at=1,返回 true;
- 若存在 i⩾1 使得 ai=1 且 ai−1∈/{−1,1},返回 true;
- 返回 false.
如果算法返回
true,则称
a 是
n 为合数的一个
证人(witness),此时
n 是合数.
若算法返回
false,
n 仍可能是合数,此时称
n 是基于
a 的
强伪素数(strong pseudoprime),
a 称为
n 的
强骗子(strong liar).
思想和错误率
Miller-Rabin 测试的思想基于以下两个定理:
-
费马小定理
ap−1≡1(modp)
-
二次探测定理
在模
p 意义下,满足
a2≡1(modp) 的
a 只有
±1.
因此,若算法返回
true,则
n 一定是合数.
并且可以证明
1,当
n 是合数时,强骗子的数量至多为
4φ(n),且存在
n 使得该上界达到.
换言之,在
n 为合数的情况下,单次 Miller-Rabin 测试出错的概率不超过
41.
贝叶斯概率分析
然而,这并不意味着进行
k 轮 Miller-Rabin 测试后,
n 为合数的概率就衰减到
4−k.
考虑贝叶斯公式:
Pr(¬P∣MRk)=Pr(MRk)Pr(MRk∣¬P)⋅Pr(¬P)=Pr(MRk∣P)⋅Pr(P)+Pr(MRk∣¬P)⋅Pr(¬P)Pr(MRk∣¬P)⋅Pr(¬P)=Pr(P)+Pr(MRk∣¬P)⋅Pr(¬P)Pr(MRk∣¬P)⋅Pr(¬P)=1+Pr(MRk∣¬P)⋅Pr(¬P)Pr(P)1<Pr(MRk∣¬P)⋅Pr(P)1−Pr(P)
根据相关结论,
Pr(MRk∣¬P)⩽4−k,因此
Pr(¬P∣MRk)<4kPr(P)−1−1
这个概率与被测试数为质数的先验概率有关,遗憾的是后者难以把控(例如攻击者可能只发送合数).
假设
Pr(P)=lnN1(即假定均匀随机选取),则
k 轮 Miller-Rabin 测试后,待测数不是质数(假阳性)的概率小于
4klnN−1,这意味着需要进行大约
log4lnN 次素性测试以抵消质数分布带来的较低先验概率.
不过,如果待测数确实均匀随机选取,先验概率的影响会比以上估计更小,因为均匀随机下合数的假阳性概率低于
41.
AI 使用说明
使用 Deepseek 调整排版.