\(\\\)

BSGS


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

\[a^x\equiv b\pmod p\ ,\ (p,a)=1
\]

一般求解的是模意义下的指数,也就是最小非负整数解。

\(\\\)

算法思想


本质是双向搜索,或阈值优化的思想。

首先设"步幅" 为 \(m=\lceil{ \sqrt p}\rceil\) ,然后将方程写作

\[a^{i\times m-j}\equiv b\pmod p
\]

其中 \(i\) 就是所谓"大步", \(j\) 就是所谓"小步",我们要把他们组合在一起。

直接搜索两个数不如折半搜索一个数,然后再组合。

于是我们可以将分母上的 \(a^j\) 移项,得到

\[a^{i\times m}\equiv b\times a^j\pmod p
\]

然后就成了比较标准的双向搜索形式。

先把右一半的答案记下来,然后拿左一半搜到的每一个数去查询是否出现过就好了。

\(\\\)

代码实现


对于每一个 \(j\in [0,m-1]\) ,将 \(b\times a^j\ \%\ p\) 的答案放到哈希表里。

然后对于每一个 \(i\in[1,m](\) 此范围依据定义而来,尤其注意!\()\),去哈希表里查是否有 \(a^{im}\ \%\ p\) 的值。

还有两个小优化:

  • 注意到求出为同一个值的 \(j\) ,因为在答案里系数为 \(-1\) ,所以对于求出最小解 \(j\) 肯定是越大越优秀。

    因此再哈希表里插入相同的值时,可以直接取 \(max\), 如果是按序插入直接覆盖即可。

    这里也延申出了一种做法,直接用 \(map\) 存储结果,将结果映射到 \(j\) ,按序插入直接覆盖,复杂度多个\(log\) 。

  • 运算过程中只需一次快速幂。

    一开始每一次都是乘上 \(a\) ,所以一遍循环一遍乘即可,第二步同理,只需题前计算出 \(a^m\) 的值。

    这一优化在需要快速乘的时候效果很好。

我们以 [TJOI2007]可爱的质数 一题为例提供一份模板。

#include<map>
#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define R register
using namespace std;
typedef long long ll; map<ll,ll> s; inline ll qpow(ll x,ll t,ll p){
ll res=1;
while(t){
if(t&1) (res*=x)%=p;
(x*=x)%=p; t>>=1;
}
return res;
} inline ll BSGS(ll a,ll b,ll p){
b%=p;
ll m=ceil(sqrt(p));
for(R ll i=0;i<m;++i,(b*=a)%=p) s[b]=i;
a=qpow(a,m,p);
for(R ll i=1,tmp=a;i<=m;++i,(tmp*=a)%=p)
if(s.find(tmp)!=s.end()){
if(i*m<s[tmp]) continue;
return i*m-s[tmp];
}
return -1;
} int main(){
ll a,b,p;
scanf("%lld%lld%lld",&p,&a,&b);
ll x=BSGS(a,b,p);
if(x>=0) printf("%lld\n",x);
else puts("no solution");
return 0;
}

