数学知识 乘法逆元

如果\(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;\)

总结

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

posted @ 2020-07-24 21:23  邦的轩辕  阅读(194)  评论(0)    收藏  举报