数学/数论专题-学习笔记:乘法逆元
1. 前言
本篇文章是作者学习乘法逆元的时候的一些学习笔记。
前置知识:同余式,一些简单的数论符号。
2. 详解
2.1 定义+作用
乘法逆元的定义如下:对于任意 ,若存在 使得 ,则称 是 在模 意义下的数论倒数或者是乘法逆元,将 记作 。
实际上你会发现这玩意跟实数域上的倒数定义差不多,都是相乘为 1qwq
但是需要注意的是,并不是所有 在模 意义下都有逆元,如果 ,那么 在模 意义下是没有逆元的,因为一定有 。
下面若无特殊说明,均认为任意数 在模 意义下有乘法逆元。
乘法逆元的一个很重要的作用就是做有理数域内的取模问题。
如果我们要求 ,那么根据 ,我们可以将式子变为 ,这样就可以通过求出 来解决有理数取模问题。
乘法逆元的求法有三种:exgcd 求法,快速幂求法,线性递推式。
2.2 exgcd 求法
这个求法的前置知识:扩展欧几里得算法。
对于同余式 ,我们可以将该式转变为 。
这样就可以通过 exgcd 求出该不定方程的特解,然后就可以求出乘法逆元了。
该方法的使用范围:。
Code:
void exgcd(int a, int b, LL &x, LL &y)
{
if (b == 0) {x = 1; y = 0; return ;}
exgcd(b, a % b, x, y);
LL p = x; x = y; y = p - ((LL)a / b) * y;
}
2.3 快速幂求法
这个求法的前置知识:费马小定理。
描述如下:如果 ,那么 。
那么因此我们就可以考虑求逆元的时候对式子做个变形:
因此 的逆元是 。
事实上这玩意你还可以用欧拉定理/扩展欧拉定理来推广,但是复杂度会升至根号级别,不如用第一种方法。
快速幂求法的使用范围:。
该方法对于确定模数为质数(如 )的题目比较方便。
Code:
LL ksm(LL fir, LL sec, LL p)
{
LL ans = 1 % p;
for (; sec; sec >>= 1, fir = fir * fir % p)
if (sec & 1) ans = ans * fir % p;
return ans;
}
2.4 线性递推式
前置知识:无。
这个算法可以 求出 内的所有数的乘法逆元。
首先显然的,。
接下来假设我们已经处理好了所有 范围内的数的乘法逆元,要求 。
令 ,那么 。
那么有 。
两边同时乘上 ,有 。
移项,。
由于 ,那么我们可以知道要求 只需要知道所有 内数的逆元。
因此原假设成立。
于是我们可以 求出 内的数的逆元。
该算法的使用范围:任意。
注意如果 时 无意义,因此特别注意这种情况。
Code:
inv[1] = 1;
for (int i = 2; i <= n; ++i) inv[i] = (p - p / i) * inv[p % i] % p;
2.5 阶乘及其逆元
在一般的计数题中我们通常需要预处理 的阶乘及其逆元,然后如果处理出阶乘之后每个数单独求逆元复杂度就是 ,在某些时间卡的比较紧的题目里面会过不去。
然而设 表示 的逆元,就有如下递推式:。
这样只需要做一遍快速幂/exgcd,就是 。
3. 总结
- 乘法逆元:对于任意 ,若存在 使得 ,则称 是 在模 意义下的数论倒数或者是乘法逆元,将 记作 。
- 三种求法:exgcd 求法,快速幂求法,线性递推式。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具