乘法逆元

时间:2019-02-11
本文章向大家介绍乘法逆元,主要包括乘法逆元使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
乘法逆元

​ 在组合计数中,由于答案过大,需要取模。比如计算CnmC_n^m.

​ 为了求出abx(mod m)\frac a b \equiv x (mod\ m)中的xx,就需要求出bb的逆元b1b^{-1},因为bb11bb^{-1} \equiv 1,所以abab1\frac a b \equiv ab^{-1}

1-费马小定理

​ (的推论)apa(mod p)a^p \equiv a (mod\ p),当pp为质数且(a,p)=1(a,p)=1

​ 这样ap2=a1a^{p-2}=a^{-1},用快速幂求就好。

ll Reverse(ll op){
    ll poi = mod - 2, base = op, res = 1;
    while(poi){
        if(poi&1)
            res = (res*base) % mod; //在mod>INT_MAX时不适用。
        base = (base*base) % mod;
        poi >>= 1;
    }
    return res;
}
2-扩展欧几里得算法

ax+by=(a,b)ax+by=(a,b)一定有解。

​ 又设 bx+(a%b)y=(a%b,b)=(a,b)bx'+(a\%b)y'=(a\%b,b)=(a,b)

​ 则ax+by=bx+(a%b)y=bx+(aba/b)yax+by=bx‘+(a\%b)y’=bx'+(a-b*\lfloor a/b \rfloor)y’

ax+by=ay+b(xa/by)ax+by=ay'+b(x'-\lfloor a/b \rfloor y')

​ 因此x=yx=y'y=xa/byy=x'-\lfloor a/b \rfloor y'

​ 只要求解bx+(a%b)y=(a,b)bx'+(a\%b)y'=(a,b),将x,yx',y'带入即可求出x,yx,y

​ 这样,我们可以像欧几里得算法一样不断减小系数的规模。只要递归地求解更小规模的方程,最后回溯时将解依次带回就好。递归终点是当bi=0b_i=0时,这时(ai,bi)=ai=(a,b)(a_i,b_i)=a_i=(a,b)aixi+biyi=(ai,bi)a_ix_i+b_iy_i=(a_i,b_i)一组解是xi=1,yi=0x_i=1,y_i=0

​ 当(a,b)=1(a,b)=1时,ax+by=1ax+by=1可用来求解bb在模aa意义下的逆元yy,或者aa在模bb意义下的逆元xx.

void exEuclid(ll a, ll b, ll &d, ll &x, ll &y){
    if(!b)
    	d=a, x=1, y=0;		//d就是gcd
    else{
        exEuclid(b, a % b, d, y, x);
        y -= x * (a / b);	//x=y', y=x' - y'*(a/b)
    }
}

​ 复杂度与辗转相除法相同O(log ab)O(log\ ab),因为每一次都使较大的数减小一半以上。

3-线性递推法

​ 需要modmod是质数。

​ 设mod=ki+r0mod = k*i+r\equiv 0

​ 两边同乘i1r1i^{-1}r^{-1}

kr1+i10k*r^{-1}+i^{-1}\equiv 0