BSGS算法

@Pelom  September 26, 2019

BSGS(Baby Step Giant Step)算法

一、BSGS算法

求解高次同余方程
$$A^x \equiv B \ (\bmod \ C)$$
其中 $(A,C)=1$

1.求解

令 $x=im+j$
此时方程转化为
$$A^j \equiv B \cdot A^{-im} \ (\bmod \ C)$$
首先对 $i \in [1,m-1]$ ,计算出 $A^i \% C$ 并将其存入hash表便于查询,此为Baby Step
再枚举等号右侧所有可能值,在hash表中查找,若有,则可得解 $x=im+j$ ,此为Giant Step
显然当 $m=\lceil \sqrt{C} \rceil$ 时最优,时间复杂度为 $O(\sqrt{C})$

inline int Pow(int a,int b,int p){
    int res=1;
    for(;b;b>>=1){
        if(b&1)
            (res*=a)%=p;
        (a*=a)%=p;
    }
    return res;
}
inline int BSGS(int a,int b,int p){
    a%=p;
    if(a==0 && b!=0)
        return -1;
    M.clear();
    int m=sqrt(p)+1;
    int t=1,q=Pow(a,p-1-m,p);
    for(int i=0;i<m;i++){
        if(!M.count(t))
            M[t]=i;
        (t*=a)%=p;
    }
    t=b%p;
    for(int i=0;i<m;i++){
        if(M.count(t)){
            int res=i*m+M[t];
            ((res%=p)+=p)%=p;
            return res;
        }
        (t*=q)%=p;
    }
    return -1;
}

添加新评论