2012-10-19 94 views
1

我有使用迭代,不遞歸2種實現Euclid算法的。 一種是常見的:迭代實現Euclid算法用C

void myXEuclid(int a, int b) 
{ 
    int prevx = 1, x = 0; 
    int prevy = 0, y = 1; 
    int q, r; 

    while (b) 
    { 
     q = a/b; 
     r = a % b; 

     int tmp = x; 
     x = prevx - q * x; 
     prevx = tmp; 

     tmp = y; 
     y = prevy - q * y; 
     prevy = tmp; 

     a = b; 
     b = r; 
    } 
    printf("prevx = %d, prevy = %d\n", prevx, prevy); 
} 

我真的不明白的地方的初始化來自:

int prevx = 1, x = 0; 
int prevy = 0, y = 1; 

不管怎樣,我還是可以從上面的代碼片段正確的答案。但是在RSA算法中,當我做A * B mod n = 1時,我必須確保B是最小的非負數。因此,這裏出現的下一個混亂的實施歐幾里德的算法,也使用迭代:

int Euc(int A, int B) 
{ 
    int a = A, b = B; 
    int quotient, remainder, lastY; 
    int x = 0, y = 1; 

    int X = 1, Y = 1; 

    while (a) 
    { 
     quotient = b/a; 
     remainder = b % a; 
     b = a; 
     a = remainder; 
     lastY = y; 
     y *= quotient; 

     if (X == Y) 
     { 
      if (x >= y) 
      { 
       y = x - y; 
      } 
      else 
      { 
       y = y - x; 
       Y = 0; 
      } 
     } 
     else 
     { 
      y = x + y; 
      X = 1 - X; 
      Y = 1 - Y; 
     } 

     x = lastY; 
    } 

    if (X == 0) 
    { 
     x = B - x; 
    } 

    return x; 
} 

我不知道是什麼資本變量X和Y指何地,同樣,他們的初始化從何而來。但是上面的函數可以返回符合方程A * x mod B = 1的x,並且它是最小的非負函數。

我能理解遞歸之一。但不是迭代的。說實話,我好幾天沒睡好。

我不是來自講英語的國家。所以,如果你能幫助我,請詳細解釋。謝謝。留言Merci。

+0

這不是歐幾里德算法的擴展版本。擴展版本還提供了gcd(a,b)與a和b的線性組合。 –

回答