用途:

一般用来求\(a^x\equiv b\,\,(mod\,p)\)的最小正整数解,其中gcd(a,p)=1

设\(u=\lceil sqrt(p)\rceil\),则式子可以转化为\(a^{iu-j}\equiv b\,\,(mod\,p)\),其中\(i\in[1,u],j\in[0,u)\)

于是\(a^{iu}\equiv a^jb\,\,(mod\,p)\),我们就可以枚举j,存到map中,再枚举i判重就行了

不过当存在不同的j使\(a^jb\,mod\,p\)相同时,我们记录较大的(因为j越大答案越小嘛)

简易原理:

费马小定理:若gcd(x,p)=1,则有\(\\x^{p-1}\equiv1\,\,(mod\,p)\),得到\(x^p\equiv x\,\,(mod\,p)\)

所以当指数不小于p时,mod p的值会形成循环

Code:

板子题:luogu P4028 New Product

#include<bits/stdc++.h>
#define ll long long
using namespace std;
map<int,int> mp;
int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int quickpow(int a,int b,int p){
int re=1;
while(b){if(b&1) re=1ll*re*a%p;a=1ll*a*a%p;b>>=1;}
return re;
}
void solve(){
int p=read(),a=read(),b=read();
if(a%p==0){puts("Couldn't Produce!");return ;}
if(b==1){puts("0");return ;}
int u=sqrt(p)+1,v=b;mp.clear();
for(int i=0;i<u;i++)
mp[v]=i,v=1ll*v*a%p;
int w=quickpow(a,u,p);v=1;
for(int i=1;i<=u;i++){v=1ll*v*w%p;
if(mp.count(v)){
printf("%d\n",i*u-mp[v]);
return ;
}
}puts("Couldn't Produce!");
}
int main(){
int T=read();
while(T--) solve();
return 0;
}

扩展:

可以看到BSGS是有着局限性的,即必须满足gcd(a,p)=1

那么当gcd(a,p)!=1时呢?我们设\(d=gcd(a,p)\)

Step1:

​ 我们首先判断\(b\)是否满足\(d|b\),若不满足,由裴蜀定理可知无解

Step2:

​ 式子转化为:

\[a^{x-k}\frac{a^k}{\Pi_{i=1}^kd_i}\equiv \frac{b}{\Pi_{i=1}^kd_i}\,\,(mod\,\,\frac{p}{\Pi_{i=1}^kd_i})
\]

​ 令\(c=\frac{a^k}{\Pi_{i=1}^kd_i},b'=\frac{b}{\Pi_{i=1}^kd_i},p‘=\frac{p}{\Pi_{i=1}^kd_i}\),若\(c=b'\),则直接输出\(k\)

Step3:

