Project Euler Problem 5

module Enumerable
  def product
    inject(1) {|a, n| a * n }
  end
end

def sieve(upper)
  table = Array.new(upper + 1, false)
  (2 .. upper).inject([]) do |primes, guess|
    unless table[guess]
      primes << guess
      (guess * 2).step(upper, guess) {|n| table[n] = true }
    end
    primes
  end
end

def f(upper)
  n = n0 = sieve(upper).product
  n += n0 while (2 .. upper).any? {|m| not (n % m).zero? } 
  n
end

p f(10)
p f(20)