zoukankan      html  css  js  c++  java
  • 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.

  • 相关阅读:
    Angularjs html文本显示
    .net与.net core学习目录
    数据库学习目录
    WCF学习目录
    sql学习目录
    EF学习目录
    git for Windows
    图谱论(Spectral Graph Theory)基础
    2017机器学习相关会议时间
    数值分析教材统计
  • 原文地址:https://www.cnblogs.com/ww3113306/p/10133649.html
Copyright © 2011-2022 走看看