解説
拡張ユークリッドの互除法は を満たす整数の組 を求める古典アルゴリズムです。
今回 と は互いに素 () なので、 を満たす整数の組 を求めることができます。
について、両辺の を取ることで、が成り立ちます。
よって が成り立ちます。
拡張ユークリッドの互除法を使うことで効率的に を求めることができます。
今回は が素数とは限らないため、フェルマーの小定理を使うことはできません。
解答例
解答例は以下の通りです。
# Extended Euclidean Algorithm
def extended_euclidean(a: int, b: int) -> tuple[int, int, int]:
# when b == 0:
if b == 0:
return a, 1, 0
# recursive step
gcd, x1, y1 = extended_euclidean(b, a % b)
# update x and y
x = y1
y = x1 - (a // b) * y1
return gcd, x, y
def solve(a: int, L: int) -> int:
_, x, _ = extended_euclidean(a, L)
return x % L