0%

【算法编程】基于Miller-Rabin的大素数测试

基本原理:

费尔马小定理:如果$p$是一个素数,且$0<a<p$,则$a^{(p-1)}\%p=1$.
利用费尔马小定理,对于给定的整数$n$,可以设计素数判定算法,通过计算$d=a^{(n-1)}\%n$来判断$n$的素性,当$d!=1$时,$n$肯定不是素数,当$d=1$时,$n$ 很可能是素数.

二次探测定理:如果$p$是一个素数,且$0<x<p$,则方程$x^2\%p=1$的解为:$x=1$或$x=p-1$.
利用二次探测定理,可以再利用费尔马小定理计算$a^{(n-1)}\%n$的过程中增加对整数$n$的二次探测,一旦发现违背二次探测条件,即得出$n$不是素数的结论.

如果$n$是素数,则$(n-1)$必是偶数,因此可令$(n-1)=m*(2^q)$,其中$m$是正奇数(若$n$是偶数,则上面的$m\cdot(2^q)$一定可以分解成一个正奇数乘以$2$的$k$次方的形式 ),$q$是非负整数,考察下面的测试:
序列:
$a^m\%n$; $a^{(2m)}%n$; $a^{(4m)}\%n$;$\cdots$;$a^{(m\cdot 2^q)}\%n$

Miller-Rabin素性测试伪代码描述:

1、找出整数$k$,$q$,其中$k>0$,$q$是奇数,使$(n-1=q\cdot 2^k)$。

2、随机选取整数$a$,$1<a<n-1$。

3、If $a^q$ mod $n=1$, printf(“该数可能是素数!\n”);

4、For $j=0$ to $k-1$ , if $a^{(2^j*q)}$ mod $n = n – 1$, printf(“该数可能是素数!\n”);如果步骤3、4都不成立,则printf(“该数肯定不是素数!\n”)

5、当该数可能是素数时,随机选取整数$a$,$1<a<n-1$。若多次都表明可能是素数,则我们有理由相信该数是素数。

具体代码实现

  1. BigInt.h文件
  1. BigInt.c文件:

运行结果如下:

图1

坚持原创技术分享,您的支持将鼓励我继续创作!