【算法】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\),移项得\({(A^m)}^i\equiv B*A^{-j}\mod P\),类似天天爱跑步,对于左右互不影响的等式可以开桶统计。例如可以枚举i,检查另一侧是否有对应的j满足条件。
实现时,先把一侧的值存入map或hash表,再在另一侧枚举。写成\(x=i*m-j\)的形式,可以避免求逆元。
时间复杂度:\(j\in[0,m-1]\),\(i\in [0,\frac p m]\),复杂度为\(O(\max(m,\frac p m))\),当\(m=\sqrt p\)时取最优,为\(O(\sqrt p)\)。
细节:
- 特判A==0的情况。
- 写成\(x=i*m-j\),j从0枚举到m,i从1枚举到m,因为\(0=1*m-m\)。
- 枚举j时,如果模出结果相同,在hash表中用大的j覆盖小的j,因为\(x=i*m-j\),显然j越大x越小。
- 传入时A、B先模P。
Code(POJ2417 Discrete Logging):
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int Mod=20180801,N=3e7+5;
struct Hashtable{
int size,key[N],nxt[N],head[N];
ll val[N];
inline void clear(){
memset(head,0,sizeof(head));
size=0;
}
inline int hash(ll Key){
return Key%Mod;
}
inline ll find(ll Key){
for(int i=head[hash(Key)];i;i=nxt[i]) if(key[i]==Key) return val[i];
return -1;
}
inline void insert(ll Key,ll Val){
for(int i=head[hash(Key)];i;i=nxt[i]) if(key[i]==Key) return (void) (val[i]=Val);
key[++size]=Key;val[size]=Val;nxt[size]=head[hash(Key)];head[hash(Key)]=size;
}
}mp;
ll qpow(ll a,ll b,ll p){
ll res=1;
for(;b;b>>=1,a=a*a%p) if(b&1) res=res*a%p;
return res%p;
}
ll BSGS(ll a,ll b,ll p){
if(a==0) return b==0?1:-1;
mp.clear();
ll M=ceil(pow(p*1.0,0.5)),t=1,s=qpow(a,M,p),k;
for(int i=0;i<=M;++i) mp.insert(b,i),b=b*a%p;
for(int i=1;i<=M;++i) if(t=t*s%p,(k=mp.find(t))!=-1) return i*M-k;
return -1;
}
int main(){
ll a,b,p,ans;
while(scanf("%lld%lld%lld",&p,&a,&b)!=EOF) {
ans=BSGS(a%p,b%p,p);
ans==-1?puts("no solution"):printf("%lld\n",ans);
}
return 0;
}
【算法】BSGS算法的更多相关文章
- [模板]大步小步算法——BSGS算法
大步小步算法用于解决:已知A, B, C,求X使得 A^x = B (mod C) 成立. 我们令x = im - j | m = ceil(sqrt(C)), i = [1, m], j = [0, ...
- 【codevs 1565】【SDOI 2011】计算器 快速幂+拓展欧几里得+BSGS算法
BSGS算法是meet in the middle思想的一种应用,参考Yveh的博客我学会了BSGS的模版和hash表模板,,, 现在才会hash是不是太弱了,,, #include<cmath ...
- bzoj2242: [SDOI2011]计算器 && BSGS 算法
BSGS算法 给定y.z.p,计算满足yx mod p=z的最小非负整数x.p为质数(没法写数学公式,以下内容用心去感受吧) 设 x = i*m + j. 则 y^(j)≡z∗y^(-i*m)) (m ...
- [BSGS算法]纯水斐波那契数列
学弟在OJ上加了道"非水斐波那契数列",求斐波那契第n项对1,000,000,007取模的值,n<=10^15,随便水过后我决定加一道升级版,说是升级版,其实也没什么变化,只 ...
- BSGS算法
BSGS算法 我是看着\(ppl\)的博客学的,您可以先访问\(ppl\)的博客 Part1 BSGS算法 求解关于\(x\)的方程 \[y^x=z(mod\ p)\] 其中\((y,p)=1\) 做 ...
- BSGS算法及扩展
BSGS算法 \(Baby Step Giant Step\)算法,即大步小步算法,缩写为\(BSGS\) 拔山盖世算法 它是用来解决这样一类问题 \(y^x = z (mod\ p)\),给定\(y ...
- uva11916 bsgs算法逆元模板,求逆元,组合计数
其实思维难度不是很大,但是各种处理很麻烦,公式推导到最后就是一个bsgs算法解方程 /* 要给M行N列的网格染色,其中有B个不用染色,其他每个格子涂一种颜色,同一列上下两个格子不能染相同的颜色 涂色方 ...
- BSGS算法及其扩展
bsgs算法: 我们在逆元里曾经讲到过如何用殴几里得求一个同余方程的整数解.而\(bsgs\)就是用来求一个指数同余方程的最小整数解的:也就是对于\(a^x\equiv b \mod p\) 我们可以 ...
- BSGS算法学习笔记
从这里开始 离散对数和BSGS算法 扩展BSGS算法 离散对数和BSGS算法 设$x$是最小的非负整数使得$a^{x}\equiv b\ \ \ \pmod{m}$,则$x$是$b$以$a$为底的离散 ...
随机推荐
- TZ_05_Spring_annotation常见注解
Spring常用的注解大全和解释 注解 解释 @Controller 组合注解(组合了@Component注解),应用在MVC层(控制层),DispatcherServlet会自动扫描注解了此注解的类 ...
- 本周汇总 动态rem适配移动端/块状元素居中/透明度
1.动态rem适配移动端 !function(){ var width = document.documentElement.clientWidth; var head=document.getEle ...
- 20190813-Sunburst
Sunburst-7obu&Itro 雨过天晴. 考试过程 刚开始挺郁闷的,上一个T2还在改(50/50/51)XD 先通看三题. T1好像是树?? T2可以把环拆成链. T3好像是BFS?? ...
- 工控安全入门(二)—— S7comm协议
在上一次的文章中我们介绍了施耐德公司的协议modbus,这次我们把目标转向私有协议,来看看另一家巨头西门子的S7comm.首先要说明,这篇文章中的内容有笔者自己的探索,有大佬们的成果,但由于S7com ...
- 磁力搜索网站 BT torrent search engine 推荐 2019/12/25日更新
btkitty 知名的BT磁力搜索,资源很多,中文友好 btdb 知名的BT磁力搜索,资源很多,中文友好 838888 不错的 BT 磁力搜索引擎,资源很多,中文友好 idope.se 资源丰富的BT ...
- web前端学习(二)html学习笔记部分(5)--拖放元素、canvas画布使用
1.2.11 拖放 1.2.11.1 html拖放 1.2.11.2 html拖放本次资源 showOjb(一个对象)展示一下一个对象的信息. 1.2.12 html画布(canvas) 标 ...
- System.getProperty()和getenv()
System.getproperty(String name) 获取系统属性 System.getProperties() 获取所有系统属性 System.getenv(String name) 获取 ...
- 用Direct2D和DWM来做简单的动画效果
原文:用Direct2D和DWM来做简单的动画效果 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/sunnyloves/article/detail ...
- oracle-ASM存储器
自动存储管理 Oracle 10g引进的一种新型存储机制.它依靠oracle来维护企业的数据库存储器,被设计用来解除磁盘和存储器管理的负担,可以使用ASM来定义用于文件管理的磁盘组. 磁盘组类似于某些 ...
- 【arduino】anroid的app与arduino的ch05,进行蓝牙通信遇到的问题
Arduino程序上传不成功 显示系统找不到指定文件 错误信息显示是 avrdude: ser_open(): can't open device "\\.\COM1": 系统找不 ...