首页 > 其他分享 >[学习笔记]BSGS

[学习笔记]BSGS

时间:2022-08-14 11:13:42浏览次数:75  
标签:include int 笔记 times 学习 pmod ch equiv BSGS

$\operatorname{BSGS}$ ,也即 $Baby\; step\; Giant\; step$ 大步小步算法,可以在 $\Theta(\sqrt{p})$ 的时间内求解

$$a^x\equiv b\pmod{p}$$

的问题,其中 $a,p$ 互质(也即 $a\perp p$)

那么首先显然地,$a^0\equiv 1\pmod{p}$;

又根据欧拉定理, $a^{φ(p)}\equiv 1\pmod{p}$

不难看出, $0\sim φ(p)$ 是一个循环节

也就是说,最多循环 $φ(p)$ 次就可以找到答案,否则无解

不妨设 $x=i\times m-k$,其中 $k\in [0,m]$

原方程变为 $a^{i\times m-k}\equiv b\pmod{p}$

移项,$a^{i\times m}\equiv a^kb\pmod{p}$

可以先计算 $a^kb\pmod{p}$ 的值,存入哈希表/ $\operatorname{map}$ 中

然后枚举可能的 $i$ 值,计算 $a^{i\times m}$ 的值进行查询

也就是说,$\operatorname{BSGS}$ 算法共分为两步:

$\qquad\mathfrak{1:}$ $[0,m]$ 枚举 $k$,将 $a^kb\mod p$ 的值存入哈希表中

$\qquad\mathfrak{2:}$ $[1,\left \lceil \frac{p}{m} \right \rceil]$ 枚举 $i$,将 $a^{i\times m}\mod p$ 在表中进行查询,如果存在,此时的 $i\times m-k$ 即为答案

模板题目:TJOI2007可爱的质数

 

 

#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#define WR WinterRain
#define int long long
using namespace std;
const int WR=5010,INF=1099588621776;
int BL,ans;
map<int,int>mp;
int read(){
    int s=0,w=1;
    char ch=getchar();
    while(ch>'9'||ch<'0'){
        if(ch=='-') w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        s=(s<<1)+(s<<3)+ch-48;
        ch=getchar();
    }
    return s*w;
}
int quick_pow(int a,int b,int mod){
    int base=a,res=1;
    while(b){
        if(b&1) res=res*base%mod;
        base=base*base%mod;
        b>>=1;
    }
    return res;
}
void baby_step(int a,int b,int p){
    int pw=0;
    while(pw<BL){
        if(!mp[b]) mp[b]=pw+1;
        b=b*a%p,pw++;
    }
}
void giant_step(int a,int b,int p){
    int pw=1,base,rec;
    base=rec=quick_pow(a,BL,p);
    while(pw<=BL){
        if(mp[base]) ans=min(ans,BL*pw-mp[base]+1);
        base=base*rec%p,pw++;
    }
}
signed main(){
    int p=read(),a=read(),b=read();
    BL=ceil(sqrt(p));ans=INF;
    // printf("%lld\n",BL);
    baby_step(a,b,p);
    giant_step(a,b,p);
    if(ans==INF) printf("no solution\n");
    else printf("%lld\n",ans);
    return 0;
}
View Code

 

 

 

$φ$

标签:include,int,笔记,times,学习,pmod,ch,equiv,BSGS
From: https://www.cnblogs.com/WintersRain/p/16564635.html

相关文章

  • java第七周学习情况
    这个星期主要是在搞学校在暑期安排的实验报告b怎么说来着才知道这个消息几天 这是对学习不上心的体现啊题目也有点多慢慢做呗而Java这边还是看些相关知识呗说实话......
  • 笔记 【使用事件】制作3D自动开关门(附:3D人物移动和旋转,out输出参数,3D搭建使用的快捷
    【仍在施工ing】小Joe视频链接传送门使用事件制作3D自动开关门(附:3D人物移动和旋转,out输出参数,3D搭建使用的快捷键和Packages,泛型委托Action等)上期视频上期笔记思考i......
  • 研发工程师L1Python学习
    汉诺塔Description有三个立柱A、B、C。A柱上穿有大小不等的圆盘N个,较大的圆盘在下,较小的圆盘在上。要求把A柱上的圆盘全部移到C柱上,保持大盘在下、小盘在上的规律(可借助B......
  • 用vscode学习使用markdown
    学习java的第一天学习使用vscode来写博客(markdown)字体加粗:hello斜体:hello加粗和斜体:hello引用学习java,走向人生巅峰分割线图片山河或者复制之后用alt+ctr......
  • 【学习笔记/模板】扫描线 周长并
    先开坑,晚上再写。P1856[IOI1998][USACO5.5]矩形周长PictureCode#include<cstdio>#include<algorithm>usingnamespacestd;constintMAXN=1e5+10;intn,......
  • java学习记录
    # 第一个SpringBoot项目https://www.jb51.net/article/223251.htm#_label0#pom用阿里云源```<repositories><repository><id>public</id><name>......
  • ABC EF 板刷笔记
    菜鸡的刷题记录owo!偶尔也会更一些高质量D题。ABC264E比较秒的一道题。首先将操作反向处理,将摧毁变为修建,跑dsu维护答案即可。总之就是先检查在不在一个连通块,然后发......
  • Markdown学习笔记
    1Markdown学习目录1Markdown学习1.1我是二级标题1.1.1我是三级标题1.1.1.1我是四级标题1.1.1.1.1我是五级标题1.1.1.1.1.1我是六级标题1.2字体1.2.1加粗字体1.2.2变......
  • Java第七周学习总结
    本周总结一.本周所做:1.本周学习了Java的枚举的知识包括内部类中使用枚举,迭代枚举元素,在switch中使用枚举类  还学习了接口的相关知识:      ......
  • JAVA学习
    抽象方法的作用:作为通用方法,在父类中定义;要求子类,必须实现这个方。 1.抽象类可以有自己的构造方法2.抽象类可以有具体的方法。3.包含抽象类方法的类一定是抽象类,必须......