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的主要内容,如果未能解决你的问题,请参考以下文章

BSGS与ExBSGS:大步小步法

2023.1.16[模板]BSGS/exBSGS

模板扩展 BSGS/exBSGS

BSGS 以及 ExBSGS

[note]BSGS & exBSGS

知识点简单总结——BSGS与EXBSGS