O que é uma casa prime?
Por exemplo, considere HP (4). Primeiro, encontre os fatores principais. Os fatores primos de 4 ( em ordem numérica do menor para o maior, sempre ) são 2, 2. Considere esses fatores como um número literal. 2, 2 se torna 22. Esse processo de fatoração continua até você atingir um número primo.
number prime factors
4 2, 2
22 2, 11
211 211 is prime
Quando você alcança um número primo, a sequência termina. HP (4) = 211. Aqui está um exemplo mais longo, com 14:
number prime factors
14 2, 7
27 3, 3, 3
333 3, 3, 37
3337 47, 71
4771 13, 367
13367 13367 is prime
Seu desafio é criar um programa que calcule HP (x) dado x, e faça-o o mais rápido possível . Você pode usar quaisquer recursos que desejar, exceto uma lista de primos iniciais conhecidos.
Tome nota, esses números se tornam muito grandes muito rapidamente. Em x = 8, o HP (x) salta até 3331113965338635107. O HP (49) ainda não foi encontrado.
A velocidade do programa será testada em um Raspberry Pi 2, com a média das seguintes entradas:
16
20
64
65
80
Se você possui um Raspberry Pi 2, programe o programa por conta própria e calcule a média dos tempos.
fonte
Respostas:
Mathematica, HP (80) em ~ 0.88s
Função anônima. Pega um número como entrada e retorna um número como saída.
fonte
1
no final não deveria estar lá ...CompositeQ
para!PrimeQ
(o que também garante que a sua resposta não loop para sempre na entrada1
).HP(80)
em tão pouco tempo sem ter os primos codificados em algum lugar? Meu laptop i7 está demorando horas para executar uma verificação de primalidade, além de encontrar os principais fatores, paraHP(80)
quando chegar47109211289720051
.PyPy 5.4.1 64 bits (linux), HP (80) ~ 1.54s
A versão de 32 bits terá um tempo um pouco mais lento.
Eu uso quatro métodos diferentes de fatoração, com pontos de interrupção empiricamente determinados:
Tentei por um tempo encontrar uma pausa limpa entre ECF e MPQS, mas parece não haver uma. No entanto, se n contiver um fator pequeno, o ECF geralmente o encontrará quase imediatamente, então optei por testar apenas algumas curvas, antes de passar para o MPQS.
Atualmente, é apenas duas vezes mais lento que o Mathmatica, o que certamente considero um sucesso.
home-prime.py
Exemplo de tempos
A média dos 5 é de cerca de 0,39s.
Dependências
mpqs.py
é extraído diretamente da minha resposta à fatoração semiprime mais rápida, com algumas modificações muito pequenas.mpqs.py
my_math.py
é retirado do mesmo post quempqs.py
, no entanto, também adicionei o gerador de número primo ilimitado que usei na minha resposta para encontrar a maior lacuna entre os primos bons .my_math.py
fonte
Python 2 + primefac 1.1
Não tenho um Raspberry Pi para testá-lo.
Experimente online
A
primefac
função retorna uma lista de todos os fatores primos den
. Em sua definição, ele chamaisprime(n)
, que usa uma combinação de divisão de teste, método de Euler e teste de primalidade de Miller-Rabin. Eu recomendo baixar o pacote e visualizar a fonte.Tentei usar em
n = n * 10 ** int(floor(log10(f))+1) + f
vez da concatenação de cadeias, mas é muito mais lento.fonte
pip install primefac
funcionou para mim, embora 65 e 80 não pareçam rodar no Windows, devido afork
ing em segundo plano.primefac
foi muito engraçado, pois há muitos comentários comTODO
oufind out why this is throwing errors
# This occasionally throws IndexErrors.
Sim, porque ele removeu a verificação de que existem mais fatores suaves do que primos usados.C #
Esta é uma versão mais otimizada do código anterior, com algumas partes redundantes desnecessárias removidas.
Saída (no meu laptop i7):
Teste on-line
fonte
Perl + teoria, HP (80) em 0.35s no PC
Não há Raspberry Pi disponível.
O teste de primalidade é o ES BPSW, mais uma única RM de base aleatória para números maiores. Nesse tamanho, poderíamos usar
is_provable_prime
(n-1 e / ou ECPP) sem diferença perceptível na velocidade, mas isso mudaria para valores de mais de 300 dígitos sem nenhum benefício real. O fatoramento inclui avaliação, potência, Rho-Brent, P-1, SQUFOF, ECM, QS, dependendo do tamanho.Para essas entradas, ele roda aproximadamente a mesma velocidade que o código Pari / GP de Charles no site da OEIS. ntheory tem fatoração mais rápida para números pequenos, e meu P-1 e ECM são muito bons, mas o QS não é ótimo, então eu esperaria que Pari fosse mais rápido em algum momento.
fonte
use feature "say";
,.