Aller au contenu principal

Arithmétique modulaire

Ce que ce chapitre apporte6 points
  • Maîtriser divisibilité, division euclidienne, pgcd et ppcm.
  • Appliquer l'algorithme d'Euclide et sa version étendue, et énoncer le théorème de Bézout.
  • Calculer dans les congruences et déterminer un inverse modulaire.
  • Reconnaître les nombres premiers, appliquer le crible d'Ératosthène, citer les familles remarquables.
  • Utiliser l'indicatrice d'Euler et le petit théorème de Fermat.
  • Simplifier une congruence quand c'est permis, et reconnaître quand cela ne l'est pas.

Un message chiffré n'est qu'une suite de nombres. Derrière cette évidence se cache la question qui fonde toute la sécurité informatique : comment fabriquer une opération facile dans un sens et pratiquement impossible dans l'autre ? La réponse ne vient ni de l'analyse ni de la géométrie, mais de l'arithmétique des entiers, celle qu'on croit avoir laissée au collège. Ce chapitre la reprend depuis la divisibilité et installe tout ce dont le chapitre suivant aura besoin.

Il retourne l'outil du chapitre sur la complexité : le coût de calcul y était un ennemi à faire baisser ; il devient ici le rempart sur lequel tout repose.

Pourquoi de l'arithmétique au XXIe siècle

L'objection est naturelle : on dispose des réels, des complexes, des vecteurs, pourquoi revenir aux entiers ?

Trois raisons, et la troisième est décisive
  1. Une machine ne manipule que des entiers. Un « nombre à virgule » est un entier accompagné d'un exposant, sur un nombre fini de bits. En Python, 0.1 + 0.2 == 0.3 est faux, et 1/31/3 n'a pas d'écriture exacte. Le chapitre Les nombres à virgule le montre bit par bit.

  2. L'arithmétique est plus difficile que le calcul réel, pas plus simple. Dans R\mathbb{R}, toute équation ax=bax = b avec a0a \neq 0 a une solution ; dans Z\mathbb{Z}, 3x=53x = 5 n'en a aucune. Cette contrainte supplémentaire rend l'existence des solutions imprévisible.

  3. Cette imprévisibilité est exactement ce qu'on cherche. Elle permet de construire des opérations faciles dans un sens et hors d'atteinte dans l'autre. Cela reste vrai quand l'adversaire connaît la méthode, et même quand il possède une partie de la clé.

Divisibilité et division euclidienne

Définitions

aa divise bb, noté aba \mid b, s'il existe un entier kk tel que b=kab = ka.

Division euclidienne : pour aa entier et bb entier non nul, il existe un unique couple (q,r)(q, r) tel que a=bq+ra = bq + r avec 0r<b0 \leq r < |b|.

L'unicité du couple (q,r)(q, r) est ce qui rend tout le reste possible. En Python, a // b donne qq et a % b donne rr : ce sont les opérateurs de division entière et de reste du parcours Python.

Le reste est toujours positif, en Python

-17 // 5 vaut -4 et -17 % 5 vaut 3, ce qui respecte 17=5×(4)+3-17 = 5 \times (-4) + 3 avec 03<50 \leq 3 < 5. En C ou en Java, -17 % 5 vaut -2 : le langage tronque vers zéro au lieu d'arrondir vers le bas.

En cryptographie, où tout est modulaire, cette différence transforme un chiffrement correct en chiffrement faux. C'est un piège classique du portage d'un algorithme d'un langage à l'autre.

PGCD et algorithme d'Euclide

Le pgcd est le plus grand entier divisant aa et bb ; le ppcm le plus petit multiple commun positif. Ils sont liés par pgcd(a,b)×ppcm(a,b)=ab\operatorname{pgcd}(a, b) \times \operatorname{ppcm}(a, b) = |ab|.

Deux entiers sont premiers entre eux si leur pgcd vaut 1. Ce n'est pas la même chose qu'être premiers : 8 et 9 sont premiers entre eux, et aucun des deux n'est premier.

Algorithme d'Euclide

Il repose sur une seule observation : pgcd(a,b)=pgcd(b,amodb)\operatorname{pgcd}(a, b) = \operatorname{pgcd}(b, a \operatorname{mod} b). On remplace le couple par un couple plus petit jusqu'à obtenir un reste nul ; le dernier reste non nul est le pgcd.

