Algorithme de Tonelli-Shanks

algorithme d'extraction de racines carrées modulaires From Wikipedia, the free encyclopedia

L'algorithme de Tonelli-Shanks (que Shanks appelle algorithme RESSOL) est un algorithme utilisé en arithmétique modulaire pour résoudre une congruence de la forme est un nombre premier impair, est un entier donné et est un entier inconnu, c'est-à-dire pour trouver une racine carrée de modulo .

La méthode de Tonelli-Shanks ne fonctionne pas pour les modules composés : trouver des racines carrées modulo un produit de nombres premiers différents est un problème de calcul équivalent à la factorisation des entiers[1].

Une version de cet algorithme, légèrement redondante, a été développée par Alberto Tonelli[2],[3] en 1891. La version présentée ici a été introduite indépendamment par Daniel Shanks en 1973, qui a expliqué :

« Si j'ai mis si longtemps pour découvrir ces références historiques, c'est parce que j'avais prêté le volume 1 de l'Histoire (en) de Dickson à un ami et qu'il ne m'a jamais été rendu[4]. »

D'après Dickson[3], l'algorithme de Tonelli permet de calculer des racines carrées modulo une puissance quelconque d'un nombre premier.

Principe de l'algorithme

Soit un nombre premier impair. On convient d'écrire des égalités à la place de congruences modulo .

Étant donné un entier non nul , le critère d'Euler exprime que a une racine carrée modulo (c'est-à-dire, est un résidu quadratique) si et seulement si

.

