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?
メソッドの便利さに気付いたので、再考してみて良かったと感じました。
以上。
Comments