big-rational
Advanced tools
Comparing version 0.9.8 to 0.9.9
@@ -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--){if(n[s]!==0||r[s]!==0)break;n.pop(),r.pop()}n.length||(n=[0],r=[0]),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=/^([0-9][0-9]*)$/.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);if(e.equals(0))throw new Error("Cannot divide by 0");var 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]||0)+(p[m]||0)+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=c,u;r?(s=i(t))&&(u=i(r)):u=i(t,s);if(s.sign!==u.sign)return h.add(s,h.negate(u));if(s.sign===n.negative)return h.subtract(h.negate(u),h.negate(s));if(h.compare(s,u)===-1)return h.negate(h.subtract(u,s));var a=s.value,f=u.value,l=[],p=0;for(var d=0;d<a.length;d++){var v=a[d]-p;p=v<f[d]?1:0;var m=p*e+v-f[d];l.push(m)}return o(l,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 r,u=c,a;t?(u=i(e))&&(a=i(t)):a=i(e,u),r=u.sign!==a.sign;if(o(u.value,u.sign).equals(0))return{quotient:o([0],n.positive),remainder:o([0],n.positive)};if(a.equals(0))throw new Error("Cannot divide by zero");var f=u.value,l=a.value,h=[],p=[];for(var d=f.length-1;d>=0;d--){var e=[f[d]].concat(p),v=s(l,e);h.push(v.result),p=v.remainder}return h.reverse(),{quotient:o(h,r),remainder:o(p,u.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},remainder:function(e,t){return h.mod(e,t)},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(o(s.value,s.sign).equals(0))return u;if(f.lesser(0))return u;if(f.equals(0))return a;var l=o(s.value,s.sign);if(f.mod(2).equals(0)){var h=l.pow(f.over(2));return h.times(h)}return l.times(l.pow(f.minus(1)))},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),r(s,o);if(s.value.length===1&&o.value.length===1&&s.value[0]===0&&o.value[0]===0)return 0;if(o.sign!==s.sign)return s.sign===n.positive?1:-1;var u=s.sign===n.positive?1:-1,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},compareTo:function(e,t){return h.compare(e,t)},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},isPositive:function(e){var t=e||c;return t.sign===n.positive},isNegative:function(e){var t=e||c;return t.sign===n.negative},isEven:function(e){var t=e||c;return t.value[0]%2===0},isOdd:function(e){var t=e||c;return t.value[0]%2===1},toString:function(r){var i=r||c,s="",o=i.value.length;while(o--)i.value[o].toString().length===8?s+=i.value[o]:s+=(e.toString()+i.value[o]).slice(-t);while(s[0]==="0")s=s.slice(1);s.length||(s="0");if(s==="0")return s;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.negative),l=function(e,t){function a(e){var t=e[s].toLowerCase();if(s===0&&e[s]==="-"){o=!0;return}if(/[0-9]/.test(t))r.push(i(t));else if(/[a-z]/.test(t))r.push(i(t.charCodeAt(0)-87));else{if(t!=="<")throw new Error(t+" is not a valid character");var n=s;do s++;while(e[s]!==">");r.push(i(e.slice(n+1,s)))}}t=i(t);var n=u,r=[],s,o=!1;for(s=0;s<e.length;s++)a(e);r.reverse();for(s=0;s<r.length;s++)n=n.add(r[s].times(t.pow(s)));return o?-n:n},c=function(e,t){return typeof e=="undefined"?u:typeof t!="undefined"?l(e,t):i(e)};return c.zero=u,c.one=a,c.minusOne=f,c}();typeof module!="undefined"&&(module.exports=bigInt);var bigRat=function(){function e(t,n){return n.equals(0)?t:e(n,t.mod(n))}function t(t,n){return t.times(n).divide(e(t,n))}function n(i,o,u){o=o||bigInt(1),u=u||!1;var a={numerator:i,denominator:o,num:i,denom:o,reduce:function(){var t=e(a.num,a.denom),r=a.num.divide(t),i=a.denom.divide(t);i.lesser(0)&&(r=r.times(-1),i=i.times(-1));if(i.equals(0))throw"Denominator cannot be 0.";return n(r,i,!0)},abs:function(){return a.isPositive()?a:a.negate()},multiply:function(e,t){return e=r(e,t),n(a.num.times(e.num),a.denom.times(e.denom))},times:function(e,t){return a.multiply(e,t)},divide:function(e,t){return e=r(e,t),n(a.num.times(e.denom),a.denom.times(e.num))},over:function(e,t){return a.divide(e,t)},mod:function(e,t){var e=r(e,t);return a.minus(e.times(a.over(e).floor()))},add:function(e,i){e=r(e,i);var s=t(a.denom,e.denom),o=s.divide(a.denom),u=s.divide(e.denom);return o=a.num.times(o),u=e.num.times(u),n(o.add(u),s)},plus:function(e,t){return a.add(e,t)},negate:function(){var e=bigInt.zero.minus(a.num);return n(e,a.denom)},subtract:function(e,t){return e=r(e,t),a.add(e.negate())},minus:function(e,t){return a.subtract(e,t)},isPositive:function(){return a.num.isPositive()},isNegative:function(){return!a.isPositive()},isZero:function(){return a.equals(0,1)},compare:function(e,t){e=r(e,t);if(a.num.equals(e.num)&&a.denom.equals(e.denom))return 0;var n=a.denom.times(e.denom),i=n.greater(0)?1:-1;return a.num.times(e.denom).greater(e.num.times(a.denom))?i:-i},equals:function(e,t){return a.compare(e,t)===0},notEquals:function(e,t){return!a.equals(e,t)},lesser:function(e,t){return a.compare(e,t)<0},lesserOrEquals:function(e,t){return a.compare(e,t)<=0},greater:function(e,t){return a.compare(e,t)>0},greaterOrEquals:function(e,t){return a.compare(e,t)>=0},floor:function(e){var t=a.num.over(a.denom);return e?t:n(t)},ceil:function(e){var t=a.num.divmod(a.denom),r;return r=t.quotient,t.remainder.notEquals(0)&&(r=r.add(1)),e?r:n(r)},round:function(e){return a.add(1,2).floor(e)},toString:function(){var e=a.reduce();return e.num.toString()+"/"+e.denom.toString()},valueOf:function(){return a.num/a.denom},toDecimal:function(e){e=e||10;var t=a.num.divmod(a.denom),n=t.quotient.toString(),r=s(t.remainder.abs(),a.denom),i="";while(i.length<=e){var o;for(o=0;o<=10;o++)if(s(i+o,"1"+Array(i.length+2).join("0")).greater(r)){o--;break}i+=o}while(i.slice(-1)==="0")i=i.slice(0,-1);return i===""?n:n+"."+i}};return u?a:a.reduce()}function r(e,t){return s(e,t)}function i(e){var t=e.split(/e/i);if(t.length>2)throw new Error("Invalid input: too many 'e' tokens");if(t.length>1){var r=!0;t[1][0]==="-"&&(t[1]=t[1].slice(1),r=!1),t[1][0]==="+"&&(t[1]=t[1].slice(1));var s=i(t[0]),o=n(bigInt(10).pow(t[1]));return r?s.times(o):s.over(o)}t=e.split(".");if(t.length>2)throw new Error("Invalid input: too many '.' tokens");if(t.length>1){var u=n(bigInt(t[0])),a=t[1].length;while(t[1][0]==="0")t[1]=t[1].slice(1);var f="1"+Array(a+1).join("0"),l=n(bigInt(t[1]),bigInt(f));return u=u.add(l),t[0][0]==="-"&&(u=u.negate()),u}return n(bigInt(e))}function s(e,t){if(!e)return n(bigInt(0));if(t)return n(bigInt(e),bigInt(t));if(typeof e=="object")return e.instanceofBigInt?n(e):e;var r,s,o=e+"",u=o.split("/");if(u.length>2)throw new Error("Invalid input: too many '/' tokens");if(u.length>1){var a=u[0].split("_");if(a.length>2)throw new Error("Invalid input: too many '_' tokens");if(a.length>1){var f=a[0][0]!=="-";return r=bigInt(a[0]).times(u[1]),f?r=r.add(a[1]):r=r.subtract(a[1]),s=bigInt(u[1]),n(r,s).reduce()}return n(bigInt(u[0]),bigInt(u[1]))}return i(o)}return typeof require!="undefined"&&(bigInt=require("big-integer")),s.zero=s(0),s.one=s(1),s.minusOne=s(-1),s}();typeof module!="undefined"&&module.hasOwnProperty("exports")&&(module.exports=bigRat); | ||
var bigInt=function(e){"use strict";function o(e,t){this.value=e,this.sign=t,this.isSmall=!1}function u(e){this.value=e,this.sign=e<0,this.isSmall=!0}function a(e){return-r<e&&e<r}function f(e){return e<1e7?[e]:e<1e14?[e%1e7,Math.floor(e/1e7)]:[e%1e7,Math.floor(e/1e7)%1e7,Math.floor(e/1e14)]}function l(e){c(e);var n=e.length;if(n<4&&A(e,i)<0)switch(n){case 0:return 0;case 1:return e[0];case 2:return e[0]+e[1]*t;default:return e[0]+(e[1]+e[2]*t)*t}return e}function c(e){var t=e.length;while(e[--t]===0);e.length=t+1}function h(e){var t=new Array(e),n=-1;while(++n<e)t[n]=0;return t}function p(e){return e>0?Math.floor(e):Math.ceil(e)}function d(e,n){var r=e.length,i=n.length,s=new Array(r),o=0,u=t,a,f;for(f=0;f<i;f++)a=e[f]+n[f]+o,o=a>=u?1:0,s[f]=a-o*u;while(f<r)a=e[f]+o,o=a===u?1:0,s[f++]=a-o*u;return o>0&&s.push(o),s}function v(e,t){return e.length>=t.length?d(e,t):d(t,e)}function m(e,n){var r=e.length,i=new Array(r),s=t,o,u;for(u=0;u<r;u++)o=e[u]+n,n=Math.floor(o/s),i[u]=o%s;while(n>0)i[u++]=n%s,n=Math.floor(n/s);return i}function g(e,n){var r=e.length,i=n.length,s=new Array(r),o=0,u=t,a,f;for(a=0;a<i;a++)f=e[a]-o-n[a],f<0?(f+=u,o=1):o=0,s[a]=f;for(a=i;a<r;a++){f=e[a]-o;if(!(f<0)){s[a++]=f;break}f+=u,s[a]=f}for(;a<r;a++)s[a]=e[a];return c(s),s}function y(e,t,n){var r,i;return A(e,t)>=0?r=g(e,t):(r=g(t,e),n=!n),r=l(r),typeof r=="number"?(n&&(r=-r),new u(r)):new o(r,n)}function b(e,n,r){var i=e.length,s=new Array(i),a=-n,f=t,c,h;for(c=0;c<i;c++)h=e[c]+a,a=Math.floor(h/f),s[c]=h<0?h%f+f:h;return s=l(s),typeof s=="number"?(r&&(s=-s),new u(s)):new o(s,r)}function w(e,n){var r=e.length,i=n.length,s=r+i,o=h(s),u=t,a,f,l,p,d;for(l=0;l<r;++l){p=e[l];for(var v=0;v<i;++v)d=n[v],a=p*d+o[l+v],f=Math.floor(a/u),o[l+v]=a-f*u,o[l+v+1]+=f}return c(o),o}function E(e,n){var r=e.length,i=new Array(r),s=t,o=0,u,a;for(a=0;a<r;a++)u=e[a]*n+o,o=Math.floor(u/s),i[a]=u-o*s;while(o>0)i[a++]=o%s,o=Math.floor(o/s);return i}function S(e,t){var n=[];while(t-->0)n.push(0);return n.concat(e)}function x(e,t){var n=Math.max(e.length,t.length);if(n<=400)return w(e,t);n=Math.ceil(n/2);var r=e.slice(n),i=e.slice(0,n),s=t.slice(n),o=t.slice(0,n),u=x(i,o),a=x(r,s),f=x(v(i,r),v(o,s));return v(v(u,S(g(g(f,u),a),n)),S(a,2*n))}function T(e){var n=e.length,r=h(n+n),i=t,s,o,u,a,f;for(u=0;u<n;u++){a=e[u];for(var l=0;l<n;l++)f=e[l],s=a*f+r[u+l],o=Math.floor(s/i),r[u+l]=s-o*i,r[u+l+1]+=o}return c(r),r}function N(e,n){var r=e.length,i=n.length,s=t,o=h(n.length),u=n[i-1],a=Math.ceil(s/(2*u)),f=E(e,a),c=E(n,a),p,d,v,m,g,y,b;f.length<=r&&f.push(0),c.length<=i&&c.push(0),u=c[i-1];for(d=r-i;d>=0;d--){p=s-1,f[d+i]!==u&&(p=Math.floor((f[d+i]*s+f[d+i-1])/u)),v=0,m=0,y=c.length;for(g=0;g<y;g++)v+=p*c[g],b=Math.floor(v/s),m+=f[d+g]-(v-b*s),v=b,m<0?(f[d+g]=m+s,m=-1):(f[d+g]=m,m=0);while(m!==0){p-=1,v=0;for(g=0;g<y;g++)v+=f[d+g]-s+c[g],v<0?(f[d+g]=v+s,v=0):(f[d+g]=v,v=1);m+=v}o[d]=p}return f=k(f,a)[0],[l(o),l(f)]}function C(e,n){var r=e.length,i=n.length,s=[],o=[],u=t,a,f,c,h,p;while(r){o.unshift(e[--r]);if(A(o,n)<0){s.push(0);continue}o.length===1&&o[0]===0?a=0:(f=o.length,c=o[f-1]*u+o[f-2],h=n[i-1]*u+n[i-2],f>i&&(c=(c+1)*u),a=Math.ceil(c/h));do{p=E(n,a);if(A(p,o)<=0)break;a--}while(a);s.push(a);if(!a)continue;o=g(o,p)}return s.reverse(),[l(s),l(o)]}function k(e,n){var r=e.length,i=h(r),s=t,o,u,a,f;a=0;for(o=r-1;o>=0;--o)f=a*s+e[o],u=p(f/n),a=f-u*n,i[o]=u|0;return[i,a|0]}function L(e,n){var r,i=z(n),s=e.value,a=i.value,c;if(a===0)throw new Error("Cannot divide by zero");if(e.isSmall)return i.isSmall?[new u(p(s/a)),new u(s%a)]:[W[0],e];if(i.isSmall){if(a===1)return[e,W[0]];if(a==-1)return[e.negate(),W[0]];var h=Math.abs(a);if(h<t){r=k(s,h),c=l(r[0]);var d=r[1];return e.sign&&(d=-d),typeof c=="number"?(e.sign!==i.sign&&(c=-c),[new u(c),new u(d)]):[new o(c,e.sign!==i.sign),new u(d)]}a=f(h)}var v=A(s,a);if(v===-1)return[W[0],e];if(v===0)return[W[1],W[0]];s.length+a.length<=200?r=N(s,a):r=C(s,a),c=r[0];var m=e.sign!==i.sign,g=r[1],y=e.sign;return typeof c=="number"?(m&&(c=-c),c=new u(c)):c=new o(c,m),typeof g=="number"?(y&&(g=-g),g=new u(g)):g=new o(g,y),[c,g]}function A(e,t){if(e.length!==t.length)return e.length>t.length?1:-1;for(var n=e.length-1;n>=0;n--)if(e[n]!==t[n])return e[n]>t[n]?1:-1;return 0}function D(e){return(typeof e=="number"||typeof e=="string")&&+Math.abs(e)<=t||e instanceof o&&e.value.length<=1}function P(e,t,n){t=z(t);var r=e.isNegative(),i=t.isNegative(),s=r?e.not():e,o=i?t.not():t,u=[],a=[],f=!1,l=!1;while(!f||!l)s.isZero()?(f=!0,u.push(r?1:0)):r?u.push(s.isEven()?1:0):u.push(s.isEven()?0:1),o.isZero()?(l=!0,a.push(i?1:0)):i?a.push(o.isEven()?1:0):a.push(o.isEven()?0:1),s=s.over(2),o=o.over(2);var c=[];for(var h=0;h<u.length;h++)c.push(n(u[h],a[h]));var p=bigInt(c.pop()).negate().times(bigInt(2).pow(c.length));while(c.length)p=p.add(bigInt(c.pop()).times(bigInt(2).pow(c.length)));return p}function H(e,t){return e=z(e),t=z(t),e.greater(t)?e:t}function B(e,t){return e=z(e),t=z(t),e.lesser(t)?e:t}function j(e,t){return e=z(e).abs(),t=z(t).abs(),e.equals(t)?e:e.isZero()?t:t.isZero()?e:e.isEven()?t.isOdd()?j(e.divide(2),t):j(e.divide(2),t.divide(2)).multiply(2):t.isEven()?j(e,t.divide(2)):e.greater(t)?j(e.subtract(t).divide(2),t):j(t.subtract(e).divide(2),e)}function F(e,t){return e=z(e).abs(),t=z(t).abs(),e.multiply(t).divide(j(e,t))}function I(e,n){e=z(e),n=z(n),e.isSmall&&(e=f(e)),n.isSmall&&(n=f(n));var r=B(e,n),i=H(e,n),s=i.subtract(r),u=s.value.length-1,a=[],c=!0;for(var h=u;h>=0;h--){var d=c?s.value[h]:t,v=p(Math.random()*d);a.unshift(v),v<d&&(c=!1)}return a=l(a),r.add(new o(a,!1,typeof a=="number"))}function R(e){var t=e.value;return typeof t=="number"&&(t=[t]),t.length===1&&t[0]<=36?"0123456789abcdefghijklmnopqrstuvwxyz".charAt(t[0]):"<"+t+">"}function U(e,t){t=bigInt(t);if(t.isZero()){if(e.isZero())return"0";throw new Error("Cannot convert nonzero numbers to base 0.")}if(t.equals(-1))return e.isZero()?"0":e.isNegative()?(new Array(1-e)).join("10"):"1"+(new Array(+e)).join("01");var n="";e.isNegative()&&t.isPositive()&&(n="-",e=e.abs());if(t.equals(1))return e.isZero()?"0":n+(new Array(+e+1)).join(1);var r=[],i=e,s;while(i.isNegative()||i.compareAbs(t)>=0){s=i.divmod(t),i=s.quotient;var o=s.remainder;o.isNegative()&&(o=t.minus(o).abs(),i=i.next()),r.push(R(o))}return r.push(R(i)),n+r.reverse().join("")}function z(e){if(e instanceof o||e instanceof u)return e;if(typeof e=="number"){if(a(e))return new u(e);e=String(e)}if(typeof e=="string"){if(a(+e)){var t=+e;if(t===p(t))return new u(t);throw"Invalid integer: "+e}var r=e[0]==="-";r&&(e=e.slice(1));var i=e.split(/e/i);if(i.length>2)throw new Error("Invalid integer: "+f.join("e"));if(i.length===2){var s=i[1];s[0]==="+"&&(s=s.slice(1)),s=+s;if(s!==p(s)||!a(s))throw new Error("Invalid integer: "+s+" is not a valid exponent.");var f=i[0],l=f.indexOf(".");l>=0&&(s-=f.length-l,f=f.slice(0,l)+f.slice(l+1));if(s<0)throw new Error("Cannot include negative exponent part for integers");f+=(new Array(s+1)).join("0"),e=f}var h=/^([0-9][0-9]*)$/.test(e);if(!h)throw new Error("Invalid integer: "+e);var d=[],v=e.length,m=n,g=v-m;while(v>0)d.push(+e.slice(g,v)),g-=m,g<0&&(g=0),v-=m;return c(d),new o(d,r)}}var t=1e7,n=7,r=9007199254740992,i=f(r),s=Math.log(r);o.prototype.add=function(e){var n,r=z(e);if(this.sign!==r.sign)return this.subtract(r.negate());var i=this.value,s=r.value;if(r.isSmall){if(a(s+t))return new o(m(i,Math.abs(s)),this.sign);s=f(Math.abs(s))}return new o(v(i,s),this.sign)},o.prototype.plus=o.prototype.add,u.prototype.add=function(e){var n=z(e);if(this.sign!==n.sign)return this.subtract(n.negate());var r=this.value,i=n.value;if(n.isSmall){if(a(r+i))return new u(r+i);i=f(Math.abs(i))}return a(r+t)?new o(m(i,Math.abs(r)),r<0):new o(v(i,f(Math.abs(r))),r<0)},u.prototype.plus=u.prototype.add,o.prototype.subtract=function(e){var t=z(e);if(this.sign!==t.sign)return this.add(t.negate());var n=this.value,r=t.value;return t.isSmall?b(n,Math.abs(r),this.sign):y(n,r,this.sign)},o.prototype.minus=o.prototype.subtract,u.prototype.subtract=function(e){var t=z(e);if(this.sign!==t.sign)return this.add(t.negate());var n=this.value,r=t.value;return t.isSmall?new u(n-r):b(r,Math.abs(n),n>=0)},u.prototype.minus=u.prototype.subtract,o.prototype.negate=function(){return new o(this.value,!this.sign)},u.prototype.negate=function(){var e=this.sign,t=new u(-this.value);return t.sign=!e,t},o.prototype.abs=function(){return new o(this.value,!1)},u.prototype.abs=function(){return new u(Math.abs(this.value))},o.prototype.multiply=function(e){var n,r=z(e),i=this.value,s=r.value,u=this.sign!==r.sign,a;if(r.isSmall){if(s===0)return W[0];if(s===1)return this;if(s===-1)return this.negate();a=Math.abs(s);if(a<t)return new o(E(i,a),u);s=f(a)}return i.length+s.length>4e3?new o(x(i,s),u):new o(w(i,s),u)},o.prototype.times=o.prototype.multiply,u.prototype.multiply=function(e){var n=z(e),r=this.value,i=n.value;if(r===0)return W[0];if(r===1)return n;if(r===-1)return n.negate();if(n.isSmall){if(a(r*i))return new u(r*i);i=f(Math.abs(i))}var s=Math.abs(r);return s<t?new o(E(i,s),this.sign!==n.sign):new o(w(i,f(s)),this.sign!==n.sign)},u.prototype.times=u.prototype.multiply,o.prototype.square=function(){return new o(T(this.value),!1)},u.prototype.square=function(){var e=this.value*this.value;return a(e)?new u(e):new o(T(f(Math.abs(this.value))),!1)},o.prototype.divmod=function(e){var t=L(this,e);return{quotient:t[0],remainder:t[1]}},u.prototype.divmod=o.prototype.divmod,o.prototype.divide=function(e){return L(this,e)[0]},u.prototype.over=u.prototype.divide=o.prototype.over=o.prototype.divide,o.prototype.mod=function(e){return L(this,e)[1]},u.prototype.remainder=u.prototype.mod=o.prototype.remainder=o.prototype.mod,o.prototype.pow=function(e){var t=z(e),n=this.value,r=t.value,i,s,o;if(r===0)return W[1];if(t.sign)return n===1?W[1]:n===-1?isEven(t)?W[1]:W[-1]:W[0];if(!t.isSmall)throw new Error("The exponent "+t.toString()+" is too large.");if(this.isSmall){if(a(i=Math.pow(n,r)))return new u(p(i));if(n===0)return W[0];if(n===1)return W[1]}s=this,o=W[1];for(;;){r&!0&&(o=o.times(s),--r);if(r===0)break;r/=2,s=s.square()}return o},u.prototype.pow=o.prototype.pow,o.prototype.modPow=function(e,t){e=z(e),t=z(t);if(t.isZero())throw new Error("Cannot take modPow with modulus 0");var n=W[1],r=this.mod(t);if(r.isZero())return W[0];while(e.isPositive())e.isOdd()&&(n=n.multiply(r).mod(t)),e=e.divide(2),r=r.square().mod(t);return n},u.prototype.modPow=o.prototype.modPow,o.prototype.compareAbs=function(e){var t=z(e),n=this.value,r=t.value;return t.isSmall?1:A(n,r)},u.prototype.compareAbs=function(e){var t=z(e),n=Math.abs(this.value),r=t.value;return t.isSmall?(r=Math.abs(r),n===r?0:n>r?1:-1):-1},o.prototype.compare=function(e){var t=z(e),n=this.value,r=t.value;return this.sign!==t.sign?t.sign?1:-1:t.isSmall?this.sign?-1:1:A(n,r)*(this.sign?-1:1)},o.prototype.compareTo=o.prototype.compare,u.prototype.compare=function(e){var t=z(e),n=this.value,r=t.value;return t.isSmall?n==r?0:n>r?1:-1:n<0!==t.sign?n<0?-1:1:n<0?1:-1},u.prototype.compareTo=u.prototype.compare,o.prototype.equals=function(e){return this.compare(e)===0},u.prototype.eq=u.prototype.equals=o.prototype.eq=o.prototype.equals,o.prototype.notEquals=function(e){return this.compare(e)!==0},u.prototype.neq=u.prototype.notEquals=o.prototype.neq=o.prototype.notEquals,o.prototype.greater=function(e){return this.compare(e)>0},u.prototype.gt=u.prototype.greater=o.prototype.gt=o.prototype.greater,o.prototype.lesser=function(e){return this.compare(e)<0},u.prototype.lt=u.prototype.lesser=o.prototype.lt=o.prototype.lesser,o.prototype.greaterOrEquals=function(e){return this.compare(e)>=0},u.prototype.geq=u.prototype.greaterOrEquals=o.prototype.geq=o.prototype.greaterOrEquals,o.prototype.lesserOrEquals=function(e){return this.compare(e)<=0},u.prototype.leq=u.prototype.lesserOrEquals=o.prototype.leq=o.prototype.lesserOrEquals,o.prototype.isEven=function(){return(this.value[0]&1)===0},u.prototype.isEven=function(){return(this.value&1)===0},o.prototype.isOdd=function(){return(this.value[0]&1)===1},u.prototype.isOdd=function(){return(this.value&1)===1},o.prototype.isPositive=function(){return!this.sign},u.prototype.isPositive=function(){return this.value>0},o.prototype.isNegative=function(){return this.sign},u.prototype.isNegative=function(){return this.value<0},o.prototype.isUnit=function(){return!1},u.prototype.isUnit=function(){return Math.abs(this.value)===1},o.prototype.isZero=function(){return!1},u.prototype.isZero=function(){return this.value===0},o.prototype.isDivisibleBy=function(e){var t=z(e),n=t.value;return n===0?!1:n===1?!0:n===2?this.isEven():this.mod(t).equals(W[0])},u.prototype.isDivisibleBy=o.prototype.isDivisibleBy,o.prototype.isPrime=function(){var e=this.abs(),t=e.prev();if(e.isUnit())return!1;if(e.equals(2)||e.equals(3)||e.equals(5))return!0;if(e.isEven()||e.isDivisibleBy(3)||e.isDivisibleBy(5))return!1;if(e.lesser(25))return!0;var n=[2,3,5,7,11,13,17,19],r=t,i,s,o,u;while(r.isEven())r=r.divide(2);for(o=0;o<n.length;o++){u=bigInt(n[o]).modPow(r,e);if(u.equals(W[1])||u.equals(t))continue;for(s=!0,i=r;s&&i.lesser(t);i=i.multiply(2))u=u.square().mod(e),u.equals(t)&&(s=!1);if(s)return!1}return!0},u.prototype.isPrime=o.prototype.isPrime,o.prototype.next=function(){var e=this.value;return this.sign?b(e,1,this.sign):new o(m(e,1),this.sign)},u.prototype.next=function(){var e=this.value;return e+1<r?new u(e+1):new o(i,!1)},o.prototype.prev=function(){var e=this.value;return this.sign?new o(m(e,1),!0):b(e,1,this.sign)},u.prototype.prev=function(){var e=this.value;return e-1>-r?new u(e-1):new o(i,!0)};var O=[1];while(O[O.length-1]<=t)O.push(2*O[O.length-1]);var M=O.length,_=O[M-1];o.prototype.shiftLeft=function(e){if(!D(e))return e.isNegative()?this.shiftRight(e.abs()):this.times(W[2].pow(e));e=+e;if(e<0)return this.shiftRight(-e);var t=this;while(e>=M)t=t.multiply(_),e-=M-1;return t.multiply(O[e])},u.prototype.shiftLeft=o.prototype.shiftLeft,o.prototype.shiftRight=function(e){var t;if(!D(e))return e.isNegative()?this.shiftLeft(e.abs()):(t=this.divmod(W[2].pow(e)),t.remainder.isNegative()?t.quotient.prev():t.quotient);e=+e;if(e<0)return this.shiftLeft(-e);var n=this;while(e>=M){if(n.isZero())return n;t=L(n,_),n=t[1].isNegative()?t.quotient.prev():t[0],e-=M-1}return t=L(n,O[e]),t[1].isNegative()?t[0].prev():t[0]},u.prototype.shiftRight=o.prototype.shiftRight,o.prototype.not=function(){return this.negate().prev()},u.prototype.not=o.prototype.not,o.prototype.and=function(e){return P(this,e,function(e,t){return e&t})},u.prototype.and=o.prototype.and,o.prototype.or=function(e){return P(this,e,function(e,t){return e|t})},u.prototype.or=o.prototype.or,o.prototype.xor=function(e){return P(this,e,function(e,t){return e^t})},u.prototype.xor=o.prototype.xor;var q=function(e,t){var n=W[0],r=W[1],i=e.length;if(2<=t&&t<=36&&i<=s/Math.log(t))return new u(parseInt(e,t));t=z(t);var o=[],a,f=e[0]==="-";for(a=f?1:0;a<e.length;a++){var l=e[a].toLowerCase(),c=l.charCodeAt(0);if(48<=c&&c<=57)o.push(z(l));else if(97<=c&&c<=122)o.push(z(l.charCodeAt(0)-87));else{if(l!=="<")throw new Error(l+" is not a valid character");var h=a;do a++;while(e[a]!==">");o.push(z(e.slice(h+1,a)))}}o.reverse();for(a=0;a<o.length;a++)n=n.add(o[a].times(r)),r=r.times(t);return f?n.negate():n};o.prototype.toString=function(t){t===e&&(t=10);if(t!==10)return U(this,t);var n=this.value,r=n.length,i=String(n[--r]),s="0000000",o;while(--r>=0)o=String(n[r]),i+=s.slice(o.length)+o;var u=this.sign?"-":"";return u+i},u.prototype.toString=function(t){return t===e&&(t=10),t!=10?U(this,t):String(this.value)},o.prototype.valueOf=function(){return this.isSmall?this.value:+this.toString()},o.prototype.toJSNumber=o.prototype.valueOf;var W=function(e,t){return typeof e=="undefined"?W[0]:typeof t!="undefined"?+t===10?z(e):q(e,t):z(e)};for(var X=0;X<1e3;X++)W[X]=new u(X),X>0&&(W[-X]=new u(-X));return W.one=W[1],W.zero=W[0],W.minusOne=W[-1],W.max=H,W.min=B,W.gcd=j,W.lcm=F,W.isInstance=function(e){return e instanceof o||e instanceof u},W.randBetween=I,W}();typeof module!="undefined"&&(module.exports=bigInt);var bigRat=function(){"use strict";function e(e,t){if(t.isZero())throw"Denominator cannot be 0.";this.numerator=this.num=e,this.denominator=this.denom=t}function r(n,r){var i=t(n,r),s=n.over(i),o=r.over(i);return o.isNegative()?new e(s.negate(),o.negate()):new e(s,o)}function i(e,t){return o(e,t)}function s(t){var n=t.split(/e/i);if(n.length>2)throw new Error("Invalid input: too many 'e' tokens");if(n.length>1){var i=!0;n[1][0]==="-"&&(n[1]=n[1].slice(1),i=!1),n[1][0]==="+"&&(n[1]=n[1].slice(1));var o=s(n[0]),u=new e(bigInt(10).pow(n[1]),bigInt[1]);return i?o.times(u):o.over(u)}n=t.split(".");if(n.length>2)throw new Error("Invalid input: too many '.' tokens");if(n.length>1){var a=new e(bigInt(n[0]),bigInt[1]),f=n[1].length;while(n[1][0]==="0")n[1]=n[1].slice(1);var l="1"+Array(f+1).join("0"),c=r(bigInt(n[1]),bigInt(l));return a=a.add(c),n[0][0]==="-"&&(a=a.negate()),a}return new e(bigInt(t),bigInt[1])}function o(t,n){if(!t)return new e(bigInt(0),bigInt[1]);if(n)return r(bigInt(t),bigInt(n));if(bigInt.isInstance(t))return new e(t,bigInt[1]);if(t instanceof e)return t;var i,o,u=String(t),a=u.split("/");if(a.length>2)throw new Error("Invalid input: too many '/' tokens");if(a.length>1){var f=a[0].split("_");if(f.length>2)throw new Error("Invalid input: too many '_' tokens");if(f.length>1){var l=f[0][0]!=="-";return i=bigInt(f[0]).times(a[1]),l?i=i.add(f[1]):i=i.subtract(f[1]),o=bigInt(a[1]),r(i,o)}return r(bigInt(a[0]),bigInt(a[1]))}return s(u)}typeof require=="function"&&(bigInt=require("big-integer"));var t=bigInt.gcd,n=bigInt.lcm;return e.prototype.add=function(e,t){var s=i(e,t),o=n(this.denom,s.denom),u=o.divide(this.denom),a=o.divide(s.denom);return u=this.num.times(u),a=s.num.times(a),r(u.add(a),o)},e.prototype.plus=e.prototype.add,e.prototype.subtract=function(e,t){var n=i(e,t);return this.add(n.negate())},e.prototype.minus=e.prototype.subtract,e.prototype.multiply=function(e,t){var n=i(e,t);return r(this.num.times(n.num),this.denom.times(n.denom))},e.prototype.times=e.prototype.multiply,e.prototype.divide=function(e,t){var n=i(e,t);return r(this.num.times(n.denom),this.denom.times(n.num))},e.prototype.over=e.prototype.divide,e.prototype.reciprocate=function(){return new e(this.denom,this.num)},e.prototype.mod=function(e,t){var n=i(e,t);return this.minus(n.times(this.over(n).floor()))},e.prototype.floor=function(t){var n=this.num.divmod(this.denom),r;return n.remainder.isZero()||!n.quotient.sign?r=n.quotient:r=n.quotient.prev(),t?r:new e(r,bigInt[1])},e.prototype.ceil=function(t){var n=this.num.divmod(this.denom),r;return n.remainder.isZero()||n.quotient.sign?r=n.quotient:r=n.quotient.next(),t?r:new e(r,bigInt[1])},e.prototype.round=function(e){return this.add(1,2).floor(e)},e.prototype.compareAbs=function(e,t){var n=i(e,t);return this.denom.equals(n.denom)?this.num.compareAbs(n.num):this.num.times(n.denom).compareAbs(n.num.times(this.denom))},e.prototype.compare=function(e,t){var n=i(e,t);if(this.denom.equals(n.denom))return this.num.compare(n.num);var r=this.denom.sign===n.denom.sign?1:-1;return r*this.num.times(n.denom).compare(n.num.times(this.denom))},e.prototype.compareTo=e.prototype.compare,e.prototype.equals=function(e,t){return this.compare(e,t)===0},e.prototype.eq=e.prototype.equals,e.prototype.notEquals=function(e,t){return this.compare(e,t)!==0},e.prototype.neq=e.prototype.notEquals,e.prototype.lesser=function(e,t){return this.compare(e,t)<0},e.prototype.lt=e.prototype.lesser,e.prototype.lesserOrEquals=function(e,t){return this.compare(e,t)<=0},e.prototype.leq=e.prototype.lesserOrEquals,e.prototype.greater=function(e,t){return this.compare(e,t)>0},e.prototype.gt=e.prototype.greater,e.prototype.greaterOrEquals=function(e,t){return this.compare(e,t)>=0},e.prototype.geq=e.prototype.greaterOrEquals,e.prototype.abs=function(){return this.isPositive()?this:this.negate()},e.prototype.negate=function(){return this.denom.sign?new e(this.num,this.denom.negate()):new e(this.num.negate(),this.denom)},e.prototype.isNegative=function(){return this.num.sign!==this.denom.sign},e.prototype.isPositive=function(){return this.num.sign===this.denom.sign},e.prototype.isZero=function(){return this.num.isZero()},e.prototype.toDecimal=function(e){e=e||10;var t=this.num.divmod(this.denom),n=t.quotient.toString(),r=o(t.remainder.abs(),this.denom),i="";while(i.length<=e){var s;for(s=0;s<=10;s++)if(o(i+s,"1"+Array(i.length+2).join("0")).greater(r)){s--;break}i+=s}while(i.slice(-1)==="0")i=i.slice(0,-1);return i===""?n:n+"."+i},e.prototype.toString=function(){return String(this.num)+"/"+String(this.denom)},e.prototype.valueOf=function(){return this.num/this.denom},o.zero=o(0),o.one=o(1),o.minusOne=o(-1),o}();typeof module!="undefined"&&module.hasOwnProperty("exports")&&(module.exports=bigRat); |
@@ -0,180 +1,189 @@ | ||
;var bigRat = (function () { | ||
"use strict"; | ||
if (typeof require === "function") { | ||
bigInt = require("big-integer"); | ||
} | ||
function BigRational(num, denom) { | ||
// Alias properties kept for backwards compatability | ||
if (denom.isZero()) throw "Denominator cannot be 0."; | ||
this.numerator = this.num = num; | ||
this.denominator = this.denom = denom; | ||
} | ||
var bigRat = (function () { | ||
if (typeof require !== "undefined") { | ||
bigInt = require("big-integer"); | ||
} | ||
function gcd(a, b) { | ||
if(b.equals(0)) { | ||
return a; | ||
var gcd = bigInt.gcd, | ||
lcm = bigInt.lcm; | ||
function reduce(n, d) { | ||
var divisor = gcd(n, d), | ||
num = n.over(divisor), | ||
denom = d.over(divisor); | ||
if (denom.isNegative()) { | ||
return new BigRational(num.negate(), denom.negate()); | ||
} | ||
return gcd(b, a.mod(b)); | ||
return new BigRational(num, denom); | ||
} | ||
function lcm(a, b) { | ||
return a.times(b).divide(gcd(a, b)); | ||
} | ||
function create(numerator, denominator, preventReduce) { | ||
denominator = denominator || bigInt(1); | ||
preventReduce = preventReduce || false; | ||
var obj = { | ||
numerator: numerator, | ||
denominator: denominator, | ||
num: numerator, | ||
denom: denominator, | ||
reduce: function () { | ||
var divisor = gcd(obj.num, obj.denom); | ||
var num = obj.num.divide(divisor); | ||
var denom = obj.denom.divide(divisor); | ||
if(denom.lesser(0)) { | ||
num = num.times(-1); | ||
denom = denom.times(-1); | ||
} | ||
if(denom.equals(0)) { | ||
throw "Denominator cannot be 0."; | ||
} | ||
return create(num, denom, true); | ||
}, | ||
abs: function () { | ||
if (obj.isPositive()) return obj; | ||
return obj.negate(); | ||
}, | ||
multiply: function (n, d) { | ||
n = interpret(n, d); | ||
return create(obj.num.times(n.num), obj.denom.times(n.denom)); | ||
}, | ||
times: function (n, d) { | ||
return obj.multiply(n, d); | ||
}, | ||
divide: function (n, d) { | ||
n = interpret(n, d); | ||
return create(obj.num.times(n.denom), obj.denom.times(n.num)); | ||
}, | ||
over: function (n, d) { | ||
return obj.divide(n, d); | ||
}, | ||
mod: function (n, d) { | ||
var n = interpret(n, d); | ||
return obj.minus(n.times(obj.over(n).floor())); | ||
}, | ||
add: function (n, d) { | ||
n = interpret(n, d); | ||
var multiple = lcm(obj.denom, n.denom); | ||
var a = multiple.divide(obj.denom); | ||
var b = multiple.divide(n.denom); | ||
a = obj.num.times(a); | ||
b = n.num.times(b); | ||
return create(a.add(b), multiple); | ||
}, | ||
plus: function (n, d) { | ||
return obj.add(n, d); | ||
}, | ||
negate: function () { | ||
var num = bigInt.zero.minus(obj.num); | ||
return create(num, obj.denom); | ||
}, | ||
subtract: function (n, d) { | ||
n = interpret(n, d); | ||
return obj.add(n.negate()); | ||
}, | ||
minus: function (n, d) { | ||
return obj.subtract(n, d); | ||
}, | ||
isPositive: function () { | ||
return obj.num.isPositive(); | ||
}, | ||
isNegative: function () { | ||
return !obj.isPositive(); | ||
}, | ||
isZero: function () { | ||
return obj.equals(0, 1); | ||
}, | ||
compare: function (n, d) { | ||
n = interpret(n, d); | ||
if(obj.num.equals(n.num) && obj.denom.equals(n.denom)) { | ||
return 0; | ||
} | ||
var newDenom = obj.denom.times(n.denom); | ||
var comparison = newDenom.greater(0) ? 1 : -1; | ||
if(obj.num.times(n.denom).greater(n.num.times(obj.denom))) { | ||
return comparison; | ||
} else { | ||
return -comparison; | ||
} | ||
}, | ||
equals: function (n, d) { | ||
return obj.compare(n, d) === 0; | ||
}, | ||
notEquals: function (n, d) { | ||
return !obj.equals(n, d); | ||
}, | ||
lesser: function (n, d) { | ||
return obj.compare(n, d) < 0; | ||
}, | ||
lesserOrEquals: function (n, d) { | ||
return obj.compare(n, d) <= 0; | ||
}, | ||
greater: function (n, d) { | ||
return obj.compare(n, d) > 0; | ||
}, | ||
greaterOrEquals: function (n, d) { | ||
return obj.compare(n, d) >= 0; | ||
}, | ||
floor: function (toBigInt) { | ||
var floor = obj.num.over(obj.denom); | ||
if(toBigInt) { | ||
return floor; | ||
} | ||
return create(floor); | ||
}, | ||
ceil: function (toBigInt) { | ||
var div = obj.num.divmod(obj.denom); | ||
var ceil; | ||
BigRational.prototype.add = function (n, d) { | ||
var v = interpret(n, d), | ||
multiple = lcm(this.denom, v.denom), | ||
a = multiple.divide(this.denom), | ||
b = multiple.divide(v.denom); | ||
ceil = div.quotient; | ||
if(div.remainder.notEquals(0)) { | ||
ceil = ceil.add(1); | ||
a = this.num.times(a); | ||
b = v.num.times(b); | ||
return reduce(a.add(b), multiple); | ||
}; | ||
BigRational.prototype.plus = BigRational.prototype.add; | ||
BigRational.prototype.subtract = function (n, d) { | ||
var v = interpret(n, d); | ||
return this.add(v.negate()); | ||
}; | ||
BigRational.prototype.minus = BigRational.prototype.subtract; | ||
BigRational.prototype.multiply = function (n, d) { | ||
var v = interpret(n, d); | ||
return reduce(this.num.times(v.num), this.denom.times(v.denom)); | ||
}; | ||
BigRational.prototype.times = BigRational.prototype.multiply; | ||
BigRational.prototype.divide = function (n, d) { | ||
var v = interpret(n, d); | ||
return reduce(this.num.times(v.denom), this.denom.times(v.num)); | ||
}; | ||
BigRational.prototype.over = BigRational.prototype.divide; | ||
BigRational.prototype.reciprocate = function () { | ||
return new BigRational(this.denom, this.num); | ||
}; | ||
BigRational.prototype.mod = function (n, d) { | ||
var v = interpret(n, d); | ||
return this.minus(v.times(this.over(v).floor())); | ||
}; | ||
BigRational.prototype.floor = function (toBigInt) { | ||
var divmod = this.num.divmod(this.denom), | ||
floor; | ||
if (divmod.remainder.isZero() || !divmod.quotient.sign) { | ||
floor = divmod.quotient; | ||
} | ||
else floor = divmod.quotient.prev(); | ||
if (toBigInt) return floor; | ||
return new BigRational(floor, bigInt[1]); | ||
}; | ||
BigRational.prototype.ceil = function (toBigInt) { | ||
var divmod = this.num.divmod(this.denom), | ||
ceil; | ||
if (divmod.remainder.isZero() || divmod.quotient.sign) { | ||
ceil = divmod.quotient; | ||
} | ||
else ceil = divmod.quotient.next(); | ||
if (toBigInt) return ceil; | ||
return new BigRational(ceil, bigInt[1]); | ||
}; | ||
BigRational.prototype.round = function (toBigInt) { | ||
return this.add(1, 2).floor(toBigInt); | ||
}; | ||
BigRational.prototype.compareAbs = function (n, d) { | ||
var v = interpret(n, d); | ||
if (this.denom.equals(v.denom)) { | ||
return this.num.compareAbs(v.num); | ||
} | ||
return this.num.times(v.denom).compareAbs(v.num.times(this.denom)); | ||
}; | ||
BigRational.prototype.compare = function (n, d) { | ||
var v = interpret(n, d); | ||
if (this.denom.equals(v.denom)) { | ||
return this.num.compare(v.num); | ||
} | ||
var comparison = this.denom.sign === v.denom.sign ? 1 : -1; | ||
return comparison * this.num.times(v.denom).compare(v.num.times(this.denom)); | ||
}; | ||
BigRational.prototype.compareTo = BigRational.prototype.compare; | ||
BigRational.prototype.equals = function (n, d) { | ||
return this.compare(n, d) === 0; | ||
}; | ||
BigRational.prototype.eq = BigRational.prototype.equals; | ||
BigRational.prototype.notEquals = function (n, d) { | ||
return this.compare(n, d) !== 0; | ||
}; | ||
BigRational.prototype.neq = BigRational.prototype.notEquals; | ||
BigRational.prototype.lesser = function (n, d) { | ||
return this.compare(n, d) < 0; | ||
}; | ||
BigRational.prototype.lt = BigRational.prototype.lesser; | ||
BigRational.prototype.lesserOrEquals = function (n, d) { | ||
return this.compare(n, d) <= 0; | ||
}; | ||
BigRational.prototype.leq = BigRational.prototype.lesserOrEquals; | ||
BigRational.prototype.greater = function (n, d) { | ||
return this.compare(n, d) > 0; | ||
}; | ||
BigRational.prototype.gt = BigRational.prototype.greater; | ||
BigRational.prototype.greaterOrEquals = function (n, d) { | ||
return this.compare(n, d) >= 0; | ||
}; | ||
BigRational.prototype.geq = BigRational.prototype.greaterOrEquals; | ||
BigRational.prototype.abs = function () { | ||
if (this.isPositive()) return this; | ||
return this.negate(); | ||
}; | ||
BigRational.prototype.negate = function () { | ||
if (this.denom.sign) { | ||
return new BigRational(this.num, this.denom.negate()); | ||
} | ||
return new BigRational(this.num.negate(), this.denom); | ||
}; | ||
BigRational.prototype.isNegative = function () { | ||
return this.num.sign !== this.denom.sign; | ||
}; | ||
BigRational.prototype.isPositive = function () { | ||
return this.num.sign === this.denom.sign; | ||
}; | ||
BigRational.prototype.isZero = function () { | ||
return this.num.isZero(); | ||
}; | ||
BigRational.prototype.toDecimal = function (digits) { | ||
digits = digits || 10; | ||
var n = this.num.divmod(this.denom); | ||
var intPart = n.quotient.toString(); | ||
var remainder = parse(n.remainder.abs(), this.denom); | ||
var decPart = ""; | ||
while (decPart.length <= digits) { | ||
var i; | ||
for (i = 0; i <= 10; i++) { | ||
if (parse(decPart + i, "1" + Array(decPart.length + 2).join("0")).greater(remainder)) { | ||
i--; | ||
break; | ||
} | ||
if(toBigInt) { | ||
return ceil; | ||
} | ||
return create(ceil); | ||
}, | ||
round: function (toBigInt) { | ||
return obj.add(1, 2).floor(toBigInt); | ||
}, | ||
toString: function () { | ||
var o = obj.reduce(); | ||
return o.num.toString() + "/" + o.denom.toString(); | ||
}, | ||
valueOf: function() { | ||
return obj.num / obj.denom; | ||
}, | ||
toDecimal: function (digits) { | ||
digits = digits || 10; | ||
var n = obj.num.divmod(obj.denom); | ||
var intPart = n.quotient.toString(); | ||
var remainder = parse(n.remainder.abs(), obj.denom); | ||
var decPart = ""; | ||
while(decPart.length <= digits) { | ||
var i; | ||
for(i = 0; i <= 10; i++) { | ||
if(parse(decPart + i, "1" + Array(decPart.length + 2).join("0")).greater(remainder)) { | ||
i--; | ||
break; | ||
} | ||
} | ||
decPart += i; | ||
} | ||
while(decPart.slice(-1) === "0") { | ||
decPart = decPart.slice(0, -1); | ||
} | ||
if(decPart === "") { | ||
return intPart; | ||
} | ||
return intPart + "." + decPart; | ||
} | ||
}; | ||
return preventReduce ? obj : obj.reduce(); | ||
} | ||
decPart += i; | ||
} | ||
while (decPart.slice(-1) === "0") { | ||
decPart = decPart.slice(0, -1); | ||
} | ||
if (decPart === "") { | ||
return intPart; | ||
} | ||
return intPart + "." + decPart; | ||
}; | ||
BigRational.prototype.toString = function () { | ||
return String(this.num) + "/" + String(this.denom); | ||
}; | ||
BigRational.prototype.valueOf = function () { | ||
return this.num / this.denom; | ||
}; | ||
function interpret(n, d) { | ||
@@ -198,3 +207,3 @@ return parse(n, d); | ||
var significand = parseDecimal(parts[0]); | ||
var exponent = create(bigInt(10).pow(parts[1])); | ||
var exponent = new BigRational(bigInt(10).pow(parts[1]), bigInt[1]); | ||
if(isPositive) { | ||
@@ -211,3 +220,3 @@ return significand.times(exponent); | ||
if(parts.length > 1) { | ||
var intPart = create(bigInt(parts[0])); | ||
var intPart = new BigRational(bigInt(parts[0]), bigInt[1]); | ||
var length = parts[1].length; | ||
@@ -218,3 +227,3 @@ while(parts[1][0] === "0") { | ||
var exp = "1" + Array(length + 1).join("0"); | ||
var decPart = create(bigInt(parts[1]), bigInt(exp)); | ||
var decPart = reduce(bigInt(parts[1]), bigInt(exp)); | ||
intPart = intPart.add(decPart); | ||
@@ -224,21 +233,20 @@ if (parts[0][0] === '-') intPart = intPart.negate(); | ||
} | ||
return create(bigInt(n)); | ||
return new BigRational(bigInt(n), bigInt[1]); | ||
} | ||
function parse(a, b) { | ||
if(!a) { | ||
return create(bigInt(0)); | ||
return new BigRational(bigInt(0), bigInt[1]); | ||
} | ||
if(b) { | ||
return create(bigInt(a), bigInt(b)); | ||
return reduce(bigInt(a), bigInt(b)); | ||
} | ||
if(typeof a === "object") { | ||
if(a.instanceofBigInt) { | ||
return create(a); | ||
} | ||
return a; | ||
if (bigInt.isInstance(a)) { | ||
return new BigRational(a, bigInt[1]); | ||
} | ||
if (a instanceof BigRational) return a; | ||
var num; | ||
var denom; | ||
var text = a + ""; | ||
var text = String(a); | ||
var texts = text.split("/"); | ||
@@ -262,5 +270,5 @@ if(texts.length > 2) { | ||
denom = bigInt(texts[1]); | ||
return create(num, denom).reduce(); | ||
return reduce(num, denom); | ||
} | ||
return create(bigInt(texts[0]), bigInt(texts[1])); | ||
return reduce(bigInt(texts[0]), bigInt(texts[1])); | ||
} | ||
@@ -267,0 +275,0 @@ return parseDecimal(text); |
@@ -1,1 +0,1 @@ | ||
var bigRat=function(){function e(t,n){return n.equals(0)?t:e(n,t.mod(n))}function t(t,n){return t.times(n).divide(e(t,n))}function n(i,o,u){o=o||bigInt(1),u=u||!1;var a={numerator:i,denominator:o,num:i,denom:o,reduce:function(){var t=e(a.num,a.denom),r=a.num.divide(t),i=a.denom.divide(t);i.lesser(0)&&(r=r.times(-1),i=i.times(-1));if(i.equals(0))throw"Denominator cannot be 0.";return n(r,i,!0)},abs:function(){return a.isPositive()?a:a.negate()},multiply:function(e,t){return e=r(e,t),n(a.num.times(e.num),a.denom.times(e.denom))},times:function(e,t){return a.multiply(e,t)},divide:function(e,t){return e=r(e,t),n(a.num.times(e.denom),a.denom.times(e.num))},over:function(e,t){return a.divide(e,t)},mod:function(e,t){var e=r(e,t);return a.minus(e.times(a.over(e).floor()))},add:function(e,i){e=r(e,i);var s=t(a.denom,e.denom),o=s.divide(a.denom),u=s.divide(e.denom);return o=a.num.times(o),u=e.num.times(u),n(o.add(u),s)},plus:function(e,t){return a.add(e,t)},negate:function(){var e=bigInt.zero.minus(a.num);return n(e,a.denom)},subtract:function(e,t){return e=r(e,t),a.add(e.negate())},minus:function(e,t){return a.subtract(e,t)},isPositive:function(){return a.num.isPositive()},isNegative:function(){return!a.isPositive()},isZero:function(){return a.equals(0,1)},compare:function(e,t){e=r(e,t);if(a.num.equals(e.num)&&a.denom.equals(e.denom))return 0;var n=a.denom.times(e.denom),i=n.greater(0)?1:-1;return a.num.times(e.denom).greater(e.num.times(a.denom))?i:-i},equals:function(e,t){return a.compare(e,t)===0},notEquals:function(e,t){return!a.equals(e,t)},lesser:function(e,t){return a.compare(e,t)<0},lesserOrEquals:function(e,t){return a.compare(e,t)<=0},greater:function(e,t){return a.compare(e,t)>0},greaterOrEquals:function(e,t){return a.compare(e,t)>=0},floor:function(e){var t=a.num.over(a.denom);return e?t:n(t)},ceil:function(e){var t=a.num.divmod(a.denom),r;return r=t.quotient,t.remainder.notEquals(0)&&(r=r.add(1)),e?r:n(r)},round:function(e){return a.add(1,2).floor(e)},toString:function(){var e=a.reduce();return e.num.toString()+"/"+e.denom.toString()},valueOf:function(){return a.num/a.denom},toDecimal:function(e){e=e||10;var t=a.num.divmod(a.denom),n=t.quotient.toString(),r=s(t.remainder,a.denom),i="";while(i.length<=e){var o;for(o=0;o<=10;o++)if(s(i+o,"1"+Array(i.length+2).join("0")).greater(r)){o--;break}i+=o}while(i.slice(-1)==="0")i=i.slice(0,-1);return i===""?n:n+"."+i}};return u?a:a.reduce()}function r(e,t){return s(e,t)}function i(e){var t=e.split("e");if(t.length>2)throw new Error("Invalid input: too many 'e' tokens");if(t.length>1){var r=!0;t[1][0]==="-"&&(t[1]=t[1].slice(1),r=!1),t[1][0]==="+"&&(t[1]=t[1].slice(1));var s=i(t[0]),o=n(bigInt(10).pow(t[1]));return r?s.times(o):s.over(o)}t=e.split(".");if(t.length>2)throw new Error("Invalid input: too many '.' tokens");if(t.length>1){var u=n(bigInt(t[0])),a=t[1].length;while(t[1][0]==="0")t[1]=t[1].slice(1);var f="1"+Array(a+1).join("0"),l=n(bigInt(t[1]),bigInt(f));return u=u.add(l),t[0][0]==="-"&&(u=u.negate()),u}return n(bigInt(e))}function s(e,t){if(!e)return n(bigInt(0));if(t)return n(bigInt(e),bigInt(t));if(typeof e=="object")return e.instanceofBigInt?n(e):e;var r,s,o=e+"",u=o.split("/");if(u.length>2)throw new Error("Invalid input: too many '/' tokens");if(u.length>1){var a=u[0].split("_");if(a.length>2)throw new Error("Invalid input: too many '_' tokens");if(a.length>1){var f=a[0][0]!=="-";return r=bigInt(a[0]).times(u[1]),f?r=r.add(a[1]):r=r.subtract(a[1]),s=bigInt(u[1]),n(r,s).reduce()}return n(bigInt(u[0]),bigInt(u[1]))}return i(o)}return typeof require!="undefined"&&(bigInt=require("big-integer")),s.zero=s(0),s.one=s(1),s.minusOne=s(-1),s}();typeof module!="undefined"&&module.hasOwnProperty("exports")&&(module.exports=bigRat); | ||
var bigRat=function(){function e(e,t){if(t.isZero())throw"Denominator cannot be 0.";this.numerator=this.num=e,this.denominator=this.denom=t}function r(n,r){var i=t(n,r),s=n.over(i),o=r.over(i);return o.isNegative()?new e(s.negate(),o.negate()):new e(s,o)}function i(e,t){return o(e,t)}function s(t){var n=t.split(/e/i);if(n.length>2)throw new Error("Invalid input: too many 'e' tokens");if(n.length>1){var i=!0;n[1][0]==="-"&&(n[1]=n[1].slice(1),i=!1),n[1][0]==="+"&&(n[1]=n[1].slice(1));var o=s(n[0]),u=new e(bigInt(10).pow(n[1]),bigInt[1]);return i?o.times(u):o.over(u)}n=t.split(".");if(n.length>2)throw new Error("Invalid input: too many '.' tokens");if(n.length>1){var a=new e(bigInt(n[0]),bigInt[1]),f=n[1].length;while(n[1][0]==="0")n[1]=n[1].slice(1);var l="1"+Array(f+1).join("0"),c=r(bigInt(n[1]),bigInt(l));return a=a.add(c),n[0][0]==="-"&&(a=a.negate()),a}return new e(bigInt(t),bigInt[1])}function o(t,n){if(!t)return new e(bigInt(0),bigInt[1]);if(n)return r(bigInt(t),bigInt(n));if(bigInt.isInstance(t))return new e(t,bigInt[1]);if(t instanceof e)return t;var i,o,u=String(t),a=u.split("/");if(a.length>2)throw new Error("Invalid input: too many '/' tokens");if(a.length>1){var f=a[0].split("_");if(f.length>2)throw new Error("Invalid input: too many '_' tokens");if(f.length>1){var l=f[0][0]!=="-";return i=bigInt(f[0]).times(a[1]),l?i=i.add(f[1]):i=i.subtract(f[1]),o=bigInt(a[1]),r(i,o)}return r(bigInt(a[0]),bigInt(a[1]))}return s(u)}typeof require=="function"&&(bigInt=require("big-integer"));var t=bigInt.gcd,n=bigInt.lcm;return e.prototype.add=function(e,t){var s=i(e,t),o=n(this.denom,s.denom),u=o.divide(this.denom),a=o.divide(s.denom);return u=this.num.times(u),a=s.num.times(a),r(u.add(a),o)},e.prototype.plus=e.prototype.add,e.prototype.subtract=function(e,t){var n=i(e,t);return this.add(n.negate())},e.prototype.minus=e.prototype.subtract,e.prototype.multiply=function(e,t){var n=i(e,t);return r(this.num.times(n.num),this.denom.times(n.denom))},e.prototype.times=e.prototype.multiply,e.prototype.divide=function(e,t){var n=i(e,t);return r(this.num.times(n.denom),this.denom.times(n.num))},e.prototype.over=e.prototype.divide,e.prototype.reciprocate=function(){return new e(this.denom,this.num)},e.prototype.mod=function(e,t){var n=i(e,t);return this.minus(n.times(this.over(n).floor()))},e.prototype.floor=function(t){var n=this.num.divmod(this.denom),r;return n.remainder.isZero()||!n.quotient.sign?r=n.quotient:r=n.quotient.prev(),t?r:new e(r,bigInt[1])},e.prototype.ceil=function(t){var n=this.num.divmod(this.denom),r;return n.remainder.isZero()||n.quotient.sign?r=n.quotient:r=n.quotient.next(),t?r:new e(r,bigInt[1])},e.prototype.round=function(e){return this.add(1,2).floor(e)},e.prototype.compareAbs=function(e,t){var n=i(e,t);return this.denom.equals(n.denom)?this.num.compareAbs(n.num):this.num.times(n.denom).compareAbs(n.num.times(this.denom))},e.prototype.compare=function(e,t){var n=i(e,t);if(this.denom.equals(n.denom))return this.num.compare(n.num);var r=this.denom.sign===n.denom.sign?1:-1;return r*this.num.times(n.denom).compare(n.num.times(this.denom))},e.prototype.compareTo=e.prototype.compare,e.prototype.equals=function(e,t){return this.compare(e,t)===0},e.prototype.eq=e.prototype.equals,e.prototype.notEquals=function(e,t){return this.compare(e,t)!==0},e.prototype.neq=e.prototype.notEquals,e.prototype.lesser=function(e,t){return this.compare(e,t)<0},e.prototype.lt=e.prototype.lesser,e.prototype.lesserOrEquals=function(e,t){return this.compare(e,t)<=0},e.prototype.leq=e.prototype.lesserOrEquals,e.prototype.greater=function(e,t){return this.compare(e,t)>0},e.prototype.gt=e.prototype.greater,e.prototype.greaterOrEquals=function(e,t){return this.compare(e,t)>=0},e.prototype.geq=e.prototype.greaterOrEquals,e.prototype.abs=function(){return this.isPositive()?this:this.negate()},e.prototype.negate=function(){return this.denom.sign?new e(this.num,this.denom.negate()):new e(this.num.negate(),this.denom)},e.prototype.isNegative=function(){return this.num.sign!==this.denom.sign},e.prototype.isPositive=function(){return this.num.sign===this.denom.sign},e.prototype.isZero=function(){return this.num.isZero()},e.prototype.toDecimal=function(e){e=e||10;var t=this.num.divmod(this.denom),n=t.quotient.toString(),r=o(t.remainder.abs(),this.denom),i="";while(i.length<=e){var s;for(s=0;s<=10;s++)if(o(i+s,"1"+Array(i.length+2).join("0")).greater(r)){s--;break}i+=s}while(i.slice(-1)==="0")i=i.slice(0,-1);return i===""?n:n+"."+i},e.prototype.toString=function(){return String(this.num)+"/"+String(this.denom)},e.prototype.valueOf=function(){return this.num/this.denom},o.zero=o(0),o.one=o(1),o.minusOne=o(-1),o}();typeof module!="undefined"&&module.hasOwnProperty("exports")&&(module.exports=bigRat); |
{ | ||
"name": "big-rational", | ||
"version": "0.9.8", | ||
"version": "0.9.9", | ||
"author": "Peter Olson <peter.e.c.olson+npm@gmail.com>", | ||
@@ -26,3 +26,3 @@ "description": "An arbitrary length rational number library for Javascript", | ||
"dependencies" : { | ||
"big-integer" : "1.3.x" | ||
"big-integer" : "1.4.x" | ||
}, | ||
@@ -29,0 +29,0 @@ "license": "WTFPL", |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Mixed license
License(Experimental) Package contains multiple licenses.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
450883
28
9304
1
8
3
+ Addedbig-integer@1.4.12(transitive)
- Removedbig-integer@1.3.20(transitive)
Updatedbig-integer@1.4.x