曜日の計算

同義語:Zellerの公式万年暦day-of-the-week calculationZeller's congruence

概要

曜日の計算(day-of-the-week calculation)とは、日付から曜日を求める計算である。グレゴリオ暦(4 で割り切れる年は閏年、ただし 100 で割り切れて 400 で割り切れない年は平年)の日付で、1 月・2 月を前年の 13 月・14 月とみなし、年を $Y=100J+K$($0\le K\le99$)、月を $m$、日を $d$ とすると、$d+\lfloor\frac{13(m+1)}5\rfloor+K+\lfloor\frac K4\rfloor+\lfloor\frac J4\rfloor+5J$ を 7 で割った余り $0,\dots,6$ が土・日・月・火・水・木・金を表す(Zeller の公式)。閏年の個数をガウス記号で数えて導ける。400 年は $146097$ 日でちょうど $20871$ 週なので、暦は 400 年ごとに曜日まで同じにもどる。

$$\newcommand{C}[0]{\mathbb{C}} \newcommand{div}[0]{\mathbin{÷}} \newcommand{N}[0]{\mathbb{N}} \newcommand{Q}[0]{\mathbb{Q}} \newcommand{R}[0]{\mathbb{R}} \newcommand{Z}[0]{\mathbb{Z}} $$

前提知識: 合同式の計算規則, ガウス記号と整数の個数

高校での出発点:日付から曜日を求める

「今日が月曜日なら 100 日後は何曜日か」は、100 を 7 で割った余りだけで答えが出る(合同式の計算規則 の最初の例)。曜日は 7 日ごとにくり返すので、日数を 7 で割った余りだけを見ればよいからである。この記事では、その先の問い「西暦の日付が与えられたら、それが何曜日かを式で求められるか」を考える。まず、知っている日付から日数を数えて曜日を求めてみる。

同じ年の中で日数を数える

2026 年 1 月 1 日は木曜日である。2026 年 10 月 4 日は何曜日か。
1 月 1 日から 10 月 4 日までの日数を数える。1 月から 9 月までの日数は
$$ 31+28+31+30+31+30+31+31+30=273 $$
で(2026 年は 4 で割り切れないので 2 月は 28 日)、10 月 1 日は 1 月 1 日の 273 日後である。10 月 4 日はさらに 3 日後なので、1 月 1 日の $276$ 日後である。
$$ 276=7\cdot39+3 $$
なので、10 月 4 日は木曜日の 3 日後で、日曜日である。

年が変わると曜日はいくつ進むか

2026 年 1 月 1 日が木曜日であることから、2027 年・2028 年・2029 年の 1 月 1 日の曜日を求める。
(1) 2026 年は 365 日で、$365=7\cdot52+1$ なので、1 年後の同じ日付は曜日が 1 つ進む。2027 年 1 月 1 日は金曜日である。
(2) 2027 年も 365 日なので、2028 年 1 月 1 日は土曜日である。
(3) 2028 年は 4 で割り切れるので閏年で、2 月 29 日がある。366 日で、$366=7\cdot52+2$ なので曜日が 2 つ進む。2029 年 1 月 1 日は月曜日である。

1 年たつと曜日は 1 つ進み、閏年をまたぐときだけ 2 つ進む。したがって、何年も先の曜日を求めるには「その間に閏年が何回あるか」を数えればよい。閏年の回数は、ガウス記号と整数の個数 で学んだ倍数の個数の数え方で求まる。この記事では次の問いに答える。

  1. 1 年 1 月 1 日から数えて、西暦 $Y$ 年までに閏年は何回あるか。→ prop-dow-leap
  2. 2 つの日付の間の日数を、式で表せるか。→ lem-dow-count
  3. 月ごとの日数のでこぼこ(30 日と 31 日)を、1 つの式で扱えるか。→ lem-dow-month
  4. 日付から曜日を直接求める式はあるか。→ thm-dow-zeller
  5. 暦は何年ごとに曜日まで同じにもどるか。→ cor-dow-400
    高校の計算この記事の言葉大学の言葉
    日数を 7 で割った余り曜日の番号法 $7$ の剰余類
    4 の倍数の年を数える閏年の個数 $\lfloor Y/4\rfloor-\lfloor Y/100\rfloor+\lfloor Y/400\rfloor$包除原理と床関数
    月の日数を足していく月の補正 $\left\lfloor\frac{13(m+1)}5\right\rfloor$直線を整数に丸める
    400 年で同じ暦にもどる曜日の周期周期関数・剰余の周期

言葉の準備:暦の規則と年の数え直し

グレゴリオ暦と曜日の番号

この記事では、次の規則の暦(グレゴリオ暦)で書いた日付を考える。
(R1) 1 月から 12 月までの日数は、順に $31,\ 28,\ 31,\ 30,\ 31,\ 30,\ 31,\ 31,\ 30,\ 31,\ 30,\ 31$ 日である。ただし閏年の 2 月は 29 日である。
(R2) 西暦 $t$ 年が 閏年 であるのは、$t$ が 4 で割り切れて 100 で割り切れないとき、または $t$ が 400 で割り切れるときである。それ以外の年は 平年 である。
曜日には、土曜日から順に番号 $0,1,2,3,4,5,6$ をつける。

曜日土日月火水木金
番号$0$$1$$2$$3$$4$$5$$6$

翌日の曜日の番号は、今日の番号に $1$ を足して $7$ で割った余りである(金曜日の番号 $6$ の翌日は $0$、土曜日)。

条件 (ii) により、2024 年・2028 年は閏年、2100 年・2200 年・2300 年は平年(100 で割り切れて 400 で割り切れない)、2000 年・2400 年は閏年である。この暦では、平年は $365$ 日、閏年は $366$ 日である。
曜日の番号を土曜日から始めるのは、あとで出てくる式が土曜日に $0$ を返す形になるからである。番号のつけ方を変えても、曜日を求める考え方は同じである。
閏日の 2 月 29 日は年の途中にあるので、1 月・2 月の日付と 3 月以降の日付とで、その年の閏日を数えるかどうかが変わってしまう。そこで、年の区切りを 3 月 1 日にずらす。

1 月・2 月を前の年に回す

西暦 $y$ 年 $m_0$ 月 $d$ 日の日付に対して、数 $Y$ と $m$ を次で決める。

  • $m_0=3,4,\dots,12$ なら $Y=y$、$m=m_0$。
  • $m_0=1,2$ なら $Y=y-1$、$m=m_0+12$(1 月を前の年の 13 月、2 月を前の年の 14 月とみなす)。
    さらに $Y$ を $100$ で割った商を $J$、余りを $K$ とする。つまり $Y=100J+K$、$0\le K\le 99$ である。

この数え直しでは、1 つの「年」が 3 月 1 日に始まり、翌年の 2 月の終わり(2 月 28 日か 29 日)で終わる。閏日はいつも「年」の最後の日になるので、3 月から翌年 1 月までの日付は閏年かどうかに影響されない。$m$ は $3$ から $14$ までの値をとる。

数え直しの例
  1. 2026 年 10 月 4 日:$m_0=10$ なので $Y=2026$、$m=10$、$J=20$、$K=26$。
  2. 2000 年 1 月 1 日:$m_0=1$ なので $Y=1999$、$m=13$、$J=19$、$K=99$。
  3. 2024 年 2 月 29 日:$m_0=2$ なので $Y=2023$、$m=14$、$J=20$、$K=23$。閏日は、数え直した 2023 年の最後の日である。

閏年の個数と日数の式

閏年を数える

閏年の規則は「4 の倍数、ただし 100 の倍数は除き、400 の倍数は戻す」である。ガウス記号と整数の個数 の定理「倍数の個数」は、正の実数 $x$ と正の整数 $k$ について、$1$ 以上 $x$ 以下の整数のうち $k$ の倍数は $\lfloor x/k\rfloor$ 個ある、と述べている($\lfloor x\rfloor$ は $x$ 以下の最大の整数で、同記事の $[x]$ と同じもの)。これを 3 回使う。

閏年の個数

正の整数 $Y$ について、西暦 1 年から西暦 $Y$ 年までの閏年の個数を $L(Y)$ とすると
$$ L(Y)=\left\lfloor\frac Y4\right\rfloor-\left\lfloor\frac Y{100}\right\rfloor+\left\lfloor\frac Y{400}\right\rfloor $$
である。

方針:閏年の集まりを、4 の倍数・100 の倍数・400 の倍数の集まりで表し、個数を引き算と足し算で求める。
段 1(3 つの集まり)。$1$ 以上 $Y$ 以下の整数のうち、4 の倍数の集まりを $A$、100 の倍数の集まりを $B$、400 の倍数の集まりを $C$ とする。ガウス記号と整数の個数 の定理「倍数の個数」により、$A,B,C$ の個数はそれぞれ $\lfloor Y/4\rfloor$、$\lfloor Y/100\rfloor$、$\lfloor Y/400\rfloor$ である。400 の倍数は 100 の倍数であり、100 の倍数は 4 の倍数なので、$C$ は $B$ に含まれ、$B$ は $A$ に含まれる。
段 2(閏年の集まり)。def-dow-calendar の条件 (ii) により、閏年は「$A$ に入り $B$ に入らない年」と「$C$ に入る年」である。前者の集まりを $A\setminus B$ と書く。$C$ は $B$ に含まれるので、$C$ の年は $A\setminus B$ に入らない。したがって 2 つの集まりは重ならず、閏年の個数は「$A\setminus B$ の個数」と「$C$ の個数」の和である。
段 3(個数)。$B$ は $A$ に含まれるので、$A\setminus B$ の個数は $A$ の個数から $B$ の個数を引いたものである。よって
$$ L(Y)=\left(\left\lfloor\frac Y4\right\rfloor-\left\lfloor\frac Y{100}\right\rfloor\right)+\left\lfloor\frac Y{400}\right\rfloor $$
である。$\square$

閏年の個数を求める
  1. $Y=100$:$\lfloor100/4\rfloor-\lfloor100/100\rfloor+\lfloor100/400\rfloor=25-1+0=24$。4 の倍数の年は 25 回あるが、100 年は平年なので 24 回である。
  2. $Y=400$:$100-4+1=97$。400 年の間に閏年は 97 回ある。
  3. $Y=2026$:$\lfloor2026/4\rfloor=506$、$\lfloor2026/100\rfloor=20$、$\lfloor2026/400\rfloor=5$ なので $506-20+5=491$ である。

2 つの日付の間の日数

次に、def-dow-shift で数え直した年の中で、3 月 1 日から各月の 1 日までの日数を表にしておく。3 月 1 日から $m$ 月 1 日までの日数を $c(m)$ とする。$c(3)=0$ で、$c(m+1)$ は $c(m)$ に $m$ 月の日数を足したものである。

$m$(月)$3$(3 月)$4$$5$$6$$7$$8$$9$$10$$11$$12$$13$(1 月)$14$(2 月)
その月の日数$31$$30$$31$$30$$31$$31$$30$$31$$30$$31$$31$$28$ か $29$
$c(m)$$0$$31$$61$$92$$122$$153$$184$$214$$245$$275$$306$$337$

$c(m)$ を作るのに使うのは 3 月から翌年 1 月までの日数だけで、2 月の日数は使わない。だから $c(m)$ は閏年かどうかによらない。これが 1 月・2 月を前の年に回した理由である。

日数を表す式

def-dow-shift の $Y,m$ と日 $d$ に対して
$$ G=365Y+L(Y)+c(m)+d $$
とおく($Y\ge1$ とする)。日付 $Q$ が日付 $P$ の $n$ 日後なら、$Q$ の $G$ の値から $P$ の $G$ の値を引いたものは $n$ に等しい。

方針:$P$ から $Q$ までを「$P$ からその年の 3 月 1 日へもどる」「3 月 1 日から 3 月 1 日へ年ごとに進む」「3 月 1 日から $Q$ へ進む」の 3 つに分けて数える。$P$ の値を $Y_1,m_1,d_1$、$Q$ の値を $Y_2,m_2,d_2$ とする。
段 1(年の中の日数)。数え直した $Y$ 年の 3 月 1 日から $m$ 月 $d$ 日までの日数は、$m$ 月 1 日までの $c(m)$ 日と、$m$ 月 1 日から $d$ 日までの $d-1$ 日の和で、$c(m)+d-1$ 日である。
段 2(1 年分の日数)。数え直した $t$ 年の 3 月 1 日から $t+1$ 年の 3 月 1 日までには、3 月から 12 月までと、西暦 $t+1$ 年の 1 月・2 月が入る。2 月が 29 日になるのは西暦 $t+1$ 年が閏年のときだけなので、日数は $t+1$ 年が閏年なら $366$、平年なら $365$ である。一方、$L(t+1)-L(t)$ は「西暦 $t+1$ 年が閏年なら $1$、平年なら $0$」である($L$ は 1 年から数えた閏年の個数だから)。よって、この 1 年分の日数は
$$ 365+L(t+1)-L(t) $$
である。
段 3(何年分かの日数)。$Y_1\le Y_2$ とする($Q$ は $P$ より後なので、数え直した年も $Y_1\le Y_2$ である)。$Y_1$ 年の 3 月 1 日から $Y_2$ 年の 3 月 1 日までの日数は、段 2 の日数を $t=Y_1,Y_1+1,\dots,Y_2-1$ について足したもので
$$ \sum_{t=Y_1}^{Y_2-1}\bigl(365+L(t+1)-L(t)\bigr)=365(Y_2-Y_1)+L(Y_2)-L(Y_1) $$
である($L(t+1)-L(t)$ の和は、隣どうしが打ち消し合って $L(Y_2)-L(Y_1)$ だけが残る)。$Y_1=Y_2$ のときは両辺とも $0$ である。
段 4(合わせる)。$P$ から $Q$ までの日数 $n$ は、「$Y_1$ 年の 3 月 1 日から $Q$ までの日数」から「$Y_1$ 年の 3 月 1 日から $P$ までの日数」を引いたものである。前者は段 3 と段 1 から $365(Y_2-Y_1)+L(Y_2)-L(Y_1)+c(m_2)+d_2-1$、後者は段 1 から $c(m_1)+d_1-1$ である。引き算すると
$$ n=\bigl(365Y_2+L(Y_2)+c(m_2)+d_2\bigr)-\bigl(365Y_1+L(Y_1)+c(m_1)+d_1\bigr) $$
となり、右辺は $Q$ の $G$ から $P$ の $G$ を引いたものである。$\square$

2000 年 1 月 1 日から 2026 年 10 月 4 日まで

2000 年 1 月 1 日は土曜日である。lem-dow-count で 2026 年 10 月 4 日の曜日を求める。
(1) 2000 年 1 月 1 日:$Y=1999$、$m=13$、$d=1$。$L(1999)=499-19+4=484$ なので
$$ G=365\cdot1999+484+306+1=729635+484+306+1=730426 $$
(2) 2026 年 10 月 4 日:$Y=2026$、$m=10$、$d=4$。ex-dow-leap より $L(2026)=491$ なので
$$ G=365\cdot2026+491+214+4=739490+491+214+4=740199 $$
(3) 差は $740199-730426=9773$ 日で、$9773=7\cdot1396+1$ である。2026 年 10 月 4 日は土曜日の 1 日後で、日曜日である。ex-dow-start-days の答えと一致する。

lem-dow-count から、曜日の番号は $G$ を 7 で割った余りで決まる。実際、$Q$ が $P$ の $n$ 日後なら曜日の番号は $n$ を 7 で割った余りだけ進み、$G$ の値もちょうど $n$ だけ増えるからである。残る仕事は、$G$ を 7 で割った余りを計算しやすい形にすることである。

