立教大学の島内先生も曜日の計算は素早く, その話はいつぞやのこのブロ グにすでに記述した通りである.
私も曜日の高速計算を隠し芸にしたいが, どうすればいいか. いつもはブ ログにも何度か書いた例の 2,5,5,...の表を使う. 当日と同じ年内のことだ と, Doomsday方式も便利で, 今年(2025年)は「金曜」を覚えておくだけで よい. Conwayの曜日計算はDoomsdayの方式に違いない. その辺のことは, Winning Waysの第4巻にある.
問題はその年の定数, 若しくはDoomsdayを得ることにある. 私のは島内さ んと同様で, 西暦年数の上2桁をc, 下2桁をbとした時, (b+b//4)にcが19 なら2を引き, 20なら4を足して7の法をとっていた. 例えば2025年なら, c=20, b=25だから(25+floor(25/4)+4)%7=(25+6+4)%7=0. しかしこれはb が大きいと, 大数を扱うことになり面倒だ.
Winning WaysにあるConwayの方法は意外である. bを12で切り捨て除算し, (b=25ならb//12=2)その商(この例なら2)に剰余(同1)を足し, さらにその 剰余を4で切り捨て除算した商(同0)を足すものである((2+1+0)%7=3 それ にc=20の4を足して7で法をとるから0).
私のやり方と随分違う算法に見えるが, 取り敢えず私にやり方(Aとする) とConwayの方法(Bとする)で, bの0から35までの, 7で法をとる前の値を計 算し, 12個ずつ並べてみると
A 0 1 2 3 5 6 7 8 10 11 12 13 15 16 17 18 20 21 22 23 25 26 27 28 30 31 32 33 35 36 37 38 40 41 42 43 ... B 0 1 2 3 5 6 7 8 10 11 12 13 1 2 3 4 6 7 8 9 11 12 13 14 2 3 4 5 7 8 9 10 12 13 14 15 ...つまりAでは2行目, 3行目は1行目に15,30を加えたもにであるのに対し, B では1,2を加えたものになっている. 15,30は7を法とすると1,2だから, 7 で法をとった結果は同じになるのであった. Aではbが99だと99+24=123まで 大きくなるのに, Bだと8+3=11にしかならない.
というわけで, また我々には12の倍数なら8倍くらいまでは常識だから, 私も最近はBを愛用している. しかし, 12で割った剰余に, さらにそれを4 で切り捨て除算をしたものを足すのは, 計算するよりそれの7での法をとっ た
0 1 2 3 5 6 0 1 3 4 5 6を足す方が簡単のように思い, 実際の計算では表を使う.
従って, グレゴリオ暦のc*100+b年m月d日の曜日は,
西暦年数の上2桁cの定数: [4,2,0,-2][c % 4] 西暦年数の下2桁bの定数: b//12+[0,1,2,3,5,6,0,1,3,4,5,6][b%12] 月mの定数: [2,5,5,8,3,6,1,4,7,2,5,0][m-1] ただし閏年の1,2月は1,4 日dの定数; dこれ(上からそれぞれをc項, b項, m項, d項とする)を加算して7の法をと るという計算になる. cに関する項は実用的にはcは19か20なので, -2と4 だけを覚えておけばよい.
また, bの項で使う表をbs, mの項でのそれをmsということにする.
ちょっと練習問題を. グレゴリオ暦になった最初の日, 1582年10月15日. ものの本には金曜とある.
c=15だからcの項は-2. 12*6=72だから, 82//12=6 82%12=10, bの項は6+5=11 10月だからmの項は2 -2+11+2+15=26 26%7=5で金曜であった.母親が水曜であることだけ覚えていたGaussの誕生日 1777年4月30日.
c=17だからcの項は2 77//12=6 77%12=5 bs[5]=6, 4月のmsの値は8 2+6+6+8+30=52 52%7=3 で水曜であった.曜日の高速計算のキーポイントはこの2つの表引きが瞬時に出来ることである.
bsの表では12の値は4つずつ3組になっていて, 左の4個は見出しを二進法 にした時, 4のビットも8のビットも立っておらず, この組は0,1,2,3につ いて値も0,1,2,3だから簡単である. 中央の4個の組は4のビットが立って おり, 4,5は1ずつ多い5,6; 6,7は0,1, 右の4個は8のビットがあり, 値は5 ずつ少ない.
msの表についていえば, カレンダーの曜日は3ヶ月で大体元に戻ることを認識 するのが重要である. つまりその3ヶ月が, 30日, 31日, 30日で合計が 91日だと, 丁度7の倍数だから, 4ヶ月目は3ヶ月の最初と同じになる. 4月と 7月が同じ曜日関係になる.
90日だと曜日が1日戻り, 92日だと1日進む. 平年の1,2,3月は90日だから, 4月は1月より1日戻り, 4,5,6月は91日だから4月と7月は曜日が同じだ.
Doomsdayの規則には1月と2月への言及はないが, 私は1,2月は平年なら 10,11月と同じ, 閏年なら7,8月と同じと思っているが, 平年の1,2月の2,5 は10,11月の2,5と同じで月の大小も同じである. また閏年の1,2月の1,4は 7,8月の1,4なのと同じで,こういう事に気付いているとmsの表も覚え易い.
最近はこういう考えで曜日の高速計算に挑んでいるが, 私自身が歳を取ったことも 言い訳にして, 仲々高速にはならない. しかし結構楽しんではいる.

