小学二年级都能看懂的 乘法逆元学习笔记
介绍
在做题的时候,经常会遇见让我们将答案取模的情况。如果计算过程只涉及加减乘还好说,边算边取模即可。但是计算时经常不可避免的会出现除法,而 \((a\bmod p)/(b\bmod p)\) 与 \((a/b)\bmod p\) 并不相等,这是无法接受的。所以我们需要找到一个办法,将除法转换为乘法。
也就是说,我们需要找到一个数 \(x\) ,使得 \(a/b \equiv a\cdot x(\bmod p)\) (或者说让 \(x\) 在模 \(p\) 意义下相当于 \(\frac{1}{b}\)),而此时 \(x\) 就是被 \(b\) 在模 \(p\) 意义下的逆元。
---
原理
要求出 \(x\) 使得
我们不妨令 \((a/b)\bmod p=m\) ——————①
\(a*x\bmod p=m\) ————————②
①式两边乘上 \(b\) ,即可得到 \(a\bmod p=m\cdot b\bmod p\) ——————③
将③带入②即可得到:
\((b\cdot m\cdot x)\bmod p=m\)
由于 \(m\) 是对 \(p\) 进行模运算得到的,必然小于 \(p\) ,所以原式可以改写为
\(((b\cdot x)\bmod p)m=m\)
即
\(bx \bmod p=1\)
也就是说,当 \(x\) 满足 \(bx \bmod p=1\) 时,\(x\) 为 \(b\) 在模 \(p\) 意义下的逆元。这也是乘法逆元的定义。
---
求解
那么,知道逆元的定义后,怎么求解逆元呢?
扩展欧几里得算法
由于 \(bx \bmod p=1\)
即 \(bx=\lfloor \frac{bx}{q}\rfloor \cdot q+1\)
即 \(bx-\lfloor \frac{bx}{q}\rfloor \cdot q=1\)
我们令 \(y=\lfloor\frac{bx}{q}\rfloor\)
原式就被我们化成了一个不定方程 \(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\) 的倍数,则有 \(a^{p-1}\equiv1(\bmod p)\)
非常显然,当 \(x=a^{p-2}\) 时,\(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);
}
---
应用
不就在开头吗

浙公网安备 33010602011771号