Rubyで素数を求めるプログラムを書いた

引数に入れた値までの素数を配列で返すRubyのクラスを書いてみた。アルゴリズムはエラトステネスの篩を使用。 generate_prime.rb

class GeneratePrime
  def generate_prime(max_num)
    if max_num < 2 then return nil
    elsif max_num == 2 then return 2 end

search_list = (2..max_num).to_a # 探索リスト
prime_list = Array.new          # 素数リスト

# 素数の探索
begin
  prime_list << search_list[0]
  search_list.each_index{|i|
    if search_list[i] % prime_list[-1] == 0 then
      search_list.delete_at(i)  # 素数リストに加えた数の全ての倍数を削除
    end
  }
end while search_list[-1] > (prime_list[-1] * prime_list[-1])

# 素数リスト及び、探索リストに最後まで残っていた数が素数
return prime_list.concat(search_list)

end end

generate_prime_test.rb
require ‘test/unit’
require ‘generate_prime’

class TestGeneratePrime < Test::Unit::TestCase def setup @prime = GeneratePrime.new end def test_generate_prime assert_equal(nil, @prime.generate_prime(1)) assert_equal([2,3,5,7], @prime.generate_prime(10)) assert_equal([2,3,5,7,11,13,17,19,23,29], @prime.generate_prime(30)) end end

テスト結果
% ruby generate_prime_test.rb
Loaded suite generate_prime_test
Started
.
Finished in 0.000454 seconds.

1 tests, 3 assertions, 0 failures, 0 errors

テストが不十分な気もするけど多分大丈夫なはず。・・・多分。