def sieve(upper)
i = 0
list = (2..upper).to_a
(2..Math.sqrt(upper)).each do |mult|
if list[i] # list[i]==mult
init = mult + i # list[init]==mult*2
(init..upper-1).step(mult) do |index|
list[index] = nil # 0-based index: list[0]==2
end
end
i += 1
end
list.compact
end
puts sieve(2000000).length
ZGVmIHNpZXZlKHVwcGVyKQogIGkgPSAwCiAgbGlzdCA9ICgyLi51cHBlcikudG9fYQoKICAoMi4uTWF0aC5zcXJ0KHVwcGVyKSkuZWFjaCBkbyB8bXVsdHwKICAJaWYgbGlzdFtpXSAgICAgICAgICMgbGlzdFtpXT09bXVsdAogICAgICBpbml0ID0gbXVsdCArIGkgICMgbGlzdFtpbml0XT09bXVsdCoyCiAgICAgIChpbml0Li51cHBlci0xKS5zdGVwKG11bHQpIGRvIHxpbmRleHwKICAgICAgICBsaXN0W2luZGV4XSA9IG5pbCAgIyAwLWJhc2VkIGluZGV4OiBsaXN0WzBdPT0yCiAgICAgIGVuZAogICAgZW5kCiAgICBpICs9IDEKICBlbmQKICBsaXN0LmNvbXBhY3QKZW5kCgpwdXRzIHNpZXZlKDIwMDAwMDApLmxlbmd0aA==
MTAwazogOTU5MjogIDAuMTZzIDcuOU1CICAgICAgICAgICAgIyMgd2l0aCBpZiBsaXN0W2ldICMjIAoyMDBrOiAxNzk4NDogMC4zNXMgOC42TUIgICAgICAgICAgICAgICAwLjE1cwo0MDBrOiAzMzg2MDogMC43NXMgOS45TUIgICBuXjEuMjAgICAgICAwLjI5cyAgICAgbl4xLjA0CjFtbG46IDc4NDk4OiAyLjBzIDEzLjFNQiAgIG5eMS4xNiAgICAgIDAuNzFzICAgICBuXjEuMDYKMm1sbjogMTQ4OTMzICAgICAgICAyME1CICAgICAgICAgICAgICAgMS40NXMgICAgIG5eMS4xMQoKaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xODk5NDA1OS8KIGltcHJvdmluZy1lZmZpY2llbmN5LW9mLW15LXNpZXZlLW9mLWVyYXRvc3RoZW5lcy1pbi1ydWJ5Cgo=
100k: 9592: 0.16s 7.9MB ## with if list[i] ##
200k: 17984: 0.35s 8.6MB 0.15s
400k: 33860: 0.75s 9.9MB n^1.20 0.29s n^1.04
1mln: 78498: 2.0s 13.1MB n^1.16 0.71s n^1.06
2mln: 148933 20MB 1.45s n^1.11
http://stackoverflow.com/questions/18994059/
improving-efficiency-of-my-sieve-of-eratosthenes-in-ruby