高次同余方程求解

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;

}

 

你可能感兴趣的:(高次同余方程求解)