Ola.
Gostaria que alguem me ajuda-se na solução desse problema.
Estou usando um Script original de Marco Andre Lopes Mendes é um gerador de numeros primos, que começa a gerar apartir de 2.
Já cheguei a 2326022257(09 Digitos), o Scrit é rapido mais mesmo assim vai demorar eu pretendo chegar a 1 milhão de digitos.
Bom a pergunta é seguinte, eu tenho como começar de onde eu parei ao inves de 2?
|| http://pastebin.com/3bNjcLAm ||
--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Python Brasil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para python-brasi...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
O professor de matemática Curtis Cooper, da Universidade do Missouri (Estados Unidos) anunciou esta semana ter descoberto o maior número primo até hoje conhecido. Escreve-se "2 elevado a 57.885.161 -1" e tem 17 milhões de dígitos.
Numero completo Aqui; || http://prime.toldyouso.com/digit/m57885161/prime-c.html ||
Aproveitando sua deixa eu achei outro script do mesmo autor que diz ser mais rapido a geração de numeros || http://pastebin.com/pTexYE02 || ele sugero usar "Para mostrar todos os primos abaixo de 1000, use meu_primos(1000). Esse algoritmo chega a ser umas 20 vezes mais rápido do que o descrito acima." ( o de cima é que está aqui em baixo) || http://pastebin.com/3bNjcLAm ||
Cara, acredito que não haja grande coisa que possa ser feito a respeito disso, já que encontrar números primos é um problema cujo tempo de resposta aumenta exponencialmente a cada novo número. Números primos são parte chave dos sistemas de criptografia justamente por isso: não são tão rápidos de serem encontrados.O maior número primo já encontrado, se não me engano, tem por volta de 17.5 milhões de dígitos, então não acho que haja uma forma de fazer isso ser tão rápido quanto você quer.Se eu estiver errado, por favor, me iluminem. ;)
Em 1 de dezembro de 2013 14:49, <adf....@terra.com.br> escreveu:
Ok, então o primeiro passo lógico para vc seria aprender o mínimo da linguagem[1].
[1] http://turing.com.br/pydoc/2.7/tutorial/Boa sorte.
Em 2 de dezembro de 2013 09:27, <adf....@terra.com.br> escreveu:
--
O que você precisa, nesse caso, é salvar o estado do script em execução, para da próxima vez que rodar ele continuar de onde parou ao invés de começar tudo denovo, certo?Se for isso, você pode salvar o estado num arquivo texto/json/pickle (depende do que for melhor no seu caso, não vi sua implementação) e sempre que rodar o script, primeiro verificar se existe algum estado salvo. Se existir, carrega esse estado e continua de onde parou, senão começa do zero.
E se arrancarem da linguagem o : do final do bloco. Fica mais rápido?
Sou programador de outras linguagens e assino a lista por curiosidade, então não sei muito sobre python, mas pelo que vi, a variavel idx começa de zero até chegar no valor de idx_sqrtn, então, se você salvar o idx e depois inicializar o idx com valor salvo, em vez de zero, o calculo continuará a partido ponto anterior, como você quer.O problema é que o vetor nums vai se perder, e como salvar e recuperar os dados dele depois, eu não sei como fazer.
Alysson Gonçalves de Azevedo
"Anarcho-syndicalism is a way of preserving freedom." - Monty Python
import pickledef save_state(n, primos, arquivo):saved_state = {"n": n, "primos": primos}output = open(arquivo, 'wb')pickle.dump(data, output)def recover_state(arquivo):source = open(arquivo, 'rb')data = pickle.load(source)
return data
save_state(n, primos, 'estado.bkp')
import osarquivo = 'estado.bkp'if os.path.isfile(arquivo):data = recover_state('estado.bkp')# chama função passando data['n'] e data['primos']else:# chama a função normalmente
Você vai precisar modificar a sua função de forma que ela aceiteum valor inicial para as variáveis n e primos (o último primo que você achou, e o array com todos os primos).Nesse caso, o que eu te aconcelho a fazer para gravar esses dados, é montar um dicionário e serializar com Pickle. Algo como:import pickledef save_state(n, primos, arquivo):saved_state = {"n": n, "primos": primos}output = open(arquivo, 'wb')pickle.dump(data, output)def recover_state(arquivo):source = open(arquivo, 'rb')data = pickle.load(source)return dataPara salvar o estado, na saída do programa você faria algo como:save_state(n, primos, 'estado.bkp')E para recuperar esses dados na inicialização do script:import osarquivo = 'estado.bkp'if os.path.isfile(arquivo):data = recover_state('estado.bkp')# chama função passando data['n'] e data['primos']else:# chama a função normalmente
Mas como eu disse, você vai ter que adaptar sua função para funcionar assim.
--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Python Brasil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para python-brasi...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
Você recebeu esta mensagem porque está inscrito em um tópico do grupo "Python Brasil" dos Grupos do Google.
Para cancelar a inscrição neste tópico, acesse https://groups.google.com/d/topic/python-brasil/XBY3-ghXo6U/unsubscribe.
Para cancelar a inscrição neste grupo e todos os seus tópicos, envie um e-mail para python-brasi...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Python Brasil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para python-brasi...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
O collections.deque é ineficiente para uso próximo à posição central, mas eficiente para uso (inserção/remoção/acesso) próximo às extremidades. É bastante útil para uso como fila ou como fila circular (possui métodos appendleft e popleft, parâmetro maxlen, etc.).Marcelo, acho que você pegou outro link enviado aqui na lista, eu não mandei nada no pastebin, mandei no Gist do GitHub:Esse código tem 56 linhas.
Com realce na linha 26:
Não entendi por que se preocupar com hash nesse caso...se for para conveniência, nada proibe você de usar um dicionário...se for por conta de desempenho para verificar se um elemento M está no conjunto dos números primos até N, sendo N >= M, você pode usar um set(sobre o resultado (i.e., fora da função que encontra os números primos).
Eu não usei isso no gist, mas você poderia sim usar um set() na linha 26. Porém isso pioraria o desempenho por exigir a verificação com todos os primos anteriores (não apenas os menores que a raiz quadrada), já que a ordenação seria perdida (em um conjunto, os elementos não estão "ordenados"). A linha 30 teria de usar um add ao invés de append, e o laço da linha 29 tem de usar o conjunto mesmo, não iter_primes, pois esse iterável com o takewhile foi feito pensando que os números primos encontrados fossem armazenados em ordem ascendente.
Grato
Marcelo
Em Ter 3/12/13 14:45, Marcelo Elias Del Valle mval...@gmail.com escreveu:
Adf,Mas estamos falando da mesma coisa? Qual o objetivo, gerar os n primeiros primos ou verificar se n é primo? O segundo problema é sem comparação muito mais simples que o primeiro...
Abraços,Marcelo.
Em 3 de dezembro de 2013 14:00, <adf....@terra.com.br> escreveu:
Demorou 25 minutos, usando os dois scripts.----------------------------------------------C:\Users\****>python divisors.pyType in a positive integer number: 4056775740567757 | 405677571 | -C:\Users\****>python Numero-primo.pyDigite um numero positivo real qualquer: 40567757-> E divisivel por 1 <---> E divisivel por 40567757 <--O numero requisitado e primo!
Em Ter 3/12/13 11:24, Danilo J. S. Bellini danilo....@gmail.com escreveu:
O collections.deque é ineficiente para uso próximo à posição central, mas eficiente para uso (inserção/remoção/acesso) próximo às extremidades. É bastante útil para uso como fila ou como fila circular (possui métodos appendleft e popleft, parâmetro maxlen, etc.).Marcelo, acho que você pegou outro link enviado aqui na lista, eu não mandei nada no pastebin, mandei no Gist do GitHub:Esse código tem 56 linhas.
Com realce na linha 26:
Não entendi por que se preocupar com hash nesse caso...se for para conveniência, nada proibe você de usar um dicionário...se for por conta de desempenho para verificar se um elemento M está no conjunto dos números primos até N, sendo N >= M, você pode usar um set(sobre o resultado (i.e., fora da função que encontra os números primos).
Eu não usei isso no gist, mas você poderia sim usar um set() na linha 26. Porém isso pioraria o desempenho por exigir a verificação com todos os primos anteriores (não apenas os menores que a raiz quadrada, já que a ordenação seria perdida (em um conjunto, os elementos não estão "ordenados"). A linha 30 teria de usar um add ao invés de append, e o laço da linha 29 tem de usar o conjunto mesmo, não iter_primes, pois esse iterável com o takewhile foi feito pensando que os números primos encontrados fossem armazenados em ordem ascendente.
Posta o script , por favor.
Deixei rodando o meu script com a otimização 1 que eu tinha comentado, eis o resultado:time python primos.py 40567757 > /tmp/testereal 31m59.632suser 31m39.283ssys 0m3.628sEsse foi o tempo para achar todos os primos entre 1 e 40567757.Depois vou tentar modificá-lo e posto o resultado aqui tb.[]s
Index_Error linha 11. (python 27)
erro sintaxe linha 10 (python 33
Falando serio eu estou no comecinho de python ,
Ops, foi mal! Esqueci de passar o link!Segue o link com a otimização 1, que demorou 30 min na minha máquina.Agora com a otimização 3:Resultado:time python primos.py 40567757 > /tmp/teste2real 13m18.956suser 13m5.621ssys 0m2.996sDetalhe que eu não usei um generator, fiquei curioso em saber se há diferença em performance.E também estou escrevendo em arquivo, não escrever deve agilizar bem.
[]s
Index_Error linha 11. (python 27)erro sintaxe linha 10 (python 33
Falando serio eu estou no comecinho de python ,
se puder me ajudar será otímo>
Em Ter 3/12/13 16:42, Marcelo Elias Del Valle mval...@gmail.com escreveu:
Ops, foi mal! Esqueci de passar o link!Segue o link com a otimização 1, que demorou 30 min na minha máquina.Agora com a otimização 3:Resultado:time python primos.py 40567757 > /tmp/teste2real 13m18.956suser 13m5.621ssys 0m2.996sDetalhe que eu não usei um generator, fiquei curioso em saber se há diferença em performance.E também estou escrevendo em arquivo, não escrever deve agilizar bem.
[]s
Se eu me deparar com algum problema interessante, está no escopo dessa lista discutir soluções de algorítmos em python? Particularmente gosto bastante de problemas como esses dos primos, são a melhor forma de melhorar ou desenferrujar bons skills de programação.