关于BSGS算法

BSGS算法初探 前言 BSGSBSGSBSGS算法,全称Baby Step Giant StepBaby\ Step\ Giant\ StepBaby Step Giant Step,即大小步算法。某些奆佬也称其为拔(Ba)山(Shan)盖(Gai)世(Shi)算法。 它的主要作用是求解形式如xt≡y(mod& 阅读详情

关于BSGS算法

文章中提到的p,如果不加说明则默认为素数。
BSGS算法适用于在求解形如ax≡b(modp)a^x\equiv b \pmod pax≡b(modp)的不等式。

可知0≤x<p0\le x<p0≤x<p,那么可以令x=A⌈p⌉−B,0<=A,B<=⌈p⌉x=A\lceil\sqrt{p}\rceil-B,0<=A,B<=\lceil\sqrt{p}\rceilx=A⌈p​⌉−B,0<=A,B<=⌈p​⌉
所以原问题转换成
aA⌈p⌉−B≡b mod pa^{A\lceil\sqrt{p}\rceil-B}\equiv b\bmod p\newlineaA⌈p​⌉−B≡bmodp
即
aA⌈p⌉≡b∗aB mod pa^{A\lceil\sqrt{p}\rceil}\equiv b*a^B\bmod paA⌈p​⌉≡b∗aBmodp

在O(sqrt(p ))内枚举等式右边的值并储存到哈希表中,然后在O(sqrt(p ))内枚举等式左边的值并在哈希表内查询,等式成立,则有x=A⌈p⌉−Bx=A\lceil\sqrt{p}\rceil-Bx=A⌈p​⌉−B$。

BSGS算法也可以处理形如xi+1≡a∗xi+b(modp),求t≡xansx_{i+1}\equiv a*x_i+b \pmod{p} , 求t\equiv x_{ans}xi+1​≡a∗xi​+b(modp),求t≡xans​
之类的问题,只需将上述数列转换成等比数列
xi+1+ba−1≡a∗(xi+ba−1)(modp),a>1x_{i+1}+\frac{b}{a-1}\equiv a*(x_i+\frac{b}{a-1}) \pmod{p},a>1 xi+1​+a−1b​≡a∗(xi​+a−1b​)(modp),a>1
那么
xn+ba−1≡an−1(x1+ba−1)(modp)x_{n}+\frac{b}{a-1}\equiv a^{n-1}(x_1+\frac{b}{a-1}) \pmod{p} xn​+a−1b​≡an−1(x1​+a−1b​)(modp)
因为要求t≡xanst\equiv x_{ans}t≡xans​ ,所以上述等式可以转化为
(t+ba−1)∗rev(x1+ba−1)≡aans−1(modp)(t+\frac{b}{a-1})*rev(x_1+\frac{b}{a-1})\equiv a^{ans-1} \pmod{p} (t+a−1b​)∗rev(x1​+a−1b​)≡aans−1(modp)
只有ans是未知的,所以转化为文章开头所讲的问题。

要注意如果x1+ba−1=0x_1+\frac{b}{a-1}=0x1​+a−1b​=0的话,则没有逆元。这种情况同a<1的情况需要特殊处理。

当然BSGS算法经过一些改动可以处理p不为素数的情况,但本文不敞开论述。

附上一道题目
SDOI 2013(随机数生成器)
AC代码如下:

#include<bits/stdc++.h>//注意0不在乘法群中,因为0元没有逆元 
using namespace std;
const int max_n=1e6;
const int HashMod=1e5;
typedef long long ll;
struct Hash_Map{
	struct Line{int k;int v;int next;}e[max_n];
	int HashMap[HashMod],cnt;
	void init(void)
	{
		memset(HashMap,-1,sizeof(HashMap));
		cnt=0;
	}
	void add(int key,int value,int hashkey)
	{
		e[cnt++]=Line{key,value,HashMap[hashkey]};
		HashMap[hashkey]=cnt-1;
	}
	void insert(int key,int value)
	{
		add(key,value,key%HashMod);
	}
	int find(int key)
	{
		for(int i=HashMap[key%HashMod];i!=-1;i=e[i].next)
		if(e[i].k==key)return e[i].v;
		return -1;
	}
}mp;
ll qpow(ll a,ll n,ll p)
{
	ll ans=1;
	while(n)
	{
		if(n&1)ans=ans*a%p;
		a=a*a%p;
		n>>=1;
	}
	return ans;
}
void exgcd(ll a,ll b,ll &x,ll &y)
{
	if(!b){
		x=1,y=0;return ;
	}
	else{
		exgcd(b,a%b,y,x);y-=(a/b)*x;return ;
	}
}
ll rev(ll a,ll p)
{
	ll t,t0;
	exgcd(a,p,t,t0);
	return (t+p)%p;
}
ll BSGS(ll a,ll b,ll p)
{
	a%=p;b%=p;
	if(b==1)return 0;
	mp.init();
	ll m=ceil(sqrt(p));
	for(ll i=0,ret=b;i<=m;i++)
	{
		mp.insert(ret,i);
		ret=ret*a%p;
	}
	ll t=qpow(a,m,p);
	for(ll i=1,ret=t;i<=m;i++)
	{
		int f=mp.find(ret);
		if(f>=0)return i*m-f;
		ret=ret*t%p;
	}
	return -1;
}
int main(void)
{
	freopen("out.txt","w",stdout);
	int t0;
	scanf("%d",&t0);
	ll p,a,b,x,t;
	while(t0--)
	{
		scanf("%lld%lld%lld%lld%lld",&p,&a,&b,&x,&t);
		a%=p;b%=p;t%=p;x%=p;
		ll ans;
		if(a==0){
			if(t==x)ans=1;
			else if(t==b)ans=2;
			else ans=-1;
		}
		else if(a==1&&b!=0){
			ans=(((t-x)+p)%p*rev(b,p)%p+1)%p;
			if(!ans)ans=p;
		}
		else if(a==1&&b==0){
			if(x==t)ans=1;
			else ans=-1;
		}
		else if(a>1){
			int temp=b*rev(a-1,p)%p;
			if(x+temp==0){
				if(t==0)ans=0;
				else ans=-1;
			}
			else ans=BSGS(a,(t+temp)%p*rev(x+temp%p,p)%p,p);
			if(ans!=-1)ans+=1;
		}
		printf("%lld\n",ans);
	}
	fclose(stdout);
	return 0;
}
【SGU 261】BSGS算法详解 BSGS(baby-step gaint-step),大步小步算法,该算法可以在时间复杂度内求解 算法描述 我们令,,这样我们可以保证 由于我们知道,我们可以先枚举B算出右边,存在一个hash表里面,然后再枚举A计算左边的的值,然后去判断hash表里面是否... 阅读详情

相关推荐

MTK metadata中AF模块的移除与配置调整

本文详细介绍了在MTK平台Camera开发中如何移除metadata中的AF(自动对焦)模块。通过系统清理MTK_CONTROL_AF_REGIONS、MTK_CONTROL_MAX_REGIONS等关键配置项,并调整对焦模式及硬件特性声明,确保定制化设备在禁用自动对焦功能后的稳定运行。

q1w3e5r7t9y的博客 570

BSGS

大步小步算法 BSGS(baby steps giant steps) BSGS是用来解决离散对数问题的,即ax≡b(modp)a^x \equiv b \pmod pax≡b(modp)。其中,a,b,p已知,且a和p互质,求x。根据欧拉定理,我们知道aϕ(p)≡1(modp)a^{\phi(p)} \equiv 1 \pmod paϕ(p)≡1(modp),所以,而ϕ(p)&lt;p\...

hefenghhhh的专栏 1248

solidworks实体显示线框

solidworks实体莫名其妙显示为有点虚的线框

qq_35858902的博客 1万+

BSGS算法 学习笔记

转载:https://blog.youkuaiyun.com/clove_unique/article/details/50740412 引入 BSGS算法,原名Baby Steps Giant Steps,又名大小步算法,拔山盖世算法,北上广深算法——by SLYZoier,数论基本算法之一。 问题 题解 讨论 模板:(map版本) ll bsgs(ll a,ll b,ll p)...

passer__的博客 1016

VS2015+C++实战:手把手教你用海康MVS里的Demo搞定多相机同步采图与保存

本文详细解析了在VS2015+C++环境下,利用海康威视MVS工业相机SDK实现多相机同步采图与保存的全流程。从环境准备、SDK选择到多相机初始化、同步采图方案,再到异常处理与性能优化,提供了实战技巧和代码示例,帮助开发者快速掌握工业相机二次开发的核心技术。

weixin_29170327的博客 280

iPhone用户必看:TrollStore巨魔商店在线安装保姆级教程(iOS 14-16.6.1适用)

本文为iOS 14至16.6.1系统的iPhone用户提供了一份详细的TrollStore(巨魔商店)在线安装教程。文章从核心原理、安装前准备讲起,逐步详解了通过Safari浏览器获取安装器、信任企业证书、部署TrollStore及关键后置配置的全过程,并附带了常见问题排错指南,帮助用户安全、高效地实现无需越狱安装第三方应用。

h0i1j2k3l的博客 1986

【数论】BSGS算法(大步小步算法)

本篇介绍数论中的 bsgs 算法,包括算法引入、算法过程、算法模板、简单例题及详解

Wmiracle的博客 1万+

西门子smart能搜到cpu但连接当前IP地址失败

将ip地址改到同一网段 本机为192.168.1.119就是192.168.1.1网段,但plc在192.168.0.1网段,所以显示ip连接失败,改为同一网段192.168.1.xxx即可(为避免ip冲突尽量改到200往后最大255)如果显示这一步,那么你的物理连接是没有问题的,应当是plc和电脑并不在同一网段导致的问题。输入ipconfig 查看本机网段与plc是否为同一网段。此电脑就不在同一网段所有造成通讯失败,接下来解决这个问题。win+r打开运行,打开cmd。再次尝试,如果还是报错,那么。

weixin_62678581的博客 9864

BSGS算法

大步小步算法 BSGS(baby steps giant steps) BSGS是用来解决离散对数问题的,即ax≡b(modp)a^x \equiv b \pmod pax≡b(modp)。其中,a,b,p已知,且a和p互质,求x。根据欧拉定理,我们知道aϕ(p)≡1(modp)a^{\phi(p)} \equiv 1 \pmod paϕ(p)≡1(modp),而ϕ(p)<p\phi(p)<pϕ(p)<p,所以,采用枚举法,我们可以在O(p)O(p)O(p)时间复杂度求出x。 BSGS可以

DeepStarSky的博客 2095

MATLAB实战:5步搞定铣削稳定性叶瓣图(附完整代码解析)

本文提供了一份基于MATLAB的铣削稳定性叶瓣图实战指南。通过5个清晰步骤,从动力学原理出发,详细解析了利用半离散法构建稳定性判据、模块化代码设计、高效参数扫描及高级可视化的完整流程,并附有完整代码,帮助工程师快速预测和规避加工颤振,优化铣削工艺参数。

weixin_29197051的博客 194

SAP GR(Group Reporting)配置篇(一)

GUI组报表的SAP S4HANA1.1全局参数1.1.1 检查全球系统设置菜单路径组报表的SAP S4HANA>合并的全局设置>检查全球系统设置事务代码CXB3说 明定义好分类账、版本、合并科目表后,重新设置。1.2主数据1.2.1定义合并分类账菜单路径组报表的SAP S4HANA>主数据>定义合并分类账事务代码CXL2说 明复制的Y1合并分类账,集团货币为CNY。此功能对分类账进行设置,应用到集团货币分类。

weixin_43853754的博客 1700

一篇搞懂BSGS与扩展BSGS算法

朴素BSGS:适用于aaa与ppp互质的离散对数问题,时间复杂度OpOp​,核心是分块查找;扩展BSGS:通过逐步约分处理aaa与ppp不互质的情况,递归转化为朴素BSGS可解的形式,时间复杂度仍为OpOp​;应用场景:数论题目中涉及“求指数”的问题,如模方程求解、密码学中的离散对数问题(OI中常见于NOIP提高组或省选难度题目)

wz150432的博客 908

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【算法讲25:BSGS】BSGS与扩展BSGS

【算法讲25:BSGS】引入BSGS代码扩展BSGSExBSGS递归版代码非递归版 yjw的博客入口 引入 P3846 [TJOI2007] 可爱的质数/【模板】BSGS 给定一个质数 ppp 以及整数 a、ba、ba、b 你需要给出最小的非负整数 xxx,满足: ax≡b(modp) a^x\equiv b\pmod p ax≡b(modp) 或输出无解。 2≤a,b<p<2312\le a,b<p<2^{31}2≤a,b<p<231 BSGS 全称为 Bab

溢流眼泪的博客 742

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

扩展BSGS算法

先来康康这个问题。 给定三个正整数A,B,PA,B,PA,B,P,求关于xxx的方程的最小正整数解: Ax≡B(mod P)A^x\equiv B(mod\ P)Ax≡B(mod P) 我们令x=a⌈P⌉−b,a∈N,b∈Nx=a\lceil \sqrt{P}\rceil-b,a \in N,b \in Nx=a⌈P​⌉−b,a∈N,b∈N 由欧拉定理: Aϕ(P)≡1(mod...

C20181503csy的博客 742

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

bsgs算法

bsgs算法 bsgs算法,又称大小步算法(某大神称拔山盖世算法)。 主要用来解决   A^x=B(mod C)(C是质数),都是整数,已知A、B、C求x。(poj 2417 Discrete Logging ) 具体步骤如下: 先把x=i*m-j,其中m=ceil(sqrt(C)),(ceil是向上取整)。 这样原式就变为A^(i*m-j)=B(mod C), 再变为A^j

clover_hxy的博客 3万+

BSGS算法 扩展BSGS算法 模板

BSGS算法 可以快速的求出,满足a^x ≡ b(mod p)的最小的非负整数x (p必须为质数,即 gcd(a,p) == 1) 我们先将x拆分成i*m-j的形式(其中m为sqrt(p)向上取整的值,则原式化为 ≡ b (mod p) ) 显然 0<=j<m 1<=i<=m 移向后得 ≡ b*(mod p) 我们从 0-m 枚举 j,并将 ...

StarrYooSkY的博客 623

【算法】BSGS算法

BSGS算法 BSGS算法用于求解关于x的模方程\(A^x\equiv B\mod P\)(P为质数),相当于求模意义下的对数。 思想: 由费马小定理,\(A^{p-1}\equiv 1\mod P\),在p-1次方后开始循环,所以若原方程有解,\(x_{min}\in[0,P-1]\)。 设\(x=i*m+j\),有\(A^{i*m+j}\equiv B\mod P\),移项得\({(...

denge2160的博客 449

BSGS算法及其扩展

bsgs算法: 我们在逆元里曾经讲到过如何用殴几里得求一个同余方程的整数解。而\(bsgs\)就是用来求一个指数同余方程的最小整数解的:也就是对于\(a^x\equiv b \mod p\) 我们可以用\(bsgs\)在\(O(\sqrt n)\) 的复杂度内求出关于\(x\)的最小正整数解。(前提是\(p\)为质数) \(a^x\equiv b \mod p\) 我们可以知道如果我们的模数p是一...

weixin_30326745的博客 239

BSGS算法学习笔记

从这里开始 离散对数和BSGS算法 扩展BSGS算法 离散对数和BSGS算法   设$x$是最小的非负整数使得$a^{x}\equiv b\ \ \ \pmod{m}$,则$x$是$b$以$a$为底的离散对数,记为$x = ind_{a}b$。   假如给定$a, b, m$,考虑如何求$x$,或者输出无解,先考虑$(a, m) = 1$的情况。 定理...

adx33526的博客 206
上一篇: Miller-Rabin随机性素数测试方法
下一篇: 二次剩余与Cipolla算法
WedsonLin
博客等级 码龄7年 1粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值