Script em Python do algoritmo de O’Beirne para calcular a data da Páscoa

Publiquei anteriormente o  algoritmo que calcula o dia de Páscoa dado um qualquer ano. Repito-o agora, acrescentando o respectivo script em Python.

O algoritmo é o seguinte:

Seja x o ano.

1. Divida-se x por 100 e anote-se o quociente (b) e o resto (c);

2. Tome-se 5b+c e divida-se por 19; chame-se a ao resto;

3. Calcule-se 3(b+25) e divida-se por 4; designe-se o quociente por δ e o resto por ɛ;

4. Calcule-se 8(b+11) e divida-se por 25; anote-se o valor do quociente (γ);

5. Calcule-se 19a+δγ e divida-se por 30; anote-se o valor do resto (h);

6. Calcule-se a+11h e divida-se por 319; anote-se o valor do quociente (μ);

7. Calcule-se 60(5-ɛ)+c e divida-se por 4; anote-se o valor do quociente (j) e do resto (k);

8. Calcule-se 2jkh+μ e divida-se por 7; anote-se o valor do resto (λ);

9. Calcule-se hμ+λ+110 e divida-se por 30; anote-se o valor do quociente (n) e do resto (q);

10. Calcule-se q+5-n e divida-se por 32; o quociente deve ser nulo e ao resto chame-se p.

Ao fim destes 10 passos obtém-se o Domingo de Páscoa: é o dia p do mês n do ano x.

E agora a sua  programação em Python, em que utilizei a propriedade de definição de funções desta linguagem. Decidi gerar duas funções, uma correspondente à versão portuguesa e a outra à inglesa. As funções são pascoa(x) e easter(x),  que se definem através da palavra reservada def. Para as chamar basta escrevê-las  a seguir ao prompt:

Exemplos da função pascoa(): 

 
>>> pascoa(2010)
Em 2010 o Domingo de Páscoa é no dia 4 de Abril
>>> pascoa(2011)
Em 2011 o Domingo de Páscoa é no dia 24 de Abril
 
 

Programa

O algoritmo é extremamente simples em termos de programação: é meramente sequencial, reproduzindo os 10 passos em cima listados. A barra ‘ / ‘ executa a divisão inteira (que corresponde à função floor).
 
def pascoa(x): # ‘script’ em Python que define a função
#                 pascoa(x), em que x é o ano.
#
#          Baseado no algoritmo de O’Beirne, em 10 passos,
#          para determinar a data do Domingo de Páscoa de
#          um dado ano. ( Calcula e escreve o dia e o mês )
#
#
b = x / 100
c = x – 100 * b
quociente = (5 * b + c) / 19
a = 5 * b + c – 19 * quociente
d = (3 * (b + 25)) / 4
e = 3 * (b + 25) – 4 * d
g = (8 * (b + 11)) / 25
quociente = (19 * a + d – g) / 30
h = 19 * a + d – g – 30 * quociente
m = (a + 11 * h) / 319
j = (60 * (5 – e) + c) / 4
k = 60 * (5 – e) + c – 4 * j
quociente = (2 * j – k – h + m) / 7
l = 2 * j – k – h + m – 7 * quociente
n = (h – m + l + 110) / 30
# n é o mês (valor numérico)
q = h – m + l + 110 – 30 * n
quociente = (q + 5 – n) / 32
p = q + 5 – n
              # p é o dia
if n == 3:
N = ‘Março’              # N é o nome do mês
else:
N = ‘Abril’
if quociente != 0:
print ‘erro’
else:
print ‘Em’, x, ‘o Domingo de Páscoa é no dia’, p, ‘de’, N

* * *

Exemplos da função easter():

>>> easter(2010)
In 2010 the Easter Sunday is on April 4

>>> easter(2011)
In 2011 the Easter Sunday is on April 24

def easter(x): # Python script that defines the easter(x)
#              function, where x is the year.
#
#          Based on the 10 step O’Beirne’s algorithm to
#          compute the date of Easter Sunday of a given
#          year.(Computes and writes the day and the month)
#
#
b = x / 100
c = x – 100 * b
quotient = (5 * b + c) / 19
a = 5 * b + c – 19 * quotient
d = (3 * (b + 25)) / 4
e = 3 * (b + 25) – 4 * d
g = (8 * (b + 11)) / 25
quotient = (19 * a + d – g) / 30
h = 19 * a + d – g – 30 * quotient
m = (a + 11 * h) / 319
j = (60 * (5 – e) + c) / 4
k = 60 * (5 – e) + c – 4 * j
quotient = (2 * j – k – h + m) / 7
l = 2 * j – k – h + m – 7 * quotient
n = (h – m + l + 110) / 30 # n is the month(numerical value)
q = h – m + l + 110 – 30 * n
quotient = (q + 5 – n) / 32
p = q + 5 – n
              # p is the day
if n == 3:
N = ‘March’              # N is the month name
else:
N = ‘April’
if quotient != 0:
print ‘error’
else:
print ‘In’, x, ‘the Easter Sunday is on’, N,

 

[Edição de 20.02.10: acrescentado o calendário, bem como o vídeo sobre os Monty Python, que estão relacionados com o nome da linguagem Python ]

Sobre Américo Tavares

eng. electrotécnico reformado / retired electrical engineer
Esta entrada foi publicada em Matemática, Programação, Python, Vídeo com as etiquetas , , . ligação permanente.

4 respostas a Script em Python do algoritmo de O’Beirne para calcular a data da Páscoa

  1. Renan

    Se achar por bem pode transcrever o seu programa em C para aqui. Não sei é se será fácil, por causa das identações. Terão de ser definidas em HTML, penso eu, como aliás fiz em cima, nos 4 casos.

    E não sei se este tema (Tarsky) o permite nesta caixa de comentários.

    Reparei agora que na versão inglesa me falta fazer a identação do N = ‘April’. Vou corrigir.

    Obrigado por me informar da sua implementação.

    [ PS. identação corrigida com o código:

    & nbsp ; & nbsp ; (sem espaços)

    ficando:

    else:
      N = ‘April’

    AT ]

    [ PPS. Ver em Editar Espaços em HTML 4 exemplos de identação. AT ]

  2. gxexeo diz:

    p me parece calculado errado, acho deveria ser
    p=q+5-n-32*quotient
    ou
    p=(q+5-n)%32

    • Repare que de acordo com

      “10. Calcule-se q + 5 – n e divida-se por 32; o quociente deve ser nulo e ao resto chame-se p“,

      quotient = 0,

      pelo que

      p = q + 5 – n – 32*quotient

      é igual a

      p = q + 5 – n.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s