5 素性测试
5 素性测试
给定一个正整数\(n\),判断\(n\)是不是素数,称为素性测试。事实上,我只需要关注正奇数是否为素数即可,因为偶素数只有2。
素性测试可以分为两种:
- 确定性算法:指算法输出的结果是确定的,即能够准确判断一个数是否为素数。
- 概率性算法:指算法输出的结果高概率成立。概率性算法应该包含两方面内容:一,素数一定能通过算法的测试。二,合数通过测试的概率足够小。这一点和零知识证明的完备性(completeness)和可靠性(soundness)相同。
5.1 确定性算法
Eratosthenes筛选法:
设正整数\(n>1\),如果对于所有小于等于\(\sqrt{n}\)的素数\(p\),均有\(p\nmid n\),则\(n\)为素数。
如果已经存在一个足够大的素数表,就可以通过上述方法进行判断。但在实际编程实现时,如果没有素数表,判断整数\(n\gt2\)是否为素数,可以将上述方法弱化为:如果在闭区间\([2,\sqrt{n}]\)之间存在一个整数\(k\)使得\(k|n\),说明\(n\)不是素数,否则是素数。
AKS算法:
2002年,由印度理工学院的Agrawal, Kayal和Saxena等三人提出了一种多项式时间的确定性素性测试方法。
设\(x\)为变量,\(a,n\)是两个正整数且\((a,n)=1\),则\(n\)为素数当且仅当
这里仅验证当\(n\)是素数时的情况,即必要性证明:
根据二项式展开:
因为\(C_n^i\)是整数,所以
因为\((i!,n)=1\),即\(i!\)与\(n\)互素,所以
这意味着组合数\(C_n^i\)具有形式:\(C_n^i=nk,k\in\mathbb{N}\),因此
根据费马小定理,可以得到\(a^n\equiv a(mod\;n)\),因此必要性得到验证。
AKS算法的更具体细节,可以参考论文《PRIMES is in P》。
5.2 概率性算法
为了讨论方便,以下我们假设需要测试的整数\(n>3\),且\(n\)是奇数的情况。
5.2.1 简单的概率性算法
我们知道如果整数\(n\)是合数,那么\(n\)一定有一个素因子\(p(1<p<n)\),这也意味着在闭区间\([1,n-1]\)中,一定至少存在一个整数\(x\),使得\((x,n)>1\)。根据辗转相除法容易验证\((1,n)=1,(n,n-1)=1\),因此只需要判断\([2,n-2]\)区间内的整数即可。根据以上事实,我们可以构造概率性算法如下:
假设集合\(D=\{2,3,\cdots,n-2\}\)
(1)随机选取一个整数\(b\),且\(b\in D\)
(2)通过辗转相除法计算\(g=(b,n)\),如果\(g\ne1\),则\(n\)为合数。否则\(n\)可能为素数。
根据欧拉函数的定义,我们可以知道在\([2,n-2]\)之中,与\(n\)互素的整数个数为\(\varphi(n)-2\),且\(0\le\varphi(n)-2\le n-3\)。如果我们重复上述算法\(t\)次,那么整数\(n\)通过测试的概率为:
显然,无论测试几次,素数一定可以通过该测试。对于合数而言,如果我们测试的次数足够多(即\(t\)足够大),那么我们也可以使得合数通过该测试的概率足够小。
5.2.2 Fermat测试法
根据费马小定理,我们知道如果\(n\)为素数且整数\(a\)满足\((a,n)=1\),那么必然有\(a^{n-1}\equiv1(mod\;n)\)。因此,如果存在整数\(a\)且\((a,n)=1\),使得\(a^{n-1}\not\equiv1(mod\;n)\),我们就可以断定\(n\)一定不是素数。基于这个事实,可以构造测试算法,为了讨论该算法的具体细节,首先我们引入定理5-1。
定理5-1: 设\(n\)为一正奇数,如果存在\(b\)且\((b,n)=1\)使得\(b^{n-1}\not\equiv1(mod\;n)\)。则至少有\(\varphi(n)/2\)模\(n\)互不同余,并且与\(n\)互素的数(将这些数记为\(a\))并且\(a\)满足:
算法流程:
(1)随机选取整数\(b\),且\(2\le b\le n-2\)
(2)计算\(g=(b,n)\),如果\(g\ne1\),则\(n\)为合数。
(3)计算\(r\equiv b^{n-1}(mod\;n)\),如果\(r\ne1\),则\(n\)为合数。
(4)如果(2),(3)均未检测出合数,则\(n\)可能为素数。
将上述步骤(1)~(4)重复\(t\)次,在定理5-1成立的前提下,则将合数\(n\)判定为素数的概率不超过\({1}/{2^t}\)。
我们将通过步骤(2)的概率记为\(p_2\),将通过步骤(3)的概率记为\(p_3\),将满足定理5-1整数\(a\)的个数记为\(Q(n)\),所以\(Q(n)\ge\varphi(n)/2\)。因此合数\(n\)通过步骤(3)的概率为
由上一部分可知\(p_2\)的值,所以,合数\(n\)通过一次费马测试的概率为:
因此,合数\(n\)连续通过\(t\)次费马测试的概率不会超过:\((p_2p_3)^t\le1/2^t\)。
算法步骤(2)的作用一方面是可以用于素性测试,另一方面是保证定理5-1的互素条件成立。
需要特殊说明的是,费马小定理仅仅是一个必要非充分条件。事实上存在这样一类合数\(n\),对于满足\((b,n)=1\)的任意整数\(b\),都会有\(b^{n-1}\equiv1(mod\;n)\),这样的数称为卡迈克尔(Carmichael)数。因此,当\(n\)是卡迈克尔数的时候,费马素性测试实际上就退化成了我们在5.2.1中讨论的概率性测试,即费马测试的步骤(3)不会起作用。这是因为此时定理5-1的前提条件已经不成立。
5.2.3 Lehmann测试法
引理: 如果\(n\)为素数,那么\(x^2\equiv1(mod\;n)\)的充要条件为\(x\equiv\pm1(mod\;n)\)。
充分性:显然成立
必要性:
因此我们可以得到\(n|(x+1)(x-1)\),考虑\(1\le x\le n-1\)的情况(因为其他的情况,在模\(n\)的意义下是等价的)。只有当\(x=1\)或\(x=n-1\)的时候,才能使得\(n|(x+1)(x-1)\)成立。因此\(x\equiv\pm1(mod\;n)\)成立。
定理5-2: 如果\(n>0\)是一个奇合数,则至少有\(\varphi(n)/2\)个模\(n\)互不同余且与\(n\)互素的数(将这些数记为\(a\))并且\(a\)满足:
如果我们找到了满足定理5-2的整数\(a\),那么根据上述引理,我们可以判定\(n\)一定不是素数。
算法流程:
(1)随机选取整数\(b\),且\(2\le b\le n-2\)
(2)计算\(g=(b,n)\),如果\(g\ne1\),则\(n\)为合数。
(3)计算\(r\equiv b^{(n-1)/2}(mod\;n)\),如果\(r\ne\pm1\),则\(n\)为合数。
(4)如果(2),(3)均未检测出合数,则\(n\)可能为素数。
将上述步骤(1)~(4)重复\(t\)次,在定理5-2成立的前提下,合数\(n\)被判定为素数的概率不超过\({1}/{2^t}\)
关于算法的几点说明:
- 素数一定能通过上述测试
- 若\(n\)是奇合数,那么\(1^{(n-1)/2}\equiv1,(n-1)^{(n-1)/2}\equiv(-1)^{(n-1)/2}\equiv\pm1(mod\;n)\)一定成立。因此排除\(b=1,n-1\)的情况。
- 步骤(2)起到的作用主要是使得定理5-2中的互素条件成立。
- 定理5-2实际上指出,奇合数通过步骤(3)的概率不超过\(1/2\)。
5.2.4 Miller-Rabin测试法
定理5-3: 如果\(n>0\)是一个奇合数,令\(n=2^sm+1\),其中\(s\ge0\),\(m\)是正奇数。此时,至多只有\((n-1)/4\)个不同的整数\(b\)(模\(n\)意义下),满足以下条件之一:
- \(b^m\equiv1(mod\;n)\)
- 或者存在\(0\le r\lt s\),使得\(b^{2^rm}\equiv-1(mod\;n)\)
算法流程:
(1)在开区间\((0,n)\)之间随机选取整数\(b\)。(实际上可以排除\(b=1\)的情况)
(2)计算\(r\equiv b^m(mod\;n)\),如果\(r\equiv\pm1(mod\;n)\),则\(n\)通过M-R测试。否则执行步骤(3)。
(3)依次计算\(b^{2m},b^{4m},\cdots,b^{2^{s-1}m}(mod\;n)\),只要计算结果出现\(-1(mod\;n)\),则\(n\)通过M-R测试。否则\(n\)为合数。
将上述步骤(1)~(3)重复\(t\)次,如果均通过M-R测试,那么奇合数\(n\)判定为为素数的概率不超过:\(1/4^t\)。
算法说明:
我们首先分析,如果\(n\)是素数的情况下,\(n\)应该满足哪些性质。
首先,根据费马小定理必然有\(b^{2^{s}m}\equiv1(mod\;n)\)成立。然后,对\(b^{2^{s}m}\)进行开方,此时有\(b^{2^{s-1}m}\equiv\pm1(mod\;n)\)。如果开方结果为-1,到此结束;但如果计算结果仍为1,就可以继续开方(最多开方\(s\)次),直到出现-1为止。此时我们就找到了一个\(0\le r<0\),对应着定理5-3条件2。
但也可能存在开方\(s\)次的结果均是1的情况,这时候对应定理5-3的条件1。
通过上述分析我们知道,序列:\(b^m,b^{2m},b^{4m},\cdots,b^{2^{s-1}m}(mod\;n)\)只有两种情况:
其中\(l\ge0\),\(x_i\)表示除了\(\pm1(mod\;n)\)之外的任意数。之所以\(x\)不可能是\(\pm1(mod\;n)\)原因在于,如果\(x_i=\pm1(mod\;n)\),那么\(x_i\)之后的数必然都是1,这就出现了矛盾。
结合具体的算法流程,我们知道素数一定可以通过该测试。
我们接着讨论\(n\)是奇合数的情况,什么样的整数\(b\),才能够使得\(n\)通过测试:
如果\(b^m\equiv1(mod\;n)\),显然有\(b^{2m}\equiv1,b^{4m}\equiv1,\cdots,b^{2^{s-1}m}\equiv1(mod\;n)\)。并且\(b\)此时也会满足费马小定理\(b^{2^{s}m}\equiv1(mod\;n)\),同时也满足第一种序列的情况。
如果\(b^m\equiv-1(mod\;n)\),对应着第二种序列。
如果\(b^m\not\equiv\pm1(mod\;n)\),且存在\(0\lt r\lt s\),使得\(b^{2^rm}\equiv-1(mod\;n)\)。此时\(b^{2^{r+1}m}\equiv1,\cdots,b^{2^{s}m}\equiv1(mod\;n)\),这对应着第二种序列。
上述讨论的三种情况,实际上也就是定理5-3中所阐述的两种条件。如果出现了其他的情况,说明\(n\)一定不是一个素数。此外根据定理5-3,在\(n\)是奇合数的情况下,开区间\((0,n)\)之内使得\(n\)通过M-R测试的整数个数不超过\((n-1)/4\),于是通过一次M-R测试的概率\(P\)满足
于是,如果重复\(t\)次实验,那么合数通过测试的概率满足
5.3 小结
- 上面这几种概率性的算法都是具有一定的误判率,因此只有所测试的实验次数足够大,才能让误判率低到我们可以接受的范围。
- 为什么要有概率性测试的方法?这是因为如果很大的整数来说,直接使用确定性算法所需的时间开销较大。而概率性算法可以概率性算法能够以较低的错误率,更快地判断一个数是否为素数。
- 这些概率性算法的为什么会具有“概率性”:这是由于这些概率性算法的出发点都是基于一个数是素数的必要条件衍生出来的,因此会存在一些合数满足这些判别条件。