专栏文章

Miller-Rabin 测试告诉了我们什么?

算法·理论参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@mlmkdp3j
此快照首次捕获于
2026/02/15 01:02
4 天前
此快照最后确认于
2026/02/19 01:03
11 小时前
查看原文

基本流程

简单来说,Miller-Rabin 测试是一种(非确定)素性测试算法.对于给定的 nn,算法的具体流程如下:
  • (1,n1)N(1, n-1) \cap \mathbb{N} 中随机选择一个数 aa(假定 nn 较大,不考虑边界情况);
  • nn 写成 s2ts \cdot 2^t 的形式,其中 2s2 \nmid stNt\in\mathbb{N}
  • 计算 a0=asmodna_0 = a^{s} \bmod n,若 a0=1a_0 = 1,返回 false\mathtt{false}
  • 依次计算序列 a0,a1,a2,,at\langle a_0, a_1, a_2, \ldots, a_t \rangle,其中 ai=2ai1modna_i = 2 \cdot a_{i-1} \bmod ni1i \geqslant 1);
  • at1a_t \neq 1,返回 true\mathtt{true}
  • 若存在 i1i \geqslant 1 使得 ai=1a_i = 1ai1{1,1}a_{i-1} \notin \{-1, 1\},返回 true\mathtt{true}
  • 返回 false\mathtt{false}
如果算法返回 true\mathtt{true},则称 aann 为合数的一个证人(witness),此时 nn 是合数.
若算法返回 false\mathtt{false}nn 仍可能是合数,此时称 nn 是基于 aa强伪素数(strong pseudoprime),aa 称为 nn强骗子(strong liar).

思想和错误率

Miller-Rabin 测试的思想基于以下两个定理:
  1. 费马小定理
    ap11(modp)a^{p-1} \equiv 1 \pmod{p}
  2. 二次探测定理
    在模 pp 意义下,满足 a21(modp)a^2 \equiv 1 \pmod{p}aa 只有 ±1\pm 1
这里 pp 均表示质数.
因此,若算法返回 true\mathtt{true},则 nn 一定是合数.
并且可以证明1,当 nn 是合数时,强骗子的数量至多为 φ(n)4\frac{\varphi(n)}{4},且存在 nn 使得该上界达到.
换言之,在 nn 为合数的情况下,单次 Miller-Rabin 测试出错的概率不超过 14\frac{1}{4}

贝叶斯概率分析

然而,这并不意味着进行 kk 轮 Miller-Rabin 测试后,nn 为合数的概率就衰减到 4k4^{-k}
考虑贝叶斯公式:
Pr(¬PMRk)=Pr(MRk¬P)Pr(¬P)Pr(MRk)=Pr(MRk¬P)Pr(¬P)Pr(MRkP)Pr(P)+Pr(MRk¬P)Pr(¬P)=Pr(MRk¬P)Pr(¬P)Pr(P)+Pr(MRk¬P)Pr(¬P)=11+Pr(P)Pr(MRk¬P)Pr(¬P)<Pr(MRk¬P)1Pr(P)Pr(P)\begin{aligned} \Pr\left(\neg P \mid \mathrm{MR}_k\right) &= \frac{\Pr\left(\mathrm{MR}_k \mid \neg P\right) \cdot \Pr\left(\neg P\right)}{\Pr\left(\mathrm{MR}_k\right)} \\ &= \frac{\Pr\left(\mathrm{MR}_k \mid \neg P\right) \cdot \Pr\left(\neg P\right)}{\Pr\left(\mathrm{MR}_k \mid P\right) \cdot \Pr\left(P\right) + \Pr\left(\mathrm{MR}_k \mid \neg P\right) \cdot \Pr\left(\neg P\right)} \\ &= \frac{\Pr\left(\mathrm{MR}_k \mid \neg P\right) \cdot \Pr\left(\neg P\right)}{\Pr\left(P\right) + \Pr\left(\mathrm{MR}_k \mid \neg P\right) \cdot \Pr\left(\neg P\right)} \\ &= \frac{1}{1 + \frac{\Pr\left(P\right)}{\Pr\left(\mathrm{MR}_k \mid \neg P\right) \cdot \Pr\left(\neg P\right)}} \\ &< \Pr\left(\mathrm{MR}_k \mid \neg P\right) \cdot \frac{1 - \Pr\left(P\right)}{\Pr\left(P\right)} \end{aligned}
根据相关结论,Pr(MRk¬P)4k\Pr\left(\mathrm{MR}_k \mid \neg P\right) \leqslant 4^{-k},因此
Pr(¬PMRk)<Pr(P)114k\Pr\left(\neg P \mid \mathrm{MR}_k\right) < \frac{\Pr\left(P\right)^{-1} - 1}{4^k}
这个概率与被测试数为质数的先验概率有关,遗憾的是后者难以把控(例如攻击者可能只发送合数).
假设 Pr(P)=1lnN\Pr\left(P\right) = \frac{1}{\ln N}(即假定均匀随机选取),则 kk 轮 Miller-Rabin 测试后,待测数不是质数(假阳性)的概率小于 lnN14k\frac{\ln N - 1}{4^k},这意味着需要进行大约 log4lnN\log_{4}\ln N 次素性测试以抵消质数分布带来的较低先验概率.
不过,如果待测数确实均匀随机选取,先验概率的影响会比以上估计更小,因为均匀随机下合数的假阳性概率低于 14\frac{1}{4}
AI 使用说明
使用 Deepseek 调整排版.

Footnotes

  1. 具体参见 OI-wiki 相关章节及其引用.

评论

1 条评论,欢迎与作者交流。

正在加载评论...