algorytm.org

Wyznaczanie daty Wielkanocy - algortym Gaussa



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Wyznaczanie daty Wielkanocy - algortym Gaussa
Ocena użytkowników:***** / 64
SłabyŚwietny 
Wpisany przez Tomasz Lubiński, 19 lutego 2008 21:43

Wielkanoc jest tak zwanym świętem ruchomym - oznacza to, że każdego roku występuje w inny dzień. Definicja mówi, iż przypada ona w pierwszą niedzielę po pierwszej pełni Księżyca przypadającej po równonocy wiosennej. Jeden ze sposobów obliczenia tej daty został podany przez Gaussa. Algorytm przebiega następująco:

  • a = rok mod 19
  • b = rok mod 4
  • c = rok mod 7
  • d = (a*19 + A) mod 30
  • e = (2b + 4c + 6d + B) mod 7
  • wielkanoc = 22 marzec + d + e

Zatem suma zmiennych d oraz e oznacza ile dni po 22 marca przypada wielkanoc.

dla podanej metody mamy dwa wyjątki:
  • jeżeli d = 29 oraz e = 6 to Wielkanoc miałaby przypaść na dzień 26 kwietnia. Wtedy zawsze obchodzi się ją tydzień wcześniej, tzn. 19 kwietnia
  • jeżeli d = 28 oraz e = 6 to Wielkanoc miałaby przypaść 25 kwietnia. Wtedy zawsze obchodzi się ją tydzień wcześniej, tzn. 18 kwietnia

Do obliczeń potrzebne są dwie liczby A i B.
Ich wartości dla kalendarza gregoriańskiego (czyli tego obowiązującego w Polsce) odczytujemy z poniższej tabeli:

Zakres latAB
- 1582156
1583 - 1699222
1700 - 1799233
1800 - 1899234
1900 - 2099245
2100 - 2199246
2200 - 2299250
2300 - 2399261
2400 - 2499251

Przykład:

Obliczymy datę wielkanocy dla roku 2007.
a = 2007 mod 19 = 12
b = 2007 mod 4 = 3
c = 2007 mod 7 = 5
d = (12*19 + 24) mod 30 = 252 mod 30 = 12
e = (2*3 + 4*5 + 6*12 + 5) mod 7 = 103 mod 7 = 5
Sprawdzamy czy obliczenia pokrywają się z dwoma podanymi wyjątkami? Nie.
Zatem wielkanoc przypada 12 + 5 = 17 dni po 22 marca, czyli 22 + 17 = 39. Marzec ma zawsze 31 dni wynik jest większy od 31 zatem wielkanoc przypada w kwietniu, a dokładnie 39 - 31 = 8 kwietnia.

Obliczymy datę wielkanocy dla roku 2008.
a = 2008 mod 19 = 13
b = 2008 mod 4 = 0
c = 2008 mod 7 = 6
d = (13*19 + 24) mod 30 = 252 mod 30 = 1
e = (2*0 + 4*6 + 6*1 + 5) mod 7 = 35 mod 7 = 0
Sprawdzamy czy obliczenia pokrywają się z dwoma podanymi wyjątkami? Nie.
Zatem wielkanoc przypada 1 + 0 = 1 dni po 22 marca, czyli 22 + 1 = 23 marca.

Implementacje
AutorJęzyk
programowania
KomentarzOtwórzPobierzOcena
TomaszBasic
.bas
.bas
***** / 3
Tomasz LubińskiC#MS Visual Studio .net
.cs
.cs
***** / 7
Tomasz LubińskiC/C++
.cpp
.cpp
***** / 7
Tomasz LubińskiDelphi/Pascal
.pas
.pas
***** / 4
Tomasz LubińskiJava
.java
.java
***** / 4
Nikodem SolarzRubyMetoda obliczająca dzień wielkanocy
.rb
.rb
***** / 1
 
Dodaj własną implementację tego algorytmu
  • Zaloguj się na stronie
Plik:
Język
programowania:
Komentarz:
  By móc dodać implementacje zaloguj się na stronie

Poprawiony: 26 sierpnia 2015 19:07
Komentarze
photo
-3 # pankracy 2013-03-06 10:38
supcio poradnik :*
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-2 # koziołek matołek 2015-01-15 13:01
metoda meeusa www.algorytm.org/przetwarzanie-dat/wyznaczanie-daty-wielkanocy-metoda-meeusa-jonesa-butchera.html jest beztabelowa, wiekszy zakres lat i nie ma wyjatkow/bledow, a ze dluzsza to komputerowi nie robi roznicy
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
+1 # Łukasz_ 2019-01-01 18:20
Owszem, jeśli ma się własny serwer bez limitu czasowego dla skryptów. Poza tym, są w niej zaokrąglenia. Każda metoda ma plusy i minusy.
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
+1 # JarekJS 2016-11-23 16:48
Wersja dla Visual FoxPro (jeśli ktoś szuka):

IF BETWEEN(f_rok,1900,2099)
f_wiel = DATE(f_rok,3,22) + MOD((MOD(f_rok, 19)*19 + 24),30) + MOD(2*MOD(f_rok ,4) + 4*MOD(f_rok,7) + 6*(MOD((MOD(f_r ok, 19)*19 + 24),30)) + 5,7)
IF MONTH(f_wiel)=4 AND DAY(f_wiel)>=25 THEN
f_wiel = f_wiel -7
ENDIF
ENDIF
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
+1 # Dan 2018-04-01 04:24
Co znaczy mod ?
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
+1 # Tomasz Lubiński 2019-10-18 07:22
To jest dzielenie modulo (czyli inaczej, reszta z dzielenia)
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz