• 乘法逆元


    乘法逆元

    乘法逆元在模算术中具有举足轻重的地位,(OI)中随处可见它的身影,是一个(OIer)必不可少的基础技能。

    对于乘法逆元的作用,我觉得这个总结的挺好:

    乘法逆元,一般用于求

    [frac{a}{b}pmod{p} ]

    的值,是解决模意义下除法运算的重要手段。

    那么问题来了,为啥不直接除呢?原因是除法不满足模意义下的运算规则,我们要把它转换成乘法的形式。

    乘法逆元定义

    如果有一个线性同余方程(axequiv 1pmod{p}),且(a,p)互质,则(x)称为(amod p)的逆元,记作(a^{-1} mod p)


    回到这个式子

    [frac{a}{b}pmod{p} ]

    我们求它就等于求

    [ab^{-1}pmod{p} ]

    求逆元的一般方法

    扩展欧几里得求解线性同余方程

    线性同余方程:给定整数(a,b,m),求一个整数(x)满足(a*xequiv bpmod{m}),或给出无解。由于未知数次数为1,我们也称其为线性同余方程。其等价于求解方程(ax+my=b),其中(y)(-frac{ax-b}{m})

    显而易见,该方程可以用(Bezout)定理求解,由定理得其有解当且仅当(gcd(a,m)mid b)。具体做法就是求出特解(gcd(a,m))然后通分。

    inline int exgcd(int a,int b,int &x,int &y)
    {
    	if(b==0){x=1,y=0;return a;}
    	int d=exgcd(b,a%b,x,y);
    	int z=x;x=y;y=z-y*(a/b);
    	return d;
    }
    

    费马小定理

    费马小定理:

    [a^{p-1}equiv 1pmod{p} ]

    其可以化为:

    [a^{p-2}*aequiv 1 pmod{p} ]

    根据乘法逆元的定义,(a^{p-2})即为(a)在模(p)意义下的逆元。通过快速幂我们就可以(O(logn))地求任意正整数的逆元。

    线性求逆元

    上面两种方法一般是计算单个正整数的逆元时使用,如果我们需要一堆数的逆元时,上面两种算法都显得很慢了。

    对于一个正整数(p),它可以被写作(kq+r)的形式,其中(q>r)。即(p=kq+r),在模(p)的意义下,它记为(kq+requiv 0pmod{p}),移项得(-kqequiv rpmod{p}),两边同时乘上(q,r)的逆元,得到(-kr^{-1}equiv q^{-1}pmod{p}),把(r)(k)替换成(p),再变化一下,得到((p-frac{p}{q})(pmod q)^{-1}mod p = q^{-1})

    inv[1]=1;
    for(int i=2;i<=n;++i) inv[i]=(p-p/i)*inv[p%i]%p;
    
  • 相关阅读:
    swagger 接口文档,控制器 和 object类型的参数与返回值 的 注释不显示问题
    python学习——练习题(13)
    python学习——练习题(12)
    女生生日祝词
    python学习——练习题(11)
    python学习——练习题(10)
    python学习——练习题(9)
    python学习——练习题(8)
    python学习——练习题(7)
    python学习——练习题(6)
  • 原文地址:https://www.cnblogs.com/DarkValkyrie/p/11316303.html
Copyright © 2020-2023  润新知