jueves, 10 de diciembre de 2015

Computus: calculando la Semana Santa.

Cada año vemos (y leemos) cómo los días de Semana Santa varían y nunca terminos de comprender exactamente el motivo... bastante lioso, por cierto, al mezclar el calendario lunar con el solar y ciertas equivocaciones pasadas.

Hoy me levanté decidido a buscar la respuesta exacta a este 'misterio' y me fui documentando.
Vistas diferentes webs me quedé con esta explicación de la wikipedia.


La idea es mostrar una fórmula que nos devuelva el día correspondiente del Domingo de Pascua (o Resurrección) a partir de un año dado.

Desplegaremos algunos años para comprobar la fórmula:

Computus: calculando la Semana Santa.



Buceando encontré estas dos fórmulas para obtener la fecha del Domingo de Pascua a partir del año
1- en C2:
=MONEDA(("4/"&A2)/7+RESIDUO(19*RESIDUO(A2;19)-7;30)*14%;)*7-6
y en B2 para obtener el Jueves Santo:
=MONEDA(("4/"&A2)/7+RESIDUO(19*RESIDUO(A2;19)-7;30)*14%;)*7-6-3

2 - en C10 otra manera:
=MULTIPLO.INFERIOR(FECHA(A10;5;DIA(MINUTO(A10/38)/2+56));7)-34
y en B10:
=MULTIPLO.INFERIOR(FECHA(A10;5;DIA(MINUTO(A10/38)/2+56));7)-34-3


Otra vía es creando una función personalizada en VBA que replique el Algoritmo de Butcher, para tal fin, insertamos nuestro código dentro de un módulo estándar desde el editor de VB:

Function DomingoPascua(Año As Integer) As Date
'desarrollo del Algoritmo de Butcher
'válido para cualquier año posterior a 1583,
'sólo es válido para el calendario Gregoriano
Dim a As Integer, b As Integer, c As Integer, d As Integer, e As Integer
Dim f As Integer, g As Integer, h As Integer, i As Integer
Dim k As Integer, l As Integer, m As Integer, n As Integer
Dim mes As Integer, día As Integer
'A resto de la división año / 19,
a = Año Mod 19
'B cociente de la división año / 100, es decir, (año - (año mod 100)) / 100 = un número entero,
b = Int(Año / 100)
'C resto de la división año / 100,
c = Año Mod 100
'D cociente de la división B / 4,
d = Int(b / 4)
'E resto de la división B / 4,
e = b Mod 4
'F cociente de la división (B + 8) / 25,
f = Int((b + 8) / 25)
'G cociente de la división (B - F + 1) / 3,
g = Int((b - f + 1) / 3)
'H resto de la división (19A + B – D – G + 15) / 30,
h = (19 * a + b - d - g + 15) Mod 30
'I cociente de la división C / 4,
i = Int(c / 4)
'K resto de la división C / 4,
k = c Mod 4
'L resto de la división (32 + 2E + 2I – H – K) / 7,
l = (32 + 2 * e + 2 * i - h - k) Mod 7
'M cociente de la división (A + 11H + 22L) / 451,
m = Int((a + 11 * h + 22 * l) / 451)
'N = H + L – 7M + 114,
n = h + l - 7 * m + 114

'MES cociente de la división N / 31,
mes = Int(n / 31)
'DÍA = 1 + ( N mod 31 ) o bien 1 + (N - (MES × 31)).
día = 1 + n Mod 31

'Obtenemos el día...
DomingoPascua = DateSerial(Año, mes, día)
   
End Function



Como se puede comprobar en la imagen más arriba, en el rango E2:E7 el resultado es el mismo...

No hay comentarios:

Publicar un comentario en la entrada