离散对数,giant-step baby-step,拓展giant-step baby-step (poj 2417, hdu 2815)

普通giant-step baby-step:

poj 2417

题意:

B^L==N(MOD P), 给出P,B,N, 求最小的非负L。

限制:

2 <= P < 2^31 && P为素数; 2 <= B <P; 1 <= N < P

思路:

离散对数,用giant-step baby-step解决。

普通giant-step baby-step过程,要求P为素数:

令s = ceil(sqrt(P)), 则L = b * s + r (0 <= b, r < s),

即B^L = B^(b * s) * B^r。把所有B^r放入hash表中,从小到大枚举b,得到N^(b * s) * B^r = n。

费马小定理a^(m-1)=1(mod m), m为素数, 可得:

1) a^0=1,所以循环节小于等于m,即如果存在解,则最小解x<=m

2) 对于a^s模m的逆元为a^(m-s-1)

拓展giant-step baby-step:

hdu 2815

题意:

给出K,P,N, 求最小的D使得:K^D == N(MOD P)

限制:

1 <= K,P,N <= 1e9; 注意P不一定是素数。

思路:

离散对数

因为, P不一定是素数, 所以用拓展giant-step baby-step解决。

拓展giant-step baby-step思路:

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

对于方程:A^x + Cy = B, 我们拿出若干A出来与C来小区公共因子,使(A, C) = 1为止, 然后可以得到类似这样的式子:a * A^x‘ + C‘y = B, 然后用拓展欧几里得计算结果,其余部分与普通giant-step baby-step相似。

注意:

假设消因子过程做了cnt次,最后的答案ans为, 如果ans < cnt的话,会有问题,因为由上面过程算出来的答案是最后加上cnt的,所以会有错。所以还要加上一步,从先从 0 到 50 枚举答案,找不到答案,再执行上面的过程。因为P < 1e9, 每次消因子最少消2,所以cnt < 50。

				
时间: 2024-10-05 05:42:21

离散对数,giant-step baby-step,拓展giant-step baby-step (poj 2417, hdu 2815)的相关文章

HDU 2815 Mod Tree 离散对数 扩展Baby Step Giant Step算法

链接:http://acm.hdu.edu.cn/showproblem.php?pid=2815 题意: 思路:与上题不同,这道题不要求m是素数,是利用扩展Baby Step Giant Step算法求离散对数. 以下转载自:AekdyCoin [扩展Baby Step Giant Step] [问题模型] 求解 A^x = B (mod C) 中 0 <= x < C 的解,C 无限制(当然大小有限制--) [写在前面] 这个问题比较麻烦,目前网络上流传许多版本的做法,不过大部分已近被证明

POJ 2417 Discrete Logging ( Baby step giant step )

Discrete Logging Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3696   Accepted: 1727 Description Given a prime P, 2 <= P < 231, an integer B, 2 <= B < P, and an integer N, 1 <= N < P, compute the discrete logarithm of N, b

HDU 2815 Mod Tree (扩展 Baby Step Giant Step )

Mod Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 96 Accepted Submission(s): 38   Problem Description   The picture indicates a tree, every node has 2 children.  The depth of the nodes whos

POJ 2417 Discrete Logging 离散对数

链接:http://poj.org/problem?id=2417 题意: 思路:求离散对数,Baby Step Giant Step算法基本应用. 以下转载自:AekdyCoin [普通Baby Step Giant Step] [问题模型] 求解 A^x = B (mod C) 中 0 <= x < C 的解,C 为素数 [思路] 我们可以做一个等价 x = i * m + j  ( 0 <= i < m, 0 <=j < m) m = Ceil ( sqrt( C

HDU 2815 扩展baby step giant step 算法

题目大意就是求 a^x = b(mod c) 中的x 用一般的baby step giant step 算法会超时 这里参考的是http://hi.baidu.com/aekdycoin/item/236937318413c680c2cf29d4 map平衡树查找值 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <cmath> 5 #include <

[SoapUI] 循环遍历某个Test Case下的所有Test Step,将Cookie传递给这些Test Step

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import com.eviware.soapui.support.types.StringToStringMap  //Get cookie's value from the project level properties String cookie = context.expand( '${#Project#cookie}' ) log.info "cookie : "+cookie //Put

离散对数二连 poj 2417 Discrete Logging &amp; HDU 2815 Mod Tree

题目就不贴了.都是一样的套路求解a^x % c = b的最小x 注意HDU的题目很坑,有b比c大和题目中输出信息为全角引号的坑 下面贴的是HDU的版本,poj的改一下a,b,c顺序和输出就好 #include <iostream> #include <cstring> #include <algorithm> #include <cmath> using namespace std; typedef long long LL; #define MOD 999

【poj2417】baby step giant step

最近在学习数论,然而发现之前学的baby step giant step又忘了,于是去翻了翻以前的代码,又复习了一下. 觉得总是忘记是因为没有彻底理解啊. 注意baby step giant step只能用在b和p互质的情况下,因为只有b和p互质的情况下,b才有mod p下的逆元.(下面要用到逆元) 当b和p不互质,就要处理一下.现在就正在做这么一题,方法以后再写. 求a^(-m)就用到了求逆元了,那么如何求逆元呢?我学了两种方法: ·1:欧拉定理:当a和n互质,a^φ ( n) ≡ 1(mod

Error page: /admin/makehtml_all.php?action=make&amp;step=10

DedeCMS Error Warning!Technical Support: http://bbs.dedecms.comError page: /admin/makehtml_all.php?action=make&step=10Error infos: 无法使用数据库 dedecms,在后台更新网站的时候提示这样的错误应该怎么解决? 织梦代码对数据库错误信息做了自定义,根据代码提供的信息分析不出具体原因来检查MYSQL数据库是否可连接,数据库账号口令及权限是否正确 <?php req