大步小步(bsgs)算法详解

大步小步(Baby Step,Giant Step,BSGS)算法,用来求解类似于 a x ≡ b ( m o d a^x≡b(mod axb(mod p ) p) p)的问题,其中 a a a b b b p p p已经给出,本算法只能解决 p p p为素数的问题。

m = c e i l ( s q r t ( p ) ) m=ceil(sqrt(p)) m=ceil(sqrt(p)) x = i ∗ m − j x=i*m-j x=imj,则 a i ∗ m − j ≡ b ( m o d a^{i*m-j}≡b(mod aimjb(mod p ) p) p),同乘 a j a^j aj可得 ( a m ) i ≡ b ∗ a j ( m o d {(a^{m})}^{i}≡b*a^j(mod (am)ibaj(mod p ) p) p)

接下来考虑枚举所有的 j ∈ [ 0 , m − 1 ] j ∈ [0,m-1] j[0,m1],将 b ∗ a j b*a^j baj m o d mod mod p p p加入哈希表(可用map)中,再枚举 i ∈ [ 0 , m ] i ∈ [0,m] i[0,m],计算出 ( a m ) i {(a^{m})}^{i} (am)i m o d mod mod p p p,在哈希表中找出对应的 j j j并更新答案,这样 x x x就可以算出了,方程的解也可以求出。

时间复杂度 O ( s q r t ( p ) ) O(sqrt(p)) O(sqrt(p)) 1 0 16 10^{16} 1016以下都没有问题。

例题:abc270g,

posted @ 2022-11-15 21:18  zswangziye  阅读(44)  评论(0编辑  收藏  举报