BSGS算法(大步小步算法)

Posted Guess2

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BSGS算法(大步小步算法)相关的知识,希望对你有一定的参考价值。

计算\(y^x ≡ z \ mod\ p\)\(x\) 的解。
这个模板是最小化了\(x\) , 无解输出\(No \ Solution!\)

map<ll,ll>data; 
ll m,res,t,ans; bool flag;
Pow(int x,int y,int p){return (x^y)%p;}

IL void BSGS(RG ll y , RG ll z,RG ll p){
    y %=p; 
    flag = false;
    if(!y && !z){puts("1");return;}
    if(!y && z){puts("No Solution!"); return;}
    data.clear();
    
    //把z*(y^j)的值存下来
    m = sqrt(p)+1;          //一定要+1!!!!
    for(RG ll j = 0; j <= m; j ++){
        if(!j){res = z % p; data[res] = j; continue;}
        res = res*y%p; if(!data[res])data[res] = j;
    }       

     //计算y^(im)的值,与之前的值比对
    t = Pow(y,m,p); res = 1;
    for(RG ll i = 1; i <= m; i ++ ){
        res = res*t%p;
        if(data[res]){
            ans = i*m - data[res];
            ans = (ans%p+p)%p; cout<<ans<<endl;
            flag = true; return;
        }
    }       
    if(!flag)puts("No Solution!");
}

以上是关于BSGS算法(大步小步算法)的主要内容,如果未能解决你的问题,请参考以下文章

BSGS&EXBSGS 大手拉小手,大步小步走

高次不定方程BSGS算法

bsgs(Baby Steps Giant Steps)算法

bzoj2480 Spoj3105 Mod

BSGS ! x

题解Matrix BZOJ 4128 矩阵求逆 离散对数 大步小步算法