2011年5月25日水曜日

曜日の計算

1989年12月19日に59歳で他界された基礎論の数学者, 島内剛一(しまうち たかかず)先生を知る人はもう少ないに違いない. 私はプログラミング言語の設計などで, 島内さんには多くの影響を受けた. 基礎論の専門家だけあって, 計算機の見方も一種独特であり, 島内マニュアルは「計算機は順序のあるビットの有限集合である.」のように書き始める.

島内さんの多くの特技の1つが, 曜日の計算であった. 年月日をいうと10秒くらいで何曜と返ってくる.

その秘法は何か. 私の推測では, 島内さんは,

m 1月 2月 3月 4月 5月 6月 7月 8月 9月10月11月12月
h 2 5 5 1 3 6 1 4 0 2 5 0

のような, 月始めの曜日の表h(m)だけを記憶していたらしい.

すると, 21世紀中の 2000+y年m月d日の曜日は, y+floor(y/4)+h(m)+d+4 mod 7 を計算するとそれが曜日になる.

やってみよう. 2011年5月25日の曜日は, 11+floor(11/4)+h(5)+25+4 = 13+3+25+4 = 45, 45 mod 7 = 3 すなわち水曜である.

だれもが知っているように, 平年ならある日の曜日は, 365 mod 7 = 1 ゆえ, 翌年は次の曜日になる. うるう日をまたぐと, 2日増える. これがyとfloor(y/4)を足す理由である.

うるう年は1月2月も2増やしてしまったが, これでは駄目なので, うるう年の1月と2月はh(m)の値から1を引く必要がある.

最後の+4は21世紀中に通用する定数で, 曜日を合わせるためのものだ. そもそもh(m)の表は全体を一斉に増やしても減らしても問題ない. 補正値をそれに応じて変えるだけである.

要はh(m)の表を覚えやすく作ることだ. 島内さんは似たような表を, おそらく無理に覚えてしまったのだろうが, 私は上の表を工夫をして書いた. mod 7を取るのだから, 7を足しても意味は変らないので, 4月を8に, 9月を7にする.

m 1月 2月 3月 4月 5月 6月 7月 8月 9月10月11月12月
h 2 5 5 8 3 6 1 4 7 2 5 0

この表で, 4月から始まる偶数の月の値は, 8, 6, 4, 2, 0である. 一方, 3月から始まる7月までの奇数の月の値は, 5, 3, 1で, その先は負になるから, 心機一転9月は7に, 11月は5にするのである.

残りは, 経験で知っているように, 2月は3月と同じ, 1月は10月と同じと覚える.

3月は5で, 4月は8の出発の値の記憶が肝心である(9月の7も?). そして2か月で2ずつ減る(2か月の間に, 通常は30日の月と31日の月があり, 30+31=61=-2 mod 7だからだ). それと世紀の定数の+4を忘れないこと.

練習問題
2000年1月1日は何曜か. (うるう年に注意)
9.11の2001年9月11日は何曜か.
来年日本で金環食が見られる2012年5月21日は何曜か.
unix timeの31ビットが立つ, 2038年1月19日は何曜か.

今年ももう年の半ばまで来た. 今年中は, 11+floor(11/4)+4=17 そのmod 7は3だから, 3+h(m)+d mod 7で計算する.

曜日に計算では, 無理に誤差をいれる島内の方法や, John Conwayの方法などが面白いが, それらはまたいずれ.

0 件のコメント: