stringtranslate.com

Конгруэнтность Целлера

Сравнение Целлера — это алгоритм, разработанный Кристианом Целлером в 19 веке для вычисления дня недели для любой даты юлианского или григорианского календаря . Можно считать, что он основан на преобразовании между юлианским днем ​​и календарной датой.

Формула

Для григорианского календаря соответствие Целлера равно

для юлианского календаря это

где

Примечание: В этом алгоритме январь и февраль считаются как 13 и 14 месяцы предыдущего года. Например, если это 2 февраля 2010 года (02/02/2010 в формате ДД/ММ/ГГГГ), алгоритм считает дату вторым днем ​​четырнадцатого месяца 2009 года (14/02/2009 в формате ДД/ММ/ГГГГ)

Для даты недели ISO День недели d (1 = понедельник, 7 = воскресенье) используйте

Анализ

Эти формулы основаны на наблюдении, что день недели развивается предсказуемым образом на основе каждой подчасти этой даты. Каждый член в формуле используется для расчета смещения, необходимого для получения правильного дня недели.

Таким образом, для григорианского календаря различные части этой формулы можно понимать следующим образом:

Причина, по которой формула различается в разных календарях, заключается в том, что в юлианском календаре нет отдельного правила для високосных столетий, и он смещен относительно григорианского календаря на фиксированное количество дней в каждом столетии.

Поскольку григорианский календарь был принят в разное время в разных регионах мира, местоположение события имеет важное значение для определения правильного дня недели для даты, которая произошла в этот переходный период. Это требуется только до 1929 года, так как это был последний год, когда юлианский календарь все еще использовался какой-либо страной на земле, и, таким образом, не требуется для 1930 года или позже.

Формулы можно использовать пролептически, но «год 0» на самом деле является годом 1 до н. э. (см. астрономическую нумерацию лет ). Юлианский календарь на самом деле является пролептическим вплоть до 1 марта 4 г. н. э. из-за неправильного управления в Риме (но не в Египте) в период с момента введения календаря в действие 1 января 45 г. до н. э. (который не был високосным годом). Кроме того, оператор modulo может усекать целые числа в неправильном направлении (потолок вместо пола). Чтобы учесть это, можно добавить достаточное количество кратных 400 григорианских или 700 юлианских лет.

Примеры

Для 1 января 2000 года дата будет рассматриваться как 13-й месяц 1999 года, поэтому значения будут следующими:

Таким образом, формула оценивается как .

(36 получается из , усеченного до целого числа.)

Однако 1 марта 2000 года дата рассматривается как 3-й месяц 2000 года, поэтому значения становятся

поэтому формула оценивается как .

Реализации в программном обеспечении

Базовая модификация

Формулы основаны на математическом определении деления по модулю , что означает, что −2 mod 7 равно положительному числу 5. К сожалению, в усеченном способе, которым большинство компьютерных языков реализуют функцию остатка, −2 mod 7 возвращает результат −2. Таким образом, чтобы реализовать сравнение Целлера на компьютере, формулы следует немного изменить, чтобы обеспечить положительный числитель. Самый простой способ сделать это — заменить − 2 J на ​​+ 5 J и J на ​​+ 6 J .

Для григорианского календаря соответствие Целлера становится

Для юлианского календаря сравнение Целлера принимает вид


Легко заметить, что в данном году последний день февраля и 1 марта являются хорошими датами проверки.

В качестве примечания, если у нас есть трехзначное число abc, где a, b и c — цифры, каждая из которых неположительна, если abc неположительна; мы имеем (abc) mod 7 = 9*a + 3*b + c. Повторите формулу до одной цифры. Если результат равен 7, 8 или 9, то вычтите 7. Если же результат отрицательный, то прибавьте 7. Если результат все еще отрицательный, то прибавьте 7 еще раз. Используя этот подход, мы можем избежать беспокойства о языковых различиях в оценках mod 7. Это также может улучшить технику устного счета.

Обычное упрощение

Целлер использовал десятичную арифметику и нашел удобным использовать J и K для представления года. Но при использовании компьютера проще оперировать измененным годом Y и месяцем m , которые равны Y - 1 и m + 12 в течение января и февраля:

Для григорианского календаря соответствие Целлера становится

В этом случае нет возможности возникновения недопополнения из-за единственного отрицательного члена, поскольку .

Для юлианского календаря сравнение Целлера принимает вид

Приведенный выше алгоритм упоминается для григорианского календаря в RFC  3339, Приложение B, хотя и в сокращенной форме, которая возвращает 0 для воскресенья.

Другие вариации

По крайней мере три других алгоритма разделяют общую структуру сравнения Целлера в его типе «общего упрощения», также используя m ∈ [3, 14] ∩ Z и конструкцию «модифицированного года».

Можно показать, что оба выражения изменяются таким образом, что отклоняются на единицу по сравнению с исходным компонентом длины месяца в требуемом диапазоне m , что приводит к начальному значению 0 для воскресенья.

Смотрите также

Ссылки

  1. ^ Правило «каждых пяти месяцев» применяется только к двенадцати месяцам года, начинающимся 1 марта и заканчивающимся в последний день следующего февраля.
  2. ^ ab Stockton, J R. "Material Related to Zeller's Congruence". "Merlyn", архивировано в NCTU Taiwan .
  3. ^ Тендеринг, Клаус. «Вопросы недели». www.tondering.dk .

Библиография

Каждая из этих четырех похожих иллюстрированных статей посвящена, во-первых, дню недели, а во-вторых, дате Пасхального воскресенья по юлианскому и григорианскому календарям. Страницы ссылаются на переводы на английский язык.

Внешние ссылки