「学习笔记」BSGS及扩展

版权声明:本文为hzy原创文章,未经博主允许不可随意转载。 https://blog.csdn.net/Binary_Heap/article/details/82081351

离散对数问题:给定求 y , z , p , y x z ( m o d p ) 的最小整数解.

BSGS

Shank的大步小步算法(Shank’s Baby-Step-Giant-Step Algorithm)

这里介绍一种避开求逆元的BSGS(常数小

m = p x = i m j

y i m j z ( m o d p )

两边同乘 y j 得:

y i m z y j ( m o d p )

m y z 已知,因此先枚举右边 z y j , j [ 0 , m 1 ] .算出来的值放进map里。再接着枚举左边, y i m , i [ 1 , m ] ,如果发现map里有与之对应的值,返回 i m j ,即要求 x .最后若未返回则无解.

(可以看出BSGS是确定了枚举上界 p 的暴力枚举算法.

LL Qpow(LL a, LL b) {
    LL ans = 1LL;
    for(; b; b >>= 1, a = a * a % p)
        if(b & 1) ans = ans * a % p;
    return ans;
}

LL BSGS(LL y, LL z) {
    map<int, int> M;
    LL m = ceil(sqrt(p + 0.5)), cj = z;
    for(int j = 0; j < m; j++) {
        M[cj] = j;
        cj = cj * y % p;
    }
    LL now = Qpow(y, m);
    cj = 1;
    for(int i = 1; i <= m; i ++) {
        cj = cj * now % p;
        if(M.count(cj)) return i*m - M[cj];
    }
    return -1;
}

Extended BSGS

待更。

猜你喜欢

转载自blog.csdn.net/Binary_Heap/article/details/82081351