月の補正:でこぼこを 1 つの式に

$c(m)$ は表を引けば分かるが、式で書けると便利である。月の日数は 31 と 30 が不規則に並ぶので、$c(m)$ を直接きれいな式にするのは難しそうに見える。しかし、ほしいのは $c(m)$ そのものではなく、$c(m)$ を 7 で割った余りだけである。

月の補正の式

$m=3,4,\dots,14$ について
$$ c(m)\equiv\left\lfloor\frac{13(m+1)}5\right\rfloor-3\pmod7 $$
である。

$m$ は 12 個の値しかとらないので、12 個すべてを調べれば証明になる。ただ、表を眺める前に、なぜ $\frac{13}5$ という数が出てくるのかを見ておく。$m$ が 1 増えると $\frac{13(m+1)}5$ は $\frac{13}5=2.6$ 増え、そのガウス記号は $2$ か $3$ 増える。一方、月の日数 $30,31$ を 7 で割った余りは $2,3$ である。この増え方がそろっていることが、証明の中心である。

方針:$f(m)=\left\lfloor\dfrac{13(m+1)}5\right\rfloor$ とおき、$m$ が 1 増えるときの $c(m)$ と $f(m)$ の増え方を比べる。
段 1($f$ の値)。$m=3,4,\dots,14$ について $\dfrac{13(m+1)}5$ とそのガウス記号 $f(m)$ を計算すると、次の表になる。

$m$$3$$4$$5$$6$$7$$8$$9$$10$$11$$12$$13$$14$
$\frac{13(m+1)}5$$10.4$$13$$15.6$$18.2$$20.8$$23.4$$26$$28.6$$31.2$$33.8$$36.4$$39$
$f(m)$$10$$13$$15$$18$$20$$23$$26$$28$$31$$33$$36$$39$
$f(m+1)-f(m)$$3$$2$$3$$2$$3$$3$$2$$3$$2$$3$$3$
$m$ 月の日数$31$$30$$31$$30$$31$$31$$30$$31$$30$$31$$31$

段 2(増え方の比較)。表の最後の 2 行を比べると、$m=3,4,\dots,13$ のどの $m$ でも
$$ (m\text{ 月の日数})-\bigl(f(m+1)-f(m)\bigr)=28 $$
である($31-3=28$、$30-2=28$)。$c(m+1)-c(m)$ は $m$ 月の日数なので、
$$ \bigl(c(m+1)-f(m+1)\bigr)-\bigl(c(m)-f(m)\bigr)=28 $$
となる。つまり $c(m)-f(m)$ は、$m$ が 1 増えるごとにちょうど $28$ ずつ増える。
段 3(7 で割った余り)。$m=3$ では $c(3)-f(3)=0-10=-10$ なので、段 2 から
$$ c(m)-f(m)=-10+28(m-3) $$
である($m=3,4,\dots,14$)。$28$ は $7$ の倍数なので $c(m)-f(m)\equiv-10\equiv-3\pmod7$ であり、$c(m)\equiv f(m)-3\pmod7$ が成り立つ。$\square$

段 3 の等式 $c(m)=f(m)-10+28(m-3)$ は、合同式ではなく本当の等式である。たとえば $m=10$ では $28-10+28\cdot7=214$ で、$c(m)$ の表の $c(10)=214$ と一致する。

月の補正を余りで並べる

$c(m)$ と $f(m)$ を 7 で割った余りを並べると、次のようになる(図 1)。

月345678910111212
$c(m)$ を 7 で割った余り$0$$3$$5$$1$$3$$6$$2$$4$$0$$2$$5$$1$
$f(m)$ を 7 で割った余り$3$$6$$1$$4$$6$$2$$5$$0$$3$$5$$1$$4$

どの列でも、下の段は上の段に $3$ を足して 7 で割った余りになっている(たとえば 5 月は $5+3=8\equiv1$)。

3 月から翌年 2 月までの各月について、3 月 1 日からその月の 1 日までの日数を 7 で割った余り(青)と、13(m+1)/5 のガウス記号を 7 で割った余り(赤)を並べた棒グラフ。どの月でも赤は青に 3 を足して 7 で割った余りになっている 3 月から翌年 2 月までの各月について、3 月 1 日からその月の 1 日までの日数を 7 で割った余り(青)と、13(m+1)/5 のガウス記号を 7 で割った余り(赤)を並べた棒グラフ。どの月でも赤は青に 3 を足して 7 で割った余りになっている

主定理:日付から曜日を求める式

Zeller の公式

グレゴリオ暦の日付 $y$ 年 $m_0$ 月 $d$ 日に対して、def-dow-shift のとおり $Y=100J+K$ と $m$ を決める($Y\ge1$ とする)。
$$ h=d+\left\lfloor\frac{13(m+1)}5\right\rfloor+K+\left\lfloor\frac K4\right\rfloor+\left\lfloor\frac J4\right\rfloor+5J $$
とおくと、$h$ を 7 で割った余りが、その日の曜日の番号である($0$ が土曜日、$1$ が日曜日、…、$6$ が金曜日。def-dow-calendar)。