À l'opposé, un nombre n'a pas de racine carrée (n'est pas un résidu) si et seulement si

.

Il n'est pas difficile de trouver de tels , parce que la moitié des entiers compris entre 1 et n'ont pas de racine. Supposons donc savoir calculer un tel qui n'a pas de racine.

En divisant par de manière répétée, on écrit sous la forme , où est impair. En posant

,

on a alors

.

Soit . Si jamais on a , alors est une racine carrée de . Sinon, en posant , on dispose de et tels que

  • et
  • est une racine -ième de (car ).

Si, disposant de et pour un donné, qui satisfont aux conditions précédentes (où n'est pas une racine carrée de ), on va trouver d'autres et qui conviennent pour , et recommencer jusqu'à ce que devienne une racine -ième de , i.e., . À ce stade, est une racine carrée de .

Pour ce faire, on peut tester si est une racine -ième de l'unité en l'élevant fois au carré et en regardant si on trouve 1. Si tel est le cas, il n'y a rien à faire, puisque ces choix de et fonctionnent. Sinon, c'est que vaut (puisque son carré vaut 1 et qu'il n'y a que deux racines carrées de 1 modulo ).

Pour trouver de nouveaux et , on cherche à multiplier par un facteur à déterminer. Alors doit être multiplié par le facteur pour assurer que . Ainsi, quand , on cherche un facteur tel que est une racine -ième de 1 ou, ce qui revient au même, est lui-même une racine -ième de .

L'astuce consiste à utiliser , dont on sait qu'il n'a pas de racine carrée. Le critère d'Euler montre que est une racine -ième de (car ). En élevant au carré de façon répétée, on obtient une suite de racines -èmes de . On en choisit une pour servir de . Avec un peu de soin sur le traitement des variables et une intégration des cas triviaux, on aboutit à l'algorithme suivant.

L'algorithme

Dans la suite, les opérations et comparaisons portant sur les éléments se déroulent toutes dans le corps des entiers modulo .

Entrée :

  • un nombre premier impair ;
  • , un élément de pour lequel l'équation admet des solutions ; on dit alors que est un résidu quadratique modulo .

Sortie :

  • dans tel que .

Algorithme :

  1. En divisant de façon répétée par 2, trouver Q et S tels que et est impair.
  2. Rechercher un élément dans qui n'est pas un résidu quadratique :
    • on tire au hasard et on teste ce candidat à l'aide du critère d'Euler ou en calculant le symbole de Jacobi ;
    • comme la moitié des éléments de ne sont pas des résidus quadratiques, on s'attend à faire deux essais en moyenne.
  3. Initialisation :
  4. Boucle :
    • si , renvoyer  ;
    • si , renvoyer  ;
    • sinon, élever au carré de manière répétée pour trouver le plus petit compris entre et tel que  ;
    • poser , puis

Quand on a une solution , l'autre est . Si le plus petit exposant tel que vaut , alors il n'existe aucune solution à la congruence, c'est-à-dire que n n'est pas un résidu quadratique.

L'algorithme est particulièrement utile lorsque (notamment pour trouver des racines carrées de ). En effet, pour les nombres premiers tels que , les racines carrées de , si elles existent, sont . Dans ce cas, il est plus efficace de calculer l'une de ces deux valeurs, disons , et de vérifier si . Si c'est le cas, et sont les seules solutions. Sinon, et n'est pas un résidu quadratique, c'est-à-dire qu'il n'y a pas de solutions.

Validité de l'algorithme

On démontre qu'au début de chaque passage dans la boucle, on a les invariants de boucle suivants :

  •  ;
  •  ;
  • .

En effet, au premier passage, on a :

  • (puisque n'est pas un résidu quadratique) ;
  • (puisque est un résidu quadratique) ;
  • .

À chaque itération, en notant les nouvelles valeurs des variables , on a :

  •  ;
  • car :
    • puisque but ( est la plus petite valeur pour laquelle ) ;
    •  ;
  • .

Du fait que et que l'on teste si au début de la boucle, on peut toujours trouve un tel que . À chaque itération, la valeur de décroît strictement, ce qui assure que l'algorithme s'arrête. Lorsque la condition est remplie et que l'algorithme s'arrête, le dernier invariant de boucle implique que .

Ordre de

On peut exprimer les invariants de boucle avec la notion d'ordre des éléments :

  •  ;
  •  ;
  • comme ci-dessus.

À chaque étape, l'algorithme fait passer dans un sous-groupe strictement plus petit en déterminant l'ordre exact de t avant de le multiplier par un élément du même ordre.

Exemple

Résolvons l'équation . On sait que est premier et congru à 1 modulo 4. D'après le critère d'Euler, donc est bien un résidu quadratique. (Comme avant, les opérations sont implicitement modulo ).

  1. On écrit d'où , .
  2. Recherche d'une valeur de  :
    • donc est un résidu quadratique ;
    • donc 3 n'est pas un résidu quadratique : on pose .
  3. On pose :
    •  ;
    •  ;
    •  ;
    • .
  4. Boucle :
    • première itération :
      • donc ce n'est pas fini ;
      • , donc  ;
      •  ;
      •  ;
      •  ;
      •  ;
      •  ;
    • deuxième itération :
      • donc ce n'est toujours pas fini ;
      • donc  ;
      •  ;
      •  ;
      •  ;
      •  ;
      •  ;
    • troisième itération :
      • donc c'est fini : renvoyer .

En effet, on a bien . L'algorithme fournit donc les deux solutions de notre congruence, et .

Nombre d'opérations

Utilisations

L'algorithme de Tonelli-Shanks peut naturellement être utilisé pour tout processus nécessitant le calcul de racine carrée modulo un nombre premier. Par exemple, il permet de déterminer des points sur des courbes elliptiques. Il est également utile pour les calculs de l'algorithme de signature de Rabin (en) et pour l'étape de criblage dans le crible quadratique.

De façon plus anecdotique, pour un nombre premier , il peut être utilisé pour déterminer et tels que .

Généralisations

La méthode de Tonelli-Shanks peut être étendue à n'importe quel groupe cyclique (à la place de ) et à la recherche de racines -ièmes pour tout entier , en particulier pour le calcul d'une racine -ième d'un élément d'un corps fini[5].

S'il est nécessaire de calculer un grand nombre de racines carrées dans le même groupe cyclique et que S n'est pas trop grand, il est pertinent de préparer un tableau des racines carrées des éléments d'ordre 2 à l'avance, ce qui conduit à l'algorithme simplifié et accéléré suivant :

  1. Diviser par 2 de façon répétée pour calculer et tels que et est impair.
  2. Poser et .
  3. Trouver dans la table tel que et poser .
  4. Renvoyer .

Algorithme de Tonelli modulo

On lit dans le livre History of the theory of numbers de Leonard Eugene Dickson[3] :

A. Tonelli[6] a donné une formule explicite pour les racines de , lorsque est un nombre premier impair et qu'un non-résidu quadratique de est connu.

Dickson donne des indications mais elles sont désagréables à suivre. Cependant, la référence de Dickson[3] montre clairement que l'algorithme de Tonelli fonctionne aussi bien modulo que modulo .

Notes et références

Bibliographie

Articles connexes

Related Articles

Wikiwand AI