现在我来介绍一种算法叫做Baby Step Giant Step。它是用来解决如下方程最小正整数解的

    其中

如果,那么我们可以先取模,即,所以在这里我们只讨论的情况。

普通Baby Step Giant Step的步骤是这样的:

(1)首先确定的下限是0,上限是,我们令

(2)把的值存到一个Hash表里面

(3)把的值一一枚举出来,每枚举一个就在Hash表里面寻找是否有一个值满足

,如果有则找到答案,否则继续

(4)最终答案就是的值对应的原来的幂

上面是普通Baby Step Giant Step的步骤,比较简单,只适用为素数的情况。如果为合数呢?

为合数时,我们就需要把Baby Step Giant Step扩展一下。在普通Baby Step Giant Step中,由于是素数,那么,所以一定有唯一解的。那么,当为合数时,我们可以这样处理:

对于方程,我们拿出若干个出来与来消去公共因子,使得为止,那么此时我们就可以直接通过扩展欧几里得来计算结果了。


题目:http://www.spoj.com/problems/MOD/


#include <iostream>
#include <string.h>
#include <stdio.h>
#include <math.h>using namespace std;
typedef long long LL;const int MOD = 99991;
const int N = 100005;struct Hash
{bool f;int id;int val;
};Hash hash[N];void Init()
{for(int i=0; i<N; i++){hash[i].f = 0;hash[i].id = -1;hash[i].val = -1;}
}void Insert(int id,LL val)
{LL t = val % MOD;while(hash[t].f && hash[t].val != val){t++;t %= MOD;}if(!hash[t].f){hash[t].f = 1;hash[t].id = id;hash[t].val = val;}
}int Find(LL val)
{LL t = val % MOD;while(hash[t].f && hash[t].val != val){t++;t %= MOD;}if(!hash[t].f) return -1;return hash[t].id;
}LL gcd(LL a,LL b)
{return b ? gcd(b,a%b):a;
}void extend_Euclid(LL a,LL b,LL &x,LL &y)
{if(b == 0){x = 1;y = 0;return;}extend_Euclid(b,a%b,x,y);LL tmp = x;x = y;y = tmp - (a / b) * y;
}LL Baby_Step(LL A,LL B,LL C)
{LL ret = 1;for(int i=0; i<=50; i++){if(ret == B) return i;ret = ret * A % C;}LL ans = 1;LL tmp,cnt = 0;while((tmp = gcd(A,C)) != 1){if(B % tmp) return -1;B /= tmp;C /= tmp;ans = ans * (A / tmp) % C;cnt++;}LL M = ceil(sqrt(1.0*C));LL t = 1;for(int i=0; i<M; i++){Insert(i,t);t = t * A % C;}for(int i=0; i<M; i++){LL x,y;extend_Euclid(ans,C,x,y);LL val = x * B % C;val = (val % C + C) % C;LL j = Find(val);if(j != -1) return i * M + j + cnt;ans = ans * t % C;}return -1;
}int main()
{LL A,B,C;while(cin>>A>>C>>B){Init();if(A + B + C == 0) break;A %= C; B %= C;LL ans = Baby_Step(A,B,C);if(ans == -1){puts("No Solution");continue;}cout<<ans<<endl;}return 0;
}

