学習

サマーウォーズで健二がやってた誕生日の曜日を当てる計算方法【モジュロ演算】

ヤゴコロ研究所に訪問いただきありがとうございます。東大生ブロガーの西片(@nskt_yagokoro)です

今回は映画『サマーウォーズ』で主人公・小磯健二くんがやってた「モジュロ演算」の解説をしていこうと思います(結構古い映画ですが…)

【この記事で分かること】
・元ネタ、サマーウォーズについて
・誕生日の曜日を簡単に求める方法
・↑の解説
・曜日を求める公式

元ネタ、サマーウォーズの概要

※以下、サマーウォーズのネタバレを含みます。見たくない方は、上の目次の「簡単な解き方」をクリックして計算方法のみをご覧ください

はじめに本記事で紹介するモジュロ演算を一躍有名にしたであろう映画・サマーウォーズについて軽く解説しておきます

『サマーウォーズ』とは2009年8月1日に公開されたアニメ映画。監督は『時をかける少女』や『バケモノの子』で有名な細田守さんです

物語の舞台は「OZ」と呼ばれる仮想空間が当たり前となった日本。

数学が得意な男子高校生・小磯健二(敬称略。以下同様)が、ひょんなことから憧れの先輩・篠原夏希の恋人のふりをして夏希の実家に行くことに。

何も起きないはずがなく、OZに関連したトラブルが発生して…って感じで物語が進んでいきます(あえて多くは語りません)

2009年公開の映画とは思えないようなVR世界の壮大さ、立派な日本家屋とネット世界の調和が印象に残る名作です

で、この記事に関連するのは物語冒頭のとあるシーン

「健二が数学オリンピック日本代表まであと一歩だった」ことを知った夏希が健二に「なんかやってみてよ」と一発芸を要求します

↓その後の会話がこちら(セリフはうろ覚えなんで間違ってるかもしれません)

健二「先輩の誕生日、いつですか?」

夏希「7月19日。平成4年の」

健二「日曜日です!」

夏希「え?」

健二「1992年の7月19日は、日曜日でした!」

夏希「すっっごい!もしかして全部覚えてるの?」

健二「いえ、モジュロ演算っていうのを使って…あってました?」

夏希「ごめん、何曜日か知らないや…」

夏希は自分の誕生日が何曜日か覚えていませんでしたが、僕が確認したところ、ちゃんと当たってました

つまり驚くべきことに健二は夏希が誕生日を言った瞬間に曜日を当ててみせたのです

大して重要な場面ではなく時間も一瞬なのですが「どうやって計算したの?」と気になった方も多いと思います

簡単な解き方

まずは数学的な知識がほとんど不要の、暗記するだけでできる方法をお伝えします

数ステップで簡単にできるのでオススメです

【1ステップ目】
はじめに曜日を求めたい日付の西暦の下2桁を4で割ります。割って出てくる数をAとします(ただし余りは無視してください)

例えば2021年12月25日の場合、21÷4=5あまり1なのでA=5となります

【2ステップ目】
西暦の下2桁をBとします。つまり2021年12月25日の場合、B=21となります

【3ステップ目】
下の表を使って月に対応する数字をCとおきます。2021年12月25日の場合、C=6です

対応する数 C
11
24
34
40
52
65
70
83
96
101
114
126

【4ステップ目】
調べたい日をDとおきます。2021年12月25日の場合、D=25となります

【5ステップ目】
1900年代の場合E=0、2000年代の場合E=6とします。2021年12月25日の場合、E=6となります

【6ステップ目】
AからEをすべて足して、その和を7で割ります。その余りを下の表に当てはめれば曜日が分かります。

余り曜日
0
1
2
3
4
5
6

2021年12月25日の場合、A=6, B=21, C=6, D=25, E=6なので、(5+21+6+25+6)÷7=9あまり0となって土曜日だと分かるわけです

上記の方法で計算できる理由

単に計算方法を教えるだけだとツマラナイのでちょっと解説します(自分で考えた解説なので間違ってたらすみません…)

まず前提として、1週間は7日あるので「7で割った余りが重要」ということを覚えておいて下さい

例えば「6/24(火)から22日後は何曜日?」と聞かれたら「22を7で割った余りは1だから火曜日の1つ後の水曜日になる」と瞬時に分かるわけです

これを踏まえて考えていきましょう

まず、1ステップ目の「西暦の下2桁を4で割る」は「うるう年」でズレる分を表しています(基本的に4年に1回うるう年が来て曜日がズレるので)

2ステップ目は「年間で何曜日分ズレるか」を表しています。うるう年を除くと1年は365日あって365を7で割った余りが1なので、西暦の分だけ曜日がズレるわけです(上2桁については5ステップ目で考慮)

3ステップ目は「1か月で何日ズレるか」を表しています

例えば1月は31日あるので、1月と2月の同じ日(1/25と2/25など)は31を7で割った余り3だけ曜日がズレることになります

よって、2月に対応する数字は、1月に対応する「1」と31日経ってズレる分「3」を足して4になるわけです

同様に、うるう年以外の2月は28日あって28は7で割り切れるので、2月に対応する数と3月に対応する数は同じ4となります

※「なんで1月に対応する数を1にしてるのか」疑問に持つ方もいるかもしれませんが、単に1900年代を計算するときに5ステップ目を省略できるようにしたものと思われます

4ステップ目は日付を足すだけなので省略

5ステップ目は1900年代の場合0、2000年代の場合6を足すわけですが、なぜ2000年代になると6足す必要が出てくるのでしょうか?

理由は簡単で100年で6日分ズレるからです。

うるう年がなかった場合、100÷7=14あまり2で2ズレることになります

しかし実際には100年に25回うるう年が来ることから「(100+25)÷7=17あまり6」となるため6を足してるわけです

以上の説明を聞くと下記のように100年ごとに6後ろにズレる(1前にズレる)ように思えます

  • 1900年代:0
  • 2000年代:6
  • 2100年代:5
  • 2200年代:4
  • 2300年代:3
  • 2400年代:2

しかし実際は下のようになります

  • 1900年代:0
  • 2000年代:6
  • 2100年代:4
  • 2200年代:2
  • 2300年代:0
  • 2400年代:6

これにはちゃんと理由があって「100の倍数になる年の中で400で割り切れない年はうるう年にならない」というルールがあるためです

これにより2100年や2200年、2300年は(4の倍数にもかかわらず)うるう年にならないので、さっき示した数を5ステップ目で足すことになります

1~5ステップを求めたら、あとは足して7で割った余りを計算するだけです

ツェラーの公式を使う

曜日はツェラーの公式を使ってもを求めることが可能です

【ツェラーの公式】

\(y\)年\(m\)月\(d\)日の曜日を求める場合は以下の式を使います(スマホでお読みの方は数式をスクロールしてください)

$$h=\left\{d+\left\lfloor\frac{26(m+1)}{10}\right\rfloor+Y+\left\lfloor\frac{Y}{4}\right\rfloor-2C+\left\lfloor\frac{C}{4}\right\rfloor\right\}$$

ただし\(Y\)と\(C\)の定義は以下の通りです

$$C= \left\lfloor\frac{y}{100}\right\rfloor$$

\(Y\)は\(y\)を100で割った余り

\(\lfloor \rfloor\) という記号は見慣れないかもしれませんが、\(\lfloor x \rfloor\) で\(x\)を超えない最大の整数を表します

例えば\(\lfloor4.5\rfloor=4\)、\(\lfloor6\rfloor=6\) という感じです

以上の式で求めた\(h\)を7で割った余りから曜日を求められます

\(h\)を7で割った余り曜日
0
1
2
3
4
5
6

モジュロ演算について

映画を見ただけだと「曜日を当てる計算=モジュロ演算」だと思ってしまうかもしれませんが、モジュロ演算は「余りを計算する演算」であって誕生日とは関係ありません

数学を勉強したことのある人なら「mod」の記号でお馴染みかと思います

たとえば「5 mod 3」の結果は2(=5を3で割った時の余り)になります

誕生日の曜日とモジュロ演算は直接的には無関係ですが、「曜日を求める」ということは「7で割った余りを求めること」に他ならないため映画中ではモジュロ演算という単語を出したのだと思います

余談

本記事とはあまり関係はありませんが、「Cluster」というVRゲームがサマーウォーズに出てくる仮想空間「OZ」の世界に似てます

cluster(クラスター)

cluster(クラスター)

Cluster, Inc.無料posted withアプリーチ

PCやスマホさえあれば遊べるので興味のある方は調べてみてください

以上、東大生ブロガーの西片(@nskt_yagokoro)でした!

学生
西片(にしかた)
ヤゴコロ研究所に訪問いただきありがとうございます。本ブログの管理人&理系東大生の西片です。受験やガジェットを中心に興味のあることを書いてきます。
【略歴】田舎の公立中高→塾に行かずに東大理系に現役合格→学費、家賃、生活費を稼ぐためブログ開始→目標達成(詳細)
\ Follow me /