This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.
| Generating Prime Numbers | ||
|---|---|---|
| Code | Expected | Actual |
require 'mathn' primes = Prime.new primes.succ |
2 | 2 |
primes.succ |
3 | 3 |
primes.each { |x| puts x; break if x > 15; } |
5 7 11 13 17 |
5 7 11 13 17 |
primes.succ |
19 | 19 |
def sieve(max=100)
sieve = []
(2..max).each { |i| sieve[i] = i }
(2..Math.sqrt(max)).each do |i|
(i*i).step(max, i) { |j| sieve[j] = nil } if sieve[i]
end
sieve.compact
end
sieve(10) |
[2, 3, 5, 7] | [2, 3, 5, 7] |
sieve(100000).size |
9592 | 9592 |
require 'mathn'
class Prime
@@primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,
61, 67, 71, 73, 79, 83, 89, 97, 101]
@@check_next = 103
# @@primes[3] < sqrt(@@check_next) < @@primes[4]
@@limit = 3
# sqrt(121) == @@primes[4]
@@increment_limit_at = 121
def succ
@index += 1
while @index >= @@primes.length
if @@check_next + 4 > @@increment_limit_at
@@limit += 1
@@increment_limit_at = @@primes[@@limit + 1] ** 2
end
add_if_prime
@@check_next += 4
add_if_prime
@@check_next += 2
end
return @@primes[@index]
end
def initialize
@index = -1
end
:private
def add_if_prime
factor = @@primes[2..@@limit].find { |prime| @@check_next % prime == 0 }
@@primes << @@check_next unless factor
end
end
primes = Prime.new
p = nil
10000.times { p = primes.succ }
p |
104729 | 104729 |
class Prime
def prime?(n)
succ() while @seed < n
return @primes.member?(n)
end
end
def probably_prime?(x)
x < 8
end
probably_prime? 2 |
true | true |
probably_prime? 5 |
true | true |
probably_prime? 6 |
true | true |
probably_prime? 7 |
true | true |
probably_prime? 8 |
false | false |
probably_prime? 100000 |
false | false |