全3312文字
PR

ソフトウエア開発におけるアルゴリズムの重要性が増している。指定した年月のカレンダーを表示する「万年カレンダー」の作り方を通してアルゴリズムを学んでいこう。

 「人生100年時代」と言われています。もしも100歳まで生きられたら、盛大にお祝いしたいですね。友人・知人をたくさん招待できるように、100歳の誕生日が土曜日か日曜日ならいいですね。はたして、あなたの100歳の誕生日は、何曜日なのでしょうか?

 それを調べるために、「万年カレンダー」のプログラムを作ってみます。このプログラムは、「西暦と月を指定すると、その月のカレンダーを表示する」というものです。例えば、図1-1のように、「year =」に「2061」を、「month =」に「5」を入力して実行します。すると、筆者が100歳になる西暦2061年5月のカレンダーを表示しました。

図1-1 「万年カレンダー」のプログラム
図1-1 「万年カレンダー」のプログラム
[画像のクリックで拡大表示]

「万年カレンダー」を作る準備

 万年カレンダーを作るために、まず、基準とする年月日の曜日を調べる必要があります。そして、その基準の年月日から指定した年月日の曜日を計算で求めていきます。

 西暦1年1月1日を基準としたいところですが、はたして何曜日なのでしょう。また、それをアルゴリズムで求めるためには、うるう年を考慮しなければなりません。うるう年かどうかを判定するアルゴリズムについても、説明していきます。

「西暦1年1月1日」を基準日とする

 まずは、暦の仕組みを確認しておきましょう。

 現在、世界の多くの国々で採用されている暦は、「グレゴリオ暦」というものです。かつて、古代のローマでは、最高神祇官(じんぎかん)のガイウス・ユリウス・カエサルによって、紀元前45年1月1日から「ユリウス暦」が採用されていました。この暦は、1年を365日として、4年に1度のうるう年(2月の末日が29日であり、1年が366日となる年)を設けるというルールであり、あまり精度が高くありませんでした。ユリウス暦の1年は、

[画像のクリックで拡大表示]

になります*1。しかし、正確な1年は、365.2422日です。誤差は、1年間に0.1872時間もあります。

*1 ここでは、本文中の計算式にPythonの演算子を使います。「*」は乗算(掛け算)で、「/」は除算(割り算)です。

 その後、長い年月を経てから、ローマ教皇グレゴリウス13世がユリウス暦の改良を命じて、1582年10月15日からグレゴリオ暦が採用されました。これは、1年を365日として、400年に97回のうるう年を設けるというルールであり、精度が大きく向上しました。グレゴリオ暦の1年は、

[画像のクリックで拡大表示]

になるからです。誤差は、1年間で0.0072時間しかありません。

 日本では、明治5年にグレゴリオ暦が採用され、明治5年12月2日(これは「天保暦」と呼ばれる旧暦です)の翌日を、明治6年1月1日としました。これは、グレゴリオ暦による新暦の1873年1月1日に該当します。西洋では、ユリウス暦の1582年10月4日の翌日を、グレゴリオ暦の1582年10月15日と定めました。

 したがって、グレゴリオ暦で「西暦1年1月1日は何曜日か?」と考えるのは、ナンセンスなのです。しかし、基準がないと困るので、これから作成する万年カレンダーは、現在からグレゴリオ暦で逆算して西暦1年1月1日の曜日を求め、それを基準とすることにします。