BSGS和EXBSGS
Posted morning-glory
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BSGS和EXBSGS相关的知识,希望对你有一定的参考价值。
(Description)
给定(a,b,p),求一个(x)使其满足(a^xequiv b left(mod p ight))
(BSGS)
(BSGS)可以解决(p)为质数的情况
令 (m=lceil sqrt p
ceil)
令 (x=icdot m-k)
有 (a^{icdot m-k} equiv b (mod p))
两边同乘 (a^k) 得 (a^{icdot m}equiv bcdot a^k (mod p))
我们先将右边的 (bcdot a^k) 全部求出来存到一个表里,这样预处理时间复杂度为 (sqrt p)
之后再枚举 (i) 到 (sqrt p) ,看表里有没有 (a^{icdot m} mod p),有的话就有一组解
再反向求出(x)即可
(EXBSGS)
当(p)不是质数时
令 (g=gcd(a,p))
有 (a^{x-1}cdot dfrac{a}{g}cdot g equiv dfrac{b}{g}cdot g left(mod dfrac{p}{g}cdot g
ight))
把那个(g)除掉
(a^{x-1}cdot dfrac{a}{g} equiv dfrac{b}{g} left(mod dfrac{p}{g}
ight))
然后重复这个过程直到(a,p)互质
(p)除掉(gcd(a,p))后可能仍与(a)有公约数,与(frac{a}{gcd(a,p)})互质
显然,在这个过程中如果(p)不能被(b)整除就无解
到最后会得到这样的方程
(a^{x-i}cdot cequiv t left(mod p
ight))
(c)是由(a)的幂除以若干个因子得到的 (c,t)肯定互质
两边乘以(c^{-1})(逆元)
(a^{x-i}equiv tcdot c^{-1} left(mod p
ight))
用(BSGS)对(x-i)求解即可
最后记得加上(i)
(Code)
(BSGS)
ksm(a,b);//return a^b
gcd(a,b);//return gcd(a,b)
//{{{bsgs
int bsgs (int a,int b,int p)//return a^x ≡ b mod p 's x
{
a%=p;
if (!a&&!b) return 1;
if (!a) return -1;
int m=sqrt(p);
map <int,int> mp;//这里用的map 也可以自己打个哈希
int t=b%p;
mp[t]=0;
for (int i=1;i<=m;++i) mp[t=1ll*t*a%p]=i;
t=1;
int mi=ksm(a,m);
for (int i=1;1ll*i*i<=p+1;++i){
t=1ll*t*mi%p;
if (mp.count(t)) return ((1ll*i*m%p-mp[t])%p+p)%p;
}
return -1;
}
//}}}
(EXBSGS)
//{{{exbsgs
int exbsgs (int a,int b,int p)//a^x ≡ b mod p 's x
{
if (b==1) return 0;
int cnt=0,t=1;
for (int g=gcd(a,p);g!=1;g=gcd(a,p)){
if (b%g) return -1;
++cnt,b/=g,p/=g;
t=1ll*t*a/g%p;
if (b==t) return cnt;
}
int x=bsgs(a,1ll*ksm(t,p-2)*b%p,p);
if (x!=-1) x+=cnt;
return x;
}
//}}}
如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧
以上是关于BSGS和EXBSGS的主要内容,如果未能解决你的问题,请参考以下文章