上一篇:
B
S
G
S
算
法
\rm BSGS算法
BSGS算法
建议先看完上一篇再来看这篇,否则可能就毫无阅读体验了QAQ
本篇虽然是转载文章,但是作者根据自己的理解修改了一些内容。
EXBSGS 算 法 \texttt{EXBSGS}算法 EXBSGS算法可以解决 p p p 不为质数的情况。
还是这个式子:
a
x
≡
b
(
m
o
d
p
)
a^x\equiv b \pmod p
ax≡b(modp)
设
d
=
gcd
(
a
,
p
)
d=\gcd(a,p)
d=gcd(a,p)
- 如果 d ∤ b d\nmid b d∤b ,唯一可能的解是 x = 0 x=0 x=0 。如果 b = 1 b=1 b=1 ,方程有解。
- 如果 d ∣ b d\mid b d∣b 且 d = 1 d=1 d=1 ,这时 a , p a,p a,p 互质,直接用 BSGS \text{BSGS} BSGS 解即可。
- 如果
d
∣
b
d \mid b
d∣b 且
d
≠
1
d≠1
d=1 ,这种情况要重点讨论:
∵ a x ≡ b ( m o d p ) \because a^x\equiv b \pmod p ∵ax≡b(modp)
∴ a x − 1 × a d ≡ b d ( m o d p d ) \therefore a^{x-1} \times \frac ad \equiv \frac bd \pmod{\frac pd} ∴ax−1×da≡db(moddp)
也就是 a x − 1 ≡ b a ( m o d p d ) a^{x-1}\equiv \frac ba \pmod {\frac pd} ax−1≡ab(moddp)
a x − 1 ≡ b × a − 1 ( m o d p d ) a^{x-1}\equiv b\times a^{-1} \pmod {\frac pd} ax−1≡b×a−1(moddp)
这个时候,我们发现式子又变成了 a x ≡ b ( m o d p ) a^x\equiv b \pmod p ax≡b(modp) 的形式,而且规模也变小了。
于是我们接着做下去,不断重复上述操作。
设 k k k 次后 a , p a,p a,p 互质,那么这时就可以停止操作了。我们记第 i i i 次时求出的 d d d 为 d i d_i di。
此时,方程就可以写成 a x − k ≡ b × a − k ( m o d p ∏ i = 1 k d i ) a^{x-k}\equiv b\times a^{-k} \pmod {\frac p{\prod_{i=1}^k d_i}} ax−k≡b×a−k(mod∏i=1kdip) 。
我们已经达到了自己的目的:式子变成了 a x ≡ b ( m o d p ) a^x\equiv b \pmod p ax≡b(modp) 的形式,并且式子中 a , p a,p a,p 两部分互质。于是就可以用 BSGS \text{BSGS} BSGS 解这个方程了。
然而 x − k x-k x−k 并不能是负的,所以先暴力枚举 x < k x<k x<k 的情况,如果此范围内无解再套用 B S G S \rm BSGS BSGS 解方程。显然,算出来的解 x ′ = x − k x'=x-k x′=x−k ,真正的答案 x x x 就等于 x ′ + k x'+k x′+k 。
时间复杂度就是 枚 举 + B S G S 枚举+\rm BSGS 枚举+BSGS 的复杂度。容易发现 k ≤ log b k \le \log b k≤logb ,所以算法的时间复杂度就是 O ( log b + p ) \mathcal O(\log b +\sqrt p) O(logb+p) 。