ツェラーの公式

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

ツェラーの公式(ツェラーのこうしき、Zeller's congruence)とは西暦グレゴリオ暦またはユリウス暦)のから、その日が何曜日であるかを算出する公式である。クリスティアン・ツェラー (Christian Zeller) が考案した。ユリウス通日を求める計算と本質は同じである。

公式[編集]

ymd 日の曜日を求める。

ただし、1月2月は、前年のそれぞれ13月・14月として扱う。たとえば、2014年1月1日・2月1日は、2013年13月1日・14月1日とする。また、紀元前 \hat y 年は西暦 1 - \hat y 年として扱う。たとえば、紀元前1年・前2年・前3年は、0年・-1年・-2年となる。

曜日を表す h は次の式で求められる:

 h = \left\{ d + \left\lfloor \frac{ 26 (m + 1) }{ 10 } \right\rfloor + Y + \left\lfloor \frac Y 4 \right\rfloor + \mathit \Gamma \right\} \mod 7

\mathit \Gammaグレゴリオ暦 (Gregorian) かユリウス暦 (Julian) かで変わる項で、

 \mathit \Gamma = \begin{cases} 
  - 2 C + \left\lfloor \frac C 4 \right\rfloor & \mbox{: Gregorian } ( 1582 \lessapprox y ) \\
  - C + 5 & \mbox{: Julian } ( 4 \lessapprox y \lessapprox 1582 )
\end{cases}

ただし

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

\lfloor x \rfloorはxを超えない(x以下)の最大の整数(床関数)、x \mod nxn で割った剰余である。CY は、(西暦が4桁の場合)西暦の上2桁と下2桁を表す中間変数で、たとえば2014年なら、それぞれ20と14になる。

曜日
h 1 2 3 4 5 6 0
D 7 1 2 3 4 5 6

h は、0~6で土曜日~金曜日を表す。現在標準的な ISO 8601D(1~7で月曜日~日曜日)を求めるには、次の式

 D = \left[ \left\{ d + \left\lfloor \frac{ 26 (m + 1) }{ 10 } \right\rfloor + Y + \left\lfloor \frac Y 4 \right\rfloor + \mathit \Gamma + 5 \right\} \mod 7 \right] + 1

を使う。

これらの計算式は、それぞれの暦を過去または未来に延長して使うならば、有効範囲の限界はない。ただし、歴史上の日付を扱うには、現代使われているグレゴリオ暦に切り替わった日付に注意が必要である。詳細はグレゴリオ暦#グレゴリオ暦の各国・各地域における導入を参照。さらに西暦4年3月1日以前は閏年の規則が異なるので、ユリウス暦の公式も適用できない。

コンピュータでの計算[編集]

コンピュータの多くの環境では負数剰余を保証しないので、整数の合同関係を使って

 \mathit \Gamma = \begin{cases} 
  5 C + \left\lfloor \frac C 4 \right\rfloor & \mbox{: Gregorian } ( 1582 \lessapprox y ) \\
  6 C + 5 & \mbox{: Julian } ( 4 \lessapprox y \lessapprox 1582 )
\end{cases}

と変形する。

西暦0年(紀元前1年3月1日以前に対する場合、CY を求める式にも修正が必要である。適度に大きい100の倍数y に足して、負にならないようにする。

ツェラーの公式の導出[編集]

ツェラーの公式はフェアフィールド (Fairfield) の公式の変形である。以下に、グレゴリオ暦を例に、その変形過程を記載する。

フェアフィールドの公式[編集]

1年1月1日(0年13月1日) ~ y 年 m 月 d の日数を求める。ただし、m = 1, 2 の場合は、y = y - 1, m = m + 12とし、1年を、3月1日 ~ 14月28日(閏年は29日)と再定義する。

1年1月1日(0年13月1日)を含めた、y 年 m 月 d 日迄の日数は以下の通り。

 1年1月1日(0年13月1日) ~ 1年2月28日(0年14月28日)

  ・・・  31 + 28 (日)

 1年3月1日 ~ ( y - 1 ) 年14月末日(この時点では閏年は考慮しない)

  ・・・  365 ( y - 1 ) (日)

 1年1月1日(0年13月1日) ~ ( y - 1 ) 年14月末日の閏年の回数

  ・・・  [ ( 1 + ( y - 1 ) ) / 4 ) ] - [ ( 1 + ( y - 1 ) ) / 100 ) ] + [ ( 1 + ( y - 1 ) ) / 400 ) ]

      = [ y / 4 ] - [ y / 100 ] + [ y / 400 ] (日)

 y年3月1日 ~ y 年 ( m - 1 ) 月末日

  ・・・  [ 306 ( m + 1 ) / 10 ] - 122 (日) (以下表を参照)

 y 年 m 月1日 ~ y 年 m 月 d 日

  ・・・  d (日)

当月(m) 前月(m-1) 日数(Σ) [306(m+1)/10]-122
3 0 0
4 3 31 31
5 4 61 61
6 5 92 92
7 6 122 122
8 7 153 153
9 8 184 184
10 9 214 214
11 10 245 245
12 11 275 275
13 12 306 306
14 13 337 337

  ※3月1日 ~ ( m - 1 )月末日迄の日数と、[ 306 ( m + 1 ) / 10 ] - 122 の値は完全に一致している。

従って、1年1月1日 ~ y 年 m 月 d 日の日数は、上記全てを合算した、

  31 + 28 + 365 ( y - 1 ) + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ 306 ( m + 1 ) / 10 ] - 122 + d

= 365 y + \left\lfloor \frac{y}{4} \right\rfloor - \left\lfloor \frac{y}{100} \right\rfloor + \left\lfloor \frac{y}{400} \right\rfloor + \left\lfloor \frac{306 ( m + 1 )}{10} \right\rfloor + d - 428

  ・・・  【※】/ Fairfield の公式

