zoukankan      html  css  js  c++  java
  • 【数论】BSGS

    我们需要解决 (a^x equiv b (mod M)) 的一个解 (x),其中 (a, p) 互质。

    首先,如果有解,那么解一定在 ([0, p]) 这个区间内,根据抽屉原理,(a^x mod p) 只会有 (p - 1) 个取值,故 ([0, p]) 中至少会存在两个相同余数的数,即一定存在一对 (i, j) 满足 (a^iequiv a^j (mod M)),那么在 (i) 之后,(a^i mod M, a^{i + 1} mod M, cdots a^{j} mod M) 这些数会循环出现,故如果有解,那么解一定在 ([0, p]) 这个区间内。

    我们考虑把 (x) 进行拆分,(x=qm-p),其中 (m=leftlfloorsqrt{x} ight floor+1)(q in [1, m])(p in [0, m])

    显然,(qm-p) 可以表示出 (0 sim m) 中的所有数。

    我们把原式修改一下得到 (a^{qm-p} equiv b (mod M))(a^{qm} equiv b imes a^{p} (mod M))

    我们发现 (q)(p) 没有关系了,考虑先 (O(sqrt{x})) 枚举 (p),把 ((b imes a^p) mod M) 放入哈希表(map 也行),然后再 (O(sqrt{x})) 枚举 (a^{qm}),找到最小的 (q) 满足 (a^{qm} mod M) 在哈希表中出现过,那么 (qm+p) 就是最小的答案。

    code

    扩展 BSGS

    我们要解决的还是 (a^xequiv b (mod p)) 这个问题,只是不满足 (a)(p) 互质。

    (a)(p) 互质,那么就会存在逆元,可以将 (x) 分解为 (qm - p) 来求解,所以我们要想办法让 (a, p) 变得互质。

    我们考虑把这个式子转化为不定方程,(a^x -yp = b),首先,我们求出 (d_1=gcd(a, p)),然后整个式子都除以 (d_1),若 (b)(d_1) 互质,那么就无解,否则我们继续求出 (d_2=gcd(a, p)),一直进行下去,直到 (a)(p) 互质。

    假设进行了 (k) 次,最后得到式子就是 (dfrac{a^k}{prodlimits_{i=1}^{k}d_i} imes a^{x-k}-dfrac{yp}{prodlimits_{i=1}^{k}d_i}=dfrac{b}{prodlimits_{i=1}^{k}d_i}),其中 (a)(p) 互质。

    我们再化为同余方程的形式,(dfrac{a^k}{prodlimits_{i=1}^{k}d_i} imes a^{x-k}equiv dfrac{b}{prodlimits_{i=1}^{k}d_i} (mod dfrac{p}{prodlimits_{i=1}^{k}d_i})),显然,求出 (dfrac{a^k}{prodlimits_{i=1}^{k}d_i}) 的逆元,然后直接移到右边,直接用 BSGS 来解决,然后最后把答案加上 (k) 即可。

    注意,不保证答案小于 (k) 的情况,故在消因子前做一下 (O(k)) 枚举,直接验证 (a^i equiv b (mod p)),就能避免这种情况。

    code

  • 相关阅读:
    电视盒子通过adb安装第三方应用
    采用网闸隔离的内外网如何进行数据的即时交互?
    数据结构-python-二叉树
    Python+uiautomator2写安卓手机脚本前期准备
    centos6.5离线rpm安装mysql
    centos7 nginx 启动脚本
    zabbix简单改造为免密登陆
    vue生命周期函数
    mysql 深入问题了解
    9. 回文数.py
  • 原文地址:https://www.cnblogs.com/chzhc-/p/13572209.html
Copyright © 2011-2022 走看看