6 : 14 曜日計算

← 6‒13 p↑ もくじ i 6‒15 n →

公式不要の明快な曜日計算

2016年10月23日
記事ID e61023

公式や表を使わず、何も覚えていない状態で、手軽に任意の年月日の曜日を暗算。

前提

ユリウス暦では、4で割り切れる年は常にうるう年。

グレゴリオ暦(現在の普通の暦)もだいたい同じだが、100の倍数の年だけは特別ルール: 400で割り切れればうるう年、そうでなければ平年。例えば、2000年には2月29日があるが、1900年や2100年の2月は28日まで。

ユリウス暦では、1世紀につき、うるう年が25回入る。グレゴリオ暦では、うるう年が25回入るとき(ユリウス世紀)と、24回のとき(短い世紀)があり、400年ごとに前者が1回、後者が3回。

以下の三つは、落ち着いて考えればどれも当たり前のことであり、一度仕組みを理解すれば、無理に記憶しなくても、いつでも頭の中で再構成できる。

基礎1

平年の1年(365日)ごとに、曜日は1個前進。例えば、ある年の5月5日が日曜日なら、翌年の5月5日は月曜日。

理由は、365 を 7 で割ると 1余るから。このことは覚えていなくても、365 = 350 + 15 ≡ 14 + 1 ≡ 1 (mod 7) と、その場で暗算できる(7の倍数は無視していい)。

同様に、うるう年の1年(366日)なら、曜日は2個前進。

基礎2

4年を1周期とすると、平年3+うるう年1の通常の1周期では、曜日は2個後退。

理由は、基礎1から、1 + 1 + 1 + 2 = 5 ≡ −2 (mod 7)

通常の7周期(28年)では曜日の後退は (−2) × 7 ≡ 0 (mod 7) であり、曜日が元に戻る。

グレゴリオ暦には、まれに通常ではない周期(4年連続平年)もある。しかし「XX00年2月末日」をまたぐ曜日計算をしない限り、そのことは問題にならない(以下では、またがないように切り分けるので問題なし)。

基礎3

1ユリウス世紀(通常の周期25回)では、曜日は1個後退。

理由は、基礎2から、(−2) × 25 = −50 = −49 − 1 ≡ −1 (mod 7)

短い世紀では、1日少ないので、曜日は2個後退。

グレゴリオ暦の4世紀では、(−1) + (−2) + (−2) + (−2) = −7 ≡ 0 (mod 7) なので、曜日が元に戻る。つまり、400年ごとに曜日パターンは循環。

[計算の前半] 3月1日の曜日

最初に3月1日の曜日を考える。任意の年の3月1日の曜日が分かれば、任意の日付の曜日は簡単に分かる(「計算の後半」参照)。

「原点」として、2000年3月1日は水曜日。覚え方は、「ミレニアムで浮かれて商売が儲かった」または「21世紀は瓶座の時代」。もし原点の曜日を忘れてしまっても、今日の日付と曜日が分かれば、以下の4ステップを逆順に適用することにより、基準の曜日をその場で求めることができる。

ステップ1

基礎3から、+100年ごとに、ユリウス世紀なら曜日は1個後退し、長い世紀なら曜日は2個後退する(−100年なら、それぞれ1個・2個前進)。

よって1900・2000・2100・2200年の3月1日は、それぞれ木・水・月・土曜日。それを基準日とする。(この範囲外の年についても、400の倍数を加減すればこの範囲に帰着できる。)

ステップ2

直前の ’00年3月1日からの経過年数を Y とすると、基礎2から、Y を「Y を28で割った余り y」で置き換えて構わない。例えば、2050年3月1日は、2022年3月1日と同じ(Y = 50, y = 22)。

実際上は、28・56・84のどれかを適宜引き算すればいい。

y を4で割って商を q、余りを r とすると、基準日との曜日の違いは、−2q + r。第1項は基礎2、第2項は基礎1による。

例えば y = 22 なら5周期と2年なので、(−2) × 5 + 2 = −8 ≡ −1。2000年3月1日(基準日)は水曜なので、2050年3月1日は火曜日と分かる。

