// CS 1501 Greatest Common Divisor // Shoup's Iterative code for GCD long GCD(long a, long b) { long u, v, t, x; if (a < 0) a = -a; if (b < 0) b = -b; if (a < 0 || b < 0) Error("GCD: integer overflow"); if (b==0) x = a; else { u = a; v = b; do { t = u % v; u = v; v = t; } while (v != 0); x = u; } return x; } // Recursive pseudocode for extended GCD //d = gcd(a, b) = a*s + b*t(d, s, t) XGCD(long a, long b) { if b==0 return (a, 1, 0) else (d', s', t') = XGCD(b, a mod b) (d, s, t) = (d', t', s' - (a/b) *t') } // Shoup's iterative code for XGCD // d = gcd(a, b) = a*s + b*t; void XGCD(long& d, long& s, long& t, long a, long b) { long u, v, u0, v0, u1, v1, u2, v2, q, r; long aneg = 0, bneg = 0; if (a < 0) { a = -a; aneg = 1; } if (b < 0) { b = -b; bneg = 1; } if (a < 0 || b < 0) Error("XGCD: integer overflow"); u1=1; v1=0; u2=0; v2=1; u = a; v = b; while (v != 0) { q = u / v; r = u % v; u = v; v = r; u0 = u2; v0 = v2; u2 = u1 - q*u2; v2 = v1- q*v2; u1 = u0; v1 = v0; } if (aneg) u1 = -u1; if (bneg) v1 = -v1; d = u; s = u1; t = v1; }