Portada arrow Algoritmos arrow Congruencia de Zeller. Un ingenioso algoritmo para obtener un calendario perpetuo.
Congruencia de Zeller. Un ingenioso algoritmo para obtener un calendario perpetuo.
miércoles, 04 de octubre de 2006

La congruencia de Zeller es un algoritmo que permite obtener, a partir de una fecha, el día de la semana que le corresponde.

Se atribuye su creación a Julius Christian Johannes Zeller, un sacerdote protestante alemán que vivió en el siglo XIX.

Zeller observó que existía una dependencia entre las fechas del calendario gregoriano y el día de la semana que les correspondía. A raíz de esa observación, obtuvo (se dice que por tanteo), esta fórmula, en apariencia mágica, que lleva su nombre.

La fórmula en sí es muy sencilla, y se basa en algunas operacione de aritmética modular (el resto, también llamado módulo, de las divisiones)

Es necesario tener en cuenta que la fórmula presentada a continuación es válida sólo para el calendario gregoriano External link, promulgado por el papa Gregorio XIII en 1582, pero adoptado en distintas fechas en cada país.

Si quieres conocer el por qué del funcionamiento de esta fórmula, lee éste External link excelente artículo de la wikipedia (en inglés)

Para calcular la congruencia de zeller, se parte de una fecha del calendario gregoriano, que consideraremos como tres enteros: año, mes (1=enero, 12=diciembre) y día.

Primeramente, es necesario hacer algunos ajustes en el mes y el año. Si el mes es enero o febrero (1 o 2) se considerarán como el mes 13 o 14 del año anterior. A partir de ahí, basta con aplicar la fórmula.

Pasos:

 
-Sean año, mes, dia tres enteros que representan
 a una fecha del calendario gregoriano
-Si mes<=2
   -mes=mes+12
   -año=año-1
-si no
   -mes=mes-2
-a=año mod 100
-b=año / 100 //división entera
-d=( 700 + 
       (mes*26-2)/10 +
       dia +
       a +
       a / 4 + //división entera
       b / 4 - //división entera
       b * 2
     ) mod 7
//d es un entero que representa al dia de la semana
//tal que domingo es 0, lunes es 1... sábado es 6

Este fragmento de código en C# calcula el día de la semana utilizando la congruencia de Zeller.

 
int Zeller(int anno, int mes, int dia)
   {       if (mes <= 2)
          {
              mes = mes + 10;
              anno = anno - 1;
           }
       else
          {
              mes = mes - 2;
          }
       int a= anno % 100;
       int b= anno / 100;
       int resultado = 
            ( 
               700 +
               ((26 * mes -2) / 10) +
               dia +
               a+
               a/ 4 +
               b/ 4 - 
               2 * b
            ) % 7;
       return resultado;
   }

(0=domingo; 1=lunes... 6=sábado)

 
←Artículo anterior   Artículo siguiente→

Categorías

¿Quién está en línea?

 web tracker

Suscríbete

RSS feed Sindicación RSS

(¿Qué es la sindicación RSS?)


Suscribir por e-mail

¿Dónde estoy?

Estás en La tecla de ESCAPE, un sitio web personal en el que nos gusta hablar de algoritmos, informática, tecnología, ciencia, ingeniería, internet... y cualquier tontería que se nos ocurra. El punto de vista de nuestros artículos técnicos suele ser muy básico, así que a menudo adoptamos grandes simplificaciones. (Más...-Términos de uso)