曜日の決定

曜日を計算する方法

任意の日付の曜日を決定するに、様々なアルゴリズムを使用できます。さらに、パーペチュアルカレンダーはユーザーによる計算を必要とせず、本質的には参照テーブルです。典型的な用途としては、誰かが生まれた 曜日や特定のイベントが発生した曜日を計算することが挙げられます。

概念

数値計算では、曜日は曜日番号で表されます。月曜日が週の最初の曜日の場合、ISO 8601で実践されているように、曜日は月曜日から日曜日までを 1 から 7 でコード化できます。7 で指定された曜日は、数を 7 で割った後の余りを計算する 7 を法とする算術演算を適用して0としてカウントすることもできます。したがって、数 7 は 0、数 8 は 1、数 9 は 2、数 18 は 4 などとして扱われます。日曜日を 1 日目と数えると、7 日後 (つまり8 日目) も日曜日になり、18 日目は 4 日目と同じで、日曜日の 3 日後 (つまり18 mod 7 = 4 ) なので水曜日になります。[a]  

標準 月曜日 火曜日 水曜日 木曜日 金曜日 土曜日 日曜日 使用例
ISO 8601 1 2 3 4 5 6 7 %_ISODOWI%, %@ISODOWI[]% ( 4DOS ); [1] DAYOFWEEK() ( HP Prime ) [2]
0 1 2 3 4 5 6
2 3 4 5 6 7 1 %NDAY OF WEEK% ( NetWare DR-DOS [3] ); %_DOWI%、 %@DOWI[]% ( 4DOS ) [1]
1 2 3 4 5 6 0 HP 金融電卓

曜日を計算するほぼすべての方法の基本的なアプローチは、「アンカー日付」、つまり既知のペア (1800 年 1 月 1 日を水曜日とするなど) から開始し、既知の日付と決定する日付の間の日数を決定し、7 を法とする算術演算を使用して新しい数値の曜日を見つけることから始まります。

標準的なアプローチの一つは、ある世紀の週の最初の日の値を調べ(または既知の規則を用いて計算し)、その月の調整値を調べ(または合同法を用いて計算し)、世紀開始からの閏年数を計算し、これらと世紀開始からの年数、そしてその月の日数を加算することです。最終的に、日数に7を法として適用することで、その日の曜日を決定できます。[4]

いくつかの方法では、まずすべての加算を行い、その後7を除外します。一方、ルイス・キャロルの方法のように、各ステップで7を除外するものもあります。どちらの方法も実用的です。前者は計算機やコンピュータプログラムにとって扱いやすく、後者は暗算にとって扱いやすいからです。ここで紹介する方法はいずれも範囲チェックを行わないため、無理な日付を入力すると誤った結果になります。

対応する日

月の7日目は、その前の日と同じ名前になります。


の日付
d
00 07 14 21 28 0
01 08 15 22 29 1
02 09 16 23 30 2
03 10 17 24 31 3
04 11 18 25 4
05 12 19 26 5
06 13 20 27 6

対応する月

「対応する月」とは、暦年の中で同じ曜日に始まる月のことです。たとえば、9 月と 12 月は対応します。これは、9 月 1 日が 12 月 1 日と同じ日であるためです (2 つの日付の間にはちょうど 13 週の 7 日間があるため)。月が対応するのは、最初の日の間の日数が 7 で割り切れる場合、つまり最初の日が整数週離れている場合のみです。たとえば、平年の 2 月は 3 月に対応します。これは、2 月が 28 日 (7 で割り切れる数) であり、28 日はちょうど 4 週間であるためです。閏年では 1 月と 2 月は平年とは異なる月に対応します。これは、2 月 29 日を追加すると、それ以降の各月が 1 日遅く始まることになるためです。

1 月は平年では 10 月、閏年では 4 月と 7 月に対応します。2 月は平年では 3 月と 11 月、閏年では 8 月に対応します。3 月は常に 11 月、4 月は常に 7 月、9 月は常に 12 月に対応します。平年では 8 月は他の月に対応しません。閏年では 10 月は他の月に対応しません。5 月と 6 月は他の月に対応しません。

以下の月表では、対応する月は同じ番号を持っていますが、これは定義から直接導かれる事実です。

平年 閏年 すべての年 メートル
ヤン 10月 0
5月 1
2月 8月 2
2月 3月 11月 3
ジュン 4
9月 12月 5
ヤン 4月 7月 6

対応する年

1年の開始日は7日で、閏年は2月29日以降の曜日が変更されます。つまり、1年は14通りの配置を持つことになります。すべての配置は主日文字で表すことができますが、2月29日には文字が割り当てられていないため、閏年は1月と2月を表す主日文字と、3月から12月を表す主日文字(アルファベット順で1つ前)の2つで表されます。

2025年は水曜日に始まる平年で、2014年の暦年に相当します。2025年の最初の2か月は、2020年の最初の2か月に相当します。2026年は木曜日に始まる平年で、2015年の暦年に相当します。2026年の最後の10か月は、2020年の最後の10か月に相当します。2027年は金曜日に始まる平年で、2021年の暦年に相当します。2028年は土曜日に始まる閏年で、2000年の暦年に相当します。2028年の最初の2か月は、2022年の最初の2か月に相当します。2028年の最後の10か月は、2023年の最後の10か月に相当します。

