乘法逆元

作用

众所周知,模运算下有同加性,同减性,同乘性而没有同除性,即没有\((\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\)为素数时用费马小定理写快速幂会快一点。

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

posted @ 2020-01-19 19:57  Deguassing-compass  阅读(172)  评论(0编辑  收藏  举报