$\newcommand{\O}{\mathrm{O}}$
$\mathbb{Z} / p \mathbb{Z}$ 上で $p$ と互いに素である $a$ の逆元を拡張ユークリッドの互除法を用いて計算するアルゴリズム.
"$a$ と $p$ が互いに素 $\Leftrightarrow$ $\mathbb{Z} / p \mathbb{Z}$ 上で $a$ の逆元が存在する" が成り立つことに注意する.
(関数)
$mod_inverse(a, p)$ : $\mathbb{Z} / p \mathbb{Z}$ 上で $a$ の逆元を求める(ただし $a$ と $p$ は互いに素とする).
時間計算量: $\O (\log a)$
void extgcd(int a,int b, int& x,int& y) { if(b != 0){ extgcd(b, a % b, y, x); y -= (a / b) * x; }else{ x = 1; y = 0; } } int mod_inverse(int a, int p) { int x, y; extgcd(a, p, x, y); return (p + x % p) % p; }
省略