关于 BSGS 以及 ExBSGS 算法的理解
BSGS
引入
求解关于\(X\)的方程,
\]
其中\(Gcd(A,P)=1\)
求解
我们令\(X=i*\sqrt{P}-j\),其中\(0<=i,j<=\sqrt{P}\)
则原式可以变为:
\]
\]
由于\(Gcd(A,P)=1\),则可以恒等变化为:
\]
则我们可以先预处理出所有的\(A^{i*\sqrt{P}}\),存入哈希表。
再枚举\(B*A^j\),在哈希表里查找即可得解。
代码
int quick_Pow(int x,int y,int p){
if(y==0)return 1;
if(y==1)return x;
if(y%2)return 1ll*x*quick_Pow(1ll*x*x%p,y/2,p)%p;
return quick_Pow(1ll*x*x%p,y/2,p);
}
void BSGS(int x,int y,int p){
x%=p;y%=p;
if(x==0&&y!=0){puts("-1");return ;}
if(x==0&&y==0){puts("1");return ;}
if(y==1){puts("0");return ;}
int st=int(sqrt(p))+1;Mp.clear();
for(int i=1,rt=1;i<=st;i++,rt=(1ll*rt*x)%p)Mp[rt]=i;
int sum=quick_Pow(x,st,p);
for(int i=1,rt=1;i<=st;i++){
rt=(1ll*rt*sum)%p;
if(Mp[rt]){
printf("%d\n",i*st-Mp[rt]);
return ;
}
}
puts("-1");
}
ExBSGS
引入
求解关于\(X\)的方程,
\]
其中\(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\),则有
\]
则此时\(\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\)
#include<map>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<tr1/unordered_map>
using namespace std;
#define LL long long
tr1::unordered_map<LL,int>Mp;
LL Gcd(LL x,LL y){
if(x==0)return y;
return Gcd(y%x,x);
}
LL quick_Pow(LL x,LL y,LL p){
if(y==0)return 1;
if(y==1)return x;
if(y%2)return x*quick_Pow(x*x%p,y/2,p)%p;
return quick_Pow(x*x%p,y/2,p);
}
int ExBSGS(int x,int y,int p){
if(y==1)return 0;//特判解为0的情况.
LL k=0,a=1;
while(1){
int d=Gcd(x,p);if(d==1)break;
if(y%d)return -1;
y/=d;p/=d;k++;a=(1ll*a*x/d)%p;
if(a==y)return k;//同特判.
}Mp.clear();
LL st=int(sqrt(p))+1,sum=quick_Pow(x,st,p);
for(LL i=0,rt=y;i<=st;i++,rt=(1ll*rt*x)%p)Mp[rt]=i+1;
for(LL i=1,rt=(a*sum)%p;i<=st;i++,rt=(1ll*rt*sum)%p){//不将求解中的A/D移项.
if(!Mp[rt])continue;
return 1ll*i*st-(Mp[rt]-1)+k;
}
return -1;
}
int A,B,C;
int main(){
while(~scanf("%d%d%d",&A,&B,&C)&&A){
int Ans=ExBSGS(A,C,B);
if(Ans!=-1)printf("%d\n",Ans);
else puts("Orz,I can’t find D!");
}
}
注:一般的,题目所给的A,B,C都是正整数。
关于 BSGS 以及 ExBSGS 算法的理解的更多相关文章
- openCV中直方图均衡化算法的理解
直方图均衡化就是调整灰度直方图的分布,即将原图中的灰度值映射为一个新的值.映射的结果直观表现是灰度图的分布变得均匀,从0到255都有分布,不像原图那样集中.图像上的表现就是对比度变大,亮的更亮,暗的更 ...
- SDUT OJ 数据结构实验之串一:KMP简单应用 && 浅谈对看毛片算法的理解
数据结构实验之串一:KMP简单应用 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descr ...
- POJ1523(割点所确定的连用分量数目,tarjan算法原理理解)
SPF Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7406 Accepted: 3363 Description C ...
- 【转】浅谈对主成分分析(PCA)算法的理解
以前对PCA算法有过一段时间的研究,但没整理成文章,最近项目又打算用到PCA算法,故趁热打铁整理下PCA算法的知识.本文观点旨在抛砖引玉,不是权威,更不能尽信,只是本人的一点体会. 主成分分析(PCA ...
- Vue中diff算法的理解
Vue中diff算法的理解 diff算法用来计算出Virtual DOM中改变的部分,然后针对该部分进行DOM操作,而不用重新渲染整个页面,渲染整个DOM结构的过程中开销是很大的,需要浏览器对DOM结 ...
- 关于KMP算法中,获取next数组算法的理解
参考:KMP入门级别算法详解--终于解决了(next数组详解) https://blog.csdn.net/lee18254290736/article/details/77278769 在这里讨论的 ...
- React中diff算法的理解
React中diff算法的理解 diff算法用来计算出Virtual DOM中改变的部分,然后针对该部分进行DOM操作,而不用重新渲染整个页面,渲染整个DOM结构的过程中开销是很大的,需要浏览器对DO ...
- 知识点简单总结——BSGS与EXBSGS
知识点简单总结--BSGS与EXBSGS BSGS 给出 $ A,B,C,(A,C)=1 $ ,要你求最小的 $ x $ ,使得 $ A^x \equiv B(mod \ C) $ . 在数论题中经常 ...
- 自己对kmp算法的理解,借由 28. 实现 strStr() 为例
做题思路 or 感想 : 就借由这道题来理解一下kmp算法吧 kmp算法的操作过程我觉得有句话很合适 :KMP 算法永不回退 目标字符串 的指针 i,不走回头路(不会重复扫描 目标字符串),而是借助 ...
随机推荐
- Windows实现桌面录屏、指定窗口录制直播,低延时,H5页面播放
接着前面记录的3种方式实现桌面推流直播: 1.Windows 11实现录屏直播,搭建Nginx的rtmp服务 的方式需要依赖与Flash插件,使用场景有限 2.Windows 11实现直播,VLC超简 ...
- [学习笔记] Oracle字段类型、建表语句、添加约束
SQL语句介绍 数据定义语言(DDL),包括 CREATE. ALTER. DROP等. 数据操纵语言(DML),包括 INSERT. UPDATE. DELETE. SELECT - FOR UPD ...
- linux(CentOS7) 之 MySQL 5.7.30 下载及安装
一.下载 1.百度搜索mysql,进入官网(或直接进入官网https://www.mysql.com) 2.选择 downloads 3.翻到最下面,选择MySQL Community (GPL) D ...
- Linux上天之路(九)之文件和文件夹的权限
主要内容 linux 基本权限 linux特殊权限 linux隐藏权限 linux file ACL 权限 1. Linux的基本权限 使用ls -l filename 命令查看文件或文件夹详细权限 ...
- Linux上天之路(十四)之Linux数据处理
主要内容 数据检索 数据排序 数据去重 重定向 1. 数据检索 常和管道协作的命令 – grep grep:用于搜索模式参数指定的内容,并将匹配的行输出到屏幕或者重定向文件中,常和管道协作的命令 – ...
- js实现工具函数中groupBy数据分组
数据 this.tableData = [ {id: 1, name: '测试', number: 1, price: 0}, {id: 2, name: '测试', number: 1, price ...
- iview 按需引入解决加载慢的问题
如果出现加载2s以上的情况请先查看服务器是否对大文件进行过压缩优化处理. 按照官方文档把iview引入到vue的项目中,全部引入的时候没问题.当按官方文档显示的按需加载是借助插件babel-plugi ...
- 网络协议学习笔记(六)http和https
概述 之前讲解了传输层的相关知识,现在讲解一下关于应用层的知识,主要是大家所熟悉的http和https,这2中是咱们最熟悉的协议了,但是也是最不熟悉的协议. HTTP协议:看个新闻原来这么麻烦 HTT ...
- 信息收集&Fuzz
本文译自https://0xjoyghosh.medium.com/information-gathering-scanning-for-sensitive-information-reloaded- ...
- 【Android】安卓四大组件之Activity(一)
[Android]安卓四大组件之Activity(一) 前言 Activity是Android学习中的一个重要组件,想要对其进行系统的了解可以分为几块内容,这一大章节的内容是有关于activity之间 ...