Congruencia de Zeller.

          @ 1-Octubre-2007 - Clasificado en Algoritmos

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

Schiele Egon. Agony

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.

Para el calendario Gregoriano la congruencia de Zeller es

para el calendario Juliano es:

donde h es el día de la semana (0 = sábado, 1 = domingo, 2 = lunes, …), q es el día del mes, m es el mes, J es la centuria (es realidad ⌊año / 100⌋) y K el año de la centuria (año mod 100). Enero y febrero se cuentan como meses 13 y 14 del año anterior.

En las implementaciones informáticas en las que el módulo de un número negativo es negativo, la manera más sencilla de obtener un resultado entre 0 y 6 es reemplazar - 2 J por + 5 J y - J por + 6 J.

Estas fórmulas se basan en la observación de que el día de la semana progresa de una manera predecible basada en cada subparte de esa fecha. Cada término de la fórmula se usa para calcular el desplazamiento necesario para obtener el día correcto de la semana.

Por tanto, para el calendario Gregoriano, las diversas partes de esta fórmula pueden entenderse así:

q representa la progresión del día de la semana basada en el día del mes, dado que cada día sucesivo resulta en un desplazamiento adicional de 1 en el día de la semana.

K representa la progresión del día de la semana basada en el año. Suponiendo que cada año tiene 365 días, la misma fecha de cada año sucesivo será desplazada por un valor de 365 mod 7 = 1

Como hay 366 días en cada año bisiesto, esto de debe tener en cuenta añadiendo un día adicional al valor de desplazamiento del día de la semana. Esto se logra añadiendo [K/4] al desplazamiento. Este término se calcula como un resultado entero. Cualquier resto que pueda haber es descartado. Usando una lógica similar, se puede calcular la progresión del día de la semana para cada centuria observando que hay 36524 días en una centuria normal, y 36525 en cada centuria divisible por 400. Dado que 36525 mod 7 =6 y 36524 mod 7 = 5 , el término [J/4]-2J refleja esto (de nuevo usando división entera y descartando cualquier resto fraccional). Para evitar los números negativos, este término se puede reemplazar por 5J+[J/4] con un resultado equivalente.

El término [ (M+1)26/10] se puede explicar de la siguiente manera. Zeller observó que, al iniciar cada año el 1 de marzo, el día de la semana de cada mes sucesivo progresaba multiplicando el mes por un valor constante y descartando el resto fraccional.

La función global, mod 7 , normaliza el resultado para que se encuentre en el intervalo de 0 a 6, lo que da el índice del día de la semana correcto para la fecha analizada.

La razón por la que la fórmula difiere para el calendario juliano es que este calendario no tiene una regla aparte para las centurias bisiestas y está desplazado con respecto al calendario gregoriano un número fijo de días. Ambas diferencias se pueden tener en cuenta reemplazando el término [J/4]-2J por el término 5 − J, o 5 + 6J para evitar números negativos.

Resumiendo:

Si d es el día, m es el mes y y es el año:

z:= (700 +(26 * a - 2) DIV 10 + d +b +b DIV 4+ c DIV 4 -2 * c) MOD 7

donde:

Si m <=2  (a=m+10 , b=(y-1) MOD 100, c=(y-1) DIV 100

Si m>=3 (a=m-2 , b=y MOD 100 , c=y DIV 100)

en la formula anterior z devolverá un valor comprendido ente 0 y 6. Donde 0 es domingo, 1 es lunes y así sucesivamente.

ALGORITMO

IMPLEMENTACIÓN

23 comentarios

  1. Volleague Agosto 2, 2010 14:04

    Very well written!

  2. Rhindynenue Agosto 3, 2010 5:27

    How much you have interesting things on the blog.

  3. ererneguinoup Agosto 3, 2010 13:44

    Thanks for the interesting topic. Tell your friends.

  4. arrormaPayorp Agosto 3, 2010 16:37

    It should come back to this blog and read.

  5. NusIntantynut Agosto 3, 2010 19:05

    Very well written!

  6. essesyptota Agosto 4, 2010 7:54

    Somewhere I read it already. It is possible that you reprint.

  7. moxtoilia Agosto 4, 2010 12:21

    Is it possible that this is all so. As will be detailed during write.

  8. Mailssweate Agosto 4, 2010 15:38

    Thanks for such a good blog! Recommend friends.

  9. Stallokssor Agosto 4, 2010 19:31

    How much you have interesting things on the blog.

  10. Alleglink Agosto 5, 2010 8:33

    Yes, all true. It is again read.

  11. Daskalkasusia Agosto 5, 2010 11:36

    That’s right I said! Author fellow. Nothing to add ….

  12. abannyagreeda Agosto 5, 2010 16:09

    Thanks for the interesting blog!

  13. dsuch Agosto 6, 2010 17:51

    Und es sind noch die Varianten möglich?

  14. NaThale Agosto 7, 2010 0:57

    Glamorous

  15. online gambling Agosto 9, 2010 20:50

    Always enjoy your posts, your real, and some times funny as well. keep it up!

  16. NewLeaX Agosto 11, 2010 7:13

    It agree, very useful idea

  17. tempotst Agosto 16, 2010 22:32

    The author, I thank for a post, the theme for me is actual, I will add your site in bookmarks!

  18. emecehamp Agosto 27, 2010 8:40

    It’s very good that we can share opinions on this topic here, because as William R. Alger told, “Public opinion is a second conscience.”

  19. Artwork Hairstyles Agosto 27, 2010 11:49

    How much money would an average college philosopher make?

  20. Brinks Inc Septiembre 30, 2010 0:44

    I’m glad that I’ve found your http://www.mequieres.com web site.
    You sure can write and teach and inspire. Keep writing - I’ll keep reading.

  21. TaubvadaCak Diciembre 8, 2010 21:46

    Muy buen articulo, estoy casi 100% de acuerdo contigo :)

  22. abnoftroant Diciembre 10, 2010 2:40

    Felicitaciones, muy interesante el post, espero que sigas actualizandolo!

  23. CARLOS Junio 27, 2011 22:47

    mas claros en las especificaciones….

    xq no hay nada bueno serotes…

Anterior entrada: Pasos hacia atrás.