任意の日付の曜日の決定は、 さまざまなアルゴリズムを使用して実行できます。さらに、永久カレンダーはユーザーによる計算を必要とせず、本質的には参照テーブルです。典型的な用途は、誰かが生まれた曜日や特定のイベントが発生した 曜日を計算することです。
コンセプト
数値計算では、曜日は曜日番号で表されます。月曜日が週の最初の曜日である場合、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]
曜日を計算するほぼすべての方法の基本的なアプローチは、「アンカー日付」、つまり既知のペア (1800 年 1 月 1 日は水曜日など) から開始し、既知の日付と決定しようとしている日付の間の日数を決定し、7 を法とする算術演算を使用して新しい数値の曜日を見つけることから始まります。
標準的な方法の 1 つは、特定の世紀の週の最初の日の値を調べ (または既知のルールを使用して計算)、その月の調整を調べ (または合同法を使用して計算)、世紀の初めからの閏年の数を計算し、次にこれらを世紀の初めからの年数と月の日数とともに加算することです。最終的に、日数カウントが得られ、これに 7 を法として適用して、その日付の曜日を決定します。[4]
いくつかの方法では、まずすべての加算を行ってから 7 を除外しますが、ルイス キャロルの方法のように、各ステップで 7 を除外するものもあります。どちらの方法も実行可能です。前者は計算機やコンピュータ プログラムにとって簡単で、後者は暗算に適しています (少し練習すれば、すべての計算を頭の中で行うことも可能です)。ここで紹介する方法はいずれも範囲チェックを行わないため、不合理な日付は誤った結果を生成します。
該当日
月の7日目は、その前の日と同じ名前になります。
対応する月
「対応する月」とは、暦年内で同じ曜日に始まる月です。たとえば、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 月は他の月には相当しません。
以下の月表では、対応する月は同じ番号を持ちますが、これは定義から直接導かれる事実です。
対応する年
1 年の開始日は 7 日間あり、閏年は 2 月 29 日以降の曜日が変更されます。つまり、1 年は 14 通りの構成を持つことになります。すべての構成はドミニカル文字で参照できますが、2 月 29 日には文字が割り当てられていないため、閏年は 1 月と 2 月を表すドミニカル文字と、3 月から 12 月を表す (アルファベット順で 1 つ前の) ドミニカル文字の 2 つを持ちます。
2021 年は金曜日に始まる平年で、2010 年の暦年に相当します。2021 年の最初の 2 か月は、2016 年の最初の 2 か月に相当します。2022 年は土曜日に始まる平年で、2011 年の暦年に相当します。2022 年の最後の 10 か月は、2016 年の最後の 10 か月に相当します。2023 年は日曜日に始まる平年で、2017 年の暦年に相当します。2024 年は月曜日に始まる閏年で、1996 年の暦年に相当します。2024 年の最初の 2 か月は、2018 年の最初の 2 か月に相当します。2024 年の最後の 10 か月は、2019 年の最後の 10 か月に相当します。
閏年は 28 年に 1 回繰り返され、平年は 6 年に 1 回、11 年に 2 回繰り返されます。たとえば、水曜日に始まる閏年が最後に発生したのは 2020 年で、次は 2048 年です。同様に、金曜日に始まる平年は 2027 年、2038 年、そして 2049 年です。閏年がスキップされない限り、これらの記述は両方とも当てはまりますが、閏年がスキップされるのは 2100 年までありません。
詳細については、以下の表を参照してください。
注:
- 黒は平年のすべての月を表す
- 赤はうるう年の最初の2か月を意味します
- 青はうるう年の最後の10か月を意味します
対応する世紀
「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 年がうるう年であることを示します。うるう年にのみ JanとFeb を使用します。
曜日を決定するために(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 余り 7。2015 年は 1315 より 700 年先なので、1315 が使用されます。表より: 百の位 (13): 6。残りの数字 (15): 4。月 (1 月): 0。日付 (27): 27。6 + 4 + 0 + 27 + 50 − 14 = 73。73 /7=10 余り 3。曜日 = 火曜日。
主教の手紙
主日文字を見つけるには、1 月 1 日または 10 月 1 日の曜日を計算します。日曜日の場合、主日文字は A、土曜日の場合は B です。同様に、週を逆順にたどり、アルファベットを月曜日まで進めて G になります。
閏年は日曜日の文字が 2 つあるため、1 月と 2 月の場合は 1 月 1 日の曜日を計算し、3 月から 12 月の場合は 10 月 1 日の曜日を計算します。
閏年は、次の例外を除き、ちょうど 4 で割り切れる年です。
グレゴリオ暦では、ちょうど 100 で割り切れるすべての年 (ちょうど 400 で割り切れる年を除く)。
改訂ユリウス暦では、ちょうど 100 で割るすべての年 (900 で割った余りが 200 または 600 になる年を除く)。
「終末の日」
これは娯楽数学の産物です。説明については 終末の法則を参照してください。
結果を確認する
この表を使用すると、計算なしで曜日を見つけることができます。
例:
- 一般的な方法
- 1893年12月26日(GD)
12 月は行Fにあり、 26 は列Eにあるので、日付の文字は行F列Eにある 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) は曜日 (土曜日) になります」です。
サンデーレター方式
1 年の各日 (2 月 29 日を除く) には、ABCDEFG の繰り返しシーケンスで文字が割り当てられています。シーケンスは 1 月 1 日の A から始まり、12 月 31 日に再び A に戻ります。日曜日の文字は、1 年のすべての日曜日に適用される文字です。2 月 29 日には文字がないため、3 月から 12 月までの日曜日の文字は、1 月と 2 月の文字と比較してシーケンスが 1 つ後退していることになります。日付の文字は、「ラテン方陣」の左側の月 (黒色) の行と、「ラテン方陣」の上にある日付の列が交わる場所にあります。日曜日の文字は、「ラテン方陣」の下にある世紀を含む列と、「ラテン方陣」の右側にある年の最後の 2 桁の行が交わる場所にあります。閏年の場合、このようにして見つかった日曜日の文字は、3 月から 12 月に適用する文字です。
たとえば、2020 年 6 月 16 日の曜日を検索するには、次のようにします。
列「20」は行「20」と「D」で交わります。行「6月」は列「16」と「F」で交わります。FはDから2文字先なので、曜日は日曜日から2日後、つまり火曜日になります。
数学アルゴリズム
ラタ・ダイ
Rata Die方式は、既知の曜日Dの日付から経過した日数d を加算することによって機能します。曜日は、D をエンコードするために使用された規則に従って、( D + d ) mod 7で与えられます。
たとえば、2009 年 8 月 13 日は西暦 1 年 1 月 1 日から 733632 日です。この数値を 7 で割ると 4 となり、木曜日になります。
ガウスのアルゴリズム
カール・フリードリヒ・ガウスは、天文表集の中の手書きのメモに、任意の年の1月1日の曜日を計算する方法を記した。[5]彼はそれを公表することはなかったが、1927年にようやく彼の著作集に収録された。 [6]ラタ・ディエと比較すると、この結果は年の数え方を簡素化するのに役立つ。
ガウスの方法はグレゴリオ暦に適用可能でした。彼は日曜日から始まり、曜日を 0 から 6 まで番号付けしました。彼は次の演算を定義しました。
- 入力
- 年番号A、月番号M、日番号D。
- 出力
- 年の何日目か。
- 手順
-
- まず、1 月 1 日の曜日d 1を決定します。
- グレゴリオ暦の場合、曜日は[5]
(1 + 5(( A −1) % 4) + 4(( A −1) % 100) + 6(( A −1) % 400)) % 7です。あるいは、C = A \ 100、Y = 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です。
- グレゴリオ暦の場合、曜日は[5]
- ここで、 Mを使用した参照テーブルを使用して、月関連のオフセットmを決定します。
- d = ( d 1 + m + D ) % 7を返します。
- まず、1 月 1 日の曜日d 1を決定します。
上記の手順は、グレゴリオ暦の場合、1つの式にまとめることができます:
(D + m + 5(( A −1)%4) + 4(( A −1)%100) + 6(( A −1)%400))%7
実例
2000年の場合、A − 1 = 1999、Y − 1 = 99、C = 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 = 土曜日。
- = (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は月内の日(1~31)
- m はシフトされた月です (3 月 = 1、...、2 月 = 12)
- Yは年である。ただし、mが11 = 1月または12 = 2月の場合は前年の一部とみなされ、Y = 年 − 1となる。
- cは世紀を表す。
- yは世紀に対する年で、 で与えられるか、単にYの最後の2桁です。
- w は曜日です (0 = 日曜日、...、6 = 土曜日)
ツェラーのアルゴリズム
ツェラーのアルゴリズムでは、月は3月を3として2月を14として数えられる。年は3月に始まると仮定される。つまり、例えば1995年1月は1994年の13月として扱われる。[9]
グレゴリオ暦の式は
次のように
なる。
- 月の日付(1~31)
- シフトされた月です(3月=3、...1月=13、2月=14)
- 13 = 1月または14 = 2月でない限り、年は前年の一部とみなされ、
- 世紀は
- は世紀に対する年で、 で表されます。または単に の最後の2桁です。
- 曜日です(1 = 日曜日、..0 = 土曜日)
唯一の違いは、Zellerアルゴリズム(Z)とDisparate Gaussianアルゴリズム(G )の間の1つであり、 Z − G = 1 = Sundayです。
- ( Zでは3月は3ですが、Gでは3月は1です)
王のアルゴリズム
グレゴリオ暦の人間による計算のための王のアルゴリズム[10]は(mが1の場合は式から1を減算し、閏年の場合は2を減算する)
である。
- は年号の最後の桁(単位)です
- は年の最後の2番目の数字(十の位)です
- は世紀であり、
- は月の日数です(1~31)
- は月です(1月=1、...、12月=12)
- は曜日です(0=日曜日、...、6=土曜日)
- は、次の表にリストされている値を持つヌル日関数(月オフセット)です。
ユリウス暦のアルゴリズムは、 が終末の日で ある上記のアルゴリズムから導き出すことができます 。
その他のアルゴリズム
シュヴェルトフェガー法
シュヴェルトフェガーによる部分的に表形式の方法では、年は世紀とその中の2桁の年に分割されます。アプローチは月によって異なります。m ≥ 3の場合、
gは0から99の間です。m = 1,2の場合、
曜日の計算式は[6]
ここで正の係数が選択されます。[6]
eの値は次の表から得られます。
fの値は、暦に応じて次の表から得られる。グレゴリオ暦の場合、[6]
ユリウス暦の場合、[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) は除きます。
最終結果は曜日を示し、「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」で、これは消えます。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、、mはdそれぞれ、年 (例: 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。この式は、ツェラーのアルゴリズムよりも扱いにくい月コンポーネントを使用しています。
その後まもなく、ハンス・ラックマンは、ローエンドのデバイスでも使いやすいようにアルゴリズムを簡素化しました。もともと4機能計算機用に設計された彼の方法では、範囲を西暦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 ]; % 共通年
% オフセット 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 * rem ( y , 100 ) \
+ 6 * rem ( y , 400 ) , 7 ))
( '日' 、 '月' 、 '火' 、 '水' 、 '木' 、 '金' 、 '土' )[ wd ]を返します
参照
参考文献
注記
- ^ これを詳しく説明するには、月が日曜日から始まるカレンダーを思い浮かべると便利です。つまり、 月の 1 日は日曜日です。7 日数えると 8 日になりますが、これも日曜日です。さらに 10 日数えると 18 日になりますが、これは水曜日です。代わりに、4 日水曜日 (1 日日曜日の 3 日後) から始めて、7 日数えて 11 日水曜日 (8 日日曜日の 3 日後) になり、さらに 7 日数えると、18 日水曜日になります。 これは、15 日日曜日の 3 日後で あり、 15 日日曜日自体は、1 日日曜日のちょうど 2 週間後 (2 つの日曜日) にあたります。
- ^ 最初の列の数字は先駆的なものです。グレゴリオ暦は 1582 年まで考案されていませんでした。表の下の注記を参照してください。
- ^ 紀元前 1 年に始まるユリウス暦もこの表の行 (700 の左側) に表示されますが、それを含めるスペースがありません。
引用
- ^ ab Brothers, Hardin; Rawson, Tom ; Conn, Rex C .; Paul, Matthias R.; Dye, Charles E.; Georgiev, Luchezar I. (2002-02-27). 4DOS 8.00 オンラインヘルプ。
- ^ 「HP Prime - Portal: ファームウェア アップデート」(ドイツ語)。Moravia Education。2015 年 5 月 15 日。2016 年 11 月 5 日時点のオリジナルよりアーカイブ。2015年 8 月 28 日閲覧。
- ^ ポール、マティアス R. (1997-07-30)。 NWDOS-TIP — Novell DOS 7 に関するヒントとコツ、詳細、バグ、回避策を含む Blick です。リリース 157 (ドイツ語) (第 3 版)。 2016-11-04 のオリジナルからアーカイブ。2014 年 8 月 6 日に取得。(注:これはNovell DOS 7およびOpenDOS 7.01
NWDOSTIP.TXTに関する包括的な作業であり、多くの文書化されていない機能と内部の説明が含まれています。これは、2001 年まで維持され、当時多くのサイトで配布されていた著者のさらに大規模なコレクションの一部です。提供されているリンクは、HTML に変換された古いバージョンのファイルを指し示しています。)MPDOSTIP.ZIPNWDOSTIP.TXT - ^ リチャーズ、EG (1999)。時間のマッピング:カレンダーとその歴史。オックスフォード大学出版局。ISBN 978-0-19-850413-9。
- ^ 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。
- ^ abcdef Schwerdtfeger, Berndt E. (2010-05-07). 「ガウスの曜日の暦式」(PDF) (1.4.26 版) 。2012年12月23日閲覧。
- ^ クライチク、モーリス (1942)。「第 5 章: 暦」。数学的レクリエーション(第 2 版 [ドーバー] 改訂版)。ミネオラ:ドーバー出版。pp. 109–116。ISBN 978-0-48645358-3。
- ^ ローゼン、ケネス H. (2011)。初等数論とその応用。アディソン・ウェスレー。pp. 134–137。ISBN 978-0321500311。
- ^ Stockton, JR (2010-03-19). 「Rektor Chr. Zeller の暦法: 曜日とイースターの式」Merlyn。 2013-07-29 にオリジナルからアーカイブ。2012-12-19に閲覧。
- ^ Wang, Xiang-Sheng (2015 年 3 月)。「曜日の計算: null-days アルゴリズム」(PDF)。レクリエーション数学マガジン。第 3 号、p. 5。
- ^ ab Dodgson, CL ( Lewis Carroll )。(1887)。「任意の日付の曜日を見つける」。Nature 、1887年3月31日。Mapping Time、pp. 299-301に再掲載。
- ^ マーティン・ガードナー (1996)。『 ハンカチの中の宇宙:ルイス・キャロルの数学的レクリエーション、ゲーム、パズル、言葉遊び』、24-26ページ。シュプリンガー・フェアラーク。
- ^ Michael Keith、Tom Craver (1990)。究極の永久カレンダー? Journal of Recreational Mathematics、22:4、pp.280-282。
- ^ 4関数電卓、モトローラ68000孤児の集合、そろばん。gopher://sdf.org/1/users/retroburrowers/TemporalRetrology
- ^ 「曜日アルゴリズムが必要!」ニュース:1993Apr20.075917.16920@sm.sony.co.jp
- ^ APL2 IDIOMS ワークスペース: 日付と時刻のアルゴリズム、15 行目。ftp://ftp.software.ibm.com/ps/products/apl2/info/APL2IDIOMS.pdf [永久リンク切れ ] (2002)
- ^ 「日付 -> 曜日変換」。Googleニュースグループ:comp.lang.c。1992 年 12 月。2020 年 6 月 21 日閲覧。
- ^ 「DOWアルゴリズム」。Googleニュースグループ:comp.lang.c。 1994年。 2020年6月21日閲覧。
さらに読む
- Hale-Evans, Ron (2006)。「Hack #43: 平日を計算する」。マインドパフォーマンスハック(第 1 版)。北京: O'Reilly。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 。
- Treffert, Darold A. (2011-10-12) 「なぜカレンダー計算をするのか?」天才の島々: 自閉症、後天性、突発性サヴァントの豊かな心(第 1 版、[再版] 版) ロンドン: Jessica Kingsley。pp. 63–66。ISBN 9781849058735。
外部リンク
- グレゴリオ暦とユリウス暦の両方に対応するTønderingのアルゴリズム
- 計算と記憶を減らすために「キーデイ」方式を採用
- 記憶のためのコンパクトな表形式方式、ユリウス暦にも対応
- 各国がユリウス暦から変更したとき
- グレゴリオ暦の曜日を暗算する世界記録
- カレンダーの日付を見つけるための全国記録
- メモリアードメンタルカレンダー日付の世界ランキング(全競技を合わせた)
- 月、日、曜日を指定して年を特定します。2018-01-04 にWayback Machineでアーカイブされました
