Recall the problem statement: Given two non-zero integers $a,b$ (assume $a\geq b$), the problem is to determine integers $x,y$ such that $\mbox{gcd}(a,b) = a\times x + b \times y$. Notice that the original Euclid's algorithm can compute the gcd but not the coefficients $x,y$ whose linear combination yields the gcd. The idea here is to use the quotient instead of the remainder as in the original algorithm. We express the operands in each iteration a linear combination of the original inputs and use the following to update as follows. The quotient in $i^{th}$ iteration is denoted by $q_i$ leading to the following formulation.
$$
\begin{array}{cc}
\mbox{gcd}(a,b) = \mbox{ExGcd}(\left[\begin{array}{c} a \\ b \end{array}\right]) &\\
\left [
\begin{array}{cc}
x_{0,0} & y_{0,0}\\
x_{1,0} & y_{1,0}
\end{array}
\right ] = \left [ \begin{array}{cc}1 & 0\\ 0 & 1\end{array} \right ] & \mbox{initialization } i=0\\
\mbox{ExGcd}(\left [\begin{array}{cc} a & b \end{array}\right ] \left [ \begin{array}{cc} x_{0,i} & y_{0,i} \\ x_{1.i} & y_{1,i} \end{array} \right]) = \mbox{ExGcd}(\left[\begin{array}{cc} a & b \end{array}\right]
\left [
\begin{array}{cc}
x_{0,i-1} & y_{0,i-1} \\
x_{1,i-1} & y_{1,i-1}
\end{array}
\right ]
\left [
\begin{array}{cc}
0 & 1 \\
1 & -q_{i-1}
\end{array}
\right ]) & i > 0 \\
q_i = \mbox{Quotient}(x_{0,i}a+x_{1,i}b, y_{0,i}a+y_{1,i}b) & \\
\end{array}
$$
Following is an implementation using std::div:
// Input: a,b
// Output: x, y (y0,y1)
void ExtendedEuclid(long a, long b, long& y0, long& y1) { long x0, x1, t0, t1; if (a < b) { std::swap(a, b); } // Initialize: x0 = 1; x1 = 0; // a = 1 * a + 0 * b y0 = 0; y1 = 1; // b = 0 * a + 1 * b std::ldiv_t div_res = std::div(a, b); while (div_res.rem) { t0 = y0; t1 = y1; y0 = x0 - (div_res.quot * y0); y1 = x1 - (div_res.quot * y1); x0 = t0; x1 = t1; // Invariant: (x0*a+x1*b >= y0*a+y1*b) div_res = std::div(x0*a+x1*b, y0*a+y1*b); } }
Following are few examples obtained by calling ExtendedEuclid(a,b,x,y):
a=25375,b=667 x=1, y=-38, gcd=29 29 = 25375 * 1 + 667*38 a=17765,b=13481 x=-343, y=452, gcd=17 17 = 17765 * -343 + 13481 * 452 a=19109,b=18321 x=-23, y=24, gcd=197 197 = 19109 * -23 + 18321 * 24
No comments:
Post a Comment