mathball
Version:
A JavaScript library for Competitive Programming
195 lines (175 loc) • 4.17 kB
JavaScript
;
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
/*Division operation across all data-types and data-structures
* Function: M.div(m,n)
*/
var Complex = require('../complex');
var validate = require('../validation/argument-length');
var div = function div(a, b) {
switch (a.constructor) {
case Number:
return divNum(a, b);
case String:
return divString(a, b);
case Array:
if (a[0].constructor === Array) {
return divMatrix(a, b);
} else {
return divArray(a, b);
}
case Complex:
return divComplex(a, b);
}
};
var divNum = function divNum(a, b) {
return a / b;
};
var divString = function divString(a, b) {
var div = Number(a) / Number(b);
return div.toString(10);
};
var divArray = function divArray(a, b) {
var div = new Array(a.length);
for (var i = 0; i < a.length; i++) {
var l = a[i] / b[i];
div.push(l);
div = div.filter(function (n) {
return n;
});
}
return div;
};
//Determinant of a matrix
function det(a, n) {
var determinant = 0,
c1 = void 0,
c2 = void 0,
sign = 1;
var detArr = [].concat(_toConsumableArray(Array(n))).map(function (x) {
return Array(n).fill(0);
});
if (n === 1) {
return a[0][0];
} else if (n === 2) {
determinant = a[0][0] * a[1][1] - a[0][1] * a[1][0];
return determinant;
} else {
for (var i = 0; i < n; i++) {
c1 = 0, c2 = 0;
for (var j = 0; j < n; j++) {
for (var k = 0; k < n; k++) {
if (j != 0 && k != i) {
detArr[c1][c2] = a[j][k];
c2++;
if (c2 > n - 2) {
c1++;
c2 = 0;
}
}
}
}
determinant = determinant + sign * a[0][i] * det(detArr, n - 1);
sign = -1 * sign;
}
return determinant;
}
}
function coFactor(a, temp, p, q, n) {
var i = 0,
j = 0;
for (var row = 0; row < n; row++) {
for (var col = 0; col < n; col++) {
if (row !== p && col != q) {
temp[i][j++] = a[row][col];
if (j === n - 1) {
j = 0;
i++;
}
}
}
}
}
function _adjugate(a) {
var n = a.length;
var adj = [].concat(_toConsumableArray(Array(n))).map(function (x) {
return Array(n).fill(0);
});
var temp = [].concat(_toConsumableArray(Array(n))).map(function (x) {
return Array(n).fill(0);
});
if (n === 1) {
return 1;
}
var sign = 1;
for (var i = 0; i < n; i++) {
for (var j = 0; j < n; j++) {
coFactor(a, temp, i, j, n);
sign = (i + j) % 2 === 0 ? 1 : -1;
adj[j][i] = sign * det(temp, n - 1);
}
}
return adj;
}
function inverse(a) {
var n = a.length;
var determinant = det(a, n);
if (determinant === 0) {
return 0;
}
var inv = [].concat(_toConsumableArray(Array(n))).map(function (x) {
return Array(n).fill(0);
});
var adj = _adjugate(a);
if (adj === 1) {
return 1;
}
for (var i = 0; i < n; i++) {
for (var j = 0; j < n; j++) {
inv[i][j] = Number(parseFloat(adj[i][j] / determinant).toFixed(2));
}
}
return inv;
}
var divMatrix = function divMatrix(a, b) {
b = inverse(b);
if (b === 0) {
return 0;
}
if (b === 1) {
return 1;
}
var div = [].concat(_toConsumableArray(Array(a.length))).map(function (x) {
return Array(a[0].length).fill(0);
});
for (var i = 0; i < a.length; i++) {
for (var j = 0; j < b.length; j++) {
var sum = 0;
for (var k = 0; k < a[0].length; k++) {
var pro = a[i][k] * b[k][j];
sum = Math.round(sum + pro);
}
div[i][j] = sum;
}
}
return div;
};
var divComplex = function divComplex(a, b) {
var div = {
re: 0,
im: 0
};
var dm = Math.pow(b.re, 2) + Math.pow(b.im, 2);
div.re = parseFloat(((a.re * b.re + a.im * b.re) / dm).toFixed(2));
div.im = parseFloat(((b.re * a.im - a.re * b.im) / dm).toFixed(2));
return div;
};
module.exports = function () {
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
if (args.length > 2) {
throw new TypeError('Invalid argument received: ' + JSON.stringify(args) + '\n\'div()\' only accepts two parameters!\n');
}
validate(args);
return div(args[0], args[1]);
};