UNPKG

@beenotung/tslib

Version:
84 lines 1.81 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.reduceFraction = exports.numberToFraction = exports.lcm = exports.gcd = exports.math = exports.calcPhi = void 0; function calcPhi() { let phi = 1; for (;;) { const x = 1 + 1 / phi; if (phi === x) { return x; } phi = x; } } exports.calcPhi = calcPhi; let phi; exports.math = { get phi() { return phi || (phi = calcPhi()); }, set phi(never) { throw new Error('unexpected assignment'); }, }; function gcd(a, b) { a = Math.abs(a); b = Math.abs(b); if (b > a) { const t = a; a = b; b = t; } for (;;) { if (b === 0) { return a; } a %= b; if (a === 0) { return b; } b %= a; } } exports.gcd = gcd; function lcm(a, b) { return !a || !b ? 0 : Math.abs(a * b) / gcd(a, b); } exports.lcm = lcm; /** * input: x * output: [a, b], where x = a/b * */ function numberToFraction(x, error = 1e-12) { if (x === Math.round(x)) { return [x, 1]; } if (x < 0) { const [a, b] = numberToFraction(-x, error); return [-a, b]; } let a = 1; let b = 1; for (;;) { const y = a / b; // process.stdout.write(`\r diff=${y - x}, x=${x}, ${a}/${b}`); if (x === y || Math.abs(y - x) < error) { return [a, b]; } if (y > x) { b++; } else { a++; } } } exports.numberToFraction = numberToFraction; function reduceFraction([a, b]) { const c = gcd(a, b); a /= c; b /= c; return b < 0 ? [-a, -b] : [a, b]; } exports.reduceFraction = reduceFraction; //# sourceMappingURL=math.js.map