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 = 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.

原文地址:https://www.cnblogs.com/ww3113306/p/10133649.html