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

介绍

在做题的时候,经常会遇见让我们将答案取模的情况。如果计算过程只涉及加减乘还好说,边算边取模即可。但是计算时经常不可避免的会出现除法,而 \((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\) 使得

\[\begin{align} (a/b)\bmod p&=a\cdot x\bmod p \end{align} \]

我们不妨令 \((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);
}

---

应用

不就在开头吗

posted @ 2022-09-07 16:15  万航之舰  阅读(156)  评论(0)    收藏  举报