四种求逆元方法小结

逆元(自学内容)

定义:若 \(ax≡1 \bmod f\), 则称 \(a\) 关于 \(1\)\(f\) 的乘法逆元为 \(x\) 。也可表示为 \(ax≡1(\bmod f)\)
当a与f互素时,a关于模f的乘法逆元有解。
如果不互素,通过公式‘a/b mod p = (a mod (b·p))/b’来转化
计算逆元方式:(条件a,p互质)

  1. 费马小定理( a\(^{p-1}\)≡1(mod p))(a,p互质时,\(a^{fine(p)} = 1 (mod p))\)
    变形为a * a\(^{p-2}\)≡1(mod p)
    因为逆元x定义为a*x≡1(mod p),
    所以x=a\(^{p-2}\) (mod p)(可用快速幂求)

证明费马小定理:数学归纳法
\((x + 1)^p = x^p + 1\) (mod p)
证明2:\(a^{\varphi(p)}\)
{x1,x2,x3……\(x_{fine(p)}\)} <=> {ax1,ax2,……\(a*x_{fine(P)}\)}
两边集合乘起来:
\(Πx ≡ Πx* a^{fine(p)}\) (mod p)
\(0 ≡ Πx*(a^{fine(p)} - 1)\)
∵Πx 与 p互质,∴\((a^{fine(p)} - 1)\)是p的倍数
∴$ a^{fine(p)} ≡ 1$ (mod p)

  1. 拓展欧几里得算法(exgcd)
    用于求解模数p不是质数时的逆元。
    \(ax≡1 (mod\ p)\) 可变形为 \(ax - kp = 1\)
    然后就可以用exgcd来求了。复杂度 \(O(logn)\)

  2. 阶乘逆元
    线性递推求阶乘:\(jc_i = jc_{i-1} \times i\ \%\ mod\)
    用费马小定理求 \(n!\) 的逆元 \(inv_n = qpow(n, mod-2)\)
    那么

\[jc_n \times inv_n \% mod = 1\\ jc_{n-1} \times n \times inv_{n} \% mod = 1 \\ ∴ inv_{n - 1} = inv_{n} \times n \\ \]

于是就可以递推求阶乘逆元,\(O(n)\) 预处理,\(O(1)\) 询问。

  1. 线性求逆元

以下内容转载均转载自 chy_2003
对于当前的 i,我们设 p=k×i+r。于是

\[\begin{align*} k\times i + r &\equiv 0\pmod{p}\\ k\times i\times (i^{-1}\times r^{-1})+r\times (i^{-1}\times r^{-1}) &\equiv 0\pmod{p}\\ k\times r^{-1}+i^{-1} &\equiv 0\pmod{p}\\ i^{-1} &\equiv -k\times r^{-1}\pmod{p}\\ i^{-1} &\equiv -\left\lfloor\frac{p}{i}\right\rfloor\times r^{-1}\pmod{p} \end{align*} \]

这个是应该也是 \(O(n)\)

Inv[ 1 ] = 1;
for( int i = 2; i <= n; i++ )
	Inv[ i ] = ( p - p / i ) * Inv[ p % i ] % p;
//或
int inv(int x) {x == 1 ? 1 : ( p - p / i ) * inv( p % i ) % p;}
posted @ 2024-11-25 19:55  花子の水晶植轮daisuki  阅读(159)  评论(0)    收藏  举报
https://blog-static.cnblogs.com/files/zouwangblog/mouse-click.js