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\) 不互质时

显然费马小定理就不能正常使用了

那么我们就应该另寻出路

根据同余的性质,我们可以得到

\[a^{x-1}·{\frac{a}{d}} \equiv \frac{n}{d}\ (mod\ \frac{p}{d}) \]

其中 \(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\) 一直约到完全互质

\[a^{x-k}\prod_{i=1}^{k}\frac{a}{d_i}\equiv \frac{n}{\prod_{i=1}^{k}d_i}\ (mod\ \frac{p}{\prod_{i=1}^{k}d_i}) \]

\(mul=\prod_{i=1}^{k}\frac{a}{d_i}\)

\[a^{x-k}\equiv \frac{n}{\prod_{i=1}^{k}d_i}·mul^{-1}\ (mod\ \frac{p}{\prod_{i=1}^{k}d_i}) \]

(注意 \(mul\) 用逆元形式)

然后,就用普通 BSGS 做就 OK 了

代码


例题:

[SDOI2013] 随机数生成器

没啥思路,czz大佬讲了后才恍然大悟

原式子:\(x_{i+1}\equiv ax_i+b\ (mod\ p)\)

\[x_{i+1}+\frac{b}{a-1}\equiv ax_i+b+\frac{b}{a-1}\equiv a(x_i+\frac{b}{a-1}) \]

\(g(i)=x_i+\frac{b}{a-1}\)

所以 \(g(i+1)=a·g(x)\)

\[g(i)=a^{i-1}·(x_1+\frac{b}{a-1}) \]

所以我们就要求 \(a^{i-1}\equiv (t+b*(a-1)^{-1})*(x_1+b*(a-1)^{-1})^{-1}\ (mod\ p)\)

大力BSGS即可!

(真的这思路太妙了,有种在做数学题的感觉)

代码

posted @ 2022-03-10 13:23  zuytong  阅读(19)  评论(0编辑  收藏  举报