Algoritmo para calcular el día de la semana.
La congruencia de Zeller es un algoritmo ideado por Christian Zeller en el siglo XIX para calcular el día de la semana para cualquier fecha del calendario juliano o gregoriano . Se puede considerar que se basa en la conversión entre el día juliano y la fecha del calendario.
Fórmula
Para el calendario gregoriano, la congruencia de Zeller es
![{\displaystyle h=\left(q+\left\lfloor {\frac {13(m+1)}{5}}\right\rfloor +K+\left\lfloor {\frac {K}{4}}\right \rfloor +\left\lfloor {\frac {J}{4}}\right\rfloor -2J\right){\bmod {7}},}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
para el calendario juliano es
![{\displaystyle h=\left(q+\left\lfloor {\frac {13(m+1)}{5}}\right\rfloor +K+\left\lfloor {\frac {K}{4}}\right \rpiso +5-J\right){\bmod {7}},}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
dónde
- h es el día de la semana (0 = sábado, 1 = domingo, 2 = lunes, ..., 6 = viernes)
- q es el día del mes
- m es el mes (3 = marzo, 4 = abril, 5 = mayo, ..., 14 = febrero)
- K el año del siglo ( ).
![{\displaystyle año{\bmod {1}}00}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
- J es el siglo de base cero (en realidad ). Por ejemplo, los siglos de base cero para 1995 y 2000 son 19 y 20 respectivamente (no debe confundirse con la enumeración común de siglos ordinales que indica 20 en ambos casos).
![{\displaystyle \lfloor año/100\rfloor }](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
es la función piso o parte entera- mod es la operación de módulo o resto después de la división
En este algoritmo enero y febrero se cuentan como los meses 13 y 14 del año anterior. Por ejemplo, si es el 2 de febrero de 2010, el algoritmo cuenta la fecha como el segundo día del decimocuarto mes de 2009 (14/02/2009 en formato DD/MM/AAAA).
Para una fecha de semana ISO Día de la semana d (1 = lunes a 7 = domingo), utilice
![{\displaystyle d=((h+5){\bmod {7}})+1}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
Análisis
Estas fórmulas se basan en la observación de que el día de la semana avanza de manera predecible según cada subparte de esa fecha. Cada término dentro de la fórmula se utiliza para calcular la compensación necesaria para obtener el día correcto de la semana.
Por lo tanto, para el calendario gregoriano, las distintas partes de esta fórmula pueden entenderse de la siguiente manera:
representa la progresión del día de la semana según el día del mes, ya que cada día sucesivo da como resultado un desplazamiento adicional de 1 en el día de la semana.
representa la progresión del día de la semana según el año. Suponiendo que cada año tiene 365 días de duración, la misma fecha en cada año siguiente se compensará con un valor de .![{\displaystyle 365{\bmod {7}}=1}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
- Dado que hay 366 días en cada año bisiesto, esto debe contabilizarse agregando otro día al valor de compensación del día de la semana. Esto se logra agregando al desplazamiento. Este término se calcula como un resultado entero. Cualquier resto se descarta.
![{\displaystyle \left\lfloor {\frac {K}{4}}\right\rfloor }](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
- Utilizando una lógica similar, la progresión del día de la semana para cada siglo se puede calcular observando que hay 36.524 días en un siglo normal y 36.525 días en cada siglo divisible por 400. Desde y , el término da cuenta de esto.
![{\displaystyle 36525{\bmod {7}}=6}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle 36524{\bmod {7}}=5}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle \left\lfloor {\frac {J}{4}}\right\rfloor -2J}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
- El plazo se ajusta por la variación de los días del mes. A partir de enero, los días de un mes son {31, 28/29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}. Los 28 o 29 días de febrero son un problema, por lo que la fórmula traslada enero y febrero hasta el final para que la cuenta corta de febrero no cause un problema. La fórmula está interesada en los días de la semana, por lo que los números en la secuencia se pueden tomar módulo 7. Entonces, el número de días en un mes módulo 7 (aún comenzando con enero) sería {3, 0/1, 3, 2 , 3, 2, 3, 3, 2, 3, 2, 3}. A partir de marzo, la secuencia básicamente alterna 3, 2, 3, 2, 3, pero cada cinco meses hay dos meses seguidos de 31 días (julio-agosto y diciembre-enero). [1] La fracción 13/5 = 2,6 y la función suelo tienen ese efecto; el denominador de 5 establece un período de 5 meses.
![{\displaystyle \left\lfloor {\frac {13(m+1)}{5}}\right\rfloor }](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
- La función general, normaliza el resultado para que resida en el rango de 0 a 6, lo que produce el índice del día correcto de la semana para la fecha que se analiza.
![{\displaystyle \operatorname {mod} \,7}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
La razón por la que la fórmula difiere para el calendario juliano es que este calendario no tiene una regla separada para los siglos bisiestos y está compensado del calendario gregoriano por un número fijo de días cada siglo.
Dado que el calendario gregoriano fue adoptado en diferentes momentos en diferentes regiones del mundo, la ubicación de un evento es importante para determinar el día correcto de la semana para una fecha que ocurrió durante este período de transición. Esto solo se requiere hasta 1929, ya que este fue el último año en que el calendario juliano todavía estaba en uso en cualquier país del mundo y, por lo tanto, no se requiere para 1930 o después.
Las fórmulas se pueden utilizar de forma proléptica, pero el "año 0" es en realidad el año 1 a. C. (ver numeración de años astronómicos ). De hecho, el calendario juliano es proléptico hasta el 1 de marzo del 4 d.C. debido a la mala gestión en Roma (pero no en Egipto) en el período desde que el calendario entró en vigor el 1 de enero del 45 a.C. (que no era un año bisiesto). Además, el operador de módulo podría truncar números enteros en la dirección incorrecta (techo en lugar de suelo). Para dar cabida a esto, se puede añadir un múltiplo suficiente de 400 años gregorianos o 700 julianos.
Ejemplos
Para el 1 de enero de 2000, la fecha se trataría como el mes 13 de 1999, por lo que los valores serían:
![{\displaystyle q=1}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle m=13}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle K=99}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle J=19}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
Entonces la fórmula se evalúa como .![{\displaystyle (1+36+99+24+4-38){\bmod {7}}=126{\bmod {7}}=0={\text{sábado}}}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
(El 36 proviene de , truncado a un número entero).![{\displaystyle (13+1)\times 13/5=182/5}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
Sin embargo, para el 1 de marzo de 2000, la fecha se trata como el tercer mes de 2000, por lo que los valores se convierten en
![{\displaystyle q=1}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle m=3}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle K=0}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle J=20}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
entonces la fórmula se evalúa como .![{\displaystyle (1+10+0+0+5-40){\bmod {7}}=-24{\bmod {7}}=4={\text{miércoles}}}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
Implementaciones en software.
Modificación básica
Las fórmulas se basan en la definición matemática de división de módulo , lo que significa que −2 mod 7 es igual a positivo 5. Desafortunadamente, en la forma truncada, la mayoría de los lenguajes de computadora implementan la función del resto, −2 mod 7 devuelve un resultado de −2. Entonces, para implementar la congruencia de Zeller en una computadora, las fórmulas deben modificarse ligeramente para asegurar un numerador positivo. La forma más sencilla de hacer esto es reemplazar − 2 J con + 5 J y − J con + 6 J .
Para el calendario gregoriano, la congruencia de Zeller se vuelve
![{\displaystyle h=\left(q+\left\lfloor {\frac {13(m+1)}{5}}\right\rfloor +K+\left\lfloor {\frac {K}{4}}\right \rfloor +\left\lfloor {\frac {J}{4}}\right\rfloor +5J\right){\bmod {7}},}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
Para el calendario juliano, la congruencia de Zeller se vuelve
![{\displaystyle h=\left(q+\left\lfloor {\frac {13(m+1)}{5}}\right\rfloor +K+\left\lfloor {\frac {K}{4}}\right \rpiso +5+6J\right){\bmod {7}},}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
Se puede ver fácilmente que, en un año determinado, el último día de febrero y el 1 de marzo son buenas fechas de prueba.
Como nota al margen, si tenemos un número de tres dígitos abc, donde a, b y c son los dígitos, cada uno de ellos no es positivo si abc no es positivo; tenemos (abc) mod 7 = 9*a + 3*b + c. Repita la fórmula hasta un solo dígito. Si el resultado es 7, 8 o 9, resta 7. Si, en cambio, el resultado es negativo, suma 7. Si el resultado sigue siendo negativo, suma 7 una vez más. Utilizando este enfoque, podemos evitar las preocupaciones sobre las diferencias específicas del idioma en las evaluaciones del mod 7. Esto también puede mejorar una técnica de cálculo mental.
Simplificación común
Zeller usó aritmética decimal y encontró conveniente usar J y K para representar el año. Pero cuando se usa una computadora, es más sencillo manejar el año Y y el mes m modificados , que son Y - 1 y m + 12 durante enero y febrero:
Para el calendario gregoriano, la congruencia de Zeller se vuelve
![{\displaystyle h=\left(q+\left\lfloor {\frac {13(m+1)}{5}}\right\rfloor +Y+\left\lfloor {\frac {Y}{4}}\right \rfloor -\left\lfloor {\frac {Y}{100}}\right\rfloor +\left\lfloor {\frac {Y}{400}}\right\rfloor \right){\bmod {7}} ,}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
En este caso no hay posibilidad de desbordamiento debido al único término negativo porque .![{\displaystyle \left\lfloor Y/4\right\rfloor \geq \left\lfloor Y/100\right\rfloor }](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
Para el calendario juliano, la congruencia de Zeller se vuelve
![{\displaystyle h=\left(q+\left\lfloor {\frac {13(m+1)}{5}}\right\rfloor +Y+\left\lfloor {\frac {Y}{4}}\right \rpiso +5\right){\bmod {7}},}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
El algoritmo anterior se menciona para el caso gregoriano en RFC 3339, Apéndice B, aunque en forma abreviada que devuelve 0 para el domingo.
Otras variaciones
Al menos otros tres algoritmos comparten la estructura general de la congruencia de Zeller en su tipo de "simplificación común", utilizando también un m ∈ [3, 14] ∩ Z y el constructo "año modificado".
- Michael Keith publicó un fragmento de código C muy corto en 1990 para fechas gregorianas. El componente de duración del mes ( ) se reemplaza por . [2]
![{\displaystyle \left\lfloor {\frac {13(m+1)}{5}}\right\rfloor }](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle \left\lfloor {\frac {23m}{9}}\right\rfloor +4}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
- JR Stockton proporciona una versión Sunday-is-0 con , llamándola una variación de Zeller. [2]
![{\displaystyle \left\lfloor {\frac {13(m-2)}{5}}\right\rfloor +2}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
- Claus Tøndering lo describe como un sustituto del Sunday-is-0. [3]
![{\displaystyle \left\lfloor {\frac {31(m-2)}{12}}\right\rfloor }](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
Se puede demostrar que ambas expresiones progresan de una manera que está desviada en uno en comparación con el componente de duración del mes original en el rango requerido de m , lo que da como resultado un valor inicial de 0 para el domingo.
Ver también
Referencias
- ^ La regla de cada cinco meses solo se aplica a los doce meses de un año que comienza el 1 de marzo y finaliza el último día del febrero siguiente.
- ^ ab Stockton, J R. "Material relacionado con la congruencia de Zeller". "Merlyn", archivado en NCTU Taiwán .
- ^ Tøndering, Claus. "Preguntas relacionadas con la semana". www.tondering.dk .
Bibliografía
Cada uno de estos cuatro artículos con imágenes similares trata, en primer lugar, del día de la semana y, en segundo lugar, de la fecha del Domingo de Pascua, para los calendarios juliano y gregoriano. Las páginas enlazan con traducciones al inglés.
- Zeller, cristiano (1882). "Die Grundaufgaben der Kalenderrechnung auf neue und vereinfachte Weise gelöst". Württembergische Vierteljahrshefte für Landesgeschichte (en alemán). V : 313–314. Archivado desde el original el 11 de enero de 2015.
- Zeller, cristiano (1883). "Problema dúplex Calendarii fundamentale". Bulletin de la Société Mathématique de France (en latín). 11 : 59–61. Archivado desde el original el 11 de enero de 2015.
- Zeller, cristiano (1885). "Calendario-Formeln". Mathematisch-naturwissenschaftliche Mitteilungen des mathematisch-naturwissenschaftlichen Vereins en Württemberg (en alemán). 1 (1): 54–58. Archivado desde el original el 11 de enero de 2015.
- Zeller, cristiano (1886). "Calendario-Formeln". Acta Mathematica (en alemán). 9 : 131-136. doi : 10.1007/BF02406733 .
enlaces externos
- Las obras calendáricas del Rektor Chr. Zeller: Las fórmulas del día de la semana y de Pascua de JR Stockton, cerca de Londres, Reino Unido. El sitio incluye imágenes y traducciones de los cuatro artículos anteriores y de la tarjeta de referencia de Zeller "Das Ganze der Kalender-Rechnung".
Este artículo incorpora material de dominio público de Paul E. Black. "La congruencia de Zeller". Diccionario de Algoritmos y Estructuras de Datos . NIST .