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 通过本篇文章可以 ...
随机推荐
- [LeetCode] 623. Add One Row to Tree 二叉树中增加一行
Given the root of a binary tree, then value v and depth d, you need to add a row of nodes with value ...
- [LeetCode] 337. House Robber III 打家劫舍之三
The thief has found himself a new place for his thievery again. There is only one entrance to this a ...
- MySQL学习笔记2————基础篇记录
这里以实验楼的数据库来记录,如有侵犯实验楼权益,请联系本人,必定删除 在此感谢实验楼提供的免费教程 MySQL 基础课程_SQL - 实验楼 一. 表project employee 任务:想要知道名 ...
- Azure DevOps Server 经验分享(国内重型工程公司)
受邀在上海为国内著名的重型工程公司的软件研发团队分享了Azure DevOps Server 的经验. http://www.cnblogs.com/danzhang/ DevOps MVP 张洪君 ...
- Github配置SSH密钥
设置SSH Key Github上连接已有仓库时的认证,是通过使用SSH的公开密钥 在终端terminal中输入 ssh-keygen 该命令的含义是 generate ssh key, 然后一直按回 ...
- JOSH是中国的“MicroEJ”~
很多人不了解JOSH,我们推荐大家去看看MicroEJ,我们是中国版的MICROEJ,下面的文章翻译自MICROEJ的官网,让大家直观的了解~ MICROEJ被定位为可连接对象的ANDROID™的小兄 ...
- Eureka与Zookeeper的区别
ACID与ACP的介绍
- 如何解决RIP的问题
如何解决RIP的问题 RIP的问题 优化或解决的方式 收敛慢,故障恢复时间长 触发更新 缺少对全局网络拓扑的了解 路由器基于拓扑信息,独立计算路由 存在选择次优路径的风险 将链路带宽作为选路参考 ...
- 基于Jquery的进度条插件(实用)
Spin.js 最喜欢这款插件了,动画图片的长度.粗细.速度和角度都可以灵活控制,想要做成什么样都可以. 源码下载 在线演示 Percentage Loader 一款轻量的 jQuery 进 ...
- C++ explicit 的用法,就是必须显示调用