【数学】乘法逆元(扩展欧几里得算法、裴蜀定理、费马小定理、欧拉定理)
取模运算的性质
But:
乘法逆元
在算法竞赛中,经常会遇到求解数据很大,则输出模 的解这类要求。加法、减法、乘法等操作,基于同余理论直接取模即可。但遇到除法时,某步中间结果不一定能完成整除,就无法求解了。所以引入了乘法逆元。
从网上找了几种不同的定义:
定义1:
定义2:
核心思想就是:除以一个数等于乘上这个数的倒数,在除法取余的情况下,就是乘上这个数的逆元
即有:
这样就可以把除法转换为乘法。
求组合数的时候会用到。
求逆元的方法:
1.扩展欧几里得算法(通解)
2.费马小定理(只有当模数为质数时才可以用)
1.扩展欧几里得算法求逆元
其中整数x,y
的计算方法被称为扩展欧几里得算法。
上面的Bezout定理又称裴蜀定理:
扩展欧几里得算法代码:
int exgcd(int a,int b,int &x,int &y)
{
if(!b) //如果b是0
{
x = 1, y = 0;
return a;
}
int d = exgcd(b, a % b, y, x); // by + (a % b) * x = d ,d为(a,b)的最大公约数
y -= a / b * x; //公式化简
return d;
}
简要证明:
由欧几里得算法:gcd(a,b) = gcd(b, a % b)
设d = gcd(a,b) = gcd(b, a % b)
由裴蜀定理:
所以:
求出 就得到了 关于模 的逆元。
时间复杂度
适用范围:存在逆元即可求,适用于个数不多但模数很大的时候,最常用、安全的求逆元方式。
2.费马小定理求逆元(模数为质数时可用)
费马小定理是欧拉定理的特殊情况。
版本1::
版本2:(版本1两边同除即为版本2)
对于版本2,继续往下推一步即可得出结论:
两边同除
所以就是模的逆元。
然后快速幂求一下就可以了。
快速幂:
int qmi(int a, int k, int p)
{
int res = 1;
while(k)
{
if(k & 1) res = res * a % p;
a = a * a % p;
k >>= 1;
}
return res;
}
参考:
https://zhuanlan.zhihu.com/p/378728642
https://article.itxueyuan.com/ZoGkvE
《算法竞赛进阶指南》李煜东 著
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验