Congruência de Zeller

Congruência de Zeller é um algoritmo criado por Christian Zeller para calcular o dia da semana de qualquer data nos calendários juliano ou gregoriano.

Fórmula

Para um calendário gregoriano, a congruência de Zeller é

h = ( q + ( m + 1 ) 26 10 + K + K 4 + J 4 2 J ) mod 7 , {\displaystyle h=\left(q+\left\lfloor {\frac {(m+1)26}{10}}\right\rfloor +K+\left\lfloor {\frac {K}{4}}\right\rfloor +\left\lfloor {\frac {J}{4}}\right\rfloor -2J\right)\mod 7,}

Já para o calendário juliano, ela é

h = ( q + ( m + 1 ) 26 10 + K + K 4 + 5 J ) mod 7 , {\displaystyle h=\left(q+\left\lfloor {\frac {(m+1)26}{10}}\right\rfloor +K+\left\lfloor {\frac {K}{4}}\right\rfloor +5-J\right)\mod 7,}

em que

  • h é o dia da semana (0 = sábado, 1 = domingo, 2 = segunda, …)
  • q é o dia do mês
  • m é o mês (3 = março, 4 = abril, 5 = maio, …)
  • K é o ano do século ( a n o mod 100 {\displaystyle ano\mod 100} )
  • J é o século ( a n o / 100 {\displaystyle \lfloor ano/100\rfloor } ) (por exemplo, para 1995 o século seria 19, ainda que na realidade o século seria XX)

Nota 1: Neste algoritmo, janeiro e fevereiro são contados como os meses 13 e 14 do ano anterior. Em outras palavras, dado um ano X qualquer, para você clacular o dia da semana desse ano no mês de Janeiro ou Fevereiro, você tem que calcular como se o ano fosse X-1. (Por exemplo: para saber o dia da semana do ano de 1995 de todos os meses de Março até Dezembro, eu utilizo a fórmula como ta prescrito acima. mas para saber o dia da semana do Mês de Janeiro e Fevereiro do ano de 1995, eu teria que fazer o cálculo como se fosse o ano de 1994.)

Nota 2: Para o dia do mês em ISO (1 = segunda, …), use d = ( ( h + 5 ) mod 7 ) + 1 {\displaystyle d=((h+5)\mod 7)+1}

Implementação em software

As fórmulas anteriores requerem a definição matemática da operação módulo, que significa que 2 mod 7 = + 5 {\displaystyle -2\mod 7=+5} . Entretanto, a maioria das linguagens de programação implementam a função de resto, de forma que 2 mod 7 = 2 {\displaystyle -2\mod 7=-2} . Portanto, para implementar a congruência de Zeller em um computador, as fórmulas devem ser alteradas para assegurar um numerador positivo. A forma mais simples de se fazer isso é substituir 2 J {\displaystyle -2J} por + 5 J {\displaystyle +5J} e J {\displaystyle -J} por + 6 J {\displaystyle +6J} . Assim, as fórmulas se tornam:

h = ( q + ( m + 1 ) 26 10 + K + K 4 + J 4 + 5 J ) mod 7 , {\displaystyle h=\left(q+\left\lfloor {\frac {(m+1)26}{10}}\right\rfloor +K+\left\lfloor {\frac {K}{4}}\right\rfloor +\left\lfloor {\frac {J}{4}}\right\rfloor +5J\right)\mod 7,}

para o calendário gregoriano e

h = ( q + ( m + 1 ) 26 10 + K + K 4 + 5 + 6 J ) mod 7 , {\displaystyle h=\left(q+\left\lfloor {\frac {(m+1)26}{10}}\right\rfloor +K+\left\lfloor {\frac {K}{4}}\right\rfloor +5+6J\right)\mod 7,}

para o calendário juliano.

Zeller usava aritmética decimal, e achou conveniente usar J {\displaystyle J} & K {\displaystyle K} para representar o ano. Mas usando um computador é mais simples lidar com o ano modificado Y usando Y, Y div 4, e para o calendário gregoriano também Y div 100 & Y div 400.

Ver também

  • Algoritmo Doomsday