![見出し画像](https://assets.st-note.com/production/uploads/images/111666945/rectangle_large_type_2_9a8c3051089be3c34d271d11eaae65dd.jpeg?width=800)
もっとも洗練された筆算による曜日計算法~アルゴリズム編
みなさん, どうもこんにちは. C-Watcher開発担当の鈴木です. 今シリーズでは紙と鉛筆を使ったアナログな計算によって日付の年月日から曜日を計算する方法をご紹介します. この方法は私が知る限り, 同コンセプトにおいてはもっとも簡単かつ強力な方法となっていて, その特徴として次のような工程があります.
筆算による整数の割り算
整数の合同式
表の参照
学習効果やメリットとしては次のようなことが挙げられると思うので, ご活用ください.
手指の運動, 頭の体操になる.
筆算による割り算や合同式の練習.
小学, 中学生向けのプリント課題.
練習方法
後述するようにアルゴリズムはツェラーの公式を利用しています. 表計算ソフトなどを使えば, ランダムな日付を生成してから, その答えの曜日はツェラーの公式で計算することにより, 日付と曜日のリスト(練習問題)を作ることができると思います.
必要知識について
アルゴリズムではおもに筆算による整数の割り算と, 整数の合同式を使います. これらの技術についてはユーザは予習済みということにして, 本編では解説していません.
ツェラーの公式
アルゴリズムは与えられたグレゴリオ暦の日付に対して曜日を求めることができますが, その計算結果の曜日はツェラーの公式というよく知られた曜日計算法の計算結果と必ず一致するようになっています. (その証明については数学編で解説する予定です. )以下に式を示すので参考にしてください.
$$
W=(Y+ \lfloor \frac{Y}{4} \rfloor - \lfloor \frac{Y}{100} \rfloor + \lfloor \frac{Y}{400} \rfloor + \lfloor \frac{13M+8}{5} \rfloor +D) \mod 7
$$
ただし, $${\lfloor x \rfloor }$$は$${x}$$のfloor関数といって, 実数$${x}$$に対し, $${x}$$以下で最大の整数を返します. $${mod}$$は除算の余りを計算する演算子です.
与えられた日付をもとに$${Y,M,D}$$を設定(※1)して, 式の$${W}$$を計算することで曜日が分かるしくみです.
![](https://assets.st-note.com/img/1690281954216-BuuOuecchX.png?width=800)
※1:$${Y,M,D}$$の設定方法は, これから説明するアルゴリズムとまったく同じです.
日付の範囲
日付として有効な範囲は$${1}$$年$${1}$$月$${1}$$日から$${9999}$$年$${12}$$月$${31}$$日まで(※2)となっており, この範囲にある日付なら$${1}$$~$${2}$$分ほどで曜日を回答することができます.
※2:世界史において実際にグレゴリオ暦(新暦とも呼ばれる)が採用されたのは$${1582}$$年$${10}$$月$${15}$$日からです.
日付の変換
与えられた日付について, 年数を$${Y}$$, 月数を$${M}$$, 日数を$${D}$$とします. ただし, ここが重要なポイントなのですが, 月数が$${1}$$か$${2}$$の場合は「年数$${-1}$$」を$${Y}$$
に, 「月数$${+12}$$」を$${M}$$にしてください. 例えば$${2000}$$年$${1}$$月$${1}$$日なら, (月数が$${1}$$なので)$${Y=2000-1=1999,M=1+12=13}$$とします.
筆算による割り算
それでは始めます. まず, 筆算の割り算を使って次の$${(1)}$$~$${(3)}$$を計算します. 例は$${Y=2649,M=6,D=19}$$です.
$${(1)}$$ $${Y}$$を$${400}$$で割った商$${q_1}$$と余り$${r_1}$$を計算する.
![](https://assets.st-note.com/img/1690282006030-C3YACCMkcr.jpg?width=800)
(例)$${q_1=6,r_1=249}$$.
$${(2)}$$ $${r_1}$$を$${100}$$で割った商$${q_2}$$と余り$${r_2}$$を計算する.
![](https://assets.st-note.com/img/1690282088160-VELEzj813K.jpg?width=800)
(例)$${q_2=2,r_2=49}$$.
$${(3)}$$ $${r_2}$$を$${4}$$で割った商$${q_3}$$と余り$${r_3}$$を計算する.
![](https://assets.st-note.com/img/1690282121974-UMU48IdOyU.jpg?width=800)
(例)$${q_3=12,r_3=1}$$.
f(M)を求める
次に, 下表を参照して$${f(M)}$$を求めます.
![](https://assets.st-note.com/img/1690282162626-pBGcaqgf4s.png?width=800)
(例)$${f(M)=3}$$.
合同式
次に, $${(4)}$$の式で$${W}$$が$${7}$$を法として$${0,1, \dots ,6}$$のどれと合同なのかを計算します.
$${(4)}$$ $${W≡5(q_2+q_3 )+r_3+f(M)+D \pmod 7}$$
(例)
$$
W≡5(2+12)+1+3+19≡5 \cdot 14+23≡23≡2 \pmod 7
$$
答えの曜日
下の表を参照して, $${W}$$の計算結果に応じた答えの曜日を求めます.
![](https://assets.st-note.com/img/1690282260419-E0bupvp6ZW.png?width=800)
(例)火曜日.
この記事が気に入ったらサポートをしてみませんか?