zoukankan      html  css  js  c++  java
  • 高次同余方程求解

    ll exgcd(ll a,ll b,ll &x,ll &y)
    {
        if(!b)
        {
            x = (ll)1,y = (ll)0;
            return a;
        }
        ll r = exgcd(b,a%b,x,y);
        ll t = x;
        x = y;
        y = t - a/b*y;
        return r;
    }
    
    //计算模n下a的逆,如果不存在逆,返回-1
    ll inv(ll a,ll n)
    {
        ll d,x,y;
        d = exgcd(a,n,x,y);
        return d == 1 ? (x+n)%n : -1;
    }
    
    ll mul_mod(ll a,ll b,ll n)
    {
        return a*b%n;
    }
    
    ll pow_mod(ll a,ll p,ll n)
    {
        if(p == 0)
            return 1;
        ll ans = pow_mod(a,p/2,n);
        ans = ans*ans%n;
        if(p%2)
            ans = ans*a%n;
        return ans;
    }
    
    //求解模方程 a^x = b(mod n), n为素数,无解返回-1
    ll log_mod(ll a,ll b,ll n)
    {
        ll m,v,e = 1LL,i;
        m = (ll)sqrt(n+0.5);
        v = inv(pow_mod(a,m,n),n);
        map<ll,ll> x;
        x[1] = 0;
        for(i=1;i<m;i++)  //计算e[i]
        {
            e = mul_mod(e,a,n);
            if(!x.count(e))
                x[e] = i;
        }
        for(i=0;i<m;i++)   //考虑a^(im), a^(im+1), ... , a^(im+m-1)
        {
            if(x.count(b))
                return i*m+x[b];
            b = mul_mod(b,v,n);
        }
        return -1;
    }
  • 相关阅读:
    PyQt5 -1 最基本的小窗口
    浅谈线段树
    最小生成树问题
    最短路问题
    多重背包问题
    02背包(嘻嘻,完全背包)
    01背包例题
    背包问题(好奇怪)
    关于深搜及广搜
    搜索回溯(第二)
  • 原文地址:https://www.cnblogs.com/whatbeg/p/3813828.html
Copyright © 2011-2022 走看看