Cargando...
 

Congruencia de Zeller

Image
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 operaciones 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, 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 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:

Algoritmo en pseudocódigo
-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.

en C#
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;
   }


Devuelve un entero, que indica el día de la semana: 0=domingo; 1=lunes... 6=sábado)


Ultima edición por vic , basado en trabajo de admin .
Página última modificacion en Miércoles 25 de Julio, 2012 22:27:34 CEST.


2 páginas tienen enlace a Congruencia de Zeller

¿Dónde estoy?

Estás en La tecla de ESCAPE, un sitio web personal en el que nos gusta hablar de algoritmos, metodología de la programación, personajes de informática, tecnología, ingeniería del software, internet, y cualquier otra tontería que se nos ocurra.
Leer más / Términos de uso (ToS)

Este sitio web usa cookies para su funcionamiento. Navegar por éste sitio supone la aceptación de la política de cookies -
Política de cookies +