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()
|