【发布时间】:2014-11-18 14:31:56
【问题描述】:
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <stdlib.h>
#define MAXNUM 2000000000
#define MINNUM 1990000001
#define MAXTRIES 10
unsigned long long b, e, m, result;
int modulo(b, e, m)
{
result = 1;
while(e > 0)
{
if(e % 2 == 1)
{
result = (result * b);
}
b = (b * b) % m;
e = e / 2;
}
return result % m;
}
int isPrime(n)
{
unsigned long long a;
int i;
for(i = 1; i <= 10; i++)
{
a = rand() % (n - 1) + 1;
if(modulo(a, n - 1, n) != 1)
{
return 0;
}
}
return 1;
}
int main()
{
unsigned int prime = 0;
unsigned int flag = 0;
unsigned int tries;
unsigned int start;
long curtime;
unsigned long long p;
curtime = time(NULL);
srand((unsigned int) curtime);
printf("Checking range [1990000001, 2000000000] for prime numbers.\n");
if(MINNUM % 2 == 0)
{
start = MINNUM + 1;
}
else
{
start = MINNUM;
}
printf("Trying Fermat test with seed %ld \n\n",curtime);
prime = 0;
for(tries = 1; tries <= MAXTRIES; tries++)
{
clock_t tic = clock();
for(p = start; p <= MAXNUM; p += 2)
{
if(isPrime(p))
prime++;
}
clock_t toc = clock();
printf("Probabilistic algorithm: Found %ld primes in %f seconds.(tries = %d)\n", prime, (double)(toc - tic) / CLOCKS_PER_SEC,tries);
prime = 0;
}
return 0;
}
所以问题是该算法在每次尝试中找到 5000000 个素数,而它应该找到大约 466646 并有一些偏差。这意味着在每次尝试中,它都应该找到接近上述素数的数量。
【问题讨论】:
-
你有什么问题?
-
@UniCell 它显然找到了错误的结果,我不知道为什么会这样。有解决此问题的建议吗?
-
你确定
result=(result*b)不会溢出吗?如果你在这个函数的最后返回result%m,那你为什么不做result=(result*b)%m呢?另外(不管怎样),你为什么将它声明为全局变量(特别是因为你在其他函数之一中使用了同名的局部变量)??? -
如果你不写什么是实际输出,它应该输出什么就不那么明显了,你也试过使用调试器“一步一步”通过你的代码来看看有什么问题吗?
-
你的代码不可编译,你不能用
int modulo(b,e,m){...}之类的东西实现一个函数。您的某些文本没有正确缩进。这些全局变量肯定应该是函数modulo中的局部变量。如果您希望人们努力回答它,我认为您应该在您的问题上付出更多的努力。