简单数论(二)----BSGS算法总结

BSGS算法总结


Part I BSGS算法

BSGS算法(Baby Step Giant Step),即大步小步算法,用于求解这样的问题

yx≡ z(mod p) 的最小整数解,前提条件 (y,p)=1。

 此时先计算出m = sqrt(p)

然后另 x = im+j,此时有i,j<m

移项有 ymi ≡z*y-j,因为有逆元,不爽

重新另x = im-j,这样移项是就能不去算逆元了

这时有 ymi ≡ z*yj .

这时只用枚举b可能的取值(0~m-1),并且计算右边的值,同时用哈希或者map之类的东西存起来,方便查询.

接着枚举左边的i(1~m),查一下hash table 或 map 中有没有相同的值就行了。

参考代码(用的是CQOI2018 破解D-H协议中写的BSGS)

inline int BSGS(int y,int z)
{
    ma.clear();
    ll m= sqrt(p)+1;
    ll cj = z;
    for(int i=0;i<m;i++)
    {
        ma[cj] = i;
        cj = cj*y%p;
    }
    ll now = Pow(y,m);
    cj = 1;
    for(int i=1;i<=m+1;i++)
    {
        cj = cj*now%p;
        if(ma.count(cj))
        {
            return i*m-ma[cj];
        }
    }
}

Part II 扩展BSGS算法

除gcd...

 

 

 

posted @ 2018-04-18 21:00  wlzs1432  阅读(260)  评论(0编辑  收藏  举报