閏年は28年に1回、平年は6年に1回、そして11年に2回繰り返されます。例えば、月曜日から始まる閏年は2024年が最後に発生し、次は2052年です。同様に、水曜日から始まる平年は2031年、2042年、そして2053年です。これらの記述は、閏年が飛ばされない限りは真です。閏年が飛ばされるのは2100年までありません。

詳細については、以下の表を参照してください。

世紀の年
mod 28
y
00 06 12 17 23 0
01 07 12 18 24 1
02 08 13 19 24 2
03 08 14 20 25 3
04 09 15 20 26 4
04 10 16 21 27 5
05 11 16 22 00 6

注:

  • 黒は平年のすべての月を表す
  • 赤はうるう年の最初の2か月を意味します
  • 青は閏年の最後の10か月を意味します

対応する世紀

ユリウス世紀
mod 700
グレゴリオ暦
400年を基準とした世紀[b]
400: 1100 1800 ... 300: 1500 1900 ... 太陽
300: 1000 1700 ... 月曜日
200 0900 1600 ... 200: 1800 2200 ... 火曜
100 0800 1500 ... 水曜
700: 1400 2100 ... 100: 1700 2100 ... [c]
600: 1300 2000 ... 金曜
500: 1200 1900 ... 000: 1600 2000 ...

通常の年代記では、「西暦000年」は紀元前1年(西暦1年の前)にあたります。天文学的な年号では、 0年は紀元前1年と西暦1年の間にあたります。先発ユリウス暦(つまり、最初から正しく運用されていたと仮定した場合のユリウス暦)では、紀元前1年は木曜日から始まります。先発グレゴリオ暦(1582年まで考案されなかったため、このように呼ばれています)では、紀元前1年は土曜日から始まります。

曜日を計算する表形式の方法

完全な表: ユリウス暦とグレゴリオ暦

1300 年より前および 1999 年以降のユリウス暦の日付については、表の中で 700 年の正確な倍数だけ異なる年を使用する必要があります。2299 年以降のグレゴリオ暦の日付については、表の中で 400 年の正確な倍数だけ異なる年を使用する必要があります。値 " r0 " から " r6 " は、それぞれ百の位の値を 7 と 4 で割ったときの剰余を示し、系列がどちらの方向にもどのように拡張されるかを示します。便宜上、1500 から 1999 まではユリウス暦とグレゴリオ暦の両方の値が表示されています。太字の数字 (例: 04 ) は閏年を示します。年が 00 で終わり、百の位が太字になっている場合は閏年です。したがって、19 は 1900 年がグレゴリオ暦の閏年ではないことを示します (ただし、ユリウス列の19 は、すべてのユリウス暦x 00 年と同様に、ユリウス暦の閏年であることを示します)。20は2000年が閏年であることを示します。JanFebは閏年のみ使用してください。

数百年 残りの年桁
ダウ
#
ユリウス暦
(r ÷ 7)
グレゴリオ暦
(r ÷ 4)
r5 19 16 20 r0 00 06 17 23 28 34 45 51 56 62 73 79 84 90 ヤン 10月 0
r4 18 15 19 r3 01 07 12 18 29 35 40 46 57 63 68 74 85 91 96 5月 1
r3 17 該当なし 02 13 19 24 30 41 47 52 58 69 75 80 86 97 2月 8月 M 2
r2 16 18 22 r2 03 08 14 25 31 36 42 53 59 64 70 81 87 92 98 2月 3月 11月 3
r1 15 該当なし   09 15 20 26   37 43 48 54   65 71 76 82   93 99 ジュン W 4
r0 14 17 21 r1 04 10 21 27 32 38 49 55 60 66 77 83 88 94 9月 12月 Th 5
r6 13 該当なし 05 11 16 22 33 39 44 50 61 67 72 78 89 95 ヤン 4月 7月 F 6

曜日を決定するために(2000年1月1日、土曜日)

  • 月日: 1~31 (1)
  • 月: (6)
  • 年: (0)
  • グレゴリオ暦の場合は4を法として世紀を割り、ユリウス暦の場合は7を法として世紀を割ります(0)
  • 1+6+0+0=7を足します。7で割ると余りは0なので、曜日は土曜日です。

式は w = (d + m + y + c) mod 7 です。

改訂ユリウス暦

改訂ユリウス暦と改訂グレゴリオ暦の日付 (したがって曜日) は、1923 年 10 月 14 日から西暦 2800 年 2 月 28 日まで同じであり、大きな年の場合は、開始前に 6300 またはその倍数を減算して、表の範囲内または表に近づく年に達することができる場合があることに注意してください。

この表を使って任意の年の任意の日付の曜日を調べるには、年号から100を引き、その差を100で割り、その商(小数点以下は切り捨て)に7を掛け、その積を9で割ります。この商(小数点以下は切り捨て)を記録します。表にユリウス年を入力し、最後の割り算の直前に50を足し、上記の商を引きます。

以下は、8315 年 1 月 27 日の曜日を計算する例です。

8315 − 6300 = 2015, 2015 − 100 = 1915, 1915 ÷ 100 = 19 余り 15, 19 × 7 = 133, 133 ÷ 9 = 14 余り }. 2015は1315より700年先なので、1315が使用されます。 表より:百の位(13):6。残りの桁(15):4。月(1月):0。日(27):27。{{{1}}}{{{1}}}。したがって、曜日は木曜日です。

主教の手紙

曜日を表す文字を見つけるには、1 月 1 日または 10 月 1 日の曜日を計算し、日曜日が A、土曜日が B、... 月曜日が G に対応するように文字を割り当てます。

