【发布时间】:2016-02-02 16:41:18
【问题描述】:
这是一段代码,使用以下语句计算从 2 到 1000 的所有素数,即数字 n 是素数 iff:
在第一个版本中,我认为我正确地实现了算法:
public class Giuga {
public static void main(String[] args){
int n = 2;
while(n<=1000){
int k = 1;
long sum = 0;
while(k<=n-1){
sum = sum+(long)Math.pow((double)k,(double)n-1);
k++;
}
if(sum%n==n-1){
System.out.println(n + " is a prime.");
}
n++;
}
}
}
但是,由于变量sum 快速增长,会发生溢出,在素数 17 之后将不再有输出。
为了防止我不得不使用这个:
嗯,我做到了,这是我的 2. 版本:
public class Giuga {
public static void main(String[] args){
int n = 2;
while(n<=1000){
int k = 1;
long sum = 0;
while(k<=n-1){
sum = sum+((long)Math.pow((double)k%n,(double)n-1))%n; //Here are the changes
k++;
}
if(sum%n==n-1){
System.out.println(n + " is a prime.");
}
n++;
}
}
}
我认为我做对了,但现在输出在素数 13 之后停止。
我试图找出我的错误已经有一段时间了。我究竟做错了什么? 从 2 到 1000 必须有 168 个素数。
【问题讨论】:
-
嗯...这个方程看起来就像适用于所有可能基的费马小定理。但如果是这样,那么它只是一个必要条件,而不是一个足够找到所有素数的条件。 Charmicael 数也应满足该等式。