暇つぶしに
数学(?)に挑戦しよう!


今回は「暦」その2
自分の誕生日は何曜日だったのか?
暦を調べるうちに興味が,こちらが数学的かも
 


<曜日の求め方に挑戦!>

 暦といえば,曜日の求め方も面白そう!「自分の誕生日は何曜日だろうか?」など,知りたいと思いませんか。「西暦年月日」から「曜日」は計算できるはず。そこで今回は,曜日の求め方(計算法)に挑戦しよう。曜日は7日おきに順番に繰り返すだけだから,簡単そうだ。しかし,ひと月や1年の日数が7の倍数でないため,面倒なところが。それに閏(うるう)年も・・・。

 
1 2 3 4 5 6 7 1月
・・・省略・・・
29 30 31        
      1 2 3 4 2月
・・・省略・・・
26 27 28        
 曜日が解り難いのは,月ごとに曜日が「ずれ」ていくからだ。そこで,毎月の曜日がどのようにずれていくのか調べてみよう。曜日は7日ごとの周期で繰り返される。1月は31日あり,31は7で割ると余りが「3」だから,2月は1月に比べて「3つ」ずれる。右のような表(暦)を作ってみると解りやすいだろう。
 平年の2月は28日,28は7で割ると余りは0 即ち 28≡0(mod 7)備考参照 だから平年の2月では,ずれに変化がなく,3月のずれも2月と同じ「3」。3月は31日 31≡3(mod 7) だから,4月のずれは2月分とあわせて「6」。5月は4月分のずれ「2」を加えて「8」だが,8≡1(mod 7) なので,5月のずれは「1」と考えることができる。1月からの各月の「曜日のずれ」m’を下の「表1」に示す。
 備 考:
「31を7で割ったときの余りが3」を「31≡3 (mod 7)」と書く。31と3は7で割った余りは等しいという意味でも。(これを使う必要はないが、表記が簡単なので)
表1(平年)
10 11 12
日数 31 28 31 30 31 30 31 31 30 31 30 31
m’
ずれ
 注 意:
後述する曜日の計算式において,曜日のずれm’は平年・閏年に関係なく,常にこの表1の値を利用する。
 
 閏年では,2月が29日となるので,「表2」のように3月以降のずれが +1 となる。
表2(閏年)
10 11 12
日数 31 29 31 30 31 30 31 31 30 31 30 31
ずれ

 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

そこで 火曜日を 2,水曜日が 3 と 順番に0~6のw値を各曜日に割り当てればよい。
w値・曜日対応表
曜日
となる。

備考:「ずれの合計」から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


メニューにもどる 付録:曜日の求め方の応用