miércoles, 8 de abril de 2009

Aritmética modular y Semana Santa

¿Qué tiene que ver una festividad católica con la aritmética modular? ¿Por qué la Semana santa cambia tanto de fecha? Ambas preguntas están estréchamente relacionadas.

Comencemos con un poco de historia. La Semana Santa es una festividad católica que tiene como colofón el Domingo de Resurrección o Pascua de Resurrección, y es ese preciso día el que marca todas las festividades católicas con fecha variable. Pero olvidemos por unos momentos las reminiscencias religiosas y quedémonos con la cuestión en sí del cálculo de dicha fecha.

De todos es sabido que la Semana Santa va cambiando (y bastante) de fechas y esta fecha viene determinada por la de la Pascua (cristiana). Por tanto, la pregunta es ¿cómo se define esta pascua? Tras muchas discusiones y concilios en el seno de la Iglesia, finalmente fue Dionisio el Exiguo (en el año 525) quien consiguió unificar el cálculo de la pascua cristiana. Para ello hay que partir de ciertas premisas:

  • La Pascua ha de caer en domingo.

  • Este domingo ha de ser el siguiente a la primera luna llena de la primavera boreal. Si esta fecha cayese en domingo, la Pascua se trasladará al domingo siguiente para evitar la coincidencia con la Pascua judía.

  • La luna pascual es aquella cuyo plenilunio tiene lugar en el equinoccio de primavera del hemisferio norte o inmediatamente después.

  • Este equinoccio tiene lugar el 21 de marzo.

  • Llamamos epacta a la edad lunar. En concreto nos interesa para este cálculo la epacta del año, es decir, la diferencia en días que el año solar excede al año lunar. O dicho más fácilmente, el día del ciclo lunar en que está la Luna el 1 de enero del año cuya Pascua estamos calculando. Este número —como es lógico— varía entre 0 y 29.



En fin, mucha palabrería y nada de matemáticas hasta ahora. Como podréis suponer, el cálculo de la Pascua cristiana es ciertamente tedioso, a partir de dichas premisas y ha supuesto un gran problema.

Durante años han surgido diferentes métodos para calcular esta fecha, incluso durante el Renacimiento se extrajeron tablas de cálculo para la Pascua en función del número de oro φ. Hoy en día la fórmula más sencilla de calcular esta fecha es mediante la fórmula desarrollada por Gauss. Él, quien sino, propuso un sencillo algoritmo para el cálculo efectivo de esta fecha a través de la aritmética modular. Pero para ello necesitaremos ciertas variables.

Llamemos A al año para el que queramos calcular la Pascua. Llamemos M=24 y N=5 (dependiendo del siglo en el que esté A, los valores de M y N cambiarán, cf Wikipedia).

Sea a=A mod 19.
Sea b=A mod 4.
Sea c=A mod 7.
Sea d=19a+M mod 30.
Sea e=2b+4c+6d+N mod 7.

Entonces:

  • Si d+e<10, entonces la Pascua será el día d+e+22 de Marzo.

  • Si d+e>9, entonces la Pascua será el día d+e-9 de Abril

  • Si la fecha obtenida es el 26 de Abril, entonces la Pascua se adelanta una semana y será el 19 de Abril.

  • Si la fecha obtenida es el 25 de abril, con d=28, e=6 y a>10, entonces la Pascua se adelanta 1 semana y caerá en el 18 de abril.


Veamos un ejemplo de cómo funciona, comprobando la Pascua para el presente año, es decir, con A=2009. En este caso:
a=2009 mod 19, es decir, a=14.
b=2009 mod 4, es decir, b=1.
c=2009 mod 7, es decir, c=0.
d=19a+M mod 30, en este caso, d=290 mod 30, es decir, d=20.
e=2b+4c+6d+N mod 7, en este caso, e=127 mod 7, es decir, e=1.
Como d+e=21>9, la Pascua será el día d+e-9=12 de Abril, que es, precisamente, el próximo Domingo.

En fin, en el artículo de la Wikipedia sobre cáluclo de la fecha de Pascua, en el que se basa esta entrada, podéis encontrar programas en diferentes lenguajes de programación para calcular estas fechas, así como más datos al respecto.

Tito Eliatron Dixit.

