単なるエラトステネスのふるいですが、さすがに遅いです。今回は時間測定しました。10分かかりました。
function make_primes($N) {
$a = (0..$N | foreach { $true })
foreach($p in (2..$N | where { $a[$_] })) {
for($m = $p * $p; $m -le $N; $m += $p) {
$a[$m] = $false
}
}
2..$N | where { $a[$_] }
}
$watch = New-Object System.Diagnostics.Stopwatch
$watch.Start();
$N = 2000000
(make_primes($N - 1) | measure -Sum).sum
$watch.Stop();
$watch.Elapsed.TotalMilliSeconds / 1000