滑蒻稽的博客

乘法逆元

前言: 乘法逆元,一般用于将模意义下的除法转换为乘法

求解普通逆元( a x ≡ 1 ( m o d   m ) ax\equiv 1(mod\ m) ax1(mod m))

拓展欧几里得

首先我们看看逆元的定义:若 a x ≡ 1 ( m o d   m ) ax\equiv 1(mod \ m) ax1(mod m),且a与m互质,则 x x x a a a m o d   m mod \ m mod m意义下的乘法逆元,记作 a − 1 a^{-1} a1.

根据这个同余式,我们可以得到 a x + k m = 1 ax+km=1 ax+km=1,且a和m是互质的,那么就满足贝祖等式 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b),可以用拓欧求解.

ll exgcd(ll a,ll b,ll &x,ll &y)//ax+by
{
	if(b==0)
	{
		x=1,y=0;
		return a;
	}
	int ret=exgcd(b,a%b,x,y),t=x;
	x=y,y=t-(a/b)*x;
	return ret;
}

这个板子虽然稍长,但返回值是gcd,用处更广泛

另外,由于gcd求得负数和1最大公约数是-1,exgcd不能用来求解a为负数的情况

快速幂

观察乘法逆元的形式: a x ≡ 1 ( m o d   m ) ax \equiv1(mod \ m) ax1(mod m).

考虑到欧拉定理: a φ ( m ) ≡ 1 ( m o d   m ) a^{\varphi (m)} \equiv 1(mod\ m) aφ(m)1(mod m).

由于洛谷模版题中给出m为质数,则有:
a x ≡ a m − 1 ( m o d   m ) a ≡ a m − 2 ( m o d   m ) ax \equiv a^{m-1}(mod\ m)\\a \equiv a^{m-2}(mod \ m) axam1(mod m)aam2(mod m)
那 么 , a 在 m o d   m 意 义 下 的 乘 法 逆 元 即 为 a m − 2 m o d   m 那么,a在mod \ m意义下的乘法逆元即为a^{m-2} mod \ m ,amod mam2mod m,满足快速幂形式,可使用快速幂求解.

ll fpm(ll x, ll power, ll mod) 
{
    x%=mod;
    ll ans=1;
    for (;power;power>>=1,(x*=x)%=mod)
    	if(power&1)(ans*=x)%=mod;
    return ans;
}

ll inv(ll x)
{
	return fpm(x,mod-2,mod);
}

代码中的(ans*=x)%=mod即为(ans=ans*x)=(ans=ans*x)%mod.

posted @ 2021-02-02 21:03  huaruoji  阅读(122)  评论(0编辑  收藏  举报