(扩展)BSGS与高次同余方程
前言: 今天更BSGS算法。俗称大步小步算法(Big-Step G…-Step),又称拔山盖世、北上广深、 白色狗屎 。 问题: 求解指数同余方程: a x ≡ b ( m o d p ) a^{x}\equiv b(mod\; p) a x ≡ b ( m o d p ) 的最小自然数解。 BSGS算法: 模板题 这个算法只考虑 g c d ( a , p ) = 1 gcd(a,p)=1 g c d ( a , p ) = 1 的情况。 那么,怎么做呢。 其实做法很简单,就是 枚举 。 先来一种 暴力枚举 。 就是枚举 x x x 从 [ 0 , p − 1 ] [0,p-1] [ 0 , p − 1 ] ,然后检验答案是否正确。 知道欧拉定理的应该知道只要枚举到 φ ( p ) − 1 \varphi(p)-1 φ ( p ) − 1 ,但 p p p 为质数时欧拉函数仍为 p − 1 p-1 p − 1 。 看过 阶与原根 的应该知道只要枚举到 p p p 的阶即可,但算 p p p 的阶仍然要暴力去枚举。 所以这里只要一个一个枚举过去便好。 但是 o ( p ) o(p) o ( p ) 的暴力枚举配不上这么高大上的名字,所以还有优化的余地。 我们可以考虑 折半枚举 。 怎么折半,就是这个算法的精髓了。 我们令 x = k n + i x=kn+i x = k n