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 = ksqrt{p} + l)使得(a^x = b),因此可以直接枚举k,于是有:
$$a^x = a^{ksqrt{p}} cdot a^l = b$$
$$a^l = frac{b}{a^{ksqrt{p}}} = b cdot (a^{ksqrt{p}})^{-1}$$
所以每次枚举k,如果可以在map内部找到(b cdot (a^{ksqrt{p}})^{-1}),那么就找到了一组合法的(k)和(l),于是就找到了一个合法解
扩展BSGS:
但是注意到在算法中,需要求((a^{ksqrt{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^{x} 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})^{-1} cdot (prod_{i = 1}^{k}a_{i})^{-1} 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.