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

