module Prime extend Enumerable class PrimeGenerator def initialize() @h = {} @n = nil end def primes() @h.values().unshift(2) end def succ() @n = 1 class << self def succ() n = @n while true m = n += 1 if (b = @h[n]) while(@h[m += b]); end @h[m] = b @h.delete(n) end m = n += 1 if (b = @h[n]) while(@h[m += b]); end @h[m] = b @h.delete(n) else while(@h[m += n]); end return @n = @h[m] = n end end end alias next succ end 2 end alias next succ def self.each() end end def self.each() g = PrimeGenerator.new() while (n = g.succ()) yield(n) end end end # module Prime