Ostatní algoritmy výpočtu Velikonoční neděle
Vstupem je rok a výsledkem je datum Velikonoční neděle v gregoriánském kalendáři pro zadaný rok. Všechny výpočty se provádí pouze s celými čísly, tedy například 23 děleno 5 je 4 a celočíselný zbytek po dělení (zde označen operátorem '%') je 3. Pozor na výsledek této operace pro záporná čísla. Například programovací jazyk Python správně vrací:
(-23) % 5 2
Ale například PHP a Javascript vrací záporný výsledek, což není dobře. Tomu lze zabránit přičtením konstanty, jež je vhodným celočíselným násobkem dělitele, zbytek po dělení to neovlivní:
(-23) % 5, (-23 + 25) % 5 -3, 2
Též se liší výsledky funkce integer
pro záporná čísla. Řešení s přičtením konstanty je v některých zobrazených algoritmech použito.
Gaussův algoritmus z roku 1816
Podrobný rozbor algoritmu.
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 |
Vylepšený Gaussův algoritmus z roku 2017
Byl zjednodušen výpočet dne týdne, viz pokus o vylepšení algoritmu. Také byly zjednodušeny a přesunuty podmínky. Navíc bylo odstraněno přebytečné dělení u výpočtu konstant M a N, později se stejně provádí.
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 |
Butcherův algoritmus z roku 1876
a = rok % 19 |
b = rok / 100 |
c = rok % 100 |
d = b / 4 |
e = b % 4 |
f = (b + 8) / 25 |
g = (b − f + 1) / 3 |
h = (19 * a + b − d − g + 15) % 30 |
i = c / 4 |
k = c % 4 |
L = (32 + 2 * e + 2 * i − h − k) % 7 |
m = (a + 11 * h + 22 * L) / 451 |
měsíc = (h + L − 7 * m + 114) / 31 |
den = (h + L − 7 * m + 114) % 31 + 1 |
Oudinův algoritmus z roku 1940
c = rok / 100 |
n = rok % 19 |
k = (c - 17) / 25 |
i = (c - c / 4 - (c - k) / 3 + 19 * n + 15) % 30 |
i = i - (i / 28) * (1 - (i / 28) * (29 / (i + 1)) * ((21 - n) / 11)) |
j = (rok + rok / 4 + i + 2 - c + (c / 4)) % 7 |
l = i - j |
měsíc = 3 + (l + 40) / 44 |
den = l + 28 - 31 * (měsíc / 4) |
Conwayův algoritmus z roku 1980
John Horton Conway je britský matematik, též tvůrce počítačové simulace Život.
s = rok / 100 |
t = rok % 100 |
a = t / 4 |
p = s % 4 |
jps = (9 - 2 * p) % 7 |
jp = (jps + t + a) % 7 |
g = y % 19 |
G = g + 1 |
b = s / 4 |
r = 8 * (s + 11) / 25 |
C = -s + b + r |
d = (11 * G + C) % 30 |
d = (d + 30) % 30 |
h = (551 - 19 * d + G) / 544 |
e = (50 - d - h) % 7 |
f = (e + jp) % 7 |
R = 57 - d - f - h |
je-li R menší jak 32, pak je Velikonoční neděle R. března |
jinak je Velikonoční neděle (R - 31). dubna |
Carterův algoritmus z roku 1996
Podrobný rozbor na stránce Carterův algoritmus výpočtu Velikonoční neděle.
a = rok % 19 |
k = rok / 100 |
s = k - k / 4 - 12 |
m = 8 * (k - 14) / 25 |
b = 202 + s - m - 11 * a |
d = b % 30 + 21 |
je-li d rovno 49 a současně 'a' větší jak 10, pak d = d - 1 |
je-li d rovno 50, pak d = d - 1 |
e = (rok + rok / 4 + d - 10 - s) % 7 |
q = d + 7 - e |
je-li q menší jak 32, pak je Velikonoční neděle q. března |
jinak je Velikonoční neděle (q - 31). dubna |
Lichtenbergův algoritmus z roku 1997
Zdroj: Dr Heiner Lichtenberg, Zur Interpretation der Gaußschen Osterformel und ihrer Ausnahmeregeln, Historia Mathematica 24 (1997), strana 441 - 444.
Proměnná og
je (březnové) datum cyklického úplňku.
k = rok / 100 |
m = 15 + (3*k+3)/4 - (8*k+13)/25 |
s = 2 - (3*k+3)/4 |
a = rok % 19 |
d = (19*a + m) % 30 |
r = d/29 + (a/11) * (d/28 - d/29) |
og = 21 + d - r |
sz = 7 - (rok + rok/4 + s) % 7 |
oe = 7 - (og - sz) % 7 |
os = og + oe |
je-li os menší jak 32, pak je Velikonoční neděle os. března |
jinak je Velikonoční neděle (os - 31). dubna |
Kershawův algoritmus z roku 2004
Algoritmus byl odvozen z tabulek uveřejněných v modlitební knize anglikánské církve 'Book of Common Prayer', autorem je Simon Kershaw. Tento algoritmus se nezdržuje výpočtem epakty, ale rovnou vypočte vzdálenost ve dnech mezi cyklickým úplňkem a církevním začátkem jara (21. březen). To je rozdíl oproti jiným algoritmům, které většinou pracují s březnovým datem cyklického úplňku. Po výpočtu číselného vyjádření nedělního písmena nakonec zjistí vzdálenost Velikonoční neděle od církevního začátku jara. Zdroj algoritmu je z nenápadné stránky Calculating the Date of Easter. Pro naše potřeby byl algoritmus jen drobně vylepšen: použité konstanty 213 a 39 zamezují vzniku záporného čísla, viz poznámka v úvodu této stránky.
- g: Zlaté číslo
- s: sluneční oprava
- m: měsíční oprava
- p: rozdíl ve dnech mezi 21. březnem a cyklickým úplňkem
- d: nedělní písmeno (A=0,B=6,…G=1)
- e: rozdíl ve dnech mezi 21. březnem a Velikonoční nedělí
g = rok % 19 + 1 |
k = rok / 100 |
s = k - k/4 - 12 |
m = 8 * (k - 14) / 25 |
p = (213 - 11*g + s - m) % 30 |
je-li p rovno 28 a současně g je větší jak 11, pak p = p - 1 |
je-li p rovno 29, pak p = p - 1 |
d = (rok + rok/4 - s + 2) % 7 |
e = p + 1 + (39 - d - p) % 7 |
je-li e menší jak 11, pak je Velikonoční neděle (e + 21). března |
jinak je Velikonoční neděle (e - 10). dubna |