Quel est un cas d'utilisation possible de .isProbablePrime () de BigInteger?


84

La méthodeBigInteger.isProbablePrime() est assez étrange; à partir de la documentation, cela dira si un nombre est premier avec une probabilité de 1 - 1 / 2^arg, où argest l'argument entier.

Il est présent dans le JDK depuis assez longtemps, donc cela signifie qu'il doit avoir des utilisations. Mes connaissances limitées en informatique et en algorithmes (et en mathématiques) me disent qu'il n'est pas vraiment logique de savoir si un nombre est "probablement" un nombre premier mais pas exactement un nombre premier.

Alors, quel est un scénario possible où l'on voudrait utiliser cette méthode? Cryptographie?



6
Également, test de primalité de Miller-Rabin . Le principal avantage est la rapidité . Par exemple, lorsque vous souhaitez vérifier les facteurs, vous pouvez effectuer un tel test pour accélérer le processus d'affacturage. Vous pouvez garder la partie "probablement" assez basse, et c'est utile dans la pratique. Mais je suis d'accord que c'est un peu fragile et bizarre, comme des flotteurs.
keyer

2
@ maxx777 c'est une donnée - je demande un cas d'utilisation réel
fge

4
J'aimerais vraiment que les
votes négatifs

17
"Il est présent dans le JDK depuis assez longtemps, donc cela signifie qu'il doit avoir des utilisations." - soit il a été ajouté pour une raison inutile, puis n'a pas été supprimé car rien n'est jamais supprimé.
user253751

Réponses:


67

Oui, cette méthode peut être utilisée en cryptographie. Cryptage RSA implique la recherche de nombres premiers énormes, parfois de l'ordre de 1024 bits (environ 300 chiffres). La sécurité de RSA dépend du fait que la factorisation d'un nombre composé de 2 de ces nombres premiers multipliés ensemble est extrêmement difficile et prend du temps. Mais pour que cela fonctionne, ils doivent être de premier ordre.

Il s'avère que prouver ces nombres premiers est également difficile. Mais le test de primalité de Miller-Rabin , l'un des tests de primalité utilisé par isProbablePrime, détecte qu'un nombre est composé ou ne donne aucune conclusion. L'exécution de ces ndurées de test vous permet de conclure qu'il y a 1 chance sur 2 n que ce nombre soit vraiment composite. L'exécution de plusieurs 100fois donne le risque acceptable de 1 sur 2 100 que ce nombre soit composite.


3
@ Mr.777 J'ai vu Rabin-Miller une ou deux fois mais Miller-Rabin des dizaines de fois. Je ne sais pas s'il existe un nom officiel.
keyer

3
@ Mr.777 La page Wikipédia que j'ai liée ci-dessus indique d'abord "Miller-Rabin", mais reconnaît les deux noms: "Le test de primalité de Miller-Rabin ou le test de primalité de Rabin-Miller".
rgettman

5
La mise en œuvre de isProbablyPrimeest (pour autant que je sache) totalement déterministe. Comment exécuter les ntemps de test améliorerait-il les chances d'un résultat correct? (Même s'il s'agissait d'un élément aléatoire, il faudrait que le caractère aléatoire de plusieurs appels soit indépendant pour affecter le risque de la manière que vous décrivez.)
Ted Hopp

11
@TedHopp La mise en œuvre utilise un générateur aléatoire, et chaque tour avec un nouveau nombre aléatoire donne une chance de 3/4 de détecter un composite. Le générateur par défaut est SecureRandom, avec de fortes garanties d'aléa.
cet autre gars

4
Cela peut être difficile, mais rappelez-vous que PRIMES est en P. Le test AKS peut être plus lent que Miller-Rabin mais il n'y a pas de différence exponentielle ou de polynôme entre eux. Vous pouvez utiliser Miller-Rabin pour trouver un tas de nombres premiers probables et utiliser AKS pour prouver définitivement qu'ils sont des nombres premiers.
Bakuriu

20

Si le test vous dit qu'un entier n'est pas premier , vous pouvez certainement croire que 100%.

Ce n'est que l'autre côté de la question, si le test vous dit qu'un entier est "un premier probable", que vous pouvez avoir un doute. La répétition du test avec des "bases" variables permet de rendre la probabilité de réussir à "imiter" un premier (étant un pseudo-premier fort par rapport à plusieurs bases) aussi petite que souhaité.

