function Euclid_gcd(a, b) { a = +a; b = +b; if (a !== a || b !== b) { return [NaN, NaN, NaN]; } if (a === Infinity || a === -Infinity || b === Infinity || b === -Infinity) { return [Infinity, Infinity, Infinity]; } // Checks if a or b are decimals if ((a % 1 !== 0) || (b % 1 !== 0)) { return false; } var signX = (a < 0) ? -1 : 1, signY = (b < 0) ? -1 : 1, x = 0, y = 1, u = 1, v = 0, q, r, m, n; a = Math.abs(a); b = Math.abs(b); while (a !== 0) { q = Math.floor(b / a); r = b % a; m = x - u * q; n = y - v * q; b = a; a = r; x = u; y = v; u = m; v = n; } return [b, signX * x, signY * y]; } console.log(Euclid_gcd(17, 4));