Сравнение Целлера - Zeller's congruence
Сравнение Зеллера - это алгоритм, разработанный Кристианом Целлером для вычисления дня недели для любой даты в юлианском или григорианском календаре . Можно считать, что он основан на преобразовании между юлианским днем и календарной датой.
Формула
Для григорианского календаря сравнение Целлера
для юлианского календаря это
куда
- h - день недели (0 = суббота, 1 = воскресенье, 2 = понедельник, ..., 6 = пятница)
- q - день месяца
- m - месяц (3 = март, 4 = апрель, 5 = май, ..., 14 = февраль)
- K год века ( ).
- J - век с отсчетом от нуля (на самом деле ). Например, века с отсчетом от нуля для 1995 и 2000 годов равны 19 и 20 соответственно (не путать с обычным порядковым перечислением столетий, которое указывает 20-е в обоих случаях).
- это функция пола или целая часть
- mod - операция по модулю или остаток после деления
В этом алгоритме январь и февраль считаются 13 и 14 месяцами предыдущего года. Например, если это 2 февраля 2010 года, алгоритм считает дату вторым днем четырнадцатого месяца 2009 года (14.02.2009 в формате ДД / ММ / ГГГГ).
Для недельной даты ISO День недели d (1 = с понедельника по 7 = воскресенье) используйте
Анализ
Эти формулы основаны на наблюдении, что день недели изменяется предсказуемым образом на основе каждой части этой даты. Каждый член в формуле используется для вычисления смещения, необходимого для получения правильного дня недели.
Поэтому для григорианского календаря различные части этой формулы можно понимать следующим образом:
- представляет прогрессию дня недели в зависимости от дня месяца, поскольку каждый последующий день приводит к дополнительному смещению 1 в день недели.
- представляет собой изменение дня недели в зависимости от года. Предполагая, что каждый год длится 365 дней, одна и та же дата в каждом последующем году будет смещена на значение .
- Поскольку в каждом високосном году 366 дней, это необходимо учитывать, добавляя еще один день к значению смещения дня недели. Это достигается добавлением к смещению. Этот член рассчитывается как целочисленный результат. Любой остаток отбрасывается.
- Используя аналогичную логику, прогрессию дня недели для каждого столетия можно рассчитать, наблюдая, что 36524 дня в нормальном столетии и 36525 дней в каждом столетии делятся на 400. Так как и , термин учитывает это.
- Срок корректируется с учетом количества дней месяца. Начиная с января дни в месяце: {31, 28/29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}. Дни 28 или 29 февраля являются проблемой, поэтому формула переносит январь и февраль до конца, поэтому короткий счет февраля не вызовет проблемы. Формула интересуется днями недели, поэтому числа в последовательности можно взять по модулю 7. Тогда количество дней в месяце по модулю 7 (все еще начиная с января) будет {3, 0/1, 3, 2 , 3, 2, 3, 3, 2, 3, 2, 3}. Начиная с марта, последовательность в основном чередуется 3, 2, 3, 2, 3, но каждые пять месяцев подряд идут два 31-дневных месяца (июль – август и декабрь – январь). Дробь 13/5 = 2,6 и функция пола имеют этот эффект; знаменатель 5 устанавливает период в 5 месяцев.
- Общая функция нормализует результат, чтобы он находился в диапазоне от 0 до 6, что дает индекс правильного дня недели для анализируемой даты.
Причина, по которой формула отличается для юлианского календаря, заключается в том, что в этом календаре нет отдельного правила для високосных столетий и он смещен от григорианского календаря на фиксированное количество дней в каждом столетии.
Поскольку григорианский календарь был принят в разное время в разных регионах мира, местоположение события имеет важное значение для определения правильного дня недели для даты, которая произошла в течение этого переходного периода. Это требуется только до 1929 года, поскольку это был последний год, когда юлианский календарь все еще использовался какой-либо страной на Земле, и, следовательно, не требуется для 1930 года или позже.
Формулы могут использоваться пролептически , но «Год 0» фактически соответствует 1 году до нашей эры (см. Нумерацию астрономических лет ). Юлианский календарь фактически является пролептическим вплоть до 1 марта 4 г. н.э. из-за плохого управления в Риме (но не в Египте) в период, когда календарь был введен в действие 1 января 45 г. до н.э. (который не был високосным). Кроме того, оператор по модулю может обрезать целые числа в неправильном направлении (потолок вместо пола). Чтобы учесть это, можно добавить достаточное число, кратное 400 по григорианскому календарю или 700 юлианским годам.
Примеры
Для 1 января 2000 года датой будет считаться 13-й месяц 1999 года, поэтому значения будут следующими:
Таким образом, формула оценивается как .
(36 происходит от , усеченное до целого числа.)
Однако для 1 марта 2000 года датой считается 3-й месяц 2000 года, поэтому значения становятся
поэтому формула оценивается как .
Реализации в программном обеспечении
Базовая модификация
Формулы основаны на математическом определении деления по модулю , что означает, что −2 mod 7 равно положительному 5. К сожалению, усекающим способом большинство компьютерных языков реализует функцию остатка, −2 mod 7 возвращает результат −2. Итак, чтобы реализовать сравнение Целлера на компьютере, формулы следует немного изменить, чтобы числитель был положительным. Самый простой способ сделать это - заменить - 2 J на + 5 Дж и - J на + 6 Дж . Таким образом формулы становятся:
по григорианскому календарю и
по юлианскому календарю.
Нетрудно увидеть, что в данном году 1 марта (если это суббота, то 2 марта) является хорошей датой для проверки; и что в данном столетии лучший тестовый год - это год, кратный 100.
Общее упрощение
Зеллер использовал десятичную арифметику и нашел удобным использовать J и K для обозначения года. Но при использовании компьютера проще обрабатывать измененные год Y и месяц m , которые равны Y - 1 и m + 3 в течение января и февраля:
для григорианского календаря (в этом случае нет возможности переполнения, потому что ), и
по юлианскому календарю.
Вышеупомянутый алгоритм упоминается для григорианского случая в RFC 3339 , Приложение B, хотя и в сокращенной форме, которая возвращает 0 для воскресенья.
Другие варианты
По крайней мере, три других алгоритма разделяют общую структуру сравнения Целлера в его типе «общего упрощения», также используя m ∈ [3, 14] ∩ Z и конструкцию «модифицированный год».
- Майкл Кейт опубликовал отрывок очень короткого кода C в 1990 году для григорианских дат. Компонент длины месяца ( ) заменяется на .
- Дж. Р. Стоктон предлагает версию Sunday-is-0 , назвав ее разновидностью Zeller.
- Клаус Тёндеринг описывает как замену.
Можно показать, что оба выражения прогрессируют на единицу по сравнению с исходным компонентом длины месяца в требуемом диапазоне m , что приводит к начальному значению 0 для воскресенья.
Смотрите также
использованная литература
Библиография
В каждом из этих четырех похожих листов с изображениями, во-первых, рассматривается день недели, а во-вторых, дата пасхального воскресенья для юлианского и григорианского календарей. На страницах есть ссылки на переводы на английский язык.
- Целлер, Кристиан (1882). "Die Grundaufgaben der Kalenderrechnung auf neue und vereinfachte Weise gelöst" . Württembergische Vierteljahrshefte für Landesgeschichte (на немецком языке). V : 313–314. Архивировано из оригинального 11 - го января 2015 года.
- Целлер, Кристиан (1883). «Проблема дуплекса Calendarii Fundmentale» . Бюллетень математического общества Франции (на латыни). 11 : 59–61. Архивировано из оригинального 11 - го января 2015 года.
- Целлер, Кристиан (1885). «Календер-Формельн» . Mathematisch-naturwissenschaftliche Mitteilungen des Mathematisch-naturwissenschaftlichen Vereins в Вюртемберге (на немецком языке). 1 (1): 54–58. Архивировано из оригинального 11 - го января 2015 года.
- Целлер, Кристиан (1886). «Календер-Формельн» . Acta Mathematica (на немецком языке). 9 : 131–136. DOI : 10.1007 / BF02406733 .
внешние ссылки
- Календарные работы Rektor Chr. Зеллер: День недели и пасхальные формулы Дж. Р. Стоктона, недалеко от Лондона, Великобритания. На сайте представлены изображения и переводы четырех вышеуказанных статей, а также справочной карты Зеллера «Das Ganze der Kalender-Rechnung».
- Эта статья включает материалы, являющиеся общественным достоянием из документа NIST : Блэк, Пол Э. «Конгруэнтность Целлера» . Словарь алгоритмов и структур данных .