BSGS

引入

求解关于\(X\)的方程,

\[A^X\equiv B \pmod P
\]

其中\(Gcd(A,P)=1\)

求解

我们令\(X=i*\sqrt{P}-j\),其中\(0<=i,j<=\sqrt{P}\)

则原式可以变为:

\[A^X\equiv B \pmod P
\]
\[A^{i*\sqrt{P}-j}\equiv B \pmod P
\]

由于\(Gcd(A,P)=1\),则可以恒等变化为:

\[A^{i*\sqrt{P}}\equiv B*A^j \pmod P
\]

则我们可以先预处理出所有的\(A^{i*\sqrt{P}}\),存入哈希表。

再枚举\(B*A^j\),在哈希表里查找即可得解。

代码

  1. int quick_Pow(int x,int y,int p){
  2. if(y==0)return 1;
  3. if(y==1)return x;
  4. if(y%2)return 1ll*x*quick_Pow(1ll*x*x%p,y/2,p)%p;
  5. return quick_Pow(1ll*x*x%p,y/2,p);
  6. }
  7. void BSGS(int x,int y,int p){
  8. x%=p;y%=p;
  9. if(x==0&&y!=0){puts("-1");return ;}
  10. if(x==0&&y==0){puts("1");return ;}
  11. if(y==1){puts("0");return ;}
  12. int st=int(sqrt(p))+1;Mp.clear();
  13. for(int i=1,rt=1;i<=st;i++,rt=(1ll*rt*x)%p)Mp[rt]=i;
  14. int sum=quick_Pow(x,st,p);
  15. for(int i=1,rt=1;i<=st;i++){
  16. rt=(1ll*rt*sum)%p;
  17. if(Mp[rt]){
  18. printf("%d\n",i*st-Mp[rt]);
  19. return ;
  20. }
  21. }
  22. puts("-1");
  23. }

ExBSGS

引入

求解关于\(X\)的方程,

\[A^X\equiv B \pmod P
\]

其中\(Gcd(A,P)\)无特殊条件。

由于\(Gcd(A,P)\)可能不为\(1\),所以\(A\)关于\(P\)可能没有逆元。

故不能用一般的 BSGS 求解。

求解

我们设\(D=Gcd(A,P)\),

则显然有 \(\frac{A}{D}\equiv 1\pmod P\)

则原式$$A^X\equiv B \pmod P$$

可恒等变形为$$A^{X-1}\cdot\frac{A}{D}\equiv \frac{B}{D} \pmod {\frac{P}{D}}$$

而由于\(Gcd(\frac{A}{D},\frac{P}{D})=1\),则有

\[A^{X-1}\equiv \frac{B}{D}\cdot({\frac{A}{D}})^{-1} \pmod {\frac{P}{D}}
\]

则此时\(\frac{P}{D}\)就相当于新的\(P\)值,\(\frac{B}{D}\cdot({\frac{A}{D}})^{-1}\)就相当于新的\(B\)值,

就可以这样递推下去了。(注:下一次的\(D\)是新的\(P\)值与\(A\)的\(Gcd\))

考虑边界状态:

①:若当前的\(D=1\),则问题转化为普通的 BSGS。

②:若\(B\)值等于\(1\)了,则迭代到的\(Ans\)值为\(1\)。

③:若\(D \nmid B\),即\(D\)不是\(B\)的因数,则\(\frac{B}{D}\)没有意义,则无解。

综上,出解。

例题及代码

板题

题意:求满足\(A^X\equiv B \pmod{P}\)的最小整数\(X\)

  1. #include<map>
  2. #include<cmath>
  3. #include<cstdio>
  4. #include<algorithm>
  5. #include<tr1/unordered_map>
  6. using namespace std;
  7. #define LL long long
  8. tr1::unordered_map<LL,int>Mp;
  9. LL Gcd(LL x,LL y){
  10. if(x==0)return y;
  11. return Gcd(y%x,x);
  12. }
  13. LL quick_Pow(LL x,LL y,LL p){
  14. if(y==0)return 1;
  15. if(y==1)return x;
  16. if(y%2)return x*quick_Pow(x*x%p,y/2,p)%p;
  17. return quick_Pow(x*x%p,y/2,p);
  18. }
  19. int ExBSGS(int x,int y,int p){
  20. if(y==1)return 0;//特判解为0的情况.
  21. LL k=0,a=1;
  22. while(1){
  23. int d=Gcd(x,p);if(d==1)break;
  24. if(y%d)return -1;
  25. y/=d;p/=d;k++;a=(1ll*a*x/d)%p;
  26. if(a==y)return k;//同特判.
  27. }Mp.clear();
  28. LL st=int(sqrt(p))+1,sum=quick_Pow(x,st,p);
  29. for(LL i=0,rt=y;i<=st;i++,rt=(1ll*rt*x)%p)Mp[rt]=i+1;
  30. for(LL i=1,rt=(a*sum)%p;i<=st;i++,rt=(1ll*rt*sum)%p){//不将求解中的A/D移项.
  31. if(!Mp[rt])continue;
  32. return 1ll*i*st-(Mp[rt]-1)+k;
  33. }
  34. return -1;
  35. }
  36. int A,B,C;
  37. int main(){
  38. while(~scanf("%d%d%d",&A,&B,&C)&&A){
  39. int Ans=ExBSGS(A,C,B);
  40. if(Ans!=-1)printf("%d\n",Ans);
  41. else puts("Orz,I can’t find D!");
  42. }
  43. }

