Tried simple Sieve of Eratosthenes in Ruby …
class MyPrime attr_reader :primes # there we can read then # compute prime numbers up to limit, default is 20 def initialize(limit = 20) @primes = [] limit = limit.to_i return if limit.to_i < 2 arr = Hash[*((2..limit).to_a*2).sort] # we can use .zip too (2..Math.sqrt(limit)).each do |i| next unless arr[i] # already removed (i*i..limit).step(i).each{|k| arr.delete(k)} end @primes = arr.keys.sort # return just keys end end
we can add some tests
require 'test/unit' require 'my_prime' class TestMyPrime < Test::Unit::TestCase def test_20_primes primes = MyPrime.new(20) assert_equal [2, 3, 5, 7, 11, 13, 17, 19], primes.primes end def test_wo_param primes = MyPrime.new assert_equal [2, 3, 5, 7, 11, 13, 17, 19], primes.primes end def test_less_than_2 primes = MyPrime.new(1) assert_equal [], primes.primes end def test_limit_eq_2 primes = MyPrime.new(2) assert_equal [2], primes.primes end def test_limit_is_string primes = MyPrime.new('20') assert_equal [2, 3, 5, 7, 11, 13, 17, 19], primes.primes end def test_limit_is_float primes = MyPrime.new(20.50) assert_equal [2, 3, 5, 7, 11, 13, 17, 19], primes.primes end end