« オートマトン | トップページ | 最近のこと。 »

2012年4月16日 (月)

素数日を求める

最近、自発的にコードを書くことがないなぁ…。

ということで今回も人様のブログのネタからです。何やら「素数日」を求めるらしい。
詳しい説明はこちらを見ていただくことにして…。

 

今回は「Date クラス」を使って実際の日付を出し、それを「yyyymmdd」の形の整数に変換した後に、その数が素数かどうかを調べました。

# -*- coding: utf-8 -*-
#
# 素数日を求める
#

require 'date'


class Integer
  def prime?
    return true  if self == 2 || self == 3
    return false if self.even? || self % 3 == 0 || self <= 1

    limit = (self ** 0.5).to_i
    i = 5
    add = 2
    while limit >= i
      return false if self % i == 0
      i = i + add
      add = 6 - add
    end
    return true
  end
end

d1 = Date.new(2012,  1,  1)     # 開始日
d2 = Date.new(2020, 12, 31)     # 終了日

arr = []
d1.upto(d2) do |d|
  n = d.year * 10000 + d.month * 100 + d.day
  arr.push(d) if n.prime?
end

puts arr.map{|d| d.to_s}
# puts arr.size

このコードは Ruby のみで書かれていますが、「intel Core i5, 2.4GHz」の環境で「2012年1月1日〜2020年12月31日」の期間に存在する素数日を、約0.03秒ですべて求めることができました。

 

 

追記 (2012/04/17) :Ruby1.9 の標準添付ライブラリである「Prime」と Range#select メソッ ドを使ったコードも書いてみました。
こっちの方がすっきりしてていいのかな?

# -*- coding: utf-8 -*-
#
# 素数日を求める
#

require 'date'
require 'prime'

d1 = Date.new(2012,  1,  1)     # 開始日
d2 = Date.new(2020, 12, 31)     # 終了日

arr = (d1 .. d2).select{|d| (d.year * 10000 + d.month * 100 + d.day).prime?}
puts arr.map{|d| d.to_s}
# puts arr.size

HTML generated by org-mode 6.33x in emacs 23

« オートマトン | トップページ | 最近のこと。 »

Ruby」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/112020/54487136

この記事へのトラックバック一覧です: 素数日を求める:

« オートマトン | トップページ | 最近のこと。 »

2016年7月
          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 27 28 29 30
31            
フォト

最近のトラックバック

無料ブログはココログ