C语言中的费马素性测试失败 #包括 #包括 #包括 #包括 #定义最大值20000000000 #定义MINNUM 1990000001 #定义最大值10 无符号长b,e,m,结果; 整数模(b,e,m) { 结果=1; 而(e>0) { 如果(e%2==1) { 结果=(结果*b); } b=(b*b)%m; e=e/2; } 返回结果%m; } int iPrime(n) { 无符号长a; int i; 对于(i=1;i
而言,主要问题似乎是由C语言中的费马素性测试失败 #包括 #包括 #包括 #包括 #定义最大值20000000000 #定义MINNUM 1990000001 #定义最大值10 无符号长b,e,m,结果; 整数模(b,e,m) { 结果=1; 而(e>0) { 如果(e%2==1) { 结果=(结果*b); } b=(b*b)%m; e=e/2; } 返回结果%m; } int iPrime(n) { 无符号长a; int i; 对于(i=1;i,c,testing,primes,C,Testing,Primes,而言,主要问题似乎是由modulo()函数中的整数溢出引起的。具体而言,result=(result*b)将定期溢出。您需要将这些变量存储在64位无符号整数中,并每次计算此结果的模 这将起作用(其他地方有一些小的修正): 你的问题是什么?@UniCell它显然发现了错误的结果,我不明白它为什么会这样做。关于解决这个问题有什么建议吗?你确定result=(result*b)没有溢出吗?如果你在这个函数的末尾返回result%m,那么你为什么不改为result=(result*b)%m(不管怎样),
modulo()
函数中的整数溢出引起的。具体而言,result=(result*b)
将定期溢出。您需要将这些变量存储在64位无符号整数中,并每次计算此结果的模
这将起作用(其他地方有一些小的修正):
你的问题是什么?@UniCell它显然发现了错误的结果,我不明白它为什么会这样做。关于解决这个问题有什么建议吗?你确定
result=(result*b)
没有溢出吗?如果你在这个函数的末尾返回result%m
,那么你为什么不改为result=(result*b)%m
(不管怎样),为什么要将其声明为全局变量(特别是因为在其他函数中使用了同名的局部变量)??如果不编写实际输出,它应该输出什么,那么就不那么明显了,还尝试过使用调试器“一步一步”吗通过你的代码看看出了什么问题?你的代码是不可编译的,你不能用int模(b,e,m){…}之类的东西实现函数
。您的一些文本没有正确缩进。这些全局变量在函数中应该是局部的模
。如果您希望人们努力回答您的问题,我认为您应该在问题上投入更多的精力。实际上,它可以在不使用库的情况下工作,而不使用mo的无符号长-长类型dulo函数及其参数。谢谢!
#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;
}
#include <inttypes.h>
#define MAXNUM 2000000000
#define MINNUM 1990000001
#define MAXTRIES 10
uint64_t modulo(uint64_t b, uint64_t e, uint64_t m){
uint64_t result=1;
while(e>0){
if(e%2==1){
result=(result*b)%m;
}
b=(b*b)%m;
e=e/2;
}
return result%m;
}
Checking range [1990000001, 2000000000] for prime numbers.
Trying Fermat test with seed 1416322197
Probabilistic algorithm: Found 466646 primes in 5.157485 seconds.(tries=1)