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

问题

已知 a , b , P ,且a与P互质,求解同余方程 a x b   ( m o d   P )

算法推导

m = P  
x = i m + j ,即 i = x m j = x   m o d   m
所以满足 i m j m

a i m + j b   ( m o d   P )

a j a i m b   ( m o d   P )

a j a i m b   ( m o d   P )

算法流程

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

为保证答案最小,必须保证先枚举j,再枚举i,且保证 a j 在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

猜你喜欢

转载自blog.csdn.net/can919/article/details/80786283
今日推荐