Windows PowerShellでProject Euler(13) エラトステネスのふるい

Problem 7

この問題はふつうにエラトステネスのふるいでよいでしょう。どれだけの大きさの配列を用意すればいいかわかりませんが(素数定理を使えば概算できますが)、上限が不明なときの問題解決法に書いたように倍々にすればよいでしょう。

filter map($f) { & $f }

function make_primes($N) {
    $a = (0..$N | map { $true })
    foreach($p in (2..$N | where { $a[$_] })) {
        for($m = $p * $p; $m -le $N; $m += $p) {
            $a[$m] = $false
        }
    }
    2..$N | where { $a[$_] }
}

$M = 10001
for($N = $M; $true; $N *= 2) {
    $ps = make_primes($N)
    if($ps.length -ge $M) {
        $ps[$M-1]
        break
    }
}

しかし、遅いですね。