Qual é o próximo termo da sucessão seguinte? / Which is the next term of the following sequence?
E o termo de ordem ? / And its term?
Adenda/Addendum
Nota: os termos são fracções reduzidas.
Remark: every term of the sequence is a fraction in its lowest terms.
Solução/Solution
O termo geral da sucessão é/The sequence general term is:
mas expresso como fracção reduzida [gcd (greatest common divisor) é o m.d.c. ou mdc (máximo divisor comum)]/but written as a fraction in its lowest terms
Em PARI/GP obtém-se com/With this line of code in PARI/GP
A função seguinte – primes(N), em Python, no ambiente IDLE 2.6.4 (*), – gera duas listas de números para calcular e apresentar os números primos até N.
>>> def primes(N):
x, y = [0]*(N+2), [0]*(N+1)
x[1], p = 1, 2
x_p = 1 while p <= N: print p, for m inrange(1,N/p+1): if x[m] != 0:
x[m*p] = x[m] * x_p while x[p] != 0:
y[p] = y[p-1] + x[p]
p += 1
ou com comentários para melhor compreensão do script
>>> def primes(N): # Define two arrays
# x_0, x_1, . . . , x_{N+1}
# and y_0, y_1, . . . , y_N
# and initialize them
# x_0, x_1, . . . = 0,1,0,0,0, . . .
# and y_0, y_1, . . . = 0,0,0,0, . . . x, y = [0]*(N+2), [0]*(N+1)
x[1], p = 1, 2
x_p = 1 # Set x_p = 1 while p <= N: # Find the smallest p such that print p, # x_p = 0 for m inrange(1,N/p+1): # For every m such that if x[m] != 0: # x_m does not equal 0, x[m*p] = x[m] * x_p# set x_{m*p} whilex[p] != 0:# = x_m times x_p y[p] = y[p-1] + x[p] p += 1# Add 1 to p
(*) Do Glossary de Python v2.6.4 documentation: IDLE “An Integrated Development Environment for Python. IDLE is a basic editor and interpreter environment which ships with the standard distribution of Python. Good for beginners, it also serves as clear example code for those wanting to implement a moderately sophisticated, multi-platform GUI application.”
P.S. Este script é uma modificação ao de Alec Edgington neste comentário (em resposta a uma ideia de Tim Gowers.)
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 2j-k-h+μ 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 emPython, 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çãopascoa():
>>> 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çãoeaster():
>>> 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 18.02.10: alterado título e corrigida a identação de N = 'April' ]
[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]
Adenda de 16.02.2010 (publicada em entrada prória aqui): eis um exemplo de programação deste algoritmo em Python, que define as funções pascoa(x) e easter(x) através da palavra reservada def, respectivamente a versão portuguesa e a inglesa, que poderão ser chamadas escrevendo-as simplesmente a seguir ao prompt:
>>> 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
O algoritmo é extremamente simples: é 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
* * *
>>> 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,