In vista del mese pasquale mi è venuta voglia di imparare, dopo tanti anni, come calcolare questa domenica festiva per tutti i cristiani.
Prima di tutto bisogna documentarsi un po sulla matematica che c’è dietro…quindi sono arrivato sulla pagina di Wikipedia in cui è illustrato l’intero calcolo della Pasqua.
Sopratutto vorrei riportarvi la parte della formula, quella che a noi interessa:
Questo algoritmo, sviluppato dal matematico tedesco Carl Friedrich Gauss, scoperto nel 1800[1][2] a parte un passaggio corretto da Gauss stesso nel 1816.[3], dà direttamente la data della Pasqua.
L’anno di cui si calcola la Pasqua sia contrassegnato da Y; mod è l’operatore modulo che restituisce il resto della divisione fra numeri interi (ad esempio, 13 mod 5 = 3 perché 13 diviso 5 fa 2 con resto 3).
Si calcolano dapprima a, b e c nel seguente modo:
a = Y mod 19
b = Y mod 4
c = Y mod 7
Poi si calcolano
d = (19a + M) mod 30
e = (2b + 4c + 6d + N) mod 7
Secondo il calendario giuliano si deve usare M = 15 e N = 6, mentre per il calendario gregoriano i valori di M and N variano a seconda degli anni considerati, secondo la seguente tabella:
Anni M N 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 Se (d + e) < 10, allora la Pasqua cade il giorno (d + e + 22) del mese di marzo, altrimenti si verificherà il (d + e − 9)-esimo giorno del mese di aprile.
Si tenga tuttavia conto delle seguenti eccezioni:
Se la data risultante dalla formula è il 26 aprile, allora la Pasqua cadrà il giorno 19 aprile;
Se la data risultante dalla formula è il 25 aprile e contemporaneamente d = 28, e = 6 e a > 10, allora la Pasqua cadrà il 18 aprile.
Una volta stabilita la tabella e le regole andiamo a tradurre il tutto in puro linguaggio C.
[box type="tick" size="large" border="full"]Codice migliorato[/box] [code lang="c"] /* Anni M N 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 */ #include <stdio.h> #include <stdlib.h> /*atoi()*/ #define M 24 #define N 5 int main(int argc, char *argv[]){ if (argc < 2){ printf("Manca l'anno.\n"); return 0; } int anno=atoi(argv[1]); int a = anno % 19; int b = anno % 4; int c = anno % 7; int d=(19*a+M)%30; int e=(2*b+4*c+6*d+N)%7; int giornoPasqua; char *mese; if ((d+e)<10) { giornoPasqua=(d+e+22); mese="marzo"; } else { giornoPasqua=(d+e-9); mese="aprile"; } //eccezioni if (giornoPasqua == 26) { giornoPasqua=19; mese="aprile"; } else if (giornoPasqua==25 && d==28 && e==6 && a>10) { giornoPasqua=18; mese="aprile"; } printf("Pasqua: Domenica, %i %s\n",giornoPasqua,mese); return 0; } [/code]