BSGS算法(大小步算法)
$BSGS$ 算法 $Baby\ Steps\ Giant\ Steps$.
致力于解决给定两个互质的数 $a,\ p$ 求一个最小的非负整数 $x$ 使得 $a^x\equiv b(mod\ p)$ 其中 $b$ 为任意正整数,$2≤a<p$,$2≤b<p$
该算法使用的原理与欧拉定理有关,其中$a,\ p$互质
$a^{\phi (p)}\equiv 1(mod\ p)$
又因为
$a^0\equiv 1(mod\ p)$
所以$0到\phi p$是一个循环节,也就是说该算法最多查找$\phi (p)$次就可以找到答案,否则就无解。
设$x=im-k$其中$0≤k≤m$ 原式变为
$a^{im-k}\equiv b(mod\ p)$
两边乘以$a^k$得到
$a^{im}\equiv a^kb(mod\ p)$
然后我们可以拆成左右两部分分别进行枚举$i$和$k$。
①先枚举$k$,把对应的结果$a^kb$和对应的$k$放入$map$中,$map\_name[a^kb]=k$。$(k\ from\ 0\ to\ m)$
②然后枚举$i$,把得到的结果$a^{im}$在$map$中进行查找,如果$map\_name.count(a^{im})$可以找到,则输出此时的$im-k$即可。($i\ from\ 1\ to\ m$)
如果超出查找范围还没找到,则无解。
这里注意下,对$a^{im}$枚举时,要先快速幂预处理出来$a^m$,然后枚举$i$即可。
算法时间复杂度为$O(max(m, \phi (p)/m))$.
最坏情况为$p$为质数$\phi (p)=p-1$
此时将$m$取$\sqrt p$为最小,时间复杂度为$O(\sqrt p)$。
$m$取$\sqrt p+1$或$ceil(\sqrt p)$。
代码:
#include <bits/stdc++.h>
using namespace std; typedef long long ll; int n, p, b; unordered_map<ll, int> vis;
inline ll fp( ll a, ll b ){
a %= p;
ll res = ;
while( b ){
if( b& ) res = res*a%p;
b >>= ;
a = a*a%p;
}
return res;
} int main()
{ ios::sync_with_stdio(); cin.tie(); cout.tie();
cin >> p >> b >> n;
ll m = ceil(sqrt(p)); /*算法复杂度O( max(m, phi(p)/m) ) 所以m取ceil(sqrt(p))最快O(sqrt(p)) */
ll tmp = n;
for( int k=; k<=m; k++,(tmp*=b)%=p ){
vis[tmp] = k;
}
ll t = fp(b, m); tmp = t;
bool flag = ;
for( int i=; i<=m; i++, tmp=tmp*t%p ){
if( vis.count(tmp) ){
flag = ;
cout << i*m-vis[tmp] << endl;
break; }
}
if(!flag) cout << "no solution" <<endl; return ;
}
BSGS算法(大小步算法)的更多相关文章
- BSGS(大小步)算法
BSGS算法主要用于求解形如ax≡b(mod p)的式子中x的值. 在这里我们不妨设 x=k1*n-k2 这时我们就可以将式子转化为 ak1*n≡b*ak2(mod p) 这里的n我们设为√p,所以我 ...
- BSGS算法(大步小步算法)
计算\(y^x ≡ z \ mod\ p\) 中 \(x\) 的解. 这个模板是最小化了\(x\) , 无解输出\(No \ Solution!\) map<ll,ll>data; ll ...
- Discrete Logging ZOJ - 1898 (模板题大小步算法)
就是求Ax三B(mod C)当C为素数时 #include<cstdio> #include<cstring> #include<cmath> #include&l ...
- [模板]大步小步算法——BSGS算法
大步小步算法用于解决:已知A, B, C,求X使得 A^x = B (mod C) 成立. 我们令x = im - j | m = ceil(sqrt(C)), i = [1, m], j = [0, ...
- 离散对数及其拓展 大步小步算法 BSGS
离散对数及其拓展 离散对数是在群Zp∗Z_{p}^{*}Zp∗而言的,其中ppp是素数.即在在群Zp∗Z_{p}^{*}Zp∗内,aaa是生成元,求关于xxx的方程ax=ba^x=bax=b的解, ...
- 离散对数&&大步小步算法及扩展
bsgs algorithm ax≡b(mod n) 大步小步算法,这个算法有一定的局限性,只有当gcd(a,m)=1时才可以用 原理 此处讨论n为素数的时候. ax≡b(mod n)(n为素数) 由 ...
- 【题解】Matrix BZOJ 4128 矩阵求逆 离散对数 大步小步算法
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4128 大水题一道 使用大步小步算法,把数字的运算换成矩阵的运算就好了 矩阵求逆?这么基础的线 ...
- Atitit 图像处理30大经典算法attilax总结
Atitit 图像处理30大经典算法attilax总结 1. 识别模糊图片算法2 2. 相似度识别算法(ahash,phash,dhash)2 3. 分辨率太小图片2 4. 横条薯条广告2 5. 图像 ...
- GJM : 数据结构 - 轻松看懂机器学习十大常用算法 [转载]
转载请联系原文作者 需要获得授权,非法转载 原文作者将享受侵权诉讼 文/不会停的蜗牛(简书作者)原文链接:http://www.jianshu.com/p/55a67c12d3e9 通过本篇文章可以 ...
随机推荐
- 【转载】预处器的对比——Sass、LESS和Stylus
常用的3大css预编译器:Sass.LESS和Stylus,你是否会混淆它们的区别和用法.这里有篇文章介绍的挺详细. 传送门:https://www.w3cplus.com/css/sass-vs-l ...
- Web协议详解与抓包实战:HTTP1协议-请求与响应的上下文(7)
一.请求的上下文: User-Agent 指明客户端的类型信息,服务器可以据此对资源的表述做抉择 二.请求的上下文: Referer 浏览器对来自某一页面的请求自动添加的头部 截图2 这对于我们的防盗 ...
- [LeetCode] 32. Longest Valid Parentheses 最长有效括号
Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...
- uniApp上传图片
项目中用到了上传图片的功能,记录一下.增强记忆. 要上传图片首先就要先选择图片,或者是先拍照,此时先调用的是 chooseImage 接口,此接口可选择拍照也可以从相册中选择. 它有几个参数,具体可以 ...
- oracle--10GRAC集群搭建问题OUI-25031
一,问题描述 安装RAC的过程中在结束 的阶段出现的错误 02,解决方式 这个可能在root.sh 执行的时候报错 由于版本问题: 修改vim /etc/redhat-release 把6.9改为4. ...
- mysql 基本操作 四
1.临时表 当绘画结束时,临时表会自动销毁,无法用show tables 查看 临时表. MariaDB [jason]> create temporary table tmp(pro ),ci ...
- C# 1.0 新特性之异步委托(AP、APM)
Ø 前言 C# 异步委托也是属于异步编程中的一种,可以称为 Asynchronous Programming(异步编程)或者 Asynchronous Programming Model(异步编程模 ...
- linux下c++如何输入不回显
#include <stdio.h> #include <termios.h> #include <unistd.h> #include <iostream& ...
- 使用 Valgrind 检测 C++ 内存泄漏
Valgrind 的介绍 Valgrind 可以用来检测程序是否有非法使用内存的问题,例如访问未初始化的内存.访问数组时越界.忘记释放动态内存等问题.在 Linux 可以使用下面的命令安装 Valgr ...
- java8 List集合的排序,求和,取最大值,按照条件过滤
public class Java8Test { public static void main(String[] args) { Person p1 = new Pe ...