BSGS算法

我是看着\(ppl\)的博客学的,您可以先访问\(ppl\)的博客

Part1 BSGS算法

求解关于\(x\)的方程

\[y^x=z(mod\ p)
\]

其中\((y,p)=1\)

做法并不难,我们把\(x\)写成一个\(am-b\)的形式

那么,原式变成了

\(y^{am}=zy^b(mod\ p)\)

我们求出所有\(b\)可能的取值(0~m-1),并且计算右边的值

同时用哈希或者\(map\)之类的东西存起来,方便查询

对于左边,我们可以枚举所有可能的\(a\),然后直接查右边的值有没有相等的即可

复杂度是\(O(max(m,p/m))\)

不难证明\(m=\sqrt(p)\)时复杂度最优

所以\(bsgs\)算法的复杂度是\(O(\sqrt(p))\)

模板题:\(SDOI2011\) 计算器

关键代码:

int m=sqrt(p)+1;Hash.Clear();
for(RG int i=0,t=z;i<m;++i,t=1ll*t*y%p)Hash.Insert(t,i);
for(RG int i=1,tt=fpow(y,m,p),t=tt;i<=m+1;++i,t=1ll*t*tt%p)
{
int k=Hash.Query(t);if(k==-1)continue;
printf("%d\n",i*m-k);return;
}

使用\(map\)会多个\(log\),在洛谷上我写的\(Hash\)目前是跑得最快的。。。

Part2 拓展BSGS

假设\(gcd(y,p)\neq 1\)怎么办?

令\(d=gcd(y,p)\)

将方程改写成等式形式

\[y^x+kp=z
\]

发现此时的\(z\)必须要是\(d\)的倍数,否则无解。

因此,除掉\(d\)

\[\frac{y}{d}y^{x-1}+k\frac{p}{d}=\frac{z}{d}
\]

这样前面的\(y/d\)就是一个系数了,

不断检查\(gcd(\frac{z}{d},y)\),一直除到互质为止

此时的形式就变成了

\[\frac{y^k}{d}y^{x-k}=\frac{z}{d}(mod\ \frac{p}{d})
\]

这样子\(bsgs\)求解之后在还原回去就行了。

模板:SPOJ Power Modulo Inverted

关键代码

void ex_BSGS(int y,int z,int p)
{
if(z==1){puts("0");return;}
int k=0,a=1;
while(233)
{
int d=__gcd(y,p);if(d==1)break;
if(z%d){NoAnswer();return;}
z/=d;p/=d;++k;a=1ll*a*y/d%p;
if(z==a){printf("%d\n",k);return;}
}
Hash.clear();
int m=sqrt(p)+1;
for(int i=0,t=z;i<m;++i,t=1ll*t*y%p)Hash.Insert(t,i);
for(int i=1,tt=fpow(y,m,p),t=1ll*a*tt%p;i<=m;++i,t=1ll*t*tt%p)
{
int B=Hash.Query(t);if(B==-1)continue;
printf("%d\n",i*m-B+k);return;
}
NoAnswer();
}

