扩展BSGS算法(ExBSGS)
ExBSGS算法用于解决离散对数问题,以解出关于x的同余方程的最小非负整数解:
a
x
≡
b
(
m
o
d
m
)
a^x\equiv b\pmod m
ax≡b(modm)
不保证 m ⊥ a m\perp a m⊥a。
ExBSGS算法的做法是:
若 a ⊥̸ m a\not\perp m a⊥m,则同余方程等价于不定方程 a ⋅ a x − 1 + m ⋅ y = b a\cdot a^{x-1}+m\cdot y=b a⋅ax−1+m⋅y=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) ga⋅ax−1≡gb(modgm),否则无解。
然后此时
a
g
⊥
m
g
\frac a g \perp \frac m g
ga⊥gm,有逆元,除过去:
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)
ax−1≡gb(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)=⎩
⎨
⎧a⊥m: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)
后记
于是皆大欢喜。