首先,我在这个论坛中查找了很多东西,但没有找到足够快速的东西。 我尝试创建一个函数,在指定的范围内返回素数。 例如,我使用埃拉托斯特尼筛法编写了此函数(使用C#)。 我也尝试了Atkin's筛法,但Eratosthenes的实现运行得更快:
public static void SetPrimesSieve(int Range)
{
Primes = new List<uint>();
Primes.Add(2);
int Half = (Range - 1) >> 1;
BitArray Nums = new BitArray(Half, false);
int Sqrt = (int)Math.Sqrt(Range);
for (int i = 3, j; i <= Sqrt; )
{
for (j = ((i * i) >> 1) - 1; j < Half; j += i)
Nums[j] = true;
do
i += 2;
while (i <= Sqrt && Nums[(i >> 1) - 1]);
}
for (int i = 0; i < Half; ++i)
if (!Nums[i])
Primes.Add((uint)(i << 1) + 3);
}
它的运行速度比我发现的代码和算法快了两倍左右......应该有更快的方法来查找质数,你能帮我吗?
SetPrimesSieve(1e9)
,它每秒计算出一百万个质数。我怀疑有很少的算法能够每秒计算超过一百万个东西! - Gabe