big-integer
Advanced tools
Comparing version 1.0.1 to 1.0.2
var bigInt = (function () { | ||
var base = 10000000, logBase = 7; | ||
var sign = { | ||
positive: false, | ||
negative: true | ||
}; | ||
var base = 10000000, logBase = 7; | ||
var sign = { | ||
positive: false, | ||
negative: true | ||
}; | ||
var normalize = function (first, second) { | ||
var a = first.value, b = second.value; | ||
var length = a.length > b.length ? a.length : b.length; | ||
for (var i = 0; i < length; i++) { | ||
a[i] = a[i] || 0; | ||
b[i] = b[i] || 0; | ||
} | ||
for (var i = length - 1; i >= 0; i--) { | ||
if (a[i] === 0 && b[i] === 0) { | ||
a.pop(); | ||
b.pop(); | ||
} | ||
} | ||
first.value = a; | ||
second.value = b; | ||
}; | ||
var normalize = function (first, second) { | ||
var a = first.value, b = second.value; | ||
var length = a.length > b.length ? a.length : b.length; | ||
for (var i = 0; i < length; i++) { | ||
a[i] = a[i] || 0; | ||
b[i] = b[i] || 0; | ||
} | ||
for (var i = length - 1; i >= 0; i--) { | ||
if (a[i] === 0 && b[i] === 0) { | ||
a.pop(); | ||
b.pop(); | ||
} | ||
} | ||
first.value = a; | ||
second.value = b; | ||
}; | ||
var parse = function (text, first) { | ||
if (typeof text === "object") return text; | ||
text += ""; | ||
var s = sign.positive, value = []; | ||
if (text[0] === "-") { | ||
s = sign.negative; | ||
text = text.slice(1); | ||
} | ||
var text = text.split("e"); | ||
if (text.length > 2) throw new Error("Invalid integer"); | ||
if (text[1]) { | ||
var exp = text[1]; | ||
if (exp[0] === "+") exp = exp.slice(1); | ||
exp = parse(exp); | ||
if (exp.lesser(0)) throw new Error("Cannot include negative exponent part for integers"); | ||
while (exp.notEquals(0)) { | ||
text[0] += "0"; | ||
exp = exp.prev(); | ||
} | ||
} | ||
text = text[0]; | ||
if (text === "-0") text = "0"; | ||
var isValid = /^([1-9][0-9]*)$|^0$/.test(text); | ||
if (!isValid) throw new Error("Invalid integer"); | ||
while (text.length) { | ||
var divider = text.length > logBase ? text.length - logBase : 0; | ||
value.push(+text.slice(divider)); | ||
text = text.slice(0, divider); | ||
} | ||
var val = bigInt(value, s); | ||
if (first) normalize(first, val); | ||
return val; | ||
}; | ||
var parse = function (text, first) { | ||
if (typeof text === "object") return text; | ||
text += ""; | ||
var s = sign.positive, value = []; | ||
if (text[0] === "-") { | ||
s = sign.negative; | ||
text = text.slice(1); | ||
} | ||
var text = text.split("e"); | ||
if (text.length > 2) throw new Error("Invalid integer"); | ||
if (text[1]) { | ||
var exp = text[1]; | ||
if (exp[0] === "+") exp = exp.slice(1); | ||
exp = parse(exp); | ||
if (exp.lesser(0)) throw new Error("Cannot include negative exponent part for integers"); | ||
while (exp.notEquals(0)) { | ||
text[0] += "0"; | ||
exp = exp.prev(); | ||
} | ||
} | ||
text = text[0]; | ||
if (text === "-0") text = "0"; | ||
var isValid = /^([1-9][0-9]*)$|^0$/.test(text); | ||
if (!isValid) throw new Error("Invalid integer"); | ||
while (text.length) { | ||
var divider = text.length > logBase ? text.length - logBase : 0; | ||
value.push(+text.slice(divider)); | ||
text = text.slice(0, divider); | ||
} | ||
var val = bigInt(value, s); | ||
if (first) normalize(first, val); | ||
return val; | ||
}; | ||
var goesInto = function (a, b) { | ||
var a = bigInt(a, sign.positive), b = bigInt(b, sign.positive); | ||
var n = 0; | ||
do { | ||
var inc = 1; | ||
var c = bigInt(a.value, sign.positive), t = c.times(10); | ||
while (t.lesser(b)) { | ||
c = t; | ||
inc *= 10; | ||
t = t.times(10); | ||
} | ||
while (c.lesserOrEquals(b)) { | ||
b = b.minus(c); | ||
n += inc; | ||
} | ||
} while (a.lesserOrEquals(b)); | ||
var goesInto = function (a, b) { | ||
var a = bigInt(a, sign.positive), b = bigInt(b, sign.positive); | ||
var n = 0; | ||
do { | ||
var inc = 1; | ||
var c = bigInt(a.value, sign.positive), t = c.times(10); | ||
while (t.lesser(b)) { | ||
c = t; | ||
inc *= 10; | ||
t = t.times(10); | ||
} | ||
while (c.lesserOrEquals(b)) { | ||
b = b.minus(c); | ||
n += inc; | ||
} | ||
} while (a.lesserOrEquals(b)); | ||
return { | ||
remainder: b.value, | ||
result: n | ||
}; | ||
}; | ||
return { | ||
remainder: b.value, | ||
result: n | ||
}; | ||
}; | ||
var bigInt = function (value, s) { | ||
var self = { | ||
value: value, | ||
sign: s | ||
}; | ||
var o = { | ||
value: value, | ||
sign: s, | ||
negate: function (m) { | ||
var first = m || self; | ||
return bigInt(first.value, !first.sign); | ||
}, | ||
abs: function (m) { | ||
var first = m || self; | ||
return bigInt(first.value, sign.positive); | ||
}, | ||
add: function (n, m) { | ||
var s, first = self, second; | ||
if (m) (first = parse(n)) && (second = parse(m)); | ||
else second = parse(n, first); | ||
s = first.sign; | ||
if (first.sign !== second.sign) { | ||
first = bigInt(first.value, sign.positive); | ||
second = bigInt(second.value, sign.positive); | ||
return s === sign.positive ? | ||
var bigInt = function (value, s) { | ||
var self = { | ||
value: value, | ||
sign: s | ||
}; | ||
var o = { | ||
value: value, | ||
sign: s, | ||
negate: function (m) { | ||
var first = m || self; | ||
return bigInt(first.value, !first.sign); | ||
}, | ||
abs: function (m) { | ||
var first = m || self; | ||
return bigInt(first.value, sign.positive); | ||
}, | ||
add: function (n, m) { | ||
var s, first = self, second; | ||
if (m) (first = parse(n)) && (second = parse(m)); | ||
else second = parse(n, first); | ||
s = first.sign; | ||
if (first.sign !== second.sign) { | ||
first = bigInt(first.value, sign.positive); | ||
second = bigInt(second.value, sign.positive); | ||
return s === sign.positive ? | ||
o.subtract(first, second) : | ||
o.subtract(second, first); | ||
} | ||
normalize(first, second); | ||
var a = first.value, b = second.value; | ||
var result = [], | ||
} | ||
normalize(first, second); | ||
var a = first.value, b = second.value; | ||
var result = [], | ||
carry = 0; | ||
for (var i = 0; i < a.length || carry > 0; i++) { | ||
var sum = a[i] + b[i] + carry; | ||
carry = sum > base ? 1 : 0; | ||
sum -= carry * base; | ||
result.push(sum); | ||
} | ||
return bigInt(result, s); | ||
}, | ||
plus: function (n, m) { | ||
return o.add(n, m); | ||
}, | ||
subtract: function (n, m) { | ||
var s, first = self, second; | ||
if (m) (first = parse(n)) && (second = parse(m)); | ||
else second = parse(n, first); | ||
if (first.sign !== second.sign) return o.add(first, o.negate(second)); | ||
if (first.sign === sign.negative) return o.subtract(o.negate(second), o.negate(first)); | ||
if (o.compare(first, second) === -1) return o.negate(o.subtract(second, first)); | ||
var a = first.value, b = second.value; | ||
var result = [], | ||
for (var i = 0; i < a.length || carry > 0; i++) { | ||
var sum = a[i] + b[i] + carry; | ||
carry = sum > base ? 1 : 0; | ||
sum -= carry * base; | ||
result.push(sum); | ||
} | ||
return bigInt(result, s); | ||
}, | ||
plus: function (n, m) { | ||
return o.add(n, m); | ||
}, | ||
subtract: function (n, m) { | ||
var s, first = self, second; | ||
if (m) (first = parse(n)) && (second = parse(m)); | ||
else second = parse(n, first); | ||
if (first.sign !== second.sign) return o.add(first, o.negate(second)); | ||
if (first.sign === sign.negative) return o.subtract(o.negate(second), o.negate(first)); | ||
if (o.compare(first, second) === -1) return o.negate(o.subtract(second, first)); | ||
var a = first.value, b = second.value; | ||
var result = [], | ||
borrow = 0; | ||
for (var i = 0; i < a.length; i++) { | ||
a[i] -= borrow; | ||
borrow = a[i] < b[i] ? 1 : 0; | ||
var minuend = (borrow * base) + a[i] - b[i]; | ||
result.push(minuend); | ||
} | ||
return bigInt(result, sign.positive); | ||
}, | ||
minus: function (n, m) { | ||
return o.subtract(n, m); | ||
}, | ||
multiply: function (n, m) { | ||
var s, first = self, second; | ||
if (m) (first = parse(n)) && (second = parse(m)); | ||
else second = parse(n, first); | ||
s = first.sign !== second.sign; | ||
var a = first.value, b = second.value; | ||
var resultSum = []; | ||
for (var i = 0; i < a.length; i++) { | ||
resultSum[i] = []; | ||
var j = i; | ||
while (j--) { | ||
resultSum[i].push(0); | ||
} | ||
} | ||
var carry = 0; | ||
for (var i = 0; i < a.length; i++) { | ||
var x = a[i]; | ||
for (var j = 0; j < b.length || carry > 0; j++) { | ||
var y = b[j]; | ||
var product = y ? (x * y) + carry : carry; | ||
carry = product > base ? Math.floor(product / base) : 0; | ||
product -= carry * base; | ||
resultSum[i].push(product); | ||
} | ||
} | ||
var max = -1; | ||
for (var i = 0; i < resultSum.length; i++) { | ||
var len = resultSum[i].length; | ||
if (len > max) max = len; | ||
} | ||
var result = [], carry = 0; | ||
for (var i = 0; i < max || carry > 0; i++) { | ||
var sum = carry; | ||
for (var j = 0; j < resultSum.length; j++) { | ||
sum += resultSum[j][i] || 0; | ||
} | ||
carry = sum > base ? Math.floor(sum / base) : 0; | ||
sum -= carry * base; | ||
result.push(sum); | ||
} | ||
return bigInt(result, s); | ||
}, | ||
times: function (n, m) { | ||
return o.multiply(n, m); | ||
}, | ||
divmod: function (n, m) { | ||
var s, first = self, second; | ||
if (m) (first = parse(n)) && (second = parse(m)); | ||
else second = parse(n, first); | ||
s = first.sign !== second.sign; | ||
if (second.equals(0)) throw new Error("Cannot divide by zero"); | ||
var a = first.value, b = second.value; | ||
var result = [], remainder = []; | ||
for (var i = a.length - 1; i >= 0; i--) { | ||
var n = [a[i]].concat(remainder); | ||
var quotient = goesInto(b, n); | ||
result.push(quotient.result); | ||
remainder = quotient.remainder; | ||
} | ||
result.reverse(); | ||
return { | ||
quotient: bigInt(result, s), | ||
remainder: bigInt(remainder, first.sign) | ||
}; | ||
}, | ||
divide: function (n, m) { | ||
return o.divmod(n, m).quotient; | ||
}, | ||
over: function (n, m) { | ||
return o.divide(n, m); | ||
}, | ||
mod: function (n, m) { | ||
return o.divmod(n, m).remainder; | ||
}, | ||
pow: function (n, m) { | ||
var first = self, second; | ||
if (m) (first = parse(n)) && (second = parse(m)); | ||
else second = parse(n, first); | ||
var a = first, b = second; | ||
if (b.lesser(0)) return ZERO; | ||
if (b.equals(0)) return ONE; | ||
var result = bigInt(a.value, a.sign); | ||
while (b.greater(1)) { | ||
result = result.times(a); | ||
b = b.prev(); | ||
} | ||
return bigInt(result.value, s); | ||
}, | ||
next: function (m) { | ||
var first = m || self; | ||
return o.add(first, 1); | ||
}, | ||
prev: function (m) { | ||
var first = m || self; | ||
return o.subtract(first, 1); | ||
}, | ||
compare: function (n, m) { | ||
var first = self, second; | ||
if (m) (first = parse(n)) && (second = parse(m, first)); | ||
else second = parse(n, first); | ||
if (second.sign !== first.sign) return first.sign === sign.positive ? 1 : -1; | ||
var multiplier = first.sign === sign.positive ? 1 : -1; | ||
normalize(first, second); | ||
var a = first.value, b = second.value; | ||
for (var i = a.length - 1; i >= 0; i--) { | ||
if (a[i] > b[i]) return 1 * multiplier; | ||
if (b[i] > a[i]) return -1 * multiplier; | ||
} | ||
return 0; | ||
}, | ||
compareAbs: function (n, m) { | ||
var first = self, second; | ||
if (m) (first = parse(n)) && (second = parse(m, first)); | ||
else second = parse(n, first); | ||
first.sign = second.sign = sign.positive; | ||
return o.compare(first, second); | ||
}, | ||
equals: function (n, m) { | ||
return o.compare(n, m) === 0; | ||
}, | ||
notEquals: function (n, m) { | ||
return !o.equals(n, m); | ||
}, | ||
lesser: function (n, m) { | ||
return o.compare(n, m) < 0; | ||
}, | ||
greater: function (n, m) { | ||
return o.compare(n, m) > 0; | ||
}, | ||
greaterOrEquals: function (n, m) { | ||
return o.compare(n, m) >= 0; | ||
}, | ||
lesserOrEquals: function (n, m) { | ||
return o.compare(n, m) <= 0; | ||
}, | ||
toString: function (m) { | ||
var first = m || self; | ||
var str = "", len = first.value.length; | ||
while (len--) { | ||
str += first.value[len]; | ||
} | ||
while (str[0] === "0") { | ||
str = str.slice(1); | ||
} | ||
if (!str.length) str = "0"; | ||
var s = first.sign === sign.positive ? "" : "-"; | ||
return s + str; | ||
}, | ||
toJSNumber: function (m) { | ||
return +o.toString(m); | ||
}, | ||
valueOf: function (m) { | ||
return o.toJSNumber(m); | ||
} | ||
}; | ||
return o; | ||
}; | ||
for (var i = 0; i < a.length; i++) { | ||
a[i] -= borrow; | ||
borrow = a[i] < b[i] ? 1 : 0; | ||
var minuend = (borrow * base) + a[i] - b[i]; | ||
result.push(minuend); | ||
} | ||
return bigInt(result, sign.positive); | ||
}, | ||
minus: function (n, m) { | ||
return o.subtract(n, m); | ||
}, | ||
multiply: function (n, m) { | ||
var s, first = self, second; | ||
if (m) (first = parse(n)) && (second = parse(m)); | ||
else second = parse(n, first); | ||
s = first.sign !== second.sign; | ||
var a = first.value, b = second.value; | ||
var resultSum = []; | ||
for (var i = 0; i < a.length; i++) { | ||
resultSum[i] = []; | ||
var j = i; | ||
while (j--) { | ||
resultSum[i].push(0); | ||
} | ||
} | ||
var carry = 0; | ||
for (var i = 0; i < a.length; i++) { | ||
var x = a[i]; | ||
for (var j = 0; j < b.length || carry > 0; j++) { | ||
var y = b[j]; | ||
var product = y ? (x * y) + carry : carry; | ||
carry = product > base ? Math.floor(product / base) : 0; | ||
product -= carry * base; | ||
resultSum[i].push(product); | ||
} | ||
} | ||
var max = -1; | ||
for (var i = 0; i < resultSum.length; i++) { | ||
var len = resultSum[i].length; | ||
if (len > max) max = len; | ||
} | ||
var result = [], carry = 0; | ||
for (var i = 0; i < max || carry > 0; i++) { | ||
var sum = carry; | ||
for (var j = 0; j < resultSum.length; j++) { | ||
sum += resultSum[j][i] || 0; | ||
} | ||
carry = sum > base ? Math.floor(sum / base) : 0; | ||
sum -= carry * base; | ||
result.push(sum); | ||
} | ||
return bigInt(result, s); | ||
}, | ||
times: function (n, m) { | ||
return o.multiply(n, m); | ||
}, | ||
divmod: function (n, m) { | ||
var s, first = self, second; | ||
if (m) (first = parse(n)) && (second = parse(m)); | ||
else second = parse(n, first); | ||
s = first.sign !== second.sign; | ||
if (second.equals(0)) throw new Error("Cannot divide by zero"); | ||
var a = first.value, b = second.value; | ||
var result = [], remainder = []; | ||
for (var i = a.length - 1; i >= 0; i--) { | ||
var n = [a[i]].concat(remainder); | ||
var quotient = goesInto(b, n); | ||
result.push(quotient.result); | ||
remainder = quotient.remainder; | ||
} | ||
result.reverse(); | ||
return { | ||
quotient: bigInt(result, s), | ||
remainder: bigInt(remainder, first.sign) | ||
}; | ||
}, | ||
divide: function (n, m) { | ||
return o.divmod(n, m).quotient; | ||
}, | ||
over: function (n, m) { | ||
return o.divide(n, m); | ||
}, | ||
mod: function (n, m) { | ||
return o.divmod(n, m).remainder; | ||
}, | ||
pow: function (n, m) { | ||
var first = self, second; | ||
if (m) (first = parse(n)) && (second = parse(m)); | ||
else second = parse(n, first); | ||
var a = first, b = second; | ||
if (b.lesser(0)) return ZERO; | ||
if (b.equals(0)) return ONE; | ||
var result = bigInt(a.value, a.sign); | ||
while (b.greater(1)) { | ||
result = result.times(a); | ||
b = b.prev(); | ||
} | ||
return bigInt(result.value, s); | ||
}, | ||
next: function (m) { | ||
var first = m || self; | ||
return o.add(first, 1); | ||
}, | ||
prev: function (m) { | ||
var first = m || self; | ||
return o.subtract(first, 1); | ||
}, | ||
compare: function (n, m) { | ||
var first = self, second; | ||
if (m) (first = parse(n)) && (second = parse(m, first)); | ||
else second = parse(n, first); | ||
if (second.sign !== first.sign) return first.sign === sign.positive ? 1 : -1; | ||
var multiplier = first.sign === sign.positive ? 1 : -1; | ||
normalize(first, second); | ||
var a = first.value, b = second.value; | ||
for (var i = a.length - 1; i >= 0; i--) { | ||
if (a[i] > b[i]) return 1 * multiplier; | ||
if (b[i] > a[i]) return -1 * multiplier; | ||
} | ||
return 0; | ||
}, | ||
compareAbs: function (n, m) { | ||
var first = self, second; | ||
if (m) (first = parse(n)) && (second = parse(m, first)); | ||
else second = parse(n, first); | ||
first.sign = second.sign = sign.positive; | ||
return o.compare(first, second); | ||
}, | ||
equals: function (n, m) { | ||
return o.compare(n, m) === 0; | ||
}, | ||
notEquals: function (n, m) { | ||
return !o.equals(n, m); | ||
}, | ||
lesser: function (n, m) { | ||
return o.compare(n, m) < 0; | ||
}, | ||
greater: function (n, m) { | ||
return o.compare(n, m) > 0; | ||
}, | ||
greaterOrEquals: function (n, m) { | ||
return o.compare(n, m) >= 0; | ||
}, | ||
lesserOrEquals: function (n, m) { | ||
return o.compare(n, m) <= 0; | ||
}, | ||
toString: function (m) { | ||
var first = m || self; | ||
var str = "", len = first.value.length; | ||
while (len--) { | ||
str += (base.toString() + first.value[len]).slice(-logBase); | ||
} | ||
while (str[0] === "0") { | ||
str = str.slice(1); | ||
} | ||
if (!str.length) str = "0"; | ||
var s = first.sign === sign.positive ? "" : "-"; | ||
return s + str; | ||
}, | ||
toJSNumber: function (m) { | ||
return +o.toString(m); | ||
}, | ||
valueOf: function (m) { | ||
return o.toJSNumber(m); | ||
} | ||
}; | ||
return o; | ||
}; | ||
var ZERO = bigInt([0], sign.positive); | ||
var ONE = bigInt([1], sign.positive); | ||
var MINUS_ONE = bigInt([-1], sign.positive); | ||
var ZERO = bigInt([0], sign.positive); | ||
var ONE = bigInt([1], sign.positive); | ||
var MINUS_ONE = bigInt([-1], sign.positive); | ||
var fnReturn = function (a) { | ||
if (typeof a === "undefined") return ZERO; | ||
return parse(a); | ||
}; | ||
fnReturn.zero = ZERO; | ||
fnReturn.one = ONE; | ||
fnReturn.minusOne = MINUS_ONE; | ||
return fnReturn; | ||
var fnReturn = function (a) { | ||
if (typeof a === "undefined") return ZERO; | ||
return parse(a); | ||
}; | ||
fnReturn.zero = ZERO; | ||
fnReturn.one = ONE; | ||
fnReturn.minusOne = MINUS_ONE; | ||
return fnReturn; | ||
})(); | ||
@@ -317,0 +317,0 @@ |
@@ -1,1 +0,1 @@ | ||
var bigInt=function(){var e=1e7,t=7,n={positive:!1,negative:!0},r=function(e,t){var n=e.value,r=t.value,i=n.length>r.length?n.length:r.length;for(var s=0;s<i;s++)n[s]=n[s]||0,r[s]=r[s]||0;for(var s=i-1;s>=0;s--)n[s]===0&&r[s]===0&&(n.pop(),r.pop());e.value=n,t.value=r},i=function(e,s){if(typeof e=="object")return e;e+="";var u=n.positive,a=[];e[0]==="-"&&(u=n.negative,e=e.slice(1));var e=e.split("e");if(e.length>2)throw new Error("Invalid integer");if(e[1]){var f=e[1];f[0]==="+"&&(f=f.slice(1)),f=i(f);if(f.lesser(0))throw new Error("Cannot include negative exponent part for integers");while(f.notEquals(0))e[0]+="0",f=f.prev()}e=e[0],e==="-0"&&(e="0");var l=/^([1-9][0-9]*)$|^0$/.test(e);if(!l)throw new Error("Invalid integer");while(e.length){var c=e.length>t?e.length-t:0;a.push(+e.slice(c)),e=e.slice(0,c)}var h=o(a,u);return s&&r(s,h),h},s=function(e,t){var e=o(e,n.positive),t=o(t,n.positive),r=0;do{var i=1,s=o(e.value,n.positive),u=s.times(10);while(u.lesser(t))s=u,i*=10,u=u.times(10);while(s.lesserOrEquals(t))t=t.minus(s),r+=i}while(e.lesserOrEquals(t));return{remainder:t.value,result:r}},o=function(t,f){var l={value:t,sign:f},c={value:t,sign:f,negate:function(e){var t=e||l;return o(t.value,!t.sign)},abs:function(e){var t=e||l;return o(t.value,n.positive)},add:function(t,s){var u,a=l,f;s?(a=i(t))&&(f=i(s)):f=i(t,a),u=a.sign;if(a.sign!==f.sign)return a=o(a.value,n.positive),f=o(f.value,n.positive),u===n.positive?c.subtract(a,f):c.subtract(f,a);r(a,f);var h=a.value,p=f.value,d=[],v=0;for(var m=0;m<h.length||v>0;m++){var g=h[m]+p[m]+v;v=g>e?1:0,g-=v*e,d.push(g)}return o(d,u)},plus:function(e,t){return c.add(e,t)},subtract:function(t,r){var s,u=l,a;r?(u=i(t))&&(a=i(r)):a=i(t,u);if(u.sign!==a.sign)return c.add(u,c.negate(a));if(u.sign===n.negative)return c.subtract(c.negate(a),c.negate(u));if(c.compare(u,a)===-1)return c.negate(c.subtract(a,u));var f=u.value,h=a.value,p=[],d=0;for(var v=0;v<f.length;v++){f[v]-=d,d=f[v]<h[v]?1:0;var m=d*e+f[v]-h[v];p.push(m)}return o(p,n.positive)},minus:function(e,t){return c.subtract(e,t)},multiply:function(t,n){var r,s=l,u;n?(s=i(t))&&(u=i(n)):u=i(t,s),r=s.sign!==u.sign;var a=s.value,f=u.value,c=[];for(var h=0;h<a.length;h++){c[h]=[];var p=h;while(p--)c[h].push(0)}var d=0;for(var h=0;h<a.length;h++){var v=a[h];for(var p=0;p<f.length||d>0;p++){var m=f[p],g=m?v*m+d:d;d=g>e?Math.floor(g/e):0,g-=d*e,c[h].push(g)}}var y=-1;for(var h=0;h<c.length;h++){var b=c[h].length;b>y&&(y=b)}var w=[],d=0;for(var h=0;h<y||d>0;h++){var E=d;for(var p=0;p<c.length;p++)E+=c[p][h]||0;d=E>e?Math.floor(E/e):0,E-=d*e,w.push(E)}return o(w,r)},times:function(e,t){return c.multiply(e,t)},divmod:function(e,t){var n,r=l,u;t?(r=i(e))&&(u=i(t)):u=i(e,r),n=r.sign!==u.sign;if(u.equals(0))throw new Error("Cannot divide by zero");var a=r.value,f=u.value,c=[],h=[];for(var p=a.length-1;p>=0;p--){var e=[a[p]].concat(h),d=s(f,e);c.push(d.result),h=d.remainder}return c.reverse(),{quotient:o(c,n),remainder:o(h,r.sign)}},divide:function(e,t){return c.divmod(e,t).quotient},over:function(e,t){return c.divide(e,t)},mod:function(e,t){return c.divmod(e,t).remainder},pow:function(e,t){var n=l,r;t?(n=i(e))&&(r=i(t)):r=i(e,n);var s=n,c=r;if(c.lesser(0))return u;if(c.equals(0))return a;var h=o(s.value,s.sign);while(c.greater(1))h=h.times(s),c=c.prev();return o(h.value,f)},next:function(e){var t=e||l;return c.add(t,1)},prev:function(e){var t=e||l;return c.subtract(t,1)},compare:function(e,t){var s=l,o;t?(s=i(e))&&(o=i(t,s)):o=i(e,s);if(o.sign!==s.sign)return s.sign===n.positive?1:-1;var u=s.sign===n.positive?1:-1;r(s,o);var a=s.value,f=o.value;for(var c=a.length-1;c>=0;c--){if(a[c]>f[c])return 1*u;if(f[c]>a[c])return-1*u}return 0},compareAbs:function(e,t){var r=l,s;return t?(r=i(e))&&(s=i(t,r)):s=i(e,r),r.sign=s.sign=n.positive,c.compare(r,s)},equals:function(e,t){return c.compare(e,t)===0},notEquals:function(e,t){return!c.equals(e,t)},lesser:function(e,t){return c.compare(e,t)<0},greater:function(e,t){return c.compare(e,t)>0},greaterOrEquals:function(e,t){return c.compare(e,t)>=0},lesserOrEquals:function(e,t){return c.compare(e,t)<=0},toString:function(e){var t=e||l,r="",i=t.value.length;while(i--)r+=t.value[i];while(r[0]==="0")r=r.slice(1);r.length||(r="0");var s=t.sign===n.positive?"":"-";return s+r},toJSNumber:function(e){return+c.toString(e)},valueOf:function(e){return c.toJSNumber(e)}};return c},u=o([0],n.positive),a=o([1],n.positive),f=o([-1],n.positive),l=function(e){return typeof e=="undefined"?u:i(e)};return l.zero=u,l.one=a,l.minusOne=f,l}();typeof module!="undefined"&&(module.exports=bigInt); | ||
var bigInt=function(){var e=1e7,t=7,n={positive:!1,negative:!0},r=function(e,t){var n=e.value,r=t.value,i=n.length>r.length?n.length:r.length;for(var s=0;s<i;s++)n[s]=n[s]||0,r[s]=r[s]||0;for(var s=i-1;s>=0;s--)n[s]===0&&r[s]===0&&(n.pop(),r.pop());e.value=n,t.value=r},i=function(e,s){if(typeof e=="object")return e;e+="";var u=n.positive,a=[];e[0]==="-"&&(u=n.negative,e=e.slice(1));var e=e.split("e");if(e.length>2)throw new Error("Invalid integer");if(e[1]){var f=e[1];f[0]==="+"&&(f=f.slice(1)),f=i(f);if(f.lesser(0))throw new Error("Cannot include negative exponent part for integers");while(f.notEquals(0))e[0]+="0",f=f.prev()}e=e[0],e==="-0"&&(e="0");var l=/^([1-9][0-9]*)$|^0$/.test(e);if(!l)throw new Error("Invalid integer");while(e.length){var c=e.length>t?e.length-t:0;a.push(+e.slice(c)),e=e.slice(0,c)}var h=o(a,u);return s&&r(s,h),h},s=function(e,t){var e=o(e,n.positive),t=o(t,n.positive),r=0;do{var i=1,s=o(e.value,n.positive),u=s.times(10);while(u.lesser(t))s=u,i*=10,u=u.times(10);while(s.lesserOrEquals(t))t=t.minus(s),r+=i}while(e.lesserOrEquals(t));return{remainder:t.value,result:r}},o=function(f,l){var c={value:f,sign:l},h={value:f,sign:l,negate:function(e){var t=e||c;return o(t.value,!t.sign)},abs:function(e){var t=e||c;return o(t.value,n.positive)},add:function(t,s){var u,a=c,f;s?(a=i(t))&&(f=i(s)):f=i(t,a),u=a.sign;if(a.sign!==f.sign)return a=o(a.value,n.positive),f=o(f.value,n.positive),u===n.positive?h.subtract(a,f):h.subtract(f,a);r(a,f);var l=a.value,p=f.value,d=[],v=0;for(var m=0;m<l.length||v>0;m++){var g=l[m]+p[m]+v;v=g>e?1:0,g-=v*e,d.push(g)}return o(d,u)},plus:function(e,t){return h.add(e,t)},subtract:function(t,r){var s,u=c,a;r?(u=i(t))&&(a=i(r)):a=i(t,u);if(u.sign!==a.sign)return h.add(u,h.negate(a));if(u.sign===n.negative)return h.subtract(h.negate(a),h.negate(u));if(h.compare(u,a)===-1)return h.negate(h.subtract(a,u));var f=u.value,l=a.value,p=[],d=0;for(var v=0;v<f.length;v++){f[v]-=d,d=f[v]<l[v]?1:0;var m=d*e+f[v]-l[v];p.push(m)}return o(p,n.positive)},minus:function(e,t){return h.subtract(e,t)},multiply:function(t,n){var r,s=c,u;n?(s=i(t))&&(u=i(n)):u=i(t,s),r=s.sign!==u.sign;var a=s.value,f=u.value,l=[];for(var h=0;h<a.length;h++){l[h]=[];var p=h;while(p--)l[h].push(0)}var d=0;for(var h=0;h<a.length;h++){var v=a[h];for(var p=0;p<f.length||d>0;p++){var m=f[p],g=m?v*m+d:d;d=g>e?Math.floor(g/e):0,g-=d*e,l[h].push(g)}}var y=-1;for(var h=0;h<l.length;h++){var b=l[h].length;b>y&&(y=b)}var w=[],d=0;for(var h=0;h<y||d>0;h++){var E=d;for(var p=0;p<l.length;p++)E+=l[p][h]||0;d=E>e?Math.floor(E/e):0,E-=d*e,w.push(E)}return o(w,r)},times:function(e,t){return h.multiply(e,t)},divmod:function(e,t){var n,r=c,u;t?(r=i(e))&&(u=i(t)):u=i(e,r),n=r.sign!==u.sign;if(u.equals(0))throw new Error("Cannot divide by zero");var a=r.value,f=u.value,l=[],h=[];for(var p=a.length-1;p>=0;p--){var e=[a[p]].concat(h),d=s(f,e);l.push(d.result),h=d.remainder}return l.reverse(),{quotient:o(l,n),remainder:o(h,r.sign)}},divide:function(e,t){return h.divmod(e,t).quotient},over:function(e,t){return h.divide(e,t)},mod:function(e,t){return h.divmod(e,t).remainder},pow:function(e,t){var n=c,r;t?(n=i(e))&&(r=i(t)):r=i(e,n);var s=n,f=r;if(f.lesser(0))return u;if(f.equals(0))return a;var h=o(s.value,s.sign);while(f.greater(1))h=h.times(s),f=f.prev();return o(h.value,l)},next:function(e){var t=e||c;return h.add(t,1)},prev:function(e){var t=e||c;return h.subtract(t,1)},compare:function(e,t){var s=c,o;t?(s=i(e))&&(o=i(t,s)):o=i(e,s);if(o.sign!==s.sign)return s.sign===n.positive?1:-1;var u=s.sign===n.positive?1:-1;r(s,o);var a=s.value,f=o.value;for(var l=a.length-1;l>=0;l--){if(a[l]>f[l])return 1*u;if(f[l]>a[l])return-1*u}return 0},compareAbs:function(e,t){var r=c,s;return t?(r=i(e))&&(s=i(t,r)):s=i(e,r),r.sign=s.sign=n.positive,h.compare(r,s)},equals:function(e,t){return h.compare(e,t)===0},notEquals:function(e,t){return!h.equals(e,t)},lesser:function(e,t){return h.compare(e,t)<0},greater:function(e,t){return h.compare(e,t)>0},greaterOrEquals:function(e,t){return h.compare(e,t)>=0},lesserOrEquals:function(e,t){return h.compare(e,t)<=0},toString:function(r){var i=r||c,s="",o=i.value.length;while(o--)s+=(e.toString()+i.value[o]).slice(-t);while(s[0]==="0")s=s.slice(1);s.length||(s="0");var u=i.sign===n.positive?"":"-";return u+s},toJSNumber:function(e){return+h.toString(e)},valueOf:function(e){return h.toJSNumber(e)}};return h},u=o([0],n.positive),a=o([1],n.positive),f=o([-1],n.positive),l=function(e){return typeof e=="undefined"?u:i(e)};return l.zero=u,l.one=a,l.minusOne=f,l}();typeof module!="undefined"&&(module.exports=bigInt); |
@@ -13,2 +13,9 @@ /// <reference path="BigInteger.js" /> | ||
function factorial(n) { | ||
if (n.equals(bigInt.zero) || n.equals(bigInt.one)) { | ||
return bigInt.one; | ||
} | ||
return factorial(n.prev()).times(n); | ||
} | ||
assert({ | ||
@@ -63,2 +70,12 @@ "1 = 1": bigInt("1").equals("1"), | ||
"9007199254740992++ = 9007199254740993": bigInt(9007199254740992).next().equals("9007199254740993"), | ||
"Leading zeroes":bigInt("10000000").toString()=="10000000", | ||
"Leading zeroes 2":bigInt("100001010000000").toString()=="100001010000000", | ||
"10 Factorial" : (function () { | ||
var res = "3628800"; //http://www.wolframalpha.com/input/?i=10%21 | ||
return factorial(bigInt(10)).equals(res); | ||
})(), | ||
"100 Factorial" : (function () { | ||
var res = "93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000"; //http://puzzles.nigelcoldwell.co.uk/nineteen.htm | ||
return factorial(bigInt(100)).equals(res); | ||
})(), | ||
"Fail on negative exponent": (function () { | ||
@@ -65,0 +82,0 @@ try { |
{ | ||
"name": "big-integer", | ||
"version": "1.0.1", | ||
"version": "1.0.2", | ||
"author": "Peter Olson <peter.e.c.olson+npm@gmail.com>", | ||
@@ -5,0 +5,0 @@ "description": "An arbitrary length integer library for Javascript", |
413
27740
6