乘法逆元和求法
基本的数论知识,有必要补一发。
开始之前
-
模运算:取余运算,比如 amodb 就是 a 除以 b 得到的余数。
-
性质:在加、减、乘、乘方的运算过程中,进行取余运算,不会对结果产生影响。
-
优先级:取余运算的优先级和乘法、除法的优先级相同,高于加减法的优先级。
-
互质:表示两个数的最大公约数为 1,表示为 (x,y)=1
-
同余(这个比较重要): 对于整数 m,如果整数 a,b 满足 (a−b)modm=0,即 (a−b)÷m 得到的是一个整数值,则称整数 a 与 b 对模 m 同余,记作 a≡b(modm)。
-
同余的性质:自反性、对称性、传递性、同加性、同乘性、同幂性等。
- 自反性:a≡a(modp)
- 对称性:如果 a≡b(modp),则有 b≡a(modp)
- 传递性:如果 a≡b(modp) 且 b≡c(modp),则有 a≡c(modp)
- 同加性:如果 a≡b(modp) 则有 a+c≡b+c(modp)
- 同乘性:如果 a≡b(modp) ,则 a×c≡b×c(modp)
如果 a≡b(modp) 且 c≡d(modp) 则有 a×c≡b×d(modp)
- 同幂性:如果 a≡b(modp) 则有 an≡bn(modp)
问题背景
求解 abmodp 的值,因为不能先对 a,b 取模再相除,所以引入了逆元。
逆元可以理解为 modp 意义下 b 的倒数。
假设 invb 为 b 的逆元,则有 invb×b≡1(modp)
即 (invb−1)modp=0
性质
第一个性质
ab≡a×invb(modp)
证明:
∵b×invb≡1(modp)
∴(b×invb−1)modp=0
∵xmodp=x×ymodp
∴ab×(b×invb−1)modp=0
∴(a×invb−ab)modp=0
∴ab≡a×invb(modp)
得证。
唯一性
性质
每个数的逆元唯一。
证明
假设 b 有两个逆元 x,y。
则可知 a×x≡a×y(modp)
∴(a×(x−y))modp=0
∵amodp≠0
∴x=y
所以每个数的逆元唯一。
逆元求法:
快速幂
这个做法的基础是费马小定理:
若 p 为质数,a 为正数,且 (a,p)=1,则有 ap−1≡1(modp)。
根据逆元的定义 inva×a≡1(modp) 可知:∵inva×a≡ap−1(modp)
∴inva≡ap−2(modp)
也就是说,一个数 i 在模 p 意义下的逆元就是 ip−2modp。
用快速幂计算即可。
int x,p;
int ksm(int a,int b){int s=1,t=a;while(b){if(b&1)s=(s*t)%p;t=(t*t)%p;b>>=1;}return s;}
int main(){cin>>x>>p;cout<<ksm(x,p-2)<<endl;}
线性求逆元
也就是Luogu P3811【模板】 乘法逆元
对于一个数 k,找到一个 invk 使得 k×invk≡1(modp),k∈[1,n]
首先,设 p=a×k+b,b×invb≡1(modp)
把 b 给换掉: (p−a×k)×invb≡1(modp)
通过乘法分配率可以得到: p×invb−a×k×invb≡1(modp)
因为 p×invb 里面有 p 这一项,所以可以直接消掉,得到: −a×k×invb≡1(modp)
把 a,b 都用 k,p 表示可得: − ⌊pk⌋×k×invp modk≡1(modp)
因为 k×invk≡1(modp),且同余具有同乘性,所以左右同乘 invk 可得 −⌊pk⌋×invpmodk≡invk(modp)
有个负号,而左边加上 p×invpmodk 对结果无影响同时能消掉负号:(p−⌊pk⌋)×invpmodk≡invk(modp)
得出结论:设 invi 是 i 的逆元,则有递推式: invi≡(p−⌊pi⌋)×invpmodi(modp)
写成代码就是: for(int i=2;i<=n;i++)ans[i]=(p-p/i)*ans[p%i]%p;
code:
#include <bits/stdc++.h>
#define int long long
using namespace std;int ans[6000000],n,p;
signed main(){
cin>>n>>p;ans[1]=1;
for(int i=2;i<=n;i++)ans[i]=(p-p/i)*ans[p%i]%p;
for(int i=1;i<=n;i++)cout<<ans[i]<<endl;return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)