Kangaroo算法
来源:互联网 发布:ip地址和域名限制 403 编辑:程序博客网 时间:2024/05/17 04:09
本算法要解决的问题是离散对数问题(discrete logarithm problem,DLP)。问题的描述如下:
G是一个乘法循环群,其中有一个元素h,且其生成元为g。要求求得一个x,使得h=gx。
对于这样一个问题,有如下的几种情况考虑:
下面开始具体的介绍算法的过程。
由于该问题是要解决一个离散对数问题,则两只袋鼠就可以设置为群G里面的两个元素,由生成元的定义,二者都可以用g的某个幂来表示,驯化袋鼠的幂次是已知的,而野生袋鼠的幂次是包含x的式子。二者相遇时,通过两只袋鼠的幂次的等式可以求出x。
算法首先定义两只袋鼠,tame和wild。tame的初始位置是T=g(a+b)/2,wild的初始位置是W=h(即gx)。然后定义一个跳跃的集合S={gs0,gs1,...,gsr: si=O((b-a)1/2), r=O(log(b-a))};以及一个映射v:G→{0,1,...,r}。这样,袋鼠的跳跃过程可以使用如下的式子表示:
对于k=0,1,...:
Tame Kangaroo:tk+1=tk*gsi ,其中i=v(tk) ;
Wild Kangaroo :wk+1=wk*gsj,其中j=v(wk) ;
为了以后计算的需要,在袋鼠跳跃的过程中记录下每次跳跃的距离:
D0(T) = D0(W) = 0;
Dk+1(T) = Dk(T) + si 其中i=v(tk) ;
Dk+1(W) = Dk(W) + sj 其中j=v(wk) ;
如果够幸运的话,在某几次跳跃之后,wild落入了tame的陷阱,二者相遇了,则可以知道:
tk = wl
g(a+b)/2 * gDk(T) = gx * gDl(W)
即:
x = (a+b)/2 + Dk(T) - Dl(W) (mod n)
这样,就求出了x值。
在S设置恰当的情况下,期望的跳数为(b-a)1/2+const ,单位为jumps/kangaroo。
在si=2i,i=0,1,...,r时,可以达到以上的效果。
分析可知,假设Tame的路径上有N个点,且si的中间值(mean value)为m的情况下,在Tame路径的每个点上成功的概率为1/m,且各个点的事件都是独立事件。这样,整个过程成功的概率为PS=1-(1-1/m)N≈1-e-ß,其中ß=N/m,且m是一个较大的数。为了达到最好的性能,可以设置m=µ* (b-a)1/2。例如,在ß=4,PS=0.98,并且在µ=1/4时,执行的总步骤数N+m,在数量级上为O((b-a)1/2)。更一般的,对于一个ß,如果µ=1/(2ß1/2),总共的执行步骤将为2(ß(b-a))1/2。
最后这一点性能方面的分析取自:
J.M. Pollard,"Monte Carlo methods for index computation ( mod p)", Math. Comp., vol.32. no.143(July, 1978), pp918-924
G是一个乘法循环群,其中有一个元素h,且其生成元为g。要求求得一个x,使得h=gx。
对于这样一个问题,有如下的几种情况考虑:
- 如果我们对x没有任何的信息,只知道x满足0<x<n=ord(g),可以使用如下的算法来解决:
- Shanks' baby step-gaint step method:时间和空间的需求是一个const*n1/2;
- Pollard's rho method:需要的时间约等于(PI*n/2)1/2,并且可以使用并行算法来加速解决的过程;
- 如果我们知道x满足0<a<=x<=b<n=ord(g):
- Shanks' baby step-gaint step method同样可以解决:时间和空间的需求是一个const*(b-a)1/2;
- Pollard's rho method不能利用到这个信息;
- Pollard’s Kangaroo算法:就是我们将要具体讲解的算法,它的预期操作步骤为2*(b-a)1/2个群元素的计算步骤。
下面开始具体的介绍算法的过程。
由于该问题是要解决一个离散对数问题,则两只袋鼠就可以设置为群G里面的两个元素,由生成元的定义,二者都可以用g的某个幂来表示,驯化袋鼠的幂次是已知的,而野生袋鼠的幂次是包含x的式子。二者相遇时,通过两只袋鼠的幂次的等式可以求出x。
算法首先定义两只袋鼠,tame和wild。tame的初始位置是T=g(a+b)/2,wild的初始位置是W=h(即gx)。然后定义一个跳跃的集合S={gs0,gs1,...,gsr: si=O((b-a)1/2), r=O(log(b-a))};以及一个映射v:G→{0,1,...,r}。这样,袋鼠的跳跃过程可以使用如下的式子表示:
对于k=0,1,...:
Tame Kangaroo:tk+1=tk*gsi ,其中i=v(tk) ;
Wild Kangaroo :wk+1=wk*gsj,其中j=v(wk) ;
为了以后计算的需要,在袋鼠跳跃的过程中记录下每次跳跃的距离:
D0(T) = D0(W) = 0;
Dk+1(T) = Dk(T) + si 其中i=v(tk) ;
Dk+1(W) = Dk(W) + sj 其中j=v(wk) ;
如果够幸运的话,在某几次跳跃之后,wild落入了tame的陷阱,二者相遇了,则可以知道:
tk = wl
g(a+b)/2 * gDk(T) = gx * gDl(W)
即:
x = (a+b)/2 + Dk(T) - Dl(W) (mod n)
这样,就求出了x值。
在S设置恰当的情况下,期望的跳数为(b-a)1/2+const ,单位为jumps/kangaroo。
在si=2i,i=0,1,...,r时,可以达到以上的效果。
分析可知,假设Tame的路径上有N个点,且si的中间值(mean value)为m的情况下,在Tame路径的每个点上成功的概率为1/m,且各个点的事件都是独立事件。这样,整个过程成功的概率为PS=1-(1-1/m)N≈1-e-ß,其中ß=N/m,且m是一个较大的数。为了达到最好的性能,可以设置m=µ* (b-a)1/2。例如,在ß=4,PS=0.98,并且在µ=1/4时,执行的总步骤数N+m,在数量级上为O((b-a)1/2)。更一般的,对于一个ß,如果µ=1/(2ß1/2),总共的执行步骤将为2(ß(b-a))1/2。
最后这一点性能方面的分析取自:
J.M. Pollard,"Monte Carlo methods for index computation ( mod p)", Math. Comp., vol.32. no.143(July, 1978), pp918-924
- Kangaroo算法
- 6656 Watching the Kangaroo
- Watching the Kangaroo
- Cheap Kangaroo Gym
- BZOJ 4934: [Ceoi2016]kangaroo
- UVALive-6656-Watching the Kangaroo(二分)
- UVa 12715 Watching the Kangaroo(二分)
- UVALive 6656 Watching the Kangaroo --二分
- *UVALive 6656 - Watching the Kangaroo(二分)
- UVALive 6656 Watching the Kangaroo(二分)
- UVALive 6656 Watching the Kangaroo 拆分线段,set维护
- UVALive 6656 Watching the Kangaroo (区间排序 + 二分)
- Caused by: java.sql.SQLException: 无法将 NULL 值插入列 'lineid',表 'kangaroo.dbo.kangaroo_roadnet_line';该列不允许空值。INSERT 失败。
- 算法
- 算法
- 算法
- 算法
- 算法
- 继承时候的父子关系
- C++字符串完全指引之二 —— 字符串封装类
- web中文本框的使用
- Java代码查询网站
- JTable在数据库中的应用
- Kangaroo算法
- 数据库设计的规则
- C++字符串完全指引之一 —— Win32 字符编码
- PL/SQL按ctrl+E的发现
- 二零零七年六月六日
- NeHe第十课学习笔记
- 别闹了,费曼先生
- sql server连接问题
- 苏州行