Friday, March 07, 2008

3 も 7 も 37 も素数

ホテルのルームサーヴィスで昼食代わりの遅い朝食をとってチェックアウト。 充実した三日間で、あれこれ随分と考えがまとまった。 夜は「肩をすくめるアトラス」(アイン・ランド/脇坂あゆみ訳/ビジネス社) を読んでいた。かなり長いので、半分くらいしか読めなかったが。 政治的内容と、 ハーレクインロマンスなみのメロドラマが渾然一体としているところは、 同じ著者の「水源」と同じ。 とは言え、「水源」の方がずっと面白いかな。 河原町の本屋で少し資料を買ってから、午後に帰宅。 かなりメイルがたまっていたので、次々に処理。 夕方、開店早々の時間に予約を入れて、夕食は近所のバーにて。 鯛のキッシュ、豚の白ワイン煮込みなど。 20 時くらいに帰ってくる。

算数(プログラミング)パズル。 今日は 3 月 7 日。 3 も 7 も素数だし、これをくっつけた 37 も素数だ。 こんな日付はけっこうあるのだろうか? だけど、37 に年の 2008 までくっつけた 200837 は残念ながら素数ではない(7 で割り切れる)。 では、月も日も、月と日をくっつけたものも、 さらに年をくっつけたものも全部素数である日は、 2008 年にあるだろうか?(答は来週の木曜日)。 しかし、2008 自体は素数ではない。 では、年も月も日も、月と日をくっつけたものも、 年と月と日をくっつけたものも全部素数であるような日付は、 21世紀に入ってから今日までにあっただろうか?。
以下は、最初の二つの問題用に私が書いたプログラム。 最後の問題は、この一箇所だけ書き変えれば良い(それはどこ?)。 勿論、自分の好きな言語で書く方が楽しいし、 ひょっとしたら暗算するのが一番楽しいかも知れないし、 少なくとも一番暇つぶしにはなる。

#!/usr/bin/ruby
require "date"

class Integer
    def is_prime
        return  true if self == 2
        return false if self % 2 == 0 || self < 2
        sqrt_of_self = Math.sqrt(self)
        i = 3
        while i <= sqrt_of_self
            return false if self % i == 0
            i += 2
        end
        return true
    end
end

checkday = Date.new(2008, 1, 1)
366.times {
    y  = checkday.year
    m  = checkday.month
    d  = checkday.day
    md = (m.to_s + d.to_s).to_i
    if m.is_prime && d.is_prime && md.is_prime then
        print(checkday, ": ")
        printf("%2d, %2d, %4d are prime\n", m, d, md)
        ymd = (y.to_s + md.to_s).to_i
        printf("%d is also prime!\n", ymd) if ymd.is_prime
    end
    checkday += 1
}