Cette observation se démontre en trois lignes, et il vaut la peine de les suivre : sans elle, l'algorithme n'est qu'une recette.

Le point de départ est la division euclidienne a=bq+ra = bq + r, récrite r=abqr = a - bq.

Soit dd un diviseur commun à aa et à bb. Il divise alors abqa - bq, c'est-à-dire rr : tout diviseur commun de aa et bb est aussi un diviseur commun de bb et rr.

Réciproquement, soit dd un diviseur commun à bb et à rr. Il divise bq+rbq + r, c'est-à-dire aa : tout diviseur commun de bb et rr est aussi un diviseur commun de aa et bb.

Les deux couples ont donc exactement les mêmes diviseurs communs, et en particulier le même plus grand. Remplacer (a,b)(a, b) par (b,r)(b, r) ne perd rien, et fait strictement décroître le second terme : c'est ce qui garantit à la fois la justesse et la terminaison.

C'est un des plus vieux algorithmes connus, et il reste remarquablement rapide : le nombre de divisions est en O(log(min(a,b)))O(\log(\min(a, b))), c'est-à-dire proportionnel au nombre de chiffres. La notation est celle de l'analyse d'algorithmes, abordée dans le parcours Algorithmique. Sur des nombres de 600 chiffres, l'algorithme pose un peu plus d'un millier de divisions et termine en une fraction de milliseconde.

Euclide étendu et Bézout

Théorème de Bézout

Pour tous entiers aa et bb non nuls, il existe des entiers uu et vv tels que :

au+bv=pgcd(a,b)au + bv = \operatorname{pgcd}(a, b)

En clair : le pgcd de deux entiers se fabrique toujours en les combinant, chacun multiplié par un entier bien choisi. uu et vv sont ces deux multiplicateurs, appelés coefficients de Bézout, et rien n'oblige qu'ils soient positifs.

En particulier, aa et bb sont premiers entre eux si et seulement si il existe uu et vv avec au+bv=1au + bv = 1.

L'algorithme d'Euclide étendu calcule ce couple (u,v)(u, v) en même temps que le pgcd. Ce n'est pas une curiosité théorique : c'est exactement ce qui permettra de calculer une clé privée RSA.

Le code ci-dessous le fait en trois lignes, mais il faut savoir le dérouler à la main. C'est le seul moyen de comprendre d'où sortent uu et vv, et ce calcul revient dans tout le chapitre.

La descente, puis la remontée

Descendre. Poser les divisions euclidiennes successives, chacune sous la forme dividende = diviseur × quotient + reste, jusqu'à un reste nul. Le dernier reste non nul est le pgcd.

Remonter. Partir de la ligne qui donne ce pgcd, isolé à gauche. Puis, ligne après ligne en remontant, remplacer chaque reste par son expression tirée de la ligne du dessus. À la fin il ne reste que aa et bb, et leurs coefficients sont uu et vv.

Euclide étendu sur 3120 et 17, à la main

Ce couple n'est pas choisi au hasard : 1717 sera l'exposant public et 31203120 la valeur de φ(N)\varphi(N) dans l'exemple RSA du chapitre suivant.

La figure ci-dessous pose les deux moitiés côte à côte. Cliquer sur une ligne de la descente montre l'étape de remontée qui la consomme. Il y en a exactement une par ligne, ce qui ne saute pas aux yeux quand les deux moitiés sont recopiées l'une sous l'autre.

pgcd deet

La descentediviser jusqu'à un reste nul

3120=17 × 183+9
17=9 × 1+8
9=8 × 1+1
8=1 × 8+0

Dernier reste non nul : 1. Les deux nombres sont premiers entre eux.

La remontéeune étape par ligne, du bas vers le haut

Substituer le reste de la ligne du dessus revient à (α, β) ← (β, α − β × q) avec q = 183. Toute la remontée tient dans cette règle.

Bézout. 3120 × 2 + 17 × -367 = 1contrôle : 1 = 1

Inverse modulaire. Le coefficient de 17 vaut -367, ramené dans [0 ; 3119] il donne 17⁻¹ ≡ 2753 [3120]contrôle : 17 × 2753 = 46801 ≡ 1

