大牛来看一下这个我写的miler-rabin素数测试有啥问题

醉江楼 2013-01-21 04:40:06
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int modpow(int a,int b,int c)
{
int ans;
a=a%c;
ans=1;
while (b>0)
{
if (b%2==1) ans=(ans*a)%c;
b=b/2;
a=(a*a)%c;
}
return ans;
}
int MillerRabin(int n)
{
int i,a;
for (i=0;i<8;i++)
{
a=rand()%(n-2)+2;
if (modpow(a,n-1,n)!=1) return 0;
}
return 1;
}
int prime(int n)
{
int i;
for (i=2;i*i<=n;i++)
if (n%i==0) return 0;
return 1;
}
int main()
{
int n;
srand(time(NULL));
while (scanf("%d",&n)&&n)
{
MillerRabin(n)?printf("YES!\n"):printf("NO!\n");
prime(n)?printf("YES!\n"):printf("NO!\n");
}

return 0;
}
...全文
105 4 点赞 打赏 收藏 举报
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
FancyMouse 2013-01-22
准确的说,c=565651,但是a和ans平均都可以到20w~30w这个级别,ans*a一样超4字节
  • 打赏
  • 举报
回复
FancyMouse 2013-01-22
引用 2 楼 AQ14AQ1 的回复:
大牛,我用的是vc6.0,int有4个字节,应该不超吧 那MR是不是还有啥二次探测之类的啊 另外我这个程序判断有些数据时出现了把565651这个素数当称合数的情况 大牛教教我啊
a=565651,ans稍微大一些,ans*a就超4字节了啊。 果然是我怀疑的问题。
  • 打赏
  • 举报
回复
醉江楼 2013-01-21
大牛,我用的是vc6.0,int有4个字节,应该不超吧 那MR是不是还有啥二次探测之类的啊 另外我这个程序判断有些数据时出现了把565651这个素数当称合数的情况 大牛教教我啊
  • 打赏
  • 举报
回复
FancyMouse 2013-01-21
首先这不是miller rabin。这只是基本的费马小定理测试。MR还有其他东西的。 然后基本框架没有问题,但是ans*a这里可能会溢出。如果测试数大的话需要换long long
  • 打赏
  • 举报
回复
相关推荐
发帖
新手乐园
加入

3.3w+

社区成员

C/C++ 新手乐园
申请成为版主
帖子事件
创建了帖子
2013-01-21 04:40
社区公告
暂无公告