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...