- d'un test en temps polynômial, mais au résultat probabiliste.
- d'un test en temps polynômial, mais valable sous réserve de la validité d'une conjecture difficile.
- d'un test très efficace en pratique, mais dont on sait dire peu de choses en théorie.
L'algorithme
L'idée de départ est une modification du petit théorème de Fermat :
Théorème : Soit n un entier, et a premier avec n. Alors n est premier si et seulement si :
Preuve : Pour 0<i<n, le coefficient devant Xi de (X-a)n-Xn-a est :
Maintenant, si n est premier, et si 0<i<n,
Réciproquement, si n est composé, soit q un facteur premier de n, et qk la plus grande puissance qui divise n. Alors, qk ne divise pas , et est premier avec an-q. Le coefficient de Xq n'est donc pas nul modulo n.
Bien sûr, il est hors de question d'appliquer directement le test précédent, car pour calculer (X-a)n, il faut obtenir n coefficients, et donc au moins réaliser n calculs, ce qui est beaucoup plus que les (log n)k demandés. On va donc simplifier la condition. Si n est premier, et r est plus petit que n, le théorème précédent prouve aussi l'égalité :
Si n=ab, alors retourner Composé.Cet algorithme est polynômial en log n, puisqu'on effectue de l'ordre de (log n)k fois chaque boucle, et que le calcul à l'intérieur de la boucle est lui-même polynômial en log n. Signalons qu'il s'agit ici d'une version simplifiée et naïve de l'algorithme, et qu'on peut l'améliorer en choisissant au préalable r (AKS donnent des conditions pour cela).
Pour r=2 jusque C(log n)6 faire
Pour a=1 jusque faire :
Si alors Retourner Composé.
Fin Pour.
Fin Pour.
Retourner Premier