Existe-t-il un algorithme efficace pour tester la primalité des nombres de la forme

8

Je lisais CLRS et il a demandé de montrer que sip est un premier de la forme 4k+3 et a était un résidu quadratique, puis ak+1 est une racine carrée (on peut aussi facilement montrer que ak est une racine carrée).

Je me demandais si en utilisant le fait précédent et aussi que nous savions que nous avions un certain nombre de la forme N=4k+3 (pas nécessairement premier), alors il y a peut-être un test de primalité différent pour (tout?) N en utilisant la fonction racine carrée (c.-à-d. SQRTN(a)=ak+1).

Donc, l'algorithme que je pensais était le suivant:

Choisissez un résidu quadratique (QR) aZN(on peut facilement le faire en vérifiant si est ). Une fois que nous avons un QR, calculons et vérifions si est égal à . Si c'est vrai, alors nous concluons que est premier. Sinon, nous choisissons un autre QR et répétons l'algorithme. On peut répéter cet algorithme fois. Si après fois il n'y a pas de succès, alors conclure que le nombre est composite.ap121(modp)ak+1=xaxa2aaaZNkk

J'ai principalement des intuitions sur pourquoi c'est correct mais pas une preuve formelle. Du premier fait que est une racine carrée lorsque est premier, cela doit signifier que x_a ^ 2 \ equiv a \ pmod p . Par conséquent, si a est un QR, cette vérification passera (la moitié du temps, nous choisirons un QR, de sorte que nous choisissons probablement un non QR n'est que de 1/2).xa=ak+1pxa2a(modp)a

Toutefois, si N est composite, il semble que nous avons aucune garantie que xa2a(modN) . Donc, s'il ne tient pas, nous sommes sûrs que ce n'est pas le premier. Mais s'il tient, alors si son premier nous avons raison, mais si son composite, nous pourrions avoir tort? Fondamentalement, est-il possible d'utiliser la fonction SQRT lorsque N=4k+3 pour décider si N est premier ou non?


J'ai aussi pensé à un autre algorithme qui méritait sa propre question: est-ce que calculer une racine carrée d'un nombre et avoir plus de 2 racines est un moyen fiable de décider de la primalité?

Charlie Parker
la source
@Kyle Jones, avez-vous des chances de restaurer (annuler la suppression) votre réponse? Je pense qu'il a un bon aperçu - je ne l'ai pas tout à fait apprécié à première vue, mais après une inspection plus approfondie, je pense que c'est un bel exemple.
DW
@DW OK. Je ne pensais pas que cela avait beaucoup de valeur compte tenu de votre réponse plus complète, mais je la ramènerai si vous pensez que cela en vaut la peine.
Kyle Jones
J'ai eu une nouvelle idée après avoir passé en revue Miller-Rabin. Que pensez-vous de mon nouvel algorithme proposé? @KyleJones
Charlie Parker
@CharlieParker Si vous avez une nouvelle question, vous devez la poser dans un message séparé. Si vous modifiez cette question afin qu'elle invalide les réponses existantes, cela va à l'encontre de l'objectif d'avoir un référentiel de questions et réponses.
Kyle Jones
@KyleJones est difficile à décider car il s'agit vraiment du même sujet. Que suggérez-vous? Je peux ouvrir une nouvelle question, je ne savais pas si c'était approprié.
Charlie Parker

Réponses:

5

Permettez-moi de commencer par un contre-exemple où votre algorithme donne la mauvaise réponse: c'est-à-dire où Nest composite mais votre algorithme conclut qu'il est premier. SupposerN=91 et a=9. alorsa(N1)/2=9451(mod91), donc apasse votre chèque pour être un QR. Aussi,a(N+1)/4=92381(mod91) et 8129(mod91), donc cela passe votre deuxième test, votre algorithme conclura que 91 est premier. Cependant, 91 n'est pas un nombre premier:91=7×13. Ainsi, votre algorithme a tiré la mauvaise conclusion dans ce cas. Cela montre que votre algorithme peut générer des réponses incorrectes dans au moins certains cas.


En fait, il y a un problème plus sérieux avec votre algorithme. Il n'y a pas de numéroNoù votre algorithme sortira jamais "composite". Il pense que tous les nombres sont des nombres premiers. Plus précisément, pour chaqueN, votre algorithme sera mis en boucle pour toujours (en essayant de trouver un nombre qui réussit le test QR, en vain), ou se terminera et affichera "prime". Donc, votre algorithme est à peu près aussi faux que possible.

Vous pouvez le voir en appliquant une théorie des nombres. Vous avez un test pour savoir siaest un QR et un deuxième test basé sur la compréhension de la racine carrée. Sia passe le premier test, il passera le second.

Voici pourquoi. Votre test QR réussit sia(N1)/21(modN). Votre deuxième test réussit si(a(N+1)/4)2a(modN). Ce dernier équivaut àa(N+1)/2a(modN). Maisa(N+1)/2a×a(N1)/2(modN). Par conséquent, sia(N1)/21(modN), puis (en multipliant les deux côtés par a) nous voyons immédiatement que nous devons avoir a(N+1)/2a(modN).

Chacun de k passes de votre algorithme revient essentiellement à chercher un a qui réussit le premier test, puis en vérifiant s’il réussit le deuxième test - mais sur la base des informations antérieures, nous constatons que tout aqui réussit le premier test sera également garanti de réussir le deuxième test. Ainsi, si l'algorithme trouve une valeura qui réussit le test QR, le deuxième test passera automatiquement et l'algorithme affichera "prime".

La leçon à tirer: chaque fois que vous pensez avoir un algorithme qui semble prometteur, il vaut la peine de le coder et de l'essayer sur certains cas de test et de voir s'il semble bien fonctionner. L'essayer sur quelques cas de test ne remplace pas une preuve d'exactitude , mais cela peut être un moyen utile d'éliminer rapidement un algorithme incorrect.


Enfin, passons à votre vraie question: pouvons-nous utiliser quelque chose comme ça pour construire un test de primalité? Eh bien, vous pouvez penser que le test de primalité de Miller-Rabin est vaguement basé sur quelque chose comme ça. Ils sont basés sur une caractérisation de ce que les racines carrées de1 devrait ressembler, si Nest premier. Si vous rencontrez une racine carrée de1 ce n'est pas 1 ou 1, vous pouvez conclure que Nn'est pas premier. Cependant, ce n'est pas limité aux chiffresN de la forme N=4k+3, donc dans ce sens, c'est définitivement différent.

DW
la source
J'ai eu une nouvelle idée après avoir passé en revue Miller-Rabin. Que pensez-vous de mon nouvel algorithme proposé?
Charlie Parker
1
@CharlieParker, plutôt que de modifier la question d'une manière qui invalide les réponses existantes, nous préférons généralement que vous posiez une nouvelle question. Je vous suggère de faire ça. (Indice: réfléchissez à la façon dont vous prévoyez de calculer sqrt ...)
DW
3

La congruence est vraie pour tous les nombres premiers p de la forme correcte, mais cela est également vrai pour certains nombres composites, ce qui rend la congruence seule inutile comme test de primalité.

Exemple: set p au nombre 15, qui est évidemment composite et a la forme 4k+3 avec k=3. 10000 est 1002, donc 10000 mod 15 produit le résidu quadratique a = 10. 10k+1 = 104 = 10000; appliquer le modp à cela donne 10. Maintenant, le test: sous modp 10 est censé être la racine carrée de a (10) seulement si p est premier, mais 102 = 100 lequel est 10 mod p, donc pa réussi le test de primauté. Pourtant, nous savonsp est composite.

Cela démontre que même si votre méthode de sélection des QR est parfaite, l'algorithme peut toujours se tromper. Par exemple, voici une façon raisonnable de choisira: choisissez un nombre aléatoire r, le mettre au carré et appeler a le résultat (c.-à-d. a=r2modN). Alors tu sais queaest garanti d'être un QR, et il n'est pas nécessaire de le tester à l'aide du test que vous avez indiqué. Si c'est ainsi que votre algorithme a choisia, l'exemple ci-dessus montre que votre algorithme peut donner la mauvaise réponse dans certains cas (par exemple, p=15, r=5).

Kyle Jones
la source
Je me demande s'il y a une erreur quelque part dans vos calculs, ou si je comprends mal l'algorithme proposé. a=10 ne passe pas le test QR: a(N1)/2=10710(mod15), ne pas 1. Par conséquent, selon ma compréhension de l'algorithme proposé,a=10ne serait pas accepté comme QR et l'algorithme n'essaierait pas de faire d'autres calculs avec. Je suppose que la façon dont l'algorithme trouve un QR acceptable est de choisira au hasard et tester si a(N1)/21(modN); c'est ce que suggère le texte.
DW
@DW OK. Votre réponse est de toute façon meilleure.
Kyle Jones
1
Ahh, en regardant un peu plus près, je vois ce qui se passe: 10 est bien un QR, mais le chèque a(N1)/2=1(modN)pense à tort que ce n'est pas un QR. Donc, si la façon dont l'algorithme fonctionnait pour choisir un nombre aléatoirer, le mettre au carré et appeler a le résultat (c.-à-d. a=r2modN), votre réponse serait un contre-exemple valide - et ce n'est pas une interprétation déraisonnable de l'algorithme proposé. Cool, belle réponse!
DW