@beenotung/tslib
Version:
utils library in Typescript
84 lines • 1.81 kB
JavaScript
;
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