Algorithme de Cipolla
algorithme de calcul de racines carrées modulaires
From Wikipedia, the free encyclopedia
En théorie algorithmique des nombres, l'algorithme de Cipolla est une méthode pour résoudre une congruence de la forme
où est un nombre premier, est un entier donné et est un entier inconnu. Une fois fixé , il revient de résoudre l'équation dans le corps fini à éléments, c'est-à-dire de trouver une racine carrée de dans ce corps. L'algorithme porte le nom de Michele Cipolla, le mathématicien italien qui l'a inventé en 1903[1] avant de l'étendre aux équations de degré quelconque en 1907[2].
Outre les modules premiers, l'algorithme de Cipolla permet également de calculer les racines carrées modulo les puissances d'un nombre premier[3].
L'algorithme
Entrées :
- , un nombre premier impair,
- , un carré modulo .
Sortie :
- tel que
Déroulement :
- Étape 1 : on trouve un élément tel que n'est pas un carré.
- On ne connaît pas d'algorithme déterministe pour trouver un tel élément mais on peut utiliser la méthode essai-erreur suivante : on choisit un au hasard et on calcule le symbole de Legendre pour déterminer si convient.
- La probabilité qu'un élément aléatoire satisfasse à la condition est . Pour suffisamment grand, elle est proche de [4]. On s'attend donc à faire environ deux essais avant de trouver une valeur convenable pour .
- Étape 2 : on calcule
- dans l'extension de corps . Cet élément est solution de l'équation .
NB : Si , alors également. Comme p est impair, , si bien que dès que l'on a une solution , on en obtient une seconde, .
Exemple
On fixe . Les éléments qui apparaissent dans la première étape sont des éléments de , ceux qui interviennent dans la deuxième étape sont des éléments de .
On chercher les tels que
Avant d'appliquer l'algorithme, il est préférable de vérifier que est bien un carré dans , c'est-à-dire que le symbole de Legendre est égal à 1. Pour cela, on peut utiliser le critère d'Euler : (par exemple parce que et que ). Ainsi, 10 est un bien un carré modulo 13.
- Étape 1 : Trouver un tel que n'est pas un carré. Comme indiqué, procède par tâtonnement. On part de , de sorte que . On calcule le symbole de Legendre à l'aide du critère d'Euler : Ainsi, le choix de convient.
- Étape 2 : Calculer dans :
Ainsi, est une solution, de même que . De fait, on a bien
Démonstration
Préliminaires : un corps de cardinal
La première partie de la preuve consiste à définir un corps . Pour simplifier, on note . Comme n'est pas un résidu quadratique, il n'a pas de racine carrée dans . L'élément peut donc être considéré comme un analogue du nombre complexe i. Les opérations sont faciles à définir. Pour , leur somme est définie comme
et leur produit se détermine en se rappelant que , ce qui donne :
- .
Il faut maintenant vérifier les propriétés du corps. L'addition et la multiplication étant bien définies, on vérifie qu'elles sont associatives, commutatives et que le produit est distributif sur la somme. C'est d'autant plus facile si l'on voit le corps comme un analogue fini du corps des nombres complexes ( étant l'analogue de i).
Le neutre de la somme est , ou plus formellement . Pour ,
- .
Le neutre du produit est , ou plus formellement :
- .
Il n'y a plus qu'à trouver des opposés et des inverses pour les éléments non nuls. On vérifie sans peine que l'opposé de est . On cherche un inverse de sous la forme . La condition s'écrit
- ,
ce qui équivaut un système de deux équations : et . Le déterminant de ce système est . Supposons qu'il s'annule : si , alors , ce qui est absurde ; ainsi, , puis , ce qui est contraire aux hypothèses. Cela entraîne que le système a une unique solution, et donc qu'il y a un inverse unique, déterminé par
- ,
- .
Préliminaires (suite) : une « conjugaison »
Maintenant que l'on dispose d'une extension de degré deux de , on introduit un analogue de la conjugaison complexe. Il est clair que l'application qui à associe envoie sur , sur et le produit de deux éléments et sur le produit de leurs images : . De plus, on sait que pour premier et compris entre et , le coefficient binomial est un multiple de : cela entraîne que . Autrement dit, est un morphisme de corps. Il est automatiquement injectif et, comme est fini, il est également surjectif.
De plus, pour tout élément , on a
- .
En effet, comme n'est pas un carré dans , on a par le critère d'Euler . Ainsi , ce qui avec le petit théorème de Fermat (qui stipule que pour tout ) donne la relation voulue : .
Le morphisme est appelé automorphisme de Frobenius de .
Validité de l'algorithme de Cipolla
Enfin, on montre que si , alors . On calcule, à l'aide de ce qui précède :
- .
A priori, on sait seulement que . Cependant, puisque sur un corps, un polynôme non nul de degré n possède au plus n racines dans tout corps K, et puisque a deux racines dans , ces racines sont toutes les racines dans . Cela montre que et sont les racines de dans , donc que [5].
Nombre d'opérations
Une fois trouvés une valeur convenable pour , le nombre d'opérations requises pour l'algorithme est multiplications, sommes, où m est le nombre de chiffres dans l'écriture binaire de p et k le nombre de 1 dans cette représentation. Pour trouver par essai-erreur, le nombre moyen de calculs du symbole de Legendre est 2. Cela dit, on peut avoir de la chance dès le premier essai et il peut en falloir plus de deux. Dans le corps , on a les deux égalités suivantes :
où est déjà connu. Ce calcul nécessite 4 multiplications et 4 additions ;
où et . Cette opération nécessite 6 multiplications et 4 sommes.
En supposant que (dans le cas , le calcul de est plus rapide), l'expression binaire de a chiffres, dont valent . Ainsi, pour calculer la puissance -ième de , la première formule doit être utilisée fois et la seconde fois.
Au bilan, l'algorithme de Cipolla est plus rapide que l'algorithme de Tonelli-Shanks si et seulement si , où est la plus grande puissance de 2 qui divise [6].
Équation modulo une puissance d'un nombre premier
D'après Dickson dans son History of numbers, la formule suivante due à Cipolla permet de trouver les racines carrées modulo les puissances des nombres premiers[3],[7] :
- où et ,
- avec , dans l'exemple précédent
En reprenant l'exemple ci-dessus, on peut vérifier que cette formule calcule bien des racines carrées modulo les puissances d'un nombre premier.
On va vérifier qu'une racine de modulo est :
- .
On calcule d'abord :
On calcule maintenant et (on trouve ici (en) un code Mathematica qui effectue ce calcul, que l'on peut comprendre par analogie avec un calcul sur les nombres complexes avec des coefficients modulo 13 au lieu d'être réels.)
On trouve alors :
- et
et, finalement :
- ,
qui est la bonne réponse.