BSGS与exBSGS

大步小步(BSGS)#

模板题#

给定 a,b,p 求最小 x 满足 axb(modp) 其中 a,p 互质

求法#

假定 m=px=imj 其中 i,jm

原式可化为 aimjb(modp)

aimbaj(modp)

由于 a,p 互质,显然 a1p1modp 互不相同

我们枚举 j,将 bajmodp 存入 hash

然后枚举 i,从 hash 表里找出第一个 j 满足 aimbaj(modp)

此时 x=imj 即为所求

P3846 [TJOI2007] 可爱的质数/【模板】BSGS#

#include<bits/stdc++.h>
using namespace std;
#define int long long
int a,b,p;
map <int,int> mp;
inline int qpow(int x,int idx){
	if(!idx) return 1;
	int t=qpow(x,idx>>1);
	if(idx&1) return t*t%p*x%p;
	return t*t%p;
}
inline int BSGS(){
	b%=p;
	int t=sqrt(p)+1;
	for(int i=0;i<t;++i)
		mp[b*qpow(a,i)%p]=i;
	a=qpow(a,t);
	if(!a) return !b?1:-1;
	for(int i=1;i<=t;++i){
		int v=qpow(a,i);
		if(mp.find(v)==mp.end()) continue;
		int j=mp[v];
		if(i*t-j>=0) return i*t-j;
	}
	return -1;
}
signed main(){
	scanf("%lld%lld%lld",&p,&a,&b);
	int ans=BSGS();
	if(ans==-1) puts("no solution");
	else printf("%lld\n",ans);
}

exBSGS#

P4195 【模板】扩展 BSGS/exBSGS#

回忆BSGS算法,给定整数a,b,p,其中a,p互质,求方程axb (mod p)的最小整数解x

做法:设x=i×mj,m=p,1jm,1im

方程变为aimjb (mod p)

化一下(am)ib×aj (mod p)

这时只要把(am)ib×aj预处理出来丢到哈希表里就做完了

而现在的a,p不互质了,所以我们要考虑其他的方法,也就是Ex\_BSGS

那么我们设g=gcd(a,p)

根据模的分配率,方程变为axgbg (mod pg)

无解情况就是gb并且b1

我们来证明一下

a=ag,p=pg,那么a=ag,p=pg

代入到原方程中变为(ag)xb (mod pg)

axgx+ypg=b

g(axgx1+yp)=b

这样子g就是b的因子,而只有在b=1时,a0=1,其余情况若gb,方程无解

证毕

那么我们再把上面的式子化一下变为ax1×agbg (mod pg)

pg一定是比p小的,所以可以一直约到a,pg互质

na=i=1kagi

原式就可以写成axkbi=1kg×na(mod pi=1kg)k是做了几次化简

这样子就可以用BSGS求解啦

有一点需要注意,因为是在模意义下运算,所以除以na时要乘其逆元

因为最后一直化到了ai=1kgpi=1kg互质,所以napi=1kg看起来也很互质

就可以用扩欧求逆元了

作者:Into_qwq

出处:https://www.cnblogs.com/into-qwq/p/16492269.html

版权:本作品采用「qwq」许可协议进行许可。

posted @   Into_qwq  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示