乘法逆元

作用

众所周知,模运算下有同加性,同减性,同乘性而没有同除性,即没有((frac ab)\%p=(frac{a\%p}{b\%p})\%p)

如果不信很简单就可以找到一组反例:

((frac {100}{50})\%20=2)

((frac{100\%20}{50\%20})\%20=0)

但是求解中有大量除法怎么办呢?于是为了解决没有同除性问题就产生了乘法逆元。

现在假设(x)(a)的乘法逆元,根据需求,应该满足对于任意的整数(b)(frac ba≡p(mod n))时有(bx≡p(mod n))

给出定义:当(axequiv1(mod n)) 时,称(x)(a)(n)意义下的乘法逆元。

由此利用同乘性有:

[frac baequivfrac bacdot1equivfrac bacdot axequiv bcdot x(mod n) ]

因此只要找到符号定义的(x)就可以把模算术中的除法转换成了乘法。

从定义中强调了(n)可以知道,对于不同的模数,(a)的乘法逆元是不同的,具体原因看后面求解的过程

求法

1、扩展欧几里得算法:

由定义有(ax=nk+1,kin Z),即(ax-nk=1)

条件:根据扩展欧几里得算法相关知识,仅当1为(gcd(a, n))的倍数,此处即(gcd(a, b)=1)时该方程有解

此时可用扩展欧几里得算法求解:

LL Exgcd(LL a, LL b, LL &x, LL &y) {
    if(!b) { x=1, y=0; return a; }
    LL g = Exgcd(b, a%b, y, x);
    y = y - a / b * x;
    return g;
}

LL inverse(LL a, LL n) {
    LL x, y, g = Exgcd(a, n, x, y);
    return g == 1 ? (x%n+n)%n : -1; // -1为无解 
}

-

2、费马小定理:

原定理:(a^{p-1}≡1(mod p))

条件:(p)为素数且(a,p)互素

则可推得(acdot a^{p-2}≡1(mod p))

(a^{p-2})(a)的乘法逆元

快速幂算(a^{p-2}),时间(O(log_2n))

-

3、欧拉定理:

相当于扩展的费马小定理,处理模数不是素数的情况

原定理:(a^{varphi(p)}equiv1(mod p)),其中(varphi(p))为欧拉函数

条件:(a,p)互质

推得(acdot a^{varphi(p)-1}equiv1(mod p))

求解过程和"2、费马小定理"类似,要多算一个(varphi(p))但可以处理更宽泛的情况,不要求(p)为素数

-

一对比就可以发现,用扩展欧几里得算法明显实用性更强,因此推荐写扩欧。

(p)为素数时用费马小定理写快速幂会快一点。

至于欧拉算法,就比较尴尬,广泛性不如扩欧大,代码复杂度不如费马小定理低,因此推测它不常用。

原文地址:https://www.cnblogs.com/de-compass/p/12215386.html