bsgs(Baby Steps Giant Steps)算法
BSGS算法(Baby Steps Giant Steps算法,大步小步算法,北上广深算法,拔山盖世算法)
适用问题
对于式子:
$$x^y=z(mod_p)$$
已知x,z,p,p为质数;
求解一个最小非负整数y;
存在一个y,属于[0,p-2](费马小定理)
于是有了一个笨拙的方法,枚举y
枚举y,期望效率:O(P)
寻求一种优化:
对式子变型:
设:$$y=i\sqrt{p}-j$$
则$$x^{i\sqrt{p}-j}=z(mod_p)$$
——这个变型的用意在于把y拆开
枚举y,变成枚举,i,j;
i在1~$\sqrt{p}$之间,j在0~$\sqrt{p}$之间
(根号上取整,其实i,j的范围大可大些——只要保证y不会小于0)
枚举(i,j),期望效率:$O(\sqrt{p}*\sqrt{}p)$
本质上没有优化
接着变型:
$$x^{i\sqrt{p}}=z*x^{j}(mod_p)$$
——这个变型的用意在于真正把y分离为两部分
枚举j,把等号右边的模后得数置于hash_table,此时同一个得数只留最大的j值;
从小到大枚举i,计算等号左边的模后得数,查询hash_table,第一个成功查询的i,与其相应的j,组成$i\sqrt{p}-j$即为最小的y,
期望效率:$O(\sqrt{p}*T(hash))$
效率优异,拔山盖世的bsgs算法,就是这样了;
例题:
代码:
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
const int ss=;
using namespace std;
int hash_tab[],tot;
struct ss{
int nu,next,j;
}data[];
void work();
void work1();
void work2();
void work3();
LL Sqr(LL ,int );
int hash(int, int ,int );
LL z,y,p;
bool flag;
int main()
{
work();
}
void work(){
int T,K;
scanf("%d%d",&T,&K);
while(T--){
scanf("%lld%lld%lld",&y,&z,&p);
if(K==)
work1();
if(K==)
work2();
if(K==)
work3();
}
}
void work1(){
int i,j,k;
printf("%lld\n",Sqr(y,z));
}
void work2(){
int ans,less;
if((!(y%p)&&z)||((y%p)&&!z)){
printf("Orz, I cannot find x!\n");return;
}
printf("%lld\n",Sqr(y%p,p-)*z%p);
}
void work3(){
long long ysqrtp,sqrtp=ceil(sqrt(p));
memset(hash_tab,,sizeof(hash_tab));
memset(data,,sizeof(data));
long long l=,r=z%p;
int i,j;
if((!(y%p)&&z)||((y%p)&&!z)){
printf("Orz, I cannot find x!\n");return;
}
ysqrtp=Sqr(y,sqrtp);
for(i=;i<=sqrtp;i++)
hash(r,i,),(r*=y)%=p;
for(i=;i<=sqrtp;i++){
(l*=ysqrtp)%=p;
if((j=hash(l,,))!=-){
printf("%lld\n",i*sqrtp-j);
return ;
}
}
printf("Orz, I cannot find x!\n");
}
LL Sqr(LL x,int n){
LL ret=;
while(n){
if(n&)(ret*=x)%=p;
(x*=x)%=p;n>>=;
}
return ret;
}
int hash(int num,int j,int flag){
int tem;
for(tem=hash_tab[num%ss];tem;tem=data[tem].next){
if(data[tem].nu==num){
if(!flag&&j>data[tem].j)
data[tem].j=j;
return data[tem].j;
}
if(!data[tem].next&&!flag){
data[tem].next=++tot;
data[tot].j=j;
data[tot].nu=num;
return -;
}
}
if(!flag){
hash_tab[num%ss]=++tot;
data[tot].j=j;
data[tot].nu=num;
}
return -;
}
bsgs(Baby Steps Giant Steps)算法的更多相关文章
- BSGS(Baby Steps,Giant Steps)算法详解
BSGS(Baby Steps,Giant Steps)算法详解 简介: 此算法用于求解 Ax≡B(mod C): 由费马小定理可知: x可以在O(C)的时间内求解: 在x=c之后又会循环: 而BS ...
- 『高次同余方程 Baby Step Giant Step算法』
高次同余方程 一般来说,高次同余方程分\(a^x \equiv b(mod\ p)\)和\(x^a \equiv b(mod\ p)\)两种,其中后者的难度较大,本片博客仅将介绍第一类方程的解决方法. ...
- 【学习笔记】Baby Step Giant Step算法及其扩展
1. 引入 Baby Step Giant Step算法(简称BSGS),用于求解形如\(a^x\equiv b\pmod p\)(\(a,b,p\in \mathbb{N}\))的同余方程,即著名的 ...
- POJ 3243 Clever Y (求解高次同余方程A^x=B(mod C) Baby Step Giant Step算法)
不理解Baby Step Giant Step算法,请戳: http://www.cnblogs.com/chenxiwenruo/p/3554885.html #include <iostre ...
- 解高次同余方程 (A^x=B(mod C),0<=x<C)Baby Step Giant Step算法
先给出我所参考的两个链接: http://hi.baidu.com/aekdycoin/item/236937318413c680c2cf29d4 (AC神,数论帝 扩展Baby Step Gian ...
- HDU 2815 Mod Tree 离散对数 扩张Baby Step Giant Step算法
联系:http://acm.hdu.edu.cn/showproblem.php?pid=2815 意甲冠军: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQ ...
- HDU 2815 扩展baby step giant step 算法
题目大意就是求 a^x = b(mod c) 中的x 用一般的baby step giant step 算法会超时 这里参考的是http://hi.baidu.com/aekdycoin/item/2 ...
- BSGS算法_Baby steps giant steps算法(无扩展)详解
Baby Steps-Varsity Giant Step-Astronauts(May'n・椎名慶治) 阅读时可以听听这两首歌,加深对这个算法的理解.(Baby steps少女时代翻唱过,这个原唱反 ...
- BSGS_Baby steps giant steps算法
BSGS这个主要是用来解决这个题: A^x=B(mod C)(C是质数),都是整数,已知A.B.C求x. 在具体的题目中,C一般是所有可能事件的总数. 解: 设m = ceil(sqrt(C))(ce ...
随机推荐
- 40.oracle事务
一.事务特性 事务必须具备以下四个特性,简称ACID属性 原子性(Atomicity):事务是一个完整的操作.事务的各步操作是不可分割的(原子的):要么都执行,要么都不执行场景:银行转账 A-100 ...
- 2018徐州网络赛 - Trace
题意:n个左下角为原点右上角在第一象限的矩形不断覆盖,求最后形成的图形的周长 x和y是独立的,分别维护两棵线段树,一棵表示x坐标下最大的y值,另一棵表示y坐标下最大的x值 从覆盖的角度来考虑,如果逆序 ...
- [转] Scala Async 库 (Scala future, await, async)
[From] https://colobu.com/2016/02/15/Scala-Async/ 在我以前的文章中,我介绍了Scala Future and Promise.Future代表一个异步 ...
- wireshark 抓包
Wireshark(前称Ethereal)是一个网络数据包分析软件.网络数据包分析软件的功能是截取网络数据包,并尽可能显示出最为详细的网络数据包数据.Wireshark使用WinPCAP作为接口,直接 ...
- 关于README的内容
如何在开发项目的时候写出标准的README文件? 为什么要写这篇博客? 关于README的编写,这个也十分的重要,如果你觉得只是随便写写,那么你就错了:编写这部分也是相当的重要的.工欲善其事,必先利其 ...
- win7 免安装MariaDB
1. 官网下载MariaDB的windows版本 地址:https://downloads.mariadb.org/mariadb/10.0.17/ 目前最新版本是10.0.17 2. 下载完成后 ...
- JavaScript中的不可变性(Immutability)
什么是不可变性(Immutability)? 即某个变量在进行了某个操作之后,其本身没有发生变化,比如对于字符串而言,对字符串的任何操作都会改变字符串本身的值,而是在字符串的基础上复制出来一个然后再改 ...
- sysv-rc-conf介绍
sysv-rc-conf简介 sysv-rc-conf是一个强大的服务管理程序,Ubuntu运行级别Linux 系统任何时候都运行在一个指定的运行级上,不同的运行级的程序和服务都不同,所要完成的工作和 ...
- django notes 四: Writing views
views 其实没什么可看的, 在 django 中 views 就是 controller, 是处理请求的, 就是一个普通的 python 方法. 一般从 request 中提取请求参数, 然后 ...
- Tomcat *的安装和运行(绿色版和安装版都适用)
不多说,直接上干货! 前提, Tomcat *的下载(绿色版和安装版都适用) 一.Tomcat的安装版 1.新建安装目录 2.放置安装版的tomcat 3.双击 4.点击 I agree 5.选择“F ...