11 de outubro de 2008

Calculando a Data da Páscoa em Python


Você já parou para pensar de onde vieram certas datas comemorativas do nosso calendário?

Estava pensando sobre isso e cheguei à conclusão de que existem três tipos de datas:
  1. Datas fixas (e.g., Natal, Dia do Trabalho, Independência do Brasil, Dia dos Namorados).
  2. Datas fixas por dia da semana (e.g., Dia dos Pais e das Mães).
  3. Datas móveis (e.g., Páscoa, Carnaval, Corpus Christi).

O primeiro tipo de datas não tem mistério: acontece naquele dia e pronto. O segundo tipo também é traquilo de se entender: pegue um dia da semana de determinado mês e você tem a data – no segundo domingo de agosto é dia dos pais, por exemplo. Já o terceiro tipo é mais intrigante: nem sempre o carnaval é no dia 5 de fevereiro e, às vezes, nem é comemorado no mesmo mês de outros anos.

Foquemo-nos no terceiro tipo de datas. Como saber quando será a sexta-feira da paixão ou o Corpus Christi? Não sei se repararam, mas todas estas comemorações móveis estão relacionadas à cultura cristã e todas as datas se baseiam na data da Páscoa. Por exemplo:
  • Carnaval: 47 dias antes da Páscoa.
  • Ramos: 7 dias antes da Páscoa.
  • Paixão: 2 dias antes da Páscoa.
  • Ascenção: 39 dias após a Páscoa.
  • Pentecostes: 49 dias após a Páscoa.
  • Corpus Christi: 60 dias após a Páscoa.

Posto isso, surge a dúvida: como calcular a data da Páscoa? A resposta é que a Páscoa ocorre no primeiro domingo após a primeira lua cheia após 21 de março (equinócio de primavera no hemisfério norte):
  1. Encontre o dia 21 de março.
  2. Encontre a primeira lua cheia após esta data.
  3. A Páscoa será o primeiro domingo após a data encontrada no passo 2.

Curiosidade: A Igreja assumiu que o equinócio de primavera no hemisfério norte sempre ocorre no dia 21 de março e por isso esta data prevalece no algoritmo. Desta forma, tem-se que as datas extremas para a Páscoa são 22 de março e 25 de abril. Contudo, sabe-se que o equinócio pode acontecer até dois dias antes do dia 21 de março.


Difícil? Nem um pouco comparado ao algoritmo de cálculo desta data, do astrônomo francês Jean Baptiste Joseph Delambre (1749-1822):
  1. a = o resto de (Ano ÷ 19)
  2. b = o inteiro de (Ano ÷ 100)
  3. c = o resto de (Ano ÷ 100)
  4. d = o inteiro de (b ÷ 4)
  5. e = o resto de (b ÷ 4)
  6. f = o inteiro de [(b + 8) ÷ 25]
  7. g = o inteiro de [(b - f + 1) ÷ 3]
  8. h = o resto de [(19 * a + b - d - g + 15) ÷ 30]
  9. i = o inteiro de (c ÷ 4)
  10. j = o resto de (c ÷ 4)
  11. k = o resto de [(32 + 2 * e + 2*i - h - j) ÷ 7]
  12. m = o inteiro de [(a + 11 * h + 22 * k) ÷ 451]
  13. n = o inteiro de [(h + k - 7 * m + 114) ÷ 31]
  14. p = 1 + o resto de [(h + k - 7 * m + 114) ÷ 31]
  15. A Páscoa será no dia p do mês n.

Ainda não está complicado o bastante? Então vamos melhorar as coisas.

O calendário que utilizamos atualmente foi criado pelo Papa Gregório XIII em 1582 e por isso passou a ser denominado Calendário Gregoriano. Antes desta data, era usado o Calendário Juliano, criado pelo então imperador de Roma, Júlio César em 46 a.C. Desta forma, para anos inferiores a 1583 [1], outro algoritmo de cálculo para a Páscoa deve ser usado:
  1. a = o resto de (Ano ÷ 4)
  2. b = o resto de (Ano ÷ 7)
  3. c = o resto de (Ano ÷ 19)
  4. d = o resto de [(19*c + 15) ÷ 30]
  5. e = o resto de [(2 * a + 4 * b - d + 34) ÷ 7]
  6. f = o inteiro de [(d + e + 114) ÷ 31]
  7. g = 1 + o resto de [(d + e + 114) ÷ 31]
  8. A Páscoa será no dia g do mês f.

Sabendo dos algoritmos, basta codificá-los numa linguagem de programação para que o computador possa realizar os cálculos para nós. No link abaixo há um programa completo (desenvolvido por mim) em Python que implementa, além da função para cálculo da data da Páscoa, rotinas que calculam o Carnaval, Domingo de Ramos, Sexta-feira da Paixão, Ascenção de Cristo, Pentecostes e Corpus Christi, de acordo com um ano especificado pelo usuário.

Só para concluir, é interessante notar como este tipo de problema nos enriquece culturalmente quando bem explorados. A dúvida inicial era como os dias são calculados e, para descobrirmos isso, tivemos que aprender, além do algoritmo, um pouco da história da evolução dos calendários. Então, se o tempo levado para entendimento do problema for comparado com o tempo levado para codificação do algoritmo, percebe-se claramente que o primeiro demandou mais tempo que o segundo. Para mim, isso só reforça a tese de que a maior parte do tempo de desenvolvimento de um projeto (software) deve estar focada no seu planejamento (análise e engenharia) e a menor parte na implementação (programação).
Nota: Os algoritmos para cálculo da data da Páscoa e algumas informações sobre esta data foram retirados da página pessoal de Telmo Ghiorzi.


[1] Prefiro usar o ano de 1583, já que o calendário gregoriano começou a ser usado na segunda metade do ano de 1582 – sim, estou arredondando!

Leia Também

5 comentários:

  1. eu quero saber o dia que a pascoa começou a ser comemoradaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

    ResponderExcluir
  2. Achei a sua página sobre o cálculo da datas móveis muito interessante e informativa.
    Cheguei mesmo a usar o excelente programa em python no meu nokia 5800 xm.
    Contudo ele avariou e depois de reparado voltei aqui pra descarregar novamente o ficheiro mobiledates.py. Só que o link está quebrado no rapidshare.
    Será que você podia repôr o link, ou em alternativa, enviar-me pro mail?
    Agradecido pela atençãoe bom ano 2010!
    Sesinando

    ResponderExcluir
  3. @sesi Reupei o arquivo e atualizei o link! Um ótimo 2010 pra todos nós, a propósito...
    Enter with the year : 2010
    Carnaval.....: 16/02/2010 - Tuesday
    Ramos........: 28/03/2010 - Sunday
    Paixao.......: 02/04/2010 - Friday
    Pascoa.......: 04/04/2010 - Sunday
    Ascensao.....: 13/05/2010 - Thursday
    Pentecostes..: 23/05/2010 - Sunday
    Corpus Cristi: 03/06/2010 - Thursday
    Abraço!

    ResponderExcluir
  4. Cara o link ta Off. cara tente baixar e sempre aparece que o arquivo nao esta disponivel.

    ResponderExcluir