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\) 的时候,无解要写得更丰富一点。

posted @ 2023-08-12 22:55  Hypoxia571  阅读(8)  评论(0编辑  收藏  举报