$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)$。

例题:P3846 [TJOI2007]可爱的质数

代码:

#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算法(大小步算法)的更多相关文章

  1. BSGS(大小步)算法

    BSGS算法主要用于求解形如ax≡b(mod p)的式子中x的值. 在这里我们不妨设 x=k1*n-k2 这时我们就可以将式子转化为 ak1*n≡b*ak2(mod p) 这里的n我们设为√p,所以我 ...

  2. BSGS算法(大步小步算法)

    计算\(y^x ≡ z \ mod\ p\) 中 \(x\) 的解. 这个模板是最小化了\(x\) , 无解输出\(No \ Solution!\) map<ll,ll>data; ll ...

  3. Discrete Logging ZOJ - 1898 (模板题大小步算法)

    就是求Ax三B(mod C)当C为素数时 #include<cstdio> #include<cstring> #include<cmath> #include&l ...

  4. [模板]大步小步算法——BSGS算法

    大步小步算法用于解决:已知A, B, C,求X使得 A^x = B (mod C) 成立. 我们令x = im - j | m = ceil(sqrt(C)), i = [1, m], j = [0, ...

  5. 离散对数及其拓展 大步小步算法 BSGS

    离散对数及其拓展 离散对数是在群Zp∗Z_{p}^{*}Zp∗​而言的,其中ppp是素数.即在在群Zp∗Z_{p}^{*}Zp∗​内,aaa是生成元,求关于xxx的方程ax=ba^x=bax=b的解, ...

  6. 离散对数&&大步小步算法及扩展

    bsgs algorithm ax≡b(mod n) 大步小步算法,这个算法有一定的局限性,只有当gcd(a,m)=1时才可以用 原理 此处讨论n为素数的时候. ax≡b(mod n)(n为素数) 由 ...

  7. 【题解】Matrix BZOJ 4128 矩阵求逆 离散对数 大步小步算法

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4128 大水题一道 使用大步小步算法,把数字的运算换成矩阵的运算就好了 矩阵求逆?这么基础的线 ...

  8. Atitit 图像处理30大经典算法attilax总结

    Atitit 图像处理30大经典算法attilax总结 1. 识别模糊图片算法2 2. 相似度识别算法(ahash,phash,dhash)2 3. 分辨率太小图片2 4. 横条薯条广告2 5. 图像 ...

  9. GJM : 数据结构 - 轻松看懂机器学习十大常用算法 [转载]

     转载请联系原文作者 需要获得授权,非法转载 原文作者将享受侵权诉讼 文/不会停的蜗牛(简书作者)原文链接:http://www.jianshu.com/p/55a67c12d3e9 通过本篇文章可以 ...

随机推荐

  1. 在Chrome上运行安卓(ARC环境)

    测试时所用Chrome版本为67 (Win10 64bit) 1,安装ARC Welder插件(100多M):https://chrome.google.com/webstore/detail/arc ...

  2. Codeforces 652F 解题报告

    题意 有n只蚂蚁在长度为m个格子的环上,环上的格子以逆时针编号,每只蚂蚁每秒往它面向的方向移动一格.如果有两只蚂蚁相撞则相互调换方向,问t秒后每只蚂蚁的位置. 题解 首先通过观察可以发现 蚂蚁相撞产生 ...

  3. Thread&ThreadPool、Parallel、Async和Await用法总结

    1.线程和线程池Thread&ThreadPool //线程初始化时执行方法可以带一个object参数,为了传入自定义参数,所以执行需单独调用用于传参. Console.WriteLine(& ...

  4. SpringBoot第七篇:整合Mybatis-Plus

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10881666.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言   一看这个名 ...

  5. HDU 5047 Sawtooth 找规律+拆分乘

      Sawtooth Think about a plane: ● One straight line can divide a plane into two regions. ● Two lines ...

  6. Intellij IDEA的安装教程

    一.下载安装 1.打开官网:http://www.jetbrains.com/idea/,点击页面中的“DOWNLOAD” 2.根据自己的需要选择下载的IntelliJ IDEA版本,此处我的电脑是W ...

  7. Redis(六)Lua脚本的支持

    Redis为什么需要Lua脚本的支持 当应用需要Redis完成一些Redis命令不支持的特性时,要么扩展Redis client或者更甚至编写c扩展Redis server.这都大大造成了应用的实现的 ...

  8. vue-如何实现带参数跳转页面

    [前后端分离项目之vue框架经验总结] 文/朱季谦 在vue框架的前端页面上,若要实现页面之间的带参数跳转,可参考以下实现过程: 例如,点击截图中的“查看试卷”,可实现带参跳转到相应的试卷页面,该功能 ...

  9. PIE SDK矢量栅格化算法

    1.算法功能简介 矢量栅格化,由矢量数据向栅格数据的转换一般比较方便.对于点.线目标,由其所在的栅格行.列数表示,对于面状目标,则需判定落人该面积内的像元.通常栅格(像元)尺寸均大于原来坐标表示的分辨 ...

  10. Python 绘图与可视化 matplotlib text 与transform

    Text 为plots添加文本或者公式,反正就是添加文本了 参考链接:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.text.html#ma ...