高次同余方程求解
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;
}
?
轉載于:https://www.cnblogs.com/whatbeg/p/3813828.html
總結
- 上一篇: R语言入门心得(3) -- 向量相关
- 下一篇: win2003+sql2005配置