miller_rabin素性测试

给出一个非常大的数,判断它是不是素数
对于较小的数,可以枚举内每一个数试除,若能整除则非素数,这么做的复杂度为
对于较大的整数,如级别的数,不够用了
所以去学了一下miller_rabin测试法
miller_rabin测试法是一个随机算法,虽然不能保证完全正确,但是判断64位整数范围内的数够了(大概

费马小定理

是素数且,则
我们可以随机的枚举范围内的数,若不符合上述定理,则显然是合数
但是这个定理只是必要条件,并不是充分条件
存在一类叫做卡迈克尔数的数,也满足上述条件,但是他们是合数,比如

二次探测定理

是奇素数,则的解要么是,要么是
证明

  • 因为,所以
  • 所以
  • 所以
  • 或者

做法

结合上述两个定理同时来判断,就可以大大提高测试的准确性

  • 对于一个整数,如果是偶数直接返回即可
  • 如果是奇数,随机一个的整数,令,则
  • 如果那么继续判断依此类推,直到或者
  • 因为如果是一个素数,且那么或者,对于第一个情况可以继续递归,对于第二个情况可以直接返回结果