Qui est l'algorithme le plus rapide pour trouver les nombres premiers?
Qui est l'algorithme le plus rapide pour trouver les nombres premiers en utilisant le C++? J'ai utilisé le tamis de l'algorithme, mais j'en veux encore être plus rapide!
- Un vieil article que j'ai trouvé, mais semble intéressant: Amusant Avec les Nombres premiers
- Je pense que le plus facile & plus rapide façon de vérifier si un nombre est ou non premier: c'est par convertir un nombre binaire en nombre, et de vérifier ensuite si ses extrêmes 1 et dans le milieu sont de 0 tels que 1,101,1001,..
- cette échoue pour des chiffres aussi bas que 7 (111). Il échoue également pour 1001=9. Et de toute évidence, elle échoue pour presque tous les nombres premiers en général (ce qui n'est pas le cas 2^p - 1, qui sont des nombres premiers de Mersenne - classique généré exemples - qui sera toujours de la forme 111...1)
- Il y a un regex pour que
- Hahahaha tu m'as donné une bonne tranche de rire il y a @Hot Licks
- Vous n'avez pas mentionné qui Tamis? Tu veux sans doute dire Tamis de Eranthoses!
Vous devez vous connecter pour publier un commentaire.
Une très rapide mise en œuvre de la Crible d'Atkin est Dan Bernstein primegen. Ce tamis est plus efficace que la Crible d'Eratosthène. Sa page a certaines informations de référence.
log log N
bien sûr, c'est si petit, qu'il ne va pas beaucoup plus que le générique de réglage.Si elle doit être vraiment rapide, vous pouvez inclure une liste de nombres premiers:
http://www.bigprimes.net/archive/prime/
Si vous avez juste à savoir si un nombre est un nombre premier, il y a diverses premier essais listés sur wikipédia. Ils sont probablement la méthode la plus rapide pour déterminer si les grands nombres sont premiers, en particulier parce qu'ils peuvent vous dire si un nombre est pas un premier.
Lui, lui, je sais que je suis une question nécromancien répondre à de vieilles questions, mais je viens de trouver cette question de la recherche sur le net pour les moyens à mettre en œuvre efficace des nombres premiers tests.
Jusqu'à maintenant, je crois que la manière la plus rapide de nombre premier algorithme de dépistage est Fort Probable Premier (SPRP). Je cite à partir de Nvidia CUDA forums:
Voir ici pour plus d'info:
http://primes.utm.edu/prove/prove2_3.html et http://forums.nvidia.com/index.php?showtopic=70483
Si vous avez juste besoin d'un moyen de produire de très grands nombres premiers et ne se soucient pas de générer tous les nombres premiers < un entier n, vous pouvez utiliser de Lucas-Lehmer de test pour vérifier les nombres premiers de Mersenne. Un nombre de Mersenne premier numéro est de la forme 2^p -1. Je pense que Lucas-Lehmer test est l'algorithme le plus rapide découvert pour les nombres premiers de Mersenne.
Et si vous ne voulez seulement utiliser l'algorithme le plus rapide mais aussi le plus rapide du matériel, essayez de la mettre en œuvre à l'aide de Nvidia CUDA, écrire un noyau pour CUDA et l'exécuter sur GPU.
Vous pouvez même gagner de l'argent si vous découvrez un assez grand nombres premiers, le FEP est de donner un prix à partir de $50 à $250K:
https://www.eff.org/awards/coop
Il est 100% mathématique de test qui permet de vérifier si un certain nombre
P
est premier ou composé, appelé AKS Test de Primalité.Le concept est simple: étant donné un nombre
P
, si tous les coefficients de(x-1)^P - (x^P-1)
sont divisibles parP
, puisP
est un nombre premier, sinon c'est un nombre composé.Par exemple, étant donné
P = 3
, donnerait le polynôme:Et les coefficients sont tous les deux divisibles par
3
, donc le nombre est premier.Et exemple où
P = 4
, qui n'est PAS le premier donnerait:Et ici, nous pouvons voir que les coefficients
6
n'est pas divisible par4
, par conséquent, il n'est PAS premier.Le polynôme
(x-1)^P
seraP+1
conditions et peut être trouvé à l'aide de la combinaison. Donc, ce test sera exécuté dansO(n)
de l'exécution, donc je ne sais pas comment utile ce serait puisque vous pouvez simplement effectuer une itération suri
de 0 àp
et de test pour le reste.x
signifie? dans(x-1)^P - (x^P-1)
. avez-vous un exemple de code pour cela? en C++ permettant de déterminer si un entier est premier ou pas?Est votre problème afin de déterminer si un nombre est premier? Ensuite, vous avez besoin d'un test de primalité (facile). Ou avez-vous besoin de tous les nombres premiers inférieurs à un nombre donné? Dans ce cas, le premier tamis sont de bonne qualité (facile, mais nécessite de la mémoire). Ou avez-vous besoin de facteurs premiers d'un nombre? Cela nécessiterait de la factorisation (difficile pour un grand nombre, si vous voulez vraiment les méthodes les plus efficaces). De quelle taille sont les numéros que vous regardez? 16 bits? 32 bits? plus grand?
Un habile et efficace consiste à pré-calculer des tables de nombres premiers et de les conserver dans un fichier en utilisant un peu au niveau de l'encodage. Le fichier est considéré comme un long vecteur de bits tandis que les bits n représente l'entier n. Si n est premier, son bit est mis à un et zéro sinon. De recherche est très rapide (permet de calculer le décalage d'octet et un masque de bits) et ne nécessite pas de charger le fichier en mémoire.
Rabin-Miller est un standard de test de primalité probabiliste. (vous l'exécutez K fois et le nombre d'entrée est certainement composite, ou il est probablement le premier avec une probabilité d'erreur de 4-K. (quelques centaines d'itérations, et c'est presque certainement vous dire la vérité)
Il y a un non-probabiliste (déterministe) variante de Rabin-Miller.
La Great Internet Mersenne Prime Search (GIMPS) qui a trouvé le record du monde pour le plus grand prouvé premier (274,207,281 - 1 en juin 2017), utilise plusieurs algorithmes, mais ce sont des nombres premiers dans des formes spéciales. Cependant, le GIMPS page ci-dessus ne comprennent en général les tests de primalité déterministe. Ils semblent indiquer que l'algorithme est "le plus rapide" dépend de la taille du nombre à être testé. Si votre numéro s'inscrit en 64 bits, alors vous ne devriez probablement pas utiliser une méthode conçue pour fonctionner sur les nombres premiers de plusieurs millions de chiffres.
Cela dépend de votre application. Il ya quelques considérations:
De Miller-Rabin et analogique tests ne sont plus rapides que d'un tamis pour les nombres sur une certaine taille (quelque part autour de quelques millions, je crois). Au-dessous, à l'aide d'une section de première instance (si vous ne disposez que de quelques numéros) ou un tamis est plus rapide.
Je vous laisse décider si c'est plus rapide ou pas.
Il faut environ 82 secondes pour trouver et imprimer des nombres premiers dans une plage de 1 à 1 000 000, sur mon Core 2 Duo ordinateur portable avec un 2,40 GHz de processeur. Et il a trouvé 78,498 nombres premiers.
i <= (ToCheck / 3)
. il devrait êtrei <= (ToCheck / i)
. avec elle, il peut fonctionner en 0.1 secondes à la place.J'utilise toujours cette méthode pour le calcul des nombres premiers numéros à la suite avec le tamis de l'algorithme.
Je ne sais pas à propos de tout algorithme prédéfini, mais j'ai créé mon propre qui est très rapide. Il peut traiter 20 chiffres en moins de 1 seconde. Le max de la capacité de ce programme est 18446744073709551615. Le programme est :
(n%2)+1+(3*n)
est une sorte de gentil si. 🙂Je sais que c'est un peu plus tard, mais cela pourrait être utile pour les gens qui arrivent ici, à partir de recherches. De toute façon, voici une partie du code JavaScript qui s'appuie sur le fait que seuls facteurs premiers doivent être testés, de sorte que le plus tôt primes générées par le code sont ré-utilisé comme test de facteurs pour les derniers. Bien sûr, tous les même et mod 5 valeurs sont filtrés en premier. Le résultat sera dans le tableau P, et ce code peut crunch 10 millions de nombres premiers en moins de 1,5 secondes sur un i7 PC (ou 100 millions de dollars à environ 20). Réécrit en C, il devrait être très rapide.
break;
il serait encore plus lent, O(N^2), mais qui pourrait être considéré comme une erreur de codage déjà. l'épargne et les tests par des nombres premiers est O(N^2/(log N)^2), et des tests par les nombres premiers ci-dessous le numéro de la racine carrée de la seule, est O(N^1.5/(log N)^2).[n | n<-[2..], notElem(n) [j*k | j<-[2..(n-1)], k<-[2..(n-1)]]]
, ou le vainqueur absolu,let { isPrime(n) = n>1 && []==[i | i<-[2..n-1], isPrime(i) && rem(n)(i)==0] } in filter(isPrime) [2..]
(en Haskell, désolé; l'aide de la liste de compréhension de la syntaxe;rem
est pour le reste,%
;[]
est la liste vide). Par rapport à ces deux, l'un ici, c'est tout droit (et par la manière, équivalente à la précédente, si l'on crucial - et simple - le changement est fait).