大牛来看一下这个我写的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;
}
...全文
149 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
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

33,321

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