在C中迭代实现Euclid算法

时间:2012-10-19 05:19:21

标签: c algorithm iteration

我使用迭代而不是递归有两种类型的Euclid算法实现。 一个是常见的:

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的含义以及它们的初始化来自何处。但是上面的函数可以返回x满足等式A * x mod B = 1,并且它是最小的非负值。

我能理解递归的那个。但不是迭代的。说实话,我好几天都没睡好。

我不是来自英语国家。所以,如果你能帮助我,请简单而详细地解释。谢谢。的Merci。

1 个答案:

答案 0 :(得分:0)

这里有一个关于GCD算法和C / C ++中不同实现的详细说明

http://512algorithms.blogspot.co.il/