efrei/algebre-non-lineaire/inverse.py

42 lines
923 B
Python
Executable file

#!/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
from typing import Optional
import euclide_etendu
def main():
if len(sys.argv) == 3:
a = int(sys.argv[1])
n = int(sys.argv[2])
else:
a = int(input("a : "))
n = int(input("n : "))
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")
def inverser(a: int, n: int, quiet: bool = False) -> Optional[int]:
# On veut associer le coefficient de Bezout u à a, donc l'ordre des paramètres
# est important :
pgcd, u = euclide_etendu.calculate(a, n, quiet=quiet)
if pgcd != 1:
return None
inverse = (u + n) % n
return inverse
if __name__ == "__main__":
main()