目录
作用
众所周知,模运算下有同加性,同减性,同乘性而没有同除性,即没有\((\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)\)。
给出定义:当\(ax\equiv1(mod\ n)\) 时,称\(x\)为\(a\)模\(n\)意义下的乘法逆元。
由此利用同乘性有:
\[ \frac ba\equiv\frac ba\cdot1\equiv\frac ba\cdot ax\equiv b\cdot x(mod\ n) \]
因此只要找到符号定义的\(x\)就可以把模算术中的除法转换成了乘法。
从定义中强调了\(n\)可以知道,对于不同的模数,\(a\)的乘法逆元是不同的,具体原因看后面求解的过程
求法
1、扩展欧几里得算法:
由定义有\(ax=nk+1,k\in 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\)互素
则可推得\(a\cdot 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\)互质
推得\(a\cdot a^{\varphi(p)-1}\equiv1(mod\ p)\)
求解过程和"2、费马小定理"类似,要多算一个\(\varphi(p)\)但可以处理更宽泛的情况,不要求\(p\)为素数
一对比就可以发现,用扩展欧几里得算法明显实用性更强,因此推荐写扩欧。
但\(p\)为素数时用费马小定理写快速幂会快一点。
至于欧拉算法,就比较尴尬,广泛性不如扩欧大,代码复杂度不如费马小定理低,因此推测它不常用。