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 通过本篇文章可以 ...
随机推荐
- pytest--fixture
前戏 fixture是在测试函数运行前后,由pytest执行的外壳函数.fixture中的代码可以定制,满足多变的测试需求,包括定义传入测试中的数据集.配置测试前系统的初始状态.为批量测试提供数据源等 ...
- 请求与上传文件,Session简介,Restful API,Nodemon
作者 | Jeskson 来源 | 达达前端小酒馆 请求与上传文件 GET请求和POST请求 const express = require('express'); const app = expre ...
- HDU 4005 The war(边双连通)
题意 给定一张 \(n\) 个点 \(m\) 条边的无向连通图,加入一条边,使得图中权值最小的桥权值最大,如果能使图中没有桥则输出 \(-1\). 思路 先对原图边双缩点,然后变成了一棵树.在 ...
- 首次体验MangoDB
Author:SimpleWu MongoDB官方网:https://www.mongodb.com/ MongoDB中文网:http://www.mongodb.org.cn/ 什么是MongoDB ...
- C# HTTP系列12 以form-data方式上传键值对集合到远程服务器
系列目录 [已更新最新开发文章,点击查看详细] 使用multipart/form-data方式提交数据与普通的post方式有一定区别.multipart/form-data的请求头必须包含一个 ...
- 分库分表数据库自增 id
分库分表之后,ID 主键如何处理? 面试题 分库分表之后,id 主键如何处理? 面试官心理分析 其实这是分库分表之后你必然要面对的一个问题,就是 id 咋生成?因为要是分成多个表之后,每个表都是从 1 ...
- 探索FFmpeg
Part1 :FFmpeg简介 FFmpeg定义 FFmpeg是一款音视频编解码工具,为开发者提供了大量音视频处理接口. FF指的是"Fast Forward" FFmpeg历史 ...
- Destoon手机搜索点击提示 http 403 forbidden解决方法
以下是网上搜到的答案: 最近发现用destoon开发的手机版网站,在手机版百度搜素网站的时候,点击之后出现 http 403 forbidden的弹出窗.必须再次的刷新网页才可以打开网站.出现这个问题 ...
- GT性能测试Android版使用说明
1 GT简介 GT(随身调) Android版是腾讯 MIG 专项测试组自行研发的 Android APP 随身调测平台,它是直接运行在手机上的“集成调测环境”(ITE, Integrated Tes ...
- C#调用WebService(服务引用-xml)
情形:做接口调用三方WebService,WebService地址外网无法访问 方案: Step1:内网环境(可访问三方WebService地址,此处地址以http://127.0.0.1/WebSe ...