Gaussův algoritmus výpočtu Velikonoční neděle
Carl Friedrich Gauss (* 1777 – † 1855) byl geniální německý matematik a fyzik, v mnoha oborech lidského vědění zanechal nesmazatelnou stopu. Byl vynikající počtář, dráhu komety dokázal vypočítat za hodinu, jiným to v té době trvalo několik dní. Svou stopu zanechal i v kalendariografii, tehdejší vědě zabývající se kalendáři, konkrétně jde o výpočet kalendářního data Velikonoční neděle. Dle legendy na počátku byla jeho snaha zjistit přesný den svého narození. Od matky se dozvěděl jen, že to bylo osm dní před svátky Nanebevstoupení Páně, které jsou 39 dnů po Velikonoční neděli, roku 1777. Bohužel nerad zveřejňoval postupy jak k danému výsledku došel, publikoval jen vzorce a definice. Tvrdil, že hotový dům se také ukazuje bez lešení. Můžeme tedy jen odhadovat, jak k výslednému algoritmu došel. Výsledek své práce publikoval jako 23letý (to už měl doktorát) v odborném časopise Monatliche Correspondenz v srpnovém čísle z roku 1800. Ve výsledném vzorci se obešel bez výpočtu epakt, nedělních písmen a podobně. Níže se pokusím rekonstruovat sestavení konečného vzorce.
Pro začátek si zhotovíme jednoduchou tabulku jarních cyklických úplňků v závislosti na Zlatém čísle v juliánském kalendáři. První jarní cyklický úplněk může nastat nejdříve 21. března (Zlaté číslo 16) a nejpozději 18. dubna (Zlaté číslo 8). Obdobná tabulka je na stránce Výpočet Velikonoční neděle v juliánském kalendáři. Připomeňme si, že následující neděle po prvním jarním cyklickém úplňku je Velikonoční neděle. V předposledním sloupci je vždy březnové datum úplňku, přičemž platí, že 1. duben = 32. březen a podobně.
Zlaté číslo | cyklický úplněk | březen | dnů od 21.3. |
---|---|---|---|
1 | 5. dub | 36 | 15 |
2 | 25. bře | 25 | 4 |
3 | 13. dub | 44 | 23 |
4 | 2. dub | 33 | 12 |
5 | 22. bře | 22 | 1 |
6 | 10. dub | 41 | 20 |
7 | 30. bře | 30 | 9 |
8 | 18. dub | 49 | 28 |
9 | 7. dub | 38 | 17 |
10 | 27. bře | 27 | 6 |
11 | 15. dub | 46 | 25 |
12 | 4. dub | 35 | 14 |
13 | 24. bře | 24 | 3 |
14 | 12. dub | 43 | 22 |
15 | 1. dub | 32 | 11 |
16 | 21. bře | 21 | 0 |
17 | 9. dub | 40 | 19 |
18 | 29. bře | 29 | 8 |
19 | 17. dub | 48 | 27 |
Zlaté číslo je zbytek po dělení roku číslem 19, zvětšený o 1. Hodnota v předposledním sloupci se pravidelně zmenšuje o 11 oproti předchozímu řádku. Pokud dostaneme číslo menší jak 21, přičteme 30. Toto stále opakujeme až do konce tabulky. Pokud od jakékoliv hodnoty v předposledním sloupci tabulky odečteme 21, dostaneme počet dní mezi cyklickým úplňkem a 21. březnem, tedy církevním začátkem jara, viz poslední sloupec. V níže uvedeném vzorci je tento rozdíl označen písmenem d, jeho hodnotu pak dostaneme za pomoci celkem jednoduchého výpočtu. Písmenem a označíme jen zbytek po dělení roku číslem 19, nabývá tedy hodnot od 0 do 18:
d = (19 × a + 15) % 30
Kde 15 je konstanta pro juliánský kalendář. Operátor '%' značí zbytek po dělení, například 23 % 5 = 3.
Definujeme další pomocné proměnné: b je cyklus přestupných roků, nabývá hodnot 0 až 3. Písmeno c je cyklus střídání dnů v týdnu, nabývá hodnot 0 až 6. Pak můžeme vypočítat za kolik dnů od cyklického úplňku nastane Velikonoční neděle. Písmenem e označíme tento počet dnů zmenšený o 1.
c = rok % 7
e = (2×b + 4×c + 6×d + 6) % 7
Vzorec (2×b + 4×c) % 7 počítá den v týdnu pro vybraný den. Ekvivalentem je nedělní písmeno (v případě přestupného roku jen to druhé). Výsledným číslům 0, 1, ..., 6 lze potom jednoznačně přiřadit nedělní písmena C, D, ..., B. Toho využijeme pro určení dne týdne pro 22. března, číslu 0 odpovídá pondělí, 1 je neděle, ... 6 je úterý. Protože nás zajímá počet dnů od neděle, je vhodné zvolit k číslu 0 právě neděli, tomu pomůže přičítaná konstanta 6. Výsledky můžeme zobrazit v následující malé tabulce:
(2×b+4×c+6)%7 | 22. březen |
---|---|
6 | po |
5 | út |
4 | st |
3 | čt |
2 | pá |
1 | so |
0 | ne |
Pokud by se v různých letech neměnil týdenní den 22. března, byl by tento vzorec zbytečný. Protože se však mění, každý následující nepřestupný rok se hodnota výrazu zmenší o 1 (například pokud v určitém roce bylo 22. března pondělí, v následujícím nepřestupném roce bude ten samý den úterý), v přestupných letech se pak zmenší o 2.
Výraz +6×d je nahrazením výrazu −d, zabrání se tím zápornému mezivýsledku v závorce. Toto úpravu lze provést, neboť konečným výsledkem je stejně jen zbytek po dělení sedmi, můžeme tedy připočítat sedminásobek libovolného přirozeného čísla, v tomto případě připočítáváme 7×d (6×d = −d + 7×d). Hledané datum Velikonoční neděle pak už dostaneme snadno, k 22. březnu přičteme počet dnů k cyklickému úplňku (d) a počet dnů od cyklického úplňku k Velikonoční neděli (e je již zmenšeno o 1 proto přičítáme k 22. březnu a ne k 21 .březnu).
Výsledkem je vždy březnové datum Velikonoční neděle. Pokud dostaneme číslo větší jak 31, nutno ještě odečíst 31 a výsledkem je dubnové datum. Pro dubnové datum tedy platí:
Všechny doposud použité vzorce i tabulka však platí pouze pro juliánský kalendář!
V gregoriánském kalendáři je situace poněkud komplikovanější díky sluneční a měsíční opravě, viz popis výpočtu Velikonoční neděle. Datum cyklického úplňku pak ještě záleží na století. Pro Zlaté číslo 1 dostaneme tuto tabulku (rozsáhlejší podobná tabulka je pak na stránce Řady Zlatých čísel):
roky | měsíční oprava | sluneční oprava | datum úplňku |
---|---|---|---|
do 1582 | 5. dub | ||
1583-1599 | -3 | +10 | 12. dub |
1600-1699 | 0 | 0 | 12. dub |
1700-1799 | 0 | +1 | 13. dub |
1800-1899 | -1 | +1 | 13. dub |
1900-1999 | 0 | +1 | 14. dub |
2000-2099 | 0 | 0 | 14. dub |
2100-2199 | -1 | +1 | 14. dub |
2200-2299 | 0 | +1 | 15. dub |
2300-2399 | 0 | +1 | 16. dub |
2400-2499 | -1 | 0 | 15. dub |
2500-2599 | 0 | +1 | 16. dub |
2600-2699 | 0 | +1 | 17. dub |
2700-2799 | -1 | +1 | 17. dub |
2800-2899 | 0 | 0 | 17. dub |
2900-2999 | 0 | +1 | 18. dub |
Díky této komplikaci se mění hodnoty použitých konstant ve vzorcích pro juliánský kalendář. Nejdříve však definujeme pomocné proměnné (dělení je vždy jen na celá čísla, beze zbytku):
p = (13 + 8×k) / 25
q = k / 4
Samotný výraz (k - p - q) zobrazuje rozdíl mezi prvním jarním cyklickým úplňkem v julianském a gregoriánském kalendáři (viz výše uvedená tabulka), Tento výraz se použije při výpočtu hodnoty konstatny M, v juliánském kalendáři je tato konstanta vždy 15.
Největší potíže dělal právě tento výpočet konstanty pro určení cyklického úplňku, ani ne snad kvůli nedostatečné genialitě autora, ale spíše kvůli chybným počátečním informacím. Měsíční oprava se totiž většinou mění po 300 letech, ale jednou za 2500 let se mění až po 400 letech. Původní verze byla p = k / 3 a později se zjistilo, že vzorec dává špatné výsledky pro rok 4200 a mnoho dalších následujících roků. Až po několika letech Gauss výpočet opravil.
Jednodušší byla úprava konstanty zohledňující sluneční opravu (označena N), kde výraz (k - q - 2) ukazuje rozdíl mezi kalendáři ve dnech.
Obě konstanty zobrazíme v závislosti na století v níže uvedené jednoduché tabulce.
roky | M | N |
---|---|---|
1583-1599 | 22 | 2 |
1600-1699 | 22 | 2 |
1700-1799 | 23 | 3 |
1800-1899 | 23 | 4 |
1900-1999 | 24 | 5 |
2000-2099 | 24 | 5 |
2100-2199 | 24 | 6 |
2200-2299 | 25 | 0 |
2300-2399 | 26 | 1 |
2400-2499 | 25 | 1 |
2500-2599 | 26 | 2 |
2600-2699 | 27 | 3 |
2700-2799 | 27 | 4 |
2800-2899 | 27 | 4 |
2900-2999 | 28 | 5 |
Počítání zbytku po dělení (v případě konstanty M je to po dělení 30 a v případě konstanty N je to zbytek po dělení 7) je zbytečné, ve vzorcích pro d i e se tato operace stejně zase provádí. Učinil tak však i Gauss ve svém postupu. Upravené vzorce pro gregoriánský kalendář pak vypadají takto (ostatní vzorce pro a, b i c jsou stejné jako pro juliánský kalendář):
e = (2×b + 4×c + 6×d + N) % 7
pak zase platí:
Velikonoční neděle (bře) = d + e + 22
nebo:
Velikonoční neděle (dub) = d + e - 9
Ale to ještě není definitivní konec, nesmíme zapomenout, že nejpozdější možné datum Velikonoční neděle je 25. dubna. Výše zobrazený algoritmus pro některé roky dává 26. dubna. Jde například o roky 1609, 1981 a 2076. To jsou roky s epaktou 24 a nedělním písmenem D, viz výpis. Je nutné přidat výjimku pro případ, že je-li současně d=29 a e=6, pak je Velikonoční neděle o týden dříve, 19. dubna. Druhá výjimka je kvůli zvláštnímu ošetření epakty 25, v tomto případě je zase Velikonoční neděle o týden dříve než nejpozdější možný termín. Týká se to například let 1954 a 2049. To jsou roky s epaktou 25, nedělním písmenem C a Zlatým číslem větším jak 11, viz výpis. Je nutné přidat další komplikovanou podmínku: je-li současně d=28, e=6 a a>10 (nezapomeňte, že a je vlastně Zlaté číslo zmenšené o 1, prvotní verze poslední části podmínky byla komplikovanější: (11×M+11)%30<19), pak je Velikonoční neděle již 18. dubna.
a = rok % 19 |
b = rok % 4 |
c = rok % 7 |
k = rok / 100 |
p = (13 + 8 * k) / 25 |
q = k / 4 |
M = (15 − p + k − q) % 30 |
N = (4 + k − q) % 7 |
d = (19 * a + M) % 30 |
e = (2 * b + 4 * c + 6 * d + N) % 7 |
je-li (d + e + 22) menší jak 32, pak je Velikonoční neděle (d + e + 22). března |
je-li d rovno 29 a současně e rovno 6, pak je Velikonoční neděle 19. dubna |
je-li d rovno 28 a současně e rovno 6 a současně 'a' větší jak 10, pak je Velikonoční neděle 18. dubna |
jinak je Velikonoční neděle (d + e − 9). dubna |
Díky tomuto Gauss nakonec zjistil, že v roce 1777 byla Velikonoční neděle 30. března. Svátky Nanebevstoupení Páně jsou za 39 dnů a protože se narodil o osm dní před těmito svátky, lehce pak vypočetl, že se narodil 30. dubna 1777. Tento Gaussův algoritmus můžete na stránce Ostatní algoritmy výpočtu Velikonoční neděle porovnat s ostatními algoritmy pro výpočet kalendářního data Velikonoční neděle, některé se obejdou i bez dodatečných podmínek.
Pokus o vylepšení algoritmu
Je zajímavé, že Gauss použil tento vzorec pro zjištění dne v týdnu pro vybraný den: (2×b + 4×c) % 7, který vyžaduje ještě dva předchozí výpočty pro zjištění b a c. Stejnou službu udělá i vzorec (rok + rok / 4) % 7, sice se čísla pro jednotlivé dny v týdnu postupně zvětšují, ale můžeme na základě tohoto chování upravit i vzorec pro výpočet e. Výsledek pak vypadá takto:
e = (35 + N - bc - d) % 7
Konstanta 35 jen zamezuje možnosti výskytu záporného čísla v závorce, může tam být libovolné větší číslo dělitelné 7. Nebo lze použít stejnou metodu jako použil Gauss a přičteme sedminásobek odčítaného výrazu, vzorec pro e pak vypadá takto:
Řádky pro výpočet b a c tak již nejsou potřeba, díky tomu ušetříme jeden řádek. Můžeme i zjednodušit podmínky. V gregoriánském kalendáři jsou nejpozdější cyklické úplňky 'smrsknuty', viz tabulka:
d | epakta | cyklický úplněk |
---|---|---|
26 | 27 | 16. duben |
27 | 26 | 17. duben |
28 | 25/25 | 17/18. duben |
29 | 24 | 18. duben |
Po výpočtu d (což je počet dní mezi cyklickým úplňkem a 21. březnem) můžeme její hodnotu upravit takto:
nebo je-li d rovno 28 a současně 'a' je větší jak 10, pak d = d - 1
Tímto jsme ošetřili epaktu 24 a zvláštní epaktu 25. Další podmínky již nejsou třeba, ostatní řádky zůstávají nezměněny. Tento zkrácený algoritmus pak dává pochopitelně stejné výsledky jako původní Gaussův algoritmus.
a = rok % 19 |
bc = (rok + rok / 4 ) % 7 |
k = rok / 100 |
p = (13 + 8 * k) / 25 |
q = k / 4 |
M = 15 − p + k − q |
N = 4 + k − q |
d = (19 * a + M) % 30 |
je-li d rovno 28 a současně 'a' je větší jak 10, pak d = d - 1 |
je-li d rovno 29, pak d = d - 1 |
e = (35 + N - bc - d) % 7 |
je-li (d + e + 22) menší jak 32, pak je Velikonoční neděle (d + e + 22). března |
jinak je Velikonoční neděle (d + e − 9). dubna |
Další informace:
- Výpočet Velikonoční neděle v juliánském kalendáři
- Výpočet Velikonoční neděle v gregoriánském kalendáři
- Základy roku
- Zlaté číslo
- Řady Zlatých čísel
- Epakta
- Epakta 25
- Ostatní algoritmy výpočtu Velikonoční neděle
- Carterův algoritmus výpočtu Velikonoční neděle
- Tabulka velikonočních dat pro rok 1777
- Kdy se slaví církevní svátky spojené s Velikonocemi