概述
乘法逆元定义:如果一个线性同余方程$ax\equiv 1 \mod b$,则$x$成为$a \mod b$的逆元,记作$a^{-1}$。
乘法逆元一般用于求$a/b\mod p$的值($p$通常为质数),是解决模意义下分数数值的必要手段。
对于$a/b\mod p$,我们可以求出$b$在$\mod p$下的逆元,然后乘上$a$再$\mod p$,就是这个分数的值了。
求解逆元的方法
扩展欧几里得法
求解$ax\equiv 1 \mod b$ 等价于解不定方程 $ax+by=1$,求解出的$x$即为$a \mod b$的逆元。
1 | void exgcd(int a, int b, int& x, int& y) { |
快速幂法
费马小定理
若$p$为质数,$a$为正整数,且$a$、$p$互质,则$a^{p-1}\equiv 1 (\mod p)$。
因为$ax\equiv 1\mod b$
所以$ax\equiv a^{b-1}\mod b$
所以$x\equiv a^{b-2}\mod b$
然后可以使用快速幂求解逆元。
代码略。
线性求逆元
假设现在要求$inv[i]$。
考虑带余除法,设$p=iq+r$,则有$iq+r\equiv 0\mod p$
注意到$p$是质数,因此$r$不为$0$,$r$的逆元存在
等式两边乘$i^{-1}r^{-1}$,得到$qr^{-1}+i^{-1}\equiv 0\mod p$
因此$i^{-1}\equiv -qr^{-1}\equiv -(p/i)(p \mod i)^{-1}\mod p$
1 | for (inv[1] = 1, i = 2; i <= n; ++i) |