閏年は日曜日を表す文字が 2 つあるため、1 月と 2 月の場合は 1 月 1 日の曜日を計算し、3 月から 12 月の場合は 10 月 1 日の曜日を計算します。

うるう年は、次の例外を除き、ちょうど 4 で割り切れる年です。

グレゴリオ暦では、ちょうど 100 で割り切れるすべての年 (400 で割り切れる年を除く)。

改訂ユリウス暦では、ちょうど 100 で割るすべての年 (900 で割った余りが 200 または 600 となる年を除く)。

終末の日

終末アルゴリズムは娯楽数学の産物です。

結果

以下は計算なしで曜日を見つけるための表です。

索引 月曜日
A
火曜
B
水曜
C
木曜
D
金曜
土曜
F
サン
G
永久グレゴリオ暦とユリウス暦閏年1月2月を使用世紀の行の文字には年の行の文字を
使用します

Cの日はすべて終末の日である

ユリウス
世紀
グレゴリオ
世紀
日付 01
08
15
22
29
02
09
16
23
30
03
10
17
24
31
04
11
18
25

05
12
19
26

06
13
20
27

07
14
21
28

12 19 16 20 4月 7月 ヤン G B C D E F 01 07 12 18 29 35 40 46 57 63 68 74 85 91 96
13 20 9月 12月 F G B C D E 02 13 19 24 30 41 47 52 58 69 75 80 86 97
14 21 17 21 ジュン E F G B C D 03 08 14 25 31 36 42 53 59 64 70 81 87 92 98
15 22 2月 3月 11月 D E F G B C 09 15 20 26 37 43 48 54 65 71 76 82 93 99
16 23 18 22 8月 2月 C D E F G B 04 10 21 27 32 38 49 55 60 66 77 83 88 94
17 24 5月 B C D E F G 05 11 16 22 33 39 44 50 61 67 72 78 89 95
18 25 19 23 ヤン 10月 B C D E F G 06 17 23 28 34 45 51 56 62 73 79 84 90 0 0
[年/100] グレゴリオ
世紀
20
16
21
17
22
18
23
19
年 mod 100
ユリウス
世紀
19
12
20
13
21
14
22
15
23
16
24
17
25
18

例:

  • 一般的な方法
1893年12月26日(GD)

12 月はF行にあり、 26 はE列にあるので、日付の文字はFE列にある C です。93 (年 mod 100) はD行(年の行) にあり、年の行の文字 C はG列にあります。18 (グレゴリオ世紀列の [年/100]) はC行(世紀の行) にあり、世紀行G列の文字はB なので、曜日は火曜日です。

1307年10月13日(JD)

10月13日はFの日です。年号の行(07)の文字FはG列にあります。世紀号の行(13)の文字GはEなので、曜日は金曜日です。

2000年1月1日(GD)

1月1日はGに対応し、年行のG(0 0)は世紀行のF(20)に対応し、Fは土曜日に対応します。

この方法の簡潔な公式は、「日付の文字 (G) は、文字 (G) が年の行 ( 0 0 ) にあり、文字 (F) が世紀の行 ( 20 ) にあり、日については、文字 (F) が曜日 (土曜日) になります」です

日曜手紙方式

2月29日を除く1年の各曜日には、ABCDEFGという周期的な順序で文字が割り当てられています。この順序は1月1日のAから始まり、12月31日に再びAに戻ります。日曜日を表す文字は、1年のすべての日曜日を表す文字です。2月29日には文字がないため、3月から12月の日曜日を表す文字は、1月と2月の日曜日を表す文字に比べて1つ後ろになります。日付を表す文字は、「ラテン方陣」の左側にある月(黒字)の行と、「ラテン方陣」の上にある日付の列が交わる位置にあります。日曜日を表す文字は、「ラテン方陣」の下にある世紀を表す列と、「ラテン方陣」の右側にある年の下2桁の行が交わる位置にあります。閏年の場合、このようにして得られた日曜日を表す文字は、3月から12月までを表す文字です。

たとえば、2020 年 6 月 16 日の曜日を検索するには、次のようにします。

列「20」は行「20」と「D」で交わります。行「June」は列「16」と「F」で交わります。FはDから2文字後なので、曜日は日曜日から2日後、つまり火曜日になります。

数学アルゴリズム

ラタ・ダイ

Rata Die法は、曜日が既知の日付Dから経過した日数dを加算することで機能します。曜日は、Dをエンコードする際に使用された規則に従い、( D + d ) mod 7で与えられます。

たとえば、2009 年 8 月 13 日は西暦 1 年 1 月 1 日から 733,632 日後です。この数を 7 で割ると 4 となり、木曜日になります。

ガウスのアルゴリズム

カール・フリードリヒ・ガウスは、天文表集に収められた手書きのメモの中で、任意の年の1月1日の曜日を計算する方法を記述しました。[5]彼はこの方法を公表することはありませんでしたが、1927年にようやく彼の著作集に収録されました。[6]この結果は、ラータ・ディー法と比較すると、年の数え方を簡素化するのに役立ちます。

ガウスの方法はグレゴリオ暦に適用可能でした。彼は日曜日から始まり、曜日を0から6まで番号付けしました。そして、次のような演算を定義しました。

