Je lisais CLRS et il a demandé de montrer que si est un premier de la forme et était un résidu quadratique, puis est une racine carrée (on peut aussi facilement montrer que 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 (pas nécessairement premier), alors il y a peut-être un test de primalité différent pour (tout?) en utilisant la fonction racine carrée (c.-à-d. ).
Donc, l'algorithme que je pensais était le suivant:
Choisissez un résidu quadratique (QR) (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.
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).
Toutefois, si est composite, il semble que nous avons aucune garantie que . 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 pour décider si 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é?
la source
Réponses:
Permettez-moi de commencer par un contre-exemple où votre algorithme donne la mauvaise réponse: c'est-à-dire oùN est composite mais votre algorithme conclut qu'il est premier. SupposerN=91 et a=9 . alorsa(N−1)/2=945≡1(mod91) , donc a passe votre chèque pour être un QR. Aussi,a(N+1)/4=923≡81(mod91) et 812≡9(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éroN où 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 sia est 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(N−1)/2≡1(modN) . Votre deuxième test réussit si(a(N+1)/4)2≡a(modN) . Ce dernier équivaut àa(N+1)/2≡a(modN) . Maisa(N+1)/2≡a×a(N−1)/2(modN) . Par conséquent, sia(N−1)/2≡1(modN) , puis (en multipliant les deux côtés par a ) nous voyons immédiatement que nous devons avoir a(N+1)/2≡a(modN) .
Chacun dek 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 a qui 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 N est premier. Si vous rencontrez une racine carrée de1 ce n'est pas 1 ou −1 , vous pouvez conclure que N n'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.
la source
La congruence est vraie pour tous les nombres premiersp 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: setp 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 p a 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 quea est 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 ).
la source