Stránka 1 z 2

Vzorec pro výpočet data velikonoc

Napsal: 19 úno 2012, 09:44
od Brozicek
Možná to patří do jiné sekce, tak mi to tam přesuňte.
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

Napsal: 19 úno 2012, 10:06
od OK2STO
Zdravím, tak tu přílohu v Excelu zkomprimovat třeba do Zipu nebo Raru a vložit sem.

Napsal: 19 úno 2012, 10:46
od Brozicek
Tady je ten soubor EXCEL v ZIP.

Napsal: 19 úno 2012, 10:53
od procesor
Aj tak mi to OOo calc nezhltne (dlhé? reťazce príkazov?)

Napsal: 19 úno 2012, 11:11
od Brozicek
Našel jsem ještě ten popis toho naprogramovaného algoritmu. Mám ho jen jako JPG obrázek, proto přikládám.

Napsal: 19 úno 2012, 11:27
od tomasjedno
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

Napsal: 19 úno 2012, 11:39
od tomasjedno
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ů.

Napsal: 19 úno 2012, 12:11
od Brozicek
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.

Napsal: 19 úno 2012, 12:15
od termit256
No nevim, nebude rychlejsi ty data velikonoc proste zapsat natvrdo do nejake tabulky? Nez se pul dne babrat s takovym vzorcem kde se snadno prehledne chyba.

Napsal: 19 úno 2012, 12:37
od Crifodo
tady je to vydestilováno do Qbasicu, testováno na pár posledních let. Trvalo to míň než půl dne.

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

Napsal: 19 úno 2012, 16:32
od EKKAR
Teď ještě jestli to splní zásadní podmínku astronomickou - totiž že datum Velikonoc se řídí kombinací slunečního a lunárního kalendáře, proto jsou Velikonoce pohyblivý svátek.
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Ý.

Napsal: 19 úno 2012, 17:19
od p32
Nemáte tam ještě i nějaký program na zjištění, kterého krásného dne půjde tato vláda včetně její opozice do prd..le ? Jen bych rád věděl, jestli se toho ještě dožiju. :wink:
Na Velikonoce se mi stačí mrknout do kalendáře (hotovo za 15 sekund).

Napsal: 19 úno 2012, 18:50
od procesor
Ta tvoja "pozice i opozice" tam u vás, rovnako ako u nás, bude aj v r. 2050, ale Veľká Noc v tom roku sa dá zistiť len v takýmto a podobným algoritmom :D.

Pripúšťam aj zmenu, ale ako doteraz jedna "lumpáreň" vystrieda druhú.

Napsal: 19 úno 2012, 19:43
od Brozicek
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).

Napsal: 19 úno 2012, 20:29
od Bernard
Rozložení velikonoční neděle v čase. Rozdíl mezi sousedními roky za těch 100 let je minimálně 8 dní. Kdoví, jestli i za 1000 let?