离散对数

POJ 2417 Discrete Logging 离散对数

梦想与她 提交于 2019-12-22 05:16:52
链接: 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) ) 而这么分解的目的无非是为了转化为: (A^i)^m * A^j = B ( mod C) 之后做少许暴力的工作就能够解决这个问题: (1) for i = 0 -> m, 插入Hash (i, A^i mod C) (2) 枚举 i ,对于每个枚举到的i,令 AA = (A^m)^i mod C 我们有 AA * A^j = B (mod C) 显然AA,B,C均已知,而因为C为素数,那么(AA,C)无条件为1 于是对于这个模方程解的个数唯一(能够利用扩展欧几里得或 欧拉定理来求解) 那么对于得到的唯一解X,在Hash表中寻找,假设找到,则返回 i * m + j 注意:因为i从小到大的枚举,而Hash表中存在的j必定是对于某个剩余系内的元素X 是最小的(就是指标) 所以显然此时就能够得到最小解

离散对数――大步小步算法(BSGS)

匿名 (未验证) 提交于 2019-12-03 00:34:01
已知 a , b , P a , b , P ,且a与P互质,求解同余方程 a x ≡ b ( m o d P ) a x ≡ b ( m o d P ) 设 m = P √ m = P 设 x = i m + j x = i m + j ,即 i = x m i = x m , j = x m o d m j = x m o d m 所以满足 i ≤ m i ≤ m , j ≤ m j ≤ m 得 a i m + j ≡ b ( m o d P ) a i m + j ≡ b ( m o d P ) a j a i m ≡ b ( m o d P ) a j a i m ≡ b ( m o d P ) a j ≡ a i m b ( m o d P ) a j ≡ a i m b ( m o d P ) 先枚举j,将得到的 a j a j 存入hash表; 再枚举i,计算 a i m b a i m b ,是否存在hash表中,如果有,则找到了解,输出即可。 为保证答案最小,必须保证先枚举j,再枚举i,且保证 a j a j 在hash表中j从小到大排列 long long work( long long a, long long b, long long P) { long long m,v,e= 1 ,i; m=ceil(sqrt(P+ 0.5 )); v=pow_mod(a

离散对数――大步小步算法(BSGS)

匿名 (未验证) 提交于 2019-12-03 00:34:01
已知 a , b , P a , b , P ,且a与P互质,求解同余方程 a x ≡ b ( m o d P ) a x ≡ b ( m o d P ) 设 m = P √ m = P 设 x = i m + j x = i m + j ,即 i = x m i = x m , j = x m o d m j = x m o d m 所以满足 i ≤ m i ≤ m , j ≤ m j ≤ m 得 a i m + j ≡ b ( m o d P ) a i m + j ≡ b ( m o d P ) a j a i m ≡ b ( m o d P ) a j a i m ≡ b ( m o d P ) a j ≡ a i m b ( m o d P ) a j ≡ a i m b ( m o d P ) 先枚举j,将得到的 a j a j 存入hash表; 再枚举i,计算 a i m b a i m b ,是否存在hash表中,如果有,则找到了解,输出即可。 为保证答案最小,必须保证先枚举j,再枚举i,且保证 a j a j 在hash表中j从小到大排列 long long work( long long a, long long b, long long P) { long long m,v,e= 1 ,i; m=ceil(sqrt(P+ 0.5 )); v=pow_mod(a