乘法逆元学习笔记

乘法逆元和求法

基本的数论知识,有必要补一发。

开始之前

  • 模运算:取余运算,比如 amodb 就是 a 除以 b 得到的余数。

  • 性质:在加、减、乘、乘方的运算过程中,进行取余运算,不会对结果产生影响。

  • 优先级:取余运算的优先级和乘法、除法的优先级相同,高于加减法的优先级。

  • 互质:表示两个数的最大公约数为 1,表示为 (x,y)=1

  • 同余(这个比较重要): 对于整数 m,如果整数 a,b 满足 (ab)modm=0,即 (ab)÷m 得到的是一个整数值,则称整数 ab 对模 m 同余,记作 ab(modm)

  • 同余的性质:自反性、对称性、传递性、同加性、同乘性、同幂性等。

    • 自反性:aa(modp)
    • 对称性:如果 ab(modp),则有 ba(modp)
    • 传递性:如果 ab(modp)  bc(modp),则有 ac(modp)
    • 同加性:如果 ab(modp) 则有 a+cb+c(modp)
    • 同乘性:如果 ab(modp) ,则  a×cb×c(modp)
         如果 ab(modp)cd(modp) 则有 a×cb×d(modp)
    • 同幂性:如果 ab(modp) 则有 anbn(modp)

问题背景

求解 abmodp 的值,因为不能先对 a,b 取模再相除,所以引入了逆元

逆元可以理解为 modp 意义下 b 的倒数。
假设 invbb 的逆元,则有 invb×b1(modp)
(invb1)modp=0

性质

第一个性质

aba×invb(modp)

证明:

b×invb1(modp)

(b×invb1)modp=0

xmodp=x×ymodp

ab×(b×invb1)modp=0

(a×invbab)modp=0

aba×invb(modp)

得证。

唯一性

性质

每个数的逆元唯一。

证明

假设 b 有两个逆元 x,y
则可知 a×xa×y(modp)

(a×(xy))modp=0

amodp0

x=y

所以每个数的逆元唯一

逆元求法:

快速幂

这个做法的基础是费马小定理

p 为质数,a 为正数,且 (a,p)=1,则有 ap11(modp)

根据逆元的定义 inva×a1(modp) 可知:inva×aap1(modp)

invaap2(modp)

也就是说,一个数 i 在模 p 意义下的逆元就是 ip2modp
用快速幂计算即可。

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×invk1(modp),k[1,n]

首先,设 p=a×k+b,b×invb1(modp)
b 给换掉: (pa×k)×invb1(modp)
通过乘法分配率可以得到: p×invba×k×invb1(modp)
因为 p×invb 里面有 p 这一项,所以可以直接消掉,得到: a×k×invb1(modp)
a,b 都用 k,p 表示可得:  pk×k×invp modk1(modp)
因为 k×invk1(modp),且同余具有同乘性,所以左右同乘 invk 可得 pk×invpmodkinvk(modp)
有个负号,而左边加上 p×invpmodk 对结果无影响同时能消掉负号:(ppk)×invpmodkinvk(modp)
得出结论:设 invii 的逆元,则有递推式: invi(ppi)×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;
}
posted @   AIskeleton  阅读(105)  评论(0编辑  收藏  举报
编辑推荐:
· 从 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)
点击右上角即可分享
微信分享提示