Prime Number
Table of Contents
1. 素数简介
大于 1 的自然数中,除了 1 和该数自身外,无法被其他自然数整除的数(也就是说只有 1 和该数本身两个因数),被称为素数(Prime Number),也称质数。 那些大于 1 的自然数中不是素数的数,被称为合数(Composite Number)。1 既不是素数,也不是合数。
图 1(摘自:https://www.math-salamanders.com/prime-numbers-chart.html) 中黄色背景的数是 100 以内的素数。
Figure 1: 100 以内的素数(共 25 个)
古希腊数学家欧几里得(Euclid)于公元前 300 年前后证明了素数有无限个,参见 Euclid's theorem 。
目前,关于素数的一些问题,如哥德巴赫猜想(每个大于 2 的偶数可表示成两个素数之和)及孪生素数猜想(存在无穷多对相差 2 的素数)等还没有得到解决。
1.1. 素数生成算法
尽管有一些公式可以直接生成素数(Formula for primes),但它们都很低效。一般来说,要生成素数,采用的办法是先随机生成一个数,然后测试它是否是素数,如果它不是素数,则再随机生成另一个数,再测试它是否是素数,这个过程一直继续,直接找到素数为止。
2. 素性测试
2.1. 试除法(Trial Division)
记被测试的自然数为
为什么测试
2.2. 费马素性测试
费马素性测试是利用费马小定理进行素数检验的方法。在介绍它之前,让我们先了解一下费马小定理。
2.2.1. 费马小定理
费马小定理: 如果
需要说明的是: 费马小定理的逆叙述是不成立的,即假设
2.2.2. 费马小定理另一种表述
对于素数
2.2.3. 费马素性测试算法
2.2.4. 费马素性测试算法的缺点
一般来说,增加测试次数
比如,
2.3. Miller-Rabin 测试
Miller-Rabin 测试是另一种素性测试算法,它也利用了费马素性测试的思想。
设
利用上面结论,结合费马小定理,有下面的推导:
上面最后一个式子表明, 如果
具体来说,Miller-Rabin 测试算法如下:
- 把
拆分为 的形式; - 在
范围中随机选择 ,为什么是这个范围,请参见 2.2.3 ; - 测试下面这些式子是否成立:
- 如果上面的式子中有一个成立,则认为
是 Probably Prime;如果上面这些式子都不成立,则 一定不是素数。
和费马素性测试类似,Miller-Rabin 测试也需要执行
我们知道,费马素性测试中,存在卡迈克尔数(Carmichael Number)会使费马素性测试失效;在 Miller-Rabin 测试中目前还没有发现存在这样的数使 Miller-Rabin 测试失效,也就是说只要多选择几次
2.3.1. Miller-Rabin 测试伪代码
Miller-Rabin 测试算法的伪代码如下:
Input #1: n > 2, an odd integer to be tested for primality Input #2: k, the number of rounds of testing to perform Output: "composite" if n is found to be composite, "probably prime" otherwise let s > 0 and d odd > 0 such that n − 1 = 2^s * d # by factoring out powers of 2 from n − 1 repeat k times: a ← random(2, n − 2) t ← a^d mod n if t = 1 then return "probably prime" repeat s times: if t = n - 1 then return "probably prime" t ← t^2 mod n return "composite"
2.3.2. Miller-Rabin 测试实例
假设
- 首先,我们把
写为 的形式,有 ,所以 。 - 随机选择
,我们计算:
,它不等于 ,也不等于 ; ,它等于 。
- 我们发现上面的 3 个检测(第 1 个式子要和
两个数进行相等比较,后续式子只用和 进行相等比较),有一个成立,所以 暂时通过了一轮的 Miller-Rabin 测试; - 再随机选择另一个
,比如 ,我们计算:
,它不等于 ,也不等于 ; ,它不等于 。
- 我们发现当
时,上面的 3 个检测一个也不成立。所以,我们得到结论: 不是素数,事实上 。
2.4. 其它素性测试算法
还有其它的一些素性测试算法,如 Baillie-PSW。和 Miller-Rabin 类似,Baillie–PSW 也是一种概率性算法,也就是说,它只是很大的概率(不是百分百)得到正确的结果。
2002 年,Manindra Agrawal,Neeraj Kayal,Nitin Saxena 提出了首个可在多项式时间内运行的确定性素性测试算法(简称为 AKS 算法),也就是说使用 AKS 算法判断某个数是素数的话,则它百分百是素数。不过,AKS 算法并没有 Miller-Rabin 算法快,因此它并未代替古老的概率性算法。
还有其它的一些素性测试算法,可参考 Taxonomy and Practical Evaluation of Primality Testing 。
3. 素数的分布
我们在使用 Miller-Rabin 测试算法或其他概率性素数测试算法时,发现一个素数之前会测试多少个整数呢? 由素数定理(Prime number theorem)可知,在整数
4. 参考
本文主要参考下面资料:
- https://en.wikipedia.org/wiki/Fermat%27s_little_theorem
- https://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test
- 密码编码学与网络安全——原理与实践(第七版),2.6.3 素数的分布