离散对数(Baby Step Giant Step)相关推荐

  1. BZOJ 2242([SDOI2011]计算器-Baby Step Giant Step第1题)

    2242: [SDOI2011]计算器 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 744  Solved: 289 [Submit][Statu ...

  2. NOI数学:大步小步(Baby Step Giant Step,BSGS)算法

    BSGS算法求 高次同余方程:1.可爱的质数 2.计算器 BSGS算法求 高次同余方程:1.可爱的质数 2.计算器_啦啦啦32421的博客-CSDN博客 大步小步算法(BSGS)及扩展 & b ...

  3. 【数学】Baby Step,Giant Step

    给定整数 a,b,pa,b,pa,b,p 且 a,pa,pa,p 互质,请求出高次同余方程 ax≡b(modp)a^x\equiv b\pmod pax≡b(modp) 的非负整数解. 首先, a0≡ ...

  4. 【Step By Step】将Dotnet Core部署到Docker下

    一.使用.Net Core构建WebAPI并访问Docker中的Mysql数据库 这个的过程大概与我之前的文章<尝试.Net Core-使用.Net Core + Entity FrameWor ...

  5. python写一个通讯录step by step V3.0

    python写一个通讯录step by step V3.0 更新功能: 数据库进行数据存入和读取操作 字典配合函数调用实现switch功能 其他:函数.字典.模块调用 注意问题: 1.更优美的格式化输 ...

  6. C#2.0实例程序STEP BY STEP--实例二:数据类型

    C#2.0实例程序STEP BY STEP--实例二:数据类型 与其他.NET语言一样,C#支持Common Type Sysem(CTS),其中的数据类型集合不仅包含我们熟悉的基本类型,例如int, ...

  7. 文本分类step by step(二)

    (注:如有转载请标明作者:finallyliuyu, 和出处:博客园) <文本分类 step by step(一)> 在<文本分类step by step(一)>中,我们从处理 ...

  8. 数据库设计Step by Step (9)——ER-to-SQL转化

    2019独角兽企业重金招聘Python工程师标准>>> 引言:前文(数据库设计 Step by Step (8)--视图集成)讨论了如何把局部ER图集成为全局ER图.有了全局ER图后 ...

  9. ActionScript 3.0 Step By Step系列(五):走在面向对象开发的路上,以类为基础去思考编程问题...

    面向对象的程序设计(Object-Oriented Programming,简记为OOP)是一种功能非常强大的编程方法,立意于创建软件重用代码,以类为基础去思考编程问题. ActionScript 3 ...

最新文章

  1. MaterialDesign动画
  2. 运维常见统计表模板(word版)
  3. PostgreSQL csvlog 源码分析
  4. Spark 1.3 新特性 :176个贡献者,1000+ patches
  5. 大数开方(Java版)
  6. php array 如何访问,php – 如何访问$array [@key]值
  7. html5触边反弹,第四章课件.PPT_数字电子技术基础(ppt课件)_ppt_大学课件预览_高等教育资讯网...
  8. Python代码覆盖性测试入门
  9. Nginx安装出现错误解决记录
  10. 2017安装包打开没反应_虚拟机中红帽linux连不上网络以及自带浏览器无法打开等问题的解决办法...
  11. 抗锯齿_像素画技巧AA手工抗锯齿教程
  12. java对单词加密_用JAVA写一个简单的英文加密器
  13. json转为tfrecord格式文件怎么转_JPG图片怎么转换成PDF?图片转PDF的免费软件有这些...
  14. CDC Comms Interface 设备解决方案
  15. js/vue两张图片合成一张画布
  16. 爬虫-12306余票查询
  17. JavaEE程序猿面向对象世界观⑥
  18. 每个 Apache Kafka 开发者都应该知道的5件事
  19. 随记:spri排除Bean时not be excluded because they are not auto-configuration classes
  20. A10+Android4.0 音频驱动

热门文章

  1. 创建订单 - 填充新订单数据
  2. AOP日志-查询日志流程分析
  3. 哨兵机制服务器环境准备
  4. Eureka Server
  5. 范式化设计和反范式化设计优缺点
  6. 按键改变元素背景颜色 链式编程的原理 评分案例 each方法的使用
  7. 元素的样式设置 元素类样式的操作 开关灯效果 获取兄弟元素 当前元素的兄弟元素样式
  8. ORACLE 表类型 OLTP和OLAP
  9. Nginx教程-日志配置
  10. java进制原码_Java 一一 进制、原码 反码 补码、移位操作