方針:lem-dow-count の $G$ を 7 で割った余りを、$J,K$ と lem-dow-month で書き直し、$h\equiv G+3\pmod7$ を示す。最後に、ある 1 日で曜日の番号と $h$ の余りが一致することを確かめる。
段 1($365Y$ の余り)。$365=7\cdot52+1$ なので $365\equiv1\pmod7$、$100=7\cdot14+2$ なので $100\equiv2\pmod7$ である。合同式の計算規則 の定理「和・差・積の合同」により
$$ 365Y\equiv Y=100J+K\equiv2J+K\pmod7 $$
である。
段 2($L(Y)$ を $J,K$ で書く)。prop-dow-leap の 3 つのガウス記号を順に計算する。

  • $\dfrac Y4=25J+\dfrac K4$ で、$25J$ は整数なので、$\left\lfloor\dfrac Y4\right\rfloor=25J+\left\lfloor\dfrac K4\right\rfloor$ である(整数 $n$ について $\lfloor x+n\rfloor=\lfloor x\rfloor+n$。ガウス記号と整数の個数 の命題「ガウス記号の基本性質」)。
  • $\dfrac Y{100}=J+\dfrac K{100}$ で、$0\le\dfrac K{100}\le\dfrac{99}{100}<1$ なので、$\left\lfloor\dfrac Y{100}\right\rfloor=J$ である。
  • $J$ を 4 で割った商を $q$、余りを $s$ とする($J=4q+s$、$0\le s\le3$)。$\dfrac Y{400}=\dfrac J4+\dfrac K{400}=q+\dfrac s4+\dfrac K{400}$ で、$0\le\dfrac s4+\dfrac K{400}\le\dfrac34+\dfrac{99}{400}<1$ なので、$\left\lfloor\dfrac Y{400}\right\rfloor=q=\left\lfloor\dfrac J4\right\rfloor$ である。
    よって
    $$ L(Y)=25J+\left\lfloor\frac K4\right\rfloor-J+\left\lfloor\frac J4\right\rfloor=24J+\left\lfloor\frac K4\right\rfloor+\left\lfloor\frac J4\right\rfloor $$
    である。
    段 3($G$ の余り)。段 1・段 2 と lem-dow-month を $G=365Y+L(Y)+c(m)+d$ に代入すると
    $$ G\equiv(2J+K)+\left(24J+\left\lfloor\frac K4\right\rfloor+\left\lfloor\frac J4\right\rfloor\right)+\left(\left\lfloor\frac{13(m+1)}5\right\rfloor-3\right)+d\pmod7 $$
    である。$J$ の係数は $2+24=26$ で、$26=7\cdot3+5$ なので $26J\equiv5J$ である。並べ替えると
    $$ G\equiv d+\left\lfloor\frac{13(m+1)}5\right\rfloor+K+\left\lfloor\frac K4\right\rfloor+\left\lfloor\frac J4\right\rfloor+5J-3=h-3\pmod7 $$
    となり、$h\equiv G+3\pmod7$ が分かった。
    段 4(曜日と一致すること)。lem-dow-count より、日付が 1 日進むと $G$ はちょうど 1 増えるので、段 3 から $h$ を 7 で割った余りも 1 つ進む($6$ の次は $0$)。曜日の番号も 1 日ごとに 1 つ進む(def-dow-calendar)。したがって、ある 1 日で「$h$ を 7 で割った余り」と「曜日の番号」が一致すれば、その日から前後に何日ずれても一致し続ける。2000 年 1 月 1 日(土曜日、番号 $0$)では、ex-dow-shift の (2) の $Y=1999$、$m=13$、$J=19$、$K=99$ を使って
    $$ h=1+\left\lfloor\frac{13\cdot14}5\right\rfloor+99+\left\lfloor\frac{99}4\right\rfloor+\left\lfloor\frac{19}4\right\rfloor+5\cdot19=1+36+99+24+4+95=259=7\cdot37 $$
    で、余りは $0$ である。よって、すべての日付で $h$ を 7 で割った余りが曜日の番号に等しい。$\square$

段 4 で使った「2000 年 1 月 1 日が土曜日」は暦から読み取る事実で、式だけからは出てこない。式が教えるのは日付どうしの曜日の差であり、曜日の名前は 1 日の曜日で合わせる。

2026 年 9 月 27 日

$Y=2026$、$m=9$、$d=27$、$J=20$、$K=26$ である。
$$ \left\lfloor\frac{13\cdot10}5\right\rfloor=26,\quad\left\lfloor\frac{26}4\right\rfloor=6,\quad\left\lfloor\frac{20}4\right\rfloor=5,\quad5J=100 $$
なので
$$ h=27+26+26+6+5+100=190=7\cdot27+1 $$
で、余りは $1$、日曜日である。ex-dow-start-days の 10 月 4 日(日曜日)の 1 週間前なので、確かに日曜日である。

