BSGS/扩展BSGS
引入:
给出质数 \(p\) 以及 \(b,n\) ,问满足 \(b^x \equiv n\ (mod\ p)\) 的最小 \(x\) 是多少?
如果说 \(p\) 很小,我们就可以直接通过费马小定理枚举 \(1\) ~ \(p-1\)
可惜,\(p<2^{31}\)
那我们就引出今天的主角:BSGS
BSGS 用到了分块的思想
显而易见,\(a^x\) 可以表示为 \(a^{k\sqrt{n}-b}\)
那我们可以考虑先预处理 \(a^1\) ~ \(a^{\sqrt n-1}\)
然后枚举 \(a^{k\sqrt n},k \in \{1,2,3,...,\sqrt n\}\)
查找有没有 \(n*a^j\equiv a^{k\sqrt n}\ (mod\ p)\)
用 hash 表实现即可
扩展:
当 \(b\) 与 \(p\) 不互质时
显然费马小定理就不能正常使用了
那么我们就应该另寻出路
根据同余的性质,我们可以得到
其中 \(d=gcd(a,p)\)
我们可以直观地看出,如果 \(d\not |\ \ n\) 且 \(n\not = 1\),显然x无解(因为 \(n=1\) 时 \(x=0\) 即可)
证明:
-
令 \(a'=\frac{a}{d}\),\(p'=\frac{p}{d}\)
-
原始式子可以转化为 \((a'd)^x\equiv n\ (mod\ p'd)\)
-
可以转化为 \((a'd)^x-k(p'd)=n\)
-
显然等式左边可以提出一个 \(d\),说明 \(d|n\),但这与定义不符
得证
所以我们就可以将 \(a\) 与 \(p\) 一直约到完全互质
令 \(mul=\prod_{i=1}^{k}\frac{a}{d_i}\)
(注意 \(mul\) 用逆元形式)
然后,就用普通 BSGS 做就 OK 了
例题:
没啥思路,czz大佬讲了后才恍然大悟
原式子:\(x_{i+1}\equiv ax_i+b\ (mod\ p)\)
令 \(g(i)=x_i+\frac{b}{a-1}\)
所以 \(g(i+1)=a·g(x)\)
所以我们就要求 \(a^{i-1}\equiv (t+b*(a-1)^{-1})*(x_1+b*(a-1)^{-1})^{-1}\ (mod\ p)\)
大力BSGS即可!
(真的这思路太妙了,有种在做数学题的感觉)