100までの整数から素数を列挙せよ

普通に実装。(追記:不等号、間違っていたので直しました)。

def prime(n = 100, &block)
  is_prime = Array.new(n + 1, true)
  is_prime[0] = false
  is_prime[1] = false
  (2..n).each do |p|
    next unless is_prime[p]
    block.call(p)
    k = p + p
    while k <= n
      is_prime[k] = false
      k += p
    end
  end
  is_prime
end

prime(1000000) do |p|
  print "#{p}, "
end

追記:最後にis_primeを戻しているのは後で調べ物をするときのためです。たとえば999907は素数かな?

def nil.call(*a)
end

def prime(n = 100, &block)
  is_prime = Array.new(n + 1, true)
  is_prime[0] = false
  is_prime[1] = false
  (2..n).each do |p|
    next unless is_prime[p]
    block.call(p)
    k = p + p
    while k <= n
      is_prime[k] = false
      k += p
    end
  end
  is_prime
end

a = prime(1000000)
p a[999907]         #=> true