UNPKG

mathball

Version:

A JavaScript library for Competitive Programming

195 lines (175 loc) 4.17 kB
'use strict'; 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]); };