算法初接触 | 其他算法[素性测试]

328 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12月更文挑战」的第4天

素性测试

素性测试是判断一个自然数是否为素数的测试。素数(prime number)就是只能被1和其自身整除,且大于1的自然数。素数从小到大有2、3、5、7、11、13……目前在加密技术中被广泛应用的RSA 算法就会用到大素数,因此“素性测试”在该算法中起到了重要的作用

图解

01

1.jpg
我们来试着判断3599是否为素数吧。简单的方法便是将3599按顺序除以比2大的数字,看是否能被整除。“整除”就是指mod运算的结果为0。由于3599的平方根为59.99…,所以只需要除以从2到59的数字

02

2.jpg
根据mod 运算的结果可知,3599能被59整除。也就是说,3599并不是素数。但假如需要判断的数非常大,这种方法就十分耗费时间。这种时候就可以用“费马测试”来解决这个问题

03

3.jpg
费马测试被称为概率性素性测试,它判断的是“某个数是素数的概率大不大”。在讲解费马测试之前,我们先来学习基础知识——素数的性质。首先来看一看素数5有什么样的性质

04

4.jpg
对于比5小的数,分别计算它们的5次方,结果如上图所示

05

5.jpg
接下来,再对结果分别进行mod运算,求得它们除以5后的余数,结果如上图所示

06

6.jpg
观察原本的数和余数,发现两者一致

07

7.jpg
由此,可以推导出关于素数5,以上公式成立

08

8.jpg
实际上不只是5,对于任意素数p,上面的公式都是成立的。这就是“费马小定理”。根据是否满足费马小定理来判断一个数是否为素数的方法就是“费马测试”

09

9.jpg
那么,我们就用费马测试来判断一下113是否为素数吧

10

10.jpg
随机选择3个比113小的数作为n,计算这些数的113次方,再用113去除得到的结果,求出余数。3个数最后得到的余数都和原本的数相同,因此可以判断113是素数

解说
确认n和余数一致的次数越多,需要判断的数确实为素数的可能性就越大。但是,如果每一个小于p的数都要去计算,就会非常耗费时间。实际上,如果确认了几组n和余数之后就能判断该数是素数的可能性非常高,那么大致就可以判定该数是素数了。
比如在RSA算法中,用于素性测试的是根据费马测试改进而来的“米勒-拉宾(Miller-Rabin)素性测试”。用这个方法重复进行测试后,当数不是素数的概率小于 0.5%时,就可以大致判断该数为素数。