Вместо того, чтобы удалять версию 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, что, очевидно, не правильно. Любые предложения о том, как я могу изменить это, чтобы оно работало так, как должно?