Tout d'abord si p est un diviseur de a et b, il doit diviser c sinon l'équation est insoluble.
On peut alors tout diviser par p.
On ne s'intéressera dorénavant qu'aux équations où a et b sont premiers entre eux,
c'est à dire sans diviseurs communs (autre que 1).
Soit ax0 + by0 = c une solution particulière.
Alors si ax + by = c est une solution quelconque, par soustraction membre à membre, il vient :
a(x - x0) + b(y - y0) = 0. Comme a et b sont premiers entre eux, a divise y - y0,
soit y - y0 = ka ou encore :
y = y0 + ka et x = x0 - kb
Soit maintenant l'équation ax + by = 1, toujours avec a et b premiers entre eux. Le théorème de Bézout affirme qu'une condition nécessaire et suffisante pour que deux nombres a et b soient premiers entre eux est qu'il existe deux nombres u et v (dans Z) tels que au + bv = 1. Ceci prouve que l'équation ax + by = c, PGCD(a, b) = 1 a toujours des solutions. Si (u, v) est solution de ax + by = 1, alors (cu, cv) est solution de ax + by = c. En résumé :
L'équation ax + by = c est soluble si et seulement si p = PGCD(a,b) divise c
En posant alors a = pa', b = pb' c = pc', si x0,y0 est une solution particulière de a'x + b'y = 1, alors toutes les solutions de ax + by = c sont données par : x = c'x0 - kb' y = c'y0 + ka' où k parcourt Z |
Le problème est de trouver une solution particulière.
Si on peut dans les cas simples opérer par tâtonnements, une équation comme
97x + 29y = 4000 nécessite une méthode plus efficace.
Comme 97 = 29×3 + 10 et 4000 = 29×137+27, l'équation 97x + 29y = 4000
peut s'écrire :
10x + 29(y + 3x - 137) = 27 soit en posant z = y + 3x - 137 : 10x + 29z = 27,
qui est une équation plus simple.
On peut recommencer en écrivant : 10(x + 2z - 2) + 9z = 7 où encore 10t + 9z = 7 puis :
t + 9(z + t) = 7 soit t + 9u = 7 qui possède la solution évidente t = 7, u = 0
En remontant les changements de variables, il vient : z = u - t = -7,
puis x = t + 2 - 2z = 23 et enfin
y = z + 137 - 3x = 61, d'où une solution particulière x0 = 23, y0=61,
et la solution générale x = 23 - 29k, y = 61 + 97k.
x ≡caφ(b)-1 mod (b), y = (c - ax)/b |
Reste qu'il faut calculer φ(b) (et pour les incrédules à démontrer
le théorème d'Euler-Fermat)
Une méthode simple pour calculer φ(b) à partir de la décomposition en
facteurs premiers de b :
Si b = ∏piai, alors
φ(b) = b∏(1 - 1/pi) = ∏(piai - piai-1).
En particulier si p est premier, φ(p) = p - 1.
Pour notre équation : x ≡ 4000.97φ(29)-1 mod (29),
soit 4000×9727
Heureusement, point n'est besoin de calculer des nombres astronomiques car tous les calculs se font
modulo 29, les nombres mis en oeuvre ne dépasseront pas 29² = 841.
4000 ≡ 27 mod (29) et 97 ≡ 10 mod (29)
permettent déjà de simplifier les calculs en :
4000×9727 ≡ 27×1027 mod (29), ouf !
Reste à calculer efficacement 1027 mod (29).
On utilise une méthode connue sous le nom "d'exponentiation indienne"
Algorithme de calcul de V = AB
Initialiser V = 1
Tant que B ≥ 1 - si B est impair, multiplier V par A et retrancher 1 à B - sinon, élever A au carré et diviser B par 2 |
Ou une variante en binaire :
Initialiser V = 1
Pour chaque bit de l'exposant B, en commençant par les poids forts : - élever V au carré - si ce bit vaut 1, multiplier V par A |
Ce qui donne ici 27 = 11011(2) et 1027 = (((1²×10)²×10)²)²×10)²×10
Comme on calcule à chaque multiplication ou élévation au carré modulo 29 :
102 = 100 ≡ 13 mod (29)
103 ≡ 13×10 = 130 ≡ 14 mod (29)
106 ≡ 142 =196 ≡ 22 mod (29)
1012 ≡ 222 =484 ≡ 20 mod (29)
1013 ≡ 20×10 = 200 ≡ 26 mod (29)
1026 ≡ 262 = 676 ≡ 9 mod (29)
1027 ≡ 9×10 = 90 ≡ 3 mod (29)
et enfin x ≡ 27×3 = 81 ≡ 23 mod (29)
Posons : r0 = a, r1 = b (a > b > 0)
P0 = 0, P1 = 1 et Q0 = 1, Q1 = 0 Puis répéter depuis i = 2
p = rn-1 est le PGCD de a et b (algorithme d'Euclide)
|
Avec 97x + 29y = 4000 cela donne :
97 = 29×3 + 10, r2 = 10, q2 = 3, P2 = -3, Q2 = 1
29 = 10×2 + 9, r3 = 9, q3 = 2, P3 = 7, Q3 = -2
10 = 9×1 + 1, r4 = 1, q4 = 1, P4 = -10, Q4 = 3
9 = 1×9 + 0, r5 = 0, c'est fini et x = 3 y = -10 est solution de 97x + 29y = 1
En multipliant par c = 4000, qui est bien un multiple de p = r4 = 1, on obtient
x = 12000 + 29k, y = -40000 - 97k
Si on pose m = k + [12000/29] = k + 413, on retrouve
x = 23 + 29m, y = 61 - 97m comme ci-dessus.
Script de résolution de ax + by = c avec cet algorithme.
x = 165 - 105m - 7k
y = -110 + 70m + 5k z = 3m + 1 k et m parcourant indépendamment Z |
Donnons les formules générales pour l'équation ax + by + cz = D
Soit p = PGCD(a,b), a' = a/p, b' = b/p
Soient u0 et v0 une solution particulière de a'u + b'v = c z0, t0 une solution particulière de cz + pt = D x0, y0 une solution particulière de a'x + b'y = t0 La solution générale de ax + by + cz = D est :
|
L'application directe de ces formules à 15x + 21y + 35z = 200 donne en fait :
p = 3, a' = 5, b' = 7 puis 5u + 7v = 35 et u0 = 0 v0 = 5 (par exemple)
35z + 3t = 200 z0 = 1, t0 = 55
5x + 7y = 55 : x0 = 11, y0 = 0 et finalement :
x = 11 + 7k
y = 0 - 5k - 5m z = 1 + 3m |
Cette méthode est un peu pénible car elle nécessite de résoudre successivement
plusieurs équations à deux inconnues, donc d'exécuter plusieurs fois l'algorithme d'Euclide.
Du coup, au dela de 3 inconnues elle devient impraticable.
On peut alors efficacement résoudre cette équation en considérant un système (hum) de une équation (!)
à n inconnues...
(a | 1 0) (b | 0 1)Généralisant cette réduction à notre équation 15x + 21y + 35z = 200, on effectue la "réduction Euclidienne" de la matrice :
(15 | 1 0 0) (21 | 0 1 0) (35 | 0 0 1) ce qui donne : (15 | 1 0 0) (6 |-1 1 0) = moins [21/15]=1 fois la 1ère ligne (5 |-2 0 1) = moins [35/15]=2 fois la 1ère ligne (0 | 7 0 -3) = moins [15/5]=3 fois la 3ème ligne (1 | 1 1 -1) = moins [6/5]=1 fois la 3ème ligne (5 |-2 0 1) et finalement : (0 | 7 0 -3) (1 | 1 1 -1) (0 |-7 -5 6) = moins [5/5]=5 fois la 2ème ligneLa seule ligne avec une valeur non nulle en 1ère colonne (= PGCD = 1) nous donne directement la relation de Bézout : 15×1 + 21×1 + 35×(-1) = PGCD = 1
Les lignes commençant par 0 de la matrice nous donnent des solutions
particulières de l'équation 15x + 21y + 35z = 0
soit (x = 7, y = 0, z = -3) et (x = -7, y = -5, z = 6), qui sont indépendantes, et qu'on peut d'ailleurs
remplacer par deux combinaisons linéaires indépendantes, par exemple
u = (7, -5, 0) et v = (0, -5, 3)
On peut donc ajouter une combinaison linéaire quelconque de u et v : ku + mv.
Ceci donne les solutions générales de notre équation :
x = 200 + 7k + 0m
y = 200 - 5k - 5m z = -200 + 0k + 3m |
Cette méthode est applicable à une équation avec un nombre quelconque d'inconnues.
Considérons donc notre système d'équations sous la forme matricielle (A)(X) = (B).
Effectuons les opérations précédentes de réduction Euclidienne sur la matrice
(At|I), concaténation de la transposée de (A) et d'une matrice unité I.
On peut alors obtenir une matrice (R|T) où T est la matrice de passage : (R|T) = (T)(At|I)
(T) est inversible, puisqu'on n'a effectué que des combinaisons linéaires de lignes.
Ceci donne aussi (T)(At) = (R), et par conséquent :
(A)(Tt) = (Rt), et finalement puisque T est inversible :
(A) = (Rt)(Tt)-1
Le déterminant de T étant ±1 (comme produit de matrices de déterminant ±1, matrices unimodulaires),
l'inverse (Tt)-1 est une matrice de nombres entiers.
L'équation (A)(X) = (B) s'écrit (Rt)(Tt)-1(X) = (B),
et en posant la variable auxilliaire (Y) = (Tt)-1(X), elle devient
(Rt)(Y) = (B), qui est plus "simple",à cause de la réduction Euclidienne de (R) en
une matrice finalement au pire triangulaire.
Résoudre (A)(X) = (B) est équivallent à résoudre (Rt)(Y) = (B)
puis (Y) = (Tt)-1(X) nous donne la solution générale de (A)(X) = (B) :
(X) = (Tt)(Y)
Après cette justification un peu abstraite de la méthode, un petit exemple :
Soit le système
5x + 6y + 8z - 2t = 3
6x - 10y + 7z - 8t = 11
ou encore sous forme matricielle :
(5, 6, 8, -2)×(x) = (3 ) (6, -10, 7, -8) (y) (11) (z) (t)Effectuons la réduction Euclidienne de (At|I) :
(5 6 | 1 0 0 0) (6 -10 | 0 1 0 0) (8 7 | 0 0 1 0) (-2 -8 | 0 0 0 1) Le mini en valeur absolue est 2 (1 -10 | 1 0 0 2) (0 -34 | 0 1 0 3) (0 -25 | 0 0 1 4) (2 8 | 0 0 0 -1) On peut aussi changer de signe une ligne (1 -10 | 1 0 0 2) (0 -34 | 0 1 0 3) (0 -25 | 0 0 1 4) (0 28 |-2 0 0 -5)On obtient déja le PGCD(5,6,8,-2) = 1. Poursuivons sur les colonnes suivantes de At,
(1 -10 | 1 0 0 2) (0 -9 | 0 1 -1 -1) (0 25 | 0 0 -1 -4) (0 3 |-2 0 1 -1) Nouveau mini = 3 (1 -1 | -5 0 3 -1) On réduit aussi cette ligne pour obtenir une matrice R plus simple (diagonale) (0 0 | -6 1 2 -4) (0 1 | 16 0 -9 4) Nouveau mini = 1 (0 3 | -2 0 1 -1) (1 0 | 11 0 -6 3 ) (0 0 | -6 1 2 -4 ) (0 1 | 16 0 -9 4 ) Ou en échangeant les lignes : (0 0 | -50 0 28 -13) (1 0 | 11 0 -6 3 ) (0 1 | 16 0 -9 4 ) (0 0 | -6 1 2 -4 ) (0 0 | -50 0 28 -13) (R) = (1 0) et (T) = (11 0 -6 3 ) (0 1) (16 0 -9 4 ) (0 0) (-6 1 2 -4 ) (0 0) (-50 0 28 -13)Il faut alors résoudre (Rt)(Y) = (B) :
(1 0 0 0)×(y1) = (3 ) (0 1 0 0) (y2) (11) (y3) (y4)Qui donne de façon triviale y1 = 3 et y2 = 11, car R est "diagonale", si l'on peut dire en parlant d'une matrice non carrée.
(Y) = (3 ) (11) (k ) (m )et (X) = (Tt)(Y) :
(x) = (11 16 -6 -50)×(3 ) = (209 - 6k - 50m ) (y) (0 0 1 0 ) (11) (0 + k ) (z) (-6 -9 2 28) (k ) (-117 + 2k + 28m) (t) (3 4 -4 -13) (m ) (53 - 4k - 13m )
Bien entendu, tous ces calculs "sordides" sur des matrices sont à faire
par un programme,
dès que le nombre de variables ou d'équations devient un tant soit peu conséquent.
Comme pour les exemples précédents, l'écriture la plus "simple" des solutions ne s'obtient pas de façon triviale.
Ici on peut poser m = 4 + m' :
x = 9 - 6k - 50m'
y = k z = -5 + 2k + 28m' t = 1 - 4k - 13m' |