去模运算(逆元)
diary
1.最近这几天连着训练,累s了,咸鱼属性正在觉醒.....
attention
文章逻辑较为繁琐,请仔细耐心阅读
建议放大后远距离阅读,感受最佳
引入
许多题目中要用到除法取模
但在取模等式等价变形中没有除法,为啥?
说明如果在计算数字过大时可能超范围,那么应该怎么办呢?
前置知识
快速幂
不懂可以去看鄙人的博客关于位运算
同余符号
这个三条横线的符号表示对取模等于1对取模
单位元
在一个集合中,对于某种运算,如果对于任何的集合元素 ,和元素 运算,得到还是集合元素 本身,则称 为这个运算下的单位元。
加法
为任意实数,若 + = 则称 是 单位元 0
乘法
为任意实数,若 * = 则称 是单位元 1
模乘
模乘的单位元是
证明如下:
对于模 n 乘法,所有模 n 和 a 同余的数都可以表示成
设单位元为,我们将和进行模乘,得:
*
= ( + ) * ( + )
= +++
= (++)+
有因为 根据单位元的定义: * =
进一步可得: (++) + = +
模乘的单位元是
得证
逆元
在一个集合中,对于某种运算 ,如果任意两个元素的运算结果等于单位元 ,则称这两个元素互为逆元。
加法
a为任意实数,的逆元是 -
乘法
a为任意非零实数,的逆元是 或
模乘
主角登场
模乘运算中,任意整数 的逆元表示为:
提前避坑
分数的取模运算非常"神奇"
如 解 mod 8
设:
= 1
易得 =
所以 mod =
根据逆元的定义,可知
引入
学到这我们知道了求(a b)mod 可以转换为(*)mod *
而 是 的逆元
那么逆元怎么求呢
求解逆元
费马小定理
若是质数,则对于任意整数,有
进行转换得
显然,当你要求时且 模数 为质数时,用费马小定理求即可
扩展欧几里得定理(定理)
在这之前你需要学习欧几里得算法也就是求,不懂的同学可以去看最大公约数(gcd)
对于任意整数,, 存在一对整数,满足+=
证明如下:
1、在欧几里得算法的最后一步,即求出=, = 时显然有一对整数 = y= 满足
+* = =
2、若, 则 = .假设存在一对整数,满足 * + * =
转换得: +(- ) = +( - ) =
所以令 = , = -
就得到了 + =
对欧几里得算法的递归过程应用数学归纳法,可知定理成立
当你要求时,已知模数为(质数)
根据转化得 =
- =
因为 的正负无关 可看为 + =
由于+=
设 = , = , = , =
由于 = 是质数,所以 =
用上述公式递归求出即可
代码实现如下
#include <bits/stdc++.h>
using namespace std;
int exgcd(int a,int b,int &x,int &y){
int temp,d;
if (b==0){
x=1;
y=0;
return a;
}d=exgcd(b,a%b,x,y);
temp=x;
x=y;
y=temp-a/b*y;
return d;
}
int main(){
int d,x,y;
d=exgcd(i,n,x,y);
return 0;
}
线性同余方程(逆元同理)
题目
给定整数,,,求一个整数满足 , 或者给出无解.因为未知数的指数是,我们称之为一次同余方程,也称线性同余方程
等价于 = - + ( 的正负不重要)
移项 * + * =
根据定理 ( + = )
当时,此同余方程有解
设已知的,为,,设未知的,为,
求出一组整数,,满足 * + * =
然后 = * /
就是原线性方程的一个解
后记
家人们,博主为了这篇博客整整做了好几天,劳烦家人们点个小赞
Thanks♪(・ω・)ノ
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效