Euclide étendu sur 3120 et 17. La descente donne le pgcd, la remontée donne les coefficients de Bézout, et le second d'entre eux, ramené entre 0 et 3119, est l'inverse modulaire.

La descente pose quatre divisions et s'arrête sur un reste nul. Le dernier reste non nul vaut 11 : les deux nombres sont premiers entre eux, et Bézout garantit donc l'existence de uu et vv.

La remontée repart de la ligne qui isole ce 11, puis substitue à chaque étape le reste de la ligne du dessus :

1=98×11 = 9 - 8 \times 1

8=179×18 = 17 - 9 \times 1, d'où 1=9(179)=2×9171 = 9 - (17 - 9) = \mathbf{2 \times 9} - 17

9=312017×1839 = 3120 - 17 \times 183, d'où 1=2×(3120183×17)17=2×3120367×171 = 2 \times (3120 - 183 \times 17) - 17 = 2 \times 3120 - 367 \times 17

Le résultat. 3120×2+17×(367)=62406239=13120 \times 2 + 17 \times (-367) = 6240 - 6239 = 1. Donc u=2u = 2 et v=367v = -367.

Et comme 17×(367)1 [3120]17 \times (-367) \equiv 1 \ [3120], l'inverse de 1717 modulo 31203120 vaut 367mod3120=3120367=2753-367 \bmod 3120 = 3120 - 367 = \mathbf{2753}. Ce nombre réapparaîtra tel quel comme clé privée.

Une seule règle, et la remontée cesse d'être un exercice de recopie

Sur la ligne courante, le pgcd s'écrit α×dividende+β×diviseur\alpha \times \text{dividende} + \beta \times \text{diviseur}. Remonter d'une ligne revient alors à une seule substitution, dont le résultat tient en une récurrence :

(α,β)(β,αβq)(\alpha , \beta ) \leftarrow (\beta , \alpha - \beta q)

qq est le quotient de la ligne du dessus. Sur l'exemple, la ligne 9=8×1+19 = 8 \times 1 + 1 donne 1=1×9+(1)×81 = 1 \times 9 + (-1) \times 8, soit (1,1)(1, -1), puis (1,2)(-1, 2), puis (2,367)(2, -367). C'est cette règle qu'affiche la figure à chaque étape, et c'est elle qui rend la remontée refaisable de tête.

Un coefficient négatif n'est pas une erreur de calcul

La remontée produit presque toujours un uu ou un vv négatif. L'un des deux au moins doit l'être dès que aa et bb sont positifs : deux termes positifs ne peuvent pas totaliser 1 quand chacun dépasse déjà 1.

Le réflexe est donc de ramener le coefficient utile dans l'intervalle [0;n1][0 ; n-1] par un modn\bmod n final, comme ci-dessus avec 3672753-367 \to 2753. En Python, % le fait déjà : -367 % 3120 vaut bien 2753, là où le % du C rendrait -367.

Deux couples à comparer

Reprendre la figure ci-dessus et y saisir 4848 et 1818 : le pgcd vaut 66, la ligne d'inverse disparaît, et le bloc explique pourquoi. Puis 3535 et 6464 : le pgcd vaut 11 alors qu'aucun des deux n'est premier.

C'est la distinction qui coûte le plus cher dans ce chapitre. Premier est une propriété d'un nombre seul ; premiers entre eux est une propriété d'un couple. RSA exige la seconde de son exposant public, pas la première.

Le contrôle qui prend cinq secondes

Une fois uu et vv trouvés, recalculer au+bvau + bv et vérifier que le résultat est le pgcd. Une erreur de signe ou de quotient se voit immédiatement, alors qu'elle se propagerait sans bruit jusqu'à une clé privée fausse.

main.py
Sortie
>_ Prêt à exécuter…

Congruences : calculer modulo nn

Beaucoup de questions ne demandent pas un résultat, seulement un reste. L'heure qu'il sera dans 50 heures, le jour de la semaine dans 100 jours, la case d'une table de hachage, la lettre obtenue après un décalage de l'alphabet. Dans tous ces cas, le quotient ne sert à rien. Calculer le résultat exact puis prendre son reste est un détour coûteux. Les congruences sont le langage qui permet de travailler directement sur les restes, sans jamais quitter les petits nombres.

