zoukankan      html  css  js  c++  java
  • 互质判断、求解逆元的方法【逆元】

    求逆元的方法:

    互质判断:

         除了之前所知道的判断两个数互为质数的方法

         有一种情况就是题目中所给的mod特别大 但是要求逆元的值a却比较小

         满足: 只要mod是素数 那么这两个数一定是互质的

    1.快速幂+费马小定理/欧拉方程:

      注: a和mod只有在互质的情况下才存在逆元

    (a^(mod-2)+函数中取余mod的结果表示逆元)

    代码:

    #include<stdio.h>
    typedef long long int LL;
    LL inv;
    LL qpow(LL a,LL q,LL mod)       //关于快速幂上面都有 不详细说了 但要注意传参是mod-2
    {  
        LL ans;
        ans=1;
        while(q){
            if(q%2){
                ans=ans*a%mod;
            }
            a=a*a%mod;
            q/=2;
        }
        return ans;
    }
    LL getinv(LL a,LL mod)
    {
        return qpow(a,mod-2,mod);
    }
    
    
    int main()
    {
        LL a,mod;
        scanf("%lld%lld",&a,&mod);
        inv=getinv(a,mod);
        printf("%lld
    ",inv%mod);
        return 0;
    }
    

    2. 拓展欧几里得求逆元:

    (a和b=mod求特解表示逆元)

    代码:

    #include<stdio.h>
    typedef long long int LL;
    LL GCD;
    LL exgcd(LL a,LL b,LL &x,LL &y)
    {
        if(!b){
            x=1;y=0;return a;
        }
        GCD=exgcd(b,a%b,y,x);
        y-=a/b*x;
        return GCD;
    }
    LL getinv(LL a,LL mod)
    {
        LL x,y;
        GCD=exgcd(a,mod,x,y);                //让b=mod 然后用拓展欧几里得公式求解
        return GCD==1? (x%mod+mod)%mod:0;
    }
    int main()
    {
        LL a,mod,c;
        scanf("%lld%lld",&a,&mod);
        c=getinv(a,mod);
        if(c){
            printf("%lld
    ",c);
        }
        else{
            printf("error!
    ");
        }
        return 0;
    }
  • 相关阅读:
    20121010 闲的慌的日子
    九月,桂花飘香的季节
    win7下控件(ActiveX)注册错误(0x80040200) 修正
    C#多线程技术(一)
    C#多线程技术(二)
    C++沉思录摘录(OOP部分)
    SVM入门教程
    是IE的bug还是Windows的bug?
    inno setup安装时不需要开始菜单项
    django本地局域网访问
  • 原文地址:https://www.cnblogs.com/ldu-xingjiahui/p/12407470.html
Copyright © 2011-2022 走看看