Vzorec pro výpočet data velikonoc
Moderátor: Moderátoři
Vzorec pro výpočet data velikonoc
Našel jsem si někde na NETu algoritmus pro výpočet data velikonoc. Zkusil jsem si ten algoritmus jen tak ze zvědavosti napsat jako výpočet do buňky EXCEL. Vzorec vychází velmi dlouhý a komplikovaný, možná by šel nějak optimalizovat. Použitý algoritmus má být platný od roku 1901 do roku 2099.
Výpočtový vzorec jsem prověřoval pro roky od asi 1998 do 2012, vždy to souhlasilo s platným kalendářem.
Zkusil si někdo napsat ten vzorec jednodušeji nebo podle jinak definovaného algoritmu?
Protože zde nejde vložit jako přílohu soubor XLS, dám sem vzorce pro pro velikonoční neděli a pondělí jen jako textový řetězec. Textové řetězce je nutno odtud zkopírovat do uvedené buňky v EXCEL a v EXCEL je možno již vzorce kopírovat do jiné libovolné buňky. Buňku se vzorcem nastavte do formátu Datum d.m.rrrr aby se výsledek výpočtu správně zobrazil.
Poznámka: Podle následující diskuse byly vzorce dodatečně doplněny 21.2. o korekci data velikonoc o jeden týden dříve pro roky 1954, 1981, 2049 a 2076.
Velikonoční neděle: Zkopírovat do buňky B4, požadovaný rok pro výpočet vepište do A4.
=CONCATENATE((22+MOD((19*MOD(A4;19)+24);30)+MOD((5+2*MOD(A4;4)+4*MOD(A4;7)+6*MOD((19*MOD(A4;19)+24);30));7))*A((22+MOD((19*MOD(A4;19)+24);30)+MOD((5+2*MOD(A4;4)+4*MOD(A4;7)+6*MOD((19*MOD(A4;19)+24);30));7))>0;(22+MOD((19*MOD(A4;19)+24);30)+MOD((5+2*MOD(A4;4)+4*MOD(A4;7)+6*MOD((19*MOD(A4;19)+24);30));7))<32)+(MOD((19*MOD(A4;19)+24);30)+MOD((5+2*MOD(A4;4)+4*MOD(A4;7)+6*MOD((19*MOD(A4;19)+24);30));7)-9)*(A((MOD((19*MOD(A4;19)+24);30)+MOD((5+2*MOD(A4;4)+4*MOD(A4;7)+6*MOD((19*MOD(A4;19)+24);30));7)-9)>0;(MOD((19*MOD(A4;19)+24);30)+MOD((5+2*MOD(A4;4)+4*MOD(A4;7)+6*MOD((19*MOD(A4;19)+24);30));7)-9)<31))-7*(NEBO(A4=1954;A4=1981;A4=2049;A4=2076));".";3+1*(A((MOD((19*MOD(A4;19)+24);30)+MOD((5+2*MOD(A4;4)+4*MOD(A4;7)+6*MOD((19*MOD(A4;19)+24);30));7)-9)>0;(MOD((19*MOD(A4;19)+24);30)+MOD((5+2*MOD(A4;4)+4*MOD(A4;7)+6*MOD((19*MOD(A4;19)+24);30));7)-9)<31));".";A4)+0
Velikonoční pondělí: Zkopírovat do buňky F4, požadovaný rok pro výpočet vepište do E4.
=(CONCATENATE((22+MOD((19*MOD(E4;19)+24);30)+MOD((5+2*MOD(E4;4)+4*MOD(E4;7)+6*MOD((19*MOD(E4;19)+24);30));7))*A((22+MOD((19*MOD(E4;19)+24);30)+MOD((5+2*MOD(E4;4)+4*MOD(E4;7)+6*MOD((19*MOD(E4;19)+24);30));7))>0;(22+MOD((19*MOD(E4;19)+24);30)+MOD((5+2*MOD(E4;4)+4*MOD(E4;7)+6*MOD((19*MOD(E4;19)+24);30));7))<32)+(MOD((19*MOD(E4;19)+24);30)+MOD((5+2*MOD(E4;4)+4*MOD(E4;7)+6*MOD((19*MOD(E4;19)+24);30));7)-9)*(A((MOD((19*MOD(E4;19)+24);30)+MOD((5+2*MOD(E4;4)+4*MOD(E4;7)+6*MOD((19*MOD(E4;19)+24);30));7)-9)>0;(MOD((19*MOD(E4;19)+24);30)+MOD((5+2*MOD(E4;4)+4*MOD(E4;7)+6*MOD((19*MOD(E4;19)+24);30));7)-9)<31))-7*(NEBO(E4=1954;E4=1981;E4=2049;E4=2076));".";3+1*(A((MOD((19*MOD(E4;19)+24);30)+MOD((5+2*MOD(E4;4)+4*MOD(E4;7)+6*MOD((19*MOD(E4;19)+24);30));7)-9)>0;(MOD((19*MOD(E4;19)+24);30)+MOD((5+2*MOD(E4;4)+4*MOD(E4;7)+6*MOD((19*MOD(E4;19)+24);30));7)-9)<31));".";E4))+1
- Přílohy
-
Velikonoce.ZIP- V tomto souboru není korekce "minus 1 týden" pro roky 1954, 1981, 2049 a 2076 provedena. Opravený ZIP soubor je dále
- (3.41 KiB) Staženo 203 x
- Přílohy
-
Algoritmus velikonoc.JPG- (287.84 KiB) Staženo 192 x
- tomasjedno
- Příspěvky: 6547
- Registrován: 11 říj 2008, 00:00
- Bydliště: ZZ9 Plural Z Alpha
Brozicek píše:Našel jsem si někde na NETu algoritmus pro výpočet data velikonoc. Zkusil jsem si ten algoritmus jen tak ze zvědavosti napsat..
Co tam dělají buňky L4 (v neděli) a O4 (v pondělí), a podmínky L4>25 a O4>25? To je nějaké nevyčištěné reziduum po testování na 25.4.? (které tam ovšem nemáš).
Algoritmus ve VisualBasicu máš tady http://cs.wikipedia.org/wiki/V%C3%BDpo% ... _Velikonoc
- tomasjedno
- Příspěvky: 6547
- Registrován: 11 říj 2008, 00:00
- Bydliště: ZZ9 Plural Z Alpha
procesor píše:Aj tak mi to OOo calc nezhltne (dlhé? reťazce príkazov?)
Tož si to rozkouskuj:
Velikonoční neděle:
den: =(22+MOD((19*MOD(A4;19)+24);30)+MOD((5+2*MOD(A4;4)+4*MOD(A4;7)+6*MOD((19*MOD(A4;19)+24);30));7))*A((22+MOD((19*MOD(A4;19)+24);30)+MOD((5+2*MOD(A4;4)+4*MOD(A4;7)+6*MOD((19*MOD(A4;19)+24);30));7))>0;(22+MOD((19*MOD(A4;19)+24);30)+MOD((5+2*MOD(A4;4)+4*MOD(A4;7)+6*MOD((19*MOD(A4;19)+24);30));7))<32)+(MOD((19*MOD(A4;19)+24);30)+MOD((5+2*MOD(A4;4)+4*MOD(A4;7)+6*MOD((19*MOD(A4;19)+24);30));7)-9)*(A((MOD((19*MOD(A4;19)+24);30)+MOD((5+2*MOD(A4;4)+4*MOD(A4;7)+6*MOD((19*MOD(A4;19)+24);30));7)-9)>0;(MOD((19*MOD(A4;19)+24);30)+MOD((5+2*MOD(A4;4)+4*MOD(A4;7)+6*MOD((19*MOD(A4;19)+24);30));7)-9)<31))-7*(L4>25)
měsíc: =3+1*(A((MOD((19*MOD(A4;19)+24);30)+MOD((5+2*MOD(A4;4)+4*MOD(A4;7)+6*MOD((19*MOD(A4;19)+24);30));7)-9)>0;(MOD((19*MOD(A4;19)+24);30)+MOD((5+2*MOD(A4;4)+4*MOD(A4;7)+6*MOD((19*MOD(A4;19)+24);30));7)-9)<31))
rok: =A4
(bez záruky za správnost, jenom jsem to vykostil z Brozickových vzorců.
tomasjedno píše:Brozicek píše:Našel jsem si někde na NETu algoritmus pro výpočet data velikonoc. Zkusil jsem si ten algoritmus jen tak ze zvědavosti napsat..
Co tam dělají buňky L4 (v neděli) a O4 (v pondělí), a podmínky L4>25 a O4>25? To je nějaké nevyčištěné reziduum po testování na 25.4.?
Děkuji za upozornění. Ten vzorec vznikal někdy v roce 2006 nyní jsem ho oprášil. Je možné, že je tam přehlédnutá chyba, která se při testování na známé kalendářní dny velikonoc neprojevila. Asi tam patří také A4 a E4 jako všude jinde, ale musím se na to v klidu podívat. Jak vidím mám hodně skvělých oponentů, kteří ten postup rozpitvají a případné moje chyby opraví. Za to jim děkuji.
Kód: Vybrat vše
CLS
INPUT "rok:"; rok
d = 19 * (rok MOD 19) + 24
d = d MOD 30
d = 22 + d + (5 + 2 * (rok MOD 4) + 4 * (rok MOD 7) + 6 * d) MOD 7
IF d < 57 THEN GOTO brezen
d = d - 7
brezen:
IF d > 31 THEN GOTO duben
PRINT d; " brezna"
END
duben:
PRINT d - 31; " dubna"
END
Přesně řečeno, Velikonocní svátky jsou v první neděli (a pondělí) následující po prvním jarním úplňku - neboli po prvním úplňku dovršeném po datu jarní rovnodnnosti = 21.března v tom kterém kalendářním roce. Přesně 49 dní PŘED Velikonoční nedělí je pak "Ostatkové úterý" neboli (známěji) MASOPUSTNÍ ÚTERÝ.
A kutilmile - nelituju tě
tomasjedno píše:.....
Co tam dělají buňky L4 (v neděli) a O4 (v pondělí), a podmínky L4>25 a O4>25? To je nějaké nevyčištěné reziduum po testování na 25.4.? (které tam ovšem nemáš)......
Tak jsem odpoledne odklidil sníh na chatě a vyčistil si tím mozek. "Tomásjedno" mě odhalil parádně, upřímně mu za to děkuji. Našel jsem si archiv pro odvození vzorce a ty buňky L4 a O4 je skutečně pozůstatek ladění, kdy byl vzorec psán "per partes" podle měsíců a testoval jsem tím data ve sloupci pro duben. Pak jsem vše spojil do 1 vzorce, "náhle mne v práci vyrušil šéf" a bylo vymalováno. Chyba tam zůstala celých 6 roků (jako u Microsoftu).
Nakopíroval jsem si ty moje vzorce do sloupečků a provedl výpočet data velikonoc od roku 1901 do roku 2099. Vyšlo mi, že datum velikonoc je větší než 25.4. jen v roce 1981 a 2076. Tak jsem zachránil situaci tím, že v těch dvou rocích odečtu těch 7 dní.
V příloze je EXCEL s opravenou chybou.
EXCEL má snad pro výpočet data velikonoc proti Visual Basic nebo Qbasic v tom, že se dají vzorečky dát do nějaké EXCELovské aplikace bez znalosti toho jak tam dostat prográmky v "basicu".
Jednu aplikaci, ve které jsem použil tento výpočet sem dám za chvíli, až tam také opravím tu chybičku (projevila by se až v roce 2076).
- Přílohy
-
Velikonoce.ZIP- Korekce "minus 1 týden" pro roky 1954, 1981, 2049 a 2076 provedena.
- (3.57 KiB) Staženo 187 x
- Přílohy
-
velikonoce.png- (22.17 KiB) Staženo 197 x