逆元
逆元(乘法逆元)
概念
若 \(ax\equiv 1(mod \ p)\),且 \(a\) 与 \(p\) 互质,那么我们就能定义: \(x\) 为 \(a\) 在 \(mod\ p\) 下的逆元,记为 \(a^{-1}\),所以我们也可以称 \(x\) 为 \(a\) 在 \(mod\ p\) 意义下的倒数
所以对于 \(\cfrac{a}{b}(mod\ p)\),我们就可以求出 \(b\) 在 \(mod\ p\) 下的逆元,然后乘上 \(a\) ,再 \(mod\ p\),就可以得到这个分数值了:
\[\cfrac{a}{b}(mod\ p)=b^{-1}\times a \ (mod\ p) \]
算法实现
拓展欧几里得
我们将求逆元看作求解线性同余方程 \(a\times x \equiv c \ (mod \ b))\) \((c=1)\) 的情况。我们就可以转化为解 \(ax+by=1\) 这个方程的解
快速幂(费马小定理)
这个做法要利用 费马小定理:
若 \(p\) 为素数,\(a\) 为正整数,且 \(a\),\(p\) 互质。 则有 \(a^{p-1} \equiv 1\ (mod \ p)\)
我们发现这个式子右侧正好等于 \(1\),而根据逆元的定义 \(ax\equiv 1(mod \ p)\) ,合并二式得:
我们用快速幂求出 \(a^{p-2} \ (mod \ p)\),就能得到 \(a\) 的逆元
线性递推
适用范围:一串数字对于同一个模数 \(p\) 的逆元
我们先得出一个递推初始值:\(1^{-1} \equiv 1 \ (mod \ p)\)
然后设 \(p = k \times i+r\) ( \(k\) 为 \(\cfrac{p}{i}\) 的商 \(\lfloor\cfrac{p}{i}\rfloor\),\(r\) 为余数 \((p \ mod \ i)\))
将这个式子放在 \((mod\ p)\) 意义下,则有:
然后乘上 \(i^{-1}r^{-1}\)得:
因为 \(k=\lfloor\cfrac{p}{i}\rfloor\),\(r=(p \ mod \ i)\),所以可以得到:
递推式:
inv[1] = 1; int n; // n 严格小于 p
for (int i = 2;i <= n;i ++) inv[i] = (p - p / i) * inv[p % i] % p;

浙公网安备 33010602011771号