BSGS算法的更多相关文章

  1. 【codevs 1565】【SDOI 2011】计算器 快速幂+拓展欧几里得+BSGS算法

    BSGS算法是meet in the middle思想的一种应用,参考Yveh的博客我学会了BSGS的模版和hash表模板,,, 现在才会hash是不是太弱了,,, #include<cmath ...

  2. bzoj2242: [SDOI2011]计算器 && BSGS 算法

    BSGS算法 给定y.z.p,计算满足yx mod p=z的最小非负整数x.p为质数(没法写数学公式,以下内容用心去感受吧) 设 x = i*m + j. 则 y^(j)≡z∗y^(-i*m)) (m ...

  3. [BSGS算法]纯水斐波那契数列

    学弟在OJ上加了道"非水斐波那契数列",求斐波那契第n项对1,000,000,007取模的值,n<=10^15,随便水过后我决定加一道升级版,说是升级版,其实也没什么变化,只 ...

  4. BSGS算法及扩展

    BSGS算法 \(Baby Step Giant Step\)算法,即大步小步算法,缩写为\(BSGS\) 拔山盖世算法 它是用来解决这样一类问题 \(y^x = z (mod\ p)\),给定\(y ...

  5. uva11916 bsgs算法逆元模板,求逆元,组合计数

    其实思维难度不是很大,但是各种处理很麻烦,公式推导到最后就是一个bsgs算法解方程 /* 要给M行N列的网格染色,其中有B个不用染色,其他每个格子涂一种颜色,同一列上下两个格子不能染相同的颜色 涂色方 ...

  6. BSGS算法及其扩展

    bsgs算法: 我们在逆元里曾经讲到过如何用殴几里得求一个同余方程的整数解.而\(bsgs\)就是用来求一个指数同余方程的最小整数解的:也就是对于\(a^x\equiv b \mod p\) 我们可以 ...

  7. BSGS算法学习笔记

    从这里开始 离散对数和BSGS算法 扩展BSGS算法 离散对数和BSGS算法 设$x$是最小的非负整数使得$a^{x}\equiv b\ \ \ \pmod{m}$,则$x$是$b$以$a$为底的离散 ...

  8. bsgs算法详解

    例题  poj 2417bsgs  http://poj.org/problem?id=2417 这是一道bsgs题目,用bsgs算法,又称大小步(baby step giant step)算法,或者 ...

  9. BSGS算法总结

    BSGS算法总结 \(BSGS\)算法(Baby Step Giant Step),即大步小步算法,用于解决这样一个问题: 求\(y^x\equiv z\ (mod\ p)\)的最小正整数解. 前提条 ...

随机推荐

  1. 解决Android Studio编译后安装apk报错:Error while Installing APK

    刚开始玩 Android ,用Android studio  连接真机做测试,在虚拟机上没有问题,但是真机就会报错 检查了好多地方,最终发现了问题,网上的常规就不介绍了,大家自己去看别的帖子 手机方面 ...

  2. Git:七、标签(tag)

    1.创建标签:切换到需要打标签的分支 1)直接打在最新commit的版本上 git tag <tagname> 2)找到commit id git tag <tagname> ...

  3. DVWA 黑客攻防演练(三)命令行注入(Command Injection)

    文章会讨论 DVWA 中低.中.高.不可能级别的命令行注入 这里的需求是在服务器上可以 ping 一下其他的服务器 低级 Hacker 试下输入 192.168.31.130; cat /etc/ap ...

  4. js 学习之路5:使用js在网页中添加水印

    示例: <!DOCTYPE html> <html> <meta http-equiv="Content-Type" content="te ...

  5. windows 为qt5.7.1 安装openssl

    本人使用qt5.7.1+msvc2015写一个https的客户端程序,但是用到解析https协议时,报出如下错误 qt.network.ssl: QSslSocket: cannot call unr ...

  6. 【初学必备】Win10环境下Anaconda安装

    Anaconda集合了python,Spyder,Jupyter notebook及conda-----包管理器与环境管理器(含常用的panda,numpy等),省去单独下载的繁琐步骤,方便使用. 注 ...

  7. phoenix API服务发布

    概述 Elixir 的 Phoenix 框架对于开发 Web 应用非常方便,不仅有 RoR 的便利,还有 Erlang 的性能和高并发优势. 但是应用的发布涉及到 Erlang 和 Elixir 环境 ...

  8. Extjs 判断对象是非为null或者为空字符串

    Ext.isEmpty(str,[allowEmptyString]) 如果str为 null undefined a zero-length array a zero-length string ( ...

  9. Django 简介

    一  MVC  与 MTV 模型 (1)MVC C: controller 控制器(url分发和视图函数) V: 存放html文件 M: model:数据库操作 Web服务器开发领域里著名的MVC模式 ...

  10. 0109 ubuntu nginx ssl

    1. sudo apt-get install openssl libssl-dev # ./configure --with-http_stub_status_module --with-http_ ...