夏希が誕生日から曜日を計算されてたんだけど

日付から曜日を計算する方法。

またツェラーの公式(Zeller's congruence)ネタ。前に 健二が日付から曜日を計算してたんだけど で書いたんだけど、もう少し覚えやすい方法を思いついた。月に関するところを変えただけだが。
とりあえず、今回の記事だけ読んでも分かるように書く。前回と記号の意味は変えてある。

以下、年は西暦年とする。

(1) 1月と2月は前の年の13月、14月と考える。
  年の上2桁を x、下2桁を y、月を m、日を d とする。
  例) 2012年5月2日なら、x=20, y=12, m=5, d=2
     2000年1月1日なら、1999年13月1日と考えて、x=19, y=99, m=13, d=1

(2) x を 4 で割った余りに 2 を掛けたものを X とする*1
  例) x = 20 なら、20を 4 で割った余りは 0。0 に 2 を掛けて X = 0
     x = 19 なら、19 を 4 で割った余りは 3。3 に 2 を掛けて X = 6

(3) y を 4 で割った余りを r として、s = y - r とする。
  (s を y を超えない最大の 4 の倍数として、r = y - s としてもよい)。
  要するに
  y = (4の倍数) + (0,1,2,3 のどれか) = s + r
  と分割する。
  Y = (s÷2) - r とする。
  例) y = 99 なら y = 96+3 と分割して、Y = (96÷2)-3 = 45
     y = 40 なら y = 40+0 と分割して、Y = (40÷2)-0 = 20
     y = 2 なら y = 0+2 と分割して、Y = (0÷2)-2 = -2

(4) m が偶数なら m から 2 を引く。奇数なら m に 2 を足す。
  この結果が 10 以下ならそれを M とする。
  11 以上ならさらに 1 引いたものを M とする。
  例) m = 9 なら、奇数だから 2 を足して 11。1 を引いて M = 11-1 = 10
     m = 12 なら、偶数だから 2 を引いて 10 で M = 10
     m = 14 なら、偶数だから 2 を引いて 12。1 を引いて M = 12-1 = 11

(5) X, Y, M を足したものを d から引き、引いた結果を W とする。
  つまり W = d - (X + Y + M) とする。
  W に 7 の倍数を適当に足し引きして 0〜6 の数にする。
  この数を w として、下の表から曜日を求める。

w   0   1   2   3   4   5   6
   日  月  火  水  木  金  土


例) 2012年5月31日
  x=20, y=12, m=5, d=31。
  20 を 4 で割って余り 0。2 を掛けて X = 0。
  y = 12+0 と分割して Y = (12÷2)-0 = 6。
  5 は奇数だから 2 を足して 7。7 は 10 以下だからそのまま M = 7。
  W = 31-(0+6+7) = 18。7 の倍数 14 を引いて w = 18-14 = 4 で木曜日。

  1999年1月1日
  1998年13月1日と考えて x=19, y=98, m=13, d=1。
  19 を 4 で割って余り 3。2 を掛けて X = 6。
  y = 96+2 と分割して、Y = (96÷2)-2 = 46。
  13 は奇数だから 2 を足して 15。15 は 11 以上だから 1 を引いて M = 15-1 = 14。
  W = 1-(6+46+14) = -65。7 の倍数 70 を足して w = -65+70 = 5 で金曜日。

*1:これは現在使われてるグレゴリオ暦の場合の計算。ユリウス暦ならもっと簡単で X = x + 2 とすればよい。