从随机数数组识别素数最快的算法是什么?

时间:2019-01-12 09:59:08

标签: algorithm random time-complexity primes primality-test

我有一个随机数数组,我必须从该数组返回质数。我对root(n)解决方案很熟悉(n是该特定数字而不是数组的大小)。我不能使用Eratosthenes筛子,因为它可以在一定范围内使用数字,但是这里的数字是完全随机的。

如果我缺少某些东西,请纠正我。 预先感谢!

3 个答案:

答案 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