miller_rabin素性测试
给出一个非常大的数,判断它是不是素数
对于较小的数,可以枚举内每一个数试除,若能整除则非素数,这么做的复杂度为
对于较大的整数,如级别的数,不够用了
所以去学了一下miller_rabin测试法
miller_rabin测试法是一个随机算法,虽然不能保证完全正确,但是判断64位整数范围内的数够了(大概
费马小定理
若是素数且
,则
我们可以随机的枚举范围内的数,若不符合上述定理,则
显然是合数
但是这个定理只是必要条件,并不是充分条件
存在一类叫做卡迈克尔数的数,也满足上述条件,但是他们是合数,比如
二次探测定理
若是奇素数,则
的解要么是
,要么是
证明
- 因为
,所以
- 所以
- 所以
- 或者
做法
结合上述两个定理同时来判断,就可以大大提高测试的准确性
- 对于一个整数
,如果是偶数直接返回
即可
- 如果是奇数,随机一个
的整数
,令
,则
- 如果
那么继续判断
依此类推,直到
或者
- 因为如果
是一个素数,且
那么
或者
,对于第一个情况可以继续递归,对于第二个情况可以直接返回结果