web-dev-qa-db-fra.com

Algorithme le plus rapide pour le test de primalité

J'ai besoin de tester la primauté sur des intervalles entre les nombres qui sont vraiment grands (dans la plage de long long), j'ai donc besoin d'un algorithme rapide pour vérifier si un nombre est premier ou non. Veuillez suggérer vos idées.

34
dada

Une bonne méthode est le test Miller-Rabin . Il convient toutefois de noter qu'il ne s'agit que d'un test probabiliste.

19
cobbal

Un test de Miller-Rabin aux sept bases 2, 325, 9375, 28178, 450775, 9780504, 1795265022 a été prouvé par Jim Sinclair pour tester de manière déterministe si un nombre inférieur à 2 ^ 64 est premier. Voir http://miller-rabin.appspot.com/ .

17
user448810

Je crois que le test de primalité du courant (non probabiliste) asymptotiquement le plus rapide est le "Lenstra/Pomerance amélioré AKS", qui a une complexité qui est essentiellement O (n ^ 6).

Cependant, la plage de long long (en supposant un système typique où il s'agit d'un entier 64 bits) n'est pas vraiment si gros. En particulier, il n'y a que ~ 200 millions de nombres premiers inférieurs à 2 ^ 32, donc en utilisant un test probabiliste rapide, suivi d'une division d'essai avec une liste de nombres premiers précalculée (ou simplement en recherchant le nombre dans une liste de nombres premiers, si vous en avez un ) serait sacrément rapide dans cette gamme, et c'est probablement la bonne façon de procéder.

10
Stephen Canon

Je suggère le GNU MP qui utilise l'algorithme Miller-Rabin . Je l'utilise depuis quelques mois et c'est très rapide .

Plus précisément, la fonction mpz_probab_prime_p fait cela, vous pouvez également utiliser une autre fonction mpz_nextprime pour trouver le prochain nombre premier supérieur à un nombre. Je peux poster des échantillons de code si vous le souhaitez.

7
grokus

J'ai trouvé un très bon algorithme, beaucoup plus rapide que de vérifier tous les diviseurs - ce qui bien sûr me permet également de casser le cryptage à clé publique.

Attendez - j'ai juste besoin de fermer la fenêtre, il y a tous ces hélicoptères noirs au-dessus ........

(Ou regardez Comment puis-je tester la primauté? )

6
Martin Beckett

Si vous voulez tester longtemps la primalité, alors le test de primalité Baillie PSW est un bon choix. Ce test fait un test de pseudoprime fort et un test de Lucas et est donc très rapide. Il est prévu qu'il existe des composites qui réussissent ce test, mais jusqu'à présent, aucun n'est connu, et il n'y a certainement aucune exception en dessous de 1015. Une variante de ce test est par exemple utilisée dans Mathematica.

5
Accipitridae

Cobbal et grokus ont raison. Le test de Miller-Rabin est le plus utile des algorithmes disponibles. Oui, c'est probabiliste, mais ça ne devrait vraiment pas vous faire peur. Le test est le plus largement utilisé à des fins pratiques.

Notez que la probabilité de faux positifs (il n'y a pas de faux négatifs) peut être rendue arbitrairement petite en répétant le test.

1
Rob Lachlan

Jetez un œil à ma réponse ici:

comment tester un nombre premier de 1000 chiffres?

Le test est très rapide. Si vous travaillez dans la plage 64 bits ou plus petite, vous pouvez ajouter un GCD avec 30030 pour gagner un peu de temps pour la majorité des nombres.

1
Sam Harwell