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 ...
随机推荐
- CentOS7基础建站指南(笔记)
由于前段时间腾讯云打折,所以买了一台小服务器,想着以后写几个小网站,博客什么的,但是一开始就遇到了难题,大概就是Linux服务器的配置问题,比如如何假设服务器,配置非root用户,配置服务器数据的非r ...
- 从一个bug谈谈psqlodbc游标的一点认识
本文源于最近修正的一个关于psqlodbc的bug,该bug在近期的psqlodbc的git上也有人提交了修正. 关于该bug的修正代码可以看这里: https://git.postgresql.or ...
- 自适应大邻域搜索代码系列之(1) - 使用ALNS代码框架求解TSP问题
前言 上次出了邻域搜索的各种概念科普,尤其是LNS和ALNS的具体过程更是描述得一清二楚.不知道你萌都懂了吗?小编相信大家早就get到啦.不过有个别不愿意透露姓名的热心网友表示上次没有代码,遂不过瘾啊 ...
- 4、TensorFlow基础(二)常用API与变量作用域
1.图.操作和张量 TensorFlow 的计算表现为数据流图,所以 tf.Graph 类中包含一系列表示计算的操作对象(tf.Operation),以及在操作之间流动的数据 — 张量对象(tf.Te ...
- Django中的Cookie--实现登录
Django中的Cookie--实现登录 Django Cookie Cookie Cookie 是什么 保存在浏览器端的键值对,让服务器提取有用的信息. 为什么要有 Cookie 因为HTTP请求 ...
- 【总结】sqli-labs Less(1-35) 小结
0x00 工具 phpstudy2016:链接:http://pan.baidu.com/s/1bpbEBCj 密码:fmr4 sqli-labs-master:链接:http://pan.bai ...
- Mac下运行git报错"xcrun: error: invalid active developer path .."
错误:xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun ...
- jenkins配置构建执行状态
运行构建 在项目 左侧列表点击 “立即构建” ,在 “Build History” 列表中,会看到执行状态,蓝色圆点表示构建成功,红色圆点表示构建失败 点击 构建失败的任务(红色的小圆点).然后点击“ ...
- solr集群的搭建教程和使用入门
1 什么是SolrCloud? SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud. 当一个系统的索引数据量少的时候 ...
- centOS 7下无法启动网络(service network start)错误解决办法(应该是最全的了。。。)
今天在centOS 7下更改完静态ip后发现network服务重启不了,翻遍了网络,尝试了各种方法,终于解决了. 现把各种解决方法归纳整理,希望能让后面的同学少走点歪路... 首先看问题:执行serv ...