Формула Зеллера
Формула Зеллера — это алгоритм для вычисления дня недели по дате (числу, месяцу и году) григорианского или юлианского календаря. Предложена немецким математиком Кристианом Зеллером (Christian Zeller) в 1882 году. Формула позволяет определить, на какой день недели приходится любая дата в пределах действия используемого календаря, и широко применяется в программировании, математических расчётах и исторических исследованиях для проверки календарных данных.
История
Кристиан Зеллер (1822—1899) был профессором математики в Королевском реальном училище в Мюльхаузене (ныне Мюлуз, Франция). В 1882 году он опубликовал статью «Die Tagesformel» (нем. «Формула дня»), в которой представил метод вычисления дня недели. Изначально формула была разработана для юлианского календаря, но вскоре была адаптирована для григорианского, который был введён в католических странах в 1582 году и постепенно принят в других государствах. Зеллер также создал несколько вариантов формулы, включая упрощённые версии для практических вычислений.
В XIX веке, когда не существовало электронных вычислительных устройств, формула позволяла быстро определять день недели вручную, что было полезно для составления календарей, планирования событий и исторических исследований. С развитием компьютерной техники алгоритм Зеллера стал одним из стандартных методов для реализации календарных функций в языках программирования.
Математическая формулировка
Формула Зеллера для григорианского календаря имеет несколько эквивалентных вариантов. Один из наиболее распространённых:
\[ h = \left( q + \left\lfloor \frac{13(m+1)}{5} \right\rfloor + K + \left\lfloor \frac{K}{4} \right\rfloor + \left\lfloor \frac{J}{4} \right\rfloor - 2J \right) \mod 7 \]
где:
- \( h \) — день недели (0 = суббота, 1 = воскресенье, 2 = понедельник, ..., 6 = пятница);
- \( q \) — число месяца (1–31);
- \( m \) — номер месяца (3 = март, 4 = апрель, ..., 14 = февраль);
- \( K \) — две последние цифры года (год по модулю 100);
- \( J \) — две первые цифры года (год, делённый на 100, с округлением вниз);
- \(\lfloor x \rfloor\) — операция взятия целой части (пол).
Особенность формулы: январь и февраль считаются как 13-й и 14-й месяцы предыдущего года. Например, для даты 1 января 2023 года год берётся как 2022, а месяц — как 13.
Вариант для юлианского календаря
Для юлианского календаря формула упрощается:
\[ h = \left( q + \left\lfloor \frac{13(m+1)}{5} \right\rfloor + K + \left\lfloor \frac{K}{4} \right\rfloor + 5 - J \right) \mod 7 \]
Здесь \( J \) и \( K \) определяются аналогично, но вместо \(-2J\) используется \(5 - J\).
Алгоритм вычисления
Для практического применения формулу можно разбить на шаги:
- Преобразование месяца и года: если месяц — январь (1) или февраль (2), то к номеру месяца прибавляется 12, а год уменьшается на 1.
- Вычисление слагаемых:
- \( q \) — число месяца;
- \( a = \left\lfloor \frac{13(m+1)}{5} \right\rfloor \);
- \( b = K \);
- \( c = \left\lfloor \frac{K}{4} \right\rfloor \);
- \( d = \left\lfloor \frac{J}{4} \right\rfloor \);
- \( e = -2J \) (для григорианского) или \( 5 - J \) (для юлианского).
- Суммирование: \( S = q + a + b + c + d + e \).
- Взятие остатка: \( h = S \mod 7 \).
- Интерпретация: полученное число \( h \) сопоставляется с днём недели по таблице.
Пример
Дата: 15 марта 2023 года (григорианский календарь).
- \( q = 15 \), \( m = 3 \), \( K = 23 \), \( J = 20 \).
- \( a = \lfloor 13 \cdot (3+1) / 5 \rfloor = \lfloor 52 / 5 \rfloor = 10 \).
- \( b = 23 \), \( c = \lfloor 23 / 4 \rfloor = 5 \), \( d = \lfloor 20 / 4 \rfloor = 5 \), \( e = -2 \cdot 20 = -40 \).
- \( S = 15 + 10 + 23 + 5 + 5 - 40 = 18 \).
- \( h = 18 \mod 7 = 4 \).
- 4 соответствует среде. Проверка: 15 марта 2023 года — среда.
Применение
Формула Зеллера используется в различных областях, где требуется автоматическое определение дня недели:
- Программирование: реализация календарных функций в языках (C, Python, JavaScript, Java и др.). Многие библиотеки, например,
datetimeв Python, используют аналогичные алгоритмы, основанные на формуле Зеллера. - Исторические исследования: проверка достоверности дат в древних документах, расчёт дня недели для событий прошлого (например, определение, на какой день недели приходилось 1 января 1000 года).
- Математическое образование: пример применения модульной арифметики и целочисленных операций.
- Планирование: расчёт календарей для печати, определение дней недели для будущих дат.
Ограничения и особенности
- Календарная система: формула корректна только для дат, соответствующих правилам григорианского или юлианского календаря. Для дат до введения григорианского календаря (1582 год) или до введения юлианского (45 год до н. э.) результат может быть неверным из-за исторических календарных реформ.
- Переходные даты: в странах, где григорианский календарь был введён в разное время, формула даёт результат для современного календаря. Для исторических дат в России (до 1918 года) следует использовать юлианский вариант.
- Отрицательные значения: при вычислении \( S \) может получиться отрицательное число. В этом случае к нему прибавляется 7 до получения положительного остатка.
- Високосные годы: формула автоматически учитывает високосные годы через слагаемые \( \lfloor K/4 \rfloor \) и \( \lfloor J/4 \rfloor \), поэтому дополнительных корректировок не требуется.
Интересные факты
- Формула Зеллера иногда называется «конгруэнция Зеллера» (Zeller’s congruence). Термин «конгруэнция» подчёркивает использование модульной арифметики.
- Существует упрощённая версия формулы для вычисления дня недели без учёта столетий, например, для дат в пределах одного века.
- В 1886 году Зеллер опубликовал модификацию, позволяющую вычислять день недели для дат до 1582 года, используя юлианский календарь.
- Алгоритм Зеллера лёг в основу многих компьютерных календарей, включая ранние реализации в операционных системах.
Источники
- Zeller, Christian. «Die Tagesformel». Mathematische Annalen, 1882.
- Zeller, Christian. «Die Tagesformel für das julianische und gregorianische Kalender». Mathematische Annalen, 1886.
- Кнут, Дональд. «Искусство программирования», том 1, раздел 1.3.2 — описание алгоритма Зеллера.
- Энциклопедия Britannica, статья «Zeller’s formula».
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →