UNPKG

bigrat

Version:

rational.js: tools and libraries using rational numbers.

154 lines (139 loc) 3.35 kB
/* * rational.js - Javascript tools and libraries based around rational numbers. * Copyright (C) 2013 Dylan Ferris * * The rest of this file is part of rational.js. * * rational.js is free software: you may redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * rational.js is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with rational.js. If not, see <http://www.gnu.org/licenses/>. */ // for nodejs if (typeof BigInteger !== 'function') { var BigInteger = require('../src/biginteger.js').BigInteger; } /** * @class Arbitrary Sized Integer * @name bigint * @requires BigInteger */ var bigint = {}; /** * Find the greatest common divisor of two big integers * * @param {BigInteger} a the first operand * @param {BigInteger} b the second operand * @returns {BigInteger} greatest common divisor */ bigint.greatest_common_divisor = function(a, b) { if (b.isUnit() || a.isUnit()) return BigInteger.ONE; var t; while (!b.isZero()) { t = b; b = a.remainder(b); a = t; } return a; } /** * Creates a new, empty bigint * * @returns {bigint} a new bigint */ bigint.create = function() { return [0]; }; /** * Creates a new bigint initialized with values from an existing number * * @param {bigint} a number to clone * @returns {bigint} a new bigintional number */ bigint.clone = function(a) { var out = []; for (var i=0, l=a.length; i<l; i++) out[i] = a[i]; return out; }; /** * Copy the values from one bigint to another * * @param {bigint} out the receiving number * @param {bigint} a the source number * @returns {bigint} out */ bigint.copy = function(out, a) { out = []; for (var i=0, l=a.length; i<l; i++) out[i] = a[i]; return out; }; /** * Absolute value of a bigint * * @param {bigint} out the receiving number * @param {bigint} a number to take the absolute value of * @returns {bigint} out */ bigint.abs = function(out, a) { out[0] = Math.abs(a[0]); return out; }; /** * Returns a string representation * * @param {bigint} a number to represent as a string * @returns {String} string representation of the number */ bigint.str = function (a) { return a[0].toString(); }; /** * Returns an integer to it's native type * * @param {bigint} a number to return as an integer * @returns {Integer} an integer or Infinity when the max size is exceeded */ bigint.toInteger = function (a) { return out[0]; }; /** * Returns a bigint from an integer * * @param {bigint} out the receiving number * @param {Integer} integer * @returns {bigint} out */ bigint.fromInteger = function (a) { return [parseInt(a)]; }; /** * Zero, the additive identity * * @property ZERO * @type bigint * @static * @final */ bigint.ZERO = bigint.fromInteger(0); /** * One, the multiplicative identity * * @property ONE * @type bigint * @static * @final */ bigint.ONE = bigint.fromInteger(1); if(typeof(exports) !== 'undefined') { exports.bigint = bigint; }