在范围内找到素数的最快方法是什么?

时间:2017-01-30 16:03:28

标签: c++ performance processing-efficiency

我有这段代码来查找素数:

void writePrimesToFile(int begin, int end, ofstream& file)
{
bool isPrime = 0;
for (int i = begin; i < end; i = i+2)
{
    isPrime = 1;
    for (int j = 2; j<i; j++)
        if (i % j == 0)
        {
            isPrime = 0;
            break;
        }
    if (isPrime)
        file << i << " \n";
}
}

有更快的方法吗? 我尝试使用Google搜索更快的方式,但是我不知道如何将其转换为代码。

1 个答案:

答案 0 :(得分:4)

  

有更快的方法吗?

是。有更快的素性测试算法。

  

查找范围内素数的最快方法是什么?

没有人知道。如果有人知道,那个人正在守着一个非常重要的秘密。没有人能够证明任何已知技术是测试素性的最快方法。

您可能已经问过:查找范围内素数的最快已知方法是什么。

答案就是:这取决于。某些算法的复杂性渐渐渐渐慢于其他算法,但如果输入数量很小则无关紧要。有些概率方法对于某些数字来说非常快,但是在有问题的情况下它们比确定性方法慢。

您输入的数字很小,因为它们的类型为int,因此范围非常有限。对于较小的数字,简单的算法可能比更复杂的算法更快。要找出最适合您用例的算法,您必须对它们进行基准测试。

我建议从Sieve of Eratosthenes开始,因为它比你天真的方法渐近快,但也很容易实现(伪代码由维基百科提供):

Input: an integer n > 1

 Let A be an array of Boolean values, indexed by integers 2 to n,
 initially all set to true.

 for i = 2, 3, 4, ..., not exceeding √n:
   if A[i] is true:
     for j = i², i²+i, i²+2i, i²+3i, ..., not exceeding n :
       A[j] := false

 Output: all i such that A[i] is true.