[計算の後半] 3月以外の1日の曜日

ステップ3

直前の3月1日からの経過月数を M とする。31 = 28 + 3 ≡ 3 なので、大の月が1個経過するごとに曜日が3個前進する。小の月(月の日数が30)なら、曜日の前進量はそれより1小さい。よって、3月1日との曜日差は 3M − N。ここで、N は「小の月が何回挟まったか?」で、期間に含まれる「4・6・9・11月30日」の回数。例えば8月1日を考えると M = 8 − 3 = 5, N = 23 × 5 − 2 = 13 ≡ −1 なので、3月1日と比べて曜日は1個後退。例えば、2050年3月1日(火曜日)を基準として、2050年8月1日は月曜日と分かる。

3月1日を基準としているので、最長で翌年2月1日までの11カ月を考えれば足り、2月が何日あるかを考える必要はない。

1月1日・2月1日に関しては、前年3月1日からの経過月数を考える点に注意(下記例題参照)。

ステップ4

最後に、1日以外の曜日については、単に1日からの経過日数分、曜日を前進させればいい。

以上により、グレゴリオ暦の任意の日付の曜日が簡単に求められる。

公式めいたものも記したが、どれも原理を考えれば単純明快なことであり、無理に公式を暗記しなくても、その場で容易に生成できる。ただし、何月が小の月かは既に知っているものとする!

例題

以下の例では、説明を具体的にするために、途中計算の曜日も記してある。実際には、’XX年3月1日の曜日を求めずに、’00年3月1日との曜日差だけを通算しても構わない。

2345年6月7日

基礎3より1945年と同じ。基礎2より、それは1917年と同じ。

1900年3月1日は木曜日。1916年3月1日は4周期後なので、曜日差は (−2) × 4 ≡ −1、1917年3月1日は、それプラス1で木曜日のまま。

3月1日と6月1日との曜日差は (+3) × 3 − 1 ≡ 1、6月1日と6月7日の曜日差は 7 − 1 = 6、合わせて 7 ≡ 0 なので、結局、木曜日のまま。

2222年2月22日

2200年3月1日は土曜日。

2220年3月1日は5周期後なので、曜日差は (−2) × 5 ≡ −3、2221年3月1日はそれプラス1なので木曜日。

そこから2222年2月1日までの曜日差は (+3) × 11 − 4 ≡ 1、2月1日と2月22日の曜日差は 21 ≡ 0、合わせて +1 なので、答えは金曜日。

9999年9月9日

8000を引いて1999年9月9日と同じ。

1999年は84を引いた1915年と同じ。

1900年3月1日は木曜日。そこから1912年3月1日までの曜日差は、(−2) × 3 ≡ −6、そこから1915年3月1日までの曜日差は +3、合わせて月曜日。

3月1日から9月1日までの曜日差は (+3) × 6 − 2 ≡ 2、そこから9月9日までの曜日差は 8 ≡ 1、合わせて木曜日。

(別解) 2000年3月1日は水曜日。1999年3月1日は366日前なので月曜日(基礎1のリバース)。以下同じ。

結び

もう少しだけ複雑でトリッキーな方法を使うと、任意の日付の曜日を数秒以内に言えるようになる。それに比べると上述の方法は少し時間がかかるが、その分、アルゴリズムが単純明快で、ほとんど何も覚える必要がない(メモリー消費量が小さい)。この方法でも、ゆっくり考えて数分以内、慣れれば10秒くらいで曜日が分かるだろう。ある意味、トリッキーな速算より素直で良い。

上記の手順はグレゴリオ暦専用だが、少し変えるだけでユリウス暦にも対応できる。

この計算法は、もともと別の話題(グレゴリオ暦での曜日の分布)の土台として考えたものだが、それ自体としても実用性がありそうなので、独立した記事とした。

この記事のURL

パブリックドメイン



アドレス = 英語の「クリスマス」の最初の5文字 + アットマーク + faireal.net