Menu ≡
24print kalendar.beda.cz

Gaussův algoritmus výpočtu Velikonoční neděle

Popis vzorce v originále
Popis vzorce v originá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řezendnů od
21.3.
15. dub3615
225. bře254
313. dub4423
42. dub3312
522. bře221
610. dub4120
730. bře309
818. dub4928
97. dub3817
1027. bře276
1115. dub4625
124. dub3514
1324. bře243
1412. dub4322
151. dub3211
1621. bře210
179. dub4019
1829. bře298
1917. dub4827

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:

a = rok % 19
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.

b = rok % 4
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)%722. březen
6po
5út
4st
3čt
2
1so
0ne

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).

Velikonoční neděle (bře) = d + e + 22

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í:

Velikonoční neděle (dub) = d + e - 9

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):

rokyměsíční
oprava
sluneční
oprava
datum
úplňku
do 15825. dub
1583-1599-3+1012. dub
1600-16990012. dub
1700-17990+113. dub
1800-1899-1+113. dub
1900-19990+114. dub
2000-20990014. dub
2100-2199-1+114. dub
2200-22990+115. dub
2300-23990+116. dub
2400-2499-1015. dub
2500-25990+116. dub
2600-26990+117. dub
2700-2799-1+117. dub
2800-28990017. dub
2900-29990+118. 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):

k = rok / 100
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.

M = (15 + k - p - q) % 30

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.

N = (4 + k - q) % 7

Obě konstanty zobrazíme v závislosti na století v níže uvedené jednoduché tabulce.

rokyMN
1583-1599222
1600-1699222
1700-1799233
1800-1899234
1900-1999245
2000-2099245
2100-2199246
2200-2299250
2300-2399261
2400-2499251
2500-2599262
2600-2699273
2700-2799274
2800-2899274
2900-2999285

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ář):

d = (19 × a + M) % 30
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.

Gaussův algoritmus z roku 1816
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:

bc = (rok + rok / 4) % 7
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:

e = (N + 6×(bc + d)) % 7

Řá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:

depaktacyklický
úplněk
262716. duben
272617. duben
2825/2517/18. duben
292418. 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:

je-li d rovno 29, pak d = d - 1
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.

Vylepšený 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:

ave365
24print 24print Nahoru