閏日と 1 月の日付
  1. 2024 年 2 月 29 日:$Y=2023$、$m=14$、$J=20$、$K=23$。
    $$ h=29+\left\lfloor\frac{13\cdot15}5\right\rfloor+23+\left\lfloor\frac{23}4\right\rfloor+\left\lfloor\frac{20}4\right\rfloor+100=29+39+23+5+5+100=201=7\cdot28+5 $$
    で、余りは $5$、木曜日である。
  2. 翌日の 2024 年 3 月 1 日:$Y=2024$、$m=3$、$K=24$。
    $$ h=1+10+24+6+5+100=146=7\cdot20+6 $$
    で、余りは $6$、金曜日である。(1) の翌日なので番号が 1 つ進んでいる。$Y$ が 2023 から 2024 に変わり、$m$ が 14 から 3 にもどっても、式は 1 日の進みを正しく表している。
ほかの日付の例を開く

2100 年 3 月 1 日:$Y=2100$、$m=3$、$J=21$、$K=0$。$h=1+10+0+0+5+105=121=7\cdot17+2$ で月曜日。2400 年 1 月 1 日:$Y=2399$、$m=13$、$J=23$、$K=99$。$h=1+36+99+24+5+115=280=7\cdot40$ で土曜日。1999 年 12 月 31 日:$Y=1999$、$m=12$、$J=19$、$K=99$。$h=31+33+99+24+4+95=286=7\cdot40+6$ で金曜日(2000 年 1 月 1 日の前日)。

暦の周期と 13 日の曜日

thm-dow-zeller の式を見ると、$Y$ を変えたときに $h$ がどう変わるかが分かる。$Y$ に $400$ を足すと $J$ が $4$ 増え、$K$ は変わらない。

400 年で曜日まで同じにもどる

グレゴリオ暦では、400 年は $146097$ 日で、これはちょうど $20871$ 週である。したがって、どの日付についても、その 400 年後の同じ月・同じ日は同じ曜日である。

段 1(日付があること)。400 は 4 でも 100 でも 400 でも割り切れるので、def-dow-calendar の条件 (ii) により、西暦 $t$ 年と $t+400$ 年は、両方とも閏年か両方とも平年である。だから、ある日付の 400 年後の同じ月・同じ日も存在する(2 月 29 日についても)。
段 2(日数)。数え直した $Y$ 年の 3 月 1 日から $Y+400$ 年の 3 月 1 日までの日数は、lem-dow-count の証明の段 3 から $365\cdot400+L(Y+400)-L(Y)$ である。prop-dow-leap の式で、$\left\lfloor\dfrac{Y+400}4\right\rfloor=\left\lfloor\dfrac Y4\right\rfloor+100$、$\left\lfloor\dfrac{Y+400}{100}\right\rfloor=\left\lfloor\dfrac Y{100}\right\rfloor+4$、$\left\lfloor\dfrac{Y+400}{400}\right\rfloor=\left\lfloor\dfrac Y{400}\right\rfloor+1$ なので(整数を足してもガウス記号の外に出せる)、$L(Y+400)-L(Y)=100-4+1=97$ である。よって日数は
$$ 365\cdot400+97=146000+97=146097=7\cdot20871 $$
である。
段 3(曜日)。ある日付と、その 400 年後の同じ月・同じ日とは、$m$ と $d$ が同じで $Y$ が 400 違う。lem-dow-count より、その間の日数は 2 つの $G$ の差 $365\cdot400+L(Y+400)-L(Y)=146097$ で、7 の倍数である。よって曜日は同じである。$\square$

段 3 は thm-dow-zeller の式からも確かめられる。$J$ を $J+4$ にすると $\left\lfloor\frac J4\right\rfloor$ は $1$、$5J$ は $20$ 増えるので、$h$ は $21$ 増え、7 で割った余りは変わらない。
400 年ごとに同じ暦がくり返すので、「13 日が何曜日になりやすいか」は 400 年分を数えれば決まる。その前に、どの年にも必ずあることを 1 つ示しておく。

どの年にも 13 日の金曜日がある

グレゴリオ暦のどの年にも、13 日が金曜日である月がある。もっと強く、その年の 3 月から 12 月までの 10 回の 13 日には、7 つの曜日がすべて現れる。

方針:同じ年の 3 月から 12 月までは $Y,J,K$ が共通なので、13 日の $h$ の違いは $\left\lfloor\frac{13(m+1)}5\right\rfloor$ の違いだけである。
西暦 $y$ 年の $m=3,4,\dots,12$ 月の 13 日では、def-dow-shift により $Y=y$ で、$J,K$ は月によらない。thm-dow-zeller の式は
$$ h=\left\lfloor\frac{13(m+1)}5\right\rfloor+\underbrace{13+K+\left\lfloor\frac K4\right\rfloor+\left\lfloor\frac J4\right\rfloor+5J}_{\text{月によらない数 }s} $$
となる。ex-dow-month の表から、$m=3,\dots,12$ の $\left\lfloor\frac{13(m+1)}5\right\rfloor$ を 7 で割った余りは $3,6,1,4,6,2,5,0,3,5$ で、$0$ から $6$ までのすべてが現れる。これらに同じ数 $s$ を足して 7 で割った余りをとると、異なる余りは異なる余りに移る($a+s\equiv b+s$ なら $a\equiv b$)ので、やはり $0$ から $6$ までのすべてが現れる。したがって 13 日の曜日として 7 つの曜日がすべて現れ、特に金曜日(番号 $6$)も現れる。$\square$

2026 年の 13 日の金曜日

