RPGツクールと数学のブログ

RPGツクールと数学についてのブログです。

高速曜日計算

過去ブログの転載です。

年月日を聞かれたときに、その曜日を一瞬で求められたらスゴイですよね。まだサマーウォーズ見てないのですけど、数学ができる主人公がそれを一瞬でやってみせるというシーンがあると聞いています。

これには次のツェラーの公式を使っています:

 {\displaystyle h=\left(\left\lfloor\frac{c}{4}\right\rfloor-2c+\left\lfloor\frac{y}{4}\right\rfloor+y+\left\lfloor\frac{26(m+1)}{10}\right\rfloor+d\right) \mod 7}

西暦の千、百の位をc、十、一の位をyとして、m月d日の曜日がhに数値として出てきます。h=0が土曜日で、1, 2, 3, … になると 日, 月, 火, …
c/4とかy/4を覆っているかっこは、小数点以下切り捨ての記号で、mod 7 は、7で割ったあまりを計算しなさい、という演算子です。

ただし1月, 2月の場合のみ例外で、前の年の13月, 14月として計算しなければなりません。

作中ではこれを用いて暗算で一瞬で求めているそうですが、なんでもコレのことをモジュロ演算と呼んでいるらしいですね。

モジュロ演算ってたぶん最後の「mod 7」の計算のことを言ってるんでしょうけど、モジュロ演算といえば何故か曜日計算が出てきます。曜日計算をする演算の名前ではないですよ。

彼は天才なので、上のような長い数式でも一瞬で計算出来てしまうのかもしれないですが凡人でもパッと計算してみたい願望があります。

そこで今回は、上のツェラーの公式をとことん凝縮し、1900年~2099年の年月日に対するすべての曜日を暗算で当てる方法を書きます。

高速曜日計算です。でもこれには暗記と多少の訓練が必要です。

高速曜日計算

1900年~2099年の年月日から曜日を当てる方法です。

まず、次の数列を暗記しておきます。

143614625035

これらは月に対する数字で、例えば4月の数字は4番目の6、というようなものです。

覚え方は様々だと思います。私はなんとなくの位置でスペースを置いて
1436 146 25035
として覚えましたが、利便性を考えて4文字区切りにして
1436 1462 5035
とかにしてみてもいいかもしれません。

あとは、数値とそれに対応する曜日を知っていればOKです。0が土曜日ということを知っておけば、あとは順番とわかれば良いでしょう。

以上を暗記して、あとは練習です。下図では1967年2月10日の曜日を求めています。

f:id:fermiumbay13:20171203140158p:plain

まず、1月か2月の場合は年だけ1年前にずらします。そうでなければ不要です。年→月→日の順に処理していくとよく忘れてしまうので、最初は月を見てこの判定をするのを忘れないように注意しましょう。

この場合は2月なので、1967年から1年戻して1966年として考えます。

1900年代であれば1、2000年代であれば0を採用します。今回は1900年代なので「1」を覚えておきます。

西暦の下2桁の計算に一番時間が掛かります。

ここでは66ですが、66÷4の小数切り捨てと、66をそれぞれ足す必要があります。数字が小さければそのままできますが、大きいと暗算が難しくなります。

実はここでの計算で用いる値は28を足し引きしても全体に影響がないので、大きい場合は28で引いていき、小さくしていくことを考えます。30引いて2足せば良いですね。
66-30=36、36+2=38
38-30=8、8+2=10
ということで、66は10として扱っても良いことになります。これなら暗算でできますね^^
10÷4の小数切り捨ては2ですから、2+10=12ですね。計算の最後に7で割った余りの計算があるのですが、この操作はいつ行ってもいいので、この時点で7引いておきましょう。12-7=「5」にしておきます。

これと、さっき覚えておいた1を足して「6」にします。この「6」が1966年の年定数です。1966年なら常に「6」になります。以上の計算が比較的長いので、例えば今年の分だけ計算できればいいのであれば今年の年定数をあらかじめ計算しておいてそれを覚えておけば、計算が速くなります。例えば2017年だったら「0」です。(同じ2017年でも1, 2月は2016年として扱うのに注意です)

次に月定数を足します。2月なので、2番目の数字である「4」ですね。さっき覚えておいた6と足して、6+4=10になり、7以上なので7引いて、10-7=「3」です。

最後に日にちを足します。10日なので、3+10=13で、13-7=「6」となります。

「6」金曜日でしたから、1967年2月10日は金曜日です。

手順は長いのですけど、計算がすべて簡単なことから、ツェラーの公式をそのまま計算するよりも暗算がずっとしやすいものと思います。何度か練習していけばきっと、一瞬は無理でも高速に求められるようになるでしょう。