フェルマーの小定理

  • を変形して
  • なので

Python: pow(a, p - 2, p) Python3.8から素直に pow(a, -1, p)できる

フェルマーの小定理はPが素数であることを要求する

def mod_inverse_ee(a, m):
    """
     Solve ax mod m = 1 with extended euclidean.
     x = a^-1.
     """
    x, y, g = extended_euclidean(a, m)
    assert g == 1
    return x % m

nのmodulo pでの逆元はフェルマーの小定理より pow(n, p-2, p) で求められます。計算量はO(logp)です。二項係数とかでよく使います。 https://qiita.com/Kentaro_okumura/items/5b95b767a2e691cd5482