注:一般的,题目所给的A,B,C都是正整数。

关于 BSGS 以及 ExBSGS 算法的理解的更多相关文章

  1. openCV中直方图均衡化算法的理解

    直方图均衡化就是调整灰度直方图的分布,即将原图中的灰度值映射为一个新的值.映射的结果直观表现是灰度图的分布变得均匀,从0到255都有分布,不像原图那样集中.图像上的表现就是对比度变大,亮的更亮,暗的更 ...

  2. SDUT OJ 数据结构实验之串一:KMP简单应用 && 浅谈对看毛片算法的理解

    数据结构实验之串一:KMP简单应用 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descr ...

  3. POJ1523(割点所确定的连用分量数目,tarjan算法原理理解)

    SPF Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7406   Accepted: 3363 Description C ...

  4. 【转】浅谈对主成分分析(PCA)算法的理解

    以前对PCA算法有过一段时间的研究,但没整理成文章,最近项目又打算用到PCA算法,故趁热打铁整理下PCA算法的知识.本文观点旨在抛砖引玉,不是权威,更不能尽信,只是本人的一点体会. 主成分分析(PCA ...

  5. Vue中diff算法的理解

    Vue中diff算法的理解 diff算法用来计算出Virtual DOM中改变的部分,然后针对该部分进行DOM操作,而不用重新渲染整个页面,渲染整个DOM结构的过程中开销是很大的,需要浏览器对DOM结 ...

  6. 关于KMP算法中,获取next数组算法的理解

    参考:KMP入门级别算法详解--终于解决了(next数组详解) https://blog.csdn.net/lee18254290736/article/details/77278769 在这里讨论的 ...

  7. React中diff算法的理解

    React中diff算法的理解 diff算法用来计算出Virtual DOM中改变的部分,然后针对该部分进行DOM操作,而不用重新渲染整个页面,渲染整个DOM结构的过程中开销是很大的,需要浏览器对DO ...

  8. 知识点简单总结——BSGS与EXBSGS

    知识点简单总结--BSGS与EXBSGS BSGS 给出 $ A,B,C,(A,C)=1 $ ,要你求最小的 $ x $ ,使得 $ A^x \equiv B(mod \ C) $ . 在数论题中经常 ...

  9. 自己对kmp算法的理解,借由 28. 实现 strStr() 为例

    做题思路 or 感想 : 就借由这道题来理解一下kmp算法吧 kmp算法的操作过程我觉得有句话很合适 :KMP 算法永不回退 目标字符串 的指针 i,不走回头路(不会重复扫描 目标字符串),而是借助 ...

随机推荐

  1. vue 在实现关键字远程搜索时出现数据不准确的原因

    实现通过输入关键字查询项目, 页面搜索规则框部分 js部分 之前通过在data中定义一个变量,然后在methods中filterFn方法获取当时输入的值去后台请求数据,然后把请求的数据存放在state ...

  2. 移动端position:fixed 解决方案

    相信不少人做移动端项目的时候都会遇到position:fixed 的坑. 下面提供一个解决方法,不用引入任何其他的js库,纯css解决. 解决问题的关键就是:fixed元素内部必须嵌套一个positi ...

  3. Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401开发

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  4. HTTP2和WebSocket

    HTTP http是目前应用最广泛的应用层协议,截止到目前为止已经发布了多个版本,最常用的是http1.1和http2. http0.9是最早的版本,功能很简单,没有header,只支持GET. ht ...

  5. Web开发之HTTP协议

    HTTP响应消息 一个HTTP响应代表服务器向客户端回送的数据. 一个完整的HTTP响应包括如下内容: 一个状态行.若干消息头.以及响应正文,其中的一些消息头和正文都是可选的,消息头和正文内容之间要用 ...

  6. 【数据结构与算法】蓄水池抽样算法(Reservoir Sampling)

    问题描述 给定一个数据流,数据流长度 N 很大,且 N 直到处理完所有数据之前都不可知,请问如何在只遍历一遍数据(O(N))的情况下,能够随机选取出 m 个不重复的数据. 比较直接的想法是利用随机数算 ...

  7. 春节将至,喜庆的烟花安排上(js实现烟花)

    一年一度的春节即将来临,然后苦逼的我还在使劲的摸鱼,未能回家体验小时候路边放爆竹的快乐时光,所以只能在网上来实现这个小小的心愿了.烟花静态效果图如下: 为了大伙复制方便就不分开写,直接复制即可,具体实 ...

  8. golang中的标准库fmt

    fmp fmt.Fprintln.fmt.Fprintf fmt.Fprintln(os.Stdout, "向标准输出写入内容") // 0644: 拥有者6读写权限,组用户4读权 ...

  9. gorm声明模型

    模型定义 模型是标准的结构体,由go的基本数据类型.实现了Scanner和Valuer接口的自定义类型及其指针或别名组成 例如: type User struct { ID uint Name str ...

  10. Chrome Performance 页面性能分析指南

    1.背景 性能优化是前端开发一个非常重要的组成部分,如何更好地进行网络传输,如何优化浏览器渲染过程,来定位项目中存在的问题.Chrome DevTools给我们提供了2种常用方式 Audits和Per ...