入力
年番号A、月番号M、日番号D
出力
年内の日数。
手順
  1. まず、1 月 1 日の曜日d 1を決定します。
    • グレゴリオ暦の場合、曜日は[5]
           (1 + 5(( A −1) % 4) + 4(( A −1) % 100) + 6(( A −1) % 400)) % 7です。あるいは、C = A \ 100Y = A  % 100と設定すると、値は
           (1 + 5(( Y −1)%4) + 3( Y −1) + 5(C%4)) % 7になります。
    • ユリウス暦の場合、曜日は
           (6 + 5(( A −1)%4) + 3( A −1)) % 7または
           (6 + 5(( Y −1) % 4) + 3( Y −1) + 6C) % 7 です
  2. ここで、 Mを使用した参照テーブルを使用して、月関連のオフセットmを決定します。
  3. d = ( d 1 + m + D ) % 7を返します
月オフセット表
ヤン 2月 3月 4月 5月 ジュン 7月 8月 9月 10月 11月 12月
平年 0 3 3 6 1 4 6 2 5 0 3 5
閏年 4 0 2 5 0 3 6 1 4 6

上記の手順は、グレゴリオ暦の場合、次の1つの式に要約できます:
     (D + m + 5(( A −1)%4) + 4(( A −1)%100) + 6(( A −1)%400))%7

実例

2000年の場合、A − 1 = 1999Y − 1 = 99C = 19、1月1日の曜日は

= (1 + 5(1999%4) + 4(1999%100) + 6(1999%400))%7
= (1 + 1 + 4 + 0) % 7
= 6
= (1 + 5(99%4) + 3 × 99 + 5(19%4))%7
= (1 + 1 + 3 + 1)%7
= 6 = 土曜日。

例えば、1777年4月30日と1855年2月23日の曜日は

= (30 + 6 + 5(1776%4) + 4(1776%100) + 6(1776%400))%7
= (2 + 6 + 0 + 3 + 6)%7
= 3 =水曜日

そして

= (6 + 23 + 2.6 × 12 + 5(1854%4) + 4(1854%100) + 6(1854%400))%7
= (6 + 2 + 4 + 3 + 6 + 5)%7
= 5 = 金曜日。

説明と注釈

1月1日の曜日を求めるアルゴリズムは、剰余算法を用いて証明できます。要点は、365 % 7 = 1 であるため、毎年1日ずつ加算されるということです。残りは閏年への調整です。世紀ベースのバージョンでは、36525 % 7 = 6となります。

月のオフセット表は、閏年の影響で2月に乖離が生じていることを示しています。一般的な手法(後にZellerが用いた手法)は、閏日が末尾になるように、月を3月からシフトすることです。さらに、Zellerが後に示したように、この表は算術式で置き換えることができます。

この式は、KraitchikとSchwerdtfegerによって、任意の曜日を計算するためのグラフと表形式の方法にも変換されました。[6] [7]

異なるバリエーション

以下の式は、参照テーブルを使用しないバージョンの例です。年は3月に始まると仮定しているため、1月と2月の日付は前年の一部として扱われます。グレゴリオ暦の式は[8]です。

d + 2.6 メートル 0.2 + y + y 4 + c 4 2 c モッド 7 {\displaystyle w=\left(d+\lfloor 2.6m-0.2\rfloor +y+\left\lfloor {\frac {y}{4}}\right\rfloor +\left\lfloor {\frac {c}{4}}\right\rfloor -2c\right){\bmod {7}},}

どこ

  • dは月内の日(1~31)です。
  • mはシフトされた月です (3 月 = 1、...、2 月 = 12)
  • Yは年である。ただし、mが11 = 1月または12 = 2月の場合は、前年度の一部とみなされ、Y = 年 - 1となる。
  • cは世紀を表す。 c はい / 100 {\displaystyle c=\lfloor Y/100\rfloor }
  • yは世紀を基準とした年で、 で表されます。または、単にYの最後の2桁です。 y はい 100 c {\displaystyle y=Y-100c}
  • wは曜日です (0 = 日曜日、...、6 = 土曜日)
