Le nombre 113
est le premier nombre premier dont la longueur 3
est le nombre premier, la somme numérique 5 = 1 + 1 + 3
est le nombre premier et le produit numérique 3 = 1 * 1 * 3
est le nombre premier.
Un premier qui a ces 3 propriétés sera appelé suprêmement premier . Les nombres premiers 11117
et 1111151
sont d'autres exemples.
Objectif
Ecrivez un programme capable de trouver le plus grand nombre suprêmement premier possible en moins d’une heure sur un ordinateur personnel moderne décent (comme la spécification recommandée ici ).
Vous ne devriez pas simplement nous donner un grand nombre premier suprême. Vous devez nous montrer votre processus de recherche avec un code qui fonctionne réellement. Vous pouvez tirer parti de vos solutions ou de celles des autres, mais assurez-vous de leur donner du crédit. Nous essayons en quelque sorte en communauté de trouver le plus grand nombre premier suprême réalisable sur un ordinateur normal en une heure.
Notation
La soumission qui trouve le plus grand prime suprême gagne. S'il s'avère qu'il y a un nombre fini de nombres premiers suprêmes, la première soumission qui génère le nombre premier suprême le plus élevé l'emporte.
(Si vous pouvez prouver mathématiquement qu'il existe ou qu'il n'y a pas une infinité de nombres premiers suprêmes, je vous donnerai 200 représentants de primes simplement parce que. :))
Détails
- Vous pouvez utiliser n’importe quelle source pour générer vos nombres premiers (par exemple, Internet).
- Vous pouvez utiliser des méthodes de test probabilistes principales.
- Tout est en base 10.
- Zéro et un ne sont pas considérés comme premiers.
- Les primes qui contiennent
0
un produit numérique0
ne peuvent évidemment pas être suprêmes. Pour que la page reste moins encombrée, définissez les nombres premiers premiers (plus de 100 chiffres) comme suit:
{[number of 1's before the prime digit]}[prime digit]{[number of 1's after the prime digit]}
Donc,
1111151
pourrait être exprimé comme{5}5{1}
.
la source
Réponses:
Perl, 15101 chiffres, {83} 7 {15017}, 8 minutes. Max trouvé: 72227 chiffres
Utiliser mon module Math :: Prime :: Util et son back-end GMP . Il comporte un certain nombre de tests de composition, notamment is_prob_prime () avec un test ES BPSW (légèrement plus strict que l'ispseudoprime de Pari), is_prime () qui ajoute un MR à base aléatoire et is_provable_prime (), qui exécutera BLS75 T5 ou ECPP. À ces tailles et types, faire une épreuve prendra beaucoup de temps. J'ai jeté dans un autre test MR dans le sous-vérificateur pédant. Fois sur un Core2 E7500 qui n’est certainement pas mon ordinateur le plus rapide (cela prend 2,5 minutes sur mon i7-4770K).
Comme Tim S. le fait remarquer, nous pourrions continuer à rechercher des valeurs plus grandes, jusqu'au point où un seul test prend une heure. À environ 15 000 chiffres sur cet E7500, il faut environ 26 secondes pour un test de résonance magnétique et 2 minutes pour le test complet is_prime (division d’essai plus MR de base 2, plus ES Lucas et un MR de base aléatoire). Mon i7-4770K est plus de 3 fois plus rapide. J'ai essayé quelques tailles, principalement en constatant les résultats obtenus par d'autres personnes. J'ai essayé 8, 20 et 16 km, tuant chacun après environ 5 minutes. J'ai ensuite essayé 15k en progression sur environ 10m et j'ai eu de la chance avec le 4ème.
Les tests PRP d’OpenPFGW sont certainement plus rapides au-delà de 4000 chiffres environ, et bien plus rapides dans la plage des 50 000+. Son test comporte cependant une bonne quantité de faux positifs, ce qui en fait un excellent pré-test, mais on aimerait quand même vérifier les résultats avec autre chose.
Cela pourrait être mis en parallèle avec des threads en perl ou en utilisant MCE, comme le montrent les exemples parallèles de Fibonacci Prime Finder du module.
Synchronisation et résultats sur un i7-4770K inactif utilisant un seul cœur:
Pour le résultat de 32 000 chiffres, j'ai démarré 6 scripts s'exécutant en même temps, chacun avec des arguments successifs commençant à 32 000. Après 26,5 minutes, l'un d'entre eux s'est terminé avec le résultat de 32063 chiffres affiché. Pour 57k, j'ai laissé les scripts successifs exécuter 6 à la fois pendant une heure par incréments de 500 jusqu'à ce que le résultat de 57k soit renvoyé dans un délai de 57 minutes. Le résultat de 72 000 chiffres a été trouvé en effectuant des nombres premiers successifs à partir de 70 000, donc impossible à trouver en une heure (bien que, une fois que vous sachiez par où commencer, c'est le cas).
Le script:
la source
gmpy2
, et PyPy avecmy_math
): codepad.org/aSzc0esTforprimes { ...do stuff... } 1e7;
ce qui est 10 fois ou plus rapide (bravo à Pari / GP pour beaucoup de bonnes idées). J'apprécie toujours vos commentaires, alors laissez-moi savoir si quelque chose ne fonctionne pas comme vous le souhaitez.Python 2.7 sur PyPy, {2404} 3 {1596} (~ 10 ^ 4000)
J'ai trouvé celui-ci environ 50 minutes après le départ à partir de 4 000. Par conséquent, j'estime qu'il s'agit de la limite supérieure de cette approche de code.
Changement: j'ai remarqué que certaines longueurs semblent être plus productives que d'autres pour générer ce type de prime, alors j'ai décidé de ne vérifier que 50 emplacements aléatoires du chiffre qui ne sont pas 1 au lieu de tous les emplacements possibles, avant de passer à autre chose. sur. Je ne suis pas tout à fait sûr que cela améliorera les performances, ou que 50 soit correct, mais nous verrons.
La liste des possibilités est générée sur la base du fait que pour que l'exigence relative aux produits soit remplie, le nombre doit être égal à tous, sauf un nombre premier. De plus, le nombre premier ne peut pas être 2 en raison de la relation somme et longueur, et la somme numérique ne doit pas être divisible par trois, ce qui donne les exigences en% 3.
is_prime tiré de http://codepad.org/KtXsydxK , écrit par @primo
Remarque: cette fonction is_prime est en fait un test pseudoprime de Baillie-PSW, mais il n’existe aucun contre-exemple connu, je ne vais donc pas me soucier de la distinction.
la source
is_very_very_very_very_very_very_very_probably_prime()
...PARI / GP, 4127 chiffres
(10 4127 -1) / 9 + 2 * 10 515
Il s'agit d'une recherche assez simple: vérifiez uniquement les longueurs des nombres premiers, puis calculez les nombres premiers possibles à utiliser, puis parcourez toutes les possibilités. Je cas spécial les cas communs où il y a 0 ou 1 chiffres premiers appropriés à utiliser.
Cela a pris 36 minutes pour calculer sur un noyau d'une machine assez ancienne. Je suis sûr que nous n'aurions aucun mal à trouver un nombre si élevé de plus de 5 000 chiffres en une heure, mais je suis aussi impatient.
Une meilleure solution consisterait à utiliser tout langage raisonnable pour tout faire sauf la boucle la plus interne, puis à construire un fichier abc pour primeform optimisé pour ce type de calcul particulier. Cela devrait pouvoir pousser le calcul à au moins 10 000 chiffres.
Edit : J'ai implémenté la solution hybride décrite ci-dessus, mais sur mon ancienne machine, je ne trouve pas le premier terme avec> = 10 000 chiffres en moins d'une heure. À moins que je ne me précipite sur quelque chose de plus rapide, je vais devoir passer à une cible moins noble.
la source
Mathematica 3181 chiffres
Mise à jour: Il y avait quelques erreurs graves dans ma première soumission. J'ai pu consacrer du temps à vérifier les résultats de celui-ci. La sortie est formatée sous forme de liste de chiffres. Cela facilite la vérification de chacune des conditions.
Exemple
C'était mon premier test, une recherche d'une solution avec 3181 chiffres. Il a trouvé le premier cas en 26 secondes.
Passons en revue le raisonnement. Ensuite, nous entrerons dans le programme lui-même.
Commençons, comme je le faisais, "Quel est le 450ème nombre premier?" Pouvons-nous trouver une solution avec autant de chiffres (3181)?
Le numéro est trouvé en joignant les chiffres.
Mais plutôt que de l'afficher, nous pouvons demander à la place quels sont les chiffres et où ils se trouvent.
Cela signifie qu'il y avait 3180 instances du chiffre 1 et une seule instance du chiffre 7.
A quelle position se trouve le chiffre 7?
Donc, le chiffre 7 est le 142ème chiffre. Tous les autres sont des 1.
Bien entendu, le produit des chiffres doit être un nombre premier, à savoir 7.
Et la somme des chiffres est également un nombre premier.
Et nous savons que le nombre de chiffres est un nombre premier. Rappelez-vous, nous avons sélectionné le 450ème prime, à savoir 3118.
Donc, toutes les conditions sont remplies.
la source
4002 * 1 + 7 = 4009
et non 4003 selon les spécifications.Python 2.7, 6217 chiffres: {23} 5 {6193} 6 minutes 51 secondes
Je travaillais sur ma propre version et j'ai été déçu de voir que @issacg m'avait battu au poinçon avec une approche très similaire, bien qu'avec is_ (très_probablement) _prime (). Cependant, je constate quelques différences significatives qui permettent d’obtenir une meilleure réponse en moins de temps (lorsque j’utilise également is_prime). Pour que ce soit clair, à partir de 4000 également, j'arrive à une meilleure réponse à 4001 chiffres ({393} 7 {3607}) en seulement 26 minutes, 37 secondes en utilisant l' interpréteur Python standard (également en version 2.7), pas le PyPy. version. De plus, je ne vérifie pas les chiffres sur place. Tous les candidats sont vérifiés.
Voici les principales améliorations:
Utilisez un générateur de nombres premiers ( https://stackoverflow.com/questions/567222/simple-prime-generator-in-python/568618#568618 ) pour créer une liste de nombres premiers à vérifier et (sa version de "petits nombres premiers") et pour générer des longueurs de numéros éligibles.
Nous voulons passer notre temps à chercher le plus grand nombre premier d'une longueur donnée, et non le plus petit. Je construis donc d'abord le plus grand nombre possible à vérifier, et non le plus petit. Ensuite, une fois trouvé, nous pouvons passer immédiatement à la longueur suivante.
EDIT: Maintenant avec le multitraitement
C'est un changement significatif par rapport aux versions précédentes. Auparavant, j’avais remarqué que ma machine à 8 cœurs fonctionnait à peine, j’ai donc décidé de tenter le multitraitement en Python (première fois). Les résultats sont très sympas!
Dans cette version, 7 processus enfants sont générés, lesquels saisissent une "tâche" dans une file d'attente de possibilités potentielles (num_length + chiffres éligibles). Ils essaient différentes positions [7,5,3] jusqu'à ce qu'il en trouve une. Si tel est le cas, informe le processus maître de la nouvelle longueur la plus longue trouvée. Si les enfants travaillent sur une longueur de num_ntre plus courte, ils se contentent de renflouer et d'aller chercher la longueur suivante.
J'ai commencé cette course avec 6000 et elle fonctionne toujours, mais jusqu'à présent, je suis très satisfaite des résultats.
Le programme ne s’arrête pas encore correctement, mais ce n’est pas un problème pour moi.
Maintenant le code:
la source
my_math
peut également être utilisé pour générer une liste de nombres premiers, à lawhile prime < 20006: prime = next_prime(prime)
. Cela semble être environ 3 fois plus rapidegen_primes
et une mémoire beaucoup plus efficace.C, GMP - {7224} 5 {564} = 7789
Félicitations à @issacg et à vous tous pour vos inspirations et astuces.
Et aussi le poseur de questions magistral @ Calvin's Hobbies pour cette question.
Compiler:
gcc -I/usr/local/include -o p_out p.c -pthread -L/usr/local/lib -lgmp
Si vous souhaitez donner votre puissance de calcul ou être curieux de la performance, n'hésitez pas à copier le code et à le compiler. ;) Vous aurez besoin de GMP installé.
la source
PFGW, 6067 chiffres, {5956} 7 {110}
Exécutez PFGW avec le fichier d’entrée suivant et
-f100
préfactorez les nombres. Dans environ 2-3 minutes de temps processeur sur mon ordinateur (i5 Haswell), il trouve le PRP (10 ^ (6073-6) -1) / 9 + 6 * 10 ^ 110, ou {5956} 7 {110} . J'ai choisi 6 000 chiffres comme point de départ, car il s'agit d'un nombre un peu plus élevé que celui de toutes les soumissions précédentes.En fonction de la rapidité avec laquelle j'ai pu trouver celui-ci, je pouvais facilement augmenter le nombre de chiffres tout en trouvant un PRP en moins d'une heure. Avec la façon dont les règles sont écrites, je pourrais même trouver juste la taille où mon processeur, fonctionnant sur les 4 cœurs, peut terminer un test PRP en une heure, prendre beaucoup de temps pour trouver un PRP et avoir uniquement ma "recherche". de l'un PRP.
PS En un sens, ce n’est pas une solution de "code" car je n’ai rien écrit à part le fichier d’entrée ... mais de nombreuses solutions Mathematica à une ligne pourraient être décrites de la même manière, tout comme en utilisant une bibliothèque qui fait le travail difficile pour vous. En réalité, je pense qu'il est difficile de tracer une bonne ligne de démarcation entre les deux. Si vous le souhaitez, je pourrais écrire un script qui crée le fichier d’entrée PFGW et appelle PFGW. Le script pourrait même chercher en parallèle, utiliser les 4 cœurs et accélérer la recherche d'environ 4 fois (sur mon processeur).
PPS Je pense que LLR peut effectuer les tests PRP pour ces chiffres et je m'attendrais à ce que ce soit beaucoup plus rapide que PFGW . Un programme de tamisage dédié pourrait également être plus efficace pour factoriser ces chiffres que l'un après l'autre. Si vous les combinez, je suis sûr que vous pourrez pousser les limites beaucoup plus haut que les solutions actuelles.
la source
Python 2.7, 17-19 chiffres
Trouvé 5111111111111 (13 chiffres) en 3 secondes et ce nombre primordial de 17 chiffres en 3 minutes. Je devine que la machine cible pourrait exécuter ceci et obtenir un nombre premier suprême à 19 chiffres en moins d'une heure. Cette approche échoue car elle garde les nombres premiers jusqu'à la moitié du nombre de chiffres cibles en mémoire. La recherche à 17 chiffres nécessite de stocker un tableau de 100 millions de booléens. 19 chiffres nécessiteraient un tableau d’éléments 1B et la mémoire serait épuisée avant d’obtenir 23 chiffres. Le temps d'exécution le serait probablement aussi.
Les approches de test de primalité qui n'impliquent pas un nombre ridiculement grand de nombres premiers diviseurs se porteront beaucoup mieux.
la source
Mathematica
42114259 chiffresAvec le numéro:
{1042} 7 {3168}{388} 3 {3870}Qui a été généré par le code suivant:
Les lancers font qu’il arrête de tester d’autres numéros avec les mêmes chiffres que celui actuellement trouvé. dans la mesure où il commence à tester le chiffre le plus significatif, cela signifie qu'il renvoie toujours le nombre le plus grand, à moins que le nombre de chiffres ne soit membre d'un triplet principal.
Tout simplement commencé à tester juste en dessous de la valeur d'une des réponses précédentes :)
Une fois terminé, le nombre est stocké dans la variable curlargest
la source
JavaScript, 3019 chiffres, {2 273} 5 {745}
Ceci utilise le test MillerRabin inclus dans BigInteger.js de Tom Wu.
À partir de 0 => 2 046 chiffres = {1799} 7 {263} en une heure .
À partir de 3000 => 3 019 chiffres = {2 273} 5 {745} en une heure, moins de 3 secondes .
Quand il est parti de 0, le programme a sauté et a recommencé la recherche à une longueur de 1,5 fois la longueur du dernier s-prime trouvé. Puis, quand j’ai vu à quelle vitesse cela fonctionnait, j’ai pensé qu’il en trouverait un à partir de 3 000 en une heure - ce qu’il a fait avec seulement 3 secondes à perdre.
Vous pouvez l'essayer ici: http://goo.gl/t3TmTk
(paramétré pour calculer tous les nombres s-premiers, ou passer au suivant.)
Le programme fonctionne en construisant des chaînes de tous les "1", mais avec un "3", "5" ou "7". J'ai ajouté une vérification rapide dans la fonction IsStrPrime pour rejeter les nombres se terminant par "5".
C'était très amusant. Cela me rappelle un casse-tête que j'avais créé il y a de nombreuses années pour calculer ce que l'on appelle un nombre premier supprimé . C'est un nombre premier qui, si vous supprimez un chiffre, le nombre restant est toujours premier. Par exemple, 1037 est un nombre supprimé car les nombres 1037, 037, 137, 107 et 103 sont des nombres premiers. J'en ai trouvé un de 84 chiffres, et le plus long que je connaisse est de 332 chiffres. Je suis sûr que nous pourrions en trouver beaucoup plus longtemps avec les techniques utilisées pour ce puzzle. (Mais choisir les numéros d'essai est un peu plus compliqué - peut-être?)
la source
Axiome, 3019 chiffres {318} 5 {2700}
résultat de la valeur de départ 3000 en 529 secondes
la source