BSGS

北上广深

问题

求解离散对数,即下方程中的 \(k\)

\[a ^ k \equiv b \pmod p \]

方法

\(k = A \times x - y\),则有:

\[a ^ {A \times x - y} \equiv b \pmod p \]

移项:

\[a ^ {Ax} \equiv ba ^ y \pmod p \]

我们考虑通过枚举 \(y\) 和哈希表预处理出 \(ba ^ y\) 所有的可能值(小步),再枚举 \(x\) 在哈希表中查对应的 \(y\)(大步),因为要求最小,所以答案就是第一个于哈希表中有值的 \(x\)\(x \times A - y\)

复杂度为 \(O(A + \lceil \frac p A \rceil)\),显然当 \(A = \lceil \sqrt p \rceil\) 时取到最小的 \(O(\sqrt n)\)

其它细节看代码。

代码

il int bsgs(int a, int b, int p) {
    unordered_map <int, int> mp; mp.clear();
    a %= p, b %= p;
    if(b == 1) return 0;
    if(a == b) return 1;
    if(a == 0 && b ^ 0) return -1;
    int block = ceil(sqrt(p)), base;
    base = ksm(a, block, p);
    for(int i = 0, x = b; i <= block; i++, x = x * a % p) mp[x] = i;
    for(int i = 1, x = base; i <= block; i++, x = x * base % p) if(mp.count(x)) return i * block - mp[x];
    return -1;
}
posted @ 2026-05-26 11:41  ACehomoxue  阅读(4)  评论(0)    收藏  举报