Processing math: 93%
0%

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

基本原理:

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

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

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

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

1、找出整数k,q,其中k>0,q是奇数,使(n1=q2k)

2、随机选取整数a,1<a<n1

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

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

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

具体代码实现

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

运行结果如下:

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