Kangaroo算法

本算法要解决的问题是离散对数问题(discrete logarithm problem,DLP)。问题的描述如下:

G是一个乘法循环群,其中有一个元素h,且其生成元为g。要求求得一个x,使得h=g x

对于这样一个问题,有如下的几种情况考虑:

  1. 如果我们对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,并且可以使用并行算法来加速解决的过程;
  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个群元素的计算步骤。
形象的来说,Pollard's Kangaroo算法就是使得两只袋鼠在解空间里面各自跳跃,其中一只为驯化的袋鼠,它的参数都是确定的,而另一只为野生的袋鼠,它的参数是要求的。驯化袋鼠每次跳跃之后都会做一个陷阱,如果野生袋鼠的某次跳跃碰到了这个陷阱,则表明他们的参数是一致的。这样,就可以使用驯化袋鼠的参数来推导出野生袋鼠的参数。由于这样一个过程是两条不同的路径经过变化得到一个交点,路径看起来有点像希腊字母lambda,所以该算法也称为lambda算法。

下面开始具体的介绍算法的过程。

由于该问题是要解决一个离散对数问题,则两只袋鼠就可以设置为群G里面的两个元素,由生成元的定义,二者都可以用g的某个幂来表示,驯化袋鼠的幂次是已知的,而野生袋鼠的幂次是包含x的式子。二者相遇时,通过两只袋鼠的幂次的等式可以求出x。

算法首先定义两只袋鼠,tame和wild。tame的初始位置是T=g (a+b)/2,wild的初始位置是W=h(即g x)。然后定义一个跳跃的集合S={g s0,g s1,...,g sr: s i=O((b-a) 1/2), r=O(log(b-a))};以及一个映射v:G→{0,1,...,r}。这样,袋鼠的跳跃过程可以使用如下的式子表示:

对于k=0,1,...:
Tame Kangaroo:t k+1=t k*g si ,其中i=v(t k) ;
Wild Kangaroo :w k+1=w k*g sj,其中j=v(w k) ;

为了以后计算的需要,在袋鼠跳跃的过程中记录下每次跳跃的距离:
D 0(T) = D 0(W) = 0;
D k+1(T) = D k(T) + s i 其中i=v(t k) ;
D k+1(W) = D k(W) + s j 其中j=v(w k) ;

如果够幸运的话,在某几次跳跃之后,wild落入了tame的陷阱,二者相遇了,则可以知道:

t k = w l
g (a+b)/2 * g Dk(T) = g x * g Dl(W)
即:

x = (a+b)/2 + D k(T) - D l(W) (mod n)
这样,就求出了x值。

在S设置恰当的情况下,期望的跳数为(b-a) 1/2+const ,单位为jumps/kangaroo。

在s i=2 i,i=0,1,...,r时,可以达到以上的效果。

分析可知,假设Tame的路径上有N个点,且s i的中间值(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

你可能感兴趣的:(算法)