• 互质判断、求解逆元的方法【逆元】


    求逆元的方法:

    互质判断:

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

         有一种情况就是题目中所给的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;
    }
  • 相关阅读:
    chapter1 Qt入门
    base64加密解密
    vue+CryptoJS+cookie实现保存账号密码
    js计时器
    Elenent ui中的表单校验规则、自定义校验规则、预验证功能
    js获取文件后缀
    js中如何将有字符串转换为数组,或将数组转换为字符串
    vue-router
    Vue项目纯前端导出word文档
    async/await
  • 原文地址:https://www.cnblogs.com/ldu-xingjiahui/p/12407470.html
Copyright © 2020-2023  润新知