読者です 読者をやめる 読者になる 読者になる

猫尾製作所

あまりアテにしないでね

素数日について

数学 Ruby プログラミング ネタ

先ほどの続きというわけではありませんが。

日付をyyyymmdd形式で8桁表記したとき(例えば、2013年1月3日なら 20130103)に、それを整数とみなして(例では二千十三万百三とみなす)その数が素数である日を「素数日」と呼ぶことにします。例えば、2013年1月3日(20130103)は素数日ではありません。20130103 は 7×673×4273 と素因数分解できる合成数であるからです。

それでもって、与えられたある年の中における「素数日」の分布はどのようになっているのか、を調べます。私も昨年の大晦日(つい3日前ですが)、しかも23時半を回ってから2013年のそれが少し気になってパソコンで計算しているうちに年明けがかなり迫ってしまっていてあわてた状態のまま年を越したのです(呆)

とりあえず、今年2013年は1月中には「素数日」は存在せず、2月に入って初めて 2013年2月3日(20130203)という「初素数日」が出てくることぐらいは確認したのですが。

あとになって計算した、2013年の素数日を挙げておきます。

201301:
201302: 20130203 20130223
201303:
201304: 20130403 20130413
201305: 20130503 20130521 20130527 20130529
201306:
201307: 20130707
201308: 20130829
201309:
201310: 20131019 20131031
201311: 20131103 20131109 20131117 20131129
201312: 20131207 20131211 20131217 20131229

なお、この表の生成のために使用した Ruby のスクリプトは次のとおりです。

#! ruby -Ks

# 整数 n の最小因数を返す
def minfactor(n)
	a = [ 1, 7, 11, 13, 17, 19, 23, 29 ]
	
	if n < 2 then
		return nil
	end
	
	if n % 2 == 0 then
		return 2;
	elsif n % 3 == 0 then
		return 3;
	elsif n % 5 == 0 then
		return 5;
	end
	
	i, j = 0, 1
	k = 7
	while k*k <= n do
		if n % k == 0 then
			return k
		end
		
		j += 1
		if j == 8 then
			i += 1
			j = 0
		end
		
		k = 30*i + a[j]
	end
	
	return n
end

# 整数 n が素数であれば true, そうでなければ false を返す
def prime?(n)
	if n == minfactor(n) then
		return true
	else
		return false
	end
end

# y年m月の月間の日数を返す
def daysin(y, m)
	md = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
	
	if (y % 4 == 0) && !(y % 100 == 0 && y % 400 != 0) then
		md[2-1] = 29
	end
	
	return md[m-1]
end

if ARGV.length > 0 then
	y = ARGV[0].to_i
else
	puts "Please give an integer"
	exit -1
end

for m in 1..12 do
	print "#{y*100+m}: "
	for d in 1..daysin(y, m) do
		ymd = y*10000 + m*100 + d
		if prime?(ymd) then
			print "#{ymd} "
		end
	end
	puts
end

exit 0

コマンドラインより整数を一つ与えれば、その整数を西暦年として素数日の分布を上記のような表で、1ヶ月1行で表示します。

これをみると特定の日付にしか素数日にならない気がしますが、少し考えればこれももっともなはなし。素数の下一桁はかならず 1, 3, 7, 9 の4通りにしかならず、日付を表す数字列を整数とみなした数も下二桁が01~31にしかなりません。これで候補となる日付は 1, 3, 7, 9, 11, 13, 17, 19, 21, 23, 27, 29, 31 の13通りにしかならないからです。5の倍数を除いた奇数全体を行き渡る可能性はあるものの。月のうちの日付だけが3の倍数であっても全桁では3の倍数となるとは限らないので「素数日」になり得ますね。

ただ、13種類しかレパートリがないと(心理的にも?)同じようなものがしょっちゅう目に付くことは考えられますが、その中でもまた偏りがあるかどうかも調べたいところ。これを調べるにはある程度長期にわたって(少なくとも100年以上は)計算したほうがいいでしょうね。調べる年数は3の倍数の年数にしたほうがいいのかも。