【学习笔记】逆元
【0】逆元的定义:
逆元又称模意义下的倒数。
一个正整数 \(a\) 在模 \(p\) 的逆元 \(x\) 满足 \(ax \equiv 1(\bmod p)\),我们一般取最小的满足条件的正整数 \(x\) 作为 \(a\) 的逆元,记作 \(a^{-1}\) 或 \(\operatorname{inv}(a)\)。
我们把这个同余方程转换一下,变成 \(ax + py = 1\)。由裴蜀定理,该方程当且仅当 \(\gcd(a,p) = 1\),即 \(a,p\) 互质时有解。
也就是说,当 \((a,p) > 1\) 时,不存在 \(a\) 模 \(p\) 意义下的逆元。
接下来,我们探讨逆元的求法。
【1】扩欧(exgcd)的求法。
上文说了,求逆元的线性同余方程 \(ax \equiv 1(\bmod p)\) 可以转化为这个线性不定方程 \(ax + py = 1\),当且仅当 \(\gcd(a,p) = 1\) 时有解,那么这个不定方程就是 \(ax + py = \gcd(a,p)\),显然可以用扩欧解。复杂度 \(O(\log \max(a,p))\)。
【2】费马小定理求法:
提前声明:该算法只适用于 \(p\) 为质数的情况。
费马小定理:当 \(p\) 为质数,\((a,p) = 1\) 时,\(a^{p - 1} \equiv 1(\bmod p)\)。
又因为当 \((a,p) > 1\) 时,不存在逆元,这一点很好特判。因为 \(p\) 为质数,所以当 \((a,p) > 1\) 时,显然 \(p | a\)。所以,当 \(p\) 为质数时一定可以用这种方法。
我们发现 \(a^{p - 1} = a \ times a^{p - 2} \equiv 1(\bmod p)\),由同余的性质,我们只需通过快速幂求出 \(a^{p - 2} \bmod p\) 即为 \(a\) 模 \(p\) 意义下的逆元,复杂度 \(O(\log p)\)。
【3】线性递推
由逆元的定义,易知 \(\operatorname{inv}(i) = \operatorname{inv}(i \bmod p)\),所以我们不妨设 \(i < p\)。
设 \(k = \lfloor \frac{p}{i} \rfloor,r = p \bmod i\),则 \(p = k \times i + r\)(\(k\) 就是 \(p \div i\) 的商, \(r\) 为余数)。
所以 \(k \times i + r \equiv 0(\bmod p)\),由同余的性质,两边可以同除以 \(ir\),得到 \(k \times r^{-1} + i^-1 \equiv 0(\bmod p)\),即 \(k \times \operatorname{inv}(r) + \operatorname{inv}(i) \equiv 0(\bmod p)\)。
把 \(k \times \operatorname{inv}(r)\) 移到右边,得到 \(\operatorname{inv}(i) \equiv -k \times \operatorname{inv}(r) (\bmod p)\),把 \(k,r\) 代入得 \(\operatorname{inv}(i) = (-\lfloor \frac{p}{i} \rfloor \times \operatorname{inv}(p \bmod i)) \bmod p\)。
因为 \(p \bmod i < i\),所以这个是可以递推的。