2026 年の 3 月から 12 月では $J=20$、$K=26$ なので、$s=13+26+6+5+100=150=7\cdot21+3$、つまり $s\equiv3$ である。13 日が金曜日(番号 $6$)になるのは、$\left\lfloor\frac{13(m+1)}5\right\rfloor\equiv6-3=3\pmod7$ となる月で、ex-dow-month の表から $m=3$ と $m=11$、つまり 3 月と 11 月である。
2 月 13 日は数え直すと 2025 年の 14 月で、$J=20$、$K=25$ から $h=13+39+25+6+5+100=188=7\cdot26+6$ となり、これも金曜日である。2026 年には 13 日の金曜日が 2 月・3 月・11 月の 3 回ある。

最後に、400 年分の 4800 個の 13 日の曜日を数えた結果を表にしておく。これは thm-dow-zeller の式で 4800 個の日付を計算して数えた結果であり、手で証明したものではない(計算で確かめた)。cor-dow-400 により、どの年から数え始めても連続する 400 年なら同じ結果になる。

曜日日月火水木金土計
13 日がその曜日になる回数$687$$685$$685$$687$$684$$688$$684$$4800$

13 日が最も多くなる曜日は金曜日で、688 回である。$4800\mathbin{÷}7\approx685.7$ なので、7 つの曜日はほぼ同じ回数だが、ちょうど同じではない。$4800$ が $7$ で割り切れない以上、すべての曜日が同じ回数になることはありえない。
400 年間の 4800 個の 13 日について、曜日ごとの回数を表した棒グラフ。金曜日が 688 回で最も多い。縦軸は 680 から始まっている 400 年間の 4800 個の 13 日について、曜日ごとの回数を表した棒グラフ。金曜日が 688 回で最も多い。縦軸は 680 から始まっている

例と反例:式のどこが効いているか

thm-dow-zeller の式は、閏年の規則・1 月と 2 月の数え直し・ガウス記号の 3 つに合わせて作られている。どれかを変えると、式は正しい曜日を返さなくなる。

外す条件反例成り立たなくなること
閏年の規則の「100 で割り切れて 400 で割り切れない年は平年」を外し、4 の倍数の年をすべて閏年として数える2100 年 3 月 1 日(ex-dow-cx-leap)2000 年 1 月 1 日で合わせても、2100 年 3 月 1 日以降で 1 日ずれる。1900 年 2 月 28 日以前でも逆向きに 1 日ずれる
1 月・2 月を前の年に回さない(def-dow-shift を使わず $Y=y$、$m=m_0$ とする)2024 年 1 月 1 日(ex-dow-cx-shift)1 月・2 月の日付で曜日がずれる。月の補正と閏年の数え方の両方が狂う
$\left\lfloor\frac{13(m+1)}5\right\rfloor$ のガウス記号を四捨五入に替える2026 年 5 月 1 日(ex-dow-cx-round)5 月・7 月・10 月・12 月で 1 日ずれる
反例:100 年ごとの例外を外す

4 の倍数の年をすべて閏年とする規則では、1 年から $Y$ 年までの閏年の個数は $\lfloor Y/4\rfloor$ になる。lem-dow-count の $L(Y)$ をこれに替えた $G'=365Y+\lfloor Y/4\rfloor+c(m)+d$ を考え、2000 年 1 月 1 日(土曜日)で曜日を合わせる。
(1) 2000 年 1 月 1 日から 2100 年 2 月 28 日までは、その間の閏日(2004 年、…、2096 年の 2 月 29 日)がどちらの規則でも同じなので、$G'$ の差は本当の日数と一致し、曜日も正しい。
(2) 2100 年 3 月 1 日は本当は月曜日である(thm-dow-zeller の後の「ほかの日付の例」)。しかし $G'$ は、存在しない 2100 年 2 月 29 日を 1 日として数えてしまうので、差が本当の日数より 1 大きくなり、火曜日を返す。
(3) 逆向きでは、1900 年 2 月 28 日は本当は水曜日だが、$G'$ は存在しない 1900 年 2 月 29 日を数えるので、2000 年 1 月 1 日までの日数を 1 多く見積もり、火曜日を返す。
400 年に 3 回の例外を無視すると、100 年に 1 日ほどずつずれていく。

反例:1 月・2 月を前の年に回さない

2024 年 1 月 1 日に、数え直しをせず $Y=2024$、$m=1$、$J=20$、$K=24$ として式に入れると
$$ 1+\left\lfloor\frac{13\cdot2}5\right\rfloor+24+\left\lfloor\frac{24}4\right\rfloor+5+100=1+5+24+6+5+100=141=7\cdot20+1 $$
で、日曜日になる。本当は月曜日である(正しく $Y=2023$、$m=13$ とすると $h=1+36+23+5+5+100=170=7\cdot24+2$)。
ずれの理由は 2 つある。1 つは、$m=1$ の月の補正 $\lfloor26/5\rfloor=5$ が、3 月から数えた日数の表(lem-dow-month)と合っていないことである。もう 1 つは、$Y=2024$ とすると、まだ来ていない 2024 年 2 月 29 日まで閏日として数えてしまうことである。2024 年 3 月 1 日のように 3 月以降の日付では、数え直しをしなくても $Y,m$ は同じなので、正しい曜日(金曜日)が出る。

反例:ガウス記号を四捨五入に替える

