我有一个随机数数组,我必须从该数组返回质数。我对root(n)解决方案很熟悉(n是该特定数字而不是数组的大小)。我不能使用Eratosthenes筛子,因为它可以在一定范围内使用数字,但是这里的数字是完全随机的。
如果我缺少某些东西,请纠正我。 预先感谢!
答案 0 :(得分:1)
您正在寻找素数测试。您应该能够搜索并找到很多可能性。这是我几年前写的答案,可能远远超出您的期望:
Fastest way to find if a given number is prime
对于大多数大于64位的数字,其中有很多可能的题外话和选择,其中大多数细节都是如此。对于64位输入,简单合理的答案是使用少量的试验除法,然后进行精心设计的Miller-Rabin测试集,这些测试集可提供确定的结果(如果正确实施,既不会使用随机性,也不会出错)。如果您想优化一点,那么可以考虑使用散列集和BPSW。
附录:在某些情况下,如果输入的数量远大于最大输入大小或唯一输入的数量,或者存在某种分布(例如期望),则可以更快地完成许多重复的输入。这样,诸如缓存或为快速查找生成位集之类的解决方案可能会更快。对输入集的了解很有帮助。
答案 1 :(得分:0)
如果空间很重要,并且您熟悉c ++,则可以使用bitset代替bool,这将提高8倍,因为bool将8位用于元素,而bitset仅使用一位来存储值1或0 ;
const int SIZE = 1000000;
const int LIMIT = sqrt(SIZE)+1;
bitset<SIZE> prime;
void sieve() {
prime.flip();
prime[1]=0;
for(int i=2;i<=LIMIT;i++) {
if (prime[i])
for(int j=2*i;j<SIZE;j+=i)
prime[j]=0;
}
}
bool isPrime(int n) {
return prime[n];
}
答案 2 :(得分:0)
每个素数都与6n相邻(其中n> = 1)。
首先检查数字是否与6的倍数相邻。
如果该数字是相邻的,则对该数字应用素数测试算法。 6n方法的理由: https://www.youtube.com/watch?v=ZMkIiFs35HQ