Définition

ab[n]a \equiv b [n] (« aa congru à bb modulo nn ») signifie que nn divise aba - b, autrement dit que aa et bb ont le même reste dans la division par nn.

La notation se lit à voix haute en deux morceaux : le symbole \equiv se dit « est congru à », et le [n][n] se dit « modulo nn ». Ce [n][n] porte sur toute l'égalité, jamais sur le seul membre de droite. D'autres ouvrages écrivent ab(modn)a \equiv b \pmod n : c'est la même chose.

Ce que la définition écarte : \equiv n'est pas ==. Deux nombres congrus restent deux nombres différents, et rien n'autorise à remplacer l'un par l'autre hors d'un calcul modulo nn.

Travailler modulo nn, c'est compter sur une horloge : passé n1n - 1, on revient à zéro. Toute l'étrangeté de l'arithmétique modulaire vient de là, et elle cesse d'être étrange dès qu'on voit le cercle.

0123456789101112131415et 4116171819202122232425modulo 26
Le cadran modulo 26. Les trois étiquettes désignent la même case : −11, 15 et 41 sont congrus, parce qu'ils ne diffèrent que d'un nombre entier de tours.

Ce qu'il faut y voir : une case du cadran ne porte pas un nombre, elle porte une infinité de nombres, ceux qui laissent le même reste. La vérification tient en deux soustractions : 4115=2641 - 15 = 26 et 15(11)=2615 - (-11) = 26, tous deux multiples de 26. Une congruence se contrôle toujours ainsi, en soustrayant.

La congruence est compatible avec l'addition et la multiplication : si aba \equiv b et cdc \equiv d, alors a+cb+da + c \equiv b + d et acbdac \equiv bd. On peut donc réduire à chaque étape d'un calcul, ce qui évite de manipuler des nombres gigantesques.

Le produit de deux nombres non nuls peut être nul

Modulo 6 : 2×3=602 \times 3 = 6 \equiv 0. Ni 2 ni 3 n'est nul, et pourtant leur produit l'est. On ne peut donc pas « simplifier par 2 » comme on le ferait dans R\mathbb{R}.

Ce phénomène disparaît quand nn est premier : modulo un nombre premier, tout élément non nul est inversible et le produit de deux non-nuls n'est jamais nul. C'est la raison profonde pour laquelle la cryptographie travaille modulo des nombres premiers, ou modulo un produit de deux premiers dont elle contrôle la structure.

L'inverse modulaire

Définition

L'inverse de aa modulo nn est l'entier xx tel que ax1[n]ax \equiv 1 [n]. Il existe si et seulement si pgcd(a,n)=1\operatorname{pgcd}(a, n) = 1, et on l'obtient par Euclide étendu : de au+nv=1au + nv = 1 on tire au1[n]au \equiv 1 [n], donc x=umodnx = u \operatorname{mod} n.

La ligne du milieu, celle qu'on saute souvent : dans au+nv=1au + nv = 1, le terme nvnv est un multiple de nn, donc il vaut 0 modulo nn. Il ne reste que au1au \equiv 1, ce qui est la définition de l'inverse. Le coefficient de Bézout uu est l'inverse, à un modulo près pour le ramener dans [0;n1][0 ; n-1].

Cette condition sur le pgcd n'est pas une clause technique : elle se voit. Avancer de aa en aa sur le cadran revient à parcourir les multiples de aa, et deux cas seulement se présentent.

012345678910111213141516171819202122232425modulo 26pas de 7
Un pas de 7 modulo 26. Le tracé passe par les vingt-six cases avant de revenir au départ : 7 est premier avec 26, donc il existe un nombre de pas qui tombe exactement sur 1. C'est cela, être inversible.

Ce qu'il faut suivre du regard, c'est le tracé : tant qu'il n'est pas refermé, il reste des cases à visiter. Le second cas est l'exact opposé, avec un pas qui partage un diviseur avec 26.

012345678910111213141516171819202122232425modulo 26pas de 13
Un pas de 13 modulo 26. Le tracé ne visite que deux cases et boucle aussitôt : le pgcd de 13 et 26 vaut 13, et jamais on n'atteindra 1. Un chiffrement affine de coefficient 13 serait indéchiffrable, au mauvais sens du terme.

