まず第一に、私はこのフォーラムで多くのことをチェックしましたが、十分に速いものを見つけられませんでした。指定された範囲の素数を返す関数を作成しようとしています。たとえば、エラトステネスの篩を使用してこの関数を (C# で) 実行しました。Atkin のふるいも試しましたが、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);
}
私が見つけたコードとアルゴリズムよりも約 2 倍高速に実行されます...素数を見つけるためのより高速な方法があるはずです。