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

猫尾製作所

あまりアテにしないでね

月の何日が素数日になりやすいだろう

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

先ほどの続き。

メイン部分を次のように書き換えます。

if ARGV.length > 1 then
	y0 = ARGV[0].to_i
	y1 = ARGV[1].to_i
else
	puts "Please give two integers"
	exit -1
end

n = Array.new(32)

for i in 0..31 do
	n[i] = 0
end

for y in y0..y1 do
	for m in 1..12 do
		for d in 1..daysin(y, m) do
			ymd = y*10000 + m*100 + d
			if prime?(ymd) then
				n[d] += 1;
			end
		end
	end
end

for i in 1..31 do
	if i % 2 != 0 && i % 5 != 0 then
		puts "%02d : %d" % [i, n[i]]
	end
end

exit 0

整数を二つ入力する必要があります。調べる対象とする最初の年と最後の年です。

で、私のマシンでもって(一部整形して)

2001年から2099年までの99年間で調べると

% time ruby primeday2.rb 2001 2099
01 : 204
03 : 182
07 : 180
09 : 174
11 : 161
13 : 164
17 : 156
19 : 165
21 : 167
23 : 180
27 : 173
29 : 162
31 :  97

real    0m5.196s
user    0m5.023s
sys     0m0.030s

これを見る限りでは(平年の2月にはない)29日と(小の月にはない)31日が少ないことを除いてはほぼ平らである気がします。ただ、1日だけは突出して素数日となることが多いですよね。これは偶然なのだろうか、と思いますが。じゃあ、もっと広い範囲で調べてみよう。

2001年から2999年までの999年間で調べると。

% time ruby primeday2.rb 2001 2999
01 : 1790
03 : 1801
07 : 1741
09 : 1735
11 : 1750
13 : 1714
17 : 1765
19 : 1743
21 : 1741
23 : 1704
27 : 1757
29 : 1630
31 : 1036

real    0m57.197s
user    0m54.865s
sys     0m0.061s

29日と31日を除外すれば、ほぼ平らといっていいでしょう。

更に広い範囲、2001年から5999年の3999年間で調べますと。

% time ruby primeday2.rb 2001 5999
01 : 6957
03 : 6885
07 : 6839
09 : 6822
11 : 6815
13 : 6867
17 : 6950
19 : 6780
21 : 6819
23 : 6827
27 : 6900
29 : 6463
31 : 3978

real    4m33.771s
user    4m24.842s
sys     0m0.124s

29日と31日のぶんを除いたデータのうちでの、最大値 6957 と 最小値 6780 の差は 177 で、比では 2.6 パーセント。この比は99年間のデータで 30.7 パーセントで、999年間のデータで 5.7 パーセントでしたが、やはり年数を多く取るとそう有意な差はみられないようです。なんていうと、統計学的にも数学的にもナンセンスな行為となってしまうのかもしれませんが。