12 comentarios:

  1. Hola Tito, cuanto tiempo! Yo en su dia me interese por el tema, y localice otro algoritmo que usa algo de numeros aureos, creo que es el que comentas en tu entrada, te copio aqui el codigo fuente para calcularlo en Delphi (pascal) por is alguien tiene interes (incluye la fuente de donde lo saque):

    //Fuente: http://www.ciencia-hoy.retina.ar/hoy35/pasc01.htm
    function DomingoDePascua(anno: integer): TDateTime;
    var g, c, x, z, d, e, dia, mes: integer;
    begin
    //g = numero aureo (el ordinal del año en el ciclo de Metón, entre 1 y 19)
    g:= anno mod 19 + 1;
    c:= round(anno/100)+1;
    x:= 3*round(c/4)-12;
    z:= round((8*c+5)/25)-5;
    d:= 5*round(anno/4)-x-10;
    //e = epacta (numeral del día del mes lunar, de O a 29, con 1 como el correspondiente a Luna nueva)
    e:= (11*g+20+z-x) mod 30;
    if ((e=25) and (g>11)) then
    e:= e-24;
    //Calcular la fecha de la luna segun el ciclo de Meton
    dia:=44-e;
    //Si la fecha es anterior al 21 de marzo aumentar a abril
    //El intervalo posible es del 22-3 al 25-4 inclusive.
    if (dia<21) then
    dia:= dia+30;
    dia:= dia+7 - (d+dia) mod 7;
    mes:= 3;
    if(dia>31) then begin
    mes:= 4;
    dia:= dia-31;
    end;
    result:= EncodeDate(anno, mes, dia);
    end;

    ResponderEliminar
  2. Muy Interesante Sergio... y cuánto tiempo, sí.

    Pero.. ¿tendrías el código en PHP? es que en Semana Santa tengo poco tiempo para traducir códigos... y sí, soy un poco bastante vago ;-)


    En fin, que gracias por la aportación. Muy interesante, como siempre.

    ResponderEliminar
  3. Me pareció un muy buen artículo, nunca me hubiera imaginado que Gauss hubiera ideado algo así.

    Al principio pensé que en donde pones:
    "a=A mod 19"
    Te referías a las clásicas congruencias y que, por algún problema con los símbolos, habías dejado "=" en vez de las 3 lineas que se ponen en las congruencias... ¡Pero si no son lo mismo! He encontrado que no es precisamente lo mismo la "operación módulo" y la congruencia, aunque están muy relacionados...

    ¿Podrías explicar algo del tema? Gracias.
    Me gusta mucho el Blog.

    ResponderEliminar
  4. P. cuando se dice que a=A mod 19, se refiere que al realizar la división (euclídea) de A entre 19, el resto es exactamente "a".

    ResponderEliminar
  5. Hola Tito, no, solo lo tengo en "Pascal" y, en el articulo que menciono está en "C". Traducirlo seria sencillo, pero hay que saber PHP y en eso yo ando un poco "pez".

    ResponderEliminar
  6. En fin, si tuviera tiempo y ganas, igual lo hago.


    Gracias.

    ResponderEliminar
  7. Interesante articulo, sin embargo, la forma no matematica decalcular es asignando la semana santa a la semana donde cae la primera luna llena despues del 21 de marzo, eso es por q luna llena debe ser lo mas cercana si no es el mismo dia del viernes santo por tradicion. y hasta donde se el metodo q explico es el q se utiliza en general.

    ResponderEliminar
  8. Eso es asi, siempre y cuando no coincida con la Pascua Judía.

    Además, el problema consiste en saber cuándo será la primera luna llena después del 21 de Marzo.

    ResponderEliminar
  9. Bueno, en la misma wikipedia tienes un bonito codigo en PHP que calcula esta fecha, aunque a lo mejor prefieres el codigo propuesto con el numero aureo

    http://es.wikipedia.org/wiki/C%C3%A1lculo_de_la_fecha_de_Pascua.
    tienes otro php en http://micropakito.wordpress.com/2008/01/20/fechas-de-semana-santa/

    ResponderEliminar
  10. Tanto el PHP de la Wikipedia (que ya probé con éxito) como el del enlace que propones, se basan en el algoritmo de Gauss.

    Yo querría el PHP del algoritmo del número de oro.

    Gracias de todas formas, Hands.

    ResponderEliminar
  11. He estado transcribiendo el codigo propuesto por el camarada sergio al php y a pesar de efectuar calculos, estos no siempre corresponden a un domingo, por lo que me he permitido efectuar una correccion al domingo mas proximo.
    Los calculos obtenidos a partir de esta correccion obedencen a un termino poco matematico que los profanos denominamos, "casi".
    de hecho no me habria dado cuenta si no hubiera extendido la lista hasta el año 2018, año en el que me falla el asunto, a pesar de todo, os dejo la traduccion al objeto de que la mejoreis si os gustan los rompecabezas.
    http://pastebin.mysql-es.org/show/LmEgXWra

    ResponderEliminar
  12. Como ya te comenté, el método de Gauss es únicamente uno de los muchos algoritmos que se han creado para calcular la Semana Santa.

    Eso sí, el de Gauss tiene el mérito de ser el primero, y de seguir siendo útil.

    ResponderEliminar

Si no comentas, Gauss se comerá una integral.
Y, por favor, respeta a todos con tus opiniones.