efrei/algebre-non-lineaire/inverse.py

43 lines
923 B
Python
Raw Normal View History

2022-01-24 09:46:18 +01:00
#!/usr/bin/env python3
"""Algorithme de calcul de l'inverse d'un ensemble
Utilise les coefficients de Bezout donnés par l'algorithme d'Euclide étendu.
"""
import sys
2022-01-25 10:25:20 +01:00
from typing import Optional
2022-01-24 09:46:18 +01:00
import euclide_etendu
2022-01-24 17:56:46 +01:00
def main():
2022-01-24 09:46:18 +01:00
if len(sys.argv) == 3:
a = int(sys.argv[1])
n = int(sys.argv[2])
else:
a = int(input("a : "))
n = int(input("n : "))
2022-01-24 17:56:46 +01:00
2022-01-25 10:25:20 +01:00
inverse = inverser(a, n)
if inverse:
print(f"L'inverse de {a} dans Z/{n}Z est {inverse}")
else:
print(f"{a} est non inversible dans Z/{n}Z")
2022-03-14 15:34:43 +01:00
def inverser(a: int, n: int, quiet: bool = False) -> Optional[int]:
2022-01-24 17:56:46 +01:00
# On veut associer le coefficient de Bezout u à a, donc l'ordre des paramètres
# est important :
2022-03-14 15:34:43 +01:00
pgcd, u = euclide_etendu.calculate(a, n, quiet=quiet)
2022-01-24 17:56:46 +01:00
if pgcd != 1:
2022-01-25 10:25:20 +01:00
return None
inverse = (u + n) % n
return inverse
2022-01-24 17:56:46 +01:00
if __name__ == "__main__":
main()