关于Miller-Rabin素性测试,高手进
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Miller-Rabin素性测试,高手进相关的知识,希望对你有一定的参考价值。
bool MR_PrimalityTest( long long x )
这里的x的范围是多少?
我问的是x(被测试的数)的范围,不是算法实现- -
#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素性测试,高手进的主要内容,如果未能解决你的问题,请参考以下文章