离散对数――大步小步算法(BSGS)

匿名 (未验证) 提交于 2019-12-03 00:34:01

已知a,b,P,且a与P互质,求解同余方程axb(modP)

m=P
x=im+j,即 i=xmj=xmodm
所以满足imjm

aim+jb(modP)

ajaimb(modP)

ajaimb(modP)

先枚举j,将得到的aj存入hash表;
再枚举i,计算aimb,是否存在hash表中,如果有,则找到了解,输出即可。

为保证答案最小,必须保证先枚举j,再枚举i,且保证aj在hash表中j从小到大排列

long long work(long long a,long long b,long long P) {     long long m,v,e=1,i;     m=ceil(sqrt(P+0.5));      v=pow_mod(a,m,P);     v=inv(v);//v=a^(-im)      Hash::clear();     Hash::add(1,0);     for(i=1;i<m;i++)     {         e=(e*a)%P;         if(Hash::get(e)==-1)             Hash::add(e,i);     }     for(i=0;i<m;i++)     {         int t=Hash::get(b);         if(t!=-1)             return i*m+t;         b=(b*v)%P;     }     return -1; } 

POJ2417

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!