コラム

このページは,世の中のいろいろな社会現象を数学的に解析してみるページです.
ご意見は kojo@sci.niihama-nct.ac.jp あてにお願いします。


西暦の年月日から曜日を計算するZellerの公式はもっとよくならないのか?

現在使用している西暦の年月日(グレゴリオ暦)から曜日を求めるZeller(ツェラー)の公式というものがあります。 西暦 y 年 m 月 d 日に対して

z=(y+[y/4]-[y/100]+[y/400]+[(13m+8)/5]+d を7で割った余り)

で求めた z の値が0, 1, 2 ,3, 4, 5, 6 のとき,それぞれ日、月、火、水、木、金、土曜とするというものです。
ただし、[x] ([ ]はガウス記号とよばれる)は x を超えない最大の整数(例えば[3.7]=3, [4]=4)を表し、
1月、2月は前年の13月、14月に直して計算します。

例えば、2015年3月1日は

2015+[2015/4]-[2015/100]+[2015/400]+[(13×3+8)/5]+1=2015+503-20+5+9+1=2513

を 7で割ると 359 余り 0 なので、 z=0 で日曜日と計算され、

2015年1月15日は2014年13月15日と考えて、

2014+[2014/4]-[2014/100]+[2014/400]+[(13×13+8)/5]+15=2014+503-20+5+35+15=2552

を 7で割ると 364 余り 4 なので、 z=4 で木曜日と計算され、カレンダーと一致します。

Zellerの公式において、y+[y/4]-[y/100]+[y/400] は年に影響される曜日の計算の部分で、
平年(365日)で曜日が1進む、うるう年(366日)では曜日が2進むことと、
うるう年のルール

  1. 西暦が 4 で割り切れる年はうるう年とする
  2. ただし、西暦が 100 でも割り切れる年はうるう年としない
  3. ただし、西暦が 400 でも割り切れる年はうるう年とする
に従っています。

Zellerの公式において、[(13m+8)/5] が月に影響される曜日の計算の部分です。
例えば、3月は31日あるので、4月1日は3月1日より曜日が 3 進むようなことを計算している部分です。
次の表のように、曜日の変動数 s に 2 (この 2 は基準となる日の曜日を合わせるためのもの)を加えたもの (s+2) と、 [(13m+8)/5] とで、7で割った余りが完全に一致しています。

月 m 日数 3月から前月までの間で
29, 30, 31日である日の合計 s
=(m月1日の3月1日に
対する曜日の変動数)
(s+2)を7で割った余り (13m+8)/5 [(13m+8)/5] を
7で割った余り
3 31 0 2 9.4 2
4 30 +3 5 12.0 5
5 31 +5 0 14.6 0
6 30 +8 3 17.2 3
7 31 +10 5 19.8 5
8 31 +13 1 22.4 1
9 30 +16 4 25.0 4
10 31 +18 6 27.6 6
11 30 +21 2 30.2 2
12 31 +23 4 32.8 4
1 → 13 31 +26 0 35.4 0
2 → 14 28または29 +29 3 38.0 3

