Вместо того, чтобы очищать 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
- Почему он не выполняет итерацию до конца массива?
- В соответствии с описанием в ссылке выше цикл должен быть разбит, когда squareroot из последнего элемента в массиве больше, чем текущий первичный ключ, который делает это раньше.
Я уверен, что это имеет какое-то отношение к операции удаления, изменяющей длину массива. Например, моя функция в настоящее время дает 2,3,5,7,9,10 при вводе n = 10, что, очевидно, неверно. Любые предложения о том, как я могу изменить это, чтобы заставить его работать так, как это предполагалось?