zoukankan      html  css  js  c++  java
  • 简单数论(二)----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...

     

  • 相关阅读:
    MFC菜单快捷键的应用
    TDD in C++
    Mapping
    初入股市者怎样看盘
    C++随笔分类列表(高级)
    C++代码优化
    IT生活
    十一年炒股的感悟
    框架设计(第2版)CLR Via C#(1)
    Visual Assist X自己常用的快捷功能
  • 原文地址:https://www.cnblogs.com/wlzs1432/p/8877514.html
Copyright © 2011-2022 走看看