普通 B S G S BSGS BSGS 有一个缺点,就是当 gcd ( n , p ) ≠ 1 \gcd(n,p) \not = 1 gcd(n,p)=1 时,他不能用。
于是就出现了扩展 B S G S BSGS BSGS。
前置知识
普通 B S G S BSGS BSGS。
扩展欧几里得算法。
算法用途
用于求解 gcd ( n , p ) ≠ 1 \gcd(n,p) \not=1 gcd(n,p)=1 时, n x ≡ m ( m o d p ) n^x \equiv m \pmod p nx≡m(modp) 的方程
(除了 x x x 都是常数)
算法复杂度
时间
?
空间
?
算法实现
我们先把 n x ≡ m ( m o d p ) n^x \equiv m \pmod p nx≡m(modp) 转化成
n x − 1 × n + k q = m n^{x-1} \times n + kq = m nx−1×n+kq=m
可以看成 a n + b q = m an + bq = m an+bq=m,就是二元一次不定方程的,设 d = gcd ( n , q ) d = \gcd(n, q) d=gcd(n,q)
根据扩欧, d ∣ m d~|~m d ∣ m,否则无解。
所以,可以把原式变成
n
x
−
1
×
n
d
+
k
q
d
=
m
d
n^{x-1} \times \frac{n}{d} + k\frac{q}{d} = \frac{m}{d}
nx−1×dn+kdq=dm
如果
gcd
(
n
,
q
d
)
≠
1
\gcd(n, \frac{q}{d}) \not= 1
gcd(n,dq)=1,就继续进行,如下
n x − 2 × n d × n d 2 + k q d × d 2 = m d × d 2 n^{x-2} \times \frac{n}{d} \times \frac{n}{d_2} + k\frac{q}{d \times d_2} = \frac{m}{d \times d_2} nx−2×dn×d2n+kd×d2q=d×d2m
一直到 gcd ( n , q ) = 1 \gcd(n, q) = 1 gcd(n,q)=1,设进行了 a a a 次,中间所有最小公因数的乘积为 b b b。得到
n x − a × n a b + k q b = m b n^{x-a} \times \frac{n^a}{b} + k\frac{q}{b} = \frac{m}{b} nx−a×bna+kbq=bm
为了方便表示,就可以转换回。
n x − a × n a b ≡ m b ( m o d k q b ) n^{x-a} \times \frac{n^a}{b} \equiv \frac{m}{b} \pmod {k\frac{q}{b}} nx−a×bna≡bm(modkbq)
然后用普通 B S G S BSGS BSGS 搞定就行了。