San Vu Ngoc - IRMAR
Ici aussi on choisit d'abord une méthode récursive, la plus simple du point de vue mathématique, et aussi la plus facile à programmer.
Supposons par récurrence que $bu' + rv' = d = pgcd(b,r)$, alors en utilisant $a = bq + r$ on voit que $bu' + (a-bq)v' = d$ donc $$ av' + b(u' - qv') = d =pgcd(a,b).$$
Remarque: La suite des "restes" est la même que pour l'algorithme d'Euclide, donc on sait que ça termine. Et la complexité est la même.
def Bezout (a,b):
"cette fonction retourne (d,u,v) tel que au+bv=d"
if b == 0:
return (a, 1, 0)
else:
r = a % b
q = a // b
print("%d = %d*%d + %d" % (a,q,b,r))
d,uu,vv = Bezout(b,r)
print ("%d*(%d) + %d*(%d) = %d" % (a,vv, b, uu - vv*q, d))
return (d, vv, uu - vv*q)
Bezout(1234,2020)
Vérifions:
-257*1234 + 157*2020
Par Bachet-Bézout, on en déduit que (1234/2) et (2020/2) sont premiers entre eux:
-257*617 + 157*1010
Bezout(617,1010)
Bezout(600,124)
def BezoutI (a,b):
"cette fonction retourne (d,u,v) tel que au+bv=d"
uu, vv = 1, 0
u, v = 0, 1
rr, r = a, b # invariants de boucle: a*u + b*v = r et a*uu = b*vv = rr
while r != 0:
q = rr // r # on divise l'ancien reste "r(n-1)" (rr) par le reste "r(n)" (r)
print ("On a %d = %d*%d + %d," % (rr, q, r, rr % r ))
r, rr = rr % r, r
u, uu = uu - q*u, u # on calcule les nouveaux coefficients u,v
v, vv = vv - q*v, v
print (" donc %d = %d*(%d) + %d*(%d)." % (r, a, u, b, v))
return (rr,uu,vv)
BezoutI(600,124)
BezoutI(1234,2020)
$$x^n + y^n = z^n, \quad n\geq 3$$
from IPython.display import HTML
HTML('<iframe width="560" height="315" src="https://www.youtube.com/embed/xNk0QYP0w5Q?rel=0&&showinfo=0" frameborder="0" allowfullscreen></iframe>')