
Sabe aqueles problemas que te instigam a resolvê-los? Hoje eu encontrei um.
Estou tentando me aprimorar na linguagem Python e tenho usado o livro Python: How to Program para isso. No capítulo 5, que trata de listas, tuplas e dicionários, mais precisamente nos exercícios no final do capítulo, eu encontrei um problema bem desafiador: O Crivo de Eratóstenes.
Para quem não sabe, crivo significa, dentre outras coisas, peneira; e Eratóstenes, de acordo com a Wikipédia, foi um matemático, bibliotecário e astrônomo grego, que viveu entre os anos de 276 e 194 aC. O Crivo de Eratóstenes é uma forma bem interessante de se calcular números primos e o algoritmo é relativamente simples:
Estou tentando me aprimorar na linguagem Python e tenho usado o livro Python: How to Program para isso. No capítulo 5, que trata de listas, tuplas e dicionários, mais precisamente nos exercícios no final do capítulo, eu encontrei um problema bem desafiador: O Crivo de Eratóstenes.
Para quem não sabe, crivo significa, dentre outras coisas, peneira; e Eratóstenes, de acordo com a Wikipédia, foi um matemático, bibliotecário e astrônomo grego, que viveu entre os anos de 276 e 194 aC. O Crivo de Eratóstenes é uma forma bem interessante de se calcular números primos e o algoritmo é relativamente simples:
- Considere um vetor de números de 2 até o limite imposto pela pessoa que deseja calcular.
- Calcule a raíz quadrada do limite escolhido, arredondando-a para baixo e guarde este valor.
- Começando do primeiro item (2), remova todos os números que sejam múltiplos dele.
- Avance para o próximo item e repita o passo 3, até o número calculado no passo 2.
- Os números que sobrarem no vetor são primos.
Além de interessante, o Crivo de Erastótenes é uma ótima forma de se experimentar a utilização de listas e estruturas de repetição, principalmente com relação ao limite de iteração destas.
Para quem ainda não entendeu o funcionamento do algoritmo, abaixo segue uma imagem retirada da Wikipédia, que mostra graficamente como o mesmo funciona (considerando um limite igual a 120). Logo a seguir, segue o código que eu fiz em Python para resolver o problema proposto. É de um iniciante na linguagem, eu sei, mas faz direitinho seu trabalho. Ao executá-lo, será pedido o valor limite e após apertar Enter, a mágica acontece e o resultado é impresso na tela.
O código fonte está em inglês!
#!/usr/bin/env python
# Sieve of Eratosthenes
# Calculate and print on the screen the numbers that compose the sieve
# of Eratosthenes.
#
# AUTHOR: Jose' Lopes de Oliveira Ju'nior - http://versaopropria.blogspot.com
#
# CONTACT: jlojunior _at_ gmail _dot_ com
#
# DATE: 2008-09-30
#
# LICENCE: GPLv3 - http://www.gnu.org/licenses/gpl.html
#
# For more information about the Sieve of Eratosthenes, please visit its page
# on Wikipedia: http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
###############################################################################
import math
def fill_list(lim=10):
"""Fill a list with values from 2 to lim.
Requires the limit.
"""
list = []
for index in range(2, lim + 1):
list.append(index)
return list
def remove_zeros(list):
"""Remove zeros from the list passed.
Requires the list of integers.
"""
list2 = []
for index in range(len(list)):
if list[index]:
list2.append(list[index])
return list2
def sieve_of_eratosthenes(lim=10):
"""Calculate the Sieve of Eratosthenes.
Returns a list with zeros in place of number which
aren't prime. Only the prime numbers are different
of zero.
"""
# Create the list of values and calculate the square
# +root of the limit.
sieve = fill_list(lim)
limit = int(math.sqrt(lim))
# The first 'for' structure iterates until de square root
# +of the limit.The second 'for' structure iterates until
# +the limit.
for index1 in range(0, limit):
# Jump zeros.
if not sieve[index1]:
continue
for index2 in range(index1 + 1, lim - 1):
if sieve[index2] and (not (sieve[index2] % sieve[index1])):
sieve[index2] = 0
return remove_zeros(sieve)
# Main
print sieve_of_eratosthenes(int(raw_input("Enter with the limit \
value for the sieve: ")))
Código 1. Exemplo do Crivo de Eratóstenes em Python.
Espero que não tenham ficado mistérios sobre o assunto, além do fato de que algo tão complexo tenha sido descoberto há tanto tempo... :D
Leia Também
- Destrinchador de IPs em Java – Um Applet que obtém informações sobre um endereço IP e sua máscara.
- O Zen de Python – Um pequeno texto, inserido no próprio interpretador da linguagem, que elucida boas práticas de programação.
- Eclipse com Suporte a Python no OS X – Da instalação da IDE à execução de um código Python, tudo desvendado.
Minha versão:
ResponderExcluirhttp://pastie.org/335437
Salve, Elcio!
ResponderExcluirEngraçado, pois eu já havia acessado o fechaTAG! :)
Fiz esse código quando tava bem no início da aprendizagem de Python. Atualmente eu mudaria algumas coisas, como a função extra só pra preencher o vetor, mas confesso que a sua solução para a raíz quadrada foi foda! Foda mesmo! Evitou chamar o módulo Math! Aprendizado pra mim!
Já o lambda(), eu não entendo o funcionamento e pra mim é uma caixa preta. Ainda não me dei bem com programação funcional...
De qualquer forma, obrigado por compartilhar o conhecimento! Essa da raíz eu não esqueço mais!
Abraço, cara!
muito bom isso de partilhar conhecimento , eu tou resolvendo este mesmo problema em java (mais dificil ) e ja fiquei com umas luzes de como resolver.
ResponderExcluir@Anônimo Valeu! A ideia é essa! :-)
ResponderExcluiresta versão: http://gist.github.com/363882
ResponderExcluirpode ser considerada um algoritmo destes?
@voyag3r
ResponderExcluirClaro que sim! É uma forma muito mais "pythônica" que a minha (lembrando que o algoritmo desta postagem foi um dos exercícios que eu fiz para aprender a linguagem Python).
Parabéns!
Abraço!
PS: Legal você usar o GitHub! Sou usuário e fã do serviço! Minha página lá é http://github.com/joselopes
nada a ver,que porfavor!
ResponderExcluirFalou!
ResponderExcluirTA DOIDOOOOOOOOOOOOOOOOOO
ResponderExcluirCOLOCA PELOMENOS UM EXEMPLO QUE PRESTE
UIIIIIIIIIIIIIII SÓOOOOOOOOOOO!!!!!!!!!!!!!!
TA DOIDO SEUUUUUUUUUUUUU
ResponderExcluirTAPADO BURROOOOOOOOOOOOOOOOOOOOO
TAPADOOOOOOO
,
SOU PROFESSORA NÃO E QUE EU QUERA FALAR MAU DE VOCÊ MAIS ISSO QUE ESCREVEU NÃO TEM NADA VERRRRRRRRRRRR
ResponderExcluirPRECISSA VOLTAR PARA ESCOLA!!!!!!!
ENDICO ESCOLA LAURA VICUÑA