我有这段代码来查找素数:
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搜索更快的方式,但是我不知道如何将其转换为代码。
答案 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.