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;
}

浙公网安备 33010602011771号