ある年の元旦が「土曜日」であれば、通常、次の年の元日は「日曜日」になります。なぜなら1年の365日は、1週間の「mod 7」に対して余り1で、1年の同じ日づけの曜日は、次の年に1つ次にずれるからです。同じ理由から、昨年2010年の元日は1コ前にずれて金曜日、一昨年は木曜日になります。今これを、「合同式」の記法を応用して次のように書くことにします。余りを直接指定しているので、合同記号ではなく、等号です。
では、ここから考えて、来年のさらに次の年の2013年の元旦は何曜日でしょうか?さらに1日ずれて、月曜日でしょうか?違います。2013年の元日はもう1つだけさらに余分にずれて、火曜日になります。なぜでしょうか。そうです、2012年は「閏年(うるう年)」で、通常年より1日だけ日にちが多いからです。閏年は、4年に1回、西暦が4で割り切れる年(オリンピック・イヤーと同じ)に設定されていて、2月の終わりに、通常年にはない2月29日が追加されています。
では、この4年に1度の閏年を考慮に入れ、剰余演算の考え方を活用すれば、「ある年のある日付の曜日はなにか」という問題に、計算で自由に答えを出せるようになるでしょうか?短期的には可能ですが、長いスパンではこれでもまだ不足です。というのは、暦には、長い範囲ではさらに調整が入っているからです。
もともと、閏年のような調整日が入っているのは、地球が太陽の周りを回る公転周期と、暦の日付がぴったり合っていないからで、調整日を入れないと、徐々に実際の季節と暦が合わなくなってきてしまいます。4年に1回閏年を入れて調整する暦を「ユリウス暦」といいますが、地球の実際の公転周期は 365.2422日ですので、閏年の設定で、1年あたり、1/4=0.25日付加されて、365.25日となり、かなりいい具合にはなりますが、まだ微妙に合っていません。
もともと西暦ではこのユリウス暦をずっと使っていましたが、そういう次第で、1000年くらい使っている間に、かなりズレが溜まってきて困ったことになってきました。そこで16世紀後半、当時のローマ教皇グレゴリウス13世が、精鋭の学者たちを集めて、さらに正確な調整が入った新しい暦を作るように命じました。こうして生まれたのが「グレゴリオ暦」で、以来、現在まで西暦で使われているのがこのグレゴリオ暦です。日本でも明治維新の時に西暦に切り替えてから、ずっとこれが使われています。
4年に1回の閏年に加え、グレゴリオ暦では、次の調整が入っています。
- 西暦年が4で割り切れる年であっても、100で割り切れる年には調整日を入れない(閏年にしない)
- 100で割り切れる年であっても、400で割り切れる年は調整日を入れる
ややこしいですが、これで「365+1/4−1/100+1/400」で、365.2425日と、実際の公転周期にきわめて近い値になります。
このグレゴリオ暦は今の世界で実際に使用されている暦ですので、この調整の考え方を取り入れれば(少なくともグレゴリオ暦が使用されている範囲においては)過去と未来に渡って、ある年のある日付の曜日を自由に割り出せるようになります。
グレゴリオ暦の調整方法を取り込んで、曜日を出力できるようにした有名な公式に「ツェラーの公式」というものがあります。以下のような格好した式です。
なんだか、いかにも難解で、深遠そうな式ですね。なんでこの計算で曜日が出るのか、とても不思議です。剰余演算の応用課題として、次回にこのツェラーの公式の読み解きにチャレンジしてみたいと思います。
仕事でIT関連の分野に携わっている方はよくご存じと思いますが、暦やカレンダーは情報システムを扱う上できわめて基礎的かつ重要な要素で、曜日を正しく計算するというのもその大きな一部です。以前、千年紀をまたいで21世紀が始まるときに「2000年問題」というものがあり、コンピュータが暦を扱うプログラムの不良で、飛行機が落ちたり、銀行預金が消し飛んだり、医療機器が止まったりするのではないかとずいぶん心配され、業界総出で対処にかかりきりになったことがありました。これなどはその端的な例です。
<参考にさせていただいた資料>
うるう年を判定する方法 ( Microsoft Support )
西暦2400年はうるう年?うるう年じゃない? (@IT自分戦略研究所 )
PS3の問題はうるう年が原因 ( マイコミジャーナル )
うるう年を判定する方法 ( Microsoft Support )
西暦2400年はうるう年?うるう年じゃない? (@IT自分戦略研究所 )
PS3の問題はうるう年が原因 ( マイコミジャーナル )