Kangaroo算法

来源:互联网 发布:ip地址和域名限制 403 编辑:程序博客网 时间:2024/05/17 04:09
    本算法要解决的问题是离散对数问题(discrete logarithm problem,DLP)。问题的描述如下:

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

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

  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(即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
原创粉丝点击