なぜ、このようにうまく一致するかを考えます。 横軸を月(簡単のため、m'=m-3とする)、縦軸に曜日の変動数 s をとります。
うるう年かどうかの影響を受ける2月を最後にもってきた結果、 各月の日数がある程度規則正しく並んでいて、
傾きがおよそ 13/5=2.6 ぐらいで増えていることに気づきます。
[(km'+l)/n] (n, k は自然数、l は整数)が曜日の変動数 s に完全に一致するためには、
直線 y=(kx+l)/n が右のグラフの縦幅 1 の赤線(下端を含み、上端を含まない)を12個とも通らないといけません。
n=5, k=13 (傾き 13/5)の場合、l=2 とすれば、(13m'+2)/5 の整数部分 [(13m'+2)/5] が曜日の変動数に完全に一致します。
m'=m-3 におきかえ、基準日の曜日を調整する 2 を加えると {13(m-3)+2}/5+2=(13m-27)/5 となり、
これに 7 を加えた (13m+8)/5 も 7 で割った余りは変わらず、これで月に影響される曜日の計算ができたことになります。

月 m m'=m-3 曜日の変動数 s (13m'+2)/5
3 0 0 0.4
4 1 +3 3.0
5 2 +5 5.6
6 3 +8 8.2
7 4 +10 10.8
8 5 +13 13.4
9 6 +16 16.0
10 7 +18 18.6
11 8 +21 21.2
12 9 +23 23.8
1 → 13 10 +26 26.4
2 → 14 11 +29 29.0

そこで、もっと小さい n で表される [(km'+l)/n] で曜日の変動数に完全に一致するものがないかを探してみましょう。
傾きが 2.6 に近い傾き 5/2(=2.5。n=2, k=5のとき)や傾き 8/3(≒2.67。n=3, k=8のとき)で計算すると、
惜しいところで曜日の変動数に合わせることができません。
ということで、n が 5 以下では他の表し方はありません。

傾き 5/2=2.5 のとき
月 m m'=m-3 曜日の変動数 s (5m'+1)/2 [(5m'+1)/2]≠s
となる箇所
3 0 0 0.5
4 1 +3 3.0
5 2 +5 5.5
6 3 +8 8.0
7 4 +10 10.5
8 5 +13 13.0
9 6 +16 15.5 ×
10 7 +18 18.0
11 8 +21 20.5 ×
12 9 +23 23.0
1 → 13 10 +26 25.5 ×
2 → 14 11 +29 28.0 ×

傾き 8/3≒2.67 のとき
月 m m'=m-3 曜日の変動数 s 8m'/3
(小数第3位を切り捨て)
[8m'/3]≠s
となる箇所
3 0 0 0.00
4 1 +3 2.66 ×
5 2 +5 5.33
6 3 +8 8.00
7 4 +10 10.66
8 5 +13 13.33
9 6 +16 16.00
10 7 +18 18.66
11 8 +21 21.33
12 9 +23 24.00 ×
1 → 13 10 +26 26.66
2 → 14 11 +29 29.33

計算は省略しますが、[(km'+l)/n] で曜日の変動数に完全に一致するためには、
傾き k/n は 18/7 < k/n < 21/8 でないといけないことがわかります(高校1年生の知識で示せます)。 18/7≒2.571、21/8=2.625です。
この不等式を満たす既約分数 k/n で、13/5(n=5, k=13)の次に n が小さくとれるものは 34/13≒2.615 (n=13, k=34)です。
このとき、[(34m'+5)/13] は下の表・グラフの通り、曜日の変動数に一致します。

月 m m'=m-3 曜日の変動数 s (34m'+5)/13
(小数第3位を切り捨て)
3 0 0 0.38
4 1 +3 3.00
5 2 +5 5.61
6 3 +8 8.23
7 4 +10 10.84
8 5 +13 13.46
9 6 +16 16.07
10 7 +18 18.69
11 8 +21 21.30
12 9 +23 23.92
1 → 13 10 +26 26.53
2 → 14 11 +29 29.15

式 (34m'+5)/13 で、m'=m-3 とおきかえ、基準日の曜日調整の 2 を加え、さらに 7 を足すと (34m+20)/13 になります。
よって,Zellerの公式における [(13m+8)/5] を [(34m+20)/13] におきかえてもよいことがわかります。
さらに、n を大きくすると、[(13m+8)/5] に代わるような他の [(km+l)/n] を見つけることができます。 以上のことをまとめると

Zellerの公式における、月に影響される曜日の計算の部分は他にもいろいろ表し方があるが、[(13m+8)/5]が最もよい

ということがわかりました。

バックナンバー

cos 60°がちょうど 1/2(=0.5) になるのは奇跡なのか? (12. 3.16)

プロ野球とJリーグの得点分布は似ているのか? (12. 1.20)

クライマックスシリーズのアドバンテージってどれくらい有利なの? (10. 4.22)

どの星座占いを信じたらいいの? (06. 8.16)

1人を選ぶのに何回じゃんけんしたらよいの? (06. 4.17)

三 角形の固定された内点を通って二等分する直線をひく方法 (03. 5. 2)

グラフ電卓でシャオロンをかこう (02. 7.20)

選択肢の問題・・・なんで1つも当たらないの? (01. 7.26)