Le tracé se referme immédiatement, et la case 1 n'a jamais été touchée : c'est cela, ne pas être inversible. Une case jamais atteinte, c'est une information définitivement perdue.

La règle, en une phrase

Le pas de aa visite exactement n/pgcd(a,n)n / \operatorname{pgcd}(a, n) cases. Il fait donc le tour complet, et n'atteint le 1, que si ce pgcd vaut 1. C'est la même condition que celle du théorème, vue depuis le cercle plutôt que depuis Bézout.

main.py
Sortie
>_ Prêt à exécuter…

Vérification

Vérification rapideon peut se reprendre

1.Deux nombres premiers entre eux sont…

2.Le théorème de Bézout garantit l'existence de u et v tels que au + bv = pgcd(a, b). À quoi cela sert-il concrètement ?

3.La remontée d'Euclide produit presque toujours un coefficient négatif. Est-ce une erreur ?

4.Calculer a mod n quand a est négatif, en Python et en C, donne…

Nombres premiers

Définition

Un entier p2p \geq 2 est premier s'il admet exactement deux diviseurs positifs distincts : 1 et lui-même.

1 n'est pas premier, et ce n'est pas une convention arbitraire

Il n'a qu'un seul diviseur, pas deux. Surtout, l'admettre détruirait le théorème fondamental de l'arithmétique : tout entier n2n \geq 2 se décompose de façon unique en produit de facteurs premiers. Si 1 était premier, 6=2×3=1×2×3=1×1×2×36 = 2 \times 3 = 1 \times 2 \times 3 = 1 \times 1 \times 2 \times 3 donnerait une infinité de décompositions. C'est l'unicité qui compte, et c'est elle qu'on protège.

Le crible d'Ératosthène

Pour lister tous les premiers jusqu'à NN : on écrit les entiers de 2 à NN, on garde le plus petit non barré, on barre tous ses multiples, on recommence. On peut s'arrêter dès que le carré du candidat dépasse NN.

main.py
Sortie
>_ Prêt à exécuter…

Familles remarquables

Trois familles remarquables

Mersenne : Mp=2p1M_p = 2^p - 1. Pour que MpM_p soit premier, il faut que pp le soit, mais cela ne suffit pas : M11=2047=23×89M_{11} = 2047 = 23 \times 89. Les plus grands premiers connus sont des nombres de Mersenne, parce qu'il existe un test de primalité spécifique et très rapide pour cette forme.

Fermat : Fn=22n+1F_n = 2^{2^n} + 1. Fermat conjecturait qu'ils étaient tous premiers ; c'est vrai pour F0F_0 à F4F_4 (3, 5, 17, 257, 65537), et Euler a réfuté la conjecture en factorisant F5=4294967297=641×6700417F_5 = 4\,294\,967\,297 = 641 \times 6\,700\,417.

Sophie Germain : pp est un premier de Sophie Germain si 2p+12p + 1 est aussi premier. Les premiers sont 2, 3, 5, 11, 23, 29, 41… Ils sont recherchés en cryptographie parce qu'ils produisent des groupes à la structure bien maîtrisée.

« Une puissance de 2 plus 1 est-elle première ? »

Presque jamais. Si 2m+12^m + 1 est premier, alors mm est nécessairement une puissance de 2, c'est-à-dire qu'on est dans la famille de Fermat. Et même là, on ne connaît que cinq nombres de Fermat premiers, ceux que Fermat connaissait déjà : F0F_0 à F4F_4.

La raison est algébrique : si mm a un facteur impair k>1k > 1, alors 2m/k+12^{m/k} + 1 divise 2m+12^m + 1. Exemple : 26+1=65=5×132^6 + 1 = 65 = 5 \times 13, avec 5=22+15 = 2^2 + 1.

main.py
Sortie
>_ Prêt à exécuter…

Factoriser est difficile, et tout repose là-dessus

Multiplier deux nombres premiers de 300 chiffres prend une fraction de microseconde. Retrouver ces deux facteurs à partir du produit est, à ce jour, hors de portée de toute machine existante.

C'est l'asymétrie fondamentale sur laquelle RSA est bâti : une opération immédiate dans un sens, sans méthode praticable dans l'autre.

