逆元

逆元(乘法逆元)

概念

\(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)\) ,合并二式得:

\[\begin{aligned} a \times x &\equiv 1 \ (mod \ p) \\ a \times x &\equiv a^{p-1} \ (mod \ p) \\ x &\equiv a^{p-2} \ (mod \ p) \end{aligned} \]

我们用快速幂求出 \(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)\) 意义下,则有:

\[k\times i + r \equiv 0 \ (mod \ p) \]

然后乘上 \(i^{-1}r^{-1}\)得:

\[\begin{aligned} k\times i \times i^{-1}r^{-1}+r\times i^{-1}r^{-1} &\equiv 0 \ (mod \ p) \\ k\times r^{-1} + i^{-1} &\equiv 0 \ (mod \ p) \\ i^{-1} &\equiv -k\times r^{-1} \ (mod \ p) \end{aligned} \]

因为 \(k=\lfloor\cfrac{p}{i}\rfloor\)\(r=(p \ mod \ i)\),所以可以得到:

\[i^{-1}=-\lfloor\cfrac{p}{i}\rfloor \times (p \ mod \ i)^{-1} \ (mod \ p) \]

递推式:

\[inv(i)=-\lfloor\cfrac{p}{i}\rfloor \times inv(p \ mod \ i) \ (mod \ p) \]

inv[1] = 1; int n; // n 严格小于 p
for (int i = 2;i <= n;i ++) inv[i] = (p - p / i) * inv[p % i] % p;
posted @ 2025-03-23 11:35  nightmare_lhh  阅读(58)  评论(0)    收藏  举报