关于Miller-Rabin素性测试,高手进

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Miller-Rabin素性测试,高手进相关的知识,希望对你有一定的参考价值。

bool MR_PrimalityTest( long long x )



这里的x的范围是多少?
我问的是x(被测试的数)的范围,不是算法实现- -

#include <iostream.h>
#include <time.h>
#include <stdlib.h>

//随机数产生器
//产生m~n之间的一个随机数
unsigned long random(unsigned long m,unsigned long n)

srand((unsigned long)time(NULL));
return (unsigned long)(m+rand()%n);

//模幂函数
//返回X^Y mod N
long PowMod(long x,long y,long n)

long s, t, u;

s=1; t=x; u=y;
while(u)
if(u&1)s=(s*t)%n;
u>>=1;
t=(t*t)%n;

return s;


//Rabin-Miller素数测试,通过测试返回1,否则返回0。
//n是待测素数。
//注意:通过测试并不一定就是素数,非素数通过测试的概率是1/4

int RabinMillerKnl(unsigned long n)

unsigned long b, m, j, v, i;
//先计算出m、j,使得n-1=m*2^j,其中m是正奇数,j是非负整数
m=n - 1;
j=0;
while(!(m & 1))

++j;
m>>=1;

//随机取一个b,2<=b<n-1
b=random(2,m);
//计算v=b^m mod n
v=PowMod(b, m, n);
//如果v==1,通过测试
if(v == 1)

return 1;


i=1;
//如果v=n-1,通过测试
while(v != n - 1)

//如果i==l,非素数,结束
if(i == j)

return 0;

//v=v^2 mod n,i=i+1
v=PowMod(v, 2, n);
i++;

return 1;

int main()

unsigned long p;
int count=0;
cout<<"请输入一个数字"<<endl;
cin>>p;
for(int temp=0; temp < 5; temp++)

if(RabinMillerKnl(p))

count++;

else
break;



if(count==5)
cout<<"一共通过5次测试,是素数!"<<endl;
else
cout<<"不是素数"<<endl;
return 0;

参考技术A //Rabin-Miller素数测试,通过测试返回1,否则返回0。 //n是待测素数。 //注意:通过测试并不一定就是素数,非素数通过测试的概率是1/4 int

以上是关于关于Miller-Rabin素性测试,高手进的主要内容,如果未能解决你的问题,请参考以下文章

Miller-Rabin素性测试(Python实现)

Miller-Rabin 素性测试

记一次使用快速幂与Miller-Rabin的大素数生成算法

Miller-Rabin素数测试

Miller-Rabin素性判定算法

急急急 求大神帮忙 用vc++ 生成1024位大素数 用到米勒拉宾素性测试