数学知识 乘法逆元

如果(a *b equiv 1(mod p))

我们就说a和b在mod p的意义下互为乘法逆元,和倒数的概念比较类似

逆元记做(a=inv(b))

逆元有什么用?我们常常会遇到要求结果对一个大质数p取模因为答案很大,出题人为了不麻烦大家写高精

就采取了这样的方法(出现大的质数是不是就在暗示要逆元呢),加减法和乘法对取模运算是封闭的,所以你可以处处取模来避免溢出

但是我们遇到了除法就犯了难,为了解决模意义下的除法运算的问题,我们引入了逆元,inv(a)

其实可以看做模p意义下的({1}over{a})

那么在模p意义下({a} over {b})

就可以变形为(a*inv(b)(mod p))

乘法逆元的方法有扩展欧几里得,费马小定理,线性递推

费马小定理

p为质数gcd(a,p)=1,则有(a^{p-1}equiv1(mod p))

inv[a]=(a^{p-2}(mod p))就是a 的逆元

于是对(a^{p-2})算一下快速幂就好了,注意这个方法只对p是质数的情况有效

inline int quick_pow(long long a,long long b,long long p)
{
    long long ans=1;
    long long base=a;
    while(b)
    {
    if(b&1)
    ans=ans%p*base%p;
    base=base*a%p;
    b>>=1;
    }
    return ans;
}
inline long long inv(long long a,long long p)
{
    return quick(a,p-2,p);
}

线性递推

公式(inv[i]=(p-p/ i)inv[p\%i]\%p;)

总结

费马小定理真的好用多了,前面的看不看吧

原文地址:https://www.cnblogs.com/bangdexuanyuan/p/13374635.html