L’algoritmo di Gauss per il calcolo della Pasqua

Come è noto, la festività della Pasqua Cattolica non cade mai nella stessa data in quanto è legata al ciclo lunare. Il “sistema” che fissa la data della Pasqua per ogni anno fu stabilita nell’anno 325 dal Concilio di Nicea: la Pasqua cade la domenica successiva al primo plenilunio dopo l’equinozio di Primavera (21 Marzo).

A volte capita di dover disporre di un semplice algoritmo da implementare nei propri programmi per il computo delle festività: è capitato a me per cui eccomi qui ad esporre una semplice funzione in vb.net che effettua il calcolo della data della Pasqua Cattolica.

Specifico “Cattolica” in quanto la Pasqua Ebraica segue un metodo di calcolo completamente differente e molto più complicato. La data della Pasqua Cattolica, inoltre, varia se si utilizza il calendario Gregoriano (che è quello che utilizziamo noi in Italia abitualmente e che viene utilizzato nella maggior parte del mondo) o il calendario Giuliano (utilizzato dalla Chiesa Ortodossa).

L’algoritmo più utilizzato per il calcolo della Pasqua Cattolica è sicuramente quello di Gauss. Nella funzione che segue ho implementato appunto tale algoritmo. Per utilizzare questa funzione nei vostri programmi copiate tutto il contenuto, incollatelo in un file di testo e date al file l’estensione .vb, importate quindi il tale file nel vostro progetto. La funzione va richiamata passando l’anno (parametro Year) e opzionalmente il valore dell’enumerazione per scegliere se utilizzare il calendario Gregoriano (opzione di default, per cui in questo caso non è necessario specificare) o quello Giuliano. Il valore restituito è in formato Date, per cui è indipendente dalle impostazioni internazionali in uso sul vostro pc.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
Module easter_calc
 
    ' Evaluates day of Catholic Easter using Gauss algorithm
    ' by Bernardo Giovanni
    ' https://www.settorezero.com
 
    Public Enum CalendarType As Byte
        Gregorian = 0
        Julian = 1
    End Enum
 
    Public Function EasterDate(ByVal Year As Short, Optional ByVal CalendarType As CalendarType = CalendarType.Gregorian) As Date
 
        Dim a, b, c, d, e, M, N As Byte
        Dim da, mo As Byte
 
        If CalendarType = easter_calc.CalendarType.Julian Then
           M = 15
           N = 6
        Else
           If (Year >= 1583) And (Year <= 1699) Then
               M = 22
               N = 2
           ElseIf (Year >= 1700) And (Year <= 1799) Then
               M = 23
               N = 3
           ElseIf (Year >= 1800) And (Year <= 1899) Then
               M = 23
               N = 4
           ElseIf (Year >= 1900) And (Year <= 2099) Then
               M = 24
               N = 5
           ElseIf (Year >= 2100) And (Year <= 2199) Then
               M = 24
               N = 6
           ElseIf (Year >= 2200) And (Year <= 2299) Then
               M = 25
               N = 0
           ElseIf (Year >= 2300) And (Year <= 2399) Then
               M = 26
               N = 1
           ElseIf (Year >= 2400) And (Year <= 2499) Then
               M = 25
               N = 1
           Else
               Return Nothing
           End If
       End If
 
        a = Year Mod 19
        b = Year Mod 4
        c = Year Mod 7
        d = ((19 * a) + M) Mod 30
        e = ((2 * b) + (4 * c) + (6 * d) + N) Mod 7
 
        If (d + e < 10) Then
             da = d + e + 22
             mo = 3
        Else
             da = d + e - 9
             mo = 4
        End If
 
        If (da = 26 And mo = 4) Then
            da = 19
            mo = 4
        ElseIf (da = 25 And mo = 4 And d = 28 And e = 6 And a > 10) Then
            da = 18
            mo = 4
        End If
 
        Return New Date(Year, mo, da)
 
    End Function
 
End Module

Questa funzione, sfruttando l’algoritmo di Gauss, è valida per gli anni compresi tra il 1583 e il 2499, se l’anno passato non rientra in questo range, la funzione restituisce Nothing, che in termini di oggetto Date equivale alla data 01/01/0001 …

Scarica la funzione (solo per utenti iscritti) : [download#57]

Maggiori informazioni le potete trovare nelle seguenti pagine su wikipedia:

Se questo articolo ti è piaciuto, condividilo su un social:
Se l'articolo ti è piaciuto o ti è stato utile, potresti dedicare un minuto a leggere questa pagina, dove ho elencato alcune cose che potrebbero farmi contento? Grazie :)