require 'generator' module Prime extend Enumerable def each() h = {} yield(2) n = 1 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 yield(h[m] = n) end end h end module_function :each class PrimeGenerator def initialize() @h = [] @g = Generator.new{|g| Prime.each{|n| g.yield(n) } } end def succ() @g.next() end alias next succ end end # module Prime