main.py
Sortie
>_ Prêt à exécuter…
Ce que « difficile » veut dire, et ne veut pas dire

Il n'est pas démontré que factoriser est intrinsèquement difficile : c'est une difficulté constatée, pas prouvée. Un algorithme efficace pourrait exister et n'avoir pas été trouvé, c'est le sens de la question « un nouveau théorème pourrait-il ruiner l'économie mondiale ? ».

On sait en revanche que l'algorithme de Shor factorise en temps polynomial sur un ordinateur quantique. La menace n'est pas théorique, elle est technologique, et elle motive la cryptographie post-quantique, qui repose sur d'autres problèmes difficiles, pas sur la factorisation.

Euler et Fermat

La section sur l'inverse modulaire a laissé une question ouverte. Un élément est inversible modulo nn quand son pgcd avec nn vaut 1 : combien y en a-t-il ? La réponse détermine le nombre d'exposants publics utilisables dans RSA, et elle porte un nom.

Indicatrice d'Euler

φ(n)\varphi (n) est le nombre d'entiers de 1 à nn premiers avec nn.

  • φ(p)=p1\varphi (p) = p - 1 si pp est premier ;
  • φ(pq)=(p1)(q1)\varphi (pq) = (p - 1)(q - 1) si pp et qq sont deux premiers distincts.

La lettre φ\varphi se lit « phi », et φ(n)\varphi(n) se dit « phi de nn ». Elle compte donc les entiers de l'intervalle [1;n][1 ; n] dont le pgcd avec nn vaut 1, c'est-à-dire exactement les éléments inversibles modulo nn. Sur n=12n = 12 : les candidats sont 1, 5, 7 et 11, et aucun autre, car tous les autres partagent un 2 ou un 3 avec 12. Donc φ(12)=4\varphi(12) = 4.

La première égalité est immédiate : si pp est premier, tous les entiers de 1 à p1p - 1 lui sont premiers, et seul pp ne l'est pas.

La seconde se compte, et ce décompte mérite d'être fait une fois, parce que c'est lui qui fixe la taille de l'espace des clés RSA.

Parmi les pqpq entiers de 1 à pqpq, un entier n'est pas premier avec pqpq exactement lorsqu'il est multiple de pp ou multiple de qq. Il y a qq multiples de pp (à savoir p,2p,,qpp, 2p, \dots, qp) et pp multiples de qq. Le seul entier compté deux fois est pqpq lui-même, qui est multiple des deux.

Le nombre d'entiers à retirer vaut donc p+q1p + q - 1, et il reste

φ(pq)=pqpq+1=(p1)(q1)\varphi (pq) = pq - p - q + 1 = (p - 1)(q - 1)

Ce décompte n'est possible que si l'on connaît pp et qq

C'est toute la sécurité de RSA en une phrase. Calculer φ(N)\varphi (N) demande la factorisation de NN ; sans elle, il n'existe aucun raccourci connu. Un attaquant qui obtiendrait φ(N)\varphi (N) par un autre moyen calculerait la clé privée en une ligne, par Euclide étendu.

Deux théorèmes

Petit théorème de Fermat : si pp est premier et ne divise pas aa, alors ap11[p]a^{p-1} \equiv 1 [p].

Théorème d'Euler, qui le généralise : si pgcd(a,n)=1\operatorname{pgcd}(a, n) = 1, alors aφ(n)1[n]a^{\varphi(n)} \equiv 1 [n].

En clair : élever un nombre à la puissance φ(n)\varphi(n) ramène toujours à 1, à la seule condition que ce nombre n'ait aucun facteur commun avec nn. C'est une remise à zéro garantie. Dépasser cet exposant ne fait que recommencer le même tour, ce qui revient à dire que seul le reste de l'exposant modulo φ(n)\varphi(n) compte.

C'est ce second théorème, et lui seul, qui fait fonctionner RSA : c'est lui qui fera disparaître le facteur parasite au moment du déchiffrement.

φ(N) = N − 1 est faux dès que N n'est pas premier

On rencontre cette formule dans des corrigés de RSA, et elle y est fausse par construction. Si NN était premier, φ(N)=N1\varphi(N) = N - 1 serait calculable par tout le monde ; la clé privée s'en déduirait immédiatement, et le chiffrement n'aurait aucun intérêt.

