static List<long> primes
特定の時点までのすべての既知の素数と、次のような関数があります。
static bool isPrime(long p)
{
double rootP = Math.Sqrt(p);
foreach (long q in primes)
{
if (p % q == 0)
return false;
if (q >= rootP)
return true;
}
return true;
}
これは次のように並列化できます。
static bool isPrime(long p)
{
double rootP = Math.Sqrt(p);
primes.AsParallel().ForAll(q =>
{
if (p % q == 0)
return false;
if (q > rootP)
break;
});
return true;
}
ただし、これにより、ブロック内の一部の戻り値の型がデリゲートの戻り値の型に暗黙的に変換できないというコンパイル時エラーが発生します。
私はLINQ、特にPLINQに少し慣れていません。これは、候補素数に対する既知の各素数のチェックが独立したプロセスであるため、並列処理の良い候補のように思えます。
ブロックが機能するように修正する簡単な方法はありますか、それともまったく別の方法でこの問題に取り組む必要がありますか?