Qu'est-ce qu'un home prime?
Pour un exemple, prenez HP (4). Tout d'abord, trouvez les facteurs premiers. Les facteurs premiers de 4 ( dans l'ordre numérique du plus petit au plus grand, toujours ) sont 2, 2. Prenez ces facteurs comme un nombre littéral. 2, 2 devient 22. Ce processus d'affacturage se poursuit jusqu'à ce que vous atteigniez un nombre premier.
number prime factors
4 2, 2
22 2, 11
211 211 is prime
Une fois que vous atteignez un nombre premier, la séquence se termine. HP (4) = 211. Voici un exemple plus long, avec 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
Votre défi est de créer un programme qui calculera HP (x) étant donné x, et le faire le plus rapidement possible . Vous pouvez utiliser toutes les ressources que vous souhaitez, à l'exception d'une liste de nombres premiers connus.
Prenez note, ces chiffres deviennent très grands très rapidement. À x = 8, HP (x) saute jusqu'au 3331113965338635107. HP (49) n'a pas encore été trouvé.
La vitesse du programme sera testée sur un Raspberry Pi 2, en moyenne les entrées suivantes:
16
20
64
65
80
Si vous avez un Raspberry Pi 2, chronométrez le programme vous-même, puis faites la moyenne des temps.
la source
Réponses:
Mathematica, HP (80) en ~ 0,88 s
Fonction anonyme. Prend un nombre en entrée et renvoie un nombre en sortie.
la source
1
fin ne devrait pas être là ...CompositeQ
pour!PrimeQ
(ce qui garantit également que votre réponse ne boucle pas indéfiniment en entrée1
).HP(80)
en si peu de temps sans que les nombres premiers soient codés en dur quelque part? Mon ordinateur portable i7 prend des heures pour effectuer un contrôle de primalité, ainsi que pour trouver les facteurs premiers,HP(80)
quand il arrive47109211289720051
.PyPy 5.4.1 64 bits (linux), HP (80) ~ 1,54 s
La version 32 bits ralentira légèrement.
J'utilise quatre méthodes de factorisation différentes, avec des points d'arrêt déterminés empiriquement:
J'ai essayé pendant un certain temps de trouver une rupture nette entre ECF et MPQS, mais il ne semble pas y en avoir. Cependant, si n contient un petit facteur, ECF le trouvera généralement presque immédiatement, j'ai donc choisi de ne tester que quelques courbes, avant de passer à MPQS.
Actuellement, c'est seulement 2x plus lent que Mathmatica, ce que je considère certainement comme un succès.
home-prime.py
Exemples d'horaires
La moyenne des 5 est d'environ 0,39s.
Dépendances
mpqs.py
est tiré directement de ma réponse à la factorisation semi-prime la plus rapide avec quelques modifications très mineures.mpqs.py
my_math.py
est tiré du même post quempqs.py
, mais j'ai également ajouté dans le générateur de nombre premier illimité que j'ai utilisé dans ma réponse pour trouver le plus grand écart entre de bons nombres premiers .my_math.py
la source
Python 2 + primefac 1.1
Je n'ai pas de Raspberry Pi pour le tester.
Essayez-le en ligne
La
primefac
fonction renvoie une liste de tous les facteurs premiers den
. Dans sa définition, il appelleisprime(n)
, qui utilise une combinaison de la division d'essai, la méthode d'Euler et le test de primalité de Miller-Rabin. Je recommanderais de télécharger le package et d'afficher la source.J'ai essayé d'utiliser
n = n * 10 ** int(floor(log10(f))+1) + f
au lieu de la concaténation de chaînes, mais c'est beaucoup plus lent.la source
pip install primefac
travaillé pour moi, bien que 65 et 80 ne semblent pas fonctionner sur Windows, en raison de l'fork
ing en arrière-plan.primefac
était assez drôle, car il y a beaucoup de commentaires avecTODO
oufind out why this is throwing errors
# This occasionally throws IndexErrors.
Oui, car il a supprimé la vérification qu'il y avait plus de lissages que de facteurs premiers utilisés.C #
Il s'agit d'une version plus optimisée du code précédent, avec certaines parties inutiles redondantes supprimées.
Sortie (sur mon ordinateur portable i7):
Testez en ligne
la source
Perl + ntheory, HP (80) en 0,35 s sur PC
Pas de Raspberry Pi sous la main.
Le test de primalité est ES BPSW, plus un MR à base aléatoire unique pour les grands nombres. À cette taille, nous pourrions utiliser
is_provable_prime
(n-1 et / ou ECPP) sans différence notable de vitesse, mais cela changerait pour des valeurs de> 300 chiffres sans réel avantage. L'affacturage comprend l'essai, la puissance, Rho-Brent, P-1, SQUFOF, ECM, QS selon la taille.Pour ces entrées, il fonctionne à peu près à la même vitesse que le code Pari / GP de Charles sur le site OEIS. ntheory a une factorisation plus rapide pour les petits nombres, et mon P-1 et ECM sont assez bons, mais le QS n'est pas génial, donc je m'attendrais à ce que Pari soit plus rapide à un moment donné.
la source
use feature "say";
.