Files
rubic-cube/node_modules/matrix-js/lib/rational.js

58 lines
1.6 KiB
JavaScript

'use strict';
/**
* Constructs an object storing rational numbers and methods performing operations
*
* @param num numerator of the rational number
* @param den denomenator of the rational number
* @returns Object storing the rational number and method doing arthmetic operations
*/
function rational(num, den) {
den = den || 1;
if (Math.sign(den) === -1) {
num = -num;
den = -den;
}
return {
num: num,
den: den,
add: (op) => rational(num * op.den + den * op.num, den * op.den),
sub: (op) => rational(num * op.den - den * op.num, den * op.den),
mul: (op) => multiply(op, num, den),
div: (op) => {
let _num = op.den;
let _den = op.num;
return multiply(rational(_num, _den), num, den);
}
}
}
module.exports = rational;
/**
* Multiplies two rational number based on multiplication rules that cancels common terms
*
* @param op the second operand
* @param num numerator of first operand
* @param den denominator of second operand
* @returns another rational number
*/
function multiply(op, num, den) {
let _num = Math.sign(num) * Math.sign(op.num);
let _den = Math.sign(den) * Math.sign(op.den);
if (Math.abs(num) === Math.abs(op.den) && Math.abs(den) === Math.abs(op.num)) {
_num = _num;
_den = _den;
} else if (Math.abs(den) === Math.abs(op.num)) {
_num = _num * Math.abs(num);
_den = _den * Math.abs(op.den);
} else if (Math.abs(num) === Math.abs(op.den)) {
_num = _num * Math.abs(op.num);
_den = _den * Math.abs(den);
} else {
_num = num * op.num;
_den = den * op.den;
}
return rational(_num, _den);
}