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算法,就是这样了;



例题:

[SDOI2011]计算器

代码:

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

  1. BSGS(Baby Steps,Giant Steps)算法详解

    BSGS(Baby Steps,Giant Steps)算法详解 简介: 此算法用于求解 Ax≡B(mod C): 由费马小定理可知: x可以在O(C)的时间内求解:  在x=c之后又会循环: 而BS ...

  2. 『高次同余方程 Baby Step Giant Step算法』

    高次同余方程 一般来说,高次同余方程分\(a^x \equiv b(mod\ p)\)和\(x^a \equiv b(mod\ p)\)两种,其中后者的难度较大,本片博客仅将介绍第一类方程的解决方法. ...

  3. 【学习笔记】Baby Step Giant Step算法及其扩展

    1. 引入 Baby Step Giant Step算法(简称BSGS),用于求解形如\(a^x\equiv b\pmod p\)(\(a,b,p\in \mathbb{N}\))的同余方程,即著名的 ...

  4. 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 ...

  5. 解高次同余方程 (A^x=B(mod C),0<=x<C)Baby Step Giant Step算法

    先给出我所参考的两个链接: http://hi.baidu.com/aekdycoin/item/236937318413c680c2cf29d4 (AC神,数论帝  扩展Baby Step Gian ...

  6. HDU 2815 Mod Tree 离散对数 扩张Baby Step Giant Step算法

    联系:http://acm.hdu.edu.cn/showproblem.php?pid=2815 意甲冠军: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQ ...

  7. HDU 2815 扩展baby step giant step 算法

    题目大意就是求 a^x = b(mod c) 中的x 用一般的baby step giant step 算法会超时 这里参考的是http://hi.baidu.com/aekdycoin/item/2 ...

  8. BSGS算法_Baby steps giant steps算法(无扩展)详解

    Baby Steps-Varsity Giant Step-Astronauts(May'n・椎名慶治) 阅读时可以听听这两首歌,加深对这个算法的理解.(Baby steps少女时代翻唱过,这个原唱反 ...

  9. BSGS_Baby steps giant steps算法

    BSGS这个主要是用来解决这个题: A^x=B(mod C)(C是质数),都是整数,已知A.B.C求x. 在具体的题目中,C一般是所有可能事件的总数. 解: 设m = ceil(sqrt(C))(ce ...

随机推荐

  1. CentOS7基础建站指南(笔记)

    由于前段时间腾讯云打折,所以买了一台小服务器,想着以后写几个小网站,博客什么的,但是一开始就遇到了难题,大概就是Linux服务器的配置问题,比如如何假设服务器,配置非root用户,配置服务器数据的非r ...

  2. 从一个bug谈谈psqlodbc游标的一点认识

    本文源于最近修正的一个关于psqlodbc的bug,该bug在近期的psqlodbc的git上也有人提交了修正. 关于该bug的修正代码可以看这里: https://git.postgresql.or ...

  3. 自适应大邻域搜索代码系列之(1) - 使用ALNS代码框架求解TSP问题

    前言 上次出了邻域搜索的各种概念科普,尤其是LNS和ALNS的具体过程更是描述得一清二楚.不知道你萌都懂了吗?小编相信大家早就get到啦.不过有个别不愿意透露姓名的热心网友表示上次没有代码,遂不过瘾啊 ...

  4. 4、TensorFlow基础(二)常用API与变量作用域

    1.图.操作和张量 TensorFlow 的计算表现为数据流图,所以 tf.Graph 类中包含一系列表示计算的操作对象(tf.Operation),以及在操作之间流动的数据 — 张量对象(tf.Te ...

  5. Django中的Cookie--实现登录

    Django中的Cookie--实现登录 Django Cookie  Cookie Cookie 是什么 保存在浏览器端的键值对,让服务器提取有用的信息. 为什么要有 Cookie 因为HTTP请求 ...

  6. 【总结】sqli-labs Less(1-35) 小结

    0x00   工具 phpstudy2016:链接:http://pan.baidu.com/s/1bpbEBCj 密码:fmr4 sqli-labs-master:链接:http://pan.bai ...

  7. Mac下运行git报错"xcrun: error: invalid active developer path .."

    错误:xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun ...

  8. jenkins配置构建执行状态

    运行构建 在项目 左侧列表点击 “立即构建” ,在 “Build History” 列表中,会看到执行状态,蓝色圆点表示构建成功,红色圆点表示构建失败 点击 构建失败的任务(红色的小圆点).然后点击“ ...

  9. solr集群的搭建教程和使用入门

    1 什么是SolrCloud? SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud. 当一个系统的索引数据量少的时候 ...

  10. centOS 7下无法启动网络(service network start)错误解决办法(应该是最全的了。。。)

    今天在centOS 7下更改完静态ip后发现network服务重启不了,翻遍了网络,尝试了各种方法,终于解决了. 现把各种解决方法归纳整理,希望能让后面的同学少走点歪路... 首先看问题:执行serv ...