数论——Baby Step Giant Step及扩展算法
来源:互联网 发布:淘宝网络环境异常 编辑:程序博客网 时间:2024/05/21 06:24
bsgs算法
Baby Step Giant Step算法,简称BSGS算法,也称为大步小步算法.
解决对象
离散对数:当
BSGS算法就是用来求解
求解步骤
设
对于枚举的每一个
不过还应该特判
对于多次调用
基本代码
这是我的code:
如果感觉不顺手,请看下面:
总有一款板子适合你!
来自这里
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<cmath> using namespace std; long long a,b,c,m,f[10000000]; map<long long,int> mp; long long qsm(long long x) //快速幂 { long long sum=1; long long aa=a; while (x>0) { if (x&1) sum=(sum*aa)%c; x=x>>1; aa=(aa*aa)%c; } return sum; } int main() { mp.clear(); while (scanf("%lld%lld%lld",&c,&a,&b)!=EOF) { mp.clear(); if (a%c==0) //判断a,c 是否互质,因为c 是质数,所以直接判断是否整除即可 { printf("no solution\n"); continue; } int p=false; m=ceil(sqrt(c)); long long ans; for (int i=0;i<=m;i++) { if (i==0) { ans=b%c; mp[ans]=i; continue; } ans=(ans*a)%c; mp[ans]=i; } long long t=qsm(m); ans=1; for (int i=1;i<=m;i++) { ans=(ans*t)%c; if (mp[ans]) { int t=i*m-mp[ans]; printf("%d\n",(t%c+c)%c); p=true; break; } } if (!p) printf("no solution\n"); } }
来自这里
LL BSGS(LL y,LL z,LL p){ map<LL,LL> ma; LL m=sqrt(p),tmp=0; ma.clear(); if(y%p==0&&z==0) return 1; if(y%p==0&&z!=0) return -1; for(int i=0;i<=m;i++) { if(!i) {tmp=z%p;ma[tmp]=i;continue;} tmp=(tmp*y)%p; ma[tmp]=i; } tmp=1;LL t=power(y,m,p); for(int i=1;i*i<=p;i++) { tmp=(tmp*t)%p; if(ma[tmp]) { LL ans=i*m-ma[tmp]; return ans; } } return -1;}
SDOI2011 计算器
题目描述
你被要求设计一个计算器完成以下三项任务:
1、给定y、z、p,计算y^z mod p 的值;
2、给定y、z、p,计算满足xy ≡z(mod p)的最小非负整数x;
3、给定y、z、p,计算满足y^x ≡z(mod p)的最小非负整数x。
为了拿到奖品,全力以赴吧!
输入输出格式
输入格式:
输入文件calc.in 包含多组数据。
第一行包含两个正整数T、L,分别表示数据组数和询问类型(对于一个测试点内的所有数
据,询问类型相同)。
以下T 行每行包含三个正整数y、z、p,描述一个询问。
输出格式:
输出文件calc.out 包括T 行.
对于每个询问,输出一行答案。
对于询问类型2 和3,如果不存在满足条件的,则输出“Orz, I cannot find x!”。
输入输出样例
输入样例#1:
3 1
2 1 3
2 2 3
2 3 3
输出样例#1:
2
1
2
输入样例#2:
3 2
2 1 3
2 2 3
2 3 3
输出样例#2:
2
1
0
输入样例#3:
4 3
2 1 3
2 2 3
2 3 3
2 4 3
输出样例#3:
0
1
Orz, I cannot find x!
0
数据规模和约定
题解
这里有三种问法,第一种问法就直接是带模的快速幂,没啥好说的。
第二种问法就是求线性方程解,那就用扩展欧几里得!
第三种问法就是本文考虑的BSGS算法,也就是一个板子题目吧。怎么写板子前面已经介绍过了。
code
- 数论——Baby Step Giant Step及扩展算法
- Baby step Giant step算法
- hdu2815 扩展Baby step,Giant step入门
- 扩展baby step giant step模版
- hdu——2815(数论之Baby Step Giant Step解决离散对数问题)
- Baby-step giant-step
- Baby-step giant-step
- baby step giant step
- Baby Step Giant Step
- Baby Step Giant Step
- Baby-Step Giant-Step
- POJ 2417:Discrete Logging——Baby Step, Giant Step
- HDU 2815 Mod Tree 离散对数 扩展Baby Step Giant Step算法
- Baby Step Giant Step 及扩展 进一步解释补充 和 poj 3243
- 【扩展Baby Step Giant Step解决离散对数问题】
- 【扩展Baby Step Giant Step解决离散对数问题】
- POJ 2417 Discrete Logging (Baby Step Giant Step算法)
- 【Baby-step giant-step Algorithm】poj3243,hdu2815
- jarsigner 应用认领签名
- spring cloud config 使用
- 智能一点
- 解决elasticsearch安装中文分词器
- JAVA总结(基本数据类型)
- 数论——Baby Step Giant Step及扩展算法
- 【Linux】 JDK安装及配置 (tar.gz版)
- Spring boot + Websocket 再篇
- sqlserver的几个分页语句
- Centos 安装JDK之如何下载jdk
- [LeetCode] 167.Two Sum II
- 【sql语句之】SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
- 【hadoop】DataNode用jps查看无法启动解决办法
- 【Sublime Text 3】用户自定义设置文件 (Preferences.sublime-settings — User)——解决tab和space混用问题