Test de primalité AKS

{{#ifeq:||Un article de Ziki, l'encyclopédie libre.|Une page de Ziki, l'encyclopédie libre.}}

Le test de primalité AKS (aussi connu comme le test de primalité Agrawal-Kayal-Saxena et le test cyclotomique AKS) est un algorithme de preuve de primalité déterministe et généraliste (fonctionne pour tous les nombres) publié le Modèle:Date par trois scientifiques indiens nommés Manindra Agrawal, Neeraj Kayal et Nitin Saxena (A.K.S). Ce test est le premier en mesure de déterminer la primalité d'un nombre dans un temps polynomial. Ce test a été publié dans un article scientifique intitulé « PRIMES is in P »<ref>PRIMES is in P Modèle:Pdf : article original, cité notamment par un de ses auteurs sur sa page.</ref>,<ref>L'article « définitif », revu par les pairs, est paru en 2004 : Modèle:Article</ref>. Cet article leur a valu le prestigieux prix Gödel 2006<ref>Page du prix Gödel 2006</ref>.

L'algorithme

Principe

L'algorithme détermine si un nombre est premier ou composé (au sens de la factorisation).

L'algorithme repose sur la généralisation suivante du petit théorème de Fermat : pour tout entier Modèle:Math et tout entier Modèle:Math premier avec Modèle:Math,

Modèle:Math est un nombre premier si et seulement si <math>(X+a)^n\equiv X^n+a\mod n,</math><ref name = "boyer"/>

qui résulte d'une propriété des coefficients binomiaux :

Modèle:Math est un nombre premier si et seulement si <math>\forall k\in\{1,\ldots,n-1\}, {n\choose k}\equiv0\mod n.</math>

L'objet d'AKS est d'exploiter efficacement cette propriété.

Fonctionnement

L'algorithme est globalement le suivant<ref name = "boyer"/>:

procédure AKS(<math>n</math>):
   Si <math>n = a^b</math> avec <math>a,b \in \N</math> et <math>b > 1</math> alors renvoyer non-premier  (étape 1)
   Construire le plus petit entier <math>r</math> tel que l'ordre de <math>n</math> modulo <math>r</math> soit supérieur à <math>4 \log^2 n</math>  (étape 2)
   Si pgcd(<math>a,n</math>) != 1 et pgcd(<math>a,n</math>)!= n pour un certain <math>a \leq r</math> alors renvoyer non-premier  (étape 3)
   Si <math>n \leq r</math> alors renvoyer premier  (étape 4)
   Pour <math>a</math> compris entre 1 et <math>\left \lfloor 2 \sqrt{\varphi(r)}\log n \right\rfloor</math> faire<ref group="note">La lettre <math>\varphi</math> désigne la fonction indicatrice d'Euler.</ref>:
        Si <math>(X + a)^n \not\equiv X^n + a \mod (X^r - 1)\Z/n\Z[X]</math> alors renvoyer non-premier  (étape 5)
   Renvoyer premier  (étape 6)

Preuve

On cherche à démontrer que l'algorithme renvoie premier si, et seulement si son argument est un nombre premier. La preuve repose sur des résultats sur les corps finis et de diverses inégalités dont la plupart sont démontrées par récurrence.

On note tout au long de la démonstration <math>\omega_r(n)</math> l'ordre (théorie des groupes) de <math>n</math> dans le groupe des inversibles de l'anneau <math>\dfrac{\mathbb{Z}}{n\mathbb{Z}}</math> et <math>\varphi(n)</math> l'Indicatrice d'Euler.

On suppose tout d'abord que <math>n</math> est premier, l'algorithme peut renvoyer une valeur (premier ou non-premier) à cinq différentes étapes:

  • Il est clair que l'algorithme ne peut pas renvoyer non-premier aux étapes 1 et 3.
  • D'après le Théorème de Lagrange sur les groupes, l'ordre de tout élément divise l'ordre du groupe. Ainsi, par définition de <math>r</math>, <math>4\log ^2(n) \leq \omega_r(n) \leq \varphi(r) \leq r</math>. L'étape 3 nous assure alors que tous les <math>a</math> considérés sont premiers avec <math>n</math>. Dès lors, de la relation donnée par la généralisation du petit théorème de Fermat, nous pouvons en déduire que l'algorithme ne peut pas renvoyer non-premier à l'étape 5.

Réciproquement, on suppose que l'algorithme renvoie premier. Si l'algorithme a renvoyé premier à l'étape 4, alors <math>n</math> est premier avec tous les entiers strictement inférieurs à lui-même ce qui assure la primalité de <math>n</math>.

Reste à démontrer que si l'algorithme renvoie premier à l'étape 6, alors <math>n</math> est bien premier.

Complexité

La complexité temporelle originale est en <math>O</math><math>(\log^{12} n)</math>, <math>n</math> désignant le nombre testé. Il existe plusieurs variantes et raffinements de l'algorithme qui en affectent la complexité. La version décrite dans la section précédente a une complexité <math>O(\log^{10,5} n)</math>, c'est-à-dire une complexité polynomiale en la taille de l'entrée<ref name = "boyer">Modèle:Ouvrage.</ref>,<ref group = "note" name = "log"/>. La complexité d'AKS est aussi affectée par le statut de diverses conjectures.

Implications de diverses conjectures

  • Si la conjecture d'Artin sur les racines primitives est vraie, alors l'algorithme AKS a une complexité de l'ordre de <math>O(\log^{6} n)</math><ref name = "boyer"/>;
  • Si la Modèle:Lien est vraie, alors la complexité d'AKS est de l'ordre de <math>O(\log^{3} n)</math><ref name = "boyer"/>.

Comparaison avec les autres tests de primalité

L'algorithme AKS n'est pas le premier test de primalité général s'exécutant en un temps polynomial en le nombre de chiffres du nombre à tester<ref group="note" name="log">Le nombre de chiffres d'un nombre <math>n</math> est de l'ordre de <math>\log n</math>.</ref>. Il possède cependant une différence clé par rapport à tous les algorithmes généraux de preuve de primalité précédents : il ne repose pas sur une hypothèse non démontrée (telle que l'hypothèse de Riemann) pour être vrai et pour avoir un temps polynomial démontrable pour toutes ses entrées. De plus c'est un algorithme déterministe : il permet de déterminer de façon certaine si un nombre est premier (tout comme le crible d'Ératosthène) par opposition aux tests probabilistes, qui permettent seulement de déterminer si un nombre est un nombre premier probable et qui comportent de fait une certaine probabilité d'erreur sur la réponse donnée lorsque celle-ci est affirmative.

Variantes

Quelques mois après la découverte, de nombreuses variantes sont apparues : Lenstra 2002, Pomerance 2002, Berrizbeitia 2003, Cheng 2003, Bernstein 2003a/b, Lenstra et Pomerance 2003. Elles ont amélioré la vitesse d'exécution de l'algorithme AKS à différentes ampleurs. Ces multiples variantes de l'algorithme sont référencées sous la notion de « classe AKS », introduite par Crandall et Papadopoulos en 2003<ref>{{#invoke:Langue|indicationDeLangue}} On the implementation of AKS-class primality tests Modèle:Pdf : R. Crandall et J. Papadopoulos, 18 mars 2003</ref>.

Voir aussi

Articles connexes

Liens externes

Notes et références

Modèle:Traduction/Référence

Notes

Modèle:Références

Références

<references />

Modèle:Portail