Problemas Teoremas

Março 21, 2010

Primos em Python/A Python script for computing primes

Filed under: Matemática,Programação,Python — Américo Tavares @ 4:45 pm
Tags:

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 in range(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 in range(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} 
            while x[p] != 0:         # = x_m times x_p       
            y[p] = y[p-1] + x[p]
            p += 1     # Add 1 to p

   
Por exemplo, até N=1000:

>>> primes(1000)
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499 503 509 521 523 541 547 557 563 569 571 577 587 593 599 601 607 613 617 619 631 641 643 647 653 659 661 673 677 683 691 701 709 719 727 733 739 743 751 757 761 769 773 787 797 809 811 821 823 827 829 839 853 857 859 863 877 881 883 887 907 911 919 929 937 941 947 953 967 971 977 983 991 997

(*) 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.)

P.P.S. como explico aqui.

Adenda de 22.03.10:

Exercício: qual é o número primo mais próximo de 100000? Antes é o 99991 e depois, 100003, logo 100003 é o mais próximo.

Na próxima centena de milhar é . . . 199999 , o seguinte é 200003.

Fevereiro 17, 2010

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

Filed under: Matemática,Programação,Python,Vídeo — Américo Tavares @ 1:02 am
Tags: , ,

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 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 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 ]

Janeiro 2, 2010

Algoritmo de O’Beirne, em 10 passos, para determinar o Domingo de Páscoa.

Filed under: Matemática,Programação,Python — Américo Tavares @ 1:17 pm
Tags: ,

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 obtem o Domingo de Páscoa: é o dia p do mês n do ano x.

Este algoritmo baseia-se num artigo da Nature de 1876.

Fonte: entrada Another Chance to Read … Calendars do Mathematics Weblog.

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,

Tema: Rubric. Blog em WordPress.com.