大步小步法(BSGS) 学习笔记的更多相关文章

  1. 2022-07-10 第五小组 pan小堂 css学习笔记

    css学习笔记 什么是 CSS? CSS 指的是层叠样式表* (Cascading Style Sheets) CSS 描述了如何在屏幕.纸张或其他媒体上显示 HTML 元素 CSS 节省了大量工作. ...

  2. BSGS 扩展大步小步法解决离散对数问题 (BZOJ 3239: Discrete Logging// 2480: Spoj3105 Mod)

    我先转为敬? orz% miskcoo 贴板子 BZOJ 3239: Discrete Logging//2480: Spoj3105 Mod(两道题输入不同,我这里只贴了3239的代码) CODE ...

  3. 微信小程序视频学习笔记

    [清华大学]学做小程序 https://www.bilibili.com/video/av21987398 2.2创建项目和文件结构 小程序包含一个描述整体程序的app和多个描述各自页面的page 配 ...

  4. BSGS学习笔记

    用于求\(A^{x} \equiv B \pmod{C}\) 高次方程的最小正整数解x,其中C为素数 引理1:$a^{i\mod\varphi(p) } \equiv a^{i} $ (mod p) ...

  5. 第1-5章 慕课网微信小程序开发学习笔记

    第1章 前言:不同的时代,不同的Web --微信小程序商城构建全栈应用 http://note.youdao.com/noteshare?id=a0e9b058853dbccf886c1a890594 ...

  6. 小甲鱼Python学习笔记

    一 isdigit()True: Unicode数字,byte数字(单字节),全角数字(双字节),罗马数字False: 汉字数字Error: 无 isdecimal()True: Unicode数字, ...

  7. BSGS 学习笔记

    问题:求$a^x\equiv b\ (mod\ p)$的最小正整数解. 这时候就要用到BSGS(拔山盖世)算法.直接进入正题: 设$x=im-n$, 则原式等于$a^{im-n}\equiv b\ ( ...

  8. 第6章 AOP与全局异常处理6.1-6.4 慕课网微信小程序开发学习笔记

    第6章 AOP与全局异常处理 https://coding.imooc.com/learn/list/97.html 目录: 第6章 AOP与全局异常处理6-1 正确理解异常处理流程 13:236-2 ...

  9. 第7章 数据库访问与ORM 慕课网微信小程序开发学习笔记

    第7章 数据库访问与ORM https://coding.imooc.com/learn/list/97.html 目录: 7-1 数据库操作三种方式之原生SQL 19:09 7-2 从一个错误了解E ...

随机推荐

  1. shell选择语句、循环语句

    判断语句:  if 判断条件  then    语句  [elif]    [语句]  ...  [else    语句]  fi    #!/bin/bash  if [ $# -eq 0 ]  t ...

  2. C语言 字符串操作 笔记

    /* C语言字符串的操作笔记 使用代码和注释结合方式记录 */ # include <stdio.h> # include <string.h> int main(void) ...

  3. 辛星浅析一次ajax的实现过程

    说到ajax,那绝对是一个老生常谈的话题,近些年ajax技术的使用颇为盛行. 以下我们就以jQuery为例来从一个真实的项目中看一下ajax的实例. 首先是前端页面,这个页面我们使用的是bootstr ...

  4. iOS开发——高级篇——线程保活

    线程保活: 顾名思义,就是保护线程不死(保证线程处于激活状态,生命周期没有结束) 正常情况,当线程执行完一次任务之后,需要进行资源回收,也就意味着生命周期结束 应用场景: 当有一个任务,随时都有可能去 ...

  5. 生成器 减少代码行数 map reduce

    map reduce l = [[2, 3], [2, 3, 4]] ll = [2, 3, 4] l = [int(i) for i in set(','.join([','.join([str(i ...

  6. YTU 2580: 改错题----修改revert函数

    2580: 改错题----修改revert函数 时间限制: 1 Sec  内存限制: 128 MB 提交: 194  解决: 82 题目描述 修改revert函数,实现输入N个数,顺序倒置后输出 #i ...

  7. UITableview控件简单介绍

    注意点:数据源方法只能在控制器里设置 一.基本介绍 在众多移动应⽤用中,能看到各式各样的表格数据 . 在iOS中,要实现表格数据展示,最常用的做法就是使用UITableView,UITableView ...

  8. I.MX6 i2c_data_write_byte ioctl error: I/O error

    /************************************************************************* * I.MX6 i2c_data_write_by ...

  9. BZOJ_3448_[Usaco2014 Feb]Auto-complete_Trie树

    BZOJ_3448_[Usaco2014 Feb]Auto-complete_Trie Description Bessie the cow has a new cell phone and enjo ...

  10. Goland软件使用教程(二)

    Goland软件使用教程(二)一.编码辅助功能 1.      智能补全 IDE通过自动补全语句来帮助您来编写代码.快捷键“Ctrl+shift+空格”将会给你一个在当前上下文中最相关符号的列表,当您 ...