素性检验
素性检验
Bob 已经完成了 \(\mathrm{RSA}\) 公钥系统的学习,并准备使用他的所学与 Alice 进行通信。但他真的准备好了吗?为了生成 \(\mathrm{RSA}\) 密钥对,Bob 需要选择两个非常大的素数 $ p $ 和 $ q $。但在大尺度上,合数比素数多得多,这不是一个毫不费力的事情。
当然,如果选取 $ p $ 和 $ q $ 不是素数,也存在一种可行的办法——Bob 找到它俩的因式分解 \(p=p_1^{e_1}\cdots p_t^{e_t},q=p_{t+1}^{e_{t+1}}\cdots p_n^{e_n}\),然后使用 “\(N=p_1^{e_1}\cdots p_n^{e_n}\) 版本的 \(\mathrm{RSA}\) 系统”即可完成与 Alice 的通信。但是这几乎不可行,因为相当于把因式分解这个难题留给了自己,白白消耗了很多算力。更糟糕的是,如果 $ p $ 和 $ q $ 有小的素因子,那么 Eve 可能就能因式分解 $ pq $,进而破坏 Bob 的系统。
因此,Bob 面临的任务是寻找大素数。更准确地说,他需要一个方法来区分素数和合数,因为如果他知道如何做这一点,他就可以选择大随机数,直到找出一个素数。Bob 现在真正需要的是一种有效的方式来判断一个非常大的数是否为素数。
例如,假设 Bob 选择了一个相当大的数:
他想知道 $ n $ 是否为素数。首先,Bob 会检查小因子,但他发现 $ n $ 不能被任何小于 \(1000000\) 的素数整除。所以他开始怀疑 $ n $ 可能是素数。接下来,他计算了以下量:
结果发现:
这个同余式立即告诉 Bob $ n $ 是一个合数,尽管它没有告诉他如何因式分解 $ n $。为什么呢?回顾一下费马小定理,它说如果 $ p $ 是素数,那么对于任何整数 $ a $,都有:
因此,如果 $ n $ 是素数,$ 2^{n-1} \mod n $ 应该等于 \(1\),但计算结果显示不等于 \(1\),从而证明了 $ n $ 是合数。
在继续 Bob 寻找大素数的历程之前,我们先陈述一个方便的费马小定理版本,该版本对 $ a $ 不做任何限制。
费马小定理的扩展版本
费马小定理通常是说:如果 $ p $ 是素数,那么对于任何非零整数 $ a $,都有
费马小定理的扩展版本:如果 \(p\) 是素数,那么对于任意整数 \(a\),都有
\(\square\)
回到 Bob 的寻找素数之旅,我们发现他毫不气馁,随机选择了另一个大数:
在检查了 $ n $ 是否被小素数整除之后,Bob 计算了 $ 2^n \pmod n $,发现:
问题是:结合费马小定理是否能够证明 $ n $ 是素数?
答案是否定的!费马小定理的推论只适用于一个方向:
如果 $ p $ 是素数,那么 $ a^p \equiv a \pmod{p} $。
但并不能保证反向成立,即 $ a^n \equiv a \pmod{n} $ 对某个 $ n $ 成立并不能证明 $ n $ 是素数。
实际上,对于某些合数 $ n $,等式 \((1)\) 也可能成立。例如,以下是一个反例:
这种满足费马小定理形式但实际上是合数的数被称为 伪素数(pseudoprime)。
从一种模糊的哲学角度来看,\((1)\) 的成立或许在某种程度上增加了 $ n $ 是素数的可能性。因为如果 $ 2^n \mod n $ 的结果与 $ 2 $ 不同,那么我们可以立即得出 $ n $ 是合数的结论。然而,仅凭 \((1)\) 还不足以断定 $ n $ 是素数。
这使我们定义了如下概念:
定义 1
给定一个整数 $ n $,我们称整数 $ a $ 为 $ n $ 的 证人(witness for the compositeness of $ n $),如果:
正如我们之前观察到的,一个单一的证人结合费马小定理足以确定 $ n $ 是合数。因此,评估 $ n $ 是否可能为素数的一种方法是尝试许多数字 $ a_1, a_2, a_3, \dots $。如果其中有任何一个 $ a $ 是 $ n $ 的证人,那么 Bob 知道 $ n $ 是合数;如果没有任何 $ a $ 是证人,那么 Bob 可以怀疑 $ n $ 是素数,但不能确定。
卡迈克尔数
然而,在这个理想的场景中,有一些例外的合数,如 \(561\)。数字 \(561\) 是合数,$ 561 = 3 \times 11 \times 17 $,但它没有证人!换句话说,
没有证人的合数被称为 卡迈克尔数(Carmichael numbers),以 R.D. 卡迈克尔的名字命名,他在 1910 年发布了一篇论文,列出了 15 个这样的数字。通过检查每个值 $ a = 0, 1, 2, \dots, 560 $,可以很简单的证明 \(561\) 是一个卡迈克尔数。
不幸的是,虽然卡迈克尔数分布相对稀疏,但是可以证明卡迈克尔数有无穷多个。因此,Bob 需要比费马小定理更强大的方法来测试一个数字是否为素数。
这种方法应当具有一个优点:每个合数都有大量的证人——从而避开了费马小定理(不能判别卡迈克尔数这样没有证人的合数)的缺陷。这就是所谓的
米勒–拉宾测试
其基于一下两条(模数为素数时)模运算的性质:
命题 1
容易发现 \(1^2 \bmod p\) 和 \((-1)^2 \bmod p\) 总是得到 \(1\) ,称 \(-1\) 和 \(1\) 是 \(1 \bmod p\) 的 "平凡平方根"。则当 \(p\) 是素数且 \(p>2\) 时,不存在 \(1 \bmod p\) 的 "非平凡平方根" 。
证明:
假设 \(x\) 是 \(1 \bmod p\) 的平方根之一,于是有
也就是说,素数 \(p\) 能够整除 \((x-1)(x+1)\) 或者 \(x=p-1\) ,根据欧几里得引理, \(x-1\) 或者 \(x+1\) 能够被 \(p\) 整除,即 \(x \equiv 1 \quad(\bmod p)\) 或 \(x \equiv-1 \quad(\bmod p)\) ,即 \(x\) 是 \(1 \bmod p\) 的平凡平方根。\(\square\)
利用这个引理并结合费马小定理我们很容易证明下面的
命题2
假设 \(n\) 是一个素数,且 \(n>2\) 。于是 \(n-1\) 是一个偶数,可以被表示为 \(2^s d\) 的形式, \(s\) 和 \(d\) 都是正整数且 \(d\) 是奇数。对任意非零整数 \(a\),必须满足以下两个等式中的至少一个:
其中 \(r\) 是某个满足 \(0 \leq r \leq s-1\) 的整数。
证明: 提示:\(a^{2^sd}\equiv 1 \pmod{n}\)
米勒-拉宾素性测试就是基于上述原理的逆否,也就是说,如果我们能找到这样一个 \(a\) ,使得对任意 \(0 \leq r \leq s-1\) 以下两个式子均满足:
那么 \(n\) 就不是一个素数,而是一个合数。这样的 \(a\) 称为 \(n\) 是合数的一个Miller-Rabin 证人.
为什么这比使用费马小定理测试更好呢?答案是,对于 \(\mathrm{Miller–Rabin}\) 测试而言,不存在类似卡迈克尔数的数字,实际上,每一个合数都有大量的 Miller–Rabin 证人,正如以下定理所述。
定理 3
设 $ n $ 为一个奇合数。那么,介于 \(1\) 和 $ n-1 $ 之间的至少 \(75\%\) 的数 $ a $,都是 $ n $ 的 Miller–Rabin 证人。

浙公网安备 33010602011771号