小学二年级都能看懂的 乘法逆元学习笔记

介绍

在做题的时候,经常会遇见让我们将答案取模的情况。如果计算过程只涉及加减乘还好说,边算边取模即可。但是计算时经常不可避免的会出现除法,而 (amodp)/(bmodp)(a/b)modp 并不相等,这是无法接受的。所以我们需要找到一个办法,将除法转换为乘法。

也就是说,我们需要找到一个数 x ,使得 a/bax(modp) (或者说让 x 在模 p 意义下相当于 1b),而此时 x 就是被 b 在模 p 意义下的逆元。


---

原理

要求出 x 使得

(1)(a/b)modp=axmodp

我们不妨令 (a/b)modp=m ——————①

axmodp=m ————————②

①式两边乘上 b ,即可得到 amodp=mbmodp ——————③

将③带入②即可得到:

(bmx)modp=m

由于 m 是对 p 进行模运算得到的,必然小于 p ,所以原式可以改写为

((bx)modp)m=m

bxmodp=1

也就是说,当 x 满足 bxmodp=1 时,xb 在模 p 意义下的逆元。这也是乘法逆元的定义。


---

求解

那么,知道逆元的定义后,怎么求解逆元呢?

扩展欧几里得算法

由于 bxmodp=1

bx=bxqq+1

bxbxqq=1

我们令 y=bxq

原式就被我们化成了一个不定方程 bx+qy=1

就可以通过扩展欧几里得算法求出 x,y

扩展欧几里得算法

代码如下

#define ll long long
const ll p=1e9+7
void exgcd(ll a,int b,ll &x,ll &y){
if(!b){
x=1,y=0;
}
else{
exgcd(b,a%b,y,x);
y-=x*(a/b);
}
}
ll ny(ll a){
ll x,y;
exgcd(a,p,x,y);
return (x+p)%p;
}

不过由于 bx+qy=1 当且仅当 gcd(b,q)|1 ,即 b,q 互质时有解

所以当 b,q 不互质时,是不存在 b 的逆元的

所以一般题目取模的时候都会模一个质数

不过如果碰上二般的题目还要求除法的时候,那就只能各显神通了

费马小定理

根据费马小定理:如果p是一个质数,而整数 a 不是 p 的倍数,则有 ap11(modp)

非常显然,当 x=ap2 时,x 即为 a 的逆元,可以使用快速幂求解

代码如下:

#define ll long long
const ll p=1e9+7
ll power(ll a, ll n)//快速幂
{
ll res=1;
for(;n>0;n>>=1){
if(n&1) res*=a;
a*=a,a%=p,res%=p;
}
return ans;
}
ll ny(ll a)
{
return pow(a, p - 2);
}

---

应用

不就在开头吗

posted @   万航之舰  阅读(141)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示