首页 > 其他分享 >BSGS

BSGS

时间:2024-01-26 16:23:32浏览次数:16  
标签:return int pmod cfrac BSGS equiv

BSGS

简介

BSGS(Baby Step, Giant Step)算法,用于解决高次同余方程,即给定整数 \(a,b,p\),其中 \(a \perp p\) (互质),求解最小非负整数 \(x\) 使得 \(a^x \equiv b \pmod p\)。

算法流程

将 \(a^x \equiv b \pmod p\) 化为 \(a^{\lceil \sqrt{p} \rceil \cdot k - s} \equiv b \pmod p\),其中 \(0 \leq k,s \leq \lceil \sqrt{p} \rceil\),因为 \(a^s \perp p\),所以 \(a^{\lceil \sqrt{p} \rceil \cdot k} \equiv a^s \cdot b \pmod p\)。可以思考一下此处构造 \(-s\) 而非构造 \(+s\) 的目的:很显然,是为了方便处理才这么做的。

所以我们就可以使用哈希表预处理 \(a^s \cdot b\),然后再把 \(a^{\lceil \sqrt{p} \rceil \cdot k}\) 丢进去看能否匹配即可。

时间复杂度应该是 \(\mathcal{O(\sqrt{p})}\),如果使用 map 存的话会多一个 \(\log\)。

扩展 BSGS

简介

BSGS 显然只能解决 \(a \perp p\) 时的高次同余方程,那么考虑当 \(a\) 与 \(p\) 不互质的时候该如何处理,只能使用扩展 BSGS 来解决。

算法流程

对于 \(a^x \equiv b \pmod p\),考虑将 \(a,p\) 变成互质的。

我们取 \(d = \gcd(a,p)\),由模运算的性质,可得 \(a^x \cdot \cfrac{a}{d} \equiv \cfrac{b}{d} \pmod {\cfrac{p}{d}}\),如果 \(b,d\) 不互质,那么可以证明无解;如果此时 \(a,\frac{p}{d}\) 仍然不互质,重复上述过程,记录 \(s\) 为次数。注意,此处我们需要进行优化,当 \(\frac{b}{\prod_{i = 1}^{k} d_i} = \frac{a^k}{\prod_{i = 1}^{k} d_i}\),那么此时我们可以退出计算,并返回此时 \(s\) 的值。

经过上述过程,原式可转换为 \(a^{x - k} \cdot \cfrac{a^k}{\prod_{i = 1}^{k} d_i} \equiv \cfrac{b}{\prod_{i = 1}^{k} d_i} \pmod {\cfrac{p}{d}}\),再转换成为 \(a^{x - k} \equiv \cfrac{b}{a^k} \pmod {\cfrac{p}{d}}\)

然后我们就可以把式子扔进 BSGS 里直接计算了。

$\tt{Link}$
il int qmi(int a,int b,int p) {
	int res = 1;
	while (b) {
		if (b & 1) res = res * a % p;
		a = a * a % p;
		b >>= 1;
	}
	return res;
}

il int exgcd(int a,int b,int &x,int &y) {
	if (!b) {
		x = 1; y = 0;
		return a;
	}
	int d = exgcd(b,a % b,y,x);
	y -= a / b * x;
	return d;
}

il int inv(int x,int p) {
	int invv,y;
	int d = exgcd(x,p,invv,y);
	return (invv % p + p) % p;
}

il int BSGS(int a,int b,int p) {
	st.clear();
	int cnt = (int)ceil(sqrt(p * 1.0));
	b %= p;
	rep(i,1,cnt) (b *= a) %= p,st[b] = i;
	int val = qmi(a,cnt,p);
	a = 1;
	rep(i,1,cnt) {
		(a *= val) %= p;
		if (st.count(a)) return (i * cnt - st[a] + p) % p;
	}
	return -1;
}

il int exBSGS(int a,int b,int p) {
	a %= p; b %= p;
	if (b == 1 || p == 1) return 0;
	int d = __gcd(a,p),s = 0,e = 1;
	while (d > 1) {
		if (b % d) return -1;
		b /= d; p /= d; (e *= (a / d)) %= p; ++ s;
		if (b == e) return s;
		d = __gcd(a,p);
	}
	int res = BSGS(a,b * inv(e,p) % p,p);
	if (res == -1) return -1;
	return res + s;
}

