13日は何曜日が多いのか?

今出川潤です。
つい先週のことですが、2011年5月13日は金曜日でした。
13日の金曜日です。
あの、13日の金曜日です。
根拠はよく分かんないけど、なぜだか恐れられている日です。
そう言えば西尾維新がどこかで、13日は金曜日になりやすいとか書いていたような。
たしかサマーウォーズのケンジ君は、年月日から計算で曜日を求めていたような。
なら実際のところ、たくさん計算すれば、13日は何曜日が多いのかわかる?
ということで、計算してみました。

まず最初に、計算で曜日を求めるにはどうすればいいのか?
それには、ツェラーの公式を用います。
現在の西暦はグレゴリオ暦で計算されているので、その計算式を使います。
試しに2011年5月13日で計算してみます。

ツェラーの公式

ツェラーの公式でグレゴリオ暦2011年5月13日を計算

実際のカレンダーと同じように、金曜日になりました。

それではこれを使って、計算をしていきます。
西暦1年から2000年までの間で、13日は何曜日が一番多いのか?
手計算は大変なので Python で計算するプログラムを書いてみました(ソースコードは後述)。
結果はこちらです。

YEAR: 1-2000
mon.	3425
tue.	3425
wed.	3435
thu.	3420 min.
fri.	3440 max.
sat.	3420 min.
sun.	3435

確かに金曜日が一番多かった!

と、ここまで計算したところで、 Wikipedia にて13日の金曜日の項目を見つけました。
ここで結構詳しく解説されていました。
曰く、グレゴリオ暦では曜日は400年周期で元に戻り、その間で13日は金曜日が一番多い、と。
さらに、なんで13日の金曜日が恐れられているのか実際はよく分かってないらしいです。

あれ、400年周期?
ということは、21世紀に限って言えば、金曜日が一番多いとは限らないんじゃないか?
なので、21世紀に限って計算してみた。

YEAR: 2001-2100
mon.	170 min.
tue.	173 max.
wed.	170 min.
thu.	171
fri.	172
sat.	172
sun.	172

21世紀で一番多いのは火曜日だった!

結論

21世紀では、13日は火曜日が一番多い。
長い期間でみると、13日は金曜日が一番多い。

おまけ

計算に使ったプログラム


#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 条件別に変更する定数
START= 2001		# 数え始めの年
END= 2100		# 数え終わりの年
TARGET_DAY= 13		# 数える日

# ツェラーの公式 グレゴリオ暦
def ZellerGregorian( year, month, day):
	if 1 <= month and month <= 2:
		month += 12
		year -= 1
	j = int(year /100)
	k = year % 100
	m = month
	q = day
	h = (q + int( (m+1)*26/10 ) + k + int(k/4) + int(j/4) + 5*j )%7
	return h
	# h=0:sat, h=6:fri
	# h=0 で土曜日, h=1 で日曜日...

# ツェラーの公式と曜日の対応タプル
zweek= ("sat.", "sun.", "mon.", "tue.", "wed.", "thu.", "fri.")

# 計算用定数
DAYS= 7		# in week
MONTHS= 12		# in year

# 指定期間の曜日リスト作成
weeks= []
for i in range(START, END+1):
	for j in range(1,MONTHS+1):
		weeks += [ zweek[ZellerGregorian(i, j, TARGET_DAY)] ]

# 曜日ごとに数える
cnt=[]
for i in range(DAYS):
	cnt+=[ weeks.count(zweek[i]) ]
maxnum= max(cnt)
minnum= min(cnt)

# 表示
SHIFT=2
temp= u"YEAR: "+ str(START)+ u"-"+ str(END)
print temp
for i in range(DAYS):
	# 表示の都合上、月曜日を一番上に
	if (DAYS-SHIFT)<=i:
		i-=(DAYS-SHIFT)
	else:
		i+=SHIFT
	temp= zweek[i] + u"\t" + str(cnt[i])
	if maxnum==cnt[i]:
		temp+= u" max."
	if minnum==cnt[i]:
		temp+= u" min."
	print temp
  1. Mokke より:

    ( ^ω^)twitterより。
    こういう思いつきのどうでもいいことをプログラムで出来てしまうのが、情報系の強みw

  1. There are no trackbacks for this post yet.

Leave a Reply