月オフセット表( 2.6 メートル 0.2 {\displaystyle \lfloor 2.6m-0.2\rfloor }
3月 4月 5月 ジュン 7月 8月 9月 10月 11月 12月 ヤン 2月
オフセット 2 5 7 10 12 15 18 20 23 25 28 31

ツェラーのアルゴリズム

ツェラーのアルゴリズムでは、月は3月を3として2月を14として番号が付けられる。年は3月に始まると仮定されている。つまり、例えば1995年1月は1994年の13番目の月として扱われる。[9] グレゴリオ暦の式は 以下の通り である。
13 メートル + 1 5 + y 4 + c 4 + d + y 2 c モッド 7 {\displaystyle w\equiv \left(\left\lfloor {\frac {13(m+1)}{5}}\right\rfloor +\left\lfloor {\frac {y}{4}}\right\rfloor +\left\lfloor {\frac {c}{4}}\right\rfloor +d+y-2c\right){\bmod {7}}}

  • d {\displaystyle d} 月の日付(1~31)
  • メートル {\displaystyle m} シフトされた月です(3月=3、...1月=13、2月=14)
  • はい {\displaystyle Y} 13 = 1月または14 = 2月でない限り、年は前年の一部とみなされ、 メートル {\displaystyle m} はい 1 {\displaystyle Y={\textit {年}}-1}
  • c {\displaystyle c} 世紀は c はい / 100 {\displaystyle c=\lfloor Y/100\rfloor }
  • y {\displaystyle y} は世紀に対する年で、 で表されます。または単に の最後の2桁です。 y はい 100 c {\displaystyle y=Y-100c} はい {\displaystyle Y}
  • {\displaystyle w} 曜日です(1 = 日曜日、..0 = 土曜日)
月オフセット表( 2.6 メートル + 1 {\displaystyle \lfloor 2.6(m+1)\rfloor }
3月 4月 5月 ジュン 7月 8月 9月 10月 11月 12月 ヤン 2月
オフセット 10 13 15 18 20 23 26 28 31 33 36 39

唯一の違いは、Zellerアルゴリズム(Z)とDisparate Gaussianアルゴリズム(G)の間であり、ZG = 1 = Sundayとなります。

d + メートル + 1 2.6 + y + y / 4 + c / 4 2 c モッド 7 d + 2.6 メートル 0.2 + y + y / 4 + c / 4 2 c モッド 7 {\displaystyle (d+\lfloor (m+1)2.6\rfloor +y+\lfloor y/4\rfloor +\lfloor c/4\rfloor -2c){\bmod {7}}-(d+\lfloor 2.6m-0.2\rfloor +y+\lfloor y/4\rfloor +\lfloor c/4\rfloor -2c){\bmod {7}}}
メートル + 2 + 1 2.6 2.6 メートル 0.2 モッド 7 {\displaystyle =(\lfloor (m+2+1)2.6-(2.6m-0.2)\rfloor ){\bmod {7}}} ( Zでは3月=3ですが、 Gでは3月=1です
2.6 メートル + 7.8 2.6 メートル + 0.2 モッド 7 {\displaystyle =(\lfloor 2.6m+7.8-2.6m+0.2\rfloor ){\bmod {7}}}
8 モッド 7 1 {\displaystyle =8{\bmod {7}}=1}

王のアルゴリズム

グレゴリオ暦の人間による計算のための王のアルゴリズム[10]は(mが1の場合は1を減算し、閏年の場合は2を減算する) である 。
d d 0 メートル + y 0 y 1 + y 0 / 4 y 1 / 2 2 c モッド 4 モッド 7 {\displaystyle w=\left(d-d_{0}(m)+y_{0}-y_{1}+\left\lfloor y_{0}/4-y_{1}/2\right\rfloor -2\left(c{\bmod {4}}\right)\right){\bmod {7}},}

  • y 0 {\displaystyle y_{0}} は年号の最後の桁(単位)です
  • y 1 {\displaystyle y_{1}} は年の最後の2番目の数字(十の位)です
  • c {\displaystyle c} は世紀を表し、 c / 100 {\displaystyle c=\lfloor {\textit {年}}/100\rfloor }
  • d {\displaystyle d} は月内の日(1~31)です
  • メートル {\displaystyle m} は月です(1月=1、...、12月=12)
  • {\displaystyle w} は曜日です(0=日曜日、...、6=土曜日)
  • ⁠ は、 d 0 メートル {\displaystyle d_{0}(m)} 次の表にリストされている値を持つnull日関数(月オフセット)です。
メートル d 0 メートル {\displaystyle d_{0}(m)}
1 1 一日
3 5 m + 2
5 7
7 9
9 3 m + 1
11 12
2 12 メートル+ 3
4 2 メートル− 2
6 4
8 6
10 8
12 10

ユリウス暦のアルゴリズムは、終末の日を例にとると上記のアルゴリズムから導き出すこと でき ます d d 0 メートル + y 0 y 1 + y 0 / 4 y 1 / 2 c モッド 7 {\displaystyle w=\left(d-d_{0}(m)+y_{0}-y_{1}+\left\lfloor y_{0}/4-y_{1}/2\right\rfloor -c\right){\bmod {7}},} d 0 メートル {\displaystyle d_{0}(m)}

メートル d 0 メートル {\displaystyle d_{0}(m)}
1 3 C日
3 7 メートル+4
5 9
7 11
9 5 メートル− 4
11 7
2 0 メートル− 2
4 4 メートル
6 6
8 8
10 10
12 12

その他のアルゴリズム

シュヴェルトフェガー法

シュヴェルトフェガーによる部分的な表形式の方法では、年は世紀とその中の2桁の年に分割される。この方法は月によって異なる。m 3の場合、

c y 100 そして グラム y 100 c {\displaystyle c=\left\lfloor {\frac {y}{100}}\right\rfloor \quad {\text{and}}\quad g=y-100c,}

したがってgは0から99の間です。m = 1,2の場合、

c y 1 100 そして グラム y 1 100 c {\displaystyle c=\left\lfloor {\frac {y-1}{100}}\right\rfloor \quad {\text{and}}\quad g=y-1-100c.}

曜日の計算式は[6]

d + e + f + グラム + グラム 4 モッド 7 {\displaystyle w=\left(d+e+f+g+\left\lfloor {\frac {g}{4}}\right\rfloor \right){\bmod {7}},}

ここで正の係数が選択されます。[6]

eの値は次の表から得られます。

メートル 1 2 3 4 5 6 7 8 9 10 11 12
e 0 3 2 5 0 3 5 1 4 6 2 4

fの値は、暦に応じて以下の表から得られる。グレゴリオ暦の場合、[6]

c mod 4 0 1 2 3
f 0 5 3 1

ユリウス暦の場合、[6]

c のmod 7 0 1 2 3 4 5 6
f 5 4 3 2 1 0 6

ルイス・キャロルの方法

チャールズ・ラトウィッジ・ドジソン(ルイス・キャロル)は、パズルに似た手法を考案しました。これは、上記の「完全な表:ユリウス暦とグレゴリオ暦」と同じ月番号を使用するという点で、部分的に表形式になっています。彼は、閏年でない年の最初の3か月について、同じ3つの調整を列挙し、最後の3か月については7ずつ増やし、残りの調整を求めるための不可解な指示を与えています。世紀の調整は、世紀の表と同様の公式を用いて決定されます。彼の手法は旧式の日付にも有効であると明確に主張していますが、以下に再現した「1676年2月23日」が水曜日であると判断する例は、年が「旧式」ユリウス暦の3月25日ではなく1月1日に始まるユリウス暦でのみ有効です。

アルゴリズム: [11]

与えられた日付を 4 つの部分、つまり世紀の数、経過年数、月、日に分けて計算します。

以下の4つの項目を計算し、それぞれが見つかったら前の項目の合計に加算します。項目または合計が7を超える場合は、7で割り、余りのみを残します。

世紀の項目: 「旧様式」(1752 年 9 月 2 日に終了) の場合は 18 から引きます。「新様式」(1752 年 9 月 14 日に開始) の場合は 4 で割り、3 から余りを取り、余りに 2 を掛けます。

年項目: ダーの数、余剰、余剰の 4 の数を合計します。

月を表す項目:母音で始まるか終わる場合は、その数字を10から引きます。この数字と日数を足すと、翌月の項目が得られます。1月は「0」、2月または3月は「3」、12月は「12」です。

日次項目: 閏年の 1 月または 2 月の場合は、このようにして得られた合計から「1」を減算して修正する必要があります (合計が「0」の場合は、最初に 7 を加算します)。4 で割り切れる年はすべて閏年ですが、「新様式」の世紀年のみは、世紀の数がそれほど割り切れない場合 (例: 1800) であるため、4 で割り切れない年であることに留意してください。

最終結果は曜日を示し、「0」は日曜日、「1」は月曜日などを意味します。

例: [11]

1783年9月18日

17を4で割ると「1」が余ります。1を3で割ると「2」になります。2を2倍すると「4」になります。83は6ダースと11で17になります。2を足すと19、つまり(7で割ると)「5」になります。合計は9で「2」です。8月は「10から8を引いた数」なので「2」です。9月は「2に31を足す数」なので「5」です。合計は7で「0」なので、残りは「0」です。18は「4」です。答えは「木曜日」です。

1676年2月23日

18から16を引いて「2」。76は6ダースと4を足して10。それに1を足して11なので「4」。合計は「6」。2月のものは「3」。合計は9なので「2」。23は「2」。合計は「4」。うるう年なので「3」。答えは「水曜日」。

1752年以前の日付は、イギリスでは旧暦で3月25日を新年の初日としていました。しかし、キャロルの方法で1月1日を年の最初の日と仮定すると、正しい答え、つまり「金曜日」にたどり着くことができません。

もし彼が1676年2月23日(3月25日が元旦)が実際には1677年2月23日(1月1日が元旦)であることに気づいていたなら、ジョージ・ワシントンの誕生日が異なるのと同じように、2つの暦における年数の違いを考慮に入れていただろう。すると彼の方法は以下のようになる。

1677年(訂正)2月23日

18から16を引いて「2」。77は6ダースと5を足して11。それに1を足して12なので「5」。合計は「7」。2月のアイテムは「3」。合計は10なので「3」。23は「2」。合計は「5」。答えは「金曜日」。

キャロルの方法を再出版した人々、特にマーティン・ガードナーが彼の誤りを指摘しなかったことは注目に値する。[12]

1752年、大英帝国は旧 ユリウス暦の使用を放棄し、グレゴリオ暦を採用しました。グレゴリオ暦は現在、世界のほとんどの国で標準となっています。詳細については、旧ユリウス暦と新ユリウス暦の日付をご覧ください。

コンピュータコード内のメソッド

キース

以下のC 言語ではy、、mdそれぞれ、年 (例: 1988)、月 (1 ~ 12)、日 (1 ~ 31) を表す整数変数です。

d += m < 3 ? y -- : y -2 23 * m / 9 + d + 4 + y / 4 - y / 100 + y / 400 % 7      

1990年、マイケル・キースとトム・クレイバーは、グレゴリオ暦の日付を数値の曜日に変換する自己完結型関数の入力に必要なキー入力回数を最小限に抑えることを目指した前述の式を発表しました。[13]0この式は、= Sunday、 = Monday などを返します1。この式は、ツェラーのアルゴリズムよりも扱いやすい月要素を使用しています。

その後まもなく、ハンス・ラックマンは、低スペックのデバイスでも使いやすいようにアルゴリズムを合理化しました。当初は四則演算計算機向けに設計されたこの方法は、計算範囲を西暦1905年から2099年、あるいは歴史的なユリウス暦に限定することで、キーパッドの入力回数を削減しました。後に、そろばんであってもグレゴリオ暦の日付を変換できるように改良されました。モトローラ68000ベースのデバイスでは、設計目的に応じて、プロセッサレジスタオペコードの必要性も同様に軽減されています[14]

坂本氏の手法

トンデリングのアルゴリズムの表形式の先駆者は、次のK&R C関数に具体化されています。[15]若干の変更を加えて、 APL2などの他の高水準プログラミング言語にも適応されました[16] 1992年に坂本智彦氏がcomp.lang.c Usenetニュースグループに投稿したこの関数は、グレゴリオ暦の日付に対して正確です。[17] [18]

dayofweek ( y , m , d ) / * 1 <= m <= 12, y > 1752 (英国) */ { static int t [] = { 0 , 3 , 2 , 5 , 0 , 3 , 5 , 1 , 4 , 6 , 2 , 4 } ; if ( m < 3 ) { y -= 1 ; } return ( y + y / 4 - y / 100 + y / 400 + t [ m -1 ] + d ) % 7 ; }  	

                   
         
    
          
    
                 

0= Sunday、1= Monday など を返します。

坂本氏は同時に、より難解なバージョンも投稿した。

dow ( m , d , y ) { y -= m < 3 ; return ( y + y / 4 - y / 100 + y / 400 + "-bed=pen+mad." [ m ] + d ) % 7 ; }         

このバージョンでは、月オフセットを文字列にエンコードするため、アルゴリズムを正しく実行するには標準ASCIIを使用するコンピュータが必要となり、移植性が低下します。さらに、どちらのアルゴリズムもint 型宣言を省略しますが、これはオリジナルのK&R Cでは許可されていますが、 ANSI Cでは許可されていません

(Tøndering のアルゴリズムも、月に関連する要素が である点を除けば、Zeller の合同法や Keith のショート コードと構造が似ています31*m/12。Sakamoto のアルゴリズムは、Disparate Gaussian と Schwerdtfeger のアルゴリズムの中間にあり、式の形式を意識していないようです。)

MATLABにおけるガウス法

% 日付入力例
y1 = 2022 ; m1 = 1 ; d1 = 1 ;  
  
  

month_offset = [ 0 3 3 6 1 4 6 2 5 0 3 5 ]; % 共通年              

% offset if y1 うるう年
if mod ( y1 , 4 ) == 0 && mod ( y1 , 100 ) == 0 && mod ( y1 , 400 ) == 0 month_offset =[ 0 3 4 0 2 5 0 3 6 1 4 6 ]; % うるう年終了     
               


% グレゴール
weekday_gregor = rem ( d1 + month_offset ( m1 ) + 5 * rem ( y1 - 1 , 4 ) + 4 * rem ( y1 - 1 , 100 ) + 6 * rem ( y1 - 1 , 400 ), 7 )         

% ユリウス日
weekday_julian = rem ( 6 + 5 * rem ( y1 - 1 , 4 ) + 3 * ( y1 - 1 ), 7 )    

0: 日曜日 1: 月曜日 .. 6: 土曜日

Pythonでグレゴリオ暦を計算するガウス法

NumPyからremainderをremとしてインポート     

def is_leap_year ( year : int ) -> bool : """うるう年かどうかを判断します。""" return year % 4 == 0 and ( year % 100 != 0 or year % 400 == 0 )    
    
                     
    
def day_of_week ( y : int , m : int , d : int ) -> str : """    ガウスのアルゴリズムを使用して、指定された日付の曜日を文字列として返します。""" if is_leap_year ( y ): month_offset = ( 0 , 3 , 4 , 0 , 2 , 5 , 0 , 3 , 6 , 1 , 4 , 6 )[ m - 1 ] else : month_offset = ( 0 , 3 , 3 , 6 , 1 , 4 , 6 , 2 , 5 , 0 , 3 , 5 )[ m - 1 ] y -= 1 wd = int ( rem ( d + month_offset + 5 * rem ( y , 4 ) + 4 *レム( y , 100 ) \
              + 6 *レム( y , 400 ) , 7 ))        
    

     
                       
    
                       
      
                        
    
    return  ( "日"  "月"  "火"  "水"  "木"  "金"  "土" )[ wd ]

参照

参考文献

注記

  1. ^ これを詳しく説明するには、日曜日から始まる月を表すカレンダーを思い浮かべると分かりやすいでしょう。つまり、 その月の 1 日は日曜日です。7 日数えると 8 日になりますが、これも日曜日です。さらに 10 日数えると 18 日になり、ここは水曜日です。代わりに、4 日水曜日 (1 日日曜日の 3 日後) から始めて、7 日数えて 11 日水曜日 (8 日日曜日の 3 日後) になり、さらに 7 日数えると、18 日水曜日になります。これも15 日日曜日の 3 日後であり 1 日日曜日のちょうど 2 週間後 (日曜日 2 つ分) になります。
  2. ^ 最初の列の数字は先駆的なものです。グレゴリオ暦は 1582 年まで考案されていませんでした。表の下の注記を参照してください。
  3. ^ 紀元前 1 年に始まるユリウス暦もこの表の行 (700 の左側) に表示されますが、それを含めるスペースがありません。

引用

  1. ^ ab Brothers, Hardin; Rawson, Tom ; Conn, Rex C .; Paul, Matthias R.; Dye, Charles E.; Georgiev, Luchezar I. (2002-02-27). 4DOS 8.00 オンラインヘルプ.
  2. ^ 「HP Prime - Portal: ファームウェアアップデート」(ドイツ語). Moravia Education. 2015年5月15日. 2016年11月5日時点のオリジナルよりアーカイブ。 2015年8月28日閲覧
  3. ^ ポール、マティアス R. (1997-07-30)。 NWDOS-TIP — Novell DOS 7 に関するヒントとコツ、詳細、バグ、回避策を含む Blick です。リリース 157 (ドイツ語) (第 3 版)。 2016-11-04 のオリジナルからアーカイブ2014 年 8 月 6 日に取得(注:これはNovell DOS 7およびOpenDOS 7.01NWDOSTIP.TXTに関する包括的な作業であり、多くの文書化されていない機能と内部構造の説明が含まれています。これは、2001 年まで維持され、当時多くのサイトで配布されていた著者のさらに大規模なコレクションの一部です。提供されているリンクは、HTML に変換された古いバージョンのファイルを指しています。)MPDOSTIP.ZIPNWDOSTIP.TXT
  4. ^ リチャーズ、EG(1999年)『時間の地図:暦とその歴史オックスフォード大学出版局ISBN 978-0-19-850413-9
  5. ^ ab ガウス、カール F. (1981)。 「Den Wochentag des 1. Januar eines Jahres zu finden. Gueldene Zahl. Epakte. Ostergrenze.」。ヴェルケ。 herausgegeben von der Koeniglichen Gesellschaft der Wissenschaften zu Goettingen (第 2 版)。ヒルデスハイム:ゲオルグ・オルムス・フェルラーク。ページ 206–207。ISBN 978-3-48704643-3
  6. ^ abcdef Schwerdtfeger, Berndt E. (2010-05-07). 「ガウスの曜日暦式」(PDF) (1.4.26版) . 2012年12月23日閲覧
  7. ^ クライチク, モーリス (2006). 「第5章 暦」.数学的レクリエーション(第2版 [ドーバー] 版). ミネオラ:ドーバー出版. pp.  109– 116. ISBN 978-0-48645358-3
  8. ^ ローゼン、ケネス・H. (2011). 『初等数論とその応用』アディソン・ウェスレー. pp.  134– 137. ISBN 978-0321500311
  9. ^ Stockton, JR (2010-03-19). 「Rektor Chr. Zellerの暦作品:曜日と復活祭の式典」Merlyn . 2013年7月29日時点のオリジナルよりアーカイブ。 2012年12月19日閲覧
  10. ^ Wang, Xiang-Sheng (2015年3月). 「曜日の計算:ヌル日アルゴリズム」(PDF) .レクリエーション数学マガジン. 第3号. 5ページ.
  11. ^ ab Dodgson, CL ( Lewis Carroll ). (1887). 「任意の日付の曜日を調べる」. Nature , 1887年3月31日. Mapping Time , pp. 299-301に再掲載.
  12. ^ マーティン・ガードナー (1996). 『 ハンカチの中の宇宙:ルイス・キャロルの数学的レクリエーション、ゲーム、パズル、そして言葉遊び』、24-26ページ。シュプリンガー・フェアラーク社。
  13. ^ Michael Keith; Tom Craver. (1990).究極の永久カレンダー? Journal of Recreational Mathematics, 22:4, pp.280-282.
  14. ^ 4関数電卓、モトローラ68000孤児の集合、そろばん。gopher://sdf.org/1/users/retroburrowers/TemporalRetrology
  15. ^ 「曜日アルゴリズムが必要!」ニュース:1993年4月20日.075917.16920@sm.sony.co.jp
  16. ^ APL2 IDIOMSワークスペース:日付と時刻のアルゴリズム、15行目。https://www.ibm.com/support/pages/system/files/support/swg/swgdocs.nsf/0/819cd2373bb755d98525716c004c108e/$FILE/APL2IDIOMS.pdf (2002)
  17. ^ 「日付 -> 曜日変換」。Googleニュースグループ:comp.lang.c。 1992年12月。 2020年6月21日閲覧
  18. ^ 「DOWアルゴリズム」。Googleニュースグループ:comp.lang.c。 1994年。 2020年6月21日閲覧

さらに読む

  • ヘイル=エヴァンス、ロン (2006). 「ハック #43: 任意の平日を計算する」 .マインドパフォーマンスハック(第1版). 北京: オライリー. pp. 164–169. ISBN 9780596101534
  • Thioux, Marc; Stark, David E.; Klaiman, Cheryl; Schultz, Robert T. (2006). 「700ミリ秒で生まれた曜日:自閉症サヴァン症候群のカレンダー計算」『実験心理学ジャーナル:人間の知覚とパフォーマンス32 (5): 1155– 1168. doi :10.1037/0096-1523.32.5.1155. PMID  17002528.
  • トレファート、ダロルド・A. (2011年10月12日). 「なぜ暦計算をするのか?」. 『天才の島々:自閉症、後天性、突発性サヴァントの豊かな心』(初版、再版). ロンドン:ジェシカ・キングスリー. pp.  63– 66. ISBN 9781849058735
  • グレゴリオ暦とユリウス暦の両方に対するトンデリングのアルゴリズム
  • 計算と記憶を減らすために「キーデイ」方式を採用
  • 記憶のためのコンパクトな表形式方式、ユリウス暦にも対応
  • 各国がユリウス暦から変更したとき
  • グレゴリオ暦の曜日を暗算する世界記録
  • カレンダーの日付を見つけるための全国記録
  • メモリアルメンタルカレンダーの日付の世界ランキング(全競技合計)
  • 月、日、曜日を指定して年を特定します。2018年1月4日にWayback Machineにアーカイブされています。
Retrieved from "https://en.wikipedia.org/w/index.php?title=Determination_of_the_day_of_the_week&oldid=1334097245"