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:
Zatem suma zmiennych d oraz e oznacza ile dni po 22 marca przypada wielkanoc.
dla podanej metody mamy dwa wyjątki:
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:
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.
- 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 lat | A | B |
- 1582 | 15 | 6 |
1583 - 1699 | 22 | 2 |
1700 - 1799 | 23 | 3 |
1800 - 1899 | 23 | 4 |
1900 - 2099 | 24 | 5 |
2100 - 2199 | 24 | 6 |
2200 - 2299 | 25 | 0 |
2300 - 2399 | 26 | 1 |
2400 - 2499 | 25 | 1 |
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
Autor | Język programowania | Komentarz | Otwórz | Pobierz | Ocena |
Tomasz | Basic | .bas | .bas | ***** / 3 | |
Tomasz Lubiński | C# | MS Visual Studio .net | .cs | .cs | ***** / 7 |
Tomasz Lubiński | C/C++ | .cpp | .cpp | ***** / 7 | |
Tomasz Lubiński | Delphi/Pascal | .pas | .pas | ***** / 4 | |
Tomasz Lubiński | Java | .java | .java | ***** / 4 | |
Nikodem Solarz | Ruby | Metoda obliczająca dzień wielkanocy | .rb | .rb | ***** / 1 |
Poprawiony: 26 sierpnia 2015 19:07
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