私は最近、非常に大きな数のエラトステネスのセグメント化されたふるいのより高速な実装について読みました。
以下は、同じ実装です。
function sieve(low, high) {
var primeArray = [], ll = Math.sqrt(low), output = [];
for (var i = 0; i < high; i++) {
primeArray[i] = true;
}
for (var i = 2; i <= ll; i++) {
if (primeArray[i]) {
for (var j = i * i; j < high; j += i) {
primeArray[j] = false;
}
}
}
for (var i = 2; i < ll; i++) {
if(primeArray[i])
{
var segmentStart = Math.floor(low/i) * i;
for(var j = segmentStart; j <= high; j+=i)
{
primeArray[j] = false;
}
}
}
for(var i = low; i <= high; i++)
{
if(primeArray[i])
{
output.push(i);
}
}
return output;
};
どこが間違っているのか分からないようです。おそらく長く働きすぎたのでしょう。
例えば:
sieve(4,10)
戻るはずなのに戻っ[5,7]
てくる[5,7,9]