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

  • 相关阅读:
    获取android手机内所有图片
    进程、线程与任务程序之间的关系
    wife的简单使用(一个简单的例子)
    [转载]mode_t等系统数据类型
    双调欧几里得旅行商问题
    HDU OJ分类
    CLRS2.4__逆序对
    [转载] Android 2.3.3 API 读取通讯录中电话号码的实例
    [转]有关TinyXML使用的简单总结
    ARG_MAX问题
  • 原文地址:https://www.cnblogs.com/ww3113306/p/10133649.html
Copyright © 2020-2023  润新知