拓展BSGS算法

扩展BSGS算法(ExBSGS)

ExBSGS算法用于解决离散对数问题,以解出关于x的同余方程的最小非负整数解:
a x ≡ b ( m o d m ) a^x\equiv b\pmod m axb(modm)

不保证 m ⊥ a m\perp a ma

ExBSGS算法的做法是:

a ⊥̸ m a\not\perp m am,则同余方程等价于不定方程 a ⋅ a x − 1 + m ⋅ y = b a\cdot a^{x-1}+m\cdot y=b aax1+my=b,根据裴蜀定理,若 gcd ⁡ ( a , m ) ∣ b \gcd(a,m)|b gcd(a,m)b,有解,此时根据技巧,有 a g ⋅ a x − 1 ≡ b g ( m o d    m g ) \frac a g\cdot a^{x-1}\equiv \frac b g\left(\mod \frac m g\right) gaax1gb(modgm),否则无解。

然后此时 a g ⊥ m g \frac a g \perp \frac m g gagm,有逆元,除过去:
a x − 1 ≡ b g ( a g ) − 1 ( m o d    m g ) a^{x-1}\equiv \frac b g \left(\frac a g\right)^{-1}\left(\mod \frac m g\right) ax1gb(ga)1(modgm)

a a a m g \frac m g gm仍不互质,就再除。直到互质,就变成了BSGS问题。很轻松求解出 x x x,最终答案就是 x + 除了多少次 x+除了多少次 x+除了多少次

因此有递归函数:
E x B S G S ( a , b , m ) = { a ⊥ m :                                                                                                                        B S G S ( a , b , m ) { g c d ( a , m ) ∣ b : E x B S G S ( a , b g ⋅ ( a g ) − 1    ( m o d    m g ) , m g ) + 1 e l s e :                                                                                                                                                      无解 ExBSGS(a,b,m)=\left\{\begin{matrix} a\perp m:\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;BSGS(a,b,m)\\ \left\{\begin{matrix} gcd(a,m)|b:ExBSGS\left(a,\frac b g \cdot \left(\frac a g\right)^{-1}\;\left(mod\;\frac m g\right),\frac m g\right)+1\\ else : \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;无解 \end{matrix}\right. \end{matrix}\right. ExBSGS(a,b,m)= am:BSGS(a,b,m) gcd(a,m)b:ExBSGS(a,gb(ga)1(modgm),gm)+1else:无解

还有一种做法是,直接把 a g \frac a g ga留在左边,作为 B S G S BSGS BSGS a x a^x ax的系数,也是可以的。

时间复杂度 O ( l o g 2 n + n ) = O ( n ) O(log^2n+\sqrt n)=O(\sqrt n) O(log2n+n )=O(n )

后记

于是皆大欢喜。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值