zoukankan      html  css  js  c++  java
  • 求逆元的方法

    乘法逆元的定义


      若ax≡1%p, 则称a关于模p的乘法逆元为x。
      当a与p互质时,a关于模p的乘法逆元有解。如果不互质,则无解。如果p为质数,则从1到p-1的任意数都与p互质,即在1到p-1之间都恰好有一个关于模p的乘法逆元。且1到p-1中的所有数的逆元对应1到p-1中的所有数,既是单射也是满射。

    逆元的求解

    1.费马小定理

      感觉很顺手的求法

      当n为质数时,已知n^(p−1)≡1%p(费马小定理)
      那么inv[n]=n^(p−2)%p.
      时间复杂度为O(logn)(快速幂).
    LL quick(LL n,LL p)
    {
        LL res=1,ex=p-2;
        for(LL i=ex;i;i>>=1,n=n*n%p)
        {
            if(i&1) res=res*n%p;
        }
        return res;
    }
    int main()
    {
        LL n;
        while(cin>>n>>p)
        {
            cout<<quick(n,p)<<endl;
        }
    }
    

     2.扩展欧几里得

      这个方法没啥好讲,复杂度同样O(logn)

    void exgcd(LL a,LL b,LL &g,LL &x,LL &y)
    {
        if(!b)  g=a,x=1,y=0;
        else    exgcd(b,a%b,g,y,x),y-=x*(a/b);
    }
    LL inv(LL num)
    {
        LL g,x,y;
        exgcd(num,MOD,g,x,y);
        return (x%MOD+MOD)%MOD;
    }

    emmm,先这样吧,还有好多好多,慢慢来吧- -

  • 相关阅读:
    【原】list<T>排序
    [原]unity3d刀光剑影(二)
    [原]unity3D bug记录
    [原]重要工具集
    [原]IOS 后台发送邮件
    [转]IOS 崩溃日志大全(二)
    动态二维数组的建立
    struts 学习
    sizeof()与strlen()的区别
    struts配置。泪奔...
  • 原文地址:https://www.cnblogs.com/weimeiyuer/p/8082321.html
Copyright © 2011-2022 走看看