From: "Eric I." Date: 2007-11-19T10:55:00+09:00 Subject: Re: Goedel (#147) One other efficiency I played with was in getting the prime values. It turns out that using the Prime class in the 'mathn' library isn't that fast as you get to higher primes. As a test, try figuring out the 10,000th prime in irb. So, it would be a lot quicker to feed the encoding and decoding processes pre-computed primes. And it turns out you can easily download the first 15 million primes from: http://primes.utm.edu/lists/small/millions/ So, here's a class that can be used in place of the 'mathn' library's Prime class, that will get its data from the downloaded (and unzipped) files from that source. Eric ==== Interested in hands-on, on-site Ruby training? See http://LearnRuby.com for information about a well-reviewed class. ======== # Generates a stream of prime numbers as they're read from a sequence # of files with names such as "primes1.txt", "primes2.txt", and so # forth. Such files can be downloaded from: # http://primes.utm.edu/lists/small/millions/ class Prime def initialize @current_file = 0 @io = open_next_file @current_primes = [] @current_index = 0 end def next load_next_primes until value = @current_primes[@current_index] @current_index += 1 value end private def load_next_primes while true while line = @io.gets if line =~ /^\s*\d+(\s+\d+)*\s*$/ @current_primes = line.split.map { |e| e.to_i } @current_index = 0 return end end @io.close open_next_file end end def open_next_file @current_file += 1 filename = "primes%d.txt" % @current_file begin @io = open(filename) rescue raise "ran out of primes because couldn't open file \"%s\"" % filename end end end