Людина може не пам’ятати, що їла на сніданок три дні тому, однак день тижня власного народження зазвичай викликає живий інтерес. Хтось вірить що він впливає на долю, хтось просто хоче відновити забуту деталь біографії. Розв’язати цю маленьку загадку можна кількома способами – від математичних формул, що працюють для будь-якої дати за останні кілька століть до елегантних табличних рішень які вимагають мінімум зусиль. У цій статті ми розберемо всі робочі методи без містики й здогадок.
Звісно, найпростіший шлях – увімкнути смартфон, відкрити календар і гортати до потрібного року. Але що робити, коли інтернету немає або хочеться зрозуміти логіку? Саме тоді стають у пригоді алгоритми які людство шліфувало століттями. І тут починається найцікавіше…
Алгоритм Зеллера: математична основа
Формула, яку запропонував німецький математик Крістіан Целлер у XIX столітті, досі лишається найпопулярнішою серед програмістів і любителів календарних обчислень. Вона дає змогу визначити день тижня для будь-якої дати – хоч юліанської, хоч григоріанської, – і потребує лише знання арифметики на рівні початкової школи.
Основний трюк полягає в тому, що січень і лютий розглядаються як 13-й та 14-й місяці попереднього року. Тобто 15 лютого 2020 року для формули стає 15-м днем 14-го місяця 2019 року. Це дає змогу уникнути проблем із високосними роками під час обчислень. Формула для григоріанського календаря має такий вигляд:
h = (q + ⌊(13(m+1))/5⌋ + K + ⌊K/4⌋ + ⌊J/4⌋ – 2J) mod 7
Тут:
- q – число місяця;
- m – номер місяця, причому березень = 3, квітень = 4 … січень = 13, лютий = 14;
- K – рік століття (останні дві цифри року);
- J – століття (перші дві цифри року).
Результат h – число від 0 до 6, де 0 відповідає суботі, 1 – неділі, 2 – понеділку і так далі до п’ятниці (6). Таке зміщення пов’язане з оригінальною домовленістю автора але його легко запам’ятати: 0 – вихідний суботній.
Наприклад обчислимо день тижня для 24 серпня 1991 року – дати що увійшла в історію. Серпень – 8-й місяць тож m=8, q=24. Рік 1991: K=91, J=19. Підставляємо:
⌊(13*(8+1))/5⌋ = ⌊117/5⌋ = 23;
⌊K/4⌋ = ⌊91/4⌋ = 22;
⌊J/4⌋ = ⌊19/4⌋ = 4;
-2J = -38;
Сума = 24 + 23 + 91 + 22 + 4 – 38 = 126;
126 mod 7 = 0 (бо 7×18=126).
0 – це субота за системою Зеллера. І справді 24 серпня 1991 року припало на суботу. Точність бездоганна, хоча на перший погляд формула може налякати.
Для юліанського календаря (який діяв до 1582 року а в деяких країнах ще довше) формула спрощується: забирається доданок -2J додається +5. Тобто h = (q + ⌊(13(m+1))/5⌋ + K + ⌊K/4⌋ + 5 – J) mod 7. Але у побуті більшість дат усе ж григоріанські.
Формула Гаусса для обчислення дня тижня
Карл Фрідріх Гаус запропонував власний метод, який теж не потребує нічого крім олівця та аркуша паперу. Його підхід дещо відрізняється розбивкою на місячні коефіцієнти але суть та сама – звести все до модульної арифметики. І хоча алгоритм Зеллера зустрічається частіше формула Гаусса має своїх шанувальників, особливо серед тих, хто полюбляє таблиці.
Для григоріанської дати виконуємо такі кроки:
A = номер дня в місяці.
B = номер місяця але з поправкою: після березня все стандартно а січень та лютий зсуваються.
C = рік (якщо місяць січень або лютий – беремо попередній рік).
Далі шукаємо допоміжні величини Y = C mod 100, Z = ⌊C/100⌋. І головна формула:
W = (A + ⌊(13B – 1)/5⌋ + Y + ⌊Y/4⌋ + ⌊Z/4⌋ – 2Z) mod 7
Тут W = 0 означає неділю, 1 – понеділок і так далі. Майже дзеркальне відображення методу Зеллера, лише вага днів тижня трішки інакша. На практиці ви зможете використовувати будь-яку із формул результат збігатиметься.
Варто пам’ятати що при роботі з датами до 15 жовтня 1582 року (коли було запроваджено григоріанський календар) слід обережно обирати версію алгоритму. Для старих записів у церковних книгах часто потрібна юліанська модифікація.
Табличний спосіб визначення
Не кожному до вподоби математичні маніпуляції. На щастя існують так звані вічні календарі – таблиці які тримають у собі всі необхідні зміщення. Маючи під рукою аркуш із числами ви просто знаходите перетин потрібного року місяця й дня. Це може виглядати трохи незграбно зате не вимагає жодних обчислень.
Принцип такої таблиці простий: кожному році призначається код (від 0 до 6), кожному місяцю – свій ключ, а день тижня визначається сумою коду року коду місяця і числа місяця по модулю 7. Для прикладу наведу фрагмент кодів місяців для звичайного року: січень – 0, лютий – 3, березень – 3, квітень – 6, травень – 1, червень – 4, липень – 6, серпень – 2, вересень – 5, жовтень – 0, листопад – 3, грудень – 5. Для високосного року січень отримує 6, лютий – 2. Код року вираховується за простою формулою або береться з готового списку. Легко перевірити що для 24 серпня 1991 року: код року 1991 – 0, код серпня – 2, додаємо 24 отримуємо 26 mod 7 = 5 (п’ятниця?). Ні тут слід пам’ятати що в таких календарях нумерація може починатися з неділі або суботи тому варто уточнити конкретну систему. Але сам підхід працює безвідмовно, варто лише один раз розібратись.
Використання вічних календарів
Вічні календарі існують не лише на папері. У вигляді невеликого додатку на телефон або навіть механічного пристрою – коліщатка з цифрами – вони рятували мандрівників ще до появи смартфонів. Сьогодні ж достатньо відкрити будь-який сайт із вічним календарем ввести дату й одразу побачити день тижня. Це, звісно, не несе тієї романтики самостійного розрахунку але, погодьтеся, коли треба швидко дізнатися день народження прабабусі – дуже зручно.
Цікаво що подібні таблиці іноді використовують у судових справах для уточнення хронології подій. Адже помилка на один день може змінити весь перебіг розслідування. Отож не така вже й застаріла ця технологія.
Сучасні онлайн-сервіси та мобільні додатки
Звісно, якщо під рукою є інтернет. Більшість із нас навіть не замислюється над алгоритмами – просто вводить запит «день тижня за датою» і отримує відповідь за частку секунди. Популярні сервіси на кшталт timeanddate.com або calndar.com мають зручні калькулятори які миттєво обробляють будь-який рік у межах від 1 до 4000 і далі. Вони враховують усі календарні реформи, перехід із юліанського на григоріанський стиль у різних країнах і навіть локальні особливості.
Окремо варто згадати мобільні застосунки – від простеньких «Day of the Week Calculator» до потужних генеалогічних програм. Вони не тільки підкажуть день тижня а й дозволять створити хронологію родинних дат. І жодної математики хоча в основі лежать ті самі формули.
Але є нюанс. Під час роботи з датами до 1582 року треба обов’язково перевіряти який календар за замовчуванням використовує сервіс – юліанський чи григоріанський. Інакше можна отримати день тижня зі зміщенням на кілька діб що для історичних досліджень критично.
Коротко про основні групи інструментів:
- Веб-калькулятори з відкритим кодом – безкоштовні, не потребують встановлення, працюють навіть на повільному інтернеті.
- Мобільні додатки з офлайн-режимом – зберігають таблиці локально тому доступні у будь-який момент.
- Програмні бібліотеки для розробників (Python, JavaScript) – містять готові функції але вимагають базових технічних знань.
Та перш ніж повністю покластися на код, варто хоча б раз спробувати порахувати вручну. Це дає дивовижне відчуття контролю над часом.
Порівняння методів визначення дня тижня за ключовими характеристиками:
| Метод | Складність для новачка | Потрібні інструменти | Точність (григор. календар) | Швидкість після освоєння |
|---|---|---|---|---|
| Алгоритм Зеллера | Помірна – треба вивчити формулу та зробити 6 арифметичних дій | Олівець, папір (або усний рахунок) | Абсолютна | 30–60 секунд після тренування |
| Формула Гаусса | Вище середньої – схожа на Зеллера, але власна система індексів | Папір, таблиця місячних коефіцієнтів | Абсолютна | Близько хвилини |
| Табличний (вічний календар) | Низька – лише пошук перетину рядків і стовпців | Роздрукована таблиця або додаток-калькулятор | Висока, якщо таблиця враховує високосні роки | 5–10 секунд |
| Онлайн-сервіс / додаток | Мінімальна – достатньо ввести дату | Смартфон або комп’ютер з інтернетом | Абсолютна (за умови коректного календаря) | Миттєво |
Звісно, для більшості повсякденних ситуацій онлайн-калькуляторів цілком достатньо. Але якщо ви опинилися в поході або просто хочете вразити друзів інтелектуальним фокусом алгоритм Зеллера стане вашим козирем.
Цікавий факт: деякі люди навчилися виконувати ці обчислення подумки за лічені секунди використовуючи спрощені версії формул. Вони тримають у голові таблицю зміщень для кожного місяця і додають лише три числа. Це, насправді, навіть не феноменальна пам’ять а лише правильно організована система асоціацій. А ви б хотіли так уміти?
Ще одна деталь яку часто пропускають у популярних статтях – це різниця між юліанським та григоріанським календарями в момент переходу. Наприклад, в Україні григоріанський календар було запроваджено в різний час залежно від регіону: на Заході раніше, на Сході – після 1918 року. Тому, обчислюючи день тижня для родинної дати з XIX століття, обов’язково з’ясуйте яким стилем послуговувалися в тій місцевості. Інакше можна отримати результат зміщений на кілька днів і марно гадати чому прадідова середа раптом стала четвергом.
Загалом, визначення дня тижня власного народження – це не просто гра з цифрами. Це маленька подорож у систему літочислення яку людство шліфувало століттями. Від стародавнього Риму з його хаотичними місяцями до сучасних атомних годинників календар завжди був спробою впорядкувати час. І коли ви тримаєте в руках олівець та за допомогою формули дізнаєтеся що ваш день народження припав, скажімо, на п’ятницю, ви ніби зазираєте в саму механіку цього впорядкування.
Практична порада: якщо ви часто потребуєте таких обчислень, роздрукуйте невелику таблицю кодів років на найближчі 20–30 років і повісьте біля робочого місця. Разом із ключами місяців вона займе менше аркуша А5 а зекономить купу часу. А вечорами можна тренуватися на датах історичних подій – це чудова гімнастика для мозку яка до того ж розширює кругозір.
Отже, незалежно від того оберете ви математичну глибину Целлера чи зручність сучасного додатку, таємницю дня тижня вашого народження розкрито. Це набагато простіше ніж здається на перший погляд. А головне – тепер ви можете поділитися цим знанням із близькими адже у кожного є дата яка заслуговує на крапку у вигляді правильного дня тижня. І нехай цей день стане ще одним приводом для цікавої розмови за родинним столом.