码迷,mamicode.com
首页 > 编程语言 > 详细

BSGS算法(大步小步算法)

时间:2018-01-26 14:11:22      阅读:287      评论:0      收藏:0      [点我收藏+]

标签:code   end   body   logs   continue   inline   turn   计算   算法   

计算\(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算法(大步小步算法)

标签:code   end   body   logs   continue   inline   turn   计算   算法   

原文地址:https://www.cnblogs.com/Guess2/p/8358982.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!