米勒—拉宾 素性测试(Miller–Rabin primality test)

数论知识

欧拉定理

a ϕ ( n ) 1 ( m o d   n ) a n a^{\phi(n)}\equiv1(mod\ n) \qquad a与n为正整数且互质

费马小定理

若p为素数,且存在a与p互质(任意的a<p都满足),此时 ϕ ( p ) = p 1 \phi(p)=p-1 ,根据欧拉定理有,
a p 1 1 ( m o d   n ) a^{p-1}\equiv1(mod\ n)

二次探测定理

已知p为素数且 x &lt; p x&lt;p 考虑方程 x 2 1 ( m o d   p ) x^2\equiv1(mod\ p) 有解,则 x = 1 x=1 或者 x = p 1 x=p-1

证明:
x 2 1 0 ( m o d   p ) ( x + 1 ) ( x 1 ) = k p x^2-1\equiv0(mod\ p) \\ (x+1)(x-1) = k*p
k = 0 k=0 时, x = 1 x=1 ;当 k = 1 k=1 时, x = p 1 x=p-1 ;当 k &gt; 1 k&gt;1 时,不存在 x &lt; p x&lt;p

素性测试

费马测试

费马小定理毕竟只是素数判定的一个必要条件,并非充分条件。下面我们定义卡迈克尔数

若合数n且任意与n互质的a,都有 a n 1 1 ( m o d   n ) a^{n-1}\equiv1(mod\ n) ,则n被称为卡迈克尔数。

我们做费马测试时,可能对目标p进行测试,选择不同的基数如2(令a=2)

  • 通过基数为2费马测试,则很大概率为素数(注意通过基数为2的费马测试的合数不一定是卡迈克尔数,因为卡马克尔数是对任意与n互质的a),称为以2为基的伪素数
  • 否则,必为合数

Miller-Rabin素性测试

Miller-Rabin素性测试为概率性算法,操作对象是我们从费马测试得到的以2为基的伪素数,有 2 n 1 1 ( m o d   n ) 2^{n-1}\equiv1(mod\ n)

假设p为素数,此时对照二次探测定理,有 x 1 2 = 2 n 1 ( m o d   n ) {x_1}^2 = 2^{n-1}(mod\ n) ,则有 x 1 = 2 n 1 2 x_1=2^{\frac{n-1}{2}} ,此时 x 1 = 1 x_1=1 x 1 = n 1 x_1=n-1 。综上, x 1 1 ( m o d   n ) x_1\equiv1(mod\ n)

递归下去,令 x 2 2 = x 1 {x_2}^2=x_1 ,有 x 2 2 1 ( m o d   n ) {x_2}^2\equiv1(mod\ n) ,此时 x 2 = x 1 1 2 = 2 n 1 2 2 x_2={x_1}^{\frac{1}{2}}=2^{\frac{n-1}{2^2}} ,此时 x 2 1 ( m o d   n ) x_2\equiv1(mod\ n)

这样一直检验下去…

代码实现

//TODO:

更多参考(很有很多要补充的)

https://blog.csdn.net/ltyqljhwcm/article/details/53045840
https://www.xuebuyuan.com/552593.html
http://www.cnblogs.com/TenosDoIt/p/3398112.html
http://blog.chinaunix.net/uid-21712186-id-1818141.html

猜你喜欢

转载自blog.csdn.net/jason_cuijiahui/article/details/86558449