BSGS(拔山蓋世演算法),北上廣深演算法

2021-08-22 19:39:23 字數 1140 閱讀 6210

1.引入

bsgs演算法又名拔山蓋世演算法,也叫北上廣深演算法,也叫大步小步演算法,總之就是名字很多了,但是實際上他就是乙個解決同餘方程 給定a,b,p,求最小的非負整數x,滿足  ax ≡ b(mod p)。

2.過程

先令 x = i*m-j,其中 m=ceil(sqrt(p)),ceil是向上取整。

這樣原式就變為     ai*m-j = b (mod p),

移項就變成了        ai*m = b*aj (mod p)

列舉j (範圍0-m) ,將 b*aj  存入hash表。

列舉i (範圍1-m) ,從hash表中尋找第乙個滿足ai*m = b*aj  (mod p)。

此時   x = i*m-j  就是所要求的。

3.原因:

先令 x = i*m-j,其中 m=ceil(sqrt(p)),ceil是向上取整。

這樣原式就變為     ai*m-j = b (mod p),

移項就變成了        ai*m = b*aj (mod p)

列舉j (範圍0-m) ,將 b*aj  存入hash表。

列舉i (範圍1-m) ,從hash表中尋找第乙個滿足ai*m = b*aj  (mod p)。

此時   x = i*m-j  就是所要求的。

模板

#include#include#include#include#include#include#define ll long long

using namespace std;

mapmp;

ll pow(ll a,ll b,ll mod)

return ans;

}int main()

int flag=0;

ll m=ceil(sqrt(c));

ll ans;

for(int i=0;i<=m;i++)

ans=(ans*a)%c;

mp[ans]=i;

}ll cur=pow(a,m,c);

ans=1;

for(int i=0;i<=m;i++)

}if (!flag)

printf("no solution\n");

}return 0;

}

(擴充套件)BSGS

texttt 即大步小步法,用於求解關於 x 的形如 a x equiv n bmod p 的高次不定方程的最小非負整數解,其中 a,b,p 為已經給出的常數且 a,p 互質。眾所周知bsgs 北上廣深 拔山蓋世 設 x a lceil sqrt rceil b 其中 0 leq a,b leq l...

BSGS學習筆記

用於求 a x equiv b pmod 高次方程的最小正整數解 x 其中 c 為素數 引理1 a equiv a i pmod p p 為素數,即 a i 在模 p 的意義下會出現迴圈節 注 varphi p 可能不是最小迴圈節 因為 a equiv 1 pmod p 則 a equiv 1 pm...

演算法 BSGS演算法

bsgs演算法用於求解關於x的模方程 a x equiv b mod p p為質數 相當於求模意義下的對數。思想 由費馬小定理,a equiv 1 mod p 在p 1次方後開始迴圈,所以若原方程有解,x in 0,p 1 設 x i m j 有 a equiv b mod p 移項得 i equi...