Toute la sécurité de RSA tient à ce que φ(N)=(P1)(Q1)\varphi(N) = (P - 1)(Q - 1) exige de connaître PP et QQ, donc de savoir factoriser NN.

L'exponentiation modulaire rapide

Calculer admodna^d \operatorname{mod} n avec dd de 600 chiffres semble impossible. Ça ne l'est pas, grâce à une idée simple : élever au carré plutôt que multiplier une fois de plus.

Pour a13a^{13}, l'écriture binaire de l'exposant, 13=11012=8+4+113 = 1101_2 = 8 + 4 + 1, donne a13=a8×a4×aa^{13} = a^8 \times a^4 \times a. Trois élévations au carré successives fournissent a2a^2, a4a^4 et a8a^8, puis deux multiplications les assemblent : cinq multiplications au lieu de douze. L'écart devient vertigineux sur un grand exposant, dont le coût ne croît plus qu'avec le nombre de chiffres.

Le même calcul en entier, avec les nombres du RSA de la fin du chapitre : 6517mod323365^{17} \bmod 3233. L'exposant s'écrit 17=100012=16+117 = 10001_2 = 16 + 1, donc 6517=6516×6565^{17} = 65^{16} \times 65. Quatre élévations au carré suffisent, chacune réduite modulo 3233 avant la suivante :

652=422599265^2 = 4\,225 \equiv 992, puis 9922=9840641232992^2 = 984\,064 \equiv 1\,232, puis 12322=151782415471\,232^2 = 1\,517\,824 \equiv 1\,547, puis 15472=23932097891\,547^2 = 2\,393\,209 \equiv 789. Donc 6516789 [3233]65^{16} \equiv 789 \ [3233].

Il ne reste qu'une multiplication : 789×65=51285=15×3233+2790789 \times 65 = 51\,285 = 15 \times 3233 + 2790, d'où 65172790 [3233]65^{17} \equiv \mathbf{2790} \ [3233]. Cinq opérations au total, et aucun nombre intermédiaire de plus de sept chiffres, alors que 651765^{17} écrit en entier en compterait trente et un. Réduire à chaque étape est ce qui rend le calcul possible.

main.py
Sortie
>_ Prêt à exécuter…

À calculer soi-même

L'arithmétique modulaire se vérifie par le calcul, et chaque étape tient sur une ligne. La faire une fois dispense de croire les formules sur parole.

Divisions, pgcd et congruences

  • 1.

    La division euclidienne de 247 par 13 donne quel quotient ?

  • 2.

    Quel reste donne-t-elle ?

  • 3.

    Combien vaut le pgcd de 252 et 198 ?

  • 4.

    Combien vaut φ(12)\varphi(12), c'est-à-dire le nombre d'entiers de 1 à 12 premiers avec 12 ?

  • 5.

    Combien vaut 71007^{100} modulo 11 ? Le petit théorème de Fermat donne la réponse sans calculer la puissance.

  • 6.

    Pour calculer a13a^{13} par élévations au carré, l'exposant s'écrit en binaire 1101. Combien d'opérations cela demande-t-il au total ?

  • 7.

    Un calcul naïf de a13a^{13} demanderait combien de multiplications ?

Les deux dernières réponses donnent la mesure de l'exponentiation rapide sur un petit exposant. Sur un exposant de six cents chiffres, comme ceux de la cryptographie, le calcul naïf demanderait plus d'opérations qu'il n'y a d'atomes dans l'univers, et la méthode par carrés en demande quelques milliers.

Où la démarche dérape

Une simplification parfaitement légitime sur les entiers, et fausse modulo un composé.

Une simplification qui ne passe pas modulo 12

Une seule étape est fausse. Désigner laquelle.

On sait que 4x4×4(mod12)4x \equiv 4 \times 4 \pmod{12}, et l'on cherche la valeur de xx modulo 12.

Exercices type

Pourquoi 1 n'est-il pas considéré comme un nombre premier ?

Parce que l'unicité de la décomposition en facteurs premiers en dépend. Si 1 était premier, 1212 s'écrirait 22×32^2 \times 3, mais aussi 1×22×31 \times 2^2 \times 3, et 117×22×31^{17} \times 2^2 \times 3 : la décomposition cesserait d'être unique.