となる。一方、現行のグレゴリオ暦は、1582年10月15日を金曜日として施行されているが、仮に1年1月1日に施行されていたとすると、1年1月1日は月曜日であり、上記【※】式の 7 の剰余を求めることで、曜日が判明する。即ち、

h = \left( 365 y + \left\lfloor \frac{y}{4} \right\rfloor - \left\lfloor \frac{y}{100} \right\rfloor + \left\lfloor \frac{y}{400} \right\rfloor + \left\lfloor \frac{306( m + 1 )}{10} \right\rfloor + d - 428 \right) \mod 7

  ・・・  【Ⅰ】

ただし、h が 0, 1, 2, 3, 4, 5, 6 の場合、それぞれ 日曜日、月曜日、火曜日、水曜日、木曜日、金曜日、土曜日

ツェラーの公式への変形[編集]

【Ⅰ】式が 7 の剰余である事を利用すると、以下の通り変形できる。

  h = ( 7 ( 52 y - 62) + y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ 153 ( m + 1 ) / 5 ] + 6 + d ) mod 7

   = (          y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ 153 ( m + 1 ) / 5 ] + 6 + d ) mod 7

ここで、[ ] (ガウス記号)の性質( [ a ] + b = [ a + b ] , ただし b は整数)を利用すると、

  h = ( y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ 153 ( m + 1 ) / 5 + 6 ] + d ) mod 7

   = ( y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ 28 m + ( 13 / 5 ) m + 35 + 8 / 5 ] + d ) mod 7

   = ( y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ ( 13 m + 8 ) / 5 + 7 ( 4 m + 5 ) ] + d ) mod 7

   = ( y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ ( 13 m + 8 ) / 5 ] + 7 ( 4 m + 5 ) + d ) mod 7

さらに、h が 7 の剰余であることを利用して、

h = \left( y + \left\lfloor \frac{y}{4} \right\rfloor - \left\lfloor \frac{y}{100} \right\rfloor + \left\lfloor \frac{y}{400} \right\rfloor + \left\lfloor \frac{13 m + 8}{5} \right\rfloor + d \right) \mod 7

  ・・・  【Ⅱ】

が導き出される。因みに【Ⅱ】式は、ツェラーの公式として広く一般的に知られているものである。

ツェラーの公式の変形[編集]

y = 100 C + Y ( 0 ≦ Y ≦ 99, C, Y は整数)と置くと、(Ⅱ)式は以下の通り変形される。

  h = ( 100 C + Y + [ ( 100 C + Y ) / 4 ] - [ ( 100 C + Y ) / 100 ] + [ ( 100 C + Y ) / 400 ] + [ ( 13 m + 8 ) / 5 ] + d ) mod 7

   = ( 100 C + Y + [ 25 C + Y / 4 ] - [ C + Y / 100 ] + [ C / 4 + Y / 400 ] + [ ( 26 m + 26 ) / 10 - 1 ] + d ) mod 7

   = ( 100 C + Y + [ 25 C + Y / 4 ] - [ C + Y / 100 ] + [ C / 4 + Y / 400 ] + [ ( 26 m + 26 ) / 10 ] - 1 + d ) mod 7

   = ( 100 C + Y + 25 C + [ Y / 4 ] - C - [ Y / 100 ] + [ C / 4 + Y / 400 ] + [ ( 26 m + 26 ) / 10 ] + d - 1 ) mod 7

   = ( 124 C + Y      + [ Y / 4 ]     - [ Y / 100 ] + [ C / 4 + Y / 400 ] + [ ( 26 m + 26 ) / 10 ] + d - 1 ) mod 7

   = ( ( 7 * 17 ) C + 5 C + Y + [ Y / 4 ] - [ Y / 100 ] + [ C / 4 + Y / 400 ] + [ ( 26 m + 26 ) / 10 ] + d - 1 ) mod 7

h が 7 の剰余であることを利用して、

  h = ( 5 C + Y + [ Y / 4 ] - [ Y / 100 ] + [ C / 4 + Y / 400 ] + [ ( 26 m + 26 ) / 10 ] + d - 1 ) mod 7

ここで、0 ≦ Y ≦ 99より、0 ≦ Y / 100 ≦ 0.99, 0 ≦ Y / 400 ≦ 0.2475 であり、

  [ Y / 100 ] = 0

また、C / 4 の小数部分は、0, 0.25, 0.5, 0.75 の何れかの値を取る為、C / 4 + Y / 400 の小数部分は、高々 0.75 + 0.2475 = 0.9975 であり、

  [ C / 4 + Y / 400 ] = [ C / 4 ]

としてよい。よって、

  h = ( 5 C + Y + [ Y / 4 ] + [ C / 4 ] + [ ( 26 m + 26 ) / 10 ] + d - 1 ) mod 7

ただし、h が 0, 1, 2, 3, 4, 5, 6 の場合、それぞれ 日曜日、月曜日、火曜日、水曜日、木曜日、金曜日、土曜日

が導き出され、被除数に 1 加算することで、

h = \left( 5 C + Y + \left\lfloor \frac{Y}{4} \right\rfloor + \left\lfloor \frac{C}{4} \right\rfloor + \left\lfloor \frac{26 ( m + 1 )}{10} \right\rfloor + d \right) \mod 7

  ・・・  【Ⅲ】

ただし、h が 0, 1, 2, 3, 4, 5, 6 の場合、それぞれ 土曜日、日曜日、月曜日、火曜日、水曜日、木曜日、金曜日

が導き出される。

                                                             【証明終】