【发布时间】:2011-04-17 03:51:03
【问题描述】:
多年来,我一直对寻找更好的素数识别器的问题感兴趣。我意识到这是一个巨大的学术研究领域——我对此的兴趣实际上只是为了好玩。这是我在 C 语言中第一次尝试可能的解决方案(见下文)。
我的问题是,您能否提出改进建议(不引用网上的其他参考资料,我正在寻找实际的 C 代码)?我试图从中获得的是更好地理解确定此类解决方案的性能复杂性。
我是否认为这个解决方案的复杂度是 O(n^2)?
#include <stdio.h>
#include <math.h>
/* isprime */
/* Test if each number in the list from stdin is prime. */
/* Output will only print the prime numbers in the list. */
int main(int argc, char* argv[]) {
int returnValue = 0;
int i;
int ceiling;
int input = 0;
int factorFound = 0;
while (scanf("%d", &input) != EOF) {
ceiling = (int)sqrt(input);
if (input == 1) {
factorFound = 1;
}
for (i = 2; i <= ceiling; i++) {
if (input % i == 0) {
factorFound = 1;
}
}
if (factorFound == 0) {
printf("%d\n", input);
}
factorFound = 0;
}
return returnValue;
}
【问题讨论】:
-
实际上是
O(n)。算法是O(n^0.5),但while循环使它成为O(m*n^0.5)或O(m)。 -
这是最基本的素数生成器的一种形式。问题是,当 N 变得非常大时,该算法运行非常缓慢。查看下面提到的 AKS 测试,以及一般的筛分理论。我也会为不同的用途使用不同的方法,这取决于你想要做什么:你需要小素数还是大素数?可能是素数还是“真正的”素数?算法和实现将根据要求而有所不同。
-
理想情况下,由于您在 N(输入)上循环,您应该建立一个已知 PN 的表并用它来划分数字,每次尝试一个新数字时,它会越来越快。如果你想知道 1 到 N 之间有多少个 PN,primes.utm.edu/howmany.shtml
-
请注意,这是一个长期受到严格学术审查的领域。如果您这样做是为了好玩或作为编码练习,那很好。如果你是认真的,你有相当多的阅读要做......
-
我实际上检查了我的 SO userId...它不是素数 :(
标签: c algorithm performance primes