今回は「暦」その2
自分の誕生日は何曜日だったのか?
暦を調べるうちに興味が,こちらが数学的かも
暦といえば,曜日の求め方も面白そう!「自分の誕生日は何曜日だろうか?」など,知りたいと思いませんか。「西暦年月日」から「曜日」は計算できるはず。そこで今回は,曜日の求め方(計算法)に挑戦しよう。曜日は7日おきに順番に繰り返すだけだから,簡単そうだ。しかし,ひと月や1年の日数が7の倍数でないため,面倒なところが。それに閏(うるう)年も・・・。
日 | 月 | 火 | 水 | 木 | 金 | 土 | |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 1月 |
・・・省略・・・ | |||||||
29 | 30 | 31 | |||||
1 | 2 | 3 | 4 | 2月 | |||
・・・省略・・・ | |||||||
26 | 27 | 28 |
月 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
日数 | 31 | 28 | 31 | 30 | 31 | 30 | 31 | 31 | 30 | 31 | 30 | 31 |
m’ ずれ |
0 | 3 | 3 | 6 | 1 | 4 | 6 | 2 | 5 | 0 | 3 | 5 |
月 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
日数 | 31 | 29 | 31 | 30 | 31 | 30 | 31 | 31 | 30 | 31 | 30 | 31 |
ずれ | 0 | 3 | 4 | 0 | 2 | 5 | 0 | 3 | 6 | 1 | 4 | 6 |
1年では,平年の365日なら1つ,閏年の366日なら2(ただし,1~2月は1)ずれることになる。このずれを曜日の計算に生かせばよい。閏年は西暦が「100の倍数でない4の倍数」と「400の倍数」になる年。すなわち,1901年から2099年までは西暦が4で割り切れる年は全て閏年。よって,ここで考えるのは1901年から2099年までとする。
では「西暦1900+y 年 m月 d日」の曜日を考えてみよう。
結論を先に言えば「y+[y/4]+m’+d」の値を求めればよい。
[y/4]は y を 4で割った商の整数部分を表し,値は4年(閏年)ごとに+1となる。
m’は上の「表1」の各月のずれの値。(閏年でも表1を使う)
平年の365日での+1のずれは y ,閏年366日での+1のずれが [y/4] ,月のずれが m’
日のずれが d で表され,それらの合計「y+[y/4]+m’+d」 が 「ずれの合計」となる。
曜日は7種類の繰り返しだから 「ずれの合計」を7で割ったときの「余り」で考えることもできる。
これは 「ずれの合計」≡w (mod 7) とも表せる。(ずれの合計を7で割ったときの余りがw)
注意しなければいけないのが,閏年の1・2月では,wの値を -1すること!
なぜなら,閏年のづれは3月からであり,1・2月にはいらないから。
よって y+[y/4]+m’+d≡w (mod 7) この w が 曜日を決定する値となる。
まず,曜日の基準となる日を選ぼう。(基準は曜日が分かっている日だったらいつでもよい)
例えば 2002年1月1日 は 火曜日 だった。
この日のwの値は y=102,m’=0,d=1
だから
y+[y/4]+m’+d=102+25+0+1=128
128≡2 (mod 7) すなわち w=2
w値・曜日対応表 | |||||||
w | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
曜日 | 日 | 月 | 火 | 水 | 木 | 金 | 土 |
備考:「ずれの合計」からwを計算するのではなく,合計する前の各値の7で割った余りを出して合計しても構わない。この例では 102≡4,25≡4 として,4+4+0+1=9≡2 (mod 7) すなわち w=2 (数が小さくて計算しやすい)
それでは,試して見よう。曜日を知りたい日の曜日の「ずれの合計」から,w値を計算すればよい。
2002年5月18日は 平年で y=102,m’=1,d=18だから
「ずれの合計」=y+[y/4]+m’+d=102+25+1+18≡4+4+1+4=13
よって 13≡6 (mod 7) すなわち w=6
w=6 よって 土曜日
他にも
2002年2月11日(月)は 102+25+3+11≡4+4+3+4=15≡1 対応表により 月曜日(本ページ作成日)
2000年5月18日(木)は 100+25+1+18≡2+4+1+4=11≡4 対応表により 木曜日
2001年5月18日(金)は 101+25+1+18≡3+4+1+4=12≡5 対応表により 金曜日
1941年5月18日(日)は 41+10+1+18≡6+3+1+4=14≡0 対応表により 日曜日(本校創立記念日)
このように,ばっちりです。これで,すべて一致するかと・・・。
ところが,2000年2月11日(金) は 100+25+3+11≡2 +4+3+4=13≡6 とすれば,土曜日となってしまう!??
2000年は閏年,「表1」と「表2」を比較してみて下さい。閏年の3月以降は,曜日のずれが+1となるが,1~2月は平年と同じ。[y/4]で閏年には既に+1のずれが加えられているが,1~2月は+1は不要。よって,「閏年の1~2月のw値は-1」する。閏年の1~2月に注意!
よって,曜日の求め方をまとめると「1900+y年m月d日」の曜日を知るには |
「y+[y/4]+m’+d」を 7 で割った余りを
w とする 閏年の1~2月以外は w の値をそのまま使い 閏年の1~2月だけは w-1 を w の値として 「w値・曜日対応表」を利用して曜日を求める m’の値は常に表1を使う |
日付が基準日からの連番となっていたら,日付を7で割った余りを求めるだけで曜日が解るのに・・・。「暦について」にも書いているように,現在の暦は改善の余地がありそうです。曜日の計算方法は他にもいろいろあります。ここでは 1900+y 年の y(西暦-1900)を使いましたが,4桁の西暦そのものを y として考えるのもいいでしょう。グレゴリオ暦では「西暦年が4で割り切れる年は閏年。ただし,西暦が100で割り切れるが400で割り切れない年は平年」です。即ち,1900年や2100年は閏年ではありません。そこで,今回の計算式は1901年から2099年までのものですが,全ての西暦年(グレゴリオ暦になってからの)に対応する計算式に挑戦するのも面白いかと。もちろんユリウス暦時代のものも考えられますね。最近では,曜日を求める関数等が用意されており,計算方法を考える必要もなく,面白みも半減。生徒たちと万年暦や占いのプログラムを作り,曜日を出力させて面白がっていた頃が懐かしく思い出されます。 |
作成:2002/2/11 最終更新:2004/09/01