Ruby - 素数判定!

Updated:


過去にも「素数判定」に関する記事を公開しましたが、再考してみました。

0. 前提条件

  • Linux Mint 17(64bit) での作業を想定。
  • Ruby 2.1.5-p273 での作業を想定。

1. Ruby スクリプト作成

1-1. 引数で与えた数値が素数かどうかを判定

File: prime_number_1.rb

1
2
3
4
5
6
7
8
9
10
11
12
#! /usr/local/bin/ruby
# coding: utf-8
# --------------------------------------
#   Check a prime number
# --------------------------------------

def is_prime(n)
  res = (2..Math.sqrt(n)).any? { |i| n % i == 0 }
  puts "#{n}: #{res || n == 1 ? '-----' : 'PRIME'}"
end

is_prime(12345678923)

1-2. 引数で与えた x 番目の素数を算出

(クラス化する程でもないけども、敢えてクラス化した)

File: prime_number_2.rb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#! /usr/local/bin/ruby
# coding: utf-8
# --------------------------------------
#   Calculate Xth prime number
# --------------------------------------

class PrimeNumber2
  def exec(no)
    n, i = 2, 0
    loop do
      i += 1 if is_prime(n)
      break if i == no
      n += 1
    end
    puts "#{i}th PRIME NUMBER: #{n}."
  end

private

  def is_prime(n)
    res = (2..Math.sqrt(n)).any? { |i| n % i == 0 }
    return res || n == 1 ? false : true
  end
end

PrimeNumber2.new.exec(100000) if __FILE__ == $0

1-3. 引数で与えた数値までを一覧表示

(クラス化する程でもないけども、敢えてクラス化した)

File: prime_number_list.rb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#! /usr/local/bin/ruby
# coding: utf-8
# --------------------------------------
#   Prime numbers list
# --------------------------------------

class PrimeNumber
  def exec(nums)
    (1..nums).each do |n|
      puts "#{n}: #{is_prime(n) ? 'PRIME' : '----- '}"
    end
  end

private

  def is_prime(n)
    res = (2..Math.sqrt(n)).any? { |i| n % i == 0 }
    return res || n == 1 ? false : true
  end
end

PrimeNumber.new.exec(99) if __FILE__ == $0

2. Ruby スクリプト実行

File: 引数で与えた数値が素数かどうかを判定

1
2
$ ./prime_number_1.rb
12345678923: PRIME

File: 引数で与えた

1
2
3
 x 番目の素数を算出
$ ./prime_number_2.rb
100000th PRIME NUMBER: 1299709.

File: 引数で与えた数値までを一覧表示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ ./prime_number_list.rb
1: -----
2: PRIME
3: PRIME
4: -----
5: PRIME

         :
====< 途中省略 >====
         :

95: -----
96: -----
97: PRIME
98: -----
99: -----

時に振り返って、過去に考えたロジックを考え直してみるのもいいでしょう。

また、 Array クラスの any? メソッドの便利さに気付いたので、再考してみて良かったと感じました。

以上。





 

Sponsored Link

 

Comments