跳至內容

離散對數的波拉德ρ算法

維基百科,自由的百科全書

離散對數的波拉德ρ算法約翰·波拉德英語John Pollard (mathematician)1978年所發明解決離散對數問題的算法。

算法的目標是求 使得 ,其中 屬於一個由 生成的 循環群 。該算法尋找 , , , 使得 。若他們基於的群是一個 階的循環群,則 是方程 的其中一個解。

為求得 , , , , 該算法使用 Floyd判圈算法 在數列 中尋找一個環。 假設映射 是近似於隨機的,則有可能在約 步後發現一個環。可使用一下規則來生成一個此類映射:將 分割為三個不相交的子集 ,且其所含元素數量大致相等,如果 則將 加倍; 如果 則將 自增; 如果 則將 自增。

算法

[編輯]

使 G 是一個 p 階的 循環群, 且有 , 以及一個分割 , 定義映射

並據以下方式定義映射

 输入 a: a 是 G 的生成元, b: G 的一个元素
 输出 整数 x 使得 ax = b, 或者失败

 初始化 a0 ← 0, b0 ← 0, x0 ← 1 ∈ G, 

 i ← 1
 loop
     xif(xi-1), 
     aig(xi-1, ai-1), 
     bih(xi-1, bi-1)

     x2if(f(x2i-2)), 
     a2ig(f(x2i-2), g(x2i-2, a2i-2)), 
     b2ih(f(x2i-2), h(x2i-2, b2i-2))

     if xi = x2i then
         rbi - b2i
         if r = 0 return failure
         xr−1(a2i - ai) mod p
         return x
     else # xix2i
         ii+1, 
         break loop
     end if
  end loop

舉例

[編輯]

例如一個由 2 模 生成的群(群的階是,2是生成元,生成群的元素模1019同餘)。這個算法可由以下 C++ 程序實現。

 #include <stdio.h>
 
 const int n = 1018, N = n + 1;  /* N = 1019 -- 素数       */
 const int alpha = 2;            /* 生成元                 */
 const int beta = 5;             /* 2^{10} = 1024 = 5 (N) */
 
 void new_xab( int& x, int& a, int& b ) {
   switch( x%3 ) {
   case 0: x = x*x     % N;  a =  a*2  % n;  b =  b*2  % n;  break;
   case 1: x = x*alpha % N;  a = (a+1) % n;                  break;
   case 2: x = x*beta  % N;                  b = (b+1) % n;  break;
   }
 }
 
 int main(void) {
   int x=1, a=0, b=0;
   int X=x, A=a, B=b;
   for(int i = 1; i < n; ++i ) {
     new_xab( x, a, b );
     new_xab( X, A, B );
     new_xab( X, A, B );
     printf( "%3d  %4d %3d %3d  %4d %3d %3d\n", i, x, a, b, X, A, B );
     if( x == X ) break;
   }
   return 0;
 }

結果如下 (已截斷):

 i     x   a   b     X   A   B
------------------------------
 1     2   1   0    10   1   1
 2    10   1   1   100   2   2
 3    20   2   1  1000   3   3
 4   100   2   2   425   8   6
 5   200   3   2   436  16  14
 6  1000   3   3   284  17  15
 7   981   4   3   986  17  17
 8   425   8   6   194  17  19
..............................
48   224 680 376    86 299 412
49   101 680 377   860 300 413
50   505 680 378   101 300 415
51  1010 681 378  1010 301 416

可見 以及 。 正如預期,其中 是一個解。由於 不是素數,因此存在另一個解 ,使得 成立。

複雜度

[編輯]

時間複雜度近似於 。如果配合使用 Pohlig-Hellman 算法英語Pohlig-Hellman algorithm,則整體時間複雜度近似於 ,其中 的最大質因數。

參考文獻

[編輯]