efrei/algebre-non-lineaire/euclide_etendu.py

57 lines
1 KiB
Python
Raw Normal View History

2022-01-17 11:25:27 +01:00
#!/usr/bin/env python3
"""Algorithme d'Euclide étendu
Calcule le PGCD de deux nombres et trouve les coefficients de Bezout.
"""
import sys
2022-01-17 13:00:58 +01:00
2022-01-17 12:45:09 +01:00
def main():
2022-01-17 13:20:37 +01:00
if len(sys.argv) == 3:
a = int(sys.argv[1])
b = int(sys.argv[2])
else:
a = int(input("a : "))
b = int(input("b : "))
2022-01-17 11:25:27 +01:00
2022-01-24 09:41:38 +01:00
calculate(a, b)
def calculate(a, b):
2022-01-18 11:24:40 +01:00
if b > a:
a, b = b, a
2022-01-17 11:25:27 +01:00
# Initialisation
2022-01-17 12:45:09 +01:00
r = ["r", a, b]
u = ["u", 1, 0]
v = ["v", 0, 1]
q = ["q", "", a // b]
2022-01-17 11:25:27 +01:00
# Séquence
2022-01-17 12:45:09 +01:00
while True:
r.append(r[-2] % r[-1])
u.append(u[-2] - (q[-1] * u[-1]))
v.append(v[-2] - (q[-1] * v[-1]))
if r[-1] == 0:
q.append("")
break
q.append(r[-2] // r[-1])
print_table(r, u, v, q)
2022-01-17 15:48:12 +01:00
print("Le PGCD est", r[-2])
2022-01-17 12:45:09 +01:00
2022-01-17 13:00:58 +01:00
2022-01-17 12:45:09 +01:00
def print_table(r, u, v, q):
"""Représentation de l'algorithme"""
2022-01-17 13:00:58 +01:00
width = max((len(str(i)) for i in r))
2022-01-17 12:45:09 +01:00
for i in range(len(r)):
2022-01-17 13:00:58 +01:00
print(f"{r[i]:^{width}} {u[i]:^{width}} {v[i]:^{width}} {q[i]:^{width}}")
2022-01-17 12:45:09 +01:00
if __name__ == "__main__":
main()