Extended Euclidean Algorithm (EEA)

The extended Euclidean Algorithm allows us to calculate , and solve the Linear Diophantine Equation for in terms of and , where

We know that an answer always exists from Bezout’s Lemma.

LCM and GCD

int gcd(int a, int b) { // Euclidean Algorithm, however this is already implemented in C++
    if (b == 0) return a;
    return gcd(b, a % b);
}
 
int lcm (int a, int b) {
    return a / gcd(a, b) * b;
}

Recursive (implements EEA)

int gcd(int a, int b, int& x, int& y) {
    if (b == 0) {
        x = 1;
        y = 0;
        return a;
    }
    int x1, y1;
    int d = gcd(b, a % b, x1, y1);
    x = y1;
    y = x1 - y1 * (a / b);
    return d;
}
 

Iterative (i think the way we learned in class), faster than recursive above

int gcd(int a, int b, int& x, int& y) {
    x = 1, y = 0;
    int x1 = 0, y1 = 1, a1 = a, b1 = b;
    while (b1) {
        int q = a1 / b1;
        tie(x, x1) = make_tuple(x1, x - q * x1);
        tie(y, y1) = make_tuple(y1, y - q * y1);
        tie(a1, b1) = make_tuple(b1, a1 - q * b1);
    }
    return a1;
}
 

There is something very important to observe about the table. If we are computing , then for each row of the table we have

Input: Integers , with Initialize: Construct the table with four columns so that

  • the columns are labeled ,
  • the first row in the table is ,
  • the second row in the table is .

Repeat: For ,

Stop: When Output: Set . Then , and and are a certificate of correctness.