作用
众所周知,模运算下有同加性,同减性,同乘性而没有同除性,即没有((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)意义下的乘法逆元。
由此利用同乘性有:
因此只要找到符号定义的(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)为素数时用费马小定理写快速幂会快一点。
至于欧拉算法,就比较尴尬,广泛性不如扩欧大,代码复杂度不如费马小定理低,因此推测它不常用。