BabyStep,GiantStep
求解高次同余方程。
给定整数 \(a,b,p\),其中 \(a\bot p\),求一个非负整数 \(x\),使得 \(a^x\equiv b\pmod{p}\)
因为 \(a\bot p\),可以乱搞。
令 \(t=sqrt(q)+1\),这里是 c++ 意义上的(雾。
然后搞一波 \(x=it-j\),其中 \(0\leq j <t\)。
那么,\(a^{it-j}\equiv b\pmod p\) 也就是 \((a^t)^i\equiv b*a^j\pmod p\) 啦。
枚举 \(j\) 算数插到 hash|map 里面,再枚举 \(i\) 康康有没有答案。
就是说循环节大概就 \(\phi(p)\) 的样子,所以 \(i\) 枚举到大概 \(\sqrt p\)(?
int bsgs(int a,int b,int p) {
// a^x=b(mod p)
map<int,int> hsh;
hsh.clear(), b%=p;
int t=sqrt(p)+1, mul=1, qwq=1;
for(int i=0; i<t; ++i) {
int v=b*mul%p;
hsh[v]=i, mul=mul*a%p;
}
if(a==0) return b==0?1:-1;
for(int i=0; i<=t; ++i) {
int j=hsh.find(qwq)==hsh.end()?-1:hsh[qwq];
if(j>=0&&i*t-j>=0) return i*t-j;
qwq=qwq*mul%p;
}
return -1;
}
不保证 \(a\bot p\) 的时候,无解要写得更丰富一点。