素数测试是判断一个自然数是否为素数的一种方法。
在现在加密技术中,经常使用的“RSA加密技术”可以处理非常大的素数,就使用了素数测试。关于RSA算法可以阅读以下这个(https://www.jianshu.com/p/fbb8bf7baa97)
举个例子:判断5183是不是素数。
一般通用方法,将5183除以大于2的数,看能不能整除。
5183的平方根是71.99305522062528所以按照2到71的顺序求取模操作,存在取模为0时就判断是合数不是素数。
5183 mod 2 = 1
5183 mod 3 = 2
: : :
5183 mod 70 = 3
5183 mod 71 = 0
一直取模操作,直到对71取模,结果为0, 所以5183不是素数,是个合数。
这种方法可以判断出一个数是否为素数,这是一种暴力的方法。但是当一个数非常大的时候,用这种办法会花掉许多的时间。
那有没有一种办法可以快速的判断一个数是否为素数呢?当然有。“费马素性检验”就是一种解决方法。
我们先了解一下素数的一些性质:
7 is 素数
mod 7 = 1
mod 7 = 1
mod 7 = 1
mod 7 = 1
mod 7 = 1
mod 7 = 1
mod 7 = 0
费马小定理:
如果p是一个质数,而整数a不是p的倍数,则有a^(p-1)≡1(mod p)。
(解释一下,等式意思就是“≡”左边的“a^(p-1)”对“p”取模等于右边的“1”对“p”取模)
按费马小定理,如果一个奇数n不能整除 ,则n必为合数(这是费马小定理的一个逆否命题)。但是,如果奇数n>1能整除
, n就一定是素数吗?1819年,法国数学家沙路斯发现,虽然341整除
,但341是合数,341=11×31。这一反例表明费马小定理的逆定理不成立。事实上,费马小定理给出的是关于素数判定的必要非充分条件。若n能整除2^(n-1)-1,并n是非偶数的合数,那么n就是伪素数。它满足费马小定理,但其本身却不是素数。最小的伪素数是341。有人已经证明了伪素数的个数是无穷的。
更极端的反例是卡迈克尔数: 假设a与561互质,则 被561除都余1。这样的数被称为卡迈克尔数数,561是最小的卡迈克尔数。已经证明证明了卡迈克尔数有无穷多个。
通过是否满足费马小定理来确定素数的方法被称为“费马素性检验”。
费马素性检验是一种素数判定法则,利用随机化算法判断一个数是合数还是可能是素数。
让我们使用费马测试来判断数字127是否是素数。
随机取三个小于127的数字。
mod 127 =1
mod 127 =1
mod 127 =1
再增加几个随机数测试,随机所取得数字都满足了费马小定理。匹配得到确认的次数越多,这个数为素数的可能性越大,如果遇到了一次不满足费马测试的情况,它就不是素数。
然而,选取所有小于“p”(判断p是否为素数)的数字进行检测是非常耗时的。
实际中,检查几个数字是否满足,如果可以判断是素数的可能性足够高的话,就可以判断这是个素数。
增加随机数的选取,多做几次检验,当判断不是素数的概率小于的情况下,就判断为素数。
例如,改进的费马素性检验,米勒-拉宾素性检验使用于确定RSA加密算法中的素数。
看到这里,我么已经可以了解到了:
- 如果检测的数是一个素数,那么它一定满足所有的费马素性检验。
- 如果检测的数是一个合数,那么它会被大部分的费马素性检验卡住;但是存在非常少的合数也会满足所有的费马素性检验(比如561,它是个合数561=1*187=11*51,但它满足所有费马素性检验,这类数就是卡迈克尔数,这类数字很少)。
素数满足所有的费马素性检验,但是即使一个数满足了所有的费马素性检验,也不能确定它一定是素数。
费马素性检验是一个概率素数确定方法。
但是,判定一个大数是否为素数目前还没有其他更有效的方法。
在实际中,一般情况下我们还是使用费马素性检验。