L'utilité du test réside dans sa rapidité et sa simplicité. On ne serait pas nécessairement satisfait du statut de "premier probable" comme réponse finale, mais on éviterait certainement de perdre du temps sur presque tous les nombres composites en utilisant cette routine avant de faire appel aux gros canons des tests de primalité .

La comparaison avec la difficulté de factoriser des entiers est en quelque sorte un hareng rouge. On sait que la primalité d'un entier peut être déterminée en temps polynomial, et en effet il existe une preuve qu'une extension du test de Miller-Rabin à suffisamment de bases est définitive (dans la détection des nombres premiers, par opposition aux nombres premiers probables), mais ceci suppose l'hypothèse de Riemann généralisée, donc ce n'est pas aussi certain que le test de primalité AKS (plus cher) .


4
Il est à noter que AKS n'a été découvert qu'en août 2002, alors que cette méthode est dans JDK depuis février 2002
James_pic

3
Non, attendez, cela est dans le JDK depuis février 1997 (je regardais la probablePrimeméthode, pas la isProbablePrimeméthode)
James_pic

1
En effet, le titre de l'article de 2002 d'Agrawal, Kayal et Saxena «PRIMES is in P» signale la première preuve inconditionnelle de la complexité polynomiale (en bits de n ) pour le test de primalité déterministe (entier général). Miller (1975) avait montré que, en supposant GRH , la primalité d'un entier peut être testée de manière déterministe par étapes proportionnelles à la quatrième puissance de la longueur en bits, un bien meilleur exposant que celui actuellement connu pour AKS ou ses variantes.
hardmath

Alors que AKS est asymptotiquement plus rapide, des méthodes comme ECPP seraient beaucoup plus efficaces pour les nombres premiers «cryptographiques» ou «industriels».
Brett Hale

2
AKS est incroyablement lent, et ne sera pas plus rapide que APR-CL pour tout nombre calculable à l'échelle géologique, encore moins à l'échelle humaine. APR-CL et ECPP existaient déjà en 1997. Comme le mentionne Brett, ECPP est un bon choix si nous voulons une preuve. Tous ces éléments sont lents par rapport aux méthodes principales probables (par exemple MR, BPSW, Frobenius).
DanaJ

19

Le cas d'utilisation standard pour BigInteger.isProbablePrime(int)est dans la cryptographie. Plus précisément, certains algorithmes cryptographiques, tels que RSA , nécessitent de grands nombres premiers choisis au hasard. Mais il est important de noter que ces algorithmes n'exigent pas vraiment que ces nombres soient garantis comme étant premiers - ils doivent simplement être premiers avec un très probabilité élevée.

Quelle est la hauteur très élevée? Eh bien, dans une application de cryptographie, on appelle généralement .isProbablePrime()avec un argument entre 128 et 256. Ainsi, la probabilité qu'un nombre non premier passe un tel test est inférieure à un sur 2 128 ou 2 256 .

Mettons cela en perspective: si vous aviez 10 milliards d'ordinateurs, chacun générant 10 milliards de nombres premiers probables par seconde (ce qui signifierait moins d'un cycle d'horloge par nombre sur n'importe quel processeur moderne), et que la primalité de ces nombres a été testée avec .isProbablePrime(128), vous s'attendrait, en moyenne, à ce qu'un nombre non premier se glisse une fois tous les 100 milliards d'années .

Autrement dit, ce serait le cas, si ces 10 milliards d'ordinateurs pouvaient tous fonctionner pendant des centaines de milliards d'années sans subir de panne matérielle. Dans la pratique, cependant, il est beaucoup plus probable qu'un rayon cosmique aléatoire frappe votre ordinateur au bon moment et au bon endroit pour faire basculer la valeur de retour.isProbablePrime(128) de faux à vrai, sans provoquer d'autres effets détectables, que pour un non -prime nombre pour réussir le test de primalité probabiliste à ce niveau de certitude.

Bien sûr, le même risque de rayons cosmiques aléatoires et d'autres défauts matériels s'applique également aux tests de primalité déterministe comme AKS . Ainsi, en pratique, même ces tests ont un (très petit) taux de faux positifs de base en raison de pannes matérielles aléatoires (sans parler de toutes les autres sources possibles d'erreurs, telles que les bogues d'implémentation).

Puisqu'il est facile de pousser le taux intrinsèque de faux positifs du test de primalité de Miller – Rabin utilisé de .isProbablePrime()loin en dessous de ce taux de base, simplement en répétant le test suffisamment de fois, et puisque, même répété tant de fois, le test de Miller – Rabin est toujours beaucoup plus rapide en pratique que les tests de primalité déterministe les plus connus comme AKS, il reste le test de primalité standard pour les applications cryptographiques.