Ce n'est donc pas une convention arbitraire, c'est le prix à payer pour garder un théorème qui sert partout ailleurs.

Jusqu'où faut-il aller pour vérifier qu'un nombre NN est premier ?

Jusqu'à N\sqrt{N}, et pas plus loin. Si NN admet un diviseur dd supérieur à N\sqrt{N}, alors N/dN/d est un diviseur inférieur à N\sqrt{N}, et il aurait déjà été trouvé.

Le gain est considérable : vérifier un nombre de six chiffres demande mille essais au lieu d'un million.

Un inverse modulaire existe-t-il toujours ?

Non. L'inverse de aa modulo nn existe si et seulement si pgcd(a,n)=1\operatorname{pgcd}(a, n) = 1.

La raison se lit sur Bézout : cette condition équivaut à l'existence de uu et vv tels que au+nv=1au + nv = 1, ce qui donne exactement au1(modn)au \equiv 1 \pmod n. L'algorithme d'Euclide étendu ne fait donc pas que répondre oui ou non : il construit l'inverse.

Pourquoi réduire à chaque étape plutôt qu'à la fin ?

Parce que les congruences sont compatibles avec l'addition et la multiplication : réduire en cours de route donne le même résultat que réduire à la fin.

La différence est de taille des nombres manipulés. Calculer 71007^{100} en entier produit un nombre de quatre-vingt-cinq chiffres ; le calculer modulo 11 en réduisant à chaque étape ne fait jamais dépasser deux chiffres.

La méthode

  1. Écrire la division euclidienne sous la forme a=bq+ra = bq + r avec 0r<b0 \leq r < b. Toutes les erreurs de signe viennent de son oubli.
  2. Poser Euclide en colonnes, une division par ligne. Le dernier reste non nul est le pgcd.
  3. Pour Bézout, remonter les égalités une à une, en substituant les restes sans développer les produits : c'est ce qui rend le calcul faisable à la main.
  4. Réduire à chaque étape dans un calcul modulaire. Ne jamais développer une grande puissance.
  5. Vérifier qu'un facteur est inversible avant de le simplifier dans une congruence. Il ne l'est que s'il est premier avec le module.
  6. Pour une puissance modulaire, procéder par carrés successifs en suivant l'écriture binaire de l'exposant.

Synthèse

  • Division euclidienne : a=bq+ra = bq + r avec 0r<b0 \leq r < |b|, et ce couple est unique. Attention au signe du reste selon le langage employé.
  • Euclide : pgcd(a,b)=pgcd(b,amodb)\operatorname{pgcd}(a, b) = \operatorname{pgcd}(b, a \bmod b), en O(logn)O(\log n). Sa version étendue donne uu et vv tels que au+bv=pgcdau + bv = \operatorname{pgcd}.
  • Bézout : aa et bb sont premiers entre eux si et seulement s'il existe uu et vv tels que au+bv=1au + bv = 1.
  • Congruences : compatibles avec l'addition et la multiplication, donc on réduit à chaque étape.
  • Un facteur ne se simplifie que s'il est premier avec le module. Sinon la congruence a plusieurs solutions.
  • Modulo un composé, un produit de non-nuls peut être nul. Modulo un premier, jamais.
  • 1 n'est pas premier : l'unicité de la décomposition en dépend.
  • Crible d'Ératosthène : barrer les multiples à partir de p2p^2, s'arrêter à N\sqrt{N}.
  • Factoriser est difficile : constaté, pas démontré.
  • φ(p)=p1\varphi(p) = p - 1 et φ(pq)=(p1)(q1)\varphi(pq) = (p-1)(q-1), jamais φ(N)=N1\varphi(N) = N - 1 pour un composé.
  • Euler : aφ(n)1(modn)a^{\varphi(n)} \equiv 1 \pmod n dès que pgcd(a,n)=1\operatorname{pgcd}(a, n) = 1.
  • Exponentiation rapide : carrés successifs, O(logd)O(\log d) multiplications au lieu de dd.

Et ensuite

Toute cette arithmétique a été construite pour servir, et elle sert à une chose précise : rendre facile dans un sens ce qui est impraticable dans l'autre. Cryptographie exploite cette asymétrie.

Mettre en pratique