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.

posted @ 2018-12-17 20:20  ww3113306  阅读(149)  评论(0编辑  收藏  举报
知识共享许可协议
本作品采用知识共享署名-非商业性使用-禁止演绎 3.0 未本地化版本许可协议进行许可。