$\frac{13(m+1)}5$ を四捨五入すると、小数部分が $0.6$ や $0.8$ の月で $1$ 大きくなる。lem-dow-month の段 1 の表で、$m=5$($15.6$)、$m=7$($20.8$)、$m=10$($28.6$)、$m=12$($33.8$)がそれにあたる。
2026 年 5 月 1 日では、正しくは $h=1+15+26+6+5+100=153=7\cdot21+6$ で金曜日である。四捨五入した $16$ を使うと $154=7\cdot22$ で土曜日になり、1 日ずれる。
また、ガウス記号を外して $\frac{13(m+1)}5$ や $\frac K4$ をそのまま足すと、2026 年 10 月 4 日では $\frac{143}5+\frac{26}4$ のように整数でない数が出て、7 で割った余りが意味をもたない。

大学数学で見る:直線を整数に丸める

lem-dow-month の段 3 の等式 $c(m)=f(m)-10+28(m-3)$ を書き直すと
$$ c(m)=\left\lfloor\frac{153(m-3)+2}5\right\rfloor=\bigl\lfloor30.6(m-3)+0.4\bigr\rfloor\qquad(m=3,4,\dots,14) $$
となる($28(m-3)$ は整数なのでガウス記号の中に入れられ、$\frac{13(m+1)}5-10+28(m-3)=\frac{153(m-3)+2}5$ である)。つまり、3 月 1 日から各月 1 日までの日数は、傾き $30.6$ の直線の値の整数部分になっている(図 3)。3 月から 7 月までの 5 か月は $31+30+31+30+31=153$ 日で、1 か月の平均は $153\mathbin{÷}5=30.6$ 日である。8 月から 12 月の 5 か月も同じ並び(31, 30, 31, 30, 31)で 153 日なので、同じ直線に乗る。
3 月 1 日から各月 1 日までの日数(点)と、直線 y = 30.6(m − 3) + 0.4(破線)。どの月でも点は直線のすぐ下にあり、直線の値の整数部分になっている 3 月 1 日から各月 1 日までの日数(点)と、直線 y = 30.6(m − 3) + 0.4(破線)。どの月でも点は直線のすぐ下にあり、直線の値の整数部分になっている

等差数列をガウス記号で丸めることについて開く

$\lfloor\alpha n+\beta\rfloor$ の形の数列は、傾き $\alpha$ の直線の下にある格子点の高さで、隣どうしの差は $\lfloor\alpha\rfloor$ か $\lfloor\alpha\rfloor+1$ のどちらかになる($\alpha=30.6$ なら 30 か 31)。差が $\lfloor\alpha\rfloor+1$ になる位置は、直線が整数の高さをまたぐ位置である。月の日数の 30 と 31 の並びがちょうどこの形になっていることが、1 つの式で月の補正を書ける理由である。ガウス記号で整数を数える考え方は ガウス記号と整数の個数 で扱う。

曜日を「日付の番号を 7 で割った余り」と見ることは、日付の番号を法 $7$ の剰余類に送る写像を考えることにあたる。cor-dow-400 は、その写像が「年に 400 を足す」操作で変わらないことを述べている。

演習

同じ並びの暦が使える次の年

2026 年のカレンダー(1 月 1 日が木曜日の平年)と、すべての日付の曜日が一致する次の年を求めよ。

解答を開く

すべての日付の曜日が一致するのは、1 月 1 日の曜日が同じで、閏年かどうかも同じ年である。1 月 1 日の曜日は、平年の後で 1 つ、閏年の後で 2 つ進む(ex-dow-start-years)。2027 年 金、2028 年 土(閏年)、2029 年 月、2030 年 火、2031 年 水、2032 年 木(閏年なので不適)、2033 年 土、2034 年 日、2035 年 月、2036 年 火(閏年)、2037 年 木。2037 年は平年で 1 月 1 日が木曜日なので、答えは 2037 年である。thm-dow-zeller で 2037 年 1 月 1 日($Y=2036$、$m=13$、$J=20$、$K=36$)を計算すると $h=1+36+36+9+5+100=187=7\cdot26+5$ で木曜日になり、確かめられる。

3 月 13 日と 11 月 13 日

どの年でも、3 月 13 日と 11 月 13 日は同じ曜日であることを示せ。

解答を開く

同じ年の 3 月 13 日と 11 月 13 日は、def-dow-shift で $Y$ が同じで、$m$ が $3$ と $11$ である。lem-dow-count より、その間の日数は $c(11)-c(3)=245-0=245=7\cdot35$ で、7 の倍数である。よって同じ曜日である。ex-dow-month の表で、3 月と 11 月の $c(m)$ の余りがどちらも $0$ であることからも分かる。

さらに先へ

  • 余りがくり返すことを使って先の値を求める考え方は、累乗の余りの周期を扱う 冪の余りの周期と元の位数 でも使う。
  • 数の各位に重みをつけて足し、ある数で割った余りを見る考え方は、番号の誤りを見つける チェックディジット でも中心になる。
  • 日付の番号を 7 で割った余りで見るのは、整数を余りで分ける 合同式と余りの世界 の典型的な使い方である。

関連項目

Mathpediaは寄付と、参考文献の書籍リンク(Amazonアソシエイト)の紹介料で運営されています。 支援について / 寄付する