标签:return,int,pmod,cfrac,BSGS,equiv
From: https://www.cnblogs.com/songszh/p/17988170/BSGS

相关文章

  • 求解离散对数的方法:BSGS
    离散对数问题:在循环群(循环群的定义见密码协议学习笔记(1.4):密码学的一些数学基础-Isakovsky-博客园(cnblogs.com))$(\mathbb{G},\cdot)$上已知两个元素$g,h\in\mathbb{G}$,求式子$g^x=h$中$x$的值的问题,叫做离散对数问题,亦可记为$x=\log_gh$BSGS(BabyStepGiantStep......
  • exbsgs
    建议看看这篇博客但是可以看看自己的代码,这篇博客里面的Q&A好像有点问题,不一定非要从0开始这篇博客对exbsgs的推导的那个算式的第三排,两遍同时乘以\(\frac{a}{d}\)的逆元,再取个模即可......
  • 【模板】数论基础:exGCD,exCRT,inverse,Lucas,BSGS,primitive root
    7.29数论WIP\(a\equivb\pmodp\Rightarrow\frac{a}{d}\equiv\frac{b}{d}\pmod{\frac{p}{d}},d=\gcd(a,b,p)\)。exGCD若\((a,b)=1\),则\(0\leqx<b\),\(ax\bmodb\)互不相同,有一个是\(1\)。证明:\(ax_1\equivax_2\pmodb\)则\((x_1-x_2)a|b\),因为......
  • BSGS算法
    今天刚学了个算法:BSGS算法(Baby-StepGiant-Step),即大步小步算法。常用于求解离散对数问题。该算法可以在\(O(\sqrtp)\)的时间内求解形如:\(a^{x}\equivb\pmod{p}\)的高次同余方程。问题:P3846[TJOI2007]可爱的质数/【模板】BSGS给定整数\(a,b,p\)互质,求满足\(a^{x}\equ......
  • (ex)BSGS/(扩展)大步小步算法 学习笔记
    (ex)BSGS/(扩展)大步小步算法学习笔记在即将暂时退役之际杀掉了P4195的毒瘤模板题,于是来写篇学习笔记。谨此为我初中三年摆烂的OI生涯画上一个句号。(距离中考还有20天!)BSGSlink求\(a^x\equivb\pmodp\)的非负整数解,其中\(a,p\)互质。算法思路我们不妨令\(t=\lceil{\sqrt{p}......
  • 「学习笔记」模运算与 BSGS 算法
    取模取模符号:\(x\bmody\),表示\(x\)除以\(y\)得到的余数。例如,\[5\bmod3=2\\7\bmod4=3\\3\bmod3=0\\\]设\(x\)为被除数,\(y\)为除数,\(z\)为余数,则\(x=k\cdoty+z,k=\lfloor\dfrac{x}{y}\rfloor\)。模运算\[\left(a+b\right......
  • BSGS以及exBSGS
    ......
  • 浅谈同余3(扩展中国剩余定理,扩展BSGS)
    距离上一篇已经四个月了,我来填坑了上一篇:$浅谈同余2(扩展欧几里得,中国剩余定理,BSGS)$(https://www.cnblogs.com/xyy-yyds/p/17418472.html)0x50扩展BSGS$O(\sqrtn)$【模板】扩展BSGS/exBSGS 题目背景题目来源:SPOJ3105Mod题目描述给定$a,p,b$,求满足$a^x≡b\pmodp......
  • BSGS(大步小步算法)学习笔记
    解决高次同余问题。\(a^x\equivb(\modp)\),其中\(a\)与\(p\)同余。这个形式与欧拉定理类似。思想:meetinthemiddle(折半搜索)。具体的,令\(x=A\timest-B\),且\(x\)一定在\([0,\phi(p))\)的范围内。但是\(p\)是质数时复杂度还是会爆炸。将\(x=A\timest-B\)带入......
  • BSGS 和原根
    写这两个东西是因为SoyTony把它们放到一起写的.目录BabyStepGaintStep离散对数问题光速幂原根相关定义求解应用\[\newcommand{\lcm}[0]{\operatorname{lcm}}\newc......