​ 令\(d=gcd(a,p')\),若\(d\ne 1\),则返回step1,不过b变成了b'

全部完成后,我们得到式子:\(a^{x-k}c\equiv b'\,\,(mod\,\,p')\),此时满足\(gcd(a,p')=1\)

那么我们便可以直接BSGS了

Code:

板子题:luogu P4195 exBSGS

#include<bits/stdc++.h>
#include<unordered_map>
#define ll long long
using namespace std;
unordered_map<int,int> mp;
inline int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
inline int gcd(int x,int y){
if(y>x) swap(x,y);
while(y){swap(x,y);y=y%x;}
return x;
}
inline int quickpow(int a,int b,int p){
int re=1;
while(b){if(b&1) re=1ll*re*a%p;a=1ll*a*a%p;b>>=1;}
return re;
}
inline void solve(int a,int p,int b){
if(p==1){puts("0");return ;}
if(b==1){puts("0");return ;}
int d=gcd(a,p),flag=0,k=0,c=1;
while(d^1){
if(b%d){
puts("No Solution");
flag=1;break;
}p/=d,b/=d,++k;
c=1ll*c*(a/d)%p;
if(b==c){
printf("%d\n",k);
flag=1;break;
}d=gcd(a,p);
}if(flag) return ;
mp.clear();
int u=sqrt(p)+1,v=b;
for(int i=0;i<u;i++)
mp[v]=i,v=1ll*v*a%p;
v=c,c=quickpow(a,u,p);
for(int i=1;i<=u;i++){
v=1ll*v*c%p;
if(mp.count(v)){
printf("%d\n",i*u-mp[v]+k);
return ;
}
}puts("No Solution");
}
int main(){
while(1){
int a=read(),p=read(),b=read();
if(a==0&&b==0&&p==0) return 0;
a%=p;b%=p;solve(a,p,b);
}
}

话说为什么unordered_map比map快这么多啊,不过有时候编译会出锅...

浅谈BSGS(大步小步)及其扩展的更多相关文章

  1. 浅谈BSGS

    用于求解形如\(a^x≡b\mod p\)的最小非负整数解\(x\). 由欧拉定理\(a^{\phi(p)}≡1\mod p\)可以知道,我们找的解如果有解则一定在\(\phi(p)\)范围内,而最大 ...

  2. 浅谈BSGS和EXBSGS

    我的 BSGS 和各位犇犇的差不多,但是不需要求逆元 Luogu [ TJOI2007 ] 可爱的质数 原题展现 题目描述 给定一个质数 \(p\),以及一个整数 \(b\),一个整数 \(n\),现 ...

  3. [BSGS]大步小步算法

    问题 BSGS被用于求解离散对数,即同余方程: \[ A^x\equiv B\pmod{P} \] 求\(x\)的最小非负整数解. 保证\(A\perp P\)(互质). 分析 首先,我们根据费马小定 ...

  4. 浅谈集合框架六——集合扩展:Arrays工具类、集合与数组相互转换方式;

    最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...

  5. 浅谈集合框架四——集合扩展:集合循环输出方式及list输出方式的效率对比

    最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...

  6. 离散对数&&大步小步算法及扩展

    bsgs algorithm ax≡b(mod n) 大步小步算法,这个算法有一定的局限性,只有当gcd(a,m)=1时才可以用 原理 此处讨论n为素数的时候. ax≡b(mod n)(n为素数) 由 ...

  7. 【ASP.NET MVC系列】浅谈ASP.NET MVC八大类扩展(上篇)

    lASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操 ...

  8. BSGS&EXBSGS 大手拉小手,大步小步走

    大步小步走算法处理这样的问题: A^x = B (mod C) 求满足条件的最小的x(可能无解) 其中,A/B/C都可以是很大的数(long long以内) 先分类考虑一下: 当(A,C)==1 即A ...

  9. [模板]大步小步算法——BSGS算法

    大步小步算法用于解决:已知A, B, C,求X使得 A^x = B (mod C) 成立. 我们令x = im - j | m = ceil(sqrt(C)), i = [1, m], j = [0, ...

随机推荐

  1. MySQL数据库常用引擎

    在MySQL数据库中,常用的引擎主要就是2个:Innodb和MyIASM. 首先: 1.简单介绍这两种引擎,以及该如何去选择.2.这两种引擎所使用的数据结构是什么. 1. a.Innodb引擎,Inn ...

  2. 【转帖】Linux系统上面qemu 模拟arm

    零基础在Linux系统搭建Qemu模拟arm https://blog.csdn.net/weixin_42489042/article/details/81145038 自己没搞定 改天再试试 感谢 ...

  3. Java初始和环境搭建

    前世今生 Java语言是什么? 一种计算机编程语言.名字取自咖啡. Java语言发展简史 Java语言之父:James Gosling SUN(Stanford University Network ...

  4. Johnson算法学习笔记

    \(Johnson\)算法学习笔记. 在最短路的学习中,我们曾学习了三种最短路的算法,\(Bellman-Ford\)算法及其队列优化\(SPFA\)算法,\(Dijkstra\)算法.这些算法可以快 ...

  5. PyQt5_主要的类库

    1.PyQt5包括的主要模块如下. QtCore模块——涵盖了包的核心的非GUI功能,此模块被用于处理程序中涉及的时间.文件.目录.数据类型.文本流.链接.QMimeData.线程或进程等对象. Qt ...

  6. npm学习(二)之如何防止权限错误

    如何防止权限错误 如果您在尝试全局安装包时看到EACCES错误,请阅读本章.如果更改安装npm的目录,通常可以避免此错误.要做到这一点,要么使用版本管理器重新安装npm(推荐)或手动更改npm的默认目 ...

  7. centos安装mysql以及授权登录用户

    CentOS第一次安装MySQL的完整步骤 目录     1.官方安装文档    2.下载 Mysql yum包    3.安转软件源    4.安装mysql服务端    5.首先启动mysql   ...

  8. linux相关命令大全......持续更新

    启动项目8080端口被占用,然而老久没玩Linux,命令忘光了,杀死进程都不记得了. 决定整理一波吧....... Linux: sudo强制执行,不在root用户下时使用. top 相当于windo ...

  9. 什么是RESTful API、WSGI、pecan

    RESTful API REST的全称是Representational State Transfer(表征状态转移), 是Roy Fielding在他的博士论文Architectural Style ...

  10. CSS hack(过滤器)

    CSS hack概念: 是针对不同浏览器对同一段代码解析不同的处理方案:<解决兼容性问题> 属性设置在不同版本的IE里会出现不兼容问题,css hack解决兼容主流浏览器和IE 常见的过滤 ...