いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

西暦Y年M月D日の曜日を求める(3)

 すでに書いたとおり、西暦p年からq年まで(p<q)のうち、閏年は[q/4]-[(p-1)/4]-([q/100]-[(p-1)/100])+[q/400]-[(p-1)/400]回あります。1976年は閏年ですが、3月1日(月曜)を1番の日(N=1)と考えていますからこの年については閏年のカウントはしません。そこでp=1977、q=Yを代入してみると

[Y/4]-[(1977-1)/4]-([Y/100]-[(1977-1)/100])+[Y/400]-[(1977-1)/400]

=[Y/4]-[Y/100]+[Y/400]-479

となります。これが1976年から西暦Y年までの閏年の回数です。

 閏年でない年を平年と呼びます。平年は1年で365日です。1976年3月1日からY年3月1日の前日まででちょうどY-1976年経過しています。経過日数は、毎年が平年だとすると(Y-1976)×365日ですが、実際には閏年がすでに求めた回数だけあるのでこれを加えて、
(Y-1976)×365+[Y/4]-[Y/100]+[Y/400]-479
=365Y+[Y/4]-[Y/100]+[Y/400]-721719(=(f(Y)とおく)

だけの日数があります。

これですべて分かりました。1976年3月1日を1番目の日とすると、Y年M月D日の番号Nは以下で表せます。

N=f(Y)+30(M-3)+g(M)+D

=365Y+[Y/4]-[Y/100]+[Y/400]-721719+30(M-3)+g(M)+D

=365Y+[Y/4]-[Y/100]+[Y/400]+30M+g(M)+D-721809

7で割った余りが問題なのですから、365Yの代わりにYを、30Mの代わりに2Mを、-721809の代わりに+3を使ってもかまいません。すると以下の公式が得られます。

ーーーーーーーーーーーーーーーーーーーーーーーー

N’=Y+[Y/4]-[Y/100]+[Y/400]+2M+g(M)+D+3

(西暦Y年M月D日の曜日を求めるための公式)

とし、NでなくこのN’を求めればよいことになりました。ただし、Y年の1月、2月は前の年、つまりY-1年のそれぞれ13月、14月と読み替えます。このN’を7で割り、余りが0なら日曜日、1なら月曜日、……となります。ここでg(M)は以下の表で与えられます。

f:id:Inuosann:20190827204247p:plain

ーーーーーーーーーーーーーーーーーーーーーーーー

試しに今日、2019年8月27日の曜日を求めてみましょう。

N’=2019+[2019/4]-[2019/100]+[2019/400]+2*8+3+27+3

=2557

7で割って余り2。つまり火曜日で正しい答えが出ています。

 なお、g(M)の表も7で割った余りを使ってもよいですし、N’の最初の4項分はこちらもあらかじめ2000年代くらいの分は表にしておけば簡単に値を求められます。まだまだあちこちに工夫の余地はあります。また、今回は岩堀先生の著書に従って基準の日を1976年3月1日(月曜)に選びました。これも例えば2004年3月1日(月曜)を用いても大丈夫です。どこを基準にしてもNの式の定数項が変わるだけだということを注意しておきましょう。

 ぼくが高校生だった当時、そろそろポケットコンピュータが流行り始めて、ぼくもカシオFXー702Pを使って遊んでいました。バイオリズムの計算や、今回紹介した曜日の計算、狭い画面を使ったゲームなど、簡単なプログラムを書いていたことを思い出します。今に比べれば何もない、何も知らない状態だったけれど、とにかく楽しい日々でした。