(De plus, même si vous sélectionniez accidentellement un pseudoprime fort comme l'un des facteurs de votre module RSA, cela ne conduirait généralement pas à une défaillance catastrophique. En règle générale, ces pseudoprimes seraient des produits de deux (ou rarement plus) nombres premiers d'environ la moitié de la longueur, ce qui signifie que vous vous retrouveriez avec une clé RSA multi-prime . Tant qu'aucun des facteurs n'était trop petit (et s'ils l'étaient, le test de primalité aurait dû les attraper), l'algorithme RSA fonctionnent toujours très bien, et la clé, bien qu'un peu plus faible contre certains types d'attaques que les clés RSA normales de même longueur, devrait toujours être raisonnablement sécurisée si vous n'avez pas lésiné inutilement sur la longueur de la clé.)


Le problème des pannes est l'une des raisons pour lesquelles AKS n'est pas réellement utilisé (la vitesse étonnamment lente est l'autre), et ECPP est plus courant. Comme vous le notez, des erreurs d'implémentation dans les algorithmes sont tout à fait possibles, il est donc utile de faire vérifier un certificat avec un code indépendant.
DanaJ

8

Un cas d'utilisation possible est de tester la primalité d'un nombre donné (lors d'un test qui en soi a de nombreuses utilisations). L' isProbablePrimealgorithme s'exécutera beaucoup plus rapidement qu'un algorithme exact, donc si le nombre échoue isProbablePrime, alors il n'est pas nécessaire d'aller au détriment de l'exécution de l'algorithme le plus cher.


Alors, est-ce pour des raisons pratiques? Et en raison du fait que la factorisation des nombres premiers est un problème NP?
fge

@fge - Oui, le cas d'utilisation que j'ai proposé concerne l'aspect pratique. Je ne sais pas si cela aide à la factorisation des nombres premiers, qui est un problème beaucoup plus difficile que le test de la primalité. Pour ce dernier, il existe un algorithme en temps polynomial: le test de primalité AKS .
Ted Hopp du

5
@fge: La factorisation est bien dans NP, mais je suppose que vous vouliez dire "NP-complete", ce que la factorisation n'est pas connue. Au contraire, il est fortement soupçonné de ne pas être NP-dur.
hmakholm a quitté Monica

6

Trouver des nombres premiers probables est un problème important en cryptographie. Il s'avère qu'une stratégie raisonnable pour trouver un probable k-bit premier est de sélectionner à plusieurs reprises un nombre aléatoire de k-bit, et de le tester pour la primalité probable en utilisant une méthode comme isProbablePrime().

Pour plus d'informations, voir la section 4.4.1 du Handbook of Applied Cryptography .

Voir également Sur la génération de nombres premiers probables par recherche incrémentale par Brandt et Damgård.


5

Les algorithmes tels que la génération de clé RSA reposent sur la capacité de déterminer si un nombre est premier ou non.

Cependant, au moment où la isProbablePrimeméthode a été ajoutée au JDK (février 1997), il n'existait aucun moyen éprouvé de décider de manière déterministe si un nombre était premier dans un laps de temps raisonnable. L'approche la plus connue à l'époque était l' algorithme de Miller-Rabin - un algorithme probabiliste qui donnait parfois de faux positifs (c'est-à-dire signalait les non-nombres premiers comme des nombres premiers), mais pouvait être réglé pour réduire la probabilité de faux positifs, au détriment d'augmentations modestes du temps d'exécution.

Depuis lors, des algorithmes ont été découverts qui peuvent déterminer de manière déterministe si un nombre est premier assez rapidement, comme l' algorithme AKS découvert en août 2002. Cependant, il convient de noter que ces algorithmes ne sont toujours pas aussi rapides que Miller-Rabin.

Une meilleure question est peut-être de savoir pourquoi aucune isPrimeméthode n'a été ajoutée au JDK depuis 2002.


Merci pour la perspective historique! On dirait que @immibis était sur la bonne voie avec son commentaire sur "dans le JDK mais jamais supprimé", alors? :)
fge

1
Je sais que Java ne supprime jamais des éléments de la bibliothèque standard, mais je ne suis pas sûr qu'ils le supprimeraient même s'ils le pouvaient. Pour certaines applications, être sûr à 99,999999999% de quelque chose est assez bon, et c'est beaucoup plus rapide que d'être sûr à 100%.
James_pic
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.