- 注册时间
- 2008-2-23
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 507
- 在线时间
- 小时
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?欢迎注册
×
不知是我写错了,还是本来如此,发现65537居然不能通过以3为底的测试。
请教!
我的java代码如下:
boolean IsPrime(int N){
int[] primes =new int[]{2,3,5,7,11}; /底,据说2^32以内的数用这5个底就可以了
if(N<13){
if(N==2 || N==3 || N==5 || N==7 || N==11){
return true;
}else{
return false;
}
}
if(N % 2==0)return false;//不加这句的话,下面紧接着的循环会出错
int m=N-1;int j=0;
while(m % 2==0){ ;//此循环计算(2^j)*m=N-1;
m/=2;
j++;
}
for(int i=0;i<5;i++){
int v=PowMod(primes[i],m,N);//模幂算法
;//v=1,可能是素数,跳过
if(v!=1){;//v不等于1,可能不是素数。
int k=1;
while(v!=N-1){
if(k==j)return false;//一定不是素数,返回false
k++;
v*=v;
v%=N;
}
;//运行到这里,说明v=N-1,可能是素数,跳过
}
;//运行到这里,说明第i次测试可能是素数
}
;//运行到这里,说明在2^32内一定是素数
return true;
}
后来,我把代码改成了这样,就通过了:
boolean IsPrime(int N){
int[] primes =new int[]{2,3,5,7,11};
if(N<13){
if(N==2 || N==3 || N==5 || N==7 || N==11){
return true;
}else{
return false;
}
}
for(int i=0;i<5;i++){
int v=PowMod(primes[i],N-1,N);
if(v!=1 && v!=N-1){
return false;
}
}
return true;
}
请问为什么? |
|