"""
逆元
"""
def exgcd(a, b):
# 递归出口
if b == 0:
return a, 1, 0
g, x2, y2 = exgcd(b, a % b)
x1, y1 = y2, x2 - (a // b) * y2
return g, x1, y1
def Func(a, b, m):
g, x1, y1 = exgcd(a, b)
# m必须是gcd(a, b)的倍数才有解
if m % g != 0:
return None, None, None
x0, y0 = x1 * m // g, y1 * m // g
return g, x0, y0
# 求a在模n意义下的逆元x, 即ax ≡ 1 mod n
# 即ax + ny = 1
def Inv(a, n):
g, x, y = Func(a, n, 1)
if x is None:
return None
else:
return x % n
"""
费马小定理: 任意素数n, gcd(a, n)=1, 有a**(n-1) ≡ 1(mod n)
上述定理给出一个素数模意义下求逆元的好方法:
只要n是素数, 求a在模n意义下的逆元:
a * a**(n-2) ≡ 1(mod n)
a**(n-2)就是a的逆元, 只需要再对a**(n-2) mod n即可
"""