乘法逆元 求解及应用

乘法逆元定义

假设a,x,b为整数,b>1,且有$ax \equiv 1(\mod b)$成立
那么a,x互为膜b的逆元
通俗一些,即两数乘积膜p等于1,则他们互为b的逆元
************************

逆元算法求解

扩展欧几里得

既然已有同余式$ax \equiv 1(\mod b)$
那么我们可以将其转化为$ax+by=1$

可以用扩展欧几里得算法求出其最小非负整数解即为a在膜b意义下的逆元
不会扩展欧几里得算法看这里

扩展欧几里得 推导及应用

void exgcd(int a,int b,int &x,int &y)
{
    if(b==0){x=1;y=0;return a;}
    int gcd=exgcd(b,a%b,x,y);
    int tp=x;
    x=y; y=tp-a/b*y;
    return gcd;
}
int x,y;
exgcd(a,b,x,y);
inv=(x%b+b)%b;

该算法对于b是否为素数无限制
单次逆元的计算效率不错
****************

费马小定理

p 为素数, a为正整数,且a,p互质,则有$a^{p-1}\equiv1(\mod p)$

对于$a^{p-1}\equiv1(\mod p)$
我们变形为$a*a^{p-2}\equiv1(\mod p)$
那么$x=a^{p-2}$%$p$即为我们所要求的逆元

该算法可直接用快速幂计算
复杂度为log级别,效率高
不支持计算p不为素数的情况
***************************************

线性算法

首先有$1^{-1}≡1(\mod p)$

设$p=ki+r$ $(r<i$, $1<i<p)$
再将这个式子放到膜 p意义下得 $k
i+r≡0(\mod p)$

两边同时乘上$i^{-1}$,$r^{-1}$得

$kr^{-1}+i^{-1}≡0(\mod p) $
$ i^{-1}≡-k
r^{-1}(\mod p) $
$ i^{-1}≡-\lfloor p/i \rfloor*(p \mod i)^{-1}(\mod p)$

于是我们得到一个线性递推算法

inv[1]=1;
for(int i=2;i<=n;++i)
inv[i]=(ll)(p-p/i)*inv[p%i]%p;

该算法复杂度O(n)
适用于需要求解一整组逆元的时候
*******************

逆元应用

对于(a/b)%p这样的式子
显然不适用取膜运算律
所以我们将其改为**(a*inv[b])%p**

好像也没什么其他神奇的用处了= =

猜你喜欢

转载自www.cnblogs.com/niiick/p/8971278.html