L'arithmétique est la branche des mathématiques qui étudie les propriétés des nombres rationnels. Ces propriétés sont principalement liées aux interactions entre les deux lois de composition internes, l'addition et la multiplication ainsi que la relation d'ordre naturel sur l'ensemble \(\Z\).
L’arithmétique constitue l’un des socles les plus anciens des mathématiques, mais elle occupe également une place centrale en informatique, où elle intervient à tous les niveaux de la représentation et du traitement de l’information. Les entiers, leurs opérations et leurs propriétés structurent directement la manière dont les données sont codées, stockées et manipulées par les machines.
Dès les niveaux les plus élémentaires, les systèmes informatiques reposent sur une arithmétique discrète. La représentation binaire des entiers, les opérations sur les bits, ou encore les phénomènes de débordement correspondent à des formes implicites d’arithmétique modulaire. Les choix de codage des nombres — entiers signés, complément à deux, représentations flottantes — traduisent tous des contraintes arithmétiques fondamentales.
Au-delà de la représentation, l’arithmétique joue un rôle essentiel dans la conception d’algorithmes efficaces. Les méthodes de calcul rapide du plus grand commun diviseur, les algorithmes d’exponentiation modulaire ou les techniques de multiplication accélérée illustrent comment des propriétés élémentaires des entiers permettent de réduire drastiquement la complexité des calculs. La question n’est alors plus seulement de calculer, mais de calculer efficacement à grande échelle.
Ces notions deviennent particulièrement cruciales en cryptographie, où la sécurité des systèmes modernes repose sur des problèmes arithmétiques difficiles, comme la factorisation de grands entiers ou le calcul de logarithmes discrets. Des protocoles comme RSA ou Diffie–Hellman exploitent directement la structure des entiers modulo \(n\), rendant certaines opérations faciles dans un sens mais difficilement inversibles sans information secrète.
L’arithmétique intervient également dans la théorie des codes et des communications, où les corps finis permettent de détecter et corriger des erreurs dans les transmissions de données. Des opérations comme le XOR peuvent être interprétées comme une addition dans \(\mathbb{F}_2\), ce qui relie directement des mécanismes matériels simples à une structure algébrique abstraite.
Enfin, de nombreux domaines de l’informatique théorique mobilisent implicitement des raisonnements arithmétiques : périodicités dans les automates finis, comptage combinatoire, génération de nombres pseudo-aléatoires ou analyse de motifs. L’arithmétique apparaît ainsi comme un langage transversal, reliant la représentation des données, la conception d’algorithmes et l’étude de leur complexité.
Tout le monde, ou presque, a rencontré le chiffre de Jules César, l'empereur romain popularisé dans les bandes dessinées d'Astérix & Obélix. C'est certainement le système de chiffrement le plus simple, le plus connu, et le moins sûr.
Attention, la rapidité avec laquelle ce programme calcule la décomposition de l'entier \(n\) n'est qu'apparente. Nous verrons dans le cours d'Algorithmique que cet algorithme est inefficace.
Nous arrêterons là nos investigations sur les nombres premiers pour la première année, mais une multitude d'autres questions se posent :
Soit \(n\) un entier naturel. On note \(n\Z\) l'ensemble des multiples de \(n\) défini par \begin{equation} n\Z:=\{nz\mid z\in\Z\}. \end{equation}
C'est un sous-groupe du groupe additif \((\Z,+)\). En effet, \(0\) est un multiple de \(n\), la somme de deux multiples de \(n\) est un multiple de \(n\) et l'opposé d'un multiple de \(n\) est un multiple de \(n\) (cf. 2ème assertion du théorème de caractérisation des sous-groupes).
La réciproque est plus délicate. Il faut montrer que tout sous-groupe de \((\Z,+)\) est de la forme \(n\Z\). Soit \(H\) un sous-groupe de \(\Z\). S'il est réduit à \(H=\{0\}\), alors \(H=0\Z\), sinon il contient au moins un élément non-nul et son opposé, donc au moins un entier strictement positif. L'ensemble \(H\cap\N^*\) est donc une partie non-vide de \(\N\) et admet alors un plus petit élément \(n\) (cf. première propriété d'un ensemble naturel). Comme \(\{n\}\subseteq H\), le sous-groupe de \(\Z\) engendré par \(n\), c'est-à-dire \(n\Z\) vérifie \(n\Z\subseteq H\). Il reste à montrer que \(H\subseteq n\Z\). Soit \(x\in H\), le théorème de la division euclidienne nous donne \(x=qn+r\) avec \(q\in\Z\) et \(0\leqslant r\lt n.\) Comme \(x\in H\) et \(-qn\in H\), on déduit \(r\in H\), mais \(n\) est le plus petit entier non-nul de \(H\) et \(r\lt n\), donc \(r=0\) et finalement \(x\in n\Z.\)
Rappelons que les relations d'équivalence compatibles avec une loi de composition interne sur un groupe \((G,+)\) sont nécessairement de la forme \(y-x\in H\) où \(H\) est un sous-groupe normal de \(G\) (cf. théorème).* La loi de groupe est ici notée additivement, le symétrique est donc noté comme un opposé \(-x\) au lieu d'un inverse \(x^{-1}\). Deux entiers relatifs \(x\) et \(y\) sont dit congrus modulo \(n\) si leur différence est un multiple de \(n,\) ce que l'on note \(x\equiv y\pmod n.\)
On peut donc quotienter le groupe \((\Z,+)\) par \(n\Z\), le quotient \((\Z/n\Z,+)\) héritant de la loi quotient additive de \(\Z\). Notons que si deux entiers relatifs \(x\) et \(y\) sont congrus modulo \(n\), on écrit \(x\equiv y\pmod n\) alors que si ce sont deux éléments de \(\Z/n\Z\) qui sont congrus modulo \(n\) alors \(x=y\).
D'après la preuve du théorème précédent, les éléments de \(\Z/n\Z\) sont donc les images \(\overline{k}=\varphi_n(k)\) des \(n\) premiers entiers naturels. Souvent par abus de langage, on écrit que \(\Z/n\Z=\{0,1,2,\ldots,n-1\}\) en omettant la barre sur chaque entier qui signifie qu'il s'agit d'une classe d'équivalence. Cette confusion est sans danger précisément parce que la relation de congruence est compatible avec l'addition. Autrement dit, quand on additionne deux classes d'équivalence pour la loi additive quotient, il suffit d'additionner les entiers correspondants et de calculer si nécessaire le reste de la division euclidienne par \(n\) pour retrouver un représentant dans l'ensemble \(\{0,1,2,\ldots,n-1\}\).
On construit donc facilement la table d'addition du groupe cyclique \(\Z/n\Z\) :
Ainsi dans \(\Z/6\Z\), pour calculer \(\overline{4}+\overline{5}\), il suffit d'additionner \(4+5=9\) et de calculer le reste de la division euclidienne de \(9\) par \(6\) pour obtenir \(3\).
Le théorème suivant est très important, il dit en substance que les seuls groupes monogènes sont les groupes \(\Z\) ou \(\Z/n\Z\).
On rappelle que l'ordre d'un élément \(a\) d'un groupe fini \(G\) est l'ordre du sous-groupe monogène \(\text{gr}(a)\) de \(G\) qu'il engendre. Le théorème suivant n'est rien d'autre que le théorème de Lagrange déjà vu au chapitre précédent.
Exemple. D'après le théorème de Lagrange, nous savons que l'ordre de chaque entier de \(0\) à \(9\) divise \(9\) dans \(\Z/9\Z\). Cette proposition nous dit que cet ordre n'est autre que \(9\) pour ceux qui sont premiers avec \(9\), à savoir les entiers \(1,\) \(2,\) \(4,\) \(5,\) \(7,\) et \(8.\)
Calculons l'ordre des trois autres valeurs, \(0\), \(3\), et \(6\). Le sous-groupe additif engendré par \(0\) est le singleton \(\{0\}\), il est donc d'ordre \(1\). Le sous-groupe additif engendré par \(3\) est l'ensemble \(\{3,6,0\}\), il est d'ordre \(3\). Le sous-groupe additif engendré par \(6\) est le même que celui engendré par \(3\).
Nous retrouverons le corollaire suivant plus loin, c'est le petit théorème de Fermat.
2. Si \(k\in\N\) est un entier naturel, le chiffrement de César est codé par l'application \(e_k:\Z/26\Z\;\rg\;\Z/26\Z\) définie par \[e_k(x):=x+k.\] Montrons que c'est un bijection. Soit \(x\) et \(y\) dans \(\Z/26\Z\) tels que \(e_k(x)=e_k(y)\), alors \begin{align*} x+k&=y+k\\ (x+k)+(-k)&=(y+k)+(-k)&&\qquad\text{\(k\) est symétrisable pour \(+\)}\\ x+(k+(-k))&=y+(k+(-k))&&\qquad\text{associativité de \(+\)}\\ x+0&=y+0&&\qquad\text{\(k\) et \((-k)\) sont symétriques pour \(+\)}\\ x&=y&&\qquad\text{\(0\) élément neutre pour \(+\)} \end{align*} L'application est également surjective, en effet soit \(y\in\Z/26\Z\), alors \(x:=y+(-k)\) est un antécédent de \(y\) puisque \(e_k(y+(-k))=y+(-k)+k=y\). C'est donc une permutation des éléments de\(\Z/26\Z\). Si \(k\equiv 0\pmod{26}\), alors \(e_k\) est la permutation identité et on sait que toutes les orbites sont des singletons, il y en a donc \(26\).
3. Si \((k,26)=1\), alors \(k\) engendre le groupe additif \((\Z/26\Z,+)\), i.e. \[\forall x\in\Z/26\Z\ \exists l\in\N\ kl=x.\] Mais \(kl=e_k^l(0)\), donc tous les entiers \(x\in\Z/26\Z\) appartiennent à l'orbite de \(0\), il n'y a donc qu'une seule orbite pour cette permutation.
4. Les seuls entiers qui ne sont pas premiers avec \(26\) sont \(k=2\) et \(k=13\). Si \(k=2\), l'orbite de \(0\) contient toute les valeurs paires et l'orbite de \(1\) toutes les valeurs impaires, il y a donc \(2\) orbites de longueur \(13\). Si \(k=13\), il y a \(13\) orbites de taille \(2\), les paires \(\{i,i+13\}\) pour tout \(i\in\ab{0}{12}\).
L'ensemble \(\Z\) est muni de deux lois de composition internes, l'addition et la multiplication dont les propriétés lui confèrent une structure d'anneau.
Nous savons déjà, d'après l'étude menée sur \((\Z,+)\) et \((\Z,\times)\) dans les précédents chapitres, qu'il s'agit d'un anneau commutatif. Le triplet \((\R,+,\times)\) est non seulement un anneau commutatif, mais aussi un corps puisque tout nombre réel non-nul admet un symétrique pour la multiplication.
Nous ne démontrerons pas les règles de calcul bien connues du lecteur depuis le lycée sur l'anneau \(\Z\) (règle des signes, \(0.x=x.0=0\), etc.) Nous avons déjà vu la formule du binôme de Newton au chapitre Combinatoire.
Quand nous avons étudié la relation de divisibilité, dans \(\N\) ou dans \(\Z\), nous avons remarqué que tous les entiers sont des diviseurs de \(0\) puisque \(\forall a\in\Z\ a.0=0\). Dans le contexte des anneaux, on déroge à la définition générale :
L'anneau \(\Z\) est intègre puisqu'il n'a pas de diviseurs de 0 :
\begin{equation} \forall(a,b)\in\Z^2\quad a\,b=0\then (a=0)\vee(b=0). \end{equation} Nous serons confrontés à des anneaux qui ne sont pas intègres dans la suite du chapitre.En effet, la multiplication dans un anneau \(A\) est associative et on sait (cf. cette proposition) que le produit de deux éléments inversibles est inversible, donc \(A^\times\) est stable pour la multiplication. L'élément neutre 1 est inversible, son inverse est lui-même et l'inverse \(x^{-1}\) de \(x\) est inversible (c'est \(x\)) donc \(x^{-1}\in A^\times\), finalement \((A^\times,\times)\) est un groupe.
Pour le corps \((\R,+,\times)\), on a \(\R^\times=\R\setminus\{0\}\). Pour l'anneau \((\Z,+,\times)\), on a \(\Z^\times=\{-1,1\}\).
Nous nous sommes intéressés à la structure de groupe additif \((\Z,+)\), nous avons montré que tous ses sous-groupes sont de la forme \((n\Z,+)\) et qu'ils sont tous normaux puisque le groupe \((\Z,+)\) est commutatif. Cela nous a permis de construire le groupe additif quotient \((\Z/n\Z,+)\), les relations d'équivalence compatibles avec l'addition étant définies via les sous-groupes normaux exclusivement.
La question qui se pose à présent concerne la loi multiplicative. Le groupe quotient \((\Z/n\Z,+)\) peut-il hériter également de la multiplication de \(\Z\) pour en faire un anneau ?
Nous verrons que la réponse est oui si ce groupe est stable pour la multiplication par n'importe quel élément de l'anneau. La méthodologie pour y arriver sera la même que celle que nous avons menée dans le chapitre Groupes. L'objectif est encore une fois de munir l'ensemble quotient d'une structure qui assure que la surjection canonique soit un morphisme, mais cette fois le morphisme doit respecter les deux structures, additive et multiplicative. Pour ne pas alourdir inutilement les écritures, on note de la même façon les lois additives et multiplicatives d'anneaux distincts :
La première condition indique que \(f\) est un morphisme du groupe additif \((A,+)\) de l'anneau \(A\). Pour qu'une partie \(B\subseteq A\) munie des lois induites par celles de \(A\) constitue elle aussi un anneau, il faut que \((B,+)\) soit un sous-groupe de \((A,+)\) stable pour la multiplication et qui contient \(1_A\). Ainsi le seul sous-anneau de \(\Z\) est nécessairement \(\Z\) lui-même puisque \((\Z,+)\) est le seul sous-groupe de \((\Z,+)\) qui contient \(1\).
On obtient aisément des résultats similaires à ceux que nous avons obtenus pour les sous-groupes d'un groupe et les morphismes de groupes. Ainsi, si \(f:A\;\rg\; A'\) est un morphisme d'anneaux, et \(B\) et \(B'\) sont respectivement des sous-anneaux de \(A\) et \(A'\), alors \(f^{-1}(B')\) et \(f(B)\) sont des sous-anneaux de \(A\) et \(B\) respectivement. D'autre part, l'intersection de sous-anneaux d'un anneau est encore un anneau, on peut donc définir le sous-anneau engendré par une partie \(B\) quelconque d'un anneau \(A\) comme l'intersection de tous les sous-anneaux de \(A\) qui contiennent \(B\).
La deuxième condition exprime que le sous-groupe additif est stable pour la multiplication (à gauche ou/et à droite) par un élément de l'anneau tout entier. Dans un anneau commutatif, comme \(\Z\) par exemple, tout idéal est nécessairement bilatère. Nous connaissons les sous-groupes additifs de \(\Z\), ce sont les ensembles du type \(n\Z:=\{nz\mid z\in\Z\}\), autrement dit l'ensemble des multiples de \(n\). Si l'on multiplie un multiple d'un entier \(n\) par n'importe quel entier, on obtient toujours un multiple de \(n\), autrement dit la condition 2 est toujours satisfaite, donc
Les groupes quotients \((\Z/n\Z,+)\) ont été obtenus à l'aide des seules relations d'équivalences \(\rel\) compatibles avec l'addition, à savoir celles qui satisfont \(x{\rel}x'\iff x-x'\in n\Z\) où \((n\Z,+)\) est un sous-groupe (nécessairement normal) de \((\Z,+)\). Mais cette relation est-elle compatible avec la multiplication, c'est-à-dire satisfait-elle la proposition suivante ?
\[\forall y\in A\quad x{\rel}x'\then xy{\rel}x'y.\]La réponse est affirmative, puisque si \(x-x'\in n\Z\), alors il existe \(z\in\Z\) tel que \(x-x'=nz\) et donc \(xy-x'y=n(yz)\) donc \(xy{\rel}x'y\). On peut donc munir \(\Z/n\Z\) de la loi quotient \(\times\) héritée de de celle de \(\Z\).
La surjection canonique \(\varphi:\Z_n\;\rg\;\Z/n\Z\) est donc non seulement un morphisme additif, mais également un morphisme d'anneaux.
On construit facilement la table de multiplication de \(\Z/n\Z\) :
Nous venons de montrer que la surjection canonique \(\varphi_n:\Z\;\rg\;\Z/n\Z\), qui à un entier associe son reste modulo \(n\), est un morphisme d'anneaux. Nous allons exploiter ce résultat pour étudier l'algorithme de la preuve par 9, bien qu'il soit tombé en désuétude. Cet algorithme décide si le résultat d'une opération arithmétique sur des nombres entiers, produit, somme, etc. est juste ou non. C'est un algorithme probabiliste de Monte-Carlo : le temps de calcul est connu à l'avance, mais :
Soit \(n\in\N\), \(x\) et \(y\) deux éléments de \(\Z\) et \(\varphi\) la surjection canonique de \(\Z\) sur \(\Z/n\Z\). Comme \(\varphi\) est un morphisme d'anneaux, on a \begin{align*} \varphi_n(x+y)&=\varphi_n(x)+\varphi_n(y),\\ \varphi_n(xy)&=\varphi_n(x)\varphi_n(y). \end{align*}
Autrement dit, le reste de la division euclidienne par \(n\) d'une somme ou d'un produit doit être égal à la somme des restes ou le produit des restes modulo \(n\). C'est donc une condition nécessaire (mais pas suffisante). Prenons par exemple \(n=2\) et observons la proposition suivante : \begin{equation} \label{eq:sample} 121+4195=4327. \end{equation}
Elle est fausse bien sûr, et l'argument le plus simple pour s'en convaincre est que la somme de deux nombres impairs est un nombre pair, or ici le résultat est impair. Transportons ce calcul dans \(\Z/2\Z\) via la surjection canonique que nous noterons \(\varphi_2\) : \begin{align*} \varphi_2(121)+\varphi_2(4195)&=\varphi_2(4237)\\ 1+1&=1\\ {\color{red}0}&{\color{red}\;=1}\\ \end{align*}
On aurait pu faire de même avec n'importe quelle autre valeur de \(n\), par exemple \(n=13\), \begin{align*} \varphi_{13}(121)+\varphi_{13}(4195)&=\varphi_{13}(4237)\\ 4+9&=12\\ {\color{red}0}&{\color{red}\;=12}\quad\text{car}\ 4+9\equiv 0\ \text{mod}\ 13. \end{align*}
Le lecteur perspicace fera deux objections. La première est que détecter une erreur de calcul en le plongeant dans \(\Z/13\Z\) semble encore plus fastidieux que de refaire ce calcul puisqu'il faut calculer le reste de la division euclidienne par 13, ce qui n'est pas aisé à faire de tête. La seconde est que si la vérification d'un calcul dans \(\Z/2\Z\) est beaucoup plus simple, elle manque singulièrement de fiabilité.
Continuons malgré tout. Les multiples représentations des nombres sont étudiées dans un cours d'informatique générale ou d'architecture des ordinateurs de première année, nous supposons donc que le lecteur connaît quelques rudiments sur la question. Notre système de numération permet de représenter un entier naturel à l'aide de chiffres. Quand on écrit \(2305\) en base \(10\), ceci se traduit par \[ 2.10^{3}+3.10^{2}+0.10^1+5.10^0. \]
Plus généralement un entier \(x\) de \(k+1\) chiffres en base \(b\) s'écrit \[ \sum_{i=0}^k x_i\,b^i. \]
Par conséquent
\begin{equation} \label{eq:modulon} \varphi_n(x)=\sum_{i=0}^k\varphi_n(x_i)\;\left(\varphi_n(b)\right)^i. \end{equation}Posons \(n:=b-1\), alors le reste de la division euclidienne de \(b\) par \(n\) est \(1\) puisque \(b=1.(b-1)+1,\) donc \(\varphi_{n}(b)=1\). D'autre part, \begin{equation} \varphi_n(x_i)= \begin{cases} x_i&\text{si}\ x_i\lt n.\\ {\color{green}0}&\text{si}\ x_i=n.\\ \end{cases} \end{equation}
mais le calcul de la somme dans \((\ref{eq:modulon})\) se faisant modulo \(n\), ont peut différer la réduction à \(0\) pour les chiffres \(x_i=n\) après l'addition : \begin{equation} \varphi_n(x)=\sum_{i=0}^k x_i. \end{equation}
Concrètement, il suffit de faire la somme modulo \(n\) des chiffres qui constituent le nombre (en évitant, si on veut aller plus vite, les valeurs égales à \(n\)), pour calculer son reste modulo \(n.\) Reprenons l'exemple \((\ref{eq:sample})\) en base \(b=10\) pour laquelle \(n=9\) : \begin{align*} \varphi_{9}(121)+\varphi_{9}(41{\color{green}9}5)&=\varphi_{9}(4237)\\ (1+2+1)+(4+1+{\color{green}0}+5)&=(4+2+3+7)\\ 14&=16\\ {\color{red}5}&{\color{red}\;=7}\\ \end{align*}
Notons que le même procédé d'invalidation du calcul pour l'égalité \(121+4195=4325\) aurait échoué puisque \(4+3+2+5\equiv 5\ \text{mod}\ 9\) alors que le bon résultat est \(4316\). La preuve par \(9\) ne permet donc pas de prouver qu'une opération a été effectuée correctement mais de prouver parfois qu'elle est fausse.
Soit \(z\in\Z\). On note \(D_z:=\{d\in\Z\such d\mid z\}\) l'ensemble des diviseurs de \(z\). Il est clair que \(D_z=\Z\iff z=0.\) On se donne deux entiers relatifs \(a\) et \(b\) et on veut étudier leurs diviseurs communs, autrement dit l'intersection \(D:=D_a\cap D_b\), dans le cas où l'un des deux entiers n'est pas nul, sans quoi \(D_a\cap D_b=\Z\).
L'ensemble \(D\cap\N\) n'est pas vide puisque \(1\mid a\) et \(1\mid b\). D'autre part, supposons que \(a\neq 0\), sinon on fait le même raisonnement avec \(b\), alors \(D\cap\N\) est majoré par \(\abs{a}\) puisque \(D_a\) est majoré par \(\abs{a}\) et \(D\) est inclus dans \(D_a\). L'ensemble \(D\cap\N\) est une partie non-vide et majorée de \(\N\), elle admet donc un plus grand élément :
Comme nous l'avons observé, \(0\) admet n'importe quel entier relatif comme diviseur, par conséquent si \(a=0\) et \(b=0\), l'ensemble des diviseurs commun de \(a\) et \(b\) est l'ensemble \(\Z\) qui n'admet pas de plus grand élément. On convient alors de poser la convention \((0,0):=0\).
Se pose alors naturellement la question du calcul du plus grand commun diviseur de deux entiers relatifs \(a\) et \(b.\) On peut déjà se limiter à un calcul de pgcd entre entiers naturels puisque \((a,b)=(\abs{a},\abs{b}).\)
Une première idée consiste à décomposer \(a\) et \(b\) en produit de facteurs premiers pour calculer le produit de tous leurs diviseurs communs :
Par conséquent (, ) = .
Malheureusement, la décomposition d'un entier en produit de facteurs premiers à l'aide de divisions euclidiennes est particulièrement coûteuse, nous ne l'avons programmée ici que pour des valeurs de \(a\) et \(b\) très petites.
def factoriser(n):
p = 2
PREMIERS = ()
while (p*p <= n):
while (n % p == 0):
PREMIERS += (p,)
n = n // p
p = 3 if (p == 2) else p + 2
if (n > 1):
PREMIERS += (n,)
return(PREMIERS)
n = int(input("n = "))
print(factoriser(n))
On fait évidemment plus de divisions que nécessaire puisque tous les nombres impairs qui ne sont pas premiers sont testés. On peut donc estimer asymptotiquement (c'est-à-dire quand \(n\,\rg\, +\infty\)) que le nombre de divisions euclidiennes à réaliser pour factoriser \(n\) dans le pire des cas (quand il est premier) est égal à \(\frac{\sqrt{n}}{2}\).
Si l'on se souvient que la partie entière \(\lfloor x\rfloor\) d'un nombre réel est l'unique entier \(\nu\) tel que \(\nu\leqslant x\lt \nu+1\), on peut démontrer que le nombre \(k\) de chiffres dans la représentation en base \(b\) d'un entier naturel \(n\) est donné par \[k=1+\lfloor\log_b n\rfloor.\]
Autrement dit si l'on exprime \(n\) en fonction de \(k\), on a \(b^k \leqslant n\lt b^{k+1}-1\), on en déduit que \[ {\color{88F}\frac{b^{\frac{k}{2}}}{2}} \leqslant \frac{\sqrt{n}}{2}\lt \frac{b^{\frac{k+1}{2}}}{2} \] Le nombre de divisions euclidienne est donc exponentiel en la moitié du nombre de chiffres de l'entier \(n.\) D'autre part, nous avons fait abstraction du coût du calcul d'une division euclidienne qui mériterait lui aussi notre attention. Toutes ces questions relèvent des enseignements d'algorithmique.
On peut calculer le pgcd de deux entiers sans connaître leurs décompositions en produits de facteurs premiers. C'est Euclide*Mathématicien grec qui vécut 300 ans avant jc. qui décrivit la première fois comment procéder.
L'identité \((\ref{eq:pgcdbis})\) suggère un algorithme du calcul pgcd de deux entiers \(a\) et \(b\) plus efficace que de répéter des soustractions, c'est l'algorithme d'Euclide : il suffit d'appliquer une seule division euclidienne à chaque étape jusqu'à ce que le reste soit nul. Le quotient de la dernière division euclidienne fournit le résultat.
def PGCD(a,b):
while (b > 0):
(a, b) = (b, a % b)
return a
Si \(a\lt b\), le premier passage dans la boucle échange les valeurs de \(a\) et \(b\) ce qui évite de les comparer avant d'entrer dans la boucle.
Le programme ci-dessous permet d'observer la trace de cet algorithme pour des valeurs arbitraires de \(a\) et \(b.\) Sa version dite étendue étudiée plus loin permettra de calculer un couple \((u,v)\) solution de l'équation \(au+bv=(a,b)\) (identité de Bézout) que nous fournissons dès à présent.
Le couple \((u,v)=\,\) est une solution de l'équation \(au+bv=(a,b)\) :
Si \(I\) et \(J\) désignent deux idéaux d'un anneau commutatif \(A\), on appelle idéal somme de \(I\) et \(J\), que l'on note \(I+J\), l'intersection de tous les idéaux de \(A\) qui contiennent toutes les sommes \(au+bv\) où \((a,b)\in I\times J\) et \((u,v)\in A^2\). Comme les idéaux de \(\Z\) sont du type \(n\Z\), l'idéal somme \(a\Z+b\Z\) est le plus petit idéal qui contient les sommes du type \(au+bv\) puisque les éléments de ces idéaux de \(\Z\) sont déjà des multiples de \(a\) et \(b.\)
Notons que le théorème n'affirme pas que le couple solution \((u,v)\) est unique, nous y reviendrons. À quoi peut servir l'identité de Bézout ? Une première réponse est fournie par le corollaire suivant qui établit un nouveau critère pour déterminer si deux nombres sont premiers entre eux.
Une conséquence très importante de ce corollaire est de fournir un moyen de calculer l'inverse d'un élément \(x\) de \((\Z/n\Z)^\times\). On peut bien sûr s'appuyer sur la table de multiplication et chercher où se trouve la valeur \(1\) sur la ligne d'entrée \(x\), mais même en ne faisant que la moitié des opérations grâce à la commutativité de \(\Z/n\Z\), cela en nécessite \(\frac{n^2}{2}\). Nous verrons à la dernière section que la cryptographie fait un usage immodéré de cet anneau modulaire pour des entiers \(n\) qui comportent plus de 600 chiffres* Ce n'est pas une coquille, il s'agit bien d'entiers \(n\) proches de \(10^{616}\). en base 10, et la mémoire de tous les ordinateurs de la planète réunie ne suffirait pas à contenir cette table de multiplication.
Un couple qui satisfait \((\ref{eq:bezout1})\) permet de calculer l'inverse d'un élément \(x\in(\Z/n\Z)^\times\). En effet, soit \(x\) un entier premier avec \(n\), condition nécessaire et suffisante pour que \(x\) admette un inverse. C'est là que le corollaire entre en scène, si \(x\) est premier avec \(n\), on sait qu'il existe un couple \((u,v)\) tel que \(xu+nv=1\) et donc \begin{equation} xu\equiv 1\ (\text{mod}\ n). \end{equation} Autrement dit, l'entier \(u\) est l'inverse de \(x\) dans \(\Z/n\Z\). Mais nous n'avons fait que repousser le problème. L'identité de Bézout et son corollaire sont des théorèmes existentiels et pas des théorèmes constructifs, ils ne fournissent pas d'algorithmes pour construire le couple \((u,v)\). Heureusement, il en existe.
D'après l'identité de Bézout \((\ref{eq:Bézout})\), l'équation n'a de solution que si \((a,b)\mid d\) et en particulier si \(d=(a,b)\). Si nous déterminons un couple \((u,v)\in\Z^2\) tel que \(au+bv=(a,b)\), alors pour tout entier \(d\) multiple de \((a,b)\), le couple \((u\frac{d}{(a,b)},v\frac{d}{(a,b)})\) satisfera l'identité de Bézout \begin{equation} a(u\frac{d}{(a,b)})+b(v\frac{d}{(a,b)})=d \end{equation}
C'est en observant attentivement la construction du pgcd avec l'algorithme d'Euclide que l'on peut construire un couple \((u,v)\) qui satisfait \(au+bv=(a,b)\). Observons la suite des divisions euclidiennes effectuées pour obtenir \((192,57)=\boxed{3}\) en précisant leurs quotients et leurs restes :
\begin{align} \notag 192&=57\,.\,{\color{#88F}3} + {\color{#FF8}21}\\ \notag57&=21\,.\,{\color{#88F}2} + {\color{#FF8}15}\\ \notag21&=15\,.\,{\color{#88F}1} + {\color{#FF8}6}\\ \label{eq:box1}15&=6\,.\,{\color{#88F}2} + {\color{#FF8}3}\\ \notag 6&=\boxed{3}\,.\,{\color{#88F}2} + {\color{#FF8}0} \end{align}Isolons les restes dans chacune de ces identités (sauf la dernière où il est nul). C'est donc l'avant dernier reste \((\ref{eq:box1})\) qui fournit le pgcd \(\boxed{3}\) :
\begin{align} \notag 192\,.\,{\color{#F62}1} + 57\,.\,{\color{#88F}(-3)} &= 21\\ \notag57\,.\,{\color{#F62}1} + 21\,.\,{\color{#88F}(-2)} &= 15\\ \label{eq:box2}21\,.\,{\color{#F62}1} + 15\,.\,{\color{#88F}(-1)} &= \boxed{6}\\ \label{eq:box3}15\,.\,{\color{#F62}1} + \boxed{6}\,.\,{\color{#88F}(-2)} &= 3 \end{align}On reconnaît ici autant d'identités de Bézout avec leurs solutions \(({\color{#F62}u},{\color{#88F}v})\) respectives. L'idée est de faire remonter la valeur \(3\) jusqu'à la première égalité à l'aide de simples additions et multiplications. En multipliant l'égalité \((\ref{eq:box2})\) par le coefficient \({\color{#88F}v=-2}\) de l'entier \(\boxed{6}\) dans l'égalité \((\ref{eq:box3})\), on obtient un nouveau système :
\begin{align} \notag 192\,.\,{\color{#F62}1} + 57\,.\,{\color{#88F}(-3)} &= 21\\ \notag57\,.\,{\color{#F62}1} + 21\,.\,{\color{#88F}(-2)} &= 15\\ \label{eq:box4}21\,.\,{\color{#F62}(-2)} + 15\,.\,{\color{#88F}2} &= \boxed{6\,.\,(-2)}\\ \label{eq:box5}15\,.\,{\color{#F62}1} + \boxed{6\,.\,{\color{#88F}(-2)}} &= 3\\ \end{align}On additionne alors les deux dernières égalités \((\ref{eq:box4})\) et \((\ref{eq:box5})\) pour éliminer \(\boxed{6\,.\,(-2)}\) de part et d'autre du résultat pour obtenir l'identité de Bézout \((\ref{eq:box6})\) :
\begin{align} \notag 192\,.\,{\color{#F62}1} + 57\,.\,{\color{#88F}(-3)} &= 21\\ \notag57\,.\,{\color{#F62}1} + 21\,.\,{\color{#88F}(-2)} &= \boxed{15}\\ \label{eq:box6}21\,.\,{\color{#F62}(-2)} + \boxed{15}\,.\,{\color{#88F}3} &= 3 \end{align}Et on fait remonter ainsi \(3\) de proche en proche :
\begin{align} \notag 192\,.\,{\color{#F62}1} + 57\,.\,{\color{#88F}(-3)} &= 21\\ \notag57\,.\,{\color{#F62}3} + 21\,.\,{\color{#88F}(-6)} &= \boxed{15\,.\,3}\\ 21\,.\,{\color{#F62}(-2)} + \boxed{15\,.\,{\color{#88F}3}} &= 3 \end{align}Soit
\begin{align} \notag 192\,.\,{\color{#F62}1} + 57\,.\,{\color{#88F}(-3)} &= \boxed{21}\\ \notag 57\,.\,{\color{#F62}3} + \boxed{21}\,.\,{\color{#88F}(-8)} &= 3\\ \end{align}Et donc
\begin{align} \notag 192\,.\,{\color{#F62}(-8)} + 57\,.\,{\color{#88F}24} &= \boxed{21\,.\,(-8)}\\ \notag 57\,.\,{\color{#F62}3} + \boxed{21\,.\,{\color{#88F}(-8)}} &= 3\\ \end{align}Pour obtenir finalement
\begin{align} \notag 192\,.\,{\color{#F62}(-8)} + 57\,.\,{\color{#88F}(27)} &= 3\\ \end{align}Notons \((q_i)_{i\in\llbracket 1,\,n\rrbracket }\) les \(n\) premiers quotients des \(n+1\) divisions euclidiennes qui ont été effectuées successivement pour calculer \((a,b)\). Alors le couple solution de la \(i\)-ème identité de Bézout correspondante est égal à \((1,-q_i)\). Dans notre exemple, on avait \[(q_1,q_2,q_3,q_4)=(3,2,1,2).\]
Chaque remontée du pgcd consiste en une multiplication et une addition de l'identité de Bézout précédente, modifiant du coup les valeurs du couple solution de cette identité. Notons \((u,v)\) le couple qui va décrire successivement les couples solutions de ces \(n\) identités de Bézout en partant de la dernière. On pose initialement \((u,v):=(0,1)\). Pour obtenir le couple solution de la dernière identité, on vérifie facilement qu'il suffit d'appliquer la règle de réécriture \(R_{\color{#FF8}n}\) suivante :
\begin{equation} \label{eq:regle} R_{\color{#FF8}n}:\qquad(u,v)\;\lf\; (v,u-q_{\color{#FF8}n}v). \end{equation}Soit pour notre exemple \((u,v)\;\lf\;(1,0-2.1)=(1,-2)\) (cf. identité \((\ref{eq:box1})\)). Puis on recommence en appliquant successivement les règles \(R_{n-1}\), \(R_{n-2}\), etc. jusqu'à \(R_1\). En conclusion, l'algorithme d'Euclide étendu consiste dans un premier temps à appliquer l'algorithme d'Euclide aux entiers \(a\) et \(b\) pour construire la séquence des quotients \((q_i)_{i\in\llbracket 1,\,n\rrbracket }\) des divisions euclidiennes successives, puis dans un deuxième temps à appliquer les règles de réécritures \(R_{i}\) au couple \((u,v)\;\lf\;(0,1)\) pour \(i\) allant de \(n\) à \(1\).
Notons que la liste \(Q\) de l'algorithme ci-dessous contient tous les quotients, y compris le dernier pour lequel le reste est nul, la remontée se fait donc à partir de l'avant dernier quotient ici.
ALGORITHME PGCD-Etendu(a,b): (u,v)
DONNEES:
a,b: entiers relatifs
VARIABLES
Q: liste d'entiers relatifs
t,u,v: entiers relatifs
DEBUT
Q ← []
TQ (b > 0) FAIRE
t ← b
Q ← Q + [a DIV b]
b ← a MOD b
a ← t
FTQ
i ← #Q - 2
(u,v) ← (0,1)
TQ (i > 0) FAIRE
t ← u
u ← v
v ← t - Q[i] * v
i ← i - 1
FTQ
RENVOYER (u,v)
FIN
Le théorème suivant exprime la succession de réécritures \((\ref{eq:regle})\) en termes plus proche du langage mathématique classique, à savoir un produit matriciel. L'annexe en fin de chapitre fournit le minimum vital sur les matrices pour comprendre l'énoncé de ce théorème.
Nous admettrons le théorème suivant dont nous avons donné les grandes lignes de la preuve. Cette fois, il s'agit d'un théorème constructif qui exprime d'une autre façon l'algorithme d'Euclide étendu.
Les équations diophantiennes#Diophante était un mathématicien grec qui vécut entre le 1er et le 4ème siècle de notre ère et fut l'un des pionniers de l'algèbre. sont des équations polynomiales dont les inconnues sont cherchées dans \(\Z\) ou éventuellement \(\Q\). Elles jouent un rôle important en cryptologie.
Exemple. Considérons l'équation à trois inconnues \begin{equation} \label{eq:Fermat} x^n+y^n=z^n. \end{equation} étudiée par Fermat*Pierre de Fermat était un mathématicien et magistrat français du 17ème siècle.. Elle admet une infinité de solutions dans \(\Z^3\) pour \(n=1\) puisque pour tout couple \((x,y)\) la valeur \(z:=x+y\) convient. Pour \(n=2\), le triplet \((x,y,z):=(3,4,5)\) est une solution que les maçons connaissent parfaitement puisqu'elle leur permet de construire des murs à angles droits sans mètre ni équerre. En effet l'égalité \begin{equation} \label{eq:macon} 3^2+4^2=5^2 \end{equation} prouve qu'un triangle de côtés de longueurs \(3\) et \(4\) et d'hypothénuse \(5\) est nécessairement rectangle d'après la réciproque du théorème de Pythagore. Fermat conjectura en 1637 que l'équation \((\ref{eq:Fermat})\) n'admettait aucune solution dans \(\Z\) si \(n\gt 2\). Il a fallu attendre 1994 pour que le mathématicien anglais Andrew Wiles prouve enfin cette conjecture.
Dans un 2ème temps, il déplace le deuxième clou de la cordelette à 4 unités de distance de \(A\) et trace cette fois un arc de cercle approximativement sur la perpendiculaire.
Dans un 3ème temps, il déplace le premier clou en \(B\) et place le deuxième à \(5\) unité de distance et trace un arc de cercle qui croise le précédent pour obtenir le point \(C\).
Nous sommes moins ambitieux ici, et nous nous contentons d'équations à deux inconnues \(x\) et \(y\) de la forme
\begin{equation} \label{eq:diolin} ax+by=c \end{equation}où \((a,b,c)\in\Z^3\) et où les solutions \((x,y)\) sont cherchées dans \(\Z\times\Z\). On reconnaît bien sûr la forme de l'identité de Bézout et on sait d'après le théorème de Bézout qu'il faut nécessairement que \((a,b)\mid c\) sans quoi il n'y a pas de solutions. Supposons donc que \((a,b)\mid c\). L'algorithme d'Euclide étendu nous fournit alors un couple \((u,v)\) solution de l'équation \begin{equation*} au+bv=(a,b) \end{equation*} Il suffit de multiplier cette équation par \(\frac{c}{(a,b)}\) pour obtenir \begin{equation} a\frac{c}{(a,b)}u+b\frac{c}{(a,b)}v=c. \end{equation} Et ainsi le couple \((x,y):=(\frac{c}{(a,b)}u,\frac{c}{(a,b)}v)\) est solution de l'équation \((\ref{eq:diolin})\).
Nous avons vu que d'autres entiers que \(0\) pouvaient ne pas admettre d'inverse dans \(\Z/n\Z\). On peut alors se demander s'il existe un moyen de trouver quels sont les entiers modulo \(n\) qui admettent un inverse sans calculer la table de multiplication.
Tous les théorèmes qui vont suivre tournent autour des questions de divisibilité. C'est le sous-ensemble \((\Z/n\Z)^\times\) des éléments inversibles de \(\Z/n\Z\) qui est au centre de ce qui suit. Cet ensemble forme un groupe quand on le munit de la multiplication.
Une première application du lemme de Gauss*Carl Friedrich Gauss : mathématicien, astronome et physicien allemand du 18ème siècle. Ses contributions majeures font de lui l'un des plus brillants scientifiques de tous les temps. est de montrer que si \(p\) est un nombre premier, alors les coefficients binomiaux \(\binom{p}{k}\) sont tous divisibles par \(p\) pour \(k\in\ab{1}{p-1}\). En effet, on a \begin{equation*} \binom{p}{k}=\frac{p!}{k!\,(p-k)!}, \end{equation*} d'où \begin{equation*} p!={\color{#88F}k!(p-k)!\binom{p}{k}}, \end{equation*} mais puisque \(p\) divise \(p!\), il divise le membre droit de l'égalité ci-dessus. Mais \(p\) est premier avec \(h!(p-h)!\) pour tout \(k\in\ab{1}{p-1}\), le lemme de Gauss permet de conclure. Un corollaire important (le lemme d'Euclide) en découle immédiatement :
D'après ce théorème, on sait que le groupe \((\Z/n\Z)^\times\) des inversibles de \(\Z/n\Z\) est constitué des classes des entiers premiers avec \(n\). C'est un groupe fini, son ordre est donc le nombre d'entiers non-nuls inférieurs à \(n\) et premiers avec \(n\) qui définit une fonction*Leonhard Euler était un éminent mathématicien et physicien Suisse du 18ème siècle. :
On en déduit immédiatement le corollaire suivant, mais il peut être démontré comme un résultat autonome de plusieurs façons :
Soit \(s\in\ab{0}{n-1}\). On définit la fonction \(\rho_s:A^n\;\rg\;A^n\) dite de permutation circulaire de \(s\) positions par
\begin{equation} \label{eq:circ} \rho_s(u_0u_1\ldots u_{n-1}):=u_{s}u_{s+1}\ldots u_{n-1}u_0u_1\ldots u_{s-1}. \end{equation}Par exemple \(\textit{arc}=\rho_1(\textit{car})\). Démontrez que si \(p\) est un nombre premier alors \(\rho_s(u)=u\) où \(u=u_0u_1\ldots u_{n-1}\) si et seulement si \(s=0\) ou alors tous les symboles de \(u\) sont égaux. En déduire que les \(p\) permutés circulaires d'un mot \(u\in M\) sont tous distincts.
Indication : déduire de \((\ref{eq:circ})\) que \(\forall i\in\ab{0}{p-1}\) et \(\forall k\in\N\), \(u_{i+ks\pmod p}=u_i\) puis utilisez la proposition qui affirme que tout nombre entier non-nul engendre le groupe additif \((\Z/p\Z,+)\).
Démontrez ensuite que la relation binaire définie sur \(M\) par \(u{\rel}v\) si et seulement s'il existe \(s\in\ab{1}{p-1}\) tel que \(v=\rho_s(u)\) est une relation d'équivalence et que toute classe d'équivalence est de cardinal \(p\). En utilisant le principe des Bergers pour la surjection canonique, montrez que \(p\mid \#M\).
Que se passe-t-il si l'on mélange les congruences ?
Une bande de \(17\) pirates possède un trésor en pièces d'or. Ils projettent de le partager et de donner les \(3\) pièces restantes au cuisinier chinois. Au moment du partage, comme de bien entendu, les pirates se querellent et \(6\) sont tués. Un nouveau partage prévoit de donnerles \(4\) pièces restantes au cuisinier, mais l'affaire se gâte de nouveau car une tempête a fait chavirer leur navire. Cette fois, il ne reste que \(6\) pirates plus le cuisinier, qui recevrait les 5 pièces d'or restantes une fois partagé entre les pirates.
Quel butin pourrait récupérer le cuisinier s'il empoisonnait ces 6 autres survivants ?
Si l'on note \(n\) la valeur du butin en nombre de pièces d'or, ce problème se traduit par le système de conggruences suivant : \begin{equation} \label{eq:butin} \begin{cases} n\equiv 3\ (\text{mod}\ 17)\\ n\equiv 4\ (\text{mod}\ 11)\\ n\equiv 5\ (\text{mod}\ 6)\\ \end{cases} \end{equation}
On vérifie facilement que si l'on se donne une famille d'anneaux \((A_i)_{i\in I}\) et que l'on munit \(A\), l'ensemble produit des \(A_i\), des lois produits, alors \((A,+,\times)\) est un anneau, de surcroît commutatif si tous les \(A_i\) le sont. On l'appelle l'anneau produit des \(A_i\). Chacune des projections \(p_i\) est un morphisme d'anneaux surjectif.
Ici nous allons considérer une famille \((n_i)_{i\in\ab{1}{k}}\) de \(k\) entiers naturels non-nuls et premiers entre eux pour constituer la famille \((\Z/n_i\Z)_{i\in\ab{1}{k}}\) et l'anneau produit. Le théorème des restes chinois montre que cet anneau produit est isomorphe à l'anneau \(\Z/n\Z\) si \(n\) désigne le produit des \(n_i\), autrement dit on peut calculer indifféremment sur des entiers modulo \(n\) ou sur le \(k\)-uplet des restes modulo \(n_i\) de cet entier.
Si les entiers \(n_i\) ne sont pas premiers entre eux, il ne s'agit plus que d'une injection et un \(k\)-uplet \((r_i)_{i\in\ab{1}{k}}\) n'admet un antécédent que si \((n_i,n_j)\mid(r_i-r_j)\) pour tout couple \((i,j)\in\ab{1}{k}^2\).
Ce que nous cherchons, quand nous voulons résoudre un système de congruences similaire à celui des restes chinois \((\ref{eq:butin})\), c'est l'isomorphisme réciproque \(\phi^{-1}\) de l'isomorphisme \(\phi\) pour calculer \(\phi^{-1}(3,4,5)\). Malheureusement, le théorème que nous venons d'établir ne fournit aucun moyen effectif de le calculer.
Notons \(\tilde{n_{i}}:=n/n_i\). Cet entier est premier avec \(n_i\) puisque les \(n_i\) sont premiers entre eux, il est donc inversible modulo \(n_i\) (cf. ce théorème). On calcule alors son inverse en appliquant l'algorithme d'Euclide étendu pour obtenir les deux coefficients \((u,v)\) de l'identité de Bézout :
\begin{align} \tilde{n_{i}}.u+n_i.v=1. \end{align}En réduisant modulo \(n_i\), on obtient
\begin{align} \tilde{n_{i}}.u\equiv 1\ (\text{mod}\ n_i). \end{align}Donc \(u\) est l'inverse modulo \(n_i\) de \(\tilde{n_i}\), on le note \(\mu_i\). On définit alors l'entier
\begin{equation} x:=\sum_{i=1}^k{\color{#F44}\tilde{n_i}}.{\color{#88F}\mu_i}.r_i\ (\text{mod}\ n). \end{equation}Il nous reste à vérifier que cet entier \(x\) est bien solution de l'équation \((\ref{eq:resteschinois})\). Si l'on calcule modulo \(n_i\) seul le terme \(\mu_i.\tilde{n_i}.r_i\) d'indice \(i\) est non-nul puisque tous les autres termes de cette somme sont des multiples de \(n_i\). Or \(\mu_i.\tilde{n_i}.r_i=r_i\) puisque \(\mu_i.\tilde{n_i}\equiv 1\ \text{mod}\ n_i\).
Nous allons enfin savoir quel est le montant de ce butin que va récupérer le cuisinier chinois… On récapitule :
\begin{align*} n&=17.11.6=1\,122,\\ n_1&={\color{#FF8}17} & {\color{#F44}\tilde n_1}&=11.6={\color{#F44}66} & r_1&=3,\\ n_2&={\color{#FF8}11} & {\color{#F44}\tilde n_2}&=17.6={\color{#F44}102} & r_2&=4,\\ n_3&={\color{#FF8}6} & {\color{#F44}\tilde n_3}&=17.11={\color{#F44}187} & r_3&=5. \end{align*}Il suffit d'utiliser le programme plus haut pour nous fournir les 3 couples \(({\color{#88F}u},v)\) de l'identité de Bézout pour les trois calculs de pgcd \(({\color{#F44}66},{\color{#FF8}17})\), \(({\color{#F44}102},{\color{#FF8}11})\) et \(({\color{#F44}187},{\color{#FF8}6})\) : \begin{align*} {\color{#F44}66}.{\color{#88F}8}+{\color{#FF8}17}.(-31)&\equiv 1\ (\text{mod}\ n) &\Rightarrow& & {\color{#88F}\mu_1}&={\color{#88F}8},\\ {\color{#F44}102}.{\color{#88F}4}+{\color{#FF8}11}.(-37)&\equiv 1\ (\text{mod}\ n) &\Rightarrow& & {\color{#88F}\mu_2}&={\color{#88F}4},\\ {\color{#F44}187}.{\color{#88F}1}+{\color{#FF8}6}.(-31)&\equiv 1\ (\text{mod}\ n) &\Rightarrow& & {\color{#88F}\mu_1}&={\color{#88F}1}. \end{align*} Et on peut calculer le butin \(x\) : \begin{align*} x&:={\color{#F44}66}.{\color{#88F}8}.3 + {\color{#F44}102}.{\color{#88F}4}.4 + {\color{#F44}187}{\color{#88F}1}.5\\ &= 4\,151,\\ &\equiv \boxed{785}\ (\text{mod}\ 1\,122). \end{align*}
Nous admettrons le corollaire suivant :
Le protocole RSA est une application extrêmement ingénieuse du théorème d'Euler pour communiquer des messages chiffrés entre deux entités \(A\) et \(B\) (Alice et Bob dans le folklore cryptographique), sans qu'elles aient jamais à communiquer de quantité secrète entre elles. Autrement dit, elles peuvent utiliser ce protocole sur un canal public et aucune des informations qu'elles feront transiter ne pourra servir à retrouver le contenu réel des messages qu'elles transmettent (au prix de quelques précautions mathématiques à considérer).
Le protocole est asymétrique car il est unidirectionnel, nous le présentons ici pour une communication \(\text{Bob}\to\text{Alice}.\) Le gros du travail mathématique est réalisé une seule fois en amont par Alice, avant que Bob ne puisse lui envoyer les messages qu'il souhaite. Bien sûr, pour qu'Aline puisse elle aussi communiquer avec Bob, un travail préparatoire similaire devra être réalisé par Bob, une fois pour toutes là aussi.
Tout se déroule dans deux anneaux quotients \(\Z/n\Z\) et \(\Z/\phi(n)\Z\) pour un entier \(n\) déterminé par Alice dans la phase préparatoire. Le simulateur ci-dessous décompose les trois phases suivies par les deux protagonistes. Les valeurs sur fond vert sont publiques, celles sur fond rouge restent secrètes :
La phase préparatoire n'est effectuée qu'une seule fois pour tous les chiffrements ultérieurs de Bob et tous les déchiffrements d'Alice, c'est la plus complexe. Les deux autres se font ensuite très simplement si l'on dispose d'un langage évolué comme le Python 3. Le travail de Bob se limite à écrire
y = x**e % n
puis Alice déchiffre avec
x = y**d % n
Il faut réaliser que cette facilité d'écriture accordée par le langage Python cache en fait des algorithmes sophistiqués. Ils seront étudiés en algorithmique.
Ce protocole pose un grand nombre de problèmes algorithmiques. Le premier est de pouvoir réaliser des opérations avec des nombres entiers de plusieurs centaines de chiffres, une simple calculatrice ne peut évidemment pas le faire. Comment trouver des nombres premiers \(p\) et \(q\) aussi grands ? Comment calculer des puissances de nombres entiers aussi grandes ? Ce protocole est-il sûr ? Ces questions seront abordées en algorithmique et en cryptographie.
Malgré le développement d'algorithmes particulièrement efficaces, tous ces calculs restent malgré tout coûteux. Ce protocole est généralement utilisé, non pas pour chiffrer un message, mais pour transmettre une clé d'un protocole à clé secrète beaucoup moins gourmand en calculs. Ainsi Bob transmet une clé secrète \(k\) à Alice via le protocole à clé public rsa et tous les deux vont utiliser un autre protocole, à clé secrète cette fois, qui utilise la clé \(k\) pour chiffrer les messages.
Le calcul matriciel désigne l'ensemble des techniques de calcul pour réaliser les opérations usuelles sur les applications linéaires définies sur des espaces vectoriels de dimensions finies, donc des morphismes.
Pour ceux qui n'auraient pas encore rencontré de matrice \(\ell\times c\) à \(\ell\) lignes et \(c\) colonnes où \((\ell,c)\in\N^2\), il s'agit en première approche d'une étagère à casiers pour ranger les éléments d'un anneau \(A\). Plus formellement, c'est une famille \(M\) d'éléments d'un anneau \(A\) indexée par un produit d'intervalles \(\ab{1}{\ell}\times\ab{1}{c}\). On représente les éléments de cette matrice sous forme de table constituée de \(\ell\) lignes et \(c\) colonnes :
\begin{align*} M=\begin{pmatrix} (1,1) & (1,2) & \cdots & (1,{\color{#88F}j}) & \cdots & (1,c)\\ (2,1) & \cdots & & {\color{#88F}\vdots} & & (2,c) \\ (3,1) & \cdots& & {\color{#88F}\vdots} & & \vdots\\ \vdots & & & {\color{#88F}\vdots} & & \\ ({\color{#FF8}i},1) &{\color{#FF8}\cdots} &{\color{#FF8}\cdots} & ({\color{#FF8}i},{\color{#88F}j}) & {\color{#FF8}\cdots} & ({\color{#FF8}i},c)\\ \vdots & & & {\color{#88F}\vdots} & & \vdots \\ (\ell,1) &\cdots & & (\ell,{\color{#88F}j}) & \cdots & (\ell,c) \end{pmatrix} \end{align*}La \(i\)-ème ligne contient la liste de tous les éléments de premier indice \(i\), la \(j\)-ème colonne contient la liste de tous les éléments de deuxième indice \(j\) (nous avons placé les indices en lieu et place des éléments de la matrice). La valeur dans le casier \(({\color{#F84}i},{\color{#48F}j})\) est désignée par \(M[i,j]\) ou \(M[i][j]\) ou encore \(M_{i,j}\) selon les auteurs et/ou le contexte.
La structure matricielle est plus pratique qu'une simple étagère de rangement, on peut additionner et multiplier des matrices et même multiplier des matrices par des nombres, grâce aux lois de composition de l'anneau \(A\).
Pour l'addition c'est très simple, il faut que les matrices aient exactement le même nombre de lignes et de colonnes et il suffit d'additionner les \(\ell\times c\) éléments de chaque matrice terme-à-terme, par exemple : \begin{align*} \begin{pmatrix} 1&2\\ -5&1 \end{pmatrix} + \begin{pmatrix} -1&1\\ 2&3 \end{pmatrix} = \begin{pmatrix} 1-1&2+1\\ -5+2&1+3 \end{pmatrix} = \begin{pmatrix} 0&3\\ -3&4 \end{pmatrix} . \end{align*} Pour la multiplication, c'est un peu plus compliqué car on peut multiplier des matrices \(G\) et \(D\) de dimensions différentes. On note \(\ell_g\) et \(c_g\) (resp. \(\ell_d\) et \(c_d\)) le nombre de lignes et de colonnes de la matrice \(G\) (resp. \(D\)). Il faut que \(c_g=\ell_d\) et la matrice résultat \(R:=G\times D\) contiendra \(\ell_g\) lignes et \(c_d\) colonnes. Le terme \(R[i,j]\) s'obtient en faisant le produit scalaire de la ligne \(i\) par la colonne \(j\), c'est-à-dire la somme des produits terme-à-terme des éléments de ces deux sous-listes dans le sens de lecture, par exemple \[(1,2,3)\cdot(2,-3,4)=1\cdot2+2\cdot(-3)+3\cdot 4=8.\]
Exemple : \begin{align*} \begin{pmatrix} \color{#88F}1&\color{#88F}0\\ -5&1\\ 2&-1 \end{pmatrix} \times \begin{pmatrix} -1&\color{#FF8}1\\ 2&\color{#FF8}3 \end{pmatrix} = \begin{pmatrix} (1,0)\cdot(-1,2) & {\color{#88F}(1,0)}\cdot{\color{#FF8}(1,3)}\\ (-5,1)\cdot(-1,2) & (-5,1)\cdot(1,3)\\ (2,-1)\cdot(-1,2) & (2,-1)\cdot(1,3) \end{pmatrix} = \begin{pmatrix} -1&\boxed{1}\\ 7&-2\\ -4&-1 \end{pmatrix} . \end{align*}
Le terme d'index \((\color{#88F}1,{\color{#FF8}2})\) de la matrice résultat est le produit scalaire de la ligne 1 de la matrice à gauche avec la colonne 2 de la matrice à droite. La multiplication d'une matrice \(M\) de dimension \(\ell\times c\) par un nombre fournit une matrice de même dimension dont chaque terme est le produit par ce nombre du terme correspondant de la matrice \(M\). Par exemple : \begin{equation*} (-2)\cdot\begin{pmatrix} 2 & 0\\ -1 & 4 \end{pmatrix} =\begin{pmatrix} (-2)\cdot 2 & (-2)\cdot 0\\ (-2)\cdot (-1) & (-2)\cdot 4 \end{pmatrix} =\begin{pmatrix} -4 & 0\\ 2 & -8 \end{pmatrix}. \end{equation*} On a en particulier \begin{align*} \begin{pmatrix} a & b\\ c & d \end{pmatrix} \times \begin{pmatrix} a' & b'\\ c' & d' \end{pmatrix} &= \begin{pmatrix} aa'+bc' & ab'+bd'\\ ca'+dc' & cb'+dd' \end{pmatrix},\\ \begin{pmatrix} a & b\\ c & d \end{pmatrix} \times \begin{pmatrix} u\\ v \end{pmatrix} &= \begin{pmatrix} au+bv\\ cu+dv \end{pmatrix}. \end{align*}
Le cours d'algèbre linéaire de deuxième année présentera ces notions calculatoires en détail.
Nano tutoriel Python-UNIX à imprimer/lire/conserver.
On rappelle que le quotient et le reste de la division euclidienne de \(a\) par \(b\) s'écrivent respectivement a // b et a % b en Python. Pour éviter de faire deux fois le calcul de la division euclidienne quand on a besoin du quotient et du reste, on peut utiliser la fonction divmod(a,b) qui renvoie le couple \((q,r)\).
Indication : utilisez les fonctions ord et chr qui renvoient respectivement le code d'un symbole et le symbole associé à un code. On supposera que le texte clair est exclusivement constitué de majuscules. Comment utiliser cette même fonction pour déchiffrer un texte ?
Factoriser(60) 2.2.3.5
def AfficheTable(T):
for ligne in T:
for x in ligne:
print(str(x).rjust(3),end='')
print()