BSGS和扩展BSGS
BSGS:
求合法的\(x\)使得\(a ^ x \quad mod \quad p = b\)
先暴力预处理出\(a^0,a^1,a^2.....a^{\sqrt{p}}\)
然后把这些都存在map里 : \(map[a^x] = x\)
一个合法的x满足\(x = k\sqrt{p} + l\)使得\(a^x = b\),因此可以直接枚举k,于是有:
$$a^x = a^{k\sqrt{p}} \cdot a^l = b$$
$$a^l = \frac{b}{a^{k\sqrt{p}}} = b \cdot (a{k\sqrt{p}})$$
所以每次枚举k,如果可以在map内部找到\(b \cdot (a^{k\sqrt{p}})^{-1}\),那么就找到了一组合法的\(k\)和\(l\),于是就找到了一个合法解
扩展BSGS:
但是注意到在算法中,需要求\((a^{k\sqrt{p}})^{-1}\),并且我们有\((a^{t}) ^ {-1} = (a^{-1})^{t}\)
因此为了保证逆元存在,我们需要保证\(gcd(a, p) == 1\).
但对于\(p\)不为素数的情况,并不一定可以保证\(gcd(a, p) == 1\),因此需要用到扩展BSGS。
前置知识:\(A \equiv B (mod \quad C) \Longleftrightarrow \frac{A}{d} \equiv \frac{B}{d} (mod \quad \frac{C}{d})\)
假设现在有:\(A^{x} \equiv B (mod \quad C)\)
设\(d = gcd(A, C)\),则\(A = ad, B = bd, C = cd\)。
因为:\(A^{x} = kC + B \Longleftrightarrow d | A^{x}, \quad d | kC, \quad d | (kC + B) \Longrightarrow d | B\)
因此原式为:
$$(ad)^{x} \equiv bd (mod \quad cd)$$
$$a{x}d \equiv bd (mod \quad cd)$$
$$a \cdot a^{x - 1}d^{x - 1} \equiv b (mod \quad c)$$
我们可以一直进行如上变换,直到\(gcd(a, c) == 1\),
假设我们现在进行了k次形如上式的变换,则当前式为:
$$\prod_{i = 1}^ {k}a_{i} \cdot A^{x - k} \equiv \frac{B}{\prod_{i = 1}^{k}d_{i}} (mod \quad \frac{C}{\prod_{i = 1}^{k}d_{i}})$$
其中\(a_{i} = \frac{A}{d_{i}}\),因为每次\(d_{i}\)不一定相同,所以每次\(a_{i}\),也不一定相同。
移项,把除法改成逆元:
$$A^{x - k} \equiv B \cdot (\prod_{i = 1}{k}d_{i}) \cdot (\prod_{i = 1}{k}a_{i}) \quad (mod C \quad \cdot (\prod_{i = 1}{k}d_{i}) {-1})$$
然后把\(B \cdot (\prod_{i = 1}^{k}d_{i})^{-1} \cdot (\prod_{i = 1}^{k}a_{i})^{-1}\)算出来,当做新的\(B\),做BSGS.