Вместо того, чтобы копировать Ruby-версию этого алгоритма из сети, я хотел создать свою собственную на основе его описания здесь а>. Однако я не могу понять две вещи
def primeSieve(n)
primes = Array.new
for i in 0..n-2
primes[i] = i+2
end
index = 0
while Math.sqrt(primes.last).ceil > primes[index]
(primes[index] ** 2).step(primes.length - 1, primes[index])
{|x| x % primes[index] == 0 ? primes.delete(x) : ""}
index += 1
end
primes
end
- Почему он не повторяется до конца массива?
- Согласно описанию в приведенной выше ссылке, цикл должен прерываться, когда квадратный корень последнего элемента в массиве больше текущего простого числа - мой делает это раньше.
Я вполне уверен, что это как-то связано с операцией удаления, изменяющей длину массива. Например, моя функция в настоящее время дает 2,3,5,7,9,10, когда я ввожу n=10, что явно неверно. Любые предложения о том, как я могу изменить это, чтобы заставить его работать так, как предполагалось?