diff --git a/README.md b/README.md index af35c1f..7d06a3a 100644 --- a/README.md +++ b/README.md @@ -40,8 +40,14 @@ - [subtract(minuend, subtrahend)](#subtractminuend-subtrahend) - [multiply(multiplicand, multiplier)](#multiplymultiplicand-multiplier) - [divide(dividend, divisor, precision)](#dividedividend-divisor-precision) + - [pow(base, exponent)](#powbase-exponent) + - [sqRoot(number)](#sqRootnumber) + - [cbRoot(number)](#cbRootnumber) - [modulus(dividend, divisor)](#modulusdividend-divisor) -- [Support the developers :heart: :star: :money_with_wings:](#support-the-developers-heart-star-money_with_wings) + - [exp(exponent)](#expexponent) + - [factorial(number)](#factorialnumber) + - [Roadmap (Planned Features)](#roadmap) + - [Support the developers :heart: :star: :money_with_wings:](#support-the-developers-heart-star-money_with_wings) @@ -144,7 +150,19 @@ Round also supports the following rounding modes (These are same as that of Java * `HALF_DOWN` - Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round down. * `HALF_EVEN` - Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, in which case, round towards the even neighbor. * `HALF_UP` - Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round up. -* `UNNECESSARY` (!Not Implemented!)- Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary. +* `UNNECESSARY` - Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary. If rounding is found to be necessary, an error is thrown. +
+ More about the behavior +
+ + > For example, `bigDecimal.round("123.78", 2, "UNNECESSARY")` will return `"123.78"` because the exact value is within the `precision` limit of `2` decimal places, while `bigDecimal.round("123.789", 2, "UNNECESSARY")` will throw an error beacuse it exceeds the limit and rounding is necessary. +
+
+ Same applies to negative `precision` values, such as `bigDecimal.round("17400", -2, "UNNECESSARY")` returning `"17400"`, and `bigDecimal.round("17480", -2, "UNNECESSARY")` or `bigDecimal.round("17400.0001", -2, "UNNECESSARY")` throwing an error. +
+ +
+
* `UP` - Rounding mode to round away from zero. Extensive description of the modes can be found at [Rounding Modes](https://docs.oracle.com/javase/8/docs/api/java/math/RoundingMode.html) @@ -278,6 +296,43 @@ var n2 = new bigDecimal('4'); var quotient = n1.divide(n2); // quotient = new bigDecimal('11.25') ``` +### pow(base, exponent) +Raise a base number to it's exponent. Either component can be a real number, positive or negative. Exponents, where `1 > exponent > 0`, will return the root of the base. +```javascript +var power = bigDecimal.pow('6', '3'); // power = '216' +``` + +Alternately, use the instance property. It returns the result as new `bigDecimal`. +```javascript +var base = new bigDecimal('6'); +var exponent = new bigDecimal('3'); +var power = base.divide(exponent); // power = new bigDecimal('216') +``` + +### sqRoot(number) +Get the square root of a given number. +```javascript +var sqrt = bigDecimal.sqRoot('81',); // sqrt = '9' +``` + +Alternately, use the instance property. It returns the result as new `bigDecimal`. +```javascript +var n = new bigDecimal('81'); +var cbrt = n.sqRoot(); // sqrt = new bigDecimal('9') +``` + +### cbRoot(number) +Get the cube root of a given number. +```javascript +var cbrt = bigDecimal.cbRoot('27',); // sqrt = '3' +``` + +Alternately, use the instance property. It returns the result as new `bigDecimal`. +```javascript +var n = new bigDecimal('27'); +var sqrt = n.cbRoot(); // sqrt = new bigDecimal('3') +``` + ### modulus(dividend, divisor) Get the modulus of two numbers, i.e., remainder when the dividend is divided by the divisor. Note that both divisor and dividend need to be integers. ```javascript @@ -289,7 +344,47 @@ var n1 = new bigDecimal('45'); var n2 = new bigDecimal('4'); var remainder = n1.modulus(n2); // remainder = new bigDecimal('1') ``` -Further, the result takes the sign of the dividend and the sign of the divisor is ignored. Note that this behaviour is the same as in Java and JavaScript. +Further, the result takes the sign of the dividend and the sign of the divisor is ignored. Note that this behaviour is the same as in Java and JavaScript. For Euclidian Division seen in C++ and Python, use `bigDecimal.modulusE()`. + +### exp(exponent) +Get the exponentiation of E, where E is Euler's constant calculated to 32 decimal places of percision. Returns the power of E raised to the given exponent. +```javascript +var exp = bigDecimal.exp('5'); // exp = '54.5981500331...' +``` +Alternately, to get Euler's constant calculated to 32 decimal places of percision, use the static property `bigDecimal.E`. +```javascript +var e = bigDecimal.E; // e = '2.71828182845904523536028747135266' +``` + +### factorial(number) +Get the factorial(n! notation) of a given number. Note, the number can only be a positive integer. +```javascript +var factorial = bigDecimal.factorial('5'); // factorial = '120' +``` + +# Roadmap (Planned Features) + +In discovery phase: + +- Locale aware pretty value + +The features listed below are being considered as possible additions in future revisions. + +- PI constant +- Hypotenuse +- Sign (returns the sign of a number) + +The following are less likely to be implemented, but are still being considered. + +- NthRoot +- Sin and Inverse Sin +- Cosin and Inverse Cosin +- Tan, Inverse Tan, and Tan2 +- Log(base 10) +- Log(base 2) +- Natural Log(base E) +- Sigma (Read more: [Summation](https://en.wikipedia.org/wiki/Summation)) + # Support the developers :heart: :star: :money_with_wings: If this library helps you in your organization, you can show some love by giving the repo a star or support by making a nominal monetary contribution. diff --git a/dist/esm/big-decimal.d.ts b/dist/esm/big-decimal.d.ts index 7ea832f..67d15be 100644 --- a/dist/esm/big-decimal.d.ts +++ b/dist/esm/big-decimal.d.ts @@ -26,11 +26,56 @@ declare class bigDecimal { divide(number: bigDecimal, precision?: number): bigDecimal; static modulus(number1: any, number2: any): string; modulus(number: bigDecimal): bigDecimal; - static compareTo(number1: any, number2: any): 0 | 1 | -1; - compareTo(number: bigDecimal): 0 | 1 | -1; + static modulusE(number1: any, number2: any): string; + modulusE(number: bigDecimal): bigDecimal; static negate(number: any): string; negate(): bigDecimal; - static stripTrailingZero(number: any): any; + static pow(base: number | string, exponent: number | string): string; + pow(exponent: bigDecimal): bigDecimal; + static get SQRT1_2(): string; + static get SQRT2(): string; + static sqRoot(number: number | string): string; + sqRoot(): bigDecimal; + static cbRoot(number: number | string): string; + cbRoot(): bigDecimal; + static get E(): string; + static get LN2(): string; + static get LN10(): string; + static get LOG2E(): string; + static get LOG10E(): string; + static log2(number: number | string): string; + static log10(number: number | string): string; + static log1p(number: number | string): string; + static log(number: number | string): string; + static exp(number: number | string): string; + static expm1(number: number | string): string; + static hypot(a: number | string, b: number | string): string; + static sin(number: number | string): string; + static sinh(number: number | string): string; + static asin(number: number | string): string; + static cos(number: number | string): string; + static cosh(number: number | string): string; + static acos(number: number | string): string; + static tan(number: number | string): string; + static tanh(number: number | string): string; + static atan(number: number | string): string; + static atan2(y: number | string, x: number | string): string; + static compareTo(number1: number | string, number2: number | string): 0 | 1 | -1; + compareTo(number: bigDecimal): 0 | 1 | -1; + static equals(number1: number | string, number2: number | string): boolean; + equals(number: bigDecimal): boolean; + static lt(number1: number | string, number2: number | string): boolean; + lt(number: bigDecimal): boolean; + static leq(number1: number | string, number2: number | string): boolean; + leq(number: bigDecimal): boolean; + static gt(number1: number | string, number2: number | string): boolean; + gt(number: bigDecimal): boolean; + static geq(number1: number | string, number2: number | string): boolean; + geq(number: bigDecimal): boolean; + static sign(number: number | string): 0 | 1 | -1; + sign(): 0 | 1 | -1; + static factorial(number: number | string): string; + static stripTrailingZero(number: any): string; stripTrailingZero(): bigDecimal; } export default bigDecimal; diff --git a/dist/esm/big-decimal.js b/dist/esm/big-decimal.js index 149bdf2..2e1a2af 100644 --- a/dist/esm/big-decimal.js +++ b/dist/esm/big-decimal.js @@ -1,8 +1,6 @@ //function add { -function add(number1, number2) { - var _a; - if (number2 === void 0) { number2 = "0"; } - var neg = 0, ind = -1; +function add(number1, number2 = "0") { + let neg = 0, ind = -1; //check for negatives if (number1[0] == "-") { number1 = number1.substring(1); @@ -22,14 +20,14 @@ function add(number1, number2) { } number1 = trim(number1); number2 = trim(number2); - _a = pad(trim(number1), trim(number2)), number1 = _a[0], number2 = _a[1]; + [number1, number2] = pad(trim(number1), trim(number2)); if (neg == 1) { if (ind === 1) number1 = compliment(number1); else if (ind === 2) number2 = compliment(number2); } - var res = addCore(number1, number2); + let res = addCore(number1, number2); if (!neg) return trim(res); else if (neg == 2) @@ -45,18 +43,18 @@ function compliment(number) { if (testZero(number)) { return number; } - var s = "", l = number.length, dec = number.split(".")[1], ld = dec ? dec.length : 0; - for (var i = 0; i < l; i++) { + let s = "", l = number.length, dec = number.split(".")[1], ld = dec ? dec.length : 0; + for (let i = 0; i < l; i++) { if (number[i] >= "0" && number[i] <= "9") s += 9 - parseInt(number[i]); else s += number[i]; } - var one = ld > 0 ? "0." + new Array(ld).join("0") + "1" : "1"; + let one = ld > 0 ? "0." + new Array(ld).join("0") + "1" : "1"; return addCore(s, one); } function trim(number) { - var parts = number.split("."); + let parts = number.split("."); if (!parts[0]) parts[0] = "0"; while (parts[0][0] == "0" && parts[0].length > 1) @@ -64,48 +62,30 @@ function trim(number) { return parts[0] + (parts[1] ? "." + parts[1] : ""); } function pad(number1, number2) { - var parts1 = number1.split("."), parts2 = number2.split("."); + let parts1 = number1.split("."), parts2 = number2.split("."); //pad integral part - var length1 = parts1[0].length, length2 = parts2[0].length; - if (length1 > length2) { - parts2[0] = - new Array(Math.abs(length1 - length2) + 1).join("0") + - (parts2[0] ? parts2[0] : ""); - } - else { - parts1[0] = - new Array(Math.abs(length1 - length2) + 1).join("0") + - (parts1[0] ? parts1[0] : ""); - } + let length = Math.max(parts1[0].length, parts2[0].length); + parts1[0] = parts1[0].padStart(length, "0"); + parts2[0] = parts2[0].padStart(length, "0"); //pad fractional part - (length1 = parts1[1] ? parts1[1].length : 0), - (length2 = parts2[1] ? parts2[1].length : 0); - if (length1 || length2) { - if (length1 > length2) { - parts2[1] = - (parts2[1] ? parts2[1] : "") + - new Array(Math.abs(length1 - length2) + 1).join("0"); - } - else { - parts1[1] = - (parts1[1] ? parts1[1] : "") + - new Array(Math.abs(length1 - length2) + 1).join("0"); - } - } + parts1[1] = parts1[1] || ""; + parts2[1] = parts2[1] || ""; + length = Math.max(parts1[1].length, parts2[1].length); + parts1[1] = parts1[1].padEnd(length, "0"); + parts2[1] = parts2[1].padEnd(length, "0"); number1 = parts1[0] + (parts1[1] ? "." + parts1[1] : ""); number2 = parts2[0] + (parts2[1] ? "." + parts2[1] : ""); return [number1, number2]; } function addCore(number1, number2) { - var _a; - _a = pad(number1, number2), number1 = _a[0], number2 = _a[1]; - var sum = "", carry = 0; - for (var i = number1.length - 1; i >= 0; i--) { + [number1, number2] = pad(number1, number2); + let sum = "", carry = 0; + for (let i = number1.length - 1; i >= 0; i--) { if (number1[i] === ".") { sum = "." + sum; continue; } - var temp = parseInt(number1[i]) + parseInt(number2[i]) + carry; + let temp = parseInt(number1[i]) + parseInt(number2[i]) + carry; sum = (temp % 10) + sum; carry = Math.floor(temp / 10); } @@ -163,34 +143,84 @@ var RoundingModes; RoundingModes[RoundingModes["UP"] = 7] = "UP"; })(RoundingModes || (RoundingModes = {})); +/* +* Removes zero from front and back*/ +function stripTrailingZero(number) { + const isNegative = number[0] === '-'; + if (isNegative) { + number = number.substring(1); + } + while (number[0] == '0') { + number = number.substring(1); + } + if (number.indexOf('.') != -1) { + while (number[number.length - 1] == '0') { + number = number.substring(0, number.length - 1); + } + } + if (number == "" || number == ".") { + number = '0'; + } + else if (number[number.length - 1] == '.') { + number = number.substring(0, number.length - 1); + } + if (number[0] == '.') { + number = '0' + number; + } + if (isNegative && number != '0') { + number = '-' + number; + } + return number; +} + /** * * @param input the number to round * @param n precision * @param mode Rounding Mode */ -function roundOff(input, n, mode) { - if (n === void 0) { n = 0; } - if (mode === void 0) { mode = RoundingModes.HALF_EVEN; } - if (mode === RoundingModes.UNNECESSARY) { - throw new Error("UNNECESSARY Rounding Mode has not yet been implemented"); - } +function roundOff(input, n = 0, mode = RoundingModes.HALF_EVEN) { if (typeof (input) == 'number' || typeof (input) == 'bigint') input = input.toString(); - var neg = false; + if (mode === RoundingModes.UNNECESSARY) { + let [integers, mantissa] = stripTrailingZero(input.replace('-', '')).split('.'); + if (n > 0 && mantissa) { + if (mantissa.length <= n) { + return input; + } + if (/[^0]/.test(mantissa.slice(n))) { + throw new Error('Number is not an exact value. Rounding necessary.'); + } + return input; + } + else if (n < 0 && mantissa) { + throw new Error('Number is not an exact value. Rounding necessary.'); + } + else if (n < 0) { + if (integers.length <= Math.abs(n) || /[^0]/.test(integers.slice(n))) { + throw new Error('Number is not an exact value. Rounding necessary.'); + } + return input; + } + else if (n == 0 && mantissa) { + throw new Error('Number is not an exact value. Rounding necessary.'); + } + return input; + } + let neg = false; if (input[0] === '-') { neg = true; input = input.substring(1); } - var parts = input.split('.'), partInt = parts[0], partDec = parts[1]; + let parts = input.split('.'), partInt = parts[0], partDec = parts[1]; //handle case of -ve n: roundOff(12564,-2)=12600 if (n < 0) { n = -n; if (partInt.length <= n) return '0'; else { - var prefix = partInt.substr(0, partInt.length - n); - input = prefix + '.' + partInt.substr(partInt.length - n) + partDec; + let prefix = partInt.substring(0, partInt.length - n); + input = prefix + '.' + partInt.substring(partInt.length - n) + partDec; prefix = roundOff(input, 0, mode); return (neg ? '-' : '') + prefix + (new Array(n + 1).join('0')); } @@ -211,7 +241,7 @@ function roundOff(input, n, mode) { return (neg ? '-' : '') + partInt + '.' + parts[1] + (new Array(n - parts[1].length + 1).join('0')); } partDec = parts[1].substring(0, n); - var rem = parts[1].substring(n); + let rem = parts[1].substring(n); if (rem && greaterThanFive(rem, partDec, neg, mode)) { partDec = increment(partDec); if (partDec.length > n) { @@ -232,7 +262,7 @@ function greaterThanFive(part, pre, neg, mode) { return true; // #endregion // case when part !== five - var five = '5' + (new Array(part.length).join('0')); + let five = '5' + (new Array(part.length).join('0')); if (part > five) return true; else if (part < five) @@ -245,15 +275,14 @@ function greaterThanFive(part, pre, neg, mode) { default: return (parseInt(pre[pre.length - 1]) % 2 == 1); } } -function increment(part, c) { - if (c === void 0) { c = 0; } +function increment(part, c = 0) { if (!c) c = 1; if (typeof (part) == 'number') part.toString(); - var l = part.length - 1, s = ''; - for (var i = l; i >= 0; i--) { - var x = parseInt(part[i]) + c; + let l = part.length - 1, s = ''; + for (let i = l; i >= 0; i--) { + let x = parseInt(part[i]) + c; if (x == 10) { c = 1; x = 0; @@ -268,41 +297,11 @@ function increment(part, c) { return s.split('').reverse().join(''); } -/* -* Removes zero from front and back*/ -function stripTrailingZero(number) { - var isNegative = number[0] === '-'; - if (isNegative) { - number = number.substr(1); - } - while (number[0] == '0') { - number = number.substr(1); - } - if (number.indexOf('.') != -1) { - while (number[number.length - 1] == '0') { - number = number.substr(0, number.length - 1); - } - } - if (number == "" || number == ".") { - number = '0'; - } - else if (number[number.length - 1] == '.') { - number = number.substr(0, number.length - 1); - } - if (number[0] == '.') { - number = '0' + number; - } - if (isNegative && number != '0') { - number = '-' + number; - } - return number; -} - function multiply(number1, number2) { number1 = number1.toString(); number2 = number2.toString(); /*Filter numbers*/ - var negative = 0; + let negative = 0; if (number1[0] == '-') { negative++; number1 = number1.substr(1); @@ -313,19 +312,19 @@ function multiply(number1, number2) { } number1 = stripTrailingZero(number1); number2 = stripTrailingZero(number2); - var decimalLength1 = 0; - var decimalLength2 = 0; + let decimalLength1 = 0; + let decimalLength2 = 0; if (number1.indexOf('.') != -1) { decimalLength1 = number1.length - number1.indexOf('.') - 1; } if (number2.indexOf('.') != -1) { decimalLength2 = number2.length - number2.indexOf('.') - 1; } - var decimalLength = decimalLength1 + decimalLength2; + let decimalLength = decimalLength1 + decimalLength2; number1 = stripTrailingZero(number1.replace('.', '')); number2 = stripTrailingZero(number2.replace('.', '')); if (number1.length < number2.length) { - var temp = number1; + let temp = number1; number1 = number2; number2 = temp; } @@ -335,17 +334,17 @@ function multiply(number1, number2) { /* * Core multiplication */ - var length = number2.length; - var carry = 0; - var positionVector = []; - var currentPosition = length - 1; - var result = ""; - for (var i = 0; i < length; i++) { + let length = number2.length; + let carry = 0; + let positionVector = []; + let currentPosition = length - 1; + let result = ""; + for (let i = 0; i < length; i++) { positionVector[i] = number1.length - 1; } - for (var i = 0; i < 2 * number1.length; i++) { - var sum = 0; - for (var j = number2.length - 1; j >= currentPosition && j >= 0; j--) { + for (let i = 0; i < 2 * number1.length; i++) { + let sum = 0; + for (let j = number2.length - 1; j >= currentPosition && j >= 0; j--) { if (positionVector[j] > -1 && positionVector[j] < number1.length) { sum += parseInt(number1[positionVector[j]--]) * parseInt(number2[j]); } @@ -377,18 +376,23 @@ function adjustDecimal(number, decimal) { } function divide(dividend, divisor, precission) { - if (precission === void 0) { precission = 8; } - if (divisor == 0) { - throw new Error('Cannot divide by 0'); + // Convert to string + if (typeof dividend == 'number' || typeof divisor == 'number') { + dividend = dividend.toString(); + divisor = divisor.toString(); + } + // Return 0 + if (divisor == '0') { + return '0' + (!precission) ? '' : '.' + new Array(precission).join('0'); + } + // Set default precission + if (typeof precission == 'undefined') { + precission = 8; } - dividend = dividend.toString(); - divisor = divisor.toString(); // remove trailing zeros in decimal ISSUE#18 dividend = dividend.replace(/(\.\d*?[1-9])0+$/g, "$1").replace(/\.0+$/, ""); divisor = divisor.replace(/(\.\d*?[1-9])0+$/g, "$1").replace(/\.0+$/, ""); - if (dividend == 0) - return '0'; - var neg = 0; + let neg = 0; if (divisor[0] == '-') { divisor = divisor.substring(1); neg++; @@ -400,7 +404,7 @@ function divide(dividend, divisor, precission) { var pt_dvsr = divisor.indexOf('.') > 0 ? divisor.length - divisor.indexOf('.') - 1 : -1; divisor = trim(divisor.replace('.', '')); if (pt_dvsr >= 0) { - var pt_dvnd = dividend.indexOf('.') > 0 ? dividend.length - dividend.indexOf('.') - 1 : -1; + let pt_dvnd = dividend.indexOf('.') > 0 ? dividend.length - dividend.indexOf('.') - 1 : -1; if (pt_dvnd == -1) { dividend = trim(dividend + (new Array(pt_dvsr + 1)).join('0')); } @@ -411,7 +415,7 @@ function divide(dividend, divisor, precission) { } else if (pt_dvsr < pt_dvnd) { dividend = dividend.replace('.', ''); - var loc = dividend.length - pt_dvnd + pt_dvsr; + let loc = dividend.length - pt_dvnd + pt_dvsr; dividend = trim(dividend.substring(0, loc) + '.' + dividend.substring(loc)); } else if (pt_dvsr == pt_dvnd) { @@ -419,11 +423,11 @@ function divide(dividend, divisor, precission) { } } } - var prec = 0, dl = divisor.length, quotent = ''; - var dvnd = (dividend.indexOf('.') > -1 && dividend.indexOf('.') < dl) ? dividend.substring(0, dl + 1) : dividend.substring(0, dl); + let prec = 0, dl = divisor.length, quotent = ''; + let dvnd = (dividend.indexOf('.') > -1 && dividend.indexOf('.') < dl) ? dividend.substring(0, dl + 1) : dividend.substring(0, dl); dividend = (dividend.indexOf('.') > -1 && dividend.indexOf('.') < dl) ? dividend.substring(dl + 1) : dividend.substring(dl); if (dvnd.indexOf('.') > -1) { - var shift = dvnd.length - dvnd.indexOf('.') - 1; + let shift = dvnd.length - dvnd.indexOf('.') - 1; dvnd = dvnd.replace('.', ''); if (dl > dvnd.length) { shift += dl - dvnd.length; @@ -434,7 +438,7 @@ function divide(dividend, divisor, precission) { } precission = precission + 2; while (prec <= precission) { - var qt = 0; + let qt = 0; while (parseInt(dvnd) >= parseInt(divisor)) { dvnd = add(dvnd, '-' + divisor); qt++; @@ -475,83 +479,1006 @@ function negate(number) { return number; } -function modulus(dividend, divisor) { +function modulusE(n, base = 1, precision = undefined) { + if (base == 0) { + throw new Error('Cannot divide by 0'); + } + n = n.toString(); + base = base.toString(); + validate$1(base); + return subtract(n, multiply(base, roundOff(divide(n, base, precision), 0, RoundingModes.FLOOR))); +} +function modulus(dividend, divisor = 1, precision = undefined) { if (divisor == 0) { throw new Error('Cannot divide by 0'); } dividend = dividend.toString(); divisor = divisor.toString(); - validate(dividend); - validate(divisor); - var sign = ''; - if (dividend[0] == '-') { - sign = '-'; - dividend = dividend.substr(1); - } - if (divisor[0] == '-') { - divisor = divisor.substr(1); - } - var result = subtract(dividend, multiply(divisor, roundOff(divide(dividend, divisor), 0, RoundingModes.FLOOR))); - return sign + result; + validate$1(divisor); + const result = modulusE(abs(dividend), abs(divisor), precision); + return (dividend.includes('-')) ? negate(result) : result; } -function validate(oparand) { - if (oparand.indexOf('.') != -1) { +function validate$1(oparand) { + if (oparand.includes('.')) { throw new Error('Modulus of non-integers not supported'); } } function compareTo(number1, number2) { - var _a, _b; - var negative = false; - _a = [number1, number2].map(function (n) { return stripTrailingZero(n); }), number1 = _a[0], number2 = _a[1]; - if (number1[0] == '-' && number2[0] != "-") { + let negative = false; + [number1, number2] = [number1, number2].map(n => stripTrailingZero(n)); + // Early escapes + // If num 1 is negative and num 2 is positive + if (number1[0] == '-' && number2[0] != "-") return -1; - } - else if (number1[0] != '-' && number2[0] == '-') { + // If num 2 is negative and num 1 is positive + if (number1[0] != '-' && number2[0] == '-') return 1; - } - else if (number1[0] == '-' && number2[0] == '-') { - number1 = number1.substr(1); - number2 = number2.substr(1); + if (number1[0] == '-' && number2[0] == '-') { + number1 = number1.substring(1); + number2 = number2.substring(1); negative = true; } - _b = pad(number1, number2), number1 = _b[0], number2 = _b[1]; - if (number1.localeCompare(number2) == 0) { - return 0; + let decimal1 = number1.indexOf('.'); + let decimal2 = number2.indexOf('.'); + // If both numbers dont have decimals, compare lengths + if (decimal1 == -1 && decimal1 == decimal2) { + if (number1.length > number2.length) + return (negative) ? -1 : 1; + if (number1.length < number2.length) + return (negative) ? 1 : -1; + } + // If num 1 has no decimal, and num 2 has, then compare integer length to the decimal index of num 2 + if (decimal1 == -1 && decimal2 !== -1) { + if (number1.length < decimal2) + return (negative) ? 1 : -1; + if (number1.length > decimal2) + return (negative) ? -1 : 1; } - for (var i = 0; i < number1.length; i++) { + // If num 1 has a decimal, and num 2 has none, then compare integer length to the decimal index of num 1 + if (decimal1 !== -1 && decimal2 == -1) { + if (number2.length < decimal1) + return (negative) ? 1 : -1; + if (number2.length > decimal1) + return (negative) ? -1 : 1; + } + [number1, number2] = pad(number1, number2); + // If equal + if (number1.localeCompare(number2) == 0) + return 0; + for (let i = 0; i < number1.length; i++) { if (number1[i] == number2[i]) { continue; } else if (number1[i] > number2[i]) { - if (negative) { - return -1; + return (negative) ? -1 : 1; + } + else { + return (negative) ? 1 : -1; + } + } + return 0; +} +// Wrapper functions +function lessThan(left, right, orEquals = false) { + return (orEquals) ? (compareTo(left, right) === 0 || compareTo(left, right) === -1) : (compareTo(left, right) === -1); +} +function greaterThan(left, right, orEquals = false) { + return (orEquals) ? (compareTo(left, right) === 0 || compareTo(left, right) === 1) : (compareTo(left, right) === 1); +} +function equals(left, right) { + return (compareTo(stripTrailingZero(left), stripTrailingZero(right)) === 0); +} +function isExatclyZero(number) { + return equals(stripTrailingZero(abs(number)), '0'); +} +function isExatclyOne(number) { + return equals(stripTrailingZero(abs(number)), '1'); +} +function isOdd(number) { + return /[13579]{1}$/.test(number.split('.')[0]); +} + +const factorial = (n) => { + n = n.toString(); + validateInteger(n); + validatePositive(n); + if (isExatclyZero(n) || isExatclyOne(n)) { + return '1'; + } + let result = n; + while (true) { + if (isExatclyOne(n)) { + return result; + } + let next = subtract(n, '1'); + result = multiply(result, next); + n = next; + } +}; +function tolerance(precision) { + precision = precision.toString(); + validateInteger(precision); + if (precision == '0') + return '0'; + if (precision.startsWith('-')) + return `1${new Array(Number(-precision)).join('0')}`; + return `0.${new Array(Number(precision) - 1).join('0')}1`; +} +function isAproxZero(number, precision = 8) { + precision = Math.max(1, precision); + number = abs(number.toString()); + if (isExatclyZero(number)) + return true; + if (lessThan(number, tolerance(precision), true)) + return true; + return false; +} +function isAproxOne(number, precision = 8) { + precision = Math.max(1, precision); + number = abs(number.toString()); + if (isExatclyOne(number)) + return true; + if (lessThan(abs(subtract('1', number)), tolerance(precision), true)) + return true; + return false; +} +function sign(number) { + number = number.toString(); + if (isExatclyZero(number)) + return 0; + if (number.includes('-')) + return -1; + return 1; +} +function validateInteger(number) { + if (number.includes('.')) { + throw new Error('Non-integers not supported'); + } +} +function validatePositive(number) { + if (number.includes('-')) { + throw new Error('Negatives not supported'); + } +} + +// import { AddInstantiate } from "./assembly/math"; +/** + * Calculates the power of a given base raised to an integer exponent + * + * @param base - Base number + * @param exponent - Exponent integer + * @param negate - If set to true, parameters will be evaluated as `-(x ^ n)` + * + * @returns The resulting power as a string + * + * + * @example Basic usage: + * ``` + * // Positive Base + * console.log(pow(2,2)) // Prints '4' + * // Negative Base + * console.log(pow(-2,2)) // Prints '4' + * // Negative Base where the result will be a negative number + * console.log(pow(-2,3)) // Prints '-8' + * ``` + * + * @example Negation usage: + * ``` + * // Positive Base + * console.log(pow(2, 2, true)) // Prints '-4' + * // Negative Base + * console.log(pow(-2, 2, true)) // Prints '-4' + * // Negative Base where the result will be a negative number + * console.log(pow(-2, 3, true)) // Prints '8' + * ``` + * + * @example Special cases: + * ``` + * // Exponent of 0 + * console.log(pow(2, 0)) // Prints '1' + * // Exponent of 1 + * console.log(pow(2, 1)) // Prints '2' + * ``` + */ +function pow(base, exponent, precision = undefined, negate$1 = false) { + // AddInstantiate.then((res)=>{ + // console.log('custom wasm loader',res.__add('00001', '1')) + // }) + // const v = await (async url => await AddInstantiate)(); + // console.log('custom wasm loader', AddWebAssembly('1', '1')) + exponent = exponent.toString(); + base = base.toString(); + if (isExatclyZero(exponent)) { + return '1'; + } + if (!exponent.includes('-') && isExatclyOne(exponent)) { + return base; + } + if (isExatclyZero(base) && exponent.includes('-') && isExatclyOne(exponent)) { + throw Error('0^(-1) is undefined'); + } + const finalize = (result) => { + result = (negativeExponent) ? divide(1, result, precision + 1) : result; + result = (precision) ? roundOff(result, precision) : result; + return (negate$1) ? stripTrailingZero(negate(result)) : stripTrailingZero(result); + }; + const negativeBase = base.includes('-'); + const negativeExponent = exponent.includes('-'); + const exponentParts = exponent.split('.'); + const exponentSignificand = exponentParts[1]; + const isBase10 = equals(abs(base), '10'); + if (isBase10) { + base = abs(base); + negate$1 = !negate$1; + } + let fractionalExponent = '1'; + let result; + if (equals(abs(base), '10')) { + result = (negativeExponent) ? `0.${new Array(Number(abs(exponentParts[0])) - 1).join('0')}1` : `1${new Array(exponentParts[0]).join('0')}`; + } + else { + result = intPow(abs(base), abs(exponentParts[0])); + } + if (exponentSignificand) { + if (negativeBase) { + negate$1 = !negate$1; + } + precision = Math.max(precision, 32); + // const testworker = new Worker(new URL("./workers/pow.worker.js", import.meta.url)); + // testworker.postMessage({ base: abs(base), significand: exponentSignificand }); + // testworker.onmessage = (event) => { + // console.log('webresult', result) + // // console.log('web', multiply(result, event.data)) + // // testworker.terminate(); + // // fractionalExponent = event.data + // return finalize(multiply(result, event.data)) + // // testworker.terminate(); + // } + let tempBase = root10(abs(base)); + for (let i = 0; i < exponentSignificand.length; i++) { + fractionalExponent = multiply(fractionalExponent, pow(tempBase, exponentSignificand[i])); + tempBase = root10(tempBase); + } + return finalize(multiply(result, fractionalExponent)); + } + else { + return finalize(result); + } + // let exponentIntegers = abs(exponentParts[0]); + // if (equals(abs(base), '10')) { + // result = (negativeExponent) ? `0.${new Array(Number(exponentIntegers) - 1).join('0')}1` : `1${new Array(exponentIntegers).join('0')}` + // return multiply(multiply(result, fractionalExponent), pow(sign(base), exponentIntegers)) + // } + // while (greaterThan(exponentIntegers, '0')) { + // if (isOdd(exponentIntegers)) { result = multiply(result, base) } + // base = multiply(base, base); + // exponentIntegers = divide(exponentIntegers, 2).split('.')[0]; + // } + // result = multiply(result, fractionalExponent); + // result = (negativeExponent) ? divide(1, result, precision + 1) : result; + // result = (precision) ? roundOff(result, precision) : result; + // return (negate) ? stripTrailingZero(negateFn(result)) : stripTrailingZero(result); +} +function intPow(base, exponent, precision = 32) { + exponent = abs(exponent); + let result = '1'; + while (greaterThan(exponent, '0')) { + if (isOdd(exponent)) { + result = multiply(result, base); + } + base = multiply(base, base); + exponent = divide(exponent, 2).split('.')[0]; + } + return result; +} +function nthRoot(x, n, precision = 8) { + x = x.toString(); + n = n.toString(); + validate(n); + if (lessThan(n, '4', true)) { + let guess = '1'; + let nMinusOne = subtract(n, 1); + let difference = '0'; + let lastDifference = x; + while (true) { + let newGuess = divide(add(stripTrailingZero(divide(x, pow(guess, nMinusOne, precision + 2), precision + 2)), multiply(guess, nMinusOne)), n, precision + 2); + difference = abs(subtract(guess, newGuess)); + if (greaterThan(difference, lastDifference)) { + // console.log('root exit under p') + return stripTrailingZero(roundOff(guess, precision + 1)); } - else { - return 1; + if (lessThan(difference, tolerance(precision - 1))) { + // console.log('newGuess exit under p') + return stripTrailingZero(roundOff(newGuess, precision + 1)); } + lastDifference = difference; + guess = stripTrailingZero(newGuess); } - else { - if (negative) { - return 1; + // console.log('guess exit over itt') + // return stripTrailingZero(roundOff(guess, precision + 1)) + } + else { + let x0 = '1'; + let x1 = '2'; + let x2 = '1.5'; + while (true) { + let f0 = subtract(pow(x0, n, precision + 2), x); + let f1 = subtract(pow(x1, n, precision + 2), x); + let next = multiply(f1, divide(subtract(x1, x0), subtract(f1, f0), precision + 2)); + x2 = subtract(roundOff(x1, precision + 2), roundOff(next, precision + 2)); + if (lessThan(abs(subtract(x2, x1)), tolerance(precision + 1))) { + return stripTrailingZero(roundOff(x2, precision + 1)); } - else { - return -1; + if (sign(f0) !== sign(f1)) { + x1 = divide(add(x0 + x1), 2, precision + 2); // Switch to bisection method } + x0 = x1; + x1 = stripTrailingZero(roundOff(x2, precision + 2)); } + // return stripTrailingZero(roundOff(x2, precision + 1)) + } +} +function sqRoot(base, precision = 32) { + precision = Math.max(precision, 32); + return nthRoot(base, 2, precision); +} +function cbRoot(base, precision = 32) { + precision = Math.max(precision, 32); + return nthRoot(base, 3, precision); +} +function root5(base, precision = 32) { + precision = Math.max(precision, 32); + return nthRoot(base, 5, precision); +} +function root10(base, precision = 32) { + precision = Math.max(precision, 32); + return sqRoot(root5(base, precision), precision + 1); +} +function validate(oparand) { + if (oparand.includes('.')) { + throw Error('Root base of non-integers not supported'); } - return 0; } -var bigDecimal = /** @class */ (function () { - function bigDecimal(number) { - if (number === void 0) { number = "0"; } - this.value = bigDecimal.validate(number); +const E_ROOTS_FOR_POW = [ + [ + "1", + "1.1051709180756476248117078264902466682245471947375187187928632894409679667476543029891433189707486536329171204854012445361537347145315787020068902997574505197515004866018321613310249357028047934586850494525645057122112661163770326284627042965573236001851139", + "1.22140275816016983392107199463967417030758094152050364127342509859920623308363781624228874401337247396902783756582071222657872335735698322420203091783847852468196963515090275879656423105784038067892980765878816657563573480602908117582872101992234299467757368987418370836563153389462747746988296269108061275281392456208243249268026539778924251026176313926132967183139404485664941616843691597024447586738912784063277359127768204092782706320234475212712014508481918262357879464226202483894518888192549035034715597321", + "1.349858807576003103983744313328007330378299697359365803049917989939612587399539891293796485784096715182993915046496649823555281317904746176330174697914134611623510180348776728882134107658893142886237546315268956423659470780978312757181276728365015226253890933258389419871658954993580579042712940646224891469297274304073301451390889351970899528642926347862338071149211408737527216178389071834814268450261525986465964604240725313283687637440963107718301330951356415753972714631376348680064772218613611483339228569651085445294350178104320530288284696175866807479054565245092139097584381245312021271592764191527971036208743048564156633628960281631838046184539943675102487856097772374221297245505051183848015221680960625161769660863247928466143070056933155076029152109198619", + "1.4918246976412703178248529528372222806432827739374252815956331500723650987080270940005743751395204332995146049712374327554149926253602141716230772600403407491873867150724945487212617660656620072704264395870570315311010113322105932230805422737018500206392527177438579578556189926416736085144638705057672356404429354629959069215296346423445412842930842338368651426888702440282339072078820428812172552291679864844405874392991397534151119907597315402375400805761858764070148579243901394571509123129260659970829149641445173093621736697471495715486927871427608521974813357303938049045027055274617248235377478635882464544179074744286716592660820629566276461885843196142347558399965088751380486680925242174092668548306167997919161040598441807559801618039547286283635268768983411911084036444003391406619758488846706626640355860622307506467065190571454306273600406778135267686009580686515055777572568306309595260360492639973537087137347050023394616393906703697628564832791198689610819908805991960205502002473532624419443167353822377041", + "1.64872127070012814684865078781416357165377610071014801157507931164066102119421560863277652005636664300286663775630779700467116697521960915984097145249005979692942265909840391471994846465948924489686890533641846572084106665685980008892498121171228737521497221259813802364604394123302337702342564441115073997210339345543632427971478640993009214371685872851424554356204792843238295646431490989989559298639300873734528343887199639936097616043887791159196535233519726480396696337931220763089035352455056481345843941842020212763119317243234414790916753474172146106996570450921757574263944725690829548117247432018340633298482417480890385134505857727555061166714846142254643382172817464252944064119480610550411214216150015806428026218072435549458500264910615270634896131341405150953300907304199696610224898662704055364699222488547803416596626400854705247760207415313247478751208997988819063167774971424158059320000508837926711487592221411833120473118940174150839318956411265214927589489222002618989424703890008658172723963726628180320021102408885281948306909133579708714540083108622117282123853386065037903914832977915548985425218334949782721619507339453842540738918246146490048448660414624464961524536296212426067836554424656828424228138566437904693429740129065343555896062662077213299699", + "1.822118800390508974875367668162864513382238808546435386320547476588819650298619237506071841611824533131511980084733212162604411051946388331577800804030556735220810982370501962391864313333554698490208265658190969819090734754749827177848273296632519555680103680326369352437791893895038152776723546377012529473207851151551688242638129468067423693457788686737322308859196635577406424535317253509122371220622994977976488678953227355968535226011981026891265759205286137730603315671631660105006528658431765125587595376593446335729037108814939435477611527959248377638771800033625299101758522787812658726842991493891554409933462204120505376533298706281045546514892620277647385214857618436655863924892218047400811116831042680487895029611648906250960278076271249277145102395991693860611831983025203596058754756019516099900266095850415178719614749200451630535061160489190411763823857450791548961055118169806794713874454939988586811643596429338746010525986899857961587944139308107436769695508633096338687346716373921410474524266689139689311366516947054631031160462923809187729982871513915427654871105844432037418907865839686988704917607346571370310822906994525483818469890762365701037332197459906166318134391275013867439967207601879970902034384688314406747097203766024003073884672273060729687254540281852107793074492986426871326231804793173823349508810551286252776477149073401952138042782050652434065326561952854233161279618029767330128021096195903742999575860846854523510091165177814675930213024375018164078691687009724255773069550816206514391507161", + "2.0137527074704765216245493885830652700175423941458673115689893008797813008588679406324379355851788044338331898308254040110152144406355672122332987484386680282011586454587874291207920063096506060092121746339385003035706369942761654499650114370277576609074394476969349195415563411287148054594195014950075492700297283186501952215548266611861363515166840789209921665299236941497660514195676818497506715216174857824667584113677462277646521368145755169801610652069383900929636397476997976928986121402340613272005739386746343595131239407140625657434766755405604726559983098911197009867487590223559613492600292768297051485732713550448835403835352549463376130577581804732758041958835979535301727820054018405592264887175988369901092552028042689226587551744843184492524888491684438908350917254501814719615534981346941241332070048752850076613909872221227923256131385070038327284304187184081154788930005575892847954811706365631293695056764191098947623473863749480484940756222177807267238801516870654540558247853395741216289690556742625956213865161202746032011088919700768154544490761339022261482519814495299963404741430504214836798155729249493697925254743226038042230995868518047785789005613825713835594435128868667771495101069180401795064269233374799738867352453002639997668416935366386592304127698022250575283863420166408296272643322148060907484201210428960680526033446678578974007350742511058399463304152252983283111059782340661351915733128923447394041481646451630961371702270477501539244567625913375076027018672900253183869684213821854331885455218593203695168621845862590839866070698465191768354775162667919687787234057113703426381234125007404970096051044315268874858727339518165207062282508219103550897032474383182390962719939041810953987104324795493331907049865728024468068697764264074787176174506379", + "2.22554092849246760457953753139507675705363413504848459611858395555662261021440632023826379767119915026374251878156387711619774619379855963687103747368472284226448865340655354317185985377030850245682664363225661079813536128785653726513719167842427129812110484311349165777902729389254511878094742813123387667848699059429446010657151043572826832010313208047732807930998614309870757227929101960381147954847517822334863279319666225559304046050087758825776791641245416220959090737379947978891910964567194089715072100803252233073248441719882854257031516049204581676853691460008296615228145430792751845579928748303335224298540140591302535466469498156065075049022167880244375473655622669689327650015305079415315439914200799195123789362957387187941117003174099693531506115168225416846731445216503066154563061060352226369700173570788781093516825383897874045751999350339808378867887307801498607904212244602606554161614131633524614531883236101562055698735197422864246157477439558784175923341664781731182017904677692890038751961431930364624097536076577459379586929940521167397559605869035407545793472238578147959537818114915637152419390460744941310780904484651026135598787393535566242027093950477170576851928767959213832520123359412209544604227356318776838329784976706937070674967308806522361845995066951391233792165311759338384098919371408326428769572713806130074267342996786117989877955011626521519806731160466960246214623368412017241669817519218938975787703688279670969520255459580782566824698766683025943011418413515424475714850262109066781102851851979626998205883326687030200455933362261083827188323248686155376982520491891859193912296678363031851095031585999296235557983401989894925443480452646143604665935035873612963289853124279447614565761048011466854209825044470072858946253771110646120878816878134534234062942337153869787247084363695742055676354219872791968697195149737804123025516854480966929100783654238470977617175020837913707478778991341149220208658404839283930641502839083068918900160104096532950404697685876434536064090817056280532188943563915681", + "2.459603111156949663800126563602470695421772306440083020748545736657466552943365860870497185275930801502314734282469001211863377120754375262961184698244101923873118980752553546206085511483915775565746633877944570171310441342807039240011800950067877653276578939207957922264156281735850299153120666705464183289626292382107850626757086481112777076313695819244326645247215187769898739208923979309373990446742434297871759538487547808364593778694498844772835078016714351373598016467631087278899749286697713740248674901887803256296138548656549872572977525766104722565107146500648985987203867132117547677722793432947466268434715992314177189845879538433878518025300096774542323436522591754634721655783263629640839419113447179019145648844517390978320904868643199845305360956544494557422964230972024073035383722263932056673976596266688976321828928564444485955130282123956383440560652142134812702650195318853004793654327694163135311018560302434548157745596278924049359462262875684655024660621143270223276160205111113928674619513010825531773437719585670055905189480192487461443889421286148006246588358783823432756235263368472035520311691553695512537108796193920657766396287812148336508130560411995851432991098150316151710626822458450166702368954969918890855718477702866142861632457171714589428586925352111493288264877793764611187635117419219667724089358648691849349019774953975112073361668366390843101189643022503196449529273850914731962177302267814885008720265909052869903077134292211446012339728016145173776605298068332932215627064339536349963737505457519321720111235396885978665426051921476079008722809300128117266650623362110732864760301900017299660039379063962560499694800926090914390798018070659760804286858439659842007948172165140806138672059440570988428291170643822030057401246220069601172550649731972117725967828449725240661095291919679379580274098603455617464670785310583926637393873619156058283990235643046346147091976283156228115434842186613044398987912680078472025977495377880564317393705447963819914365733951865401782223781823067701249854212472507082498852675712141033436456921920235635932416059888043961227210308986402540506511344650923632565845792598802341393743342422242830490309556974956001755607771592980368429255689748738593726168543904401740920843388611933767910638184739366965114643113679309810659" + ], + [ + "1", + "1.010050167084168057542165456902860033807362201524292515164404031254374190731323852253210417020805424644822048349018187461836882962867029471348122509994980620193343756983419263331678116890952977342412525238660052128564771661099141138373740030932375484797474253", + "1.020201340026755810160143920483151435303508991193925577274241055989764698001799473651140929048897747567783800834245028828510331946890882290633380114769851598685744140375597170707424349379520528467454229732767262381708980414285750783230743973744291273147993499", + "1.030454533953516855612439953831198132905025142988223325669945482984656275528143507413690159736153367833262717667969420762924665205128543186726815728146644027749899016551570459982549960946831724287476034271222234314936525314771353449031855228611755471551229794", + "1.040810774192388226757044757916854744082977050312312035233957186052848044168317778353605489758071664887267683574643292017752950273390217859298583514134022896444615385627894619269308729639149680681368915289974692924712790670871941809116920080546004777009977082", + "1.051271096376024039697517636335645220174821296055062528783938479166279869650561268909887381693097467956359959802287840109856898277991870910996931622269015847528217521038290049746389922767632968070266132836298958452051202283898407113137668129272719733709427182", + "1.061836546545359622224684877168372328428260420330079059772946224885572614646084795028727107540254028462725979079478817859771763808885702260691363941508870196834078432934454312238181936983945541942068693355958230093508349025302765186495840221334120606071291923", + "1.072508181254216479053103949889114605574958973093013631368581996384184663872870122142938195770222664418254764408892720110775221918308589471660420537322754050996390544947060412014702775390723097905171301841614973139324709852063472998538152057727154702871352078", + "1.083287067674958554435987758674888500198713572836593968977149136159258009574303026493771584720423995154971654271223663348911143174715668624259808265653232762681246142307810608195731327006732520819601068839992977872631673981442100729100750479561971721703257072", + "1.094174283705210357872897623544886011846519908747085113495537273829677943694135052107150933181696135377161199865920871107158317262615140642553465724478938198810156930341222455108468641066277461818416868403944990238207068911482417587752512679561090991848685506" + ], + [ + "1", + "1.001000500166708341668055753993058311563076200580701460228514674460359748251448298412718226004153260943068218872095099342063678696119623840972330905531768311923556198498023652909377677730283868486287409870317224336827290668524342227007650646080335377683539402", + "1.002002001334000266755580958731569947141262360355881650784254327401407826211342908735167751841578573842087720874539215063369808541481798858488186179510193185360846688470245765779287676702093047345577268794005585346872102348621068884894677639696274087962023832", + "1.00300450450337702601293409134890020533187271956193064005816386977887704167032778817835718449794009129738172654330257629939497609228121058276487935834566645111932939622158438169617802320237286016173845852664382662772735225891910141326100743286140812329716465", + "1.004008010677341872358807975325862256786679584568446515824520101445505613334720499643274149387061934130095719684438458233489149633082954545826902702369355374132139019359038155028498554482932087796695756199850948857306997101347029384618537438780565191707911304", + "1.005012520859401063383566241124068580734875538593956360758053700178766756245814257769725878531005582561752872914964453059693371357350351629785031289228112479393000390737852735490064653453473263950263469180412515034868068037410009410423281936206661529650777831", + "1.006018036054064864855584542073814807663397023131207238128209310729162232251624511692721095036373574483233356676638823820201979261982436682169260741126877359539784408851803860808991870535936635545440055073405777167775394256588337226812975070293010932647774324", + "1.007024557266848555231600031941337387260626958324843573515364689887121935057426030048643842343378401601112246752543195873570584146404476681012065985847363008474306541126869561447531097035189821427350474715365757081347202689171315251277667530845240665265299241", + "1.008032085504273431172073614608631847461248193629898477319670850659315558055203072544926387076982815517924276700035813263652577025921163294422287501988755195063376817413349886928919042162630307237198554733730866338155519701284057736281012337251398647856788345", + "1.009040621773867814062570481311874274057745096807557533536793791893309190089211313774252518807101361017003109570357638320235688072443915664196164220142177807129999765515285503655079866550036049450757501377434724079219971788693007550857637620196056994725614551" + ], + [ + "1", + "1.000100005000166670833416668055575397073415454172178381034635390972311235972781757573430475110294393277744056856189456093377349308639835234864147024859575654444223594337482525749599468629752896998058770389517981545014836069937171108315141768826558752790276236", + "1.000200020001333400002666755558095301588712550265063340281249616462339933552635650404575689469783860722328853092919751879277515614513727994472210356634280535514759912694604145062526466543039555669877231954222323073542460530523928410171365347075351011821920295", + "1.000300045004500337520251012543394484429242698705094453657909046405426810389812679452584785775653629322172025648290344728788948443651164069121340691369780280752072301321554544169816823932077142996969576906644974657939554818844412637302594762038150619715293429", + "1.000400080010667733418672355880651175325602089234218127313638994866471733257393689147689037528495706906710548020054317971434500261679934483484883365324764324379786145945431964915418427301969396382574915094633029858419556374510345888380818423418110019646700504", + "1.000500125020835937760438369605751648487716767772005667654052528513185499225469269404161288162290263445071720143880459750657027560342513592842257775359779789305459334406770729214405898908865552327309638003027229853587275580967668200112228756540688352311154381", + "1.000600180036005400648064805554702313487380662321427742218779523265089444076340698564952604142576704373734829905992750918066261276845603358030914225286385902646373896497226913904457327994080504271798651358706636453059949377387742804353973513521969936501752549", + "1.000700245057176672234080084397124317808729972049887082920697544556118662092675751649525697937257144190017868483717030126300200509168688033318071339742627167336587481821812960447646818515221045591253213703416322339042019757058294741478286115192071830262104121", + "1.000800320085350402731030797169875671484970787023831957698136827590544488579455328399517237263085338370118947386598991767922241276098928474413390097019906957313039688997723589590992573554820372138559418413121238600026229549189496894374911921472634282466150763", + "1.000900405121527342421488207410855909240960364438870706386170964512041266577901813243995078190574746902747080924348105047677314326983090277701922714443700530813227920787438119571392945308376198426393506918634436746759027328287815213664693795332524735463087053" + ], + [ + "1", + "1.000010000050000166667083334166668055557539685019844025575947974286518040859924541627171360141414808527964710456114808568579194429073542519236311802480484946481318067459005203787629467197723492854996446403371670522585399835010157731202234906636252385776731651", + "1.00002000020000133334000002666675555580952444444585538201058714126235905329240541941460463111260447087759745526170244469724542720133236462083910268982377765723546309959873516346614722768345641097465014525930010435730044916587618556635026327839524395833885967", + "1.000030000450004500033750202501012504339301986661384091295086648836751748647469450015964451670052983888622000581616827713185780669338108129262463661100560276359891431254482497644594518311264674989317833539411130935378547235234149850030248683847558235949192424", + "1.000040000800010666773334186672355588063654603897004653273294246986372534769339653940902480758988473452263946419318465732269864516290202354028672947499884769594544980789708021919265600923317888907545126143154207287758799568586448736519103967528945971526548865", + "1.000050001250020833593752604188368210566445007862474552660354358193300410181171307606063524320643523978564544928969865946453669990898899456698349198366716859128164016860292475535424871378362068018619464946001908269309911380465115625730470139574546168248414669", + "1.0000600018000360005400064800648005554327371706287380580517448041768184715082802102822710639972596644286364335407098336787101683082519331743726773721831155799714031419453036224798582793575860149124712362688085932620035829070681390851428693479523215791315023", + "1.000070002450057167667097339330069689583742177176723647063988790354210467474771865973142735988449874178404296043885131632312715760670823804989006222060531708444185344331114273860623983993837941069162433957327267046454693493702350816632053640929378397569224776", + "1.000080003200085335040027307030759716613039100029766726281645469033146244455371326825242410362812667390249632806855063393511294820363074995773170886211112043017322472818660214389638836378249754133527844678406244041534554373988144575477289266056935662827704568", + "1.000090004050121502733799208238121990124620911386617650268545997115197477729772808193789097698902228616779638545143688002498080668191392250030819907953393555632250735284651864761358652086319522549247127067080851958286265291953836318860562133321982933710810154" + ], + [ + "1", + "1.000001000000500000166666708333341666668055555753968278769844025573467813076198494952835391203458229748677004015804035149881283353005876638466337275595012771755160063386490687362457247978228580884154230359796042066216890640463145470846706955844825203502338433", + "1.000002000002000001333334000000266666755555580952387301588712522328042379349054566833660167181437047765093225411054231512232000686252213399825626439733598663743759193375087814488620462276244525976983466408498021993849036041894526504322094571719953352997296398", + "1.000003000004500004500003375002025001012500433928734151839955373415183009335525061132656460958137667580015165164788249607585867396819057285326555960166937649697973379255965258502453132749605555659281253337641722497540635905649955343904464110817430087236277383", + "1.000004000008000010666677333341866672355558806350831746754144909770828180249872278427090395131851159823632422197402740977847069569299698172678405177176752031063667161866596069388686444135669904957535469560754938297276129090532495319450469310001482708633857767", + "1.000005000012500020833359375026041688368071056557307173041021760810581713597910150822615040172518383155879039901575224781594686498583161076660122024484253078169629131959213103609416701449976071941387410235464597750689312106461726726423745914525437286467921547", + "1.000006000018000036000054000064800064800055542898800027771445234294803121427534564955943850794837297671518974352450646804505269707458299371394556170457704109967851854196460183929711397642333451409044458139769431977686515948803676537433882198942436033685726107", + "1.000007000024500057166766708473391830068218957087420770926023058705014627836931346376561248648943914301771998667561988061508464250718883634451632563486535656537167272887888081122818446250297457337741167996349750029452642438203264827808024523752573238419578446", + "1.000008000032000085333504000273067030755971657558959100027103654818370719061312164579253428366464456865704272537228885187015821963109960213301575481664899700318156977468627339004606537398549611534419591779145085995021987503286692083161615280400738437478228082", + "1.000009000040500121500273375492075738113449002853342362270826936522769439053506312434733891423696475231451840105639022034099547530631069357197734900223780917121362697414411169834162425824448828187739490931751957990245737110414834239697625619798509198502096658" + ], + [ + "1", + "1.000000100000005000000166666670833333416666668055555575396825644841272597001791225749809603978358318652155457825720723310835749477655921114381043370965778946803600487177628675696518849337844070626989834763657881129895761844201299169626521857477088528076787941", + "1.0000002000000200000013333334000000026666667555555580952381587301601410935026455031585698337876116969450321577305954872095570508305771300267271499578847512370499623533827733553612983384410604230310443624550120630972400618605844172547533274118825780193176817", + "1.000000300000045000004500000337500020250001012500043392858770089339955358770089330093345265320642486420378812047150951932585414871265710565736755891829214719352313336596892188244686930029886632072476330684236070498981285061952559758496574715013905892895701089", + "1.000000400000080000010666667733333418666672355555880634936888889611287506850089234183135875154730635650316057486370988380148651512646061821375107132862137685917854711244758264394403486935467487834601381881074388794755133200215304180036071713259670219661843655", + "1.00000050000012500002083333593750026041668836805710565485878596768387648163650363459170938183586448223517322491984417230264503853560225899248618260891812286125687715790717851056332021067227280094027013605976616483231712313908590884158078628449553297320265405", + "1.000000600000180000036000005400000648000064800005554286130857170628573094857233745459089870339612396601341875185399525960230416993842863520266038257286707886476669929341390017488971653286696873950479551896971679958715383478746119711068288028062391371149489013", + "1.000000700000245000057166676670834733916830068071895695874206708425953000310487646018304089060036787599147676275105859400474689895123100075425333066539374860872723840060463730171521439940751466901429495510481112965046593615553202195597459116945123426063272682", + "1.000000800000320000085333350400002730667030755597165718446730528598265921018024975740706254352576521064770040651166185959246668919556974378390605929012147885350292967351465271446885744407117136286055594702758682175847035062242848897900206718995002247133857028", + "1.000000900000405000121500027337504920750738112594900189247699728341390729295808046226796645426268557424285412997921532857831252559494834249449859109227293811330322601387155767798258269722975398926936389317746988260923777387227501391642065587929462420948649232" + ], + [ + "1", + "1.000000010000000050000000166666667083333334166666668055555557539682542162698415454144623567019402857944526698866978250658807361436330455014317926127615562200160084332078829335070241590368747866364909946478207830319530929114193223423472427136476351070384633625", + "1.000000020000000200000001333333340000000026666666755555555809523810158730160141093477248677253807920483138260929194262546389530541572869646520440208084154592575244829846475616092104703889032125897195071483101405504938379453255735383526992590359391748128287405", + "1.000000030000000450000004500000033750000202500001012500004339285730558035768526785877008929015219156953632307755135494996911581545128998738775212024344872737597647678017165824376945452724547758781666745678104162427281549813045542731484072320901013699751540848", + "1.000000040000000800000010666666773333334186666672355555588063492226031746754144623700881844722783424475442360990450187254251567422193813585987728199005661346037368045665532810641944716974411635496550894053342760394407334227944985761375822664063299977760202737", + "1.000000050000001250000020833333593750002604166688368055710565477159288199826733382290633389520515681243290082960907019379206809977191789257370469042321233232800461660402341054369158081918084989239338793682313776586227863512850221202421400273283373014626367211", + "1.000000060000001800000036000000540000006480000064800000555428575594285742057143023771429480311692856103917078121968011417513832454609367779840918760983285672034325842279012880873143319189323358452529556891585903632812397146307138829975274828994563695371179662", + "1.000000070000002450000057166667667083347339166830068057189569458742066083425945994475448626459922975804831403503407994163590626814758811340046507352358986760731455499065728116768159458733073621810040408316793287135185674491416007904172650363644834002683382753", + "1.00000008000000320000008533333504000002730666703075555971657147018158767145538214765716437674024287074857138074282562507322952457285899884827258634480202409132370650245847484059340021912733791131203856792980510306420862566617226572338856338435031664716693301", + "1.000000090000004050000121500002733750049207500738112509490017963905559103341304251500301830456961374530766246749440063115416691606198573254987480954117363856553419891520480849271064924566428807047867009390728824337185742582403824875085506729653219774600501303" + ], + [ + "1", + "1.000000001000000000500000000166666666708333333341666666668055555555753968253993055555558311287478229717813076198492867247207525145893201460227749911054309202505145378825438957130678837687266560105088389907332936208344126353435648007509079302366904838332737965", + "1.000000002000000002000000001333333334000000000266666666755555555580952380958730158731569664903280423280474587141262359040138133471466992736834031733502636105810709353815485197855429903174537090912633982404546033943476658527442915537642542256751648098540938329", + "1.000000003000000004500000004500000003375000002025000001012500000433928571591294642911383928587700892861580762988122463474282007055499419665167245143251664943594715148543087862808485217520052561838182926761331655514641487182847805900109952106216843867588068853", + "1.000000004000000008000000010666666677333333341866666672355555558806349207974603175325573192528818342256751643453335471124025932917900958536700278753394083087253080794330245466119358391768262310261548181640401381566398544617645066573738726605241457683162358406", + "1.000000005000000012500000020833333359375000026041666688368055571056547628735739092683876215213190312069808326828429435504808836584577556241828530001848857197197448211202934610464624745817298908884851334334032243517528230506352913584728945540127503247334304454", + "1.000000006000000018000000036000000054000000064800000064800000055542857184514285742057142873805714294803116887661298703396123877022771514559643784921476238095255198598792535200905864592462478874938320339031361777709608682003676296114904000848969978666037676208", + "1.000000007000000024500000057166666766708333473391666830068055718956944587420659833425945293891988861264598969692976408540181920613546886836709421546188906759485969317880330268377230197365586777939297035267858198945289644124491347823705980150597478089811238908", + "1.000000008000000032000000085333333504000000273066667030755555971657143273244444814312522341749841485037242407372912278975495665944488178378343886315424095469213776993555687392616104926576737106225715914016443147964116812712649070583759250245851205008677469484", + "1.00000000900000004050000012150000027337500049207500073811250094900178678191272428191272417515002310759027859286803358595908816669708328358557549585827919550781509555184392013474906695251704896486905504823982001490494955628430631018008515640009464192836762086" + ], + [ + "1", + "1.000000000100000000005000000000166666666670833333333416666666668055555555575396825397073412698415454144620838844797178381032547701302041579835416640972311235208061369602374898159661717890890636377876292167626807167118097418250089799613232822429561584839732436", + "1.00000000020000000002000000000133333333340000000000266666666675555555555809523809530158730158871252204588359788359839666506334028111805902739236072757342598614945704892826162667432877205675217861820898140236791877216104086843490250510449150481689310382491997", + "1.000000000300000000045000000004500000000337500000020250000001012500000043392857144484375000054241071430198660714330093344156953632305220408497752796394453771498033216988957610473517976082538957931840649372284007980778387079364588612237999322952503353246629272", + "1.000000000400000000080000000010666666667733333333418666666672355555555880634920651174603175325573192268754850089234183100884792902571758052646972327378677406133744778611081257066906765018961252872327129135458024179406515595154985765757709114409879325763582657", + "1.000000000500000000125000000020833333335937500000260416666688368055557105654762001643105164112447641362588872366729829295443148050046993630164903199619632307099045282865341315842970320393225917211453732599727661119186787432356941799959234635398296083997006139", + "1.000000000600000000180000000036000000005400000000648000000064800000005554285714702285714313485714287380571428662316883121427532467742209790218779163693808965891265088968175158346191639365407702043087739343368804570472330777845741875602316524836720744596838442", + "1.000000000700000000245000000057166666676670833334733916666830068055571895694445874206597333425945223833643326112645989436864693566253849841192829330529553945887353131797463326009328289333089933370063364144225191646223300847249495173234424373673541944624979205", + "1.00000000080000000032000000008533333335040000000273066666703075555559716571428987530158767145537921830196825612021369262382312864973497139947588769798444529279829947588643443285558056813237014675084862707667638417307510222862170506049780991734222020598622395", + "1.000000000900000000405000000121500000027337500004920750000738112500094900178582104841518924769866167515002240004474209193517383867930324377468044757492746949756095835764624498574071199440142689339384466863378791519731786238325701991449155383573875144382022735" + ], + [ + "1", + "1.000000000010000000000050000000000166666666667083333333334166666666668055555555557539682539685019841269844025573192242614638447974286515953184707524985304368984924541627170595425328394905114959781791792654948681248246092509415204617290487417116640524671775301", + "1.000000000020000000000200000000001333333333340000000000026666666666755555555555809523809524444444444445855379188715343915343920474587141262359040136831070164403516530500657509842695027911535848043821402053583856122155392523906401192251402380938316915480143814", + "1.000000000030000000000450000000004500000000033750000000202500000001012500000004339285714301986607142911383928571591294642857586647727273836749188314248641983022469439043110730229591857308776602897731494805150380123093913492034937508031925936525164255550480239", + "1.00000000004000000000080000000001066666666677333333333418666666667235555555558806349206365460317460389700176367131992945327329421196091365293143081697890586810267216616505076424653349506852152837802535905072055073786420151577785100640838396137277112251514735", + "1.00000000005000000000125000000002083333333359375000000260416666668836805555571056547619144500248016411244764112038587136255618718183873319134007264068095774525059241470925396170577487944738923374878447003205386484881914018245946707333822256547575648332174683", + "1.000000000060000000001800000000036000000000540000000006480000000064800000000555428571432737142857170628571428738057142858051740259744804155844176818381618471507920651137351791067425123447985349695682484654572318487957897918242801974673257648070007868679130426", + "1.000000000070000000002450000000057166666667667083333347339166666830068055557189569444458742065972333425945216827808777011126459894108581865282025216633943931012807982367336200600492753258650819501465012407695965228823807927322155096641118825460150386445518263", + "1.000000000080000000003200000000085333333335040000000027306666667030755555559716571428613038730159100026807763100038095259614835337645468150286810918977324022206242931561668484892962175461856164162854060279811767399853148829723227492951123779037914467762124188", + "1.000000000090000000004050000000121500000002733750000049207500000738112500009490017857249619843751067627008938180071651864330456372342868033181841733736211930697323760184868971758523921789168189768615744476250539036111741578555829725167955219694647353096622696" + ], + [ + "1", + "1.000000000001000000000000500000000000166666666666708333333333341666666666668055555555555753968253968278769841269844025573192240134479717813076198492865161619501897279835647891203458229747912288359543650548989349005883400229246206526163527289595008850667173127", + "1.000000000002000000000002000000000001333333333334000000000000266666666666755555555555580952380952387301587301588712522045855661375661375712682379349054566832344611437944771278292548133818000146042474087934405394723223543640599392717523920626753962817433470826", + "1.000000000003000000000004500000000004500000000003375000000002025000000001012500000000433928571428734151785714339955357142873415178571433009334415585525060876623632656406093960958126694744810435100615729450516002218359617667057380685556574837983621173494200824", + "1.000000000004000000000008000000000010666666666677333333333341866666666672355555555558806349206350831746031746754144620811576437389770828180214846916538934316722871531760423728464363385819413586609559082109346707911677721834735995817714714655658155017123966004", + "1.00000000000500000000001250000000002083333333335937500000002604166666668836805555557105654761905730716765873554101906966759414269180016504642155734790995478949110032280612198459362555198266157726625772874678331610798998177006297680609976524115439541173420259", + "1.000000000006000000000018000000000036000000000054000000000064800000000064800000000055542857142898800000000027771428571445234285714294803116883121427532467534564955044955943850435279366265734265869100042814376117193730654971650198545964167632457503232017871985", + "1.000000000007000000000024500000000057166666666766708333333473391666666830068055555718956944444587420659722333425945216127225322145111264598940825753582453602353313225972915411685074603803437053433977043894247041815994636316149529701778786472611784462703889138", + "1.000000000008000000000032000000000085333333333504000000000273066666667030755555555971657142857558958730159100026807760436987936508151703908930719061223879089942306582357031179238190271212908602022996939574698978718233321541425959528060975659005527346418528599", + "1.000000000009000000000040500000000121500000000273375000000492075000000738112500000949001785715353341294643924769866072389435736607929018849432407803098113232874672320130046233975445553072196307524291707537220510858488196407197643148826305620029216908081970869" + ], + [ + "1", + "1.000000000000100000000000005000000000000166666666666670833333333333416666666666668055555555555575396825396825644841269841272597001763668457892416225749809603976270645024985302763096599902155457825720722546120136232570095008736915152259095717555490353654637693", + "1.000000000000200000000000020000000000001333333333333400000000000002666666666666755555555555558095238095238158730158730160141093474426835978835978836491903158569833787611565389474722808056143268841681540119296733053347123188393029666555965964618355391948779923", + "1.000000000000300000000000045000000000004500000000000337500000000020250000000001012500000000043392857142858770089285714339955357142858770089285714330093344155845265320616883142486419830170378812036178118579523155416218299696954834514122792910931153971094557661", + "1.00000000000040000000000008000000000001066666666666773333333333341866666666667235555555555588063492063493688888888888961128747795417351675485008923418310084980254182031959917508006396898364938999859716891065039215240131218967246103644485220410726154752182813", + "1.000000000000500000000000125000000000020833333333335937500000000260416666666688368055555557105654761904858785962301592683876212522314969824735461967924533029209381816261176142259312832929617646027019562700585870131297332583548849712255111360166306405086567142", + "1.000000000000600000000000180000000000036000000000005400000000000648000000000064800000000005554285714286130857142857170628571428573094857142857233745454545459089870129870339612387612396601341515627589471100328256668816897388801845549408590481518481518982450895", + "1.000000000000700000000000245000000000057166666666676670833333334733916666666830068055555571895694444445874206597222333425945216057166976658951112645989407997470754170760066981154246423015810712407224886058134625535319860314645696585222499332309114404479010322", + "1.000000000000800000000000320000000000085333333333350400000000002730666666667030755555555597165714285718446730158730528598236331599254349206351358308930575740706245524032130353794354298842520912389088268868503018037747790192050898910086286503634618149465704747", + "1.000000000000900000000000405000000000121500000000027337500000004920750000000738112500000094900178571439247698660715353341294642953229287946436433045637175914296604606371988765933288088674127964826707631922216113496674674148986363044496860143671243577643241797" + ], + [ + "1", + "1.00000000000001000000000000005000000000000016666666666666708333333333333416666666666666805555555555555753968253968254216269841269841545414462081129023368606701940285794452461119336553364331142269510325065880736143632969029870898257141643432824401739745683204", + "1.000000000000020000000000000200000000000001333333333333340000000000000026666666666666755555555555555809523809523810158730158730160141093474426810582010582010587141253807920483138260916038706972040305373657500641627625779668107710435784086577737371425015371482", + "1.000000000000030000000000000450000000000004500000000000033750000000000202500000000001012500000000004339285714285730558035714285768526785714285877008928571429015219155844156953632305194807755135489510494996911570572295830843263878998738775175717176310059097941", + "1.000000000000040000000000000800000000000010666666666666773333333333334186666666666672355555555555588063492063492226031746031746754144620811290367548500881844722783389450091142108919886805434894323783520587584079648392819017157643549035718347892490103756832682", + "1.000000000000050000000000001250000000000020833333333333593750000000002604166666666688368055555555710565476190477159288194444449826733355379215623966600529222853848504890681243288122630360738677795976463823627917153238548547431722212537579252513491528497895141", + "1.000000000000060000000000001800000000000036000000000000540000000000006480000000000064800000000000555428571428575594285714285742057142857143023771428571429480311688311692856103896103917078121878121968011417154274656689596118168895082060796351269490173691870225", + "1.000000000000070000000000002450000000000057166666666667667083333333347339166666666830068055555557189569444444458742065972222333425945216050161142110339511126459894079714642471342475838347947074466949660826626759076737909986334434737200569423813868209125061118", + "1.000000000000080000000000003200000000000085333333333335040000000000027306666666667030755555555559716571428571470181587301587671455379188715480990476190497710073432740242870747688526349158515558520603402824101263705714914519281853707209898319172054430569538082", + "1.000000000000090000000000004050000000000121500000000002733750000000049207500000000738112500000009490017857142963905558035715353341294642866751500223214364330456371753836374526684257328746723198702565062957968528363119291981226734282851988084786564653406103472" + ], + [ + "1", + "1.000000000000001000000000000000500000000000000166666666666666708333333333333341666666666666668055555555555555753968253968253993055555555555558311287477954144896384479717813076198492865159533913874191651969590337645893201460227749910289593593991742139890335833", + "1.000000000000002000000000000002000000000000001333333333333334000000000000000266666666666666755555555555555580952380952380958730158730158731569664902998236613756613756613807920474587141262359040136817915911249244582578103847945117786412685883585354487957662562", + "1.000000000000003000000000000004500000000000004500000000000003375000000000002025000000000001012500000000000433928571428571591294642857142911383928571428587700892857142861580762987012988122463474025974282007055444555499419665156272310102286106750394522086451494", + "1.000000000000004000000000000008000000000000010666666666666677333333333333341866666666666672355555555555558806349206349207974603174603175325573192239859195485008818342256751643418310120002137779915568470377359266251234291869212504954247007157060272389965511657", + "1.000000000000005000000000000012500000000000020833333333333359375000000000026041666666666688368055555555571056547619047628735739087301592683876212522048546523644179895403141659652076828429435308775782586614292343529022000662935706114244280270246557851904047187", + "1.00000000000000600000000000001800000000000003600000000000005400000000000006480000000000006480000000000005554285714285718451428571428574205714285714287380571428571429480311688311688766129870129870339612387612387702277151420008598821521335807063576195233338095", + "1.000000000000007000000000000024500000000000057166666666666766708333333333473391666666666830068055555555718956944444444587420659722222333425945216049460558655478395111264598940796886359643059647415484626357278274780213549872841697820531068941222114832031381804", + "1.000000000000008000000000000032000000000000085333333333333504000000000000273066666666667030755555555555971657142857143273244444444444814312522045855675083174603174818370575597242407372912190690056753273393273443722265929250083140248634767166738704512418804466", + "1.000000000000009000000000000040500000000000121500000000000273375000000000492075000000000738112500000000949001785714286781912723214286781912723214286675150022321429357590278003247342868033177760148459087904283479197083126137413049861121579402108279148620678486" + ], + [ + "1", + "1.000000000000000100000000000000005000000000000000166666666666666670833333333333333416666666666666668055555555555555575396825396825397073412698412698415454144620811287505511463844797178381032547699214367968708246486024279861085416640972311235208060604886766427", + "1.00000000000000020000000000000002000000000000000133333333333333340000000000000000266666666666666675555555555555555809523809523809530158730158730158871252204585537921693121693121693172999839666506334028111805889583680517013850347183868453709723550995898085845", + "1.000000000000000300000000000000045000000000000004500000000000000337500000000000020250000000000001012500000000000043392857142857144484375000000000054241071428571430198660714285714330093344155844156953632305194805220408497752247752796394453760525200069461788209", + "1.000000000000000400000000000000080000000000000010666666666666667733333333333333418666666666666672355555555555555880634920634920651174603174603175325573192239858935421516754850089234183100849767551459569237347016202497091385980305660712009918359945816284440624", + "1.000000000000000500000000000000125000000000000020833333333333335937500000000000260416666666666688368055555555557105654761904762001643105158730164112447641093474695922205687830700063162628266795443148050027390324771407941980859347644064053414275164241901696431", + "1.000000000000000600000000000000180000000000000036000000000000005400000000000000648000000000000064800000000000005554285714285714702285714285714313485714285714287380571428571428662316883116883121427532467532467742209790209790218779163693449408094680176965891264", + "1.000000000000000700000000000000245000000000000057166666666666676670833333333334733916666666666830068055555555571895694444444445874206597222222333425945216049390500309992283951112645989407968603531360231364573198294285559476609495997192590078165056998305407027", + "1.000000000000000800000000000000320000000000000085333333333333350400000000000002730666666666667030755555555555597165714285714289875301587301587671455379188712551635301587301589453547025813692623823128640906427512749176749177253665475735317032064340416001793007", + "1.000000000000000900000000000000405000000000000121500000000000027337500000000004920750000000000738112500000000094900178571428582104841517857143924769866071428667515002232142865004474208603896693517383827110430430324374843908718044757335298787389806890096519491" + ], + [ + "1", + "1.000000000000000010000000000000000050000000000000000166666666666666667083333333333333334166666666666666668055555555555555557539682539682539685019841269841269844025573192239858909281305114638447974286515953182619851374191651969429748813429368984924541627170598", + "1.000000000000000020000000000000000200000000000000001333333333333333340000000000000000026666666666666666755555555555555555809523809523809524444444444444444445855379188712522048677248677248677253807920474587141262359040136817914608847942181275514627641611768596", + "1.000000000000000030000000000000000450000000000000004500000000000000033750000000000000202500000000000001012500000000000004339285714285714301986607142857142911383928571428571591294642857142857586647727272727273836749188311688314248641983016983022469439043099755", + "1.000000000000000040000000000000000800000000000000010666666666666666773333333333333334186666666666666672355555555555555588063492063492063654603174603174603897001763668430337986596119929453273294211960878627580319598097375875261423350312239201436005499497562994", + "1.000000000000000050000000000000001250000000000000020833333333333333593750000000000002604166666666666688368055555555555710565476190476191445002480158730164112447641093474453719204695767195889520515171556838733191340070680350418458735516027189695036859130361164", + "1.000000000000000060000000000000001800000000000000036000000000000000540000000000000006480000000000000064800000000000000555428571428571432737142857142857170628571428571428738057142857142858051740259740259744804155844155844176818381618381618471507920650777793995", + "1.000000000000000070000000000000002450000000000000057166666666666667667083333333333347339166666666666830068055555555557189569444444444458742065972222222333425945216049383494475443672839511126459894079685775248531948536288969661078387597485597679474645403468476", + "1.00000000000000008000000000000000320000000000000008533333333333333504000000000000002730666666666666703075555555555555971657142857142861303873015873015910002680776014109643337142857142859294816867083533764546815028592806458869675509675510179998402068243340775", + "1.000000000000000090000000000000004050000000000000121500000000000002733750000000000049207500000000000738112500000000009490017857142857249619843750000001067627008928571438180071651785714364330456371753247342868033177759744341733736185689336930697323602736706615" + ], + [ + "1", + "1.000000000000000001000000000000000000500000000000000000166666666666666666708333333333333333341666666666666666668055555555555555555753968253968253968278769841269841269844025573192239858906801146384479717813076198492865159531828286168563946341724280092335647892", + "1.000000000000000002000000000000000002000000000000000001333333333333333334000000000000000000266666666666666666755555555555555555580952380952380952387301587301587301588712522045855379188994708994708994709046015712682379349054566832344610122389215722549055882388", + "1.000000000000000003000000000000000004500000000000000004500000000000000003375000000000000002025000000000000001012500000000000000433928571428571428734151785714285714339955357142857142873415178571428571433009334415584415585525060876623376623632656406093906093961", + "1.000000000000000004000000000000000008000000000000000010666666666666666677333333333333333341866666666666666672355555555555555558806349206349206350831746031746031746754144620811287478243104056437389770828180214846881513583205600983378761167315976204865093757063", + "1.000000000000000005000000000000000012500000000000000020833333333333333359375000000000000026041666666666666688368055555555555571056547619047619057307167658730158735541019069664903000927476025132275133498379754890171557347909954789295067268878100583829750566431", + "1.000000000000000006000000000000000018000000000000000036000000000000000054000000000000000064800000000000000064800000000000000055542857142857142898800000000000000027771428571428571445234285714285714294803116883116883121427532467532467534564955044955044955943848", + "1.000000000000000007000000000000000024500000000000000057166666666666666766708333333333333473391666666666666830068055555555555718956944444444444587420659722222222333425945216049382793891988811728395111264598940796857492420249120253460546797757670409580139582076", + "1.000000000000000008000000000000000032000000000000000085333333333333333504000000000000000273066666666666667030755555555555555971657142857142857558958730158730159100026807760141093770321269841269841485037242263908930719061223879001656867720084360084360134808958", + "1.000000000000000009000000000000000040500000000000000121500000000000000273375000000000000492075000000000000738112500000000000949001785714285715353341294642857143924769866071428572389435736607142857929018849431818182407803098112824675732874672319867632630046236" + ], + [ + "1", + "1.000000000000000000100000000000000000005000000000000000000166666666666666666670833333333333333333416666666666666666668055555555555555555575396825396825396825644841269841269841272597001763668430335124559082892416225749809603976270642937311691651969429747207541", + "1.000000000000000000200000000000000000020000000000000000001333333333333333333400000000000000000002666666666666666666755555555555555555558095238095238095238158730158730158730160141093474426807760169312169312169312169825236491903158569833787611565389343167252501", + "1.000000000000000000300000000000000000045000000000000000004500000000000000000337500000000000000020250000000000000001012500000000000000043392857142857142858770089285714285714339955357142857142858770089285714285714330093344155844155845265320616883116883142486419", + "1.000000000000000000400000000000000000080000000000000000010666666666666666667733333333333333333418666666666666666672355555555555555555880634920634920634936888888888888888889611287477954144620840183421516754850089234183100849767516469208486986264764043619524508", + "1.00000000000000000050000000000000000012500000000000000002083333333333333333593750000000000000026041666666666666668836805555555555555710565476190476190485878596230158730159268387621252204585564830315806878306879530125786636203302920938181626115653895392003709", + "1.00000000000000000060000000000000000018000000000000000003600000000000000000540000000000000000064800000000000000006480000000000000000555428571428571428613085714285714285717062857142857142857309485714285714285723374545454545454545908987012987012987033961238761", + "1.000000000000000000700000000000000000245000000000000000057166666666666666676670833333333333334733916666666666666830068055555555555571895694444444444445874206597222222222333425945216049382723833643325617283951112645989407968574664137420837425177704511425598692", + "1.000000000000000000800000000000000000320000000000000000085333333333333333350400000000000000002730666666666666667030755555555555555597165714285714285718446730158730158730528598236331569664932587682539682539684691642263908930575740706245524023301809908131572135", + "1.000000000000000000900000000000000000405000000000000000121500000000000000027337500000000000004920750000000000000738112500000000000094900178571428571439247698660714285715353341294642857142953229287946428571436433045637175324675914296604606331168871988765933284" + ], + [ + "1", + "1.000000000000000000010000000000000000000050000000000000000000166666666666666666667083333333333333333334166666666666666666668055555555555555555557539682539682539682542162698412698412698415454144620811287477956900352733686067019402857944524611191277860032200311", + "1.000000000000000000020000000000000000000200000000000000000001333333333333333333340000000000000000000026666666666666666666755555555555555555555809523809523809523810158730158730158730160141093474426807760143915343915343915343920474587141253807920483138260916037", + "1.000000000000000000030000000000000000000450000000000000000004500000000000000000033750000000000000000202500000000000000001012500000000000000004339285714285714285730558035714285714285768526785714285714285877008928571428571429015219155844155844156953632305194803", + "1.000000000000000000040000000000000000000800000000000000000010666666666666666666773333333333333333334186666666666666666672355555555555555555588063492063492063492226031746031746031746754144620811287477957034215167548500881844722783389450056116757808775586553367", + "1.0000000000000000000500000000000000000012500000000000000000208333333333333333335937500000000000000026041666666666666666883680555555555555557105654761904761904771592881944444444444498267333553791887125489572999338624338625561871818382235048906812432881226284", + "1.000000000000000000060000000000000000001800000000000000000036000000000000000000540000000000000000006480000000000000000064800000000000000000555428571428571428575594285714285714285742057142857142857143023771428571428571429480311688311688311692856103896103896105", + "1.000000000000000000070000000000000000002450000000000000000057166666666666666667667083333333333333347339166666666666666830068055555555555557189569444444444444458742065972222222222333425945216049382716827808777006172839511126459894079685746381309138009142349419", + "1.000000000000000000080000000000000000003200000000000000000085333333333333333335040000000000000000027306666666666666667030755555555555555559716571428571428571470181587301587301587671455379188712522048814323809523809523831043406766073432740242870747688525466307", + "1.000000000000000000090000000000000000004050000000000000000121500000000000000002733750000000000000049207500000000000000738112500000000000009490017857142857142963905558035714285715353341294642857142866751500223214285714364330456371753246753836374526684253246756" + ], + [ + "1", + "1.000000000000000000001000000000000000000000500000000000000000000166666666666666666666708333333333333333333341666666666666666666668055555555555555555555753968253968253968253993055555555555555555558311287477954144620811563051146384479717813076198492865159531825", + "1.000000000000000000002000000000000000000002000000000000000000001333333333333333333334000000000000000000000266666666666666666666755555555555555555555580952380952380952380958730158730158730158731569664902998236331569947089947089947089947141253807920474587141263", + "1.000000000000000000003000000000000000000004500000000000000000004500000000000000000003375000000000000000002025000000000000000001012500000000000000000433928571428571428571591294642857142857142911383928571428571428587700892857142857142861580762987012987012988123", + "1.000000000000000000004000000000000000000008000000000000000000010666666666666666666677333333333333333333341866666666666666666672355555555555555555558806349206349206349207974603174603174603175325573192239858906525862151675485008818342256751643418310084976786668", + "1.000000000000000000005000000000000000000012500000000000000000020833333333333333333359375000000000000000026041666666666666666688368055555555555555571056547619047619047628735739087301587301592683876212522045855381879856977513227513228736474992985409652076828429", + "1.000000000000000000006000000000000000000018000000000000000000036000000000000000000054000000000000000000064800000000000000000064800000000000000000055542857142857142857184514285714285714285742057142857142857142873805714285714285714294803116883116883116887661297", + "1.000000000000000000007000000000000000000024500000000000000000057166666666666666666766708333333333333333473391666666666666666830068055555555555555718956944444444444444587420659722222222222333425945216049382716127225322145061728395111264598940796857463553026308", + "1.000000000000000000008000000000000000000032000000000000000000085333333333333333333504000000000000000000273066666666666666667030755555555555555555971657142857142857143273244444444444444444814312522045855379189008416507936507936508151703908930575597242407372915", + "1.000000000000000000009000000000000000000040500000000000000000121500000000000000000273375000000000000000492075000000000000000738112500000000000000949001785714285714286781912723214285714286781912723214285714286675150022321428571429357590278003246753247342868031" + ], + [ + "1", + "1.000000000000000000000100000000000000000000005000000000000000000000166666666666666666666670833333333333333333333416666666666666666666668055555555555555555555575396825396825396825397073412698412698412698415454144620811287477954172178130511463844797178381032548", + "1.00000000000000000000020000000000000000000002000000000000000000000133333333333333333333340000000000000000000000266666666666666666666675555555555555555555555809523809523809523809530158730158730158730158871252204585537918871255026455026455026455026506333173", + "1.000000000000000000000300000000000000000000045000000000000000000004500000000000000000000337500000000000000000020250000000000000000001012500000000000000000043392857142857142857144484375000000000000000054241071428571428571430198660714285714285714330093344155846", + "1.000000000000000000000400000000000000000000080000000000000000000010666666666666666666667733333333333333333333418666666666666666666672355555555555555555555880634920634920634920651174603174603174603175325573192239858906525602088183421516754850089234183100849766", + "1.00000000000000000000050000000000000000000012500000000000000000002083333333333333333333593750000000000000000026041666666666666666668836805555555555555555710565476190476190476200164310515873015873016411244764109347442680802925553902116402116403339649596160013", + "1.000000000000000000000600000000000000000000180000000000000000000036000000000000000000005400000000000000000000648000000000000000000064800000000000000000005554285714285714285714702285714285714285714313485714285714285714287380571428571428571428662316883116883115", + "1.000000000000000000000700000000000000000000245000000000000000000057166666666666666666676670833333333333333334733916666666666666666830068055555555555555571895694444444444444445874206597222222222222333425945216049382716057166976658950617283951112645989407968576", + "1.000000000000000000000800000000000000000000320000000000000000000085333333333333333333350400000000000000000002730666666666666666667030755555555555555555597165714285714285714289875301587301587301587671455379188712522045884968634920634920634922786880359147025816", + "1.000000000000000000000900000000000000000000405000000000000000000121500000000000000000027337500000000000000004920750000000000000000738112500000000000000094900178571428571428582104841517857142857143924769866071428571428667515002232142857142865004474208603896105" + ], + [ + "1", + "1.000000000000000000000010000000000000000000000050000000000000000000000166666666666666666666667083333333333333333333334166666666666666666666668055555555555555555555557539682539682539682539685019841269841269841269844025573192239858906525575947971781305114638449", + "1.000000000000000000000020000000000000000000000200000000000000000000001333333333333333333333340000000000000000000000026666666666666666666666755555555555555555555555809523809523809523809524444444444444444444444445855379188712522045855382010582010582010582010585", + "1.000000000000000000000030000000000000000000000450000000000000000000004500000000000000000000033750000000000000000000202500000000000000000001012500000000000000000004339285714285714285714301986607142857142857142911383928571428571428571591294642857142857142857586", + "1.000000000000000000000040000000000000000000000800000000000000000000010666666666666666666666773333333333333333333334186666666666666666666672355555555555555555555588063492063492063492063654603174603174603174603897001763668430335097004653262786596119929453273303", + "1.000000000000000000000050000000000000000000001250000000000000000000020833333333333333333333593750000000000000000002604166666666666666666688368055555555555555555710565476190476190476191445002480158730158730164112447641093474426807787052538029100529100529222855", + "1.000000000000000000000060000000000000000000001800000000000000000000036000000000000000000000540000000000000000000006480000000000000000000064800000000000000000000555428571428571428571432737142857142857142857170628571428571428571428738057142857142857142858051741", + "1.000000000000000000000070000000000000000000002450000000000000000000057166666666666666666667667083333333333333333347339166666666666666666830068055555555555555557189569444444444444444458742065972222222222222333425945216049382716050161142110339506172839511126458", + "1.000000000000000000000080000000000000000000003200000000000000000000085333333333333333333335040000000000000000000027306666666666666666667030755555555555555555559716571428571428571428613038730158730158730159100026807760141093474429766704761904761904761926281501", + "1.000000000000000000000090000000000000000000004050000000000000000000121500000000000000000002733750000000000000000049207500000000000000000738112500000000000000009490017857142857142857249619843750000000000001067627008928571428571438180071651785714285714364330459" + ], + [ + "1", + "1.000000000000000000000001000000000000000000000000500000000000000000000000166666666666666666666666708333333333333333333333341666666666666666666666668055555555555555555555555753968253968253968253968278769841269841269841269844025573192239858906525573467813051147", + "1.000000000000000000000002000000000000000000000002000000000000000000000001333333333333333333333334000000000000000000000000266666666666666666666666755555555555555555555555580952380952380952380952387301587301587301587301588712522045855379188712522328042328042329", + "1.000000000000000000000003000000000000000000000004500000000000000000000004500000000000000000000003375000000000000000000002025000000000000000000001012500000000000000000000433928571428571428571428734151785714285714285714339955357142857142857142873415178571428569", + "1.000000000000000000000004000000000000000000000008000000000000000000000010666666666666666666666677333333333333333333333341866666666666666666666672355555555555555555555558806349206349206349206350831746031746031746031746754144620811287477954144909770723104056436", + "1.000000000000000000000005000000000000000000000012500000000000000000000020833333333333333333333359375000000000000000000026041666666666666666666688368055555555555555555571056547619047619047619057307167658730158730158735541019069664902998236334260809358465608467", + "1.000000000000000000000006000000000000000000000018000000000000000000000036000000000000000000000054000000000000000000000064800000000000000000000064800000000000000000000055542857142857142857142898800000000000000000000027771428571428571428571445234285714285714286", + "1.000000000000000000000007000000000000000000000024500000000000000000000057166666666666666666666766708333333333333333333473391666666666666666666830068055555555555555555718956944444444444444444587420659722222222222222333425945216049382716049460558655478395061727", + "1.000000000000000000000008000000000000000000000032000000000000000000000085333333333333333333333504000000000000000000000273066666666666666666667030755555555555555555555971657142857142857142857558958730158730158730159100026807760141093474427103654603174603174605", + "1.000000000000000000000009000000000000000000000040500000000000000000000121500000000000000000000273375000000000000000000492075000000000000000000738112500000000000000000949001785714285714285715353341294642857142857143924769866071428571428572389435736607142857144" + ], + [ + "1", + "1.000000000000000000000000100000000000000000000000005000000000000000000000000166666666666666666666666670833333333333333333333333416666666666666666666666668055555555555555555555555575396825396825396825396825644841269841269841269841272597001763668430335097001788", + "1.000000000000000000000000200000000000000000000000020000000000000000000000001333333333333333333333333400000000000000000000000002666666666666666666666666755555555555555555555555558095238095238095238095238158730158730158730158730160141093474426807760141093502646", + "1.000000000000000000000000300000000000000000000000045000000000000000000000004500000000000000000000000337500000000000000000000020250000000000000000000001012500000000000000000000043392857142857142857142858770089285714285714285714339955357142857142857142858770088", + "1.000000000000000000000000400000000000000000000000080000000000000000000000010666666666666666666666667733333333333333333333333418666666666666666666666672355555555555555555555555880634920634920634920634936888888888888888888888889611287477954144620811287506850092", + "1.000000000000000000000000500000000000000000000000125000000000000000000000020833333333333333333333335937500000000000000000000260416666666666666666666688368055555555555555555557105654761904761904761904858785962301587301587301592683876212522045855379188981636508", + "1.000000000000000000000000600000000000000000000000180000000000000000000000036000000000000000000000005400000000000000000000000648000000000000000000000064800000000000000000000005554285714285714285714286130857142857142857142857170628571428571428571428573094857144", + "1.00000000000000000000000070000000000000000000000024500000000000000000000005716666666666666666666667667083333333333333333333473391666666666666666666683006805555555555555555557189569444444444444444444587420659722222222222222233342594521604938271604939050030999", + "1.000000000000000000000000800000000000000000000000320000000000000000000000085333333333333333333333350400000000000000000000002730666666666666666666667030755555555555555555555597165714285714285714285718446730158730158730158730528598236331569664902998265921015871", + "1.000000000000000000000000900000000000000000000000405000000000000000000000121500000000000000000000027337500000000000000000004920750000000000000000000738112500000000000000000094900178571428571428571439247698660714285714285715353341294642857142857142953229287949" + ], + [ + "1", + "1.000000000000000000000000010000000000000000000000000050000000000000000000000000166666666666666666666666667083333333333333333333333334166666666666666666666666668055555555555555555555555557539682539682539682539682542162698412698412698412698415454144620811287477", + "1.000000000000000000000000020000000000000000000000000200000000000000000000000001333333333333333333333333340000000000000000000000000026666666666666666666666666755555555555555555555555555809523809523809523809523810158730158730158730158730160141093474426807760139", + "1.000000000000000000000000030000000000000000000000000450000000000000000000000004500000000000000000000000033750000000000000000000000202500000000000000000000001012500000000000000000000004339285714285714285714285730558035714285714285714285768526785714285714285713", + "1.000000000000000000000000040000000000000000000000000800000000000000000000000010666666666666666666666666773333333333333333333333334186666666666666666666666672355555555555555555555555588063492063492063492063492226031746031746031746031746754144620811287477954144", + "1.000000000000000000000000050000000000000000000000001250000000000000000000000020833333333333333333333333593750000000000000000000002604166666666666666666666688368055555555555555555555710565476190476190476190477159288194444444444444444449826733355379188712522045", + "1.000000000000000000000000060000000000000000000000001800000000000000000000000036000000000000000000000000540000000000000000000000006480000000000000000000000064800000000000000000000000555428571428571428571428575594285714285714285714285742057142857142857142857143", + "1.000000000000000000000000070000000000000000000000002450000000000000000000000057166666666666666666666667667083333333333333333333347339166666666666666666666830068055555555555555555557189569444444444444444444458742065972222222222222222333425945216049382716049381", + "1.000000000000000000000000080000000000000000000000003200000000000000000000000085333333333333333333333335040000000000000000000000027306666666666666666666667030755555555555555555555559716571428571428571428571470181587301587301587301587671455379188712522045855382", + "1.000000000000000000000000090000000000000000000000004050000000000000000000000121500000000000000000000002733750000000000000000000049207500000000000000000000738112500000000000000000009490017857142857142857142963905558035714285714285715353341294642857142857142868" + ], + [ + "1", + "1.000000000000000000000000001000000000000000000000000000500000000000000000000000000166666666666666666666666666708333333333333333333333333341666666666666666666666666668055555555555555555555555555753968253968253968253968253993055555555555555555555555558311287479", + "1.000000000000000000000000002000000000000000000000000002000000000000000000000000001333333333333333333333333334000000000000000000000000000266666666666666666666666666755555555555555555555555555580952380952380952380952380958730158730158730158730158731569664902999", + "1.00000000000000000000000000300000000000000000000000000450000000000000000000000000450000000000000000000000000337500000000000000000000000202500000000000000000000000101250000000000000000000000043392857142857142857142857159129464285714285714285714291138392857143", + "1.000000000000000000000000004000000000000000000000000008000000000000000000000000010666666666666666666666666677333333333333333333333333341866666666666666666666666672355555555555555555555555558806349206349206349206349207974603174603174603174603175325573192239859", + "1.000000000000000000000000005000000000000000000000000012500000000000000000000000020833333333333333333333333359375000000000000000000000026041666666666666666666666688368055555555555555555555571056547619047619047619047628735739087301587301587301592683876212522047", + "1.000000000000000000000000006000000000000000000000000018000000000000000000000000036000000000000000000000000054000000000000000000000000064800000000000000000000000064800000000000000000000000055542857142857142857142857184514285714285714285714285742057142857142858", + "1.000000000000000000000000007000000000000000000000000024500000000000000000000000057166666666666666666666666766708333333333333333333333473391666666666666666666666830068055555555555555555555718956944444444444444444444587420659722222222222222222333425945216049384", + "1.000000000000000000000000008000000000000000000000000032000000000000000000000000085333333333333333333333333504000000000000000000000000273066666666666666666666667030755555555555555555555555971657142857142857142857143273244444444444444444444444814312522045855381", + "1.000000000000000000000000009000000000000000000000000040500000000000000000000000121500000000000000000000000273375000000000000000000000492075000000000000000000000738112500000000000000000000949001785714285714285714286781912723214285714285714286781912723214285713" + ], + [ + "1", + "1.000000000000000000000000000100000000000000000000000000005000000000000000000000000000166666666666666666666666666670833333333333333333333333333416666666666666666666666666668055555555555555555555555555575396825396825396825396825397073412698412698412698412698414", + "1.000000000000000000000000000200000000000000000000000000020000000000000000000000000001333333333333333333333333333400000000000000000000000000002666666666666666666666666666755555555555555555555555555558095238095238095238095238095301587301587301587301587301588711", + "1.000000000000000000000000000300000000000000000000000000045000000000000000000000000004500000000000000000000000000337500000000000000000000000020250000000000000000000000001012500000000000000000000000043392857142857142857142857144484375000000000000000000000054239", + "1.000000000000000000000000000400000000000000000000000000080000000000000000000000000010666666666666666666666666667733333333333333333333333333418666666666666666666666666672355555555555555555555555555880634920634920634920634920651174603174603174603174603175325574", + "1.000000000000000000000000000500000000000000000000000000125000000000000000000000000020833333333333333333333333335937500000000000000000000000260416666666666666666666666688368055555555555555555555557105654761904761904761904762001643105158730158730158730164112449", + "1.000000000000000000000000000600000000000000000000000000180000000000000000000000000036000000000000000000000000005400000000000000000000000000648000000000000000000000000064800000000000000000000000005554285714285714285714285714702285714285714285714285714313485713", + "1.000000000000000000000000000700000000000000000000000000245000000000000000000000000057166666666666666666666666676670833333333333333333333334733916666666666666666666666830068055555555555555555555571895694444444444444444444445874206597222222222222222222333425947", + "1.000000000000000000000000000800000000000000000000000000320000000000000000000000000085333333333333333333333333350400000000000000000000000002730666666666666666666666667030755555555555555555555555597165714285714285714285714289875301587301587301587301587671455379", + "1.000000000000000000000000000900000000000000000000000000405000000000000000000000000121500000000000000000000000027337500000000000000000000004920750000000000000000000000738112500000000000000000000094900178571428571428571428582104841517857142857142857143924769868" + ], + [ + "1", + "1.000000000000000000000000000010000000000000000000000000000050000000000000000000000000000166666666666666666666666666667083333333333333333333333333334166666666666666666666666666668055555555555555555555555555557539682539682539682539682539685019841269841269841268", + "1.000000000000000000000000000020000000000000000000000000000200000000000000000000000000001333333333333333333333333333340000000000000000000000000000026666666666666666666666666666755555555555555555555555555555809523809523809523809523809524444444444444444444444447", + "1.000000000000000000000000000030000000000000000000000000000450000000000000000000000000004500000000000000000000000000033750000000000000000000000000202500000000000000000000000001012500000000000000000000000004339285714285714285714285714301986607142857142857142859", + "1.000000000000000000000000000040000000000000000000000000000800000000000000000000000000010666666666666666666666666666773333333333333333333333333334186666666666666666666666666672355555555555555555555555555588063492063492063492063492063654603174603174603174603175", + "1.000000000000000000000000000050000000000000000000000000001250000000000000000000000000020833333333333333333333333333593750000000000000000000000002604166666666666666666666666688368055555555555555555555555710565476190476190476190476191445002480158730158730158732", + "1.000000000000000000000000000060000000000000000000000000001800000000000000000000000000036000000000000000000000000000540000000000000000000000000006480000000000000000000000000064800000000000000000000000000555428571428571428571428571432737142857142857142857142857", + "1.000000000000000000000000000070000000000000000000000000002450000000000000000000000000057166666666666666666666666667667083333333333333333333333347339166666666666666666666666830068055555555555555555555557189569444444444444444444444458742065972222222222222222222", + "1.000000000000000000000000000080000000000000000000000000003200000000000000000000000000085333333333333333333333333335040000000000000000000000000027306666666666666666666666667030755555555555555555555555559716571428571428571428571428613038730158730158730158730158", + "1.00000000000000000000000000009000000000000000000000000000405000000000000000000000000012150000000000000000000000000273375000000000000000000000004920750000000000000000000000073811250000000000000000000000949001785714285714285714285724961984375" + ], + [ + "1", + "1.00000000000000000000000000000100000000000000000000000000000050000000000000000000000000000016666666666666666666666666666670833333333333333333333333333334166666666666666666666666666666805555555555555555555555555555575396825396825396825396825396827876984126984", + "1.000000000000000000000000000002000000000000000000000000000002000000000000000000000000000001333333333333333333333333333334000000000000000000000000000000266666666666666666666666666666755555555555555555555555555555580952380952380952380952380952387301587301587304", + "1.000000000000000000000000000003000000000000000000000000000004500000000000000000000000000004500000000000000000000000000003375000000000000000000000000002025000000000000000000000000001012500000000000000000000000000433928571428571428571428571428734151785714285719", + "1.000000000000000000000000000004000000000000000000000000000008000000000000000000000000000010666666666666666666666666666677333333333333333333333333333341866666666666666666666666666672355555555555555555555555555558806349206349206349206349206350831746031746031746", + "1.00000000000000000000000000000500000000000000000000000000001250000000000000000000000000002083333333333333333333333333335937500000000000000000000000002604166666666666666666666666668836805555555555555555555555557105654761904761904761904761905730716765873015873", + "1.000000000000000000000000000006000000000000000000000000000018000000000000000000000000000036000000000000000000000000000054000000000000000000000000000064800000000000000000000000000064800000000000000000000000000055542857142857142857142857142898799999999999999999", + "1.00000000000000000000000000000700000000000000000000000000002450000000000000000000000000005716666666666666666666666666676670833333333333333333333333347339166666666666666666666666683006805555555555555555555555571895694444444444444444444444458742065972222222222", + "1.00000000000000000000000000000800000000000000000000000000003200000000000000000000000000008533333333333333333333333333350400000000000000000000000000027306666666666666666666666666703075555555555555555555555555597165714285714285714285714285755895873015873015873", + "1.000000000000000000000000000009000000000000000000000000000040500000000000000000000000000121500000000000000000000000000273375000000000000000000000000492075000000000000000000000000738112500000000000000000000000949001785714285714285714285715353341294642857142859" + ], + [ + "1", + "1.000000000000000000000000000000100000000000000000000000000000005000000000000000000000000000000166666666666666666666666666666670833333333333333333333333333333416666666666666666666666666666668055555555555555555555555555555575396825396825396825396825396825644842", + "1.000000000000000000000000000000200000000000000000000000000000020000000000000000000000000000001333333333333333333333333333333400000000000000000000000000000002666666666666666666666666666666755555555555555555555555555555558095238095238095238095238095238158730159", + "1.000000000000000000000000000000300000000000000000000000000000045000000000000000000000000000004500000000000000000000000000000337500000000000000000000000000020250000000000000000000000000001012500000000000000000000000000043392857142857142857142857142858770089287", + "1.000000000000000000000000000000400000000000000000000000000000080000000000000000000000000000010666666666666666666666666666667733333333333333333333333333333418666666666666666666666666666672355555555555555555555555555555880634920634920634920634920634936888888889", + "1.000000000000000000000000000000500000000000000000000000000000125000000000000000000000000000020833333333333333333333333333335937500000000000000000000000000260416666666666666666666666666688368055555555555555555555555557105654761904761904761904761904858785962301", + "1.000000000000000000000000000000600000000000000000000000000000180000000000000000000000000000036000000000000000000000000000005400000000000000000000000000000648000000000000000000000000000064800000000000000000000000000005554285714285714285714285714286130857142859", + "1.00000000000000000000000000000070000000000000000000000000000024500000000000000000000000000005716666666666666666666666666667667083333333333333333333333333473391666666666666666666666666683006805555555555555555555555557189569444444444444444444444444587420659722", + "1.000000000000000000000000000000800000000000000000000000000000320000000000000000000000000000085333333333333333333333333333350400000000000000000000000000002730666666666666666666666666667030755555555555555555555555555597165714285714285714285714285718446730158732", + "1.000000000000000000000000000000900000000000000000000000000000405000000000000000000000000000121500000000000000000000000000027337500000000000000000000000004920750000000000000000000000000738112500000000000000000000000094900178571428571428571428571439247698660714" + ], + [ + "1", + "1.000000000000000000000000000000010000000000000000000000000000000050000000000000000000000000000000166666666666666666666666666666667083333333333333333333333333333334166666666666666666666666666666668055555555555555555555555555555557539682539682539682539682539682", + "1.000000000000000000000000000000020000000000000000000000000000000200000000000000000000000000000001333333333333333333333333333333340000000000000000000000000000000026666666666666666666666666666666755555555555555555555555555555555809523809523809523809523809523812", + "1.000000000000000000000000000000030000000000000000000000000000000450000000000000000000000000000004500000000000000000000000000000033750000000000000000000000000000202500000000000000000000000000001012500000000000000000000000000004339285714285714285714285714285728", + "1.000000000000000000000000000000040000000000000000000000000000000800000000000000000000000000000010666666666666666666666666666666773333333333333333333333333333334186666666666666666666666666666672355555555555555555555555555555588063492063492063492063492063492225", + "1.000000000000000000000000000000050000000000000000000000000000001250000000000000000000000000000020833333333333333333333333333333593750000000000000000000000000002604166666666666666666666666666688368055555555555555555555555555710565476190476190476190476190477159", + "1.000000000000000000000000000000060000000000000000000000000000001800000000000000000000000000000036000000000000000000000000000000540000000000000000000000000000006480000000000000000000000000000064800000000000000000000000000000555428571428571428571428571428575594", + "1.00000000000000000000000000000007000000000000000000000000000000245000000000000000000000000000005716666666666666666666666666666766708333333333333333333333333334733916666666666666666666666666683006805555555555555555555555555718956944444444444444444444444445874", + "1.000000000000000000000000000000080000000000000000000000000000003200000000000000000000000000000085333333333333333333333333333335040000000000000000000000000000027306666666666666666666666666667030755555555555555555555555555559716571428571428571428571428571470183", + "1.000000000000000000000000000000090000000000000000000000000000004050000000000000000000000000000121500000000000000000000000000002733750000000000000000000000000049207500000000000000000000000000738112500000000000000000000000009490017857142857142857142857142963907" + ], + [ + "1", + "1.000000000000000000000000000000001000000000000000000000000000000000500000000000000000000000000000000166666666666666666666666666666666708333333333333333333333333333333341666666666666666666666666666666668055555555555555555555555555555555753968253968253968253988", + "1.000000000000000000000000000000002000000000000000000000000000000002000000000000000000000000000000001333333333333333333333333333333334000000000000000000000000000000000266666666666666666666666666666666755555555555555555555555555555555580952380952380952380952383", + "1.00000000000000000000000000000000300000000000000000000000000000000450000000000000000000000000000000450000000000000000000000000000000337500000000000000000000000000000202500000000000000000000000000000101250000000000000000000000000000043392857142857142857142857", + "1.000000000000000000000000000000004000000000000000000000000000000008000000000000000000000000000000010666666666666666666666666666666677333333333333333333333333333333341866666666666666666666666666666672355555555555555555555555555555558806349206349206349206349208", + "1.000000000000000000000000000000005000000000000000000000000000000012500000000000000000000000000000020833333333333333333333333333333359375000000000000000000000000000026041666666666666666666666666666688368055555555555555555555555555571056547619047619047619047618", + "1.00000000000000000000000000000000600000000000000000000000000000001800000000000000000000000000000003600000000000000000000000000000005400000000000000000000000000000006480000000000000000000000000000006480000000000000000000000000000005554285714285714285714285714", + "1.000000000000000000000000000000007000000000000000000000000000000024500000000000000000000000000000057166666666666666666666666666666766708333333333333333333333333333473391666666666666666666666666666830068055555555555555555555555555718956944444444444444444444443", + "1.000000000000000000000000000000008000000000000000000000000000000032000000000000000000000000000000085333333333333333333333333333333504000000000000000000000000000000273066666666666666666666666666667030755555555555555555555555555555971657142857142857142857142858", + "1.000000000000000000000000000000009000000000000000000000000000000040500000000000000000000000000000121500000000000000000000000000000273375000000000000000000000000000492075000000000000000000000000000738112500000000000000000000000000949001785714285714285714285715" + ], + [ + "1", + "1.000000000000000000000000000000000100000000000000000000000000000000005000000000000000000000000000000000166666666666666666666666666666666670833333333333333333333333333333333416666666666666666666666666666666668055555555555555555555555555555555575396825396825398", + "1.000000000000000000000000000000000200000000000000000000000000000000020000000000000000000000000000000001333333333333333333333333333333333400000000000000000000000000000000002666666666666666666666666666666666755555555555555555555555555555555558095238095238095238", + "1.000000000000000000000000000000000300000000000000000000000000000000045000000000000000000000000000000004500000000000000000000000000000000337500000000000000000000000000000020250000000000000000000000000000001012500000000000000000000000000000043392857142857142855", + "1.000000000000000000000000000000000400000000000000000000000000000000080000000000000000000000000000000010666666666666666666666666666666667733333333333333333333333333333333418666666666666666666666666666666672355555555555555555555555555555555880634920634920634923", + "1.000000000000000000000000000000000500000000000000000000000000000000125000000000000000000000000000000020833333333333333333333333333333335937500000000000000000000000000000260416666666666666666666666666666688368055555555555555555555555555557105654761904761904763", + "1.000000000000000000000000000000000600000000000000000000000000000000180000000000000000000000000000000036000000000000000000000000000000005400000000000000000000000000000000648000000000000000000000000000000064800000000000000000000000000000005554285714285714285715", + "1.000000000000000000000000000000000700000000000000000000000000000000245000000000000000000000000000000057166666666666666666666666666666676670833333333333333333333333333334733916666666666666666666666666666830068055555555555555555555555555571895694444444444444448", + "1.000000000000000000000000000000000800000000000000000000000000000000320000000000000000000000000000000085333333333333333333333333333333350400000000000000000000000000000002730666666666666666666666666666667030755555555555555555555555555555597165714285714285714288", + "1.00000000000000000000000000000000090000000000000000000000000000000040500000000000000000000000000000012150000000000000000000000000000002733750000000000000000000000000000492075000000000000000000000000000073811250000000000000000000000000009490017857142857142858" + ] +]; + +const E = roundOff('2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921817413596629043572900334295260595630738132328627943490763233829880753195251019011573834187930702154089149934884167509244761460668082264', 257); +const LN2 = '0.69314718055994530941723212145818'; +const LOG2E = '1.44269504088896340735992468100188'; +const LN10 = '2.30258509299404568392825848336901'; +const LOG10E = '0.43429448190325182766805360691429'; +function Euler(precision = 32) { + precision = Math.max(16, precision); + let result = '1'; + let n = '1'; + let f = '1'; + while (true) { + f = multiply(f, n); + const next = divide('1', f, precision + 2); + if (lessThan(abs(next), tolerance(precision))) { + return roundOff(result, precision); + } + result = add(result, next); + n = add(n, '1'); + } +} +function exp(exponent) { + exponent = exponent.toString(); + const remainder = exponent.split('.')[1]; + let result = pow(E, abs(exponent).split('.')[0], 33); + let fractionalExponent = '1'; + if (remainder) { + for (let i = 0; i < Math.min(33, remainder.length); i++) { + fractionalExponent = multiply(fractionalExponent, E_ROOTS_FOR_POW[i][remainder[i]]); + } + result = multiply(result, fractionalExponent); + } + return pow(E, exponent, 33); +} +function expm1(exponent) { + exponent = exponent.toString(); + return subtract(exp(exponent), '1'); +} +function ln(x = 2) { + x = x.toString(); + if (lessThan(x, '0', true)) { + throw "[ln]: x must be greater than 0"; + } + if (equals(x, '1')) { + return '0'; // ln(1) = 0 + } + let result = '0'; + let term = divide(subtract(x, '1'), add(x, '1'), 33); + let i = 0; + while (true) { + i++; + let iteration = subtract(multiply('2', i), '1'); + let next = multiply(divide('1', iteration, 33), pow(term, iteration)); + if (lessThan(next, tolerance(33))) { + return roundOff(multiply('2', add(result, next)), 32); + } + result = add(result, next); } - bigDecimal.validate = function (number) { +} +function ln2(x = 2) { + x = x.toString(); + if (lessThan(x, '0', true)) { + throw "[ln2]: x must be greater than 0"; + } + let result = '0'; + while (greaterThan(x, '2', true)) { + x = divide(x, 2, 33); + result = add(result, '1'); + } + return roundOff(add(result, divide(ln(x), LN2, 33)), 32); +} +function log(base) { + base = base.toString(); + return roundOff(multiply(ln2(base), LN2), 32); +} +function log10(base) { + base = base.toString(); + return divide(log(base), LN10, 32); +} + +// PI up to the first 64 decimal places +const PI = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229'; +// Hypotenuse +function hypot(a, b) { + a = a.toString(); + b = b.toString(); + return sqRoot(add(pow(a, '2'), add(pow(b, '2')))); +} +// Sine functions +function sin(x) { + x = x.toString(); + if (greaterThan(abs(x), PI)) { + let r = divide(x, PI, 33).split('.'); + x = stripTrailingZero(roundOff(multiply(pow(negate(sign(x).toString()), r[0]), multiply(PI, (r[1]) ? '0.' + r[1] : '0')), 32)); + } + let result = '0'; + let _sign = '1'; + let n = '1'; // Series iteration + let f = '1'; // Factorial product + while (true) { + const N = subtract(multiply(n, '2'), '1'); // Next real term in series (even terms cancel) + f = multiply(f, N); + const next = multiply(_sign, divide(pow(x, N, 33), f, 34)); + if (lessThan(abs(next), tolerance(33))) { + result = add(result, next); + return stripTrailingZero(isAproxZero(result) ? '0' : isAproxOne(result) ? multiply('1', sign(result).toString()) : result); + } + result = add(result, next); + _sign = negate(_sign); + f = multiply(f, multiply(n, '2')); // Iterate once to synchronize Factorial + n = add(n, '1'); + } +} +function asin(x) { + x = x.toString(); + if (greaterThan(abs(x), '1')) { + throw Error('[Arcsine]: argument x is out of range.'); + } + let result = '0'; + let n = '1'; + let even = '1'; + let odd = '1'; + while (true) { + const N = multiply(n, '2'); + const R = add(N, '1'); + even = multiply(even, N); + odd = multiply(odd, subtract(N, '1')); + let next = divide(multiply(odd, pow(x, R)), multiply(even, R), 34); + if (lessThan(next, tolerance(33))) { + result = add(result, next); + return stripTrailingZero(roundOff(add(result, x), 32)); + } + result = add(result, next); + n = add(n, '1'); + } +} +function sinh(x) { + x = x.toString(); + return stripTrailingZero(subtract(divide(exp(x), '2', 33), divide(exp(negate(x)), '2', 33))); +} +// Cosine functions +function cos(x) { + x = x.toString(); + if (greaterThan(abs(x), PI)) { + let r = divide(x, PI, 33).split('.'); + x = stripTrailingZero(roundOff(multiply(pow(negate(sign(x).toString()), r[0]), multiply(PI, (r[1]) ? '0.' + r[1] : '0')), 32)); + } + let result = '0'; + let _sign = '1'; + let n = '1'; // Series iteration + let f = '1'; // Factorial product + while (true) { + const N = multiply(n, '2'); // Next real term in series (odd terms cancel) + f = multiply(f, subtract(N, '1')); // Iterate once to synchronize Factorial + f = multiply(f, N); + const next = multiply(_sign, divide(pow(x, N, 33), f, 34)); + if (lessThan(abs(next), tolerance(33))) { + result = subtract('1', add(result, next)); + return stripTrailingZero(isAproxOne(result) ? multiply('1', sign(result).toString()) : isAproxZero(result) ? '0' : result); + } + result = add(result, next); + _sign = negate(_sign); + n = add(n, '1'); + } +} +function acos(x) { + x = x.toString(); + if (greaterThan(abs(x), '1')) { + throw Error('[Arccosine]: argument x is out of range.'); + } + return stripTrailingZero(subtract(divide(PI, 2, 32), asin(x))); +} +function cosh(x) { + x = x.toString(); + return stripTrailingZero(divide(add(exp(x), exp(negate(x))), '2', 32)); +} +// Tangant functions +function tan(x) { + x = x.toString(); + return stripTrailingZero(divide(sin(x), cos(x), 32)); +} +function atan(x) { + x = x.toString(); + if (greaterThan(abs(x), '1')) { + return stripTrailingZero(subtract(divide(PI, 2, 33), atan(divide(1, x, 33)))); + } + let result = '0'; + let n = '0'; + while (true) { + let N = multiply('2', n); + let next = divide(multiply(pow('-1', n), pow(x, add(N, '1'))), add(N, '1'), 32); + if (lessThan(abs(next), tolerance(33))) { + return stripTrailingZero(roundOff(add(result, next), 32)); + } + result = add(result, next); + n = add(n, '1'); + } +} +function atan2(y, x) { + x = x.toString(); + y = y.toString(); + let offset = '0'; + if (isExatclyZero(x) && isExatclyZero(y)) { + return '0'; + } + if (isExatclyZero(x) && greaterThan(y, '0')) { + return stripTrailingZero(roundOff(divide(PI, 2, 33), 32)); + } + if (isExatclyZero(x) && lessThan(y, '0')) { + return stripTrailingZero(roundOff(negate(divide(PI, 2, 33)), 32)); + } + if (lessThan(x, '0')) { + offset = (greaterThan(y, '0', true)) ? PI : negate(PI); + } + return stripTrailingZero(roundOff(add(atan(divide(y, x, 33)), offset), 32)); +} +function tanh(x) { + x = x.toString(); + return stripTrailingZero(divide(sinh(x), cosh(x), 32)); +} + +class bigDecimal { + value; + static RoundingModes = RoundingModes; + static validate(number) { if (number) { number = number.toString(); - if (isNaN(number)) + if (isNaN(Number(number))) throw Error("Parameter is not a number: " + number); if (number[0] == "+") number = number.substring(1); @@ -562,48 +1489,50 @@ var bigDecimal = /** @class */ (function () { if (number.startsWith(".")) number = "0" + number; else if (number.startsWith("-.")) - number = "-0" + number.substr(1); - //handle exponentiation + number = "-0" + number.substring(1); + //handle exponentiation (scientific notation) if (/e/i.test(number)) { - var _a = number.split(/[eE]/), mantisa = _a[0], exponent = _a[1]; + let [mantisa, exponent] = number.split(/[eE]/); + let exponentIndex = Number(exponent); mantisa = trim(mantisa); - var sign = ""; + let sign = ""; if (mantisa[0] == "-") { sign = "-"; mantisa = mantisa.substring(1); } if (mantisa.indexOf(".") >= 0) { - exponent = parseInt(exponent) + mantisa.indexOf("."); + exponentIndex = parseInt(exponent) + mantisa.indexOf("."); mantisa = mantisa.replace(".", ""); } else { - exponent = parseInt(exponent) + mantisa.length; + exponentIndex = parseInt(exponent) + mantisa.length; } - if (mantisa.length < exponent) { + if (mantisa.length < exponentIndex) { number = - sign + mantisa + new Array(exponent - mantisa.length + 1).join("0"); + sign + mantisa + new Array(exponentIndex - mantisa.length + 1).join("0"); } - else if (mantisa.length >= exponent && exponent > 0) { + else if (mantisa.length >= exponentIndex && exponentIndex > 0) { number = sign + - trim(mantisa.substring(0, exponent)) + - (mantisa.length > exponent ? "." + mantisa.substring(exponent) : ""); + trim(mantisa.substring(0, exponentIndex)) + + (mantisa.length > exponentIndex ? "." + mantisa.substring(exponentIndex) : ""); } else { - number = sign + "0." + new Array(-exponent + 1).join("0") + mantisa; + number = sign + "0." + new Array(-exponentIndex + 1).join("0") + mantisa; } } return number; - }; - bigDecimal.prototype.getValue = function () { + } + constructor(number = "0") { + this.value = bigDecimal.validate(number); + } + getValue() { return this.value; - }; - bigDecimal.prototype.setValue = function (num) { + } + setValue(num) { this.value = bigDecimal.validate(num); - }; - bigDecimal.getPrettyValue = function (number, digits, separator) { - if (digits === void 0) { digits = 3; } - if (separator === void 0) { separator = ","; } + } + static getPrettyValue(number, digits = 3, separator = ",") { // if (!(digits || separator)) { // digits = 3; // separator = ','; @@ -611,7 +1540,7 @@ var bigDecimal = /** @class */ (function () { // throw Error('Illegal Arguments. Should pass both digits and separator or pass none'); // } number = bigDecimal.validate(number); - var neg = number.charAt(0) == "-"; + let neg = number.charAt(0) == "-"; if (neg) number = number.substring(1); var len = number.indexOf("."); @@ -630,122 +1559,292 @@ var bigDecimal = /** @class */ (function () { temp; } return (neg ? "-" : "") + temp + number.substring(len); - }; - bigDecimal.prototype.getPrettyValue = function (digits, separator) { - if (digits === void 0) { digits = 3; } - if (separator === void 0) { separator = ","; } + } + getPrettyValue(digits = 3, separator = ",") { return bigDecimal.getPrettyValue(this.value, digits, separator); - }; - bigDecimal.round = function (number, precision, mode) { - if (precision === void 0) { precision = 0; } - if (mode === void 0) { mode = RoundingModes.HALF_EVEN; } + } + static round(number, precision = 0, mode = RoundingModes.HALF_EVEN) { number = bigDecimal.validate(number); // console.log(number) if (isNaN(precision)) throw Error("Precision is not a number: " + precision); return roundOff(number, precision, mode); - }; - bigDecimal.prototype.round = function (precision, mode) { - if (precision === void 0) { precision = 0; } - if (mode === void 0) { mode = RoundingModes.HALF_EVEN; } + } + round(precision = 0, mode = RoundingModes.HALF_EVEN) { if (isNaN(precision)) throw Error("Precision is not a number: " + precision); return new bigDecimal(roundOff(this.value, precision, mode)); - }; - bigDecimal.abs = function (number) { + } + static abs(number) { number = bigDecimal.validate(number); return abs(number); - }; - bigDecimal.prototype.abs = function () { + } + abs() { return new bigDecimal(abs(this.value)); - }; - bigDecimal.floor = function (number) { + } + static floor(number) { number = bigDecimal.validate(number); if (number.indexOf(".") === -1) return number; return bigDecimal.round(number, 0, RoundingModes.FLOOR); - }; - bigDecimal.prototype.floor = function () { + } + floor() { if (this.value.indexOf(".") === -1) return new bigDecimal(this.value); return new bigDecimal(this.value).round(0, RoundingModes.FLOOR); - }; - bigDecimal.ceil = function (number) { + } + static ceil(number) { number = bigDecimal.validate(number); if (number.indexOf(".") === -1) return number; return bigDecimal.round(number, 0, RoundingModes.CEILING); - }; - bigDecimal.prototype.ceil = function () { + } + ceil() { if (this.value.indexOf(".") === -1) return new bigDecimal(this.value); return new bigDecimal(this.value).round(0, RoundingModes.CEILING); - }; - bigDecimal.add = function (number1, number2) { + } + static add(number1, number2) { number1 = bigDecimal.validate(number1); number2 = bigDecimal.validate(number2); return add(number1, number2); - }; - bigDecimal.prototype.add = function (number) { + } + add(number) { return new bigDecimal(add(this.value, number.getValue())); - }; - bigDecimal.subtract = function (number1, number2) { + } + static subtract(number1, number2) { number1 = bigDecimal.validate(number1); number2 = bigDecimal.validate(number2); return subtract(number1, number2); - }; - bigDecimal.prototype.subtract = function (number) { + } + subtract(number) { return new bigDecimal(subtract(this.value, number.getValue())); - }; - bigDecimal.multiply = function (number1, number2) { + } + static multiply(number1, number2) { number1 = bigDecimal.validate(number1); number2 = bigDecimal.validate(number2); return multiply(number1, number2); - }; - bigDecimal.prototype.multiply = function (number) { + } + multiply(number) { return new bigDecimal(multiply(this.value, number.getValue())); - }; - bigDecimal.divide = function (number1, number2, precision) { + } + static divide(number1, number2, precision) { number1 = bigDecimal.validate(number1); number2 = bigDecimal.validate(number2); return divide(number1, number2, precision); - }; - bigDecimal.prototype.divide = function (number, precision) { + } + divide(number, precision) { return new bigDecimal(divide(this.value, number.getValue(), precision)); - }; - bigDecimal.modulus = function (number1, number2) { + } + static modulus(number1, number2) { number1 = bigDecimal.validate(number1); number2 = bigDecimal.validate(number2); return modulus(number1, number2); - }; - bigDecimal.prototype.modulus = function (number) { + } + modulus(number) { return new bigDecimal(modulus(this.value, number.getValue())); - }; - bigDecimal.compareTo = function (number1, number2) { + } + static modulusE(number1, number2) { number1 = bigDecimal.validate(number1); number2 = bigDecimal.validate(number2); - return compareTo(number1, number2); - }; - bigDecimal.prototype.compareTo = function (number) { - return compareTo(this.value, number.getValue()); - }; - bigDecimal.negate = function (number) { + return modulusE(number1, number2); + } + modulusE(number) { + return new bigDecimal(modulusE(this.value, number.getValue())); + } + static negate(number) { number = bigDecimal.validate(number); return negate(number); - }; - bigDecimal.prototype.negate = function () { + } + negate() { return new bigDecimal(negate(this.value)); - }; - bigDecimal.stripTrailingZero = function (number) { + } + // Powers + static pow(base, exponent) { + base = bigDecimal.validate(base); + exponent = bigDecimal.validate(exponent); + return pow(base, exponent); + } + pow(exponent) { + return new bigDecimal(pow(this.value, exponent.getValue(), 32)); + } + // Roots + static get SQRT1_2() { + return sqRoot('.5'); + } + static get SQRT2() { + return sqRoot('2'); + } + static sqRoot(number) { + number = bigDecimal.validate(number); + return sqRoot(number); + } + sqRoot() { + return new bigDecimal(sqRoot(this.value)); + } + static cbRoot(number) { + number = bigDecimal.validate(number); + return cbRoot(number); + } + cbRoot() { + return new bigDecimal(cbRoot(this.value)); + } + // Logarithms + static get E() { + return Euler(32); + } + static get LN2() { + return LN2; + } + static get LN10() { + return LN10; + } + static get LOG2E() { + return LOG2E; + } + static get LOG10E() { + return LOG10E; + } + static log2(number) { + number = bigDecimal.validate(number); + return ln2(number); + } + static log10(number) { + number = bigDecimal.validate(number); + return log10(number); + } + static log1p(number) { + number = bigDecimal.validate(number); + return log(add('1', number)); + } + static log(number) { + number = bigDecimal.validate(number); + return log(number); + } + static exp(number) { + number = bigDecimal.validate(number); + return exp(number); + } + static expm1(number) { + number = bigDecimal.validate(number); + return expm1(number); + } + // Trig + static hypot(a, b) { + a = bigDecimal.validate(a); + b = bigDecimal.validate(b); + return hypot(a, b); + } + static sin(number) { + number = bigDecimal.validate(number); + return sin(number); + } + static sinh(number) { + number = bigDecimal.validate(number); + return sinh(number); + } + static asin(number) { + number = bigDecimal.validate(number); + return asin(number); + } + static cos(number) { + number = bigDecimal.validate(number); + return cos(number); + } + static cosh(number) { + number = bigDecimal.validate(number); + return cosh(number); + } + static acos(number) { + number = bigDecimal.validate(number); + return acos(number); + } + static tan(number) { + number = bigDecimal.validate(number); + return tan(number); + } + static tanh(number) { + number = bigDecimal.validate(number); + return tanh(number); + } + static atan(number) { + number = bigDecimal.validate(number); + return atan(number); + } + static atan2(y, x) { + x = bigDecimal.validate(x); + y = bigDecimal.validate(y); + return atan2(y, x); + } + // Comparisons + static compareTo(number1, number2) { + number1 = bigDecimal.validate(number1); + number2 = bigDecimal.validate(number2); + return compareTo(number1, number2); + } + compareTo(number) { + return compareTo(this.value, number.getValue()); + } + static equals(number1, number2) { + number1 = bigDecimal.validate(number1); + number2 = bigDecimal.validate(number2); + return equals(number1, number2); + } + equals(number) { + return equals(this.value, number.getValue()); + } + static lt(number1, number2) { + number1 = bigDecimal.validate(number1); + number2 = bigDecimal.validate(number2); + return lessThan(number1, number2); + } + lt(number) { + return lessThan(this.value, number.getValue()); + } + static leq(number1, number2) { + number1 = bigDecimal.validate(number1); + number2 = bigDecimal.validate(number2); + return lessThan(number1, number2, true); + } + leq(number) { + return lessThan(this.value, number.getValue(), true); + } + static gt(number1, number2) { + number1 = bigDecimal.validate(number1); + number2 = bigDecimal.validate(number2); + return greaterThan(number1, number2); + } + gt(number) { + return greaterThan(this.value, number.getValue()); + } + static geq(number1, number2) { + number1 = bigDecimal.validate(number1); + number2 = bigDecimal.validate(number2); + return greaterThan(number1, number2, true); + } + geq(number) { + return greaterThan(this.value, number.getValue(), true); + } + static sign(number) { + number = bigDecimal.validate(number); + return sign(number); + } + sign() { + return sign(this.value); + } + // Misc. + static factorial(number) { + number = bigDecimal.validate(number); + return factorial(number); + } + static stripTrailingZero(number) { number = bigDecimal.validate(number); return stripTrailingZero(number); - }; - bigDecimal.prototype.stripTrailingZero = function () { + } + stripTrailingZero() { return new bigDecimal(stripTrailingZero(this.value)); - }; - bigDecimal.RoundingModes = RoundingModes; - return bigDecimal; -}()); + } +} export { bigDecimal as default }; //# sourceMappingURL=big-decimal.js.map diff --git a/dist/esm/big-decimal.js.map b/dist/esm/big-decimal.js.map index 1357735..3f1650a 100644 --- a/dist/esm/big-decimal.js.map +++ b/dist/esm/big-decimal.js.map @@ -1 +1 @@ -{"version":3,"file":"big-decimal.js","sources":["../../../src/add.ts","../../../src/abs.ts","../../../src/roundingModes.ts","../../../src/round.ts","../../../src/stripTrailingZero.ts","../../../src/multiply.ts","../../../src/divide.ts","../../../src/subtract.ts","../../../src/modulus.ts","../../../src/compareTo.ts","../../../src/big-decimal.ts"],"sourcesContent":["//function add {\r\nexport function add(number1: string, number2 = \"0\") {\r\n let neg = 0,\r\n ind = -1,\r\n neg_len;\r\n\r\n //check for negatives\r\n if (number1[0] == \"-\") {\r\n number1 = number1.substring(1);\r\n if (!testZero(number1)) {\r\n neg++;\r\n ind = 1;\r\n neg_len = number1.length;\r\n }\r\n }\r\n if (number2[0] == \"-\") {\r\n number2 = number2.substring(1);\r\n if (!testZero(number2)) {\r\n neg++;\r\n ind = 2;\r\n neg_len = number2.length;\r\n }\r\n }\r\n\r\n number1 = trim(number1);\r\n number2 = trim(number2);\r\n\r\n [number1, number2] = pad(trim(number1), trim(number2));\r\n\r\n if (neg == 1) {\r\n if (ind === 1) number1 = compliment(number1);\r\n else if (ind === 2) number2 = compliment(number2);\r\n }\r\n\r\n let res = addCore(number1, number2);\r\n if (!neg) return trim(res);\r\n else if (neg == 2) return \"-\" + trim(res);\r\n else {\r\n if (number1.length < res.length) return trim(res.substring(1));\r\n else return \"-\" + trim(compliment(res));\r\n }\r\n}\r\n\r\nfunction compliment(number: string) {\r\n if (testZero(number)) {\r\n return number;\r\n }\r\n\r\n let s = \"\",\r\n l = number.length,\r\n dec = number.split(\".\")[1],\r\n ld = dec ? dec.length : 0;\r\n\r\n for (let i = 0; i < l; i++) {\r\n if (number[i] >= \"0\" && number[i] <= \"9\") s += 9 - parseInt(number[i]);\r\n else s += number[i];\r\n }\r\n\r\n let one = ld > 0 ? \"0.\" + new Array(ld).join(\"0\") + \"1\" : \"1\";\r\n\r\n return addCore(s, one);\r\n}\r\n\r\nexport function trim(number: string) {\r\n let parts = number.split(\".\");\r\n\r\n if (!parts[0]) parts[0] = \"0\";\r\n\r\n while (parts[0][0] == \"0\" && parts[0].length > 1)\r\n parts[0] = parts[0].substring(1);\r\n\r\n return parts[0] + (parts[1] ? \".\" + parts[1] : \"\");\r\n}\r\n\r\nexport function pad(number1: string, number2: string) {\r\n let parts1 = number1.split(\".\"),\r\n parts2 = number2.split(\".\");\r\n\r\n //pad integral part\r\n let length1 = parts1[0].length,\r\n length2 = parts2[0].length;\r\n if (length1 > length2) {\r\n parts2[0] =\r\n new Array(Math.abs(length1 - length2) + 1).join(\"0\") +\r\n (parts2[0] ? parts2[0] : \"\");\r\n } else {\r\n parts1[0] =\r\n new Array(Math.abs(length1 - length2) + 1).join(\"0\") +\r\n (parts1[0] ? parts1[0] : \"\");\r\n }\r\n\r\n //pad fractional part\r\n (length1 = parts1[1] ? parts1[1].length : 0),\r\n (length2 = parts2[1] ? parts2[1].length : 0);\r\n if (length1 || length2) {\r\n if (length1 > length2) {\r\n parts2[1] =\r\n (parts2[1] ? parts2[1] : \"\") +\r\n new Array(Math.abs(length1 - length2) + 1).join(\"0\");\r\n } else {\r\n parts1[1] =\r\n (parts1[1] ? parts1[1] : \"\") +\r\n new Array(Math.abs(length1 - length2) + 1).join(\"0\");\r\n }\r\n }\r\n\r\n number1 = parts1[0] + (parts1[1] ? \".\" + parts1[1] : \"\");\r\n number2 = parts2[0] + (parts2[1] ? \".\" + parts2[1] : \"\");\r\n\r\n return [number1, number2];\r\n}\r\n\r\nfunction addCore(number1: string, number2: string) {\r\n [number1, number2] = pad(number1, number2);\r\n\r\n let sum = \"\",\r\n carry = 0;\r\n\r\n for (let i = number1.length - 1; i >= 0; i--) {\r\n if (number1[i] === \".\") {\r\n sum = \".\" + sum;\r\n continue;\r\n }\r\n let temp = parseInt(number1[i]) + parseInt(number2[i]) + carry;\r\n sum = (temp % 10) + sum;\r\n carry = Math.floor(temp / 10);\r\n }\r\n\r\n return carry ? carry.toString() + sum : sum;\r\n}\r\n\r\nfunction testZero(number: string) {\r\n return /^0[0]*[.]{0,1}[0]*$/.test(number);\r\n}\r\n","export function abs(n: number | string | bigint) {\r\n if (typeof n == \"number\" || typeof n == \"bigint\") n = n.toString();\r\n if (n[0] == \"-\") return n.substring(1);\r\n return n;\r\n}\r\n","export enum RoundingModes {\r\n /**\r\n * Rounding mode to round towards positive infinity.\r\n */\r\n CEILING,\r\n\r\n /**\r\n * Rounding mode to round towards zero.\r\n */\r\n DOWN,\r\n\r\n /**\r\n * Rounding mode to round towards negative infinity.\r\n */\r\n FLOOR,\r\n\r\n /**\r\n * Rounding mode to round towards \"nearest neighbor\" unless both neighbors are equidistant, \r\n * in which case round down.\r\n */\r\n HALF_DOWN,\r\n\r\n /**\r\n * Rounding mode to round towards the \"nearest neighbor\" unless both neighbors are equidistant, \r\n * in which case, round towards the even neighbor.\r\n */\r\n HALF_EVEN,\r\n\r\n /**\r\n * Rounding mode to round towards \"nearest neighbor\" unless both neighbors are equidistant, \r\n * in which case round up.\r\n */\r\n HALF_UP,\r\n\r\n /**\r\n * Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary.\r\n * UNIMPLEMENTED\r\n */\r\n UNNECESSARY,\r\n\r\n /**\r\n * Rounding mode to round away from zero.\r\n */\r\n UP\r\n}\r\n\r\n","import { RoundingModes } from './roundingModes';\r\n/**\r\n * \r\n * @param input the number to round\r\n * @param n precision\r\n * @param mode Rounding Mode\r\n */\r\nexport function roundOff(input: number | string | bigint, n: number = 0, mode=RoundingModes.HALF_EVEN) {\r\n if (mode === RoundingModes.UNNECESSARY) {\r\n throw new Error(\"UNNECESSARY Rounding Mode has not yet been implemented\");\r\n }\r\n\r\n if (typeof (input) == 'number' || typeof (input) == 'bigint')\r\n input = input.toString();\r\n\r\n let neg = false;\r\n if (input[0] === '-') {\r\n neg = true;\r\n input = input.substring(1);\r\n }\r\n\r\n let parts = input.split('.'),\r\n partInt = parts[0],\r\n partDec = parts[1];\r\n\r\n //handle case of -ve n: roundOff(12564,-2)=12600\r\n if (n < 0) {\r\n n = -n;\r\n if (partInt.length <= n)\r\n return '0';\r\n else {\r\n let prefix = partInt.substr(0, partInt.length - n);\r\n input = prefix + '.' + partInt.substr(partInt.length - n) + partDec;\r\n prefix = roundOff(input, 0, mode);\r\n return (neg ? '-' : '') + prefix + (new Array(n + 1).join('0'));\r\n }\r\n }\r\n\r\n\r\n // handle case when integer output is desired\r\n if (n == 0) {\r\n let l = partInt.length;\r\n if (greaterThanFive(parts[1], partInt, neg, mode)) {\r\n partInt = increment(partInt);\r\n }\r\n return (neg&&parseInt(partInt) ? '-' : '') + partInt;\r\n }\r\n\r\n\r\n // handle case when n>0\r\n if (!parts[1]) {\r\n return (neg ? '-' : '') + partInt + '.' + (new Array(n + 1).join('0'));\r\n } else if (parts[1].length < n) {\r\n return (neg ? '-' : '') + partInt + '.' + parts[1] + (new Array(n - parts[1].length + 1).join('0'));\r\n }\r\n\r\n partDec = parts[1].substring(0, n);\r\n let rem = parts[1].substring(n);\r\n\r\n if (rem && greaterThanFive(rem, partDec, neg, mode)) {\r\n partDec = increment(partDec);\r\n if (partDec.length > n) {\r\n return (neg ? '-' : '') + increment(partInt, parseInt(partDec[0])) + '.' + partDec.substring(1);\r\n }\r\n }\r\n return (neg&&(parseInt(partInt) || parseInt(partDec)) ? '-' : '') + partInt + '.' + partDec;\r\n}\r\n\r\nfunction greaterThanFive(part: string, pre: string, neg: boolean, mode: RoundingModes) {\r\n if (!part || part === new Array(part.length + 1).join('0'))\r\n return false;\r\n\r\n // #region UP, DOWN, CEILING, FLOOR \r\n if (mode === RoundingModes.DOWN || (!neg && mode === RoundingModes.FLOOR) ||\r\n (neg && mode === RoundingModes.CEILING))\r\n return false;\r\n\r\n if (mode === RoundingModes.UP || (neg && mode === RoundingModes.FLOOR) ||\r\n (!neg && mode === RoundingModes.CEILING))\r\n return true;\r\n // #endregion\r\n\r\n // case when part !== five\r\n let five = '5' + (new Array(part.length).join('0'));\r\n if (part > five)\r\n return true;\r\n else if (part < five)\r\n return false;\r\n\r\n // case when part === five\r\n switch (mode) {\r\n case RoundingModes.HALF_DOWN: return false;\r\n case RoundingModes.HALF_UP: return true;\r\n case RoundingModes.HALF_EVEN:\r\n default: return (parseInt(pre[pre.length - 1]) % 2 == 1)\r\n }\r\n}\r\n\r\nfunction increment(part, c: number = 0) {\r\n if (!c)\r\n c = 1;\r\n if (typeof (part) == 'number')\r\n part.toString();\r\n\r\n let l = part.length - 1,\r\n s = '';\r\n\r\n for (let i = l; i >= 0; i--) {\r\n let x = parseInt(part[i]) + c;\r\n if (x == 10) {\r\n c = 1; x = 0;\r\n } else {\r\n c = 0;\r\n }\r\n s += x;\r\n }\r\n if (c)\r\n s += c;\r\n\r\n return s.split('').reverse().join('');\r\n}","/*\r\n* Removes zero from front and back*/\r\nexport function stripTrailingZero(number) {\r\n\tconst isNegative = number[0] === '-';\r\n\tif (isNegative) {\r\n\t\tnumber = number.substr(1);\r\n\t}\r\n\twhile (number[0] == '0') {\r\n\t\tnumber = number.substr(1);\r\n\t}\r\n\tif (number.indexOf('.') != -1) {\r\n\t\twhile (number[number.length - 1] == '0') {\r\n\t\t\tnumber = number.substr(0, number.length - 1);\r\n\t\t}\r\n\t}\r\n\tif (number == \"\" || number == \".\") {\r\n\t\tnumber = '0';\r\n\t} else if (number[number.length - 1] == '.') {\r\n\t\tnumber = number.substr(0, number.length - 1);\r\n\t}\r\n\tif (number[0] == '.') {\r\n\t\tnumber = '0' + number;\r\n\t}\r\n\tif (isNegative && number != '0') {\r\n\t\tnumber = '-' + number;\r\n\t}\r\n\treturn number;\r\n}","import { stripTrailingZero } from \"./stripTrailingZero\"\r\n\r\nexport function multiply(number1, number2) {\r\n\tnumber1 = number1.toString();\r\n\tnumber2 = number2.toString();\r\n\r\n\t/*Filter numbers*/\r\n\tlet negative = 0;\r\n\tif (number1[0] == '-') {\r\n\t\tnegative++;\r\n\t\tnumber1 = number1.substr(1);\r\n\t}\r\n\tif (number2[0] == '-') {\r\n\t\tnegative++;\r\n\t\tnumber2 = number2.substr(1);\r\n\t}\r\n\tnumber1 = stripTrailingZero(number1);\r\n\tnumber2 = stripTrailingZero(number2);\r\n\tlet decimalLength1 = 0;\r\n\tlet decimalLength2 = 0;\r\n\r\n\tif (number1.indexOf('.') != -1) {\r\n\t\tdecimalLength1 = number1.length - number1.indexOf('.') - 1;\r\n\t}\r\n\r\n\tif (number2.indexOf('.') != -1) {\r\n\t\tdecimalLength2 = number2.length - number2.indexOf('.') - 1;\r\n\t}\r\n\tlet decimalLength = decimalLength1 + decimalLength2;\r\n\tnumber1 = stripTrailingZero(number1.replace('.', ''));\r\n\tnumber2 = stripTrailingZero(number2.replace('.', ''));\r\n\r\n\tif (number1.length < number2.length) {\r\n\t\tlet temp = number1;\r\n\t\tnumber1 = number2;\r\n\t\tnumber2 = temp;\r\n\t}\r\n\r\n\tif (number2 == '0') {\r\n\t\treturn '0';\r\n\t}\r\n\r\n\t/*\r\n\t* Core multiplication\r\n\t*/\r\n\tlet length = number2.length;\r\n\tlet carry = 0;\r\n\tlet positionVector = [];\r\n\tlet currentPosition = length - 1;\r\n\r\n\tlet result = \"\";\r\n\tfor (let i = 0; i < length; i++) {\r\n\t\tpositionVector[i] = number1.length - 1;\r\n\t}\r\n\tfor (let i = 0; i < 2 * number1.length; i++) {\r\n\t\tlet sum = 0;\r\n\t\tfor (let j = number2.length - 1; j >= currentPosition && j >= 0; j--) {\r\n\t\t\tif (positionVector[j] > -1 && positionVector[j] < number1.length) {\r\n\t\t\t\tsum += parseInt(number1[positionVector[j]--]) * parseInt(number2[j]);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsum += carry;\r\n\t\tcarry = Math.floor(sum / 10);\r\n\t\tresult = sum % 10 + result;\r\n\t\tcurrentPosition--;\r\n\t}\r\n\t/*\r\n\t* Formatting result\r\n\t*/\r\n\tresult = stripTrailingZero(adjustDecimal(result, decimalLength));\r\n\tif (negative == 1) {\r\n\t\tresult = '-' + result;\r\n\t}\r\n\treturn result;\r\n}\r\n\r\n/*\r\n* Add decimal point\r\n*/\r\nfunction adjustDecimal(number, decimal) {\r\n\tif (decimal == 0)\r\n\t\treturn number;\r\n\telse {\r\n\t\tnumber = (decimal >= number.length) ? ((new Array(decimal - number.length + 1)).join('0') + number) : number;\r\n\t\treturn number.substr(0, number.length - decimal) + '.' + number.substr(number.length - decimal, decimal)\r\n\t}\r\n}\r\n","import { add, trim } from './add';\r\nimport { roundOff } from './round';\r\n\r\nexport function divide(dividend, divisor, precission = 8) {\r\n if (divisor == 0) {\r\n throw new Error('Cannot divide by 0');\r\n }\r\n\r\n dividend = dividend.toString();\r\n divisor = divisor.toString();\r\n\r\n // remove trailing zeros in decimal ISSUE#18\r\n dividend = dividend.replace(/(\\.\\d*?[1-9])0+$/g, \"$1\").replace(/\\.0+$/, \"\");\r\n divisor = divisor.replace(/(\\.\\d*?[1-9])0+$/g, \"$1\").replace(/\\.0+$/, \"\");\r\n\r\n if (dividend == 0)\r\n return '0';\r\n\r\n let neg = 0;\r\n if (divisor[0] == '-') {\r\n divisor = divisor.substring(1);\r\n neg++;\r\n }\r\n if (dividend[0] == '-') {\r\n dividend = dividend.substring(1);\r\n neg++;\r\n }\r\n\r\n var pt_dvsr = divisor.indexOf('.') > 0 ? divisor.length - divisor.indexOf('.') - 1 : -1;\r\n\r\n divisor = trim(divisor.replace('.', ''));\r\n if (pt_dvsr >= 0) {\r\n let pt_dvnd = dividend.indexOf('.') > 0 ? dividend.length - dividend.indexOf('.') - 1 : -1;\r\n\r\n if (pt_dvnd == -1) {\r\n dividend = trim(dividend + (new Array(pt_dvsr + 1)).join('0'));\r\n } else {\r\n if (pt_dvsr > pt_dvnd) {\r\n dividend = dividend.replace('.', '');\r\n dividend = trim(dividend + (new Array(pt_dvsr - pt_dvnd + 1)).join('0'));\r\n } else if (pt_dvsr < pt_dvnd) {\r\n dividend = dividend.replace('.', '');\r\n let loc = dividend.length - pt_dvnd + pt_dvsr;\r\n dividend = trim(dividend.substring(0, loc) + '.' + dividend.substring(loc));\r\n } else if (pt_dvsr == pt_dvnd) {\r\n dividend = trim(dividend.replace('.', ''));\r\n }\r\n }\r\n }\r\n\r\n let prec = 0, dl = divisor.length, rem = '0', quotent = '';\r\n let dvnd = (dividend.indexOf('.') > -1 && dividend.indexOf('.') < dl) ? dividend.substring(0, dl + 1) : dividend.substring(0, dl);\r\n dividend = (dividend.indexOf('.') > -1 && dividend.indexOf('.') < dl) ? dividend.substring(dl + 1) : dividend.substring(dl);\r\n \r\n if (dvnd.indexOf('.') > -1) {\r\n let shift = dvnd.length - dvnd.indexOf('.') - 1;\r\n dvnd = dvnd.replace('.', '');\r\n if (dl > dvnd.length) {\r\n shift += dl - dvnd.length;\r\n dvnd = dvnd + (new Array(dl - dvnd.length + 1)).join('0');\r\n }\r\n prec = shift;\r\n quotent = '0.' + (new Array(shift)).join('0');\r\n\r\n }\r\n\r\n precission = precission + 2;\r\n\r\n while (prec <= precission) {\r\n let qt = 0;\r\n while (parseInt(dvnd) >= parseInt(divisor)) {\r\n dvnd = add(dvnd, '-' + divisor);\r\n qt++;\r\n }\r\n quotent += qt;\r\n\r\n if (!dividend) {\r\n if (!prec)\r\n quotent += '.';\r\n prec++;\r\n dvnd = dvnd + '0';\r\n } else {\r\n if (dividend[0] == '.') {\r\n quotent += '.';\r\n prec++;\r\n dividend = dividend.substring(1);\r\n }\r\n dvnd = dvnd + dividend.substring(0, 1);\r\n dividend = dividend.substring(1);\r\n }\r\n }\r\n\r\n return ((neg == 1) ? '-' : '') + trim(roundOff(quotent, precission - 2));\r\n}","import { add } from './add';\r\n\r\nexport function subtract(number1, number2) {\r\n\tnumber1 = number1.toString();\r\n\tnumber2 = number2.toString();\r\n\tnumber2 = negate(number2);\r\n\treturn add(number1, number2);\r\n}\r\n\r\nexport function negate(number : string){\r\n\tif(number[0] == '-'){\r\n\t\tnumber = number.substr(1);\r\n\t}else{\r\n\t\tnumber = '-' + number;\r\n\t}\r\n\treturn number;\r\n}","import { divide } from './divide';\r\nimport { roundOff } from './round';\r\nimport { multiply } from './multiply';\r\nimport { subtract } from './subtract';\r\nimport { RoundingModes } from './roundingModes';\r\n\r\nexport function modulus(dividend: number|string, divisor:number|string) {\r\n if (divisor == 0) {\r\n throw new Error('Cannot divide by 0');\r\n }\r\n\r\n dividend = dividend.toString();\r\n divisor = divisor.toString();\r\n\r\n validate(dividend);\r\n validate(divisor);\r\n\r\n let sign = '';\r\n if(dividend[0] == '-'){\r\n sign = '-';\r\n dividend = dividend.substr(1);\r\n }\r\n if(divisor[0] == '-'){\r\n divisor = divisor.substr(1);\r\n }\r\n\r\n let result = subtract(dividend, multiply(divisor, roundOff(divide(dividend, divisor), 0, RoundingModes.FLOOR)));\r\n return sign+result;\r\n}\r\n\r\nfunction validate(oparand: string) {\r\n if (oparand.indexOf('.') != -1) {\r\n throw new Error('Modulus of non-integers not supported');\r\n }\r\n}\r\n","import { pad } from './add';\r\nimport {stripTrailingZero} from './stripTrailingZero';\r\n\r\nexport function compareTo(number1 : string, number2 : string) {\r\n\tlet negative = false;\r\n\t[number1, number2] = [number1, number2].map(n => stripTrailingZero(n));\r\n\tif(number1[0] == '-' && number2[0] != \"-\"){\r\n\t\treturn -1;\r\n\t}else if(number1[0] != '-' && number2[0] == '-'){\r\n\t\treturn 1;\r\n\t}else if(number1[0] == '-' && number2[0] == '-'){\r\n\t\tnumber1 = number1.substr(1);\r\n\t\tnumber2 = number2.substr(1);\r\n\t\tnegative = true;\r\n\t}\r\n\t[number1, number2] = pad(number1, number2);\r\n\tif(number1.localeCompare(number2) == 0){\r\n\t\treturn 0;\r\n\t}\r\n\tfor(let i = 0 ; i < number1.length ; i++){\r\n\t\tif(number1[i] == number2[i]){\r\n\t\t\tcontinue;\r\n\t\t}else if(number1[i] > number2[i]){\r\n\t\t\tif(negative){\r\n\t\t\t\treturn -1;\r\n\t\t\t}else{\r\n\t\t\t\treturn 1;\r\n\t\t\t}\r\n\t\t}else{\r\n\t\t\tif(negative){\r\n\t\t\t\treturn 1;\r\n\t\t\t}else{\r\n\t\t\t\treturn -1;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn 0;\r\n}\r\n\r\nfunction checkZero(number){\r\n\r\n}","import { add, trim } from \"./add\";\r\nimport { abs } from \"./abs\";\r\nimport { roundOff } from \"./round\";\r\nimport { multiply } from \"./multiply\";\r\nimport { divide } from \"./divide\";\r\nimport { modulus } from \"./modulus\";\r\nimport { compareTo } from \"./compareTo\";\r\nimport { subtract, negate } from \"./subtract\";\r\nimport { RoundingModes as Modes, RoundingModes } from \"./roundingModes\";\r\nimport { stripTrailingZero } from \"./stripTrailingZero\";\r\n\r\nclass bigDecimal {\r\n private value: string;\r\n static RoundingModes = Modes;\r\n\r\n private static validate(number): string {\r\n if (number) {\r\n number = number.toString();\r\n if (isNaN(number)) throw Error(\"Parameter is not a number: \" + number);\r\n\r\n if (number[0] == \"+\") number = number.substring(1);\r\n } else number = \"0\";\r\n\r\n //handle missing leading zero\r\n if (number.startsWith(\".\")) number = \"0\" + number;\r\n else if (number.startsWith(\"-.\")) number = \"-0\" + number.substr(1);\r\n\r\n //handle exponentiation\r\n if (/e/i.test(number)) {\r\n let [mantisa, exponent] = number.split(/[eE]/);\r\n mantisa = trim(mantisa);\r\n\r\n let sign = \"\";\r\n if (mantisa[0] == \"-\") {\r\n sign = \"-\";\r\n mantisa = mantisa.substring(1);\r\n }\r\n\r\n if (mantisa.indexOf(\".\") >= 0) {\r\n exponent = parseInt(exponent) + mantisa.indexOf(\".\");\r\n mantisa = mantisa.replace(\".\", \"\");\r\n } else {\r\n exponent = parseInt(exponent) + mantisa.length;\r\n }\r\n\r\n if (mantisa.length < exponent) {\r\n number =\r\n sign + mantisa + new Array(exponent - mantisa.length + 1).join(\"0\");\r\n } else if (mantisa.length >= exponent && exponent > 0) {\r\n number =\r\n sign +\r\n trim(mantisa.substring(0, exponent)) +\r\n (mantisa.length > exponent ? \".\" + mantisa.substring(exponent) : \"\");\r\n } else {\r\n number = sign + \"0.\" + new Array(-exponent + 1).join(\"0\") + mantisa;\r\n }\r\n }\r\n\r\n return number;\r\n }\r\n\r\n constructor(number: number | string | bigint = \"0\") {\r\n this.value = bigDecimal.validate(number);\r\n }\r\n\r\n getValue() {\r\n return this.value;\r\n }\r\n\r\n setValue(num: number | string | bigint) {\r\n this.value = bigDecimal.validate(num);\r\n }\r\n\r\n static getPrettyValue(number, digits = 3, separator = \",\"): string {\r\n // if (!(digits || separator)) {\r\n // digits = 3;\r\n // separator = ',';\r\n // } else if (!(digits && separator)) {\r\n // throw Error('Illegal Arguments. Should pass both digits and separator or pass none');\r\n // }\r\n number = bigDecimal.validate(number);\r\n let neg = number.charAt(0) == \"-\";\r\n if (neg) number = number.substring(1);\r\n var len = number.indexOf(\".\");\r\n len = len > 0 ? len : number.length;\r\n var temp = \"\";\r\n for (var i = len; i > 0; ) {\r\n if (i < digits) {\r\n digits = i;\r\n i = 0;\r\n } else i -= digits;\r\n\r\n temp =\r\n number.substring(i, i + digits) +\r\n (i < len - digits && i >= 0 ? separator : \"\") +\r\n temp;\r\n }\r\n return (neg ? \"-\" : \"\") + temp + number.substring(len);\r\n }\r\n getPrettyValue(digits = 3, separator = \",\") {\r\n return bigDecimal.getPrettyValue(this.value, digits, separator);\r\n }\r\n\r\n static round(number, precision = 0, mode = Modes.HALF_EVEN) {\r\n number = bigDecimal.validate(number);\r\n // console.log(number)\r\n if (isNaN(precision))\r\n throw Error(\"Precision is not a number: \" + precision);\r\n return roundOff(number, precision, mode);\r\n }\r\n\r\n round(precision = 0, mode = Modes.HALF_EVEN) {\r\n if (isNaN(precision))\r\n throw Error(\"Precision is not a number: \" + precision);\r\n\r\n return new bigDecimal(roundOff(this.value, precision, mode));\r\n }\r\n\r\n static abs(number) {\r\n number = bigDecimal.validate(number);\r\n return abs(number);\r\n }\r\n\r\n abs() {\r\n return new bigDecimal(abs(this.value));\r\n }\r\n\r\n static floor(number) {\r\n number = bigDecimal.validate(number);\r\n if (number.indexOf(\".\") === -1) return number;\r\n return bigDecimal.round(number, 0, RoundingModes.FLOOR);\r\n }\r\n\r\n floor() {\r\n if (this.value.indexOf(\".\") === -1) return new bigDecimal(this.value);\r\n return new bigDecimal(this.value).round(0, RoundingModes.FLOOR);\r\n }\r\n\r\n static ceil(number) {\r\n number = bigDecimal.validate(number);\r\n if (number.indexOf(\".\") === -1) return number;\r\n return bigDecimal.round(number, 0, RoundingModes.CEILING);\r\n }\r\n\r\n ceil() {\r\n if (this.value.indexOf(\".\") === -1) return new bigDecimal(this.value);\r\n return new bigDecimal(this.value).round(0, RoundingModes.CEILING);\r\n }\r\n\r\n static add(number1, number2) {\r\n number1 = bigDecimal.validate(number1);\r\n number2 = bigDecimal.validate(number2);\r\n return add(number1, number2);\r\n }\r\n\r\n add(number: bigDecimal) {\r\n return new bigDecimal(add(this.value, number.getValue()));\r\n }\r\n\r\n static subtract(number1, number2) {\r\n number1 = bigDecimal.validate(number1);\r\n number2 = bigDecimal.validate(number2);\r\n return subtract(number1, number2);\r\n }\r\n\r\n subtract(number: bigDecimal) {\r\n return new bigDecimal(subtract(this.value, number.getValue()));\r\n }\r\n\r\n static multiply(number1, number2) {\r\n number1 = bigDecimal.validate(number1);\r\n number2 = bigDecimal.validate(number2);\r\n return multiply(number1, number2);\r\n }\r\n\r\n multiply(number: bigDecimal) {\r\n return new bigDecimal(multiply(this.value, number.getValue()));\r\n }\r\n\r\n static divide(number1, number2, precision?: number) {\r\n number1 = bigDecimal.validate(number1);\r\n number2 = bigDecimal.validate(number2);\r\n return divide(number1, number2, precision);\r\n }\r\n\r\n divide(number: bigDecimal, precision?: number) {\r\n return new bigDecimal(divide(this.value, number.getValue(), precision));\r\n }\r\n\r\n static modulus(number1, number2) {\r\n number1 = bigDecimal.validate(number1);\r\n number2 = bigDecimal.validate(number2);\r\n return modulus(number1, number2);\r\n }\r\n\r\n modulus(number: bigDecimal) {\r\n return new bigDecimal(modulus(this.value, number.getValue()));\r\n }\r\n\r\n static compareTo(number1, number2) {\r\n number1 = bigDecimal.validate(number1);\r\n number2 = bigDecimal.validate(number2);\r\n return compareTo(number1, number2);\r\n }\r\n\r\n compareTo(number: bigDecimal) {\r\n return compareTo(this.value, number.getValue());\r\n }\r\n\r\n static negate(number) {\r\n number = bigDecimal.validate(number);\r\n return negate(number);\r\n }\r\n\r\n negate() {\r\n return new bigDecimal(negate(this.value));\r\n }\r\n\r\n static stripTrailingZero(number) {\r\n number = bigDecimal.validate(number);\r\n return stripTrailingZero(number);\r\n }\r\n\r\n stripTrailingZero() {\r\n return new bigDecimal(stripTrailingZero(this.value));\r\n }\r\n}\r\nexport default bigDecimal;\r\n"],"names":["Modes"],"mappings":"AAAA;AACgB,SAAA,GAAG,CAAC,OAAe,EAAE,OAAa,EAAA;;AAAb,IAAA,IAAA,OAAA,KAAA,KAAA,CAAA,EAAA,EAAA,OAAa,GAAA,GAAA,CAAA,EAAA;IAC5C,IAAA,GAAG,GAAG,CAAC,CACT,CAAA,GAAG,GAAG,CAAC,CAAC,CACA;;AAGV,IAAA,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE;AACrB,QAAA,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC/B,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AACtB,YAAA,GAAG,EAAE,CAAC;YACN,GAAG,GAAG,CAAC,CAAC;AACR,YAAU,OAAO,CAAC,MAAM,CAAC;AAC1B,SAAA;AACF,KAAA;AACD,IAAA,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE;AACrB,QAAA,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC/B,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AACtB,YAAA,GAAG,EAAE,CAAC;YACN,GAAG,GAAG,CAAC,CAAC;AACR,YAAU,OAAO,CAAC,MAAM,CAAC;AAC1B,SAAA;AACF,KAAA;AAED,IAAA,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;AACxB,IAAA,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;AAExB,IAAA,EAAA,GAAqB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,EAArD,OAAO,QAAA,EAAE,OAAO,QAAA,CAAsC;IAEvD,IAAI,GAAG,IAAI,CAAC,EAAE;QACZ,IAAI,GAAG,KAAK,CAAC;AAAE,YAAA,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;aACxC,IAAI,GAAG,KAAK,CAAC;AAAE,YAAA,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;AACnD,KAAA;IAED,IAAI,GAAG,GAAG,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACpC,IAAA,IAAI,CAAC,GAAG;AAAE,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;SACtB,IAAI,GAAG,IAAI,CAAC;AAAE,QAAA,OAAO,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AACrC,SAAA;AACH,QAAA,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;;YAC1D,OAAO,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AACzC,KAAA;AACH,CAAC;AAED,SAAS,UAAU,CAAC,MAAc,EAAA;AAChC,IAAA,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE;AACpB,QAAA,OAAO,MAAM,CAAC;AACf,KAAA;AAED,IAAA,IAAI,CAAC,GAAG,EAAE,EACR,CAAC,GAAG,MAAM,CAAC,MAAM,EACjB,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAC1B,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAC1B,QAAA,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG;YAAE,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;;AAClE,YAAA,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;AACrB,KAAA;IAED,IAAI,GAAG,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;AAE9D,IAAA,OAAO,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACzB,CAAC;AAEK,SAAU,IAAI,CAAC,MAAc,EAAA;IACjC,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAE9B,IAAA,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAAE,QAAA,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;AAE9B,IAAA,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC;AAC9C,QAAA,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAEnC,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;AACrD,CAAC;AAEe,SAAA,GAAG,CAAC,OAAe,EAAE,OAAe,EAAA;AAClD,IAAA,IAAI,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAC7B,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;;AAG9B,IAAA,IAAI,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAC5B,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC7B,IAAI,OAAO,GAAG,OAAO,EAAE;QACrB,MAAM,CAAC,CAAC,CAAC;AACP,YAAA,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AACpD,iBAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;AAChC,KAAA;AAAM,SAAA;QACL,MAAM,CAAC,CAAC,CAAC;AACP,YAAA,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AACpD,iBAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;AAChC,KAAA;;AAGD,IAAA,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC;SACxC,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/C,IAAI,OAAO,IAAI,OAAO,EAAE;QACtB,IAAI,OAAO,GAAG,OAAO,EAAE;YACrB,MAAM,CAAC,CAAC,CAAC;AACP,gBAAA,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE;AAC3B,oBAAA,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxD,SAAA;AAAM,aAAA;YACL,MAAM,CAAC,CAAC,CAAC;AACP,gBAAA,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE;AAC3B,oBAAA,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxD,SAAA;AACF,KAAA;IAED,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACzD,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;AAEzD,IAAA,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,OAAO,CAAC,OAAe,EAAE,OAAe,EAAA;;AAC/C,IAAA,EAAA,GAAqB,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,EAAzC,OAAO,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,OAAO,GAAA,EAAA,CAAA,CAAA,CAAA,CAA0B;AAE3C,IAAA,IAAI,GAAG,GAAG,EAAE,EACV,KAAK,GAAG,CAAC,CAAC;AAEZ,IAAA,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AAC5C,QAAA,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;AACtB,YAAA,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;YAChB,SAAS;AACV,SAAA;AACD,QAAA,IAAI,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QAC/D,GAAG,GAAG,CAAC,IAAI,GAAG,EAAE,IAAI,GAAG,CAAC;QACxB,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;AAC/B,KAAA;AAED,IAAA,OAAO,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC;AAC9C,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc,EAAA;AAC9B,IAAA,OAAO,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5C;;ACrIM,SAAU,GAAG,CAAC,CAA2B,EAAA;IAC7C,IAAI,OAAO,CAAC,IAAI,QAAQ,IAAI,OAAO,CAAC,IAAI,QAAQ;AAAE,QAAA,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;AACnE,IAAA,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG;AAAE,QAAA,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACvC,IAAA,OAAO,CAAC,CAAC;AACX;;ACJA,IAAY,aA4CX,CAAA;AA5CD,CAAA,UAAY,aAAa,EAAA;AACrB;;AAEG;AACH,IAAA,aAAA,CAAA,aAAA,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAO,CAAA;AAEP;;AAEG;AACH,IAAA,aAAA,CAAA,aAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAI,CAAA;AAEJ;;AAEG;AACH,IAAA,aAAA,CAAA,aAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAK,CAAA;AAEL;;;AAGG;AACH,IAAA,aAAA,CAAA,aAAA,CAAA,WAAA,CAAA,GAAA,CAAA,CAAA,GAAA,WAAS,CAAA;AAET;;;AAGG;AACH,IAAA,aAAA,CAAA,aAAA,CAAA,WAAA,CAAA,GAAA,CAAA,CAAA,GAAA,WAAS,CAAA;AAET;;;AAGG;AACH,IAAA,aAAA,CAAA,aAAA,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAO,CAAA;AAEP;;;AAGG;AACH,IAAA,aAAA,CAAA,aAAA,CAAA,aAAA,CAAA,GAAA,CAAA,CAAA,GAAA,aAAW,CAAA;AAEX;;AAEG;AACH,IAAA,aAAA,CAAA,aAAA,CAAA,IAAA,CAAA,GAAA,CAAA,CAAA,GAAA,IAAE,CAAA;AACN,CAAC,EA5CW,aAAa,KAAb,aAAa,GA4CxB,EAAA,CAAA,CAAA;;AC3CD;;;;;AAKG;SACa,QAAQ,CAAC,KAA+B,EAAE,CAAa,EAAE,IAA4B,EAAA;AAA3C,IAAA,IAAA,CAAA,KAAA,KAAA,CAAA,EAAA,EAAA,CAAa,GAAA,CAAA,CAAA,EAAA;AAAE,IAAA,IAAA,IAAA,KAAA,KAAA,CAAA,EAAA,EAAA,IAAA,GAAK,aAAa,CAAC,SAAS,CAAA,EAAA;AACjG,IAAA,IAAI,IAAI,KAAK,aAAa,CAAC,WAAW,EAAE;AACpC,QAAA,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;AAC7E,KAAA;AAED,IAAA,IAAI,QAAQ,KAAK,CAAC,IAAI,QAAQ,IAAI,QAAQ,KAAK,CAAC,IAAI,QAAQ;AACxD,QAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IAE7B,IAAI,GAAG,GAAG,KAAK,CAAC;AAChB,IAAA,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;QAClB,GAAG,GAAG,IAAI,CAAC;AACX,QAAA,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC9B,KAAA;IAED,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EACxB,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,EAClB,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;;IAGvB,IAAI,CAAC,GAAG,CAAC,EAAE;QACP,CAAC,GAAG,CAAC,CAAC,CAAC;AACP,QAAA,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC;AACnB,YAAA,OAAO,GAAG,CAAC;AACV,aAAA;AACD,YAAA,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACnD,YAAA,KAAK,GAAG,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC;YACpE,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AAClC,YAAA,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,EAAE,IAAI,MAAM,IAAI,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACnE,SAAA;AACJ,KAAA;;IAID,IAAI,CAAC,IAAI,CAAC,EAAE;AACR,QAAQ,OAAO,CAAC,OAAO;AACvB,QAAA,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE;AAC/C,YAAA,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;AAChC,SAAA;AACD,QAAA,OAAO,CAAC,GAAG,IAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,GAAG,GAAG,EAAE,IAAI,OAAO,CAAC;AACxD,KAAA;;AAID,IAAA,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;AACX,QAAA,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,EAAE,IAAI,OAAO,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1E,KAAA;SAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AAC5B,QAAA,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,EAAE,IAAI,OAAO,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACvG,KAAA;AAED,IAAA,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAEhC,IAAA,IAAI,GAAG,IAAI,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE;AACjD,QAAA,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;AAC7B,QAAA,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;AACpB,YAAA,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,EAAE,IAAI,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACnG,SAAA;AACJ,KAAA;AACD,IAAA,OAAO,CAAC,GAAG,KAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,GAAG,GAAG,EAAE,IAAI,OAAO,GAAG,GAAG,GAAG,OAAO,CAAC;AAChG,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,GAAW,EAAE,GAAY,EAAE,IAAmB,EAAA;AACjF,IAAA,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AACtD,QAAA,OAAO,KAAK,CAAC;;AAGjB,IAAA,IAAI,IAAI,KAAK,aAAa,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,IAAI,KAAK,aAAa,CAAC,KAAK,CAAC;AACrE,SAAC,GAAG,IAAI,IAAI,KAAK,aAAa,CAAC,OAAO,CAAC;AACvC,QAAA,OAAO,KAAK,CAAC;AAEjB,IAAA,IAAI,IAAI,KAAK,aAAa,CAAC,EAAE,KAAK,GAAG,IAAI,IAAI,KAAK,aAAa,CAAC,KAAK,CAAC;SACjE,CAAC,GAAG,IAAI,IAAI,KAAK,aAAa,CAAC,OAAO,CAAC;AACxC,QAAA,OAAO,IAAI,CAAC;;;AAIhB,IAAA,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACpD,IAAI,IAAI,GAAG,IAAI;AACX,QAAA,OAAO,IAAI,CAAC;SACX,IAAI,IAAI,GAAG,IAAI;AAChB,QAAA,OAAO,KAAK,CAAC;;AAGjB,IAAA,QAAQ,IAAI;AACR,QAAA,KAAK,aAAa,CAAC,SAAS,EAAE,OAAO,KAAK,CAAC;AAC3C,QAAA,KAAK,aAAa,CAAC,OAAO,EAAE,OAAO,IAAI,CAAC;QACxC,KAAK,aAAa,CAAC,SAAS,CAAC;QAC7B,SAAS,QAAQ,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAC;AAC3D,KAAA;AACL,CAAC;AAED,SAAS,SAAS,CAAC,IAAI,EAAE,CAAa,EAAA;AAAb,IAAA,IAAA,CAAA,KAAA,KAAA,CAAA,EAAA,EAAA,CAAa,GAAA,CAAA,CAAA,EAAA;AAClC,IAAA,IAAI,CAAC,CAAC;QACF,CAAC,GAAG,CAAC,CAAC;AACV,IAAA,IAAI,QAAQ,IAAI,CAAC,IAAI,QAAQ;QACzB,IAAI,CAAC,QAAQ,EAAE,CAAC;IAEpB,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EACnB,CAAC,GAAG,EAAE,CAAC;IAEX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;QACzB,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,EAAE,EAAE;YACT,CAAC,GAAG,CAAC,CAAC;YAAC,CAAC,GAAG,CAAC,CAAC;AAChB,SAAA;AAAM,aAAA;YACH,CAAC,GAAG,CAAC,CAAC;AACT,SAAA;QACD,CAAC,IAAI,CAAC,CAAC;AACV,KAAA;AACD,IAAA,IAAI,CAAC;QACD,CAAC,IAAI,CAAC,CAAC;AAEX,IAAA,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1C;;ACxHA;AACoC;AAC9B,SAAU,iBAAiB,CAAC,MAAM,EAAA;IACvC,IAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;AACrC,IAAA,IAAI,UAAU,EAAE;AACf,QAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC1B,KAAA;AACD,IAAA,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE;AACxB,QAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC1B,KAAA;IACD,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE;QAC9B,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,GAAG,EAAE;AACxC,YAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC7C,SAAA;AACD,KAAA;AACD,IAAA,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,IAAI,GAAG,EAAE;QAClC,MAAM,GAAG,GAAG,CAAC;AACb,KAAA;SAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,GAAG,EAAE;AAC5C,QAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC7C,KAAA;AACD,IAAA,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE;AACrB,QAAA,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC;AACtB,KAAA;AACD,IAAA,IAAI,UAAU,IAAI,MAAM,IAAI,GAAG,EAAE;AAChC,QAAA,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC;AACtB,KAAA;AACD,IAAA,OAAO,MAAM,CAAC;AACf;;ACzBgB,SAAA,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAA;AACxC,IAAA,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;AAC7B,IAAA,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;;IAG7B,IAAI,QAAQ,GAAG,CAAC,CAAC;AACjB,IAAA,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE;AACtB,QAAA,QAAQ,EAAE,CAAC;AACX,QAAA,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC5B,KAAA;AACD,IAAA,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE;AACtB,QAAA,QAAQ,EAAE,CAAC;AACX,QAAA,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC5B,KAAA;AACD,IAAA,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;AACrC,IAAA,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE;AAC/B,QAAA,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC3D,KAAA;IAED,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE;AAC/B,QAAA,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC3D,KAAA;AACD,IAAA,IAAI,aAAa,GAAG,cAAc,GAAG,cAAc,CAAC;AACpD,IAAA,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AACtD,IAAA,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AAEtD,IAAA,IAAI,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE;QACpC,IAAI,IAAI,GAAG,OAAO,CAAC;QACnB,OAAO,GAAG,OAAO,CAAC;QAClB,OAAO,GAAG,IAAI,CAAC;AACf,KAAA;IAED,IAAI,OAAO,IAAI,GAAG,EAAE;AACnB,QAAA,OAAO,GAAG,CAAC;AACX,KAAA;AAED;;AAEE;AACF,IAAA,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,cAAc,GAAG,EAAE,CAAC;AACxB,IAAA,IAAI,eAAe,GAAG,MAAM,GAAG,CAAC,CAAC;IAEjC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;QAChC,cAAc,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;AACvC,KAAA;AACD,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC5C,IAAI,GAAG,GAAG,CAAC,CAAC;AACZ,QAAA,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,eAAe,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AACrE,YAAA,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE;gBACjE,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AACrE,aAAA;AACD,SAAA;QACD,GAAG,IAAI,KAAK,CAAC;QACb,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;AAC7B,QAAA,MAAM,GAAG,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC;AAC3B,QAAA,eAAe,EAAE,CAAC;AAClB,KAAA;AACD;;AAEE;IACF,MAAM,GAAG,iBAAiB,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;IACjE,IAAI,QAAQ,IAAI,CAAC,EAAE;AAClB,QAAA,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC;AACtB,KAAA;AACD,IAAA,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;AAEE;AACF,SAAS,aAAa,CAAC,MAAM,EAAE,OAAO,EAAA;IACrC,IAAI,OAAO,IAAI,CAAC;AACf,QAAA,OAAO,MAAM,CAAC;AACV,SAAA;AACJ,QAAA,MAAM,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,MAAM,CAAC;QAC7G,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,CAAC,CAAA;AACxG,KAAA;AACF;;SCnFgB,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAc,EAAA;AAAd,IAAA,IAAA,UAAA,KAAA,KAAA,CAAA,EAAA,EAAA,UAAc,GAAA,CAAA,CAAA,EAAA;IACpD,IAAI,OAAO,IAAI,CAAC,EAAE;AACd,QAAA,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;AACzC,KAAA;AAED,IAAA,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;AAC/B,IAAA,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;;AAG7B,IAAA,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC5E,IAAA,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAE1E,IAAI,QAAQ,IAAI,CAAC;AACb,QAAA,OAAO,GAAG,CAAC;IAEf,IAAI,GAAG,GAAG,CAAC,CAAC;AACZ,IAAA,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE;AACnB,QAAA,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC/B,QAAA,GAAG,EAAE,CAAC;AACT,KAAA;AACD,IAAA,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE;AACpB,QAAA,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACjC,QAAA,GAAG,EAAE,CAAC;AACT,KAAA;AAED,IAAA,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAExF,IAAA,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IACzC,IAAI,OAAO,IAAI,CAAC,EAAE;AACd,QAAA,IAAI,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAE3F,QAAA,IAAI,OAAO,IAAI,CAAC,CAAC,EAAE;YACf,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAClE,SAAA;AAAM,aAAA;YACH,IAAI,OAAO,GAAG,OAAO,EAAE;gBACnB,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACrC,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,GAAG,OAAO,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5E,aAAA;iBAAM,IAAI,OAAO,GAAG,OAAO,EAAE;gBAC1B,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACrC,IAAI,GAAG,GAAG,QAAQ,CAAC,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;gBAC9C,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/E,aAAA;iBAAM,IAAI,OAAO,IAAI,OAAO,EAAE;AAC3B,gBAAA,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AAC9C,aAAA;AACJ,SAAA;AACJ,KAAA;AAED,IAAA,IAAI,IAAI,GAAG,CAAC,CAAE,CAAA,EAAE,GAAG,OAAO,CAAC,MAAM,CAAA,CAAa,OAAO,GAAG,GAAG;IAC3D,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClI,IAAA,QAAQ,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAE5H,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE;AACxB,QAAA,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAC7B,QAAA,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;AAClB,YAAA,KAAK,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;YAC1B,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7D,SAAA;QACD,IAAI,GAAG,KAAK,CAAC;AACb,QAAA,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;AAEjD,KAAA;AAED,IAAA,UAAU,GAAG,UAAU,GAAG,CAAC,CAAC;IAE5B,OAAO,IAAI,IAAI,UAAU,EAAE;QACvB,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE;YACxC,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC;AAChC,YAAA,EAAE,EAAE,CAAC;AACR,SAAA;QACD,OAAO,IAAI,EAAE,CAAC;QAEd,IAAI,CAAC,QAAQ,EAAE;AACX,YAAA,IAAI,CAAC,IAAI;gBACL,OAAO,IAAI,GAAG,CAAC;AACnB,YAAA,IAAI,EAAE,CAAC;AACP,YAAA,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC;AACrB,SAAA;AAAM,aAAA;AACH,YAAA,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE;gBACpB,OAAO,IAAI,GAAG,CAAC;AACf,gBAAA,IAAI,EAAE,CAAC;AACP,gBAAA,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACpC,aAAA;YACD,IAAI,GAAG,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACvC,YAAA,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACpC,SAAA;AACJ,KAAA;IAED,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC;AAC7E;;AC3FgB,SAAA,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAA;AACxC,IAAA,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;AAC7B,IAAA,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;AAC7B,IAAA,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;AAC1B,IAAA,OAAO,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC9B,CAAC;AAEK,SAAU,MAAM,CAAC,MAAe,EAAA;AACrC,IAAA,IAAG,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,EAAC;AACnB,QAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC1B,KAAA;AAAI,SAAA;AACJ,QAAA,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC;AACtB,KAAA;AACD,IAAA,OAAO,MAAM,CAAC;AACf;;ACVgB,SAAA,OAAO,CAAC,QAAuB,EAAE,OAAqB,EAAA;IAClE,IAAI,OAAO,IAAI,CAAC,EAAE;AACd,QAAA,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;AACzC,KAAA;AAED,IAAA,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;AAC/B,IAAA,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAE7B,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnB,QAAQ,CAAC,OAAO,CAAC,CAAC;IAElB,IAAI,IAAI,GAAG,EAAE,CAAC;AACd,IAAA,IAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,EAAC;QAClB,IAAI,GAAG,GAAG,CAAC;AACX,QAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACjC,KAAA;AACD,IAAA,IAAG,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,EAAC;AACjB,QAAA,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC/B,KAAA;IAED,IAAI,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChH,OAAO,IAAI,GAAC,MAAM,CAAC;AACvB,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe,EAAA;IAC7B,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE;AAC5B,QAAA,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;AAC5D,KAAA;AACL;;AC/BgB,SAAA,SAAS,CAAC,OAAgB,EAAE,OAAgB,EAAA;;IAC3D,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,EAAqB,GAAA,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,UAAA,CAAC,EAAI,EAAA,OAAA,iBAAiB,CAAC,CAAC,CAAC,CAAA,EAAA,CAAC,EAArE,OAAO,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,OAAO,GAAA,EAAA,CAAA,CAAA,CAAA,CAAsD;AACvE,IAAA,IAAG,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,EAAC;QACzC,OAAO,CAAC,CAAC,CAAC;AACV,KAAA;AAAK,SAAA,IAAG,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,EAAC;AAC/C,QAAA,OAAO,CAAC,CAAC;AACT,KAAA;AAAK,SAAA,IAAG,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,EAAC;AAC/C,QAAA,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC5B,QAAA,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC5B,QAAQ,GAAG,IAAI,CAAC;AAChB,KAAA;AACD,IAAA,EAAA,GAAqB,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,EAAzC,OAAO,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,OAAO,GAAA,EAAA,CAAA,CAAA,CAAA,CAA0B;IAC3C,IAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,EAAC;AACtC,QAAA,OAAO,CAAC,CAAC;AACT,KAAA;AACD,IAAA,KAAI,IAAI,CAAC,GAAG,CAAC,EAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAG,CAAC,EAAE,EAAC;QACxC,IAAG,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAC;YAC3B,SAAS;AACT,SAAA;aAAK,IAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAC;AAChC,YAAA,IAAG,QAAQ,EAAC;gBACX,OAAO,CAAC,CAAC,CAAC;AACV,aAAA;AAAI,iBAAA;AACJ,gBAAA,OAAO,CAAC,CAAC;AACT,aAAA;AACD,SAAA;AAAI,aAAA;AACJ,YAAA,IAAG,QAAQ,EAAC;AACX,gBAAA,OAAO,CAAC,CAAC;AACT,aAAA;AAAI,iBAAA;gBACJ,OAAO,CAAC,CAAC,CAAC;AACV,aAAA;AACD,SAAA;AACD,KAAA;AACD,IAAA,OAAO,CAAC,CAAC;AACV;;AC1BA,IAAA,UAAA,kBAAA,YAAA;AAkDE,IAAA,SAAA,UAAA,CAAY,MAAsC,EAAA;AAAtC,QAAA,IAAA,MAAA,KAAA,KAAA,CAAA,EAAA,EAAA,MAAsC,GAAA,GAAA,CAAA,EAAA;QAChD,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;KAC1C;IAhDc,UAAQ,CAAA,QAAA,GAAvB,UAAwB,MAAM,EAAA;AAC5B,QAAA,IAAI,MAAM,EAAE;AACV,YAAA,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,MAAM,CAAC;AAAE,gBAAA,MAAM,KAAK,CAAC,6BAA6B,GAAG,MAAM,CAAC,CAAC;AAEvE,YAAA,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG;AAAE,gBAAA,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACpD,SAAA;;YAAM,MAAM,GAAG,GAAG,CAAC;;AAGpB,QAAA,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;AAAE,YAAA,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC;AAC7C,aAAA,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;;AAGnE,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;AACjB,YAAA,IAAA,EAAsB,GAAA,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAzC,OAAO,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,QAAQ,QAAwB,CAAC;AAC/C,YAAA,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YAExB,IAAI,IAAI,GAAG,EAAE,CAAC;AACd,YAAA,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE;gBACrB,IAAI,GAAG,GAAG,CAAC;AACX,gBAAA,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAChC,aAAA;YAED,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AAC7B,gBAAA,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACrD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACpC,aAAA;AAAM,iBAAA;gBACL,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;AAChD,aAAA;AAED,YAAA,IAAI,OAAO,CAAC,MAAM,GAAG,QAAQ,EAAE;gBAC7B,MAAM;AACJ,oBAAA,IAAI,GAAG,OAAO,GAAG,IAAI,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvE,aAAA;iBAAM,IAAI,OAAO,CAAC,MAAM,IAAI,QAAQ,IAAI,QAAQ,GAAG,CAAC,EAAE;gBACrD,MAAM;oBACJ,IAAI;wBACJ,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;yBACnC,OAAO,CAAC,MAAM,GAAG,QAAQ,GAAG,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;AACxE,aAAA;AAAM,iBAAA;gBACL,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;AACrE,aAAA;AACF,SAAA;AAED,QAAA,OAAO,MAAM,CAAC;KACf,CAAA;AAMD,IAAA,UAAA,CAAA,SAAA,CAAA,QAAQ,GAAR,YAAA;QACE,OAAO,IAAI,CAAC,KAAK,CAAC;KACnB,CAAA;IAED,UAAQ,CAAA,SAAA,CAAA,QAAA,GAAR,UAAS,GAA6B,EAAA;QACpC,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;KACvC,CAAA;AAEM,IAAA,UAAA,CAAA,cAAc,GAArB,UAAsB,MAAM,EAAE,MAAU,EAAE,SAAe,EAAA;AAA3B,QAAA,IAAA,MAAA,KAAA,KAAA,CAAA,EAAA,EAAA,MAAU,GAAA,CAAA,CAAA,EAAA;AAAE,QAAA,IAAA,SAAA,KAAA,KAAA,CAAA,EAAA,EAAA,SAAe,GAAA,GAAA,CAAA,EAAA;;;;;;;AAOvD,QAAA,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;AAClC,QAAA,IAAI,GAAG;AAAE,YAAA,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC9B,QAAA,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;QACpC,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAI;YACzB,IAAI,CAAC,GAAG,MAAM,EAAE;gBACd,MAAM,GAAG,CAAC,CAAC;gBACX,CAAC,GAAG,CAAC,CAAC;AACP,aAAA;;gBAAM,CAAC,IAAI,MAAM,CAAC;YAEnB,IAAI;gBACF,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC;AAC/B,qBAAC,CAAC,GAAG,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,EAAE,CAAC;AAC7C,oBAAA,IAAI,CAAC;AACR,SAAA;QACD,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;KACxD,CAAA;AACD,IAAA,UAAA,CAAA,SAAA,CAAA,cAAc,GAAd,UAAe,MAAU,EAAE,SAAe,EAAA;AAA3B,QAAA,IAAA,MAAA,KAAA,KAAA,CAAA,EAAA,EAAA,MAAU,GAAA,CAAA,CAAA,EAAA;AAAE,QAAA,IAAA,SAAA,KAAA,KAAA,CAAA,EAAA,EAAA,SAAe,GAAA,GAAA,CAAA,EAAA;AACxC,QAAA,OAAO,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;KACjE,CAAA;AAEM,IAAA,UAAA,CAAA,KAAK,GAAZ,UAAa,MAAM,EAAE,SAAa,EAAE,IAAsB,EAAA;AAArC,QAAA,IAAA,SAAA,KAAA,KAAA,CAAA,EAAA,EAAA,SAAa,GAAA,CAAA,CAAA,EAAA;AAAE,QAAA,IAAA,IAAA,KAAA,KAAA,CAAA,EAAA,EAAA,IAAA,GAAOA,aAAK,CAAC,SAAS,CAAA,EAAA;AACxD,QAAA,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;;QAErC,IAAI,KAAK,CAAC,SAAS,CAAC;AAClB,YAAA,MAAM,KAAK,CAAC,6BAA6B,GAAG,SAAS,CAAC,CAAC;QACzD,OAAO,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;KAC1C,CAAA;AAED,IAAA,UAAA,CAAA,SAAA,CAAA,KAAK,GAAL,UAAM,SAAa,EAAE,IAAsB,EAAA;AAArC,QAAA,IAAA,SAAA,KAAA,KAAA,CAAA,EAAA,EAAA,SAAa,GAAA,CAAA,CAAA,EAAA;AAAE,QAAA,IAAA,IAAA,KAAA,KAAA,CAAA,EAAA,EAAA,IAAA,GAAOA,aAAK,CAAC,SAAS,CAAA,EAAA;QACzC,IAAI,KAAK,CAAC,SAAS,CAAC;AAClB,YAAA,MAAM,KAAK,CAAC,6BAA6B,GAAG,SAAS,CAAC,CAAC;AAEzD,QAAA,OAAO,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;KAC9D,CAAA;IAEM,UAAG,CAAA,GAAA,GAAV,UAAW,MAAM,EAAA;AACf,QAAA,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACrC,QAAA,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC;KACpB,CAAA;AAED,IAAA,UAAA,CAAA,SAAA,CAAA,GAAG,GAAH,YAAA;QACE,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;KACxC,CAAA;IAEM,UAAK,CAAA,KAAA,GAAZ,UAAa,MAAM,EAAA;AACjB,QAAA,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAAE,YAAA,OAAO,MAAM,CAAC;AAC9C,QAAA,OAAO,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;KACzD,CAAA;AAED,IAAA,UAAA,CAAA,SAAA,CAAA,KAAK,GAAL,YAAA;QACE,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAAE,YAAA,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACtE,QAAA,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;KACjE,CAAA;IAEM,UAAI,CAAA,IAAA,GAAX,UAAY,MAAM,EAAA;AAChB,QAAA,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAAE,YAAA,OAAO,MAAM,CAAC;AAC9C,QAAA,OAAO,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;KAC3D,CAAA;AAED,IAAA,UAAA,CAAA,SAAA,CAAA,IAAI,GAAJ,YAAA;QACE,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAAE,YAAA,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACtE,QAAA,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;KACnE,CAAA;AAEM,IAAA,UAAA,CAAA,GAAG,GAAV,UAAW,OAAO,EAAE,OAAO,EAAA;AACzB,QAAA,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACvC,QAAA,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACvC,QAAA,OAAO,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;KAC9B,CAAA;IAED,UAAG,CAAA,SAAA,CAAA,GAAA,GAAH,UAAI,MAAkB,EAAA;AACpB,QAAA,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;KAC3D,CAAA;AAEM,IAAA,UAAA,CAAA,QAAQ,GAAf,UAAgB,OAAO,EAAE,OAAO,EAAA;AAC9B,QAAA,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACvC,QAAA,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACvC,QAAA,OAAO,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;KACnC,CAAA;IAED,UAAQ,CAAA,SAAA,CAAA,QAAA,GAAR,UAAS,MAAkB,EAAA;AACzB,QAAA,OAAO,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;KAChE,CAAA;AAEM,IAAA,UAAA,CAAA,QAAQ,GAAf,UAAgB,OAAO,EAAE,OAAO,EAAA;AAC9B,QAAA,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACvC,QAAA,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACvC,QAAA,OAAO,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;KACnC,CAAA;IAED,UAAQ,CAAA,SAAA,CAAA,QAAA,GAAR,UAAS,MAAkB,EAAA;AACzB,QAAA,OAAO,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;KAChE,CAAA;AAEM,IAAA,UAAA,CAAA,MAAM,GAAb,UAAc,OAAO,EAAE,OAAO,EAAE,SAAkB,EAAA;AAChD,QAAA,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACvC,QAAA,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;KAC5C,CAAA;AAED,IAAA,UAAA,CAAA,SAAA,CAAA,MAAM,GAAN,UAAO,MAAkB,EAAE,SAAkB,EAAA;AAC3C,QAAA,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;KACzE,CAAA;AAEM,IAAA,UAAA,CAAA,OAAO,GAAd,UAAe,OAAO,EAAE,OAAO,EAAA;AAC7B,QAAA,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACvC,QAAA,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACvC,QAAA,OAAO,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;KAClC,CAAA;IAED,UAAO,CAAA,SAAA,CAAA,OAAA,GAAP,UAAQ,MAAkB,EAAA;AACxB,QAAA,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;KAC/D,CAAA;AAEM,IAAA,UAAA,CAAA,SAAS,GAAhB,UAAiB,OAAO,EAAE,OAAO,EAAA;AAC/B,QAAA,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACvC,QAAA,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACvC,QAAA,OAAO,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;KACpC,CAAA;IAED,UAAS,CAAA,SAAA,CAAA,SAAA,GAAT,UAAU,MAAkB,EAAA;QAC1B,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;KACjD,CAAA;IAEM,UAAM,CAAA,MAAA,GAAb,UAAc,MAAM,EAAA;AAClB,QAAA,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACrC,QAAA,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;KACvB,CAAA;AAED,IAAA,UAAA,CAAA,SAAA,CAAA,MAAM,GAAN,YAAA;QACE,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;KAC3C,CAAA;IAEM,UAAiB,CAAA,iBAAA,GAAxB,UAAyB,MAAM,EAAA;AAC7B,QAAA,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACrC,QAAA,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;KAClC,CAAA;AAED,IAAA,UAAA,CAAA,SAAA,CAAA,iBAAiB,GAAjB,YAAA;QACE,OAAO,IAAI,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;KACtD,CAAA;IApNM,UAAa,CAAA,aAAA,GAAGA,aAAK,CAAC;IAqN/B,OAAC,UAAA,CAAA;AAAA,CAvND,EAuNC;;;;"} \ No newline at end of file +{"version":3,"file":"big-decimal.js","sources":["../../../src/add.ts","../../../src/abs.ts","../../../src/roundingModes.ts","../../../src/stripTrailingZero.ts","../../../src/round.ts","../../../src/multiply.ts","../../../src/divide.ts","../../../src/subtract.ts","../../../src/modulus.ts","../../../src/compareTo.ts","../../../src/utils.ts","../../../src/pow.ts","../../../src/tables/e.ts","../../../src/logarithm.ts","../../../src/trig.ts","../../../src/big-decimal.ts"],"sourcesContent":["//function add {\r\nexport function add(number1: string, number2 = \"0\") {\r\n let neg = 0,\r\n ind = -1,\r\n neg_len;\r\n\r\n //check for negatives\r\n if (number1[0] == \"-\") {\r\n number1 = number1.substring(1);\r\n if (!testZero(number1)) {\r\n neg++;\r\n ind = 1;\r\n neg_len = number1.length;\r\n }\r\n }\r\n if (number2[0] == \"-\") {\r\n number2 = number2.substring(1);\r\n if (!testZero(number2)) {\r\n neg++;\r\n ind = 2;\r\n neg_len = number2.length;\r\n }\r\n }\r\n\r\n number1 = trim(number1);\r\n number2 = trim(number2);\r\n\r\n [number1, number2] = pad(trim(number1), trim(number2));\r\n\r\n if (neg == 1) {\r\n if (ind === 1) number1 = compliment(number1);\r\n else if (ind === 2) number2 = compliment(number2);\r\n }\r\n\r\n let res = addCore(number1, number2);\r\n if (!neg) return trim(res);\r\n else if (neg == 2) return \"-\" + trim(res);\r\n else {\r\n if (number1.length < res.length) return trim(res.substring(1));\r\n else return \"-\" + trim(compliment(res));\r\n }\r\n}\r\n\r\nfunction compliment(number: string) {\r\n if (testZero(number)) {\r\n return number;\r\n }\r\n\r\n let s = \"\",\r\n l = number.length,\r\n dec = number.split(\".\")[1],\r\n ld = dec ? dec.length : 0;\r\n\r\n for (let i = 0; i < l; i++) {\r\n if (number[i] >= \"0\" && number[i] <= \"9\") s += 9 - parseInt(number[i]);\r\n else s += number[i];\r\n }\r\n\r\n let one = ld > 0 ? \"0.\" + new Array(ld).join(\"0\") + \"1\" : \"1\";\r\n\r\n return addCore(s, one);\r\n}\r\n\r\nexport function trim(number: string) {\r\n let parts = number.split(\".\");\r\n\r\n if (!parts[0]) parts[0] = \"0\";\r\n\r\n while (parts[0][0] == \"0\" && parts[0].length > 1)\r\n parts[0] = parts[0].substring(1);\r\n\r\n return parts[0] + (parts[1] ? \".\" + parts[1] : \"\");\r\n}\r\n\r\nexport function pad(number1: string, number2: string) {\r\n let parts1 = number1.split(\".\"),\r\n parts2 = number2.split(\".\");\r\n\r\n //pad integral part\r\n let length = Math.max(parts1[0].length, parts2[0].length)\r\n parts1[0] = parts1[0].padStart(length, \"0\");\r\n parts2[0] = parts2[0].padStart(length, \"0\");\r\n\r\n //pad fractional part\r\n parts1[1] = parts1[1] || \"\"\r\n parts2[1] = parts2[1] || \"\"\r\n length = Math.max(parts1[1].length, parts2[1].length)\r\n parts1[1] = parts1[1].padEnd(length, \"0\");\r\n parts2[1] = parts2[1].padEnd(length, \"0\");\r\n\r\n number1 = parts1[0] + (parts1[1] ? \".\" + parts1[1] : \"\");\r\n number2 = parts2[0] + (parts2[1] ? \".\" + parts2[1] : \"\");\r\n\r\n return [number1, number2];\r\n}\r\n\r\nfunction addCore(number1: string, number2: string) {\r\n [number1, number2] = pad(number1, number2);\r\n\r\n let sum = \"\",\r\n carry = 0;\r\n\r\n for (let i = number1.length - 1; i >= 0; i--) {\r\n if (number1[i] === \".\") {\r\n sum = \".\" + sum;\r\n continue;\r\n }\r\n let temp = parseInt(number1[i]) + parseInt(number2[i]) + carry;\r\n sum = (temp % 10) + sum;\r\n carry = Math.floor(temp / 10);\r\n }\r\n\r\n return carry ? carry.toString() + sum : sum;\r\n}\r\n\r\nfunction testZero(number: string) {\r\n return /^0[0]*[.]{0,1}[0]*$/.test(number);\r\n}\r\n","export function abs(n: number | string | bigint) {\r\n if (typeof n == \"number\" || typeof n == \"bigint\") n = n.toString();\r\n if (n[0] == \"-\") return n.substring(1);\r\n return n;\r\n}\r\n","export enum RoundingModes {\r\n /**\r\n * Rounding mode to round towards positive infinity.\r\n */\r\n CEILING,\r\n\r\n /**\r\n * Rounding mode to round towards zero.\r\n */\r\n DOWN,\r\n\r\n /**\r\n * Rounding mode to round towards negative infinity.\r\n */\r\n FLOOR,\r\n\r\n /**\r\n * Rounding mode to round towards \"nearest neighbor\" unless both neighbors are equidistant, \r\n * in which case round down.\r\n */\r\n HALF_DOWN,\r\n\r\n /**\r\n * Rounding mode to round towards the \"nearest neighbor\" unless both neighbors are equidistant, \r\n * in which case, round towards the even neighbor.\r\n */\r\n HALF_EVEN,\r\n\r\n /**\r\n * Rounding mode to round towards \"nearest neighbor\" unless both neighbors are equidistant, \r\n * in which case round up.\r\n */\r\n HALF_UP,\r\n\r\n /**\r\n * Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary.\r\n * UNIMPLEMENTED\r\n */\r\n UNNECESSARY,\r\n\r\n /**\r\n * Rounding mode to round away from zero.\r\n */\r\n UP\r\n}\r\n\r\n","/*\r\n* Removes zero from front and back*/\r\nexport function stripTrailingZero(number: string) {\r\n\tconst isNegative = number[0] === '-';\r\n\tif (isNegative) {\r\n\t\tnumber = number.substring(1);\r\n\t}\r\n\twhile (number[0] == '0') {\r\n\t\tnumber = number.substring(1);\r\n\t}\r\n\tif (number.indexOf('.') != -1) {\r\n\t\twhile (number[number.length - 1] == '0') {\r\n\t\t\tnumber = number.substring(0, number.length - 1);\r\n\t\t}\r\n\t}\r\n\tif (number == \"\" || number == \".\") {\r\n\t\tnumber = '0';\r\n\t} else if (number[number.length - 1] == '.') {\r\n\t\tnumber = number.substring(0, number.length - 1);\r\n\t}\r\n\tif (number[0] == '.') {\r\n\t\tnumber = '0' + number;\r\n\t}\r\n\tif (isNegative && number != '0') {\r\n\t\tnumber = '-' + number;\r\n\t}\r\n\treturn number;\r\n}","import { RoundingModes } from './roundingModes';\r\nimport { stripTrailingZero } from './stripTrailingZero';\r\n/**\r\n * \r\n * @param input the number to round\r\n * @param n precision\r\n * @param mode Rounding Mode\r\n */\r\nexport function roundOff(input: number | string | bigint, n: number = 0, mode = RoundingModes.HALF_EVEN) {\r\n if (typeof (input) == 'number' || typeof (input) == 'bigint') input = input.toString();\r\n\r\n if (mode === RoundingModes.UNNECESSARY) {\r\n let [integers, mantissa] = stripTrailingZero(input.replace('-', '')).split('.');\r\n if (n > 0 && mantissa) {\r\n if (mantissa.length <= n) {\r\n return input\r\n }\r\n if (/[^0]/.test(mantissa.slice(n))) {\r\n throw new Error('Number is not an exact value. Rounding necessary.')\r\n }\r\n return input\r\n } else if (n < 0 && mantissa) {\r\n throw new Error('Number is not an exact value. Rounding necessary.')\r\n } else if (n < 0) {\r\n if (integers.length <= Math.abs(n) || /[^0]/.test(integers.slice(n))) {\r\n throw new Error('Number is not an exact value. Rounding necessary.')\r\n }\r\n return input\r\n } else if (n == 0 && mantissa) {\r\n throw new Error('Number is not an exact value. Rounding necessary.')\r\n }\r\n return input\r\n }\r\n\r\n let neg = false;\r\n if (input[0] === '-') {\r\n neg = true;\r\n input = input.substring(1);\r\n }\r\n\r\n let parts = input.split('.'),\r\n partInt = parts[0],\r\n partDec = parts[1];\r\n\r\n //handle case of -ve n: roundOff(12564,-2)=12600\r\n if (n < 0) {\r\n n = -n;\r\n if (partInt.length <= n)\r\n return '0';\r\n else {\r\n let prefix = partInt.substring(0, partInt.length - n);\r\n input = prefix + '.' + partInt.substring(partInt.length - n) + partDec;\r\n prefix = roundOff(input, 0, mode);\r\n return (neg ? '-' : '') + prefix + (new Array(n + 1).join('0'));\r\n }\r\n }\r\n\r\n\r\n // handle case when integer output is desired\r\n if (n == 0) {\r\n let l = partInt.length;\r\n if (greaterThanFive(parts[1], partInt, neg, mode)) {\r\n partInt = increment(partInt);\r\n }\r\n return (neg && parseInt(partInt) ? '-' : '') + partInt;\r\n }\r\n\r\n\r\n // handle case when n>0\r\n if (!parts[1]) {\r\n return (neg ? '-' : '') + partInt + '.' + (new Array(n + 1).join('0'));\r\n } else if (parts[1].length < n) {\r\n return (neg ? '-' : '') + partInt + '.' + parts[1] + (new Array(n - parts[1].length + 1).join('0'));\r\n }\r\n\r\n partDec = parts[1].substring(0, n);\r\n let rem = parts[1].substring(n);\r\n\r\n if (rem && greaterThanFive(rem, partDec, neg, mode)) {\r\n partDec = increment(partDec);\r\n if (partDec.length > n) {\r\n return (neg ? '-' : '') + increment(partInt, parseInt(partDec[0])) + '.' + partDec.substring(1);\r\n }\r\n }\r\n return (neg && (parseInt(partInt) || parseInt(partDec)) ? '-' : '') + partInt + '.' + partDec;\r\n}\r\n\r\nfunction greaterThanFive(part: string, pre: string, neg: boolean, mode: RoundingModes) {\r\n if (!part || part === new Array(part.length + 1).join('0'))\r\n return false;\r\n\r\n // #region UP, DOWN, CEILING, FLOOR \r\n if (mode === RoundingModes.DOWN || (!neg && mode === RoundingModes.FLOOR) ||\r\n (neg && mode === RoundingModes.CEILING))\r\n return false;\r\n\r\n if (mode === RoundingModes.UP || (neg && mode === RoundingModes.FLOOR) ||\r\n (!neg && mode === RoundingModes.CEILING))\r\n return true;\r\n // #endregion\r\n\r\n // case when part !== five\r\n let five = '5' + (new Array(part.length).join('0'));\r\n if (part > five)\r\n return true;\r\n else if (part < five)\r\n return false;\r\n\r\n // case when part === five\r\n switch (mode) {\r\n case RoundingModes.HALF_DOWN: return false;\r\n case RoundingModes.HALF_UP: return true;\r\n case RoundingModes.HALF_EVEN:\r\n default: return (parseInt(pre[pre.length - 1]) % 2 == 1)\r\n }\r\n}\r\n\r\nfunction increment(part, c: number = 0) {\r\n if (!c)\r\n c = 1;\r\n if (typeof (part) == 'number')\r\n part.toString();\r\n\r\n let l = part.length - 1,\r\n s = '';\r\n\r\n for (let i = l; i >= 0; i--) {\r\n let x = parseInt(part[i]) + c;\r\n if (x == 10) {\r\n c = 1; x = 0;\r\n } else {\r\n c = 0;\r\n }\r\n s += x;\r\n }\r\n if (c)\r\n s += c;\r\n\r\n return s.split('').reverse().join('');\r\n}","import { stripTrailingZero } from \"./stripTrailingZero\"\r\n\r\nexport function multiply(number1, number2) {\r\n\tnumber1 = number1.toString();\r\n\tnumber2 = number2.toString();\r\n\r\n\t/*Filter numbers*/\r\n\tlet negative = 0;\r\n\tif (number1[0] == '-') {\r\n\t\tnegative++;\r\n\t\tnumber1 = number1.substr(1);\r\n\t}\r\n\tif (number2[0] == '-') {\r\n\t\tnegative++;\r\n\t\tnumber2 = number2.substr(1);\r\n\t}\r\n\tnumber1 = stripTrailingZero(number1);\r\n\tnumber2 = stripTrailingZero(number2);\r\n\tlet decimalLength1 = 0;\r\n\tlet decimalLength2 = 0;\r\n\r\n\tif (number1.indexOf('.') != -1) {\r\n\t\tdecimalLength1 = number1.length - number1.indexOf('.') - 1;\r\n\t}\r\n\r\n\tif (number2.indexOf('.') != -1) {\r\n\t\tdecimalLength2 = number2.length - number2.indexOf('.') - 1;\r\n\t}\r\n\tlet decimalLength = decimalLength1 + decimalLength2;\r\n\tnumber1 = stripTrailingZero(number1.replace('.', ''));\r\n\tnumber2 = stripTrailingZero(number2.replace('.', ''));\r\n\r\n\tif (number1.length < number2.length) {\r\n\t\tlet temp = number1;\r\n\t\tnumber1 = number2;\r\n\t\tnumber2 = temp;\r\n\t}\r\n\r\n\tif (number2 == '0') {\r\n\t\treturn '0';\r\n\t}\r\n\r\n\t/*\r\n\t* Core multiplication\r\n\t*/\r\n\tlet length = number2.length;\r\n\tlet carry = 0;\r\n\tlet positionVector = [];\r\n\tlet currentPosition = length - 1;\r\n\r\n\tlet result = \"\";\r\n\tfor (let i = 0; i < length; i++) {\r\n\t\tpositionVector[i] = number1.length - 1;\r\n\t}\r\n\tfor (let i = 0; i < 2 * number1.length; i++) {\r\n\t\tlet sum = 0;\r\n\t\tfor (let j = number2.length - 1; j >= currentPosition && j >= 0; j--) {\r\n\t\t\tif (positionVector[j] > -1 && positionVector[j] < number1.length) {\r\n\t\t\t\tsum += parseInt(number1[positionVector[j]--]) * parseInt(number2[j]);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsum += carry;\r\n\t\tcarry = Math.floor(sum / 10);\r\n\t\tresult = sum % 10 + result;\r\n\t\tcurrentPosition--;\r\n\t}\r\n\t/*\r\n\t* Formatting result\r\n\t*/\r\n\tresult = stripTrailingZero(adjustDecimal(result, decimalLength));\r\n\tif (negative == 1) {\r\n\t\tresult = '-' + result;\r\n\t}\r\n\treturn result;\r\n}\r\n\r\n/*\r\n* Add decimal point\r\n*/\r\nfunction adjustDecimal(number, decimal) {\r\n\tif (decimal == 0)\r\n\t\treturn number;\r\n\telse {\r\n\t\tnumber = (decimal >= number.length) ? ((new Array(decimal - number.length + 1)).join('0') + number) : number;\r\n\t\treturn number.substr(0, number.length - decimal) + '.' + number.substr(number.length - decimal, decimal)\r\n\t}\r\n}\r\n","import { add, trim } from './add';\r\nimport { roundOff } from './round';\r\n\r\nexport function divide(dividend: string | number, divisor: string | number, precission?:number) {\r\n // Convert to string\r\n if (typeof dividend == 'number' || typeof divisor == 'number') {\r\n dividend = dividend.toString();\r\n divisor = divisor.toString();\r\n }\r\n\r\n // Return 0 \r\n if (divisor == '0') {\r\n return '0' + (!precission)? '': '.' + new Array(precission).join('0');\r\n }\r\n\r\n // Set default precission\r\n if(typeof precission == 'undefined'){\r\n precission = 8;\r\n }\r\n\r\n // remove trailing zeros in decimal ISSUE#18\r\n dividend = dividend.replace(/(\\.\\d*?[1-9])0+$/g, \"$1\").replace(/\\.0+$/, \"\");\r\n divisor = divisor.replace(/(\\.\\d*?[1-9])0+$/g, \"$1\").replace(/\\.0+$/, \"\");\r\n\r\n let neg = 0;\r\n if (divisor[0] == '-') {\r\n divisor = divisor.substring(1);\r\n neg++;\r\n }\r\n if (dividend[0] == '-') {\r\n dividend = dividend.substring(1);\r\n neg++;\r\n }\r\n\r\n var pt_dvsr = divisor.indexOf('.') > 0 ? divisor.length - divisor.indexOf('.') - 1 : -1;\r\n\r\n divisor = trim(divisor.replace('.', ''));\r\n if (pt_dvsr >= 0) {\r\n let pt_dvnd = dividend.indexOf('.') > 0 ? dividend.length - dividend.indexOf('.') - 1 : -1;\r\n\r\n if (pt_dvnd == -1) {\r\n dividend = trim(dividend + (new Array(pt_dvsr + 1)).join('0'));\r\n } else {\r\n if (pt_dvsr > pt_dvnd) {\r\n dividend = dividend.replace('.', '');\r\n dividend = trim(dividend + (new Array(pt_dvsr - pt_dvnd + 1)).join('0'));\r\n } else if (pt_dvsr < pt_dvnd) {\r\n dividend = dividend.replace('.', '');\r\n let loc = dividend.length - pt_dvnd + pt_dvsr;\r\n dividend = trim(dividend.substring(0, loc) + '.' + dividend.substring(loc));\r\n } else if (pt_dvsr == pt_dvnd) {\r\n dividend = trim(dividend.replace('.', ''));\r\n }\r\n }\r\n }\r\n\r\n let prec = 0, dl = divisor.length, rem = '0', quotent = '';\r\n let dvnd = (dividend.indexOf('.') > -1 && dividend.indexOf('.') < dl) ? dividend.substring(0, dl + 1) : dividend.substring(0, dl);\r\n dividend = (dividend.indexOf('.') > -1 && dividend.indexOf('.') < dl) ? dividend.substring(dl + 1) : dividend.substring(dl);\r\n\r\n if (dvnd.indexOf('.') > -1) {\r\n let shift = dvnd.length - dvnd.indexOf('.') - 1;\r\n dvnd = dvnd.replace('.', '');\r\n if (dl > dvnd.length) {\r\n shift += dl - dvnd.length;\r\n dvnd = dvnd + (new Array(dl - dvnd.length + 1)).join('0');\r\n }\r\n prec = shift;\r\n quotent = '0.' + (new Array(shift)).join('0');\r\n\r\n }\r\n\r\n precission = precission + 2;\r\n\r\n while (prec <= precission) {\r\n let qt = 0;\r\n while (parseInt(dvnd) >= parseInt(divisor)) {\r\n dvnd = add(dvnd, '-' + divisor);\r\n qt++;\r\n }\r\n quotent += qt;\r\n\r\n if (!dividend) {\r\n if (!prec)\r\n quotent += '.';\r\n prec++;\r\n dvnd = dvnd + '0';\r\n } else {\r\n if (dividend[0] == '.') {\r\n quotent += '.';\r\n prec++;\r\n dividend = dividend.substring(1);\r\n }\r\n dvnd = dvnd + dividend.substring(0, 1);\r\n dividend = dividend.substring(1);\r\n }\r\n }\r\n\r\n return ((neg == 1) ? '-' : '') + trim(roundOff(quotent, precission - 2));\r\n}","import { add } from './add';\r\n\r\nexport function subtract(number1, number2) {\r\n\tnumber1 = number1.toString();\r\n\tnumber2 = number2.toString();\r\n\tnumber2 = negate(number2);\r\n\treturn add(number1, number2);\r\n}\r\n\r\nexport function negate(number : string){\r\n\tif(number[0] == '-'){\r\n\t\tnumber = number.substr(1);\r\n\t}else{\r\n\t\tnumber = '-' + number;\r\n\t}\r\n\treturn number;\r\n}","import { divide } from './divide';\r\nimport { roundOff } from './round';\r\nimport { multiply } from './multiply';\r\nimport { negate, subtract } from './subtract';\r\nimport { RoundingModes } from './roundingModes';\r\nimport { abs } from './abs';\r\n\r\nexport function modulusE(n: number | string, base: number | string = 1, precision: number | undefined = undefined) {\r\n \r\n if (base == 0) {\r\n throw new Error('Cannot divide by 0');\r\n }\r\n\r\n n = n.toString();\r\n base = base.toString();\r\n \r\n validate(base);\r\n\r\n return subtract(n, multiply(base, roundOff(divide(n, base, precision), 0, RoundingModes.FLOOR)));\r\n}\r\n\r\nexport function modulus(dividend: number | string, divisor: number | string = 1, precision: number | undefined = undefined) {\r\n if (divisor == 0) {\r\n throw new Error('Cannot divide by 0');\r\n }\r\n\r\n dividend = dividend.toString();\r\n divisor = divisor.toString();\r\n\r\n validate(divisor);\r\n\r\n const result = modulusE(abs(dividend), abs(divisor), precision);\r\n return (dividend.includes('-')) ? negate(result) : result;\r\n}\r\n\r\nfunction validate(oparand: string) {\r\n if (oparand.includes('.')) {\r\n throw new Error('Modulus of non-integers not supported');\r\n }\r\n}\r\n\r\n\r\n","import { abs } from './abs';\r\nimport { pad } from './add';\r\nimport {stripTrailingZero} from './stripTrailingZero';\r\n\r\nexport function compareTo(number1 : string, number2 : string) {\r\n\tlet negative = false;\r\n\r\n\t[number1, number2] = [number1, number2].map(n => stripTrailingZero(n));\r\n\r\n\t// Early escapes\r\n\r\n\t// If num 1 is negative and num 2 is positive\r\n\tif(number1[0] == '-' && number2[0] != \"-\") return -1;\r\n\r\n\t// If num 2 is negative and num 1 is positive\r\n\tif(number1[0] != '-' && number2[0] == '-') return 1;\r\n\t\r\n\r\n\tif(number1[0] == '-' && number2[0] == '-'){\r\n\t\tnumber1 = number1.substring(1);\r\n\t\tnumber2 = number2.substring(1);\r\n\t\tnegative = true;\r\n\t}\r\n\r\n\r\n\tlet decimal1 = number1.indexOf('.');\r\n\tlet decimal2 = number2.indexOf('.');\r\n\r\n\t// If both numbers dont have decimals, compare lengths\r\n\tif(decimal1 == -1 && decimal1 == decimal2) {\r\n\t\tif(number1.length > number2.length) return (negative)? -1: 1;\r\n\t\tif(number1.length < number2.length) return (negative)? 1: -1;\r\n\t}\r\n\r\n\t// If num 1 has no decimal, and num 2 has, then compare integer length to the decimal index of num 2\r\n\tif(decimal1 == -1 && decimal2 !== -1){\r\n\t\tif(number1.length < decimal2) return (negative)? 1: -1;\r\n\t\tif(number1.length > decimal2) return (negative)? -1: 1;\r\n\t}\r\n\r\n\t// If num 1 has a decimal, and num 2 has none, then compare integer length to the decimal index of num 1\r\n\tif(decimal1 !== -1 && decimal2 == -1){\r\n\t\tif(number2.length < decimal1) return (negative)? 1: -1;\r\n\t\tif(number2.length > decimal1) return (negative)? -1: 1;\r\n\t}\t\r\n\r\n\t[number1, number2] = pad(number1, number2);\r\n\r\n\t// If equal\r\n\tif(number1.localeCompare(number2) == 0) return 0;\r\n\r\n\tfor(let i = 0 ; i < number1.length ; i++){\r\n\t\tif(number1[i] == number2[i]){\r\n\t\t\tcontinue;\r\n\t\t} else if(number1[i] > number2[i]){\r\n\t\t\treturn (negative)? -1: 1;\r\n\t\t} else {\r\n\t\t\treturn (negative)? 1: -1;\r\n\t\t}\r\n\t}\r\n\treturn 0;\r\n}\r\n\r\n// Wrapper functions\r\n\r\nexport function lessThan(left: string, right: string, orEquals: boolean = false){\r\n\treturn (orEquals)? (compareTo(left, right) === 0 || compareTo(left, right) === -1): (compareTo(left, right) === -1)\r\n}\r\n\r\nexport function greaterThan(left: string, right: string, orEquals: boolean = false){\r\n\treturn (orEquals)? (compareTo(left, right) === 0 || compareTo(left, right) === 1): (compareTo(left, right) === 1)\r\n}\r\n\r\nexport function equals(left: string, right: string){\r\n\treturn (compareTo(stripTrailingZero(left), stripTrailingZero(right)) === 0)\r\n}\r\n\r\nexport function isExatclyZero(number: string) {\r\n return equals(stripTrailingZero(abs(number)), '0')\r\n}\r\n\r\nexport function isExatclyOne(number: string) {\r\n return equals(stripTrailingZero(abs(number)), '1')\r\n}\r\n\r\nexport function isEven(number: string) {\r\n return /[02468]{1}$/.test(number.split('.')[0])\r\n}\r\n\r\nexport function isOdd(number: string) {\r\n return /[13579]{1}$/.test(number.split('.')[0])\r\n}","import { abs } from \"./abs\";\r\nimport { add } from \"./add\";\r\nimport { greaterThan, isExatclyOne, isExatclyZero, lessThan } from \"./compareTo\";\r\nimport { multiply } from \"./multiply\";\r\nimport { negate, subtract } from \"./subtract\";\r\n\r\nexport const factorial = (n: number | string): string => {\r\n\r\n n = n.toString();\r\n\r\n validateInteger(n);\r\n validatePositive(n);\r\n\r\n if (isExatclyZero(n) || isExatclyOne(n)) {\r\n return '1';\r\n }\r\n\r\n let result = n;\r\n\r\n while(true){\r\n\r\n if(isExatclyOne(n)){\r\n return result;\r\n }\r\n\r\n let next = subtract(n,'1');\r\n result = multiply(result, next);\r\n n = next;\r\n }\r\n}\r\n\r\nexport function sigma(n: number | string, limit: number | string, fn: (n:number|string, ...args) => any, ...args:any): string {\r\n\r\n n = n.toString();\r\n limit = limit.toString();\r\n\r\n validateInteger(n);\r\n validateInteger(limit);\r\n validatePositive(n);\r\n validatePositive(limit);\r\n\r\n let result = '0';\r\n\r\n while(greaterThan(limit, subtract(n,'1'))){\r\n result = add(result, fn(limit, ...args));\r\n limit = subtract(limit,'1');\r\n }\r\n\r\n return result\r\n\r\n}\r\n\r\nexport function alternatingSeries(n: number | string, limit: number | string, fn: (n:number|string) => any, _sign: number | string = '1'): string {\r\n\r\n n = n.toString();\r\n limit = limit.toString();\r\n _sign = sign(_sign).toString();\r\n\r\n if(lessThan(n, '1')){\r\n throw new Error('[alternatingSeries]: Argument n is less than 1');\r\n }\r\n\r\n validateInteger(n);\r\n validateInteger(limit);\r\n validatePositive(limit);\r\n\r\n let result = '0';\r\n while(true){\r\n\r\n const next = multiply(_sign, fn(n))\r\n\r\n if(lessThan(abs(next), tolerance(limit))){\r\n return result;\r\n }\r\n\r\n result = add(result, next);\r\n _sign = negate(_sign)\r\n n = add(n,'1');\r\n }\r\n}\r\n\r\nexport function tolerance(precision: number | string){\r\n precision = precision.toString();\r\n validateInteger(precision);\r\n if(precision == '0') return '0';\r\n if(precision.startsWith('-')) return `1${new Array(Number(-precision)).join('0')}`;\r\n return `0.${new Array(Number(precision) - 1).join('0')}1`\r\n}\r\n\r\nexport function isAproxZero(number: string | number, precision: number = 8) {\r\n precision = Math.max(1, precision)\r\n number = abs(number.toString());\r\n\r\n if(isExatclyZero(number)) return true;\r\n if(lessThan(number, tolerance(precision), true)) return true;\r\n\r\n return false;\r\n}\r\n\r\nexport function isAproxOne(number: string | number, precision: number = 8) {\r\n precision = Math.max(1, precision)\r\n number = abs(number.toString());\r\n\r\n if(isExatclyOne(number)) return true;\r\n if(lessThan(abs(subtract('1', number)), tolerance(precision), true)) return true;\r\n\r\n return false;\r\n}\r\n\r\nexport function sign(number: string | number){\r\n number = number.toString();\r\n if(isExatclyZero(number)) return 0;\r\n if(number.includes('-')) return -1;\r\n return 1;\r\n}\r\n\r\nfunction validateInteger(number: string) {\r\n if (number.includes('.')) {\r\n throw new Error('Non-integers not supported');\r\n }\r\n}\r\n\r\nfunction validatePositive(number: string) {\r\n if (number.includes('-')) {\r\n throw new Error('Negatives not supported');\r\n }\r\n}\r\n\r\n\r\n","import { abs } from \"./abs\";\r\nimport { equals, greaterThan, isExatclyOne, isExatclyZero, isOdd, lessThan } from \"./compareTo\";\r\nimport { divide } from \"./divide\";\r\nimport { multiply } from \"./multiply\";\r\nimport { roundOff } from \"./round\";\r\nimport { stripTrailingZero } from \"./stripTrailingZero\";\r\nimport { negate as negateFn, subtract } from \"./subtract\";\r\nimport { add } from \"./add\";\r\nimport { isAproxOne, isAproxZero, sign, tolerance } from \"./utils\";\r\n// import { AddInstantiate } from \"./assembly/math\";\r\n\r\n\r\n/**\r\n * Calculates the power of a given base raised to an integer exponent\r\n * \r\n * @param base - Base number\r\n * @param exponent - Exponent integer\r\n * @param negate - If set to true, parameters will be evaluated as `-(x ^ n)`\r\n * \r\n * @returns The resulting power as a string\r\n * \r\n * \r\n * @example Basic usage:\r\n * ```\r\n * // Positive Base\r\n * console.log(pow(2,2)) // Prints '4'\r\n * // Negative Base\r\n * console.log(pow(-2,2)) // Prints '4'\r\n * // Negative Base where the result will be a negative number\r\n * console.log(pow(-2,3)) // Prints '-8'\r\n * ```\r\n * \r\n * @example Negation usage:\r\n * ```\r\n * // Positive Base\r\n * console.log(pow(2, 2, true)) // Prints '-4'\r\n * // Negative Base\r\n * console.log(pow(-2, 2, true)) // Prints '-4'\r\n * // Negative Base where the result will be a negative number\r\n * console.log(pow(-2, 3, true)) // Prints '8'\r\n * ```\r\n * \r\n * @example Special cases:\r\n * ```\r\n * // Exponent of 0\r\n * console.log(pow(2, 0)) // Prints '1'\r\n * // Exponent of 1\r\n * console.log(pow(2, 1)) // Prints '2'\r\n * ```\r\n */\r\n\r\nexport function pow(base: number | string, exponent: number | string, precision: number | undefined = undefined, negate: boolean | undefined = false): string {\r\n\r\n\r\n // AddInstantiate.then((res)=>{\r\n // console.log('custom wasm loader',res.__add('00001', '1'))\r\n // })\r\n\r\n // const v = await (async url => await AddInstantiate)();\r\n\r\n // console.log('custom wasm loader', AddWebAssembly('1', '1'))\r\n\r\n exponent = exponent.toString();\r\n base = base.toString();\r\n\r\n if (isExatclyZero(exponent)) {\r\n return '1'\r\n }\r\n\r\n if (!exponent.includes('-') && isExatclyOne(exponent)) {\r\n return base\r\n }\r\n\r\n if (isExatclyZero(base) && exponent.includes('-') && isExatclyOne(exponent)) {\r\n throw Error('0^(-1) is undefined');\r\n }\r\n\r\n const finalize = (result: string) => {\r\n result = (negativeExponent) ? divide(1, result, precision + 1) : result;\r\n result = (precision) ? roundOff(result, precision) : result;\r\n return (negate) ? stripTrailingZero(negateFn(result)) : stripTrailingZero(result);\r\n };\r\n\r\n const negativeBase = base.includes('-');\r\n\r\n const negativeExponent = exponent.includes('-');\r\n const exponentParts = exponent.split('.');\r\n const exponentSignificand = exponentParts[1];\r\n\r\n const isBase10 = equals(abs(base), '10');\r\n\r\n if (isBase10) {\r\n base = abs(base);\r\n negate = !negate;\r\n }\r\n\r\n let fractionalExponent = '1';\r\n let result;\r\n\r\n if (equals(abs(base), '10')) {\r\n result = (negativeExponent) ? `0.${new Array(Number(abs(exponentParts[0])) - 1).join('0')}1` : `1${new Array(exponentParts[0]).join('0')}`\r\n } else {\r\n result = intPow(abs(base), abs(exponentParts[0]))\r\n }\r\n\r\n if (exponentSignificand) {\r\n\r\n if (negativeBase) {\r\n negate = !negate\r\n }\r\n\r\n\r\n precision = Math.max(precision, 32);\r\n // const testworker = new Worker(new URL(\"./workers/pow.worker.js\", import.meta.url));\r\n // testworker.postMessage({ base: abs(base), significand: exponentSignificand });\r\n\r\n // testworker.onmessage = (event) => {\r\n // console.log('webresult', result)\r\n // // console.log('web', multiply(result, event.data))\r\n // // testworker.terminate();\r\n\r\n // // fractionalExponent = event.data\r\n // return finalize(multiply(result, event.data))\r\n // // testworker.terminate();\r\n // }\r\n\r\n let tempBase = root10(abs(base));\r\n\r\n for (let i = 0; i < exponentSignificand.length; i++) {\r\n fractionalExponent = multiply(fractionalExponent, pow(tempBase, exponentSignificand[i]))\r\n tempBase = root10(tempBase)\r\n }\r\n return finalize(multiply(result, fractionalExponent))\r\n\r\n } else {\r\n return finalize(result)\r\n }\r\n\r\n // let exponentIntegers = abs(exponentParts[0]);\r\n\r\n // if (equals(abs(base), '10')) {\r\n // result = (negativeExponent) ? `0.${new Array(Number(exponentIntegers) - 1).join('0')}1` : `1${new Array(exponentIntegers).join('0')}`\r\n // return multiply(multiply(result, fractionalExponent), pow(sign(base), exponentIntegers))\r\n // }\r\n\r\n // while (greaterThan(exponentIntegers, '0')) {\r\n // if (isOdd(exponentIntegers)) { result = multiply(result, base) }\r\n // base = multiply(base, base);\r\n // exponentIntegers = divide(exponentIntegers, 2).split('.')[0];\r\n // }\r\n\r\n // result = multiply(result, fractionalExponent);\r\n // result = (negativeExponent) ? divide(1, result, precision + 1) : result;\r\n // result = (precision) ? roundOff(result, precision) : result;\r\n // return (negate) ? stripTrailingZero(negateFn(result)) : stripTrailingZero(result);\r\n};\r\n\r\nfunction intPow(base: string, exponent: string, precision: number | undefined = 32) {\r\n exponent = abs(exponent);\r\n let result = '1';\r\n\r\n while (greaterThan(exponent, '0')) {\r\n if (isOdd(exponent)) { result = multiply(result, base) }\r\n base = multiply(base, base);\r\n exponent = divide(exponent, 2).split('.')[0];\r\n }\r\n\r\n return result\r\n}\r\n\r\nexport function nthRoot(x: number | string, n: number | string, precision = 8) {\r\n\r\n x = x.toString();\r\n n = n.toString();\r\n\r\n validate(n);\r\n\r\n if (lessThan(n, '4', true)) {\r\n let guess = '1';\r\n let nMinusOne = subtract(n, 1);\r\n let difference = '0'\r\n let lastDifference = x\r\n let i = 0;\r\n while (true) {\r\n\r\n let newGuess = divide(add(stripTrailingZero(divide(x, pow(guess, nMinusOne, precision + 2), precision + 2)), multiply(guess, nMinusOne)), n, precision + 2);\r\n\r\n difference = abs(subtract(guess, newGuess))\r\n\r\n if (greaterThan(difference, lastDifference)) {\r\n // console.log('root exit under p')\r\n return stripTrailingZero(roundOff(guess, precision + 1))\r\n }\r\n\r\n if (lessThan(difference, tolerance(precision - 1))) {\r\n // console.log('newGuess exit under p')\r\n return stripTrailingZero(roundOff(newGuess, precision + 1))\r\n }\r\n\r\n lastDifference = difference;\r\n guess = stripTrailingZero(newGuess);\r\n\r\n i++;\r\n }\r\n // console.log('guess exit over itt')\r\n\r\n // return stripTrailingZero(roundOff(guess, precision + 1))\r\n } else {\r\n let x0 = '1';\r\n let x1 = '2';\r\n let x2 = '1.5';\r\n let i = 0;\r\n\r\n while (true) {\r\n let f0 = subtract(pow(x0, n, precision + 2), x);\r\n let f1 = subtract(pow(x1, n, precision + 2), x);\r\n let next = multiply(f1, divide(subtract(x1, x0), subtract(f1, f0), precision + 2));\r\n x2 = subtract(roundOff(x1, precision + 2), roundOff(next, precision + 2));\r\n\r\n if (lessThan(abs(subtract(x2, x1)), tolerance(precision + 1))) {\r\n return stripTrailingZero(roundOff(x2, precision + 1));\r\n }\r\n\r\n if (sign(f0) !== sign(f1)) {\r\n x1 = divide(add(x0 + x1), 2, precision + 2); // Switch to bisection method\r\n }\r\n\r\n x0 = x1;\r\n x1 = stripTrailingZero(roundOff(x2, precision + 2));\r\n i++;\r\n }\r\n\r\n // return stripTrailingZero(roundOff(x2, precision + 1))\r\n }\r\n\r\n}\r\n\r\nexport function inverseSqRoot(number: string) {\r\n number = number.toString();\r\n\r\n let n = abs(number);\r\n\r\n let guess = '1';\r\n let difference = '0'\r\n let previousDifference = n\r\n let i = 0;\r\n\r\n while (i < 10) {\r\n // console.log('guess', guess)\r\n\r\n let newGuess = roundOff(multiply(guess, subtract('1.5', roundOff(multiply(divide(number, 2, 33), pow(guess, 2, 33)), 33))), 33)\r\n // console.log('newGuess', guess)\r\n\r\n difference = abs(subtract(guess, newGuess))\r\n\r\n if (greaterThan(difference, previousDifference)) {\r\n // console.log('root exit under p')\r\n return stripTrailingZero(roundOff(guess, 32 + 1))\r\n }\r\n\r\n if (lessThan(difference, tolerance(32 - 1))) {\r\n // console.log('newGuess exit under p')\r\n return stripTrailingZero(roundOff(guess, 32 + 1))\r\n }\r\n\r\n previousDifference = difference;\r\n guess = newGuess;\r\n\r\n i++;\r\n }\r\n\r\n\r\n\r\n // let [integer, fraction] = n.split('.');\r\n // let exponent = '0';\r\n\r\n // let integerBits = '';\r\n // let fractionBits = '';\r\n // let exponentBits = '';\r\n // let mantissaBits = '';\r\n\r\n // let mantissa = divide(integer + fraction, '1');\r\n\r\n\r\n // while (greaterThan(integer, '1', true)) {\r\n // integerBits = isOdd(integer) ? '1' + integerBits : '0' + integerBits;\r\n // integer = divide(integer, 2, 0);\r\n // }\r\n\r\n\r\n // if (fraction) {\r\n\r\n // let precision = '32';\r\n // fraction = '0.' + fraction;\r\n\r\n // while (greaterThan(precision, '0')) {\r\n // fraction = multiply(fraction, 2);\r\n // fractionBits += fraction.split('.')[0];\r\n // fraction = '0.' + fraction.split('.')[1];\r\n // if (isAproxZero(fraction, 2)) break\r\n // precision = subtract(precision, 1);\r\n // }\r\n // }\r\n\r\n\r\n // if (integer == '0') {\r\n // let lastDigit = '0';\r\n // let i = 1;\r\n\r\n // while (true) {\r\n // if (lastDigit !== fractionBits[i - 1]) {\r\n // i++\r\n // break\r\n // }\r\n // i++\r\n // }\r\n\r\n // exponent = negateFn(i.toString())\r\n // } else {\r\n // exponent = (integerBits.length - 1).toString()\r\n // }\r\n\r\n // mantissaBits = integerBits + fractionBits;\r\n // mantissa = add('1', divide(divide(mantissa, pow('2', mantissaBits.length), mantissaBits.length), '2', mantissaBits.length));\r\n // console.log('log a', subtract(multiply(divide('1', pow('2', mantissaBits.length), mantissaBits.length), add(mantissa, multiply(pow('2', mantissaBits.length), add(exponent, (mantissaBits.length - 1).toString())))), (mantissaBits.length - 1).toString()))\r\n\r\n // let E = roundOff(multiply(add(exponent, (mantissaBits.length - 1).toString()), '0.5'), 0, RoundingModes.FLOOR);\r\n\r\n // exponent = add(exponent, (mantissaBits.length - 1).toString())\r\n\r\n // while (greaterThan(exponent, '1', true)) {\r\n // exponentBits += isOdd(exponent) ? '1' : '0';\r\n // exponent = roundOff(divide(exponent, 2), 0, RoundingModes.FLOOR);\r\n // }\r\n\r\n // exponent = roundOff(multiply(add(exponent, (mantissaBits.length - 1).toString()), '0.5'), 0, RoundingModes.FLOOR)\r\n\r\n\r\n // console.log('integer', integer)\r\n // console.log('integerBits', integerBits)\r\n // console.log('fractionBits', fractionBits)\r\n // console.log('exponent', exponent)\r\n // console.log('exponentBits', exponentBits)\r\n\r\n // // const mantissaBits = integerBits + fractionBits;\r\n // const logBits = exponentBits + mantissaBits;\r\n // const binaryBits = '0' + logBits.substring(0, logBits.length - 1); //right bitshift\r\n\r\n // exponentBits = binaryBits.substring(0, exponentBits.length)\r\n // mantissaBits = binaryBits.substring(exponentBits.length)\r\n // const exponentRange = pow('2', exponentBits.length);\r\n // const mantissaRange = multiply('1.5', pow('2', mantissaBits.length - 1));\r\n // const correction = multiply(exponentRange, mantissaRange);\r\n\r\n // const log = '1.' + binaryBits.split('').reduce((p, c, i) => {\r\n // return add(p, (c == '0') ? '0' : pow('2', binaryBits.length - i))\r\n // }, '0');\r\n\r\n\r\n // // console.log('mantissa', mantissa)\r\n // // console.log('mantissaBits', mantissaBits)\r\n // // console.log('logBits', logBits)\r\n // // console.log('binaryBits', binaryBits)\r\n // // console.log('mantissaRange', mantissaRange)\r\n // // console.log('exponentRange', exponentRange)\r\n // // console.log('correction', correction)\r\n // // console.log('log', log)\r\n\r\n // const initial = multiply(log, '.5');\r\n // const initialSq = multiply(initial, initial);\r\n // // let x = multiply(multiply(multiply(number, '0.5'), multiply(initial, initial)), '.5');\r\n // // x = multiply(multiply(multiply(number, '0.5'), multiply(x, x)), '.5');\r\n // // const y = multiply(initial, subtract('1.5', x));\r\n\r\n\r\n // let guess = initial;\r\n // let difference = '0'\r\n // let lastDifference = number\r\n // let i = 0;\r\n\r\n // while (i < 10) {\r\n // console.log('guess', guess)\r\n\r\n // guess = roundOff(multiply(guess, subtract('1.5', roundOff(multiply(divide(number, 2, 33), pow(guess, 2, 33)), 33))), 33)\r\n // console.log('newGuess', guess)\r\n\r\n // // difference = abs(subtract(guess, newGuess))\r\n\r\n // // if (greaterThan(difference, lastDifference)) {\r\n // // // console.log('root exit under p')\r\n // // return stripTrailingZero(roundOff(guess, 32 + 1))\r\n // // }\r\n\r\n // // if (lessThan(difference, tolerance(32 - 1))) {\r\n // // // console.log('newGuess exit under p')\r\n // // return stripTrailingZero(roundOff(guess, 32 + 1))\r\n // // }\r\n\r\n // // lastDifference = difference;\r\n // // guess = newGuess;\r\n\r\n // i++;\r\n // }\r\n\r\n // console.log('initial', initial)\r\n // console.log('initialSq', initialSq)\r\n // // console.log('x', x)\r\n // // console.log('y', y)\r\n\r\n // return guess\r\n\r\n}\r\n\r\nexport function sqRoot(base: string | number, precision = 32) {\r\n precision = Math.max(precision, 32);\r\n return nthRoot(base, 2, precision);\r\n}\r\n\r\nexport function cbRoot(base: string | number, precision = 32) {\r\n precision = Math.max(precision, 32);\r\n return nthRoot(base, 3, precision);\r\n}\r\n\r\nexport function root4(base: string | number, precision = 32) {\r\n precision = Math.max(precision, 32);\r\n return sqRoot(sqRoot(base, precision), precision);\r\n}\r\n\r\nexport function root5(base: string | number, precision = 32) {\r\n precision = Math.max(precision, 32);\r\n return nthRoot(base, 5, precision);\r\n}\r\n\r\nexport function root10(base: string | number, precision = 32) {\r\n precision = Math.max(precision, 32);\r\n return sqRoot(root5(base, precision), precision + 1);\r\n}\r\n\r\nfunction validate(oparand: string) {\r\n if (oparand.includes('.')) {\r\n throw Error('Root base of non-integers not supported');\r\n }\r\n}\r\n\r\n\r\n","export const E_ROOTS_FOR_POW = [\r\n [\r\n \"1\",\r\n \"1.1051709180756476248117078264902466682245471947375187187928632894409679667476543029891433189707486536329171204854012445361537347145315787020068902997574505197515004866018321613310249357028047934586850494525645057122112661163770326284627042965573236001851139\",\r\n \"1.22140275816016983392107199463967417030758094152050364127342509859920623308363781624228874401337247396902783756582071222657872335735698322420203091783847852468196963515090275879656423105784038067892980765878816657563573480602908117582872101992234299467757368987418370836563153389462747746988296269108061275281392456208243249268026539778924251026176313926132967183139404485664941616843691597024447586738912784063277359127768204092782706320234475212712014508481918262357879464226202483894518888192549035034715597321\",\r\n \"1.349858807576003103983744313328007330378299697359365803049917989939612587399539891293796485784096715182993915046496649823555281317904746176330174697914134611623510180348776728882134107658893142886237546315268956423659470780978312757181276728365015226253890933258389419871658954993580579042712940646224891469297274304073301451390889351970899528642926347862338071149211408737527216178389071834814268450261525986465964604240725313283687637440963107718301330951356415753972714631376348680064772218613611483339228569651085445294350178104320530288284696175866807479054565245092139097584381245312021271592764191527971036208743048564156633628960281631838046184539943675102487856097772374221297245505051183848015221680960625161769660863247928466143070056933155076029152109198619\",\r\n \"1.4918246976412703178248529528372222806432827739374252815956331500723650987080270940005743751395204332995146049712374327554149926253602141716230772600403407491873867150724945487212617660656620072704264395870570315311010113322105932230805422737018500206392527177438579578556189926416736085144638705057672356404429354629959069215296346423445412842930842338368651426888702440282339072078820428812172552291679864844405874392991397534151119907597315402375400805761858764070148579243901394571509123129260659970829149641445173093621736697471495715486927871427608521974813357303938049045027055274617248235377478635882464544179074744286716592660820629566276461885843196142347558399965088751380486680925242174092668548306167997919161040598441807559801618039547286283635268768983411911084036444003391406619758488846706626640355860622307506467065190571454306273600406778135267686009580686515055777572568306309595260360492639973537087137347050023394616393906703697628564832791198689610819908805991960205502002473532624419443167353822377041\",\r\n \"1.64872127070012814684865078781416357165377610071014801157507931164066102119421560863277652005636664300286663775630779700467116697521960915984097145249005979692942265909840391471994846465948924489686890533641846572084106665685980008892498121171228737521497221259813802364604394123302337702342564441115073997210339345543632427971478640993009214371685872851424554356204792843238295646431490989989559298639300873734528343887199639936097616043887791159196535233519726480396696337931220763089035352455056481345843941842020212763119317243234414790916753474172146106996570450921757574263944725690829548117247432018340633298482417480890385134505857727555061166714846142254643382172817464252944064119480610550411214216150015806428026218072435549458500264910615270634896131341405150953300907304199696610224898662704055364699222488547803416596626400854705247760207415313247478751208997988819063167774971424158059320000508837926711487592221411833120473118940174150839318956411265214927589489222002618989424703890008658172723963726628180320021102408885281948306909133579708714540083108622117282123853386065037903914832977915548985425218334949782721619507339453842540738918246146490048448660414624464961524536296212426067836554424656828424228138566437904693429740129065343555896062662077213299699\",\r\n \"1.822118800390508974875367668162864513382238808546435386320547476588819650298619237506071841611824533131511980084733212162604411051946388331577800804030556735220810982370501962391864313333554698490208265658190969819090734754749827177848273296632519555680103680326369352437791893895038152776723546377012529473207851151551688242638129468067423693457788686737322308859196635577406424535317253509122371220622994977976488678953227355968535226011981026891265759205286137730603315671631660105006528658431765125587595376593446335729037108814939435477611527959248377638771800033625299101758522787812658726842991493891554409933462204120505376533298706281045546514892620277647385214857618436655863924892218047400811116831042680487895029611648906250960278076271249277145102395991693860611831983025203596058754756019516099900266095850415178719614749200451630535061160489190411763823857450791548961055118169806794713874454939988586811643596429338746010525986899857961587944139308107436769695508633096338687346716373921410474524266689139689311366516947054631031160462923809187729982871513915427654871105844432037418907865839686988704917607346571370310822906994525483818469890762365701037332197459906166318134391275013867439967207601879970902034384688314406747097203766024003073884672273060729687254540281852107793074492986426871326231804793173823349508810551286252776477149073401952138042782050652434065326561952854233161279618029767330128021096195903742999575860846854523510091165177814675930213024375018164078691687009724255773069550816206514391507161\",\r\n \"2.0137527074704765216245493885830652700175423941458673115689893008797813008588679406324379355851788044338331898308254040110152144406355672122332987484386680282011586454587874291207920063096506060092121746339385003035706369942761654499650114370277576609074394476969349195415563411287148054594195014950075492700297283186501952215548266611861363515166840789209921665299236941497660514195676818497506715216174857824667584113677462277646521368145755169801610652069383900929636397476997976928986121402340613272005739386746343595131239407140625657434766755405604726559983098911197009867487590223559613492600292768297051485732713550448835403835352549463376130577581804732758041958835979535301727820054018405592264887175988369901092552028042689226587551744843184492524888491684438908350917254501814719615534981346941241332070048752850076613909872221227923256131385070038327284304187184081154788930005575892847954811706365631293695056764191098947623473863749480484940756222177807267238801516870654540558247853395741216289690556742625956213865161202746032011088919700768154544490761339022261482519814495299963404741430504214836798155729249493697925254743226038042230995868518047785789005613825713835594435128868667771495101069180401795064269233374799738867352453002639997668416935366386592304127698022250575283863420166408296272643322148060907484201210428960680526033446678578974007350742511058399463304152252983283111059782340661351915733128923447394041481646451630961371702270477501539244567625913375076027018672900253183869684213821854331885455218593203695168621845862590839866070698465191768354775162667919687787234057113703426381234125007404970096051044315268874858727339518165207062282508219103550897032474383182390962719939041810953987104324795493331907049865728024468068697764264074787176174506379\",\r\n \"2.22554092849246760457953753139507675705363413504848459611858395555662261021440632023826379767119915026374251878156387711619774619379855963687103747368472284226448865340655354317185985377030850245682664363225661079813536128785653726513719167842427129812110484311349165777902729389254511878094742813123387667848699059429446010657151043572826832010313208047732807930998614309870757227929101960381147954847517822334863279319666225559304046050087758825776791641245416220959090737379947978891910964567194089715072100803252233073248441719882854257031516049204581676853691460008296615228145430792751845579928748303335224298540140591302535466469498156065075049022167880244375473655622669689327650015305079415315439914200799195123789362957387187941117003174099693531506115168225416846731445216503066154563061060352226369700173570788781093516825383897874045751999350339808378867887307801498607904212244602606554161614131633524614531883236101562055698735197422864246157477439558784175923341664781731182017904677692890038751961431930364624097536076577459379586929940521167397559605869035407545793472238578147959537818114915637152419390460744941310780904484651026135598787393535566242027093950477170576851928767959213832520123359412209544604227356318776838329784976706937070674967308806522361845995066951391233792165311759338384098919371408326428769572713806130074267342996786117989877955011626521519806731160466960246214623368412017241669817519218938975787703688279670969520255459580782566824698766683025943011418413515424475714850262109066781102851851979626998205883326687030200455933362261083827188323248686155376982520491891859193912296678363031851095031585999296235557983401989894925443480452646143604665935035873612963289853124279447614565761048011466854209825044470072858946253771110646120878816878134534234062942337153869787247084363695742055676354219872791968697195149737804123025516854480966929100783654238470977617175020837913707478778991341149220208658404839283930641502839083068918900160104096532950404697685876434536064090817056280532188943563915681\",\r\n \"2.459603111156949663800126563602470695421772306440083020748545736657466552943365860870497185275930801502314734282469001211863377120754375262961184698244101923873118980752553546206085511483915775565746633877944570171310441342807039240011800950067877653276578939207957922264156281735850299153120666705464183289626292382107850626757086481112777076313695819244326645247215187769898739208923979309373990446742434297871759538487547808364593778694498844772835078016714351373598016467631087278899749286697713740248674901887803256296138548656549872572977525766104722565107146500648985987203867132117547677722793432947466268434715992314177189845879538433878518025300096774542323436522591754634721655783263629640839419113447179019145648844517390978320904868643199845305360956544494557422964230972024073035383722263932056673976596266688976321828928564444485955130282123956383440560652142134812702650195318853004793654327694163135311018560302434548157745596278924049359462262875684655024660621143270223276160205111113928674619513010825531773437719585670055905189480192487461443889421286148006246588358783823432756235263368472035520311691553695512537108796193920657766396287812148336508130560411995851432991098150316151710626822458450166702368954969918890855718477702866142861632457171714589428586925352111493288264877793764611187635117419219667724089358648691849349019774953975112073361668366390843101189643022503196449529273850914731962177302267814885008720265909052869903077134292211446012339728016145173776605298068332932215627064339536349963737505457519321720111235396885978665426051921476079008722809300128117266650623362110732864760301900017299660039379063962560499694800926090914390798018070659760804286858439659842007948172165140806138672059440570988428291170643822030057401246220069601172550649731972117725967828449725240661095291919679379580274098603455617464670785310583926637393873619156058283990235643046346147091976283156228115434842186613044398987912680078472025977495377880564317393705447963819914365733951865401782223781823067701249854212472507082498852675712141033436456921920235635932416059888043961227210308986402540506511344650923632565845792598802341393743342422242830490309556974956001755607771592980368429255689748738593726168543904401740920843388611933767910638184739366965114643113679309810659\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.010050167084168057542165456902860033807362201524292515164404031254374190731323852253210417020805424644822048349018187461836882962867029471348122509994980620193343756983419263331678116890952977342412525238660052128564771661099141138373740030932375484797474253\",\r\n \"1.020201340026755810160143920483151435303508991193925577274241055989764698001799473651140929048897747567783800834245028828510331946890882290633380114769851598685744140375597170707424349379520528467454229732767262381708980414285750783230743973744291273147993499\",\r\n \"1.030454533953516855612439953831198132905025142988223325669945482984656275528143507413690159736153367833262717667969420762924665205128543186726815728146644027749899016551570459982549960946831724287476034271222234314936525314771353449031855228611755471551229794\",\r\n \"1.040810774192388226757044757916854744082977050312312035233957186052848044168317778353605489758071664887267683574643292017752950273390217859298583514134022896444615385627894619269308729639149680681368915289974692924712790670871941809116920080546004777009977082\",\r\n \"1.051271096376024039697517636335645220174821296055062528783938479166279869650561268909887381693097467956359959802287840109856898277991870910996931622269015847528217521038290049746389922767632968070266132836298958452051202283898407113137668129272719733709427182\",\r\n \"1.061836546545359622224684877168372328428260420330079059772946224885572614646084795028727107540254028462725979079478817859771763808885702260691363941508870196834078432934454312238181936983945541942068693355958230093508349025302765186495840221334120606071291923\",\r\n \"1.072508181254216479053103949889114605574958973093013631368581996384184663872870122142938195770222664418254764408892720110775221918308589471660420537322754050996390544947060412014702775390723097905171301841614973139324709852063472998538152057727154702871352078\",\r\n \"1.083287067674958554435987758674888500198713572836593968977149136159258009574303026493771584720423995154971654271223663348911143174715668624259808265653232762681246142307810608195731327006732520819601068839992977872631673981442100729100750479561971721703257072\",\r\n \"1.094174283705210357872897623544886011846519908747085113495537273829677943694135052107150933181696135377161199865920871107158317262615140642553465724478938198810156930341222455108468641066277461818416868403944990238207068911482417587752512679561090991848685506\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.001000500166708341668055753993058311563076200580701460228514674460359748251448298412718226004153260943068218872095099342063678696119623840972330905531768311923556198498023652909377677730283868486287409870317224336827290668524342227007650646080335377683539402\",\r\n \"1.002002001334000266755580958731569947141262360355881650784254327401407826211342908735167751841578573842087720874539215063369808541481798858488186179510193185360846688470245765779287676702093047345577268794005585346872102348621068884894677639696274087962023832\",\r\n \"1.00300450450337702601293409134890020533187271956193064005816386977887704167032778817835718449794009129738172654330257629939497609228121058276487935834566645111932939622158438169617802320237286016173845852664382662772735225891910141326100743286140812329716465\",\r\n \"1.004008010677341872358807975325862256786679584568446515824520101445505613334720499643274149387061934130095719684438458233489149633082954545826902702369355374132139019359038155028498554482932087796695756199850948857306997101347029384618537438780565191707911304\",\r\n \"1.005012520859401063383566241124068580734875538593956360758053700178766756245814257769725878531005582561752872914964453059693371357350351629785031289228112479393000390737852735490064653453473263950263469180412515034868068037410009410423281936206661529650777831\",\r\n \"1.006018036054064864855584542073814807663397023131207238128209310729162232251624511692721095036373574483233356676638823820201979261982436682169260741126877359539784408851803860808991870535936635545440055073405777167775394256588337226812975070293010932647774324\",\r\n \"1.007024557266848555231600031941337387260626958324843573515364689887121935057426030048643842343378401601112246752543195873570584146404476681012065985847363008474306541126869561447531097035189821427350474715365757081347202689171315251277667530845240665265299241\",\r\n \"1.008032085504273431172073614608631847461248193629898477319670850659315558055203072544926387076982815517924276700035813263652577025921163294422287501988755195063376817413349886928919042162630307237198554733730866338155519701284057736281012337251398647856788345\",\r\n \"1.009040621773867814062570481311874274057745096807557533536793791893309190089211313774252518807101361017003109570357638320235688072443915664196164220142177807129999765515285503655079866550036049450757501377434724079219971788693007550857637620196056994725614551\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000100005000166670833416668055575397073415454172178381034635390972311235972781757573430475110294393277744056856189456093377349308639835234864147024859575654444223594337482525749599468629752896998058770389517981545014836069937171108315141768826558752790276236\",\r\n \"1.000200020001333400002666755558095301588712550265063340281249616462339933552635650404575689469783860722328853092919751879277515614513727994472210356634280535514759912694604145062526466543039555669877231954222323073542460530523928410171365347075351011821920295\",\r\n \"1.000300045004500337520251012543394484429242698705094453657909046405426810389812679452584785775653629322172025648290344728788948443651164069121340691369780280752072301321554544169816823932077142996969576906644974657939554818844412637302594762038150619715293429\",\r\n \"1.000400080010667733418672355880651175325602089234218127313638994866471733257393689147689037528495706906710548020054317971434500261679934483484883365324764324379786145945431964915418427301969396382574915094633029858419556374510345888380818423418110019646700504\",\r\n \"1.000500125020835937760438369605751648487716767772005667654052528513185499225469269404161288162290263445071720143880459750657027560342513592842257775359779789305459334406770729214405898908865552327309638003027229853587275580967668200112228756540688352311154381\",\r\n \"1.000600180036005400648064805554702313487380662321427742218779523265089444076340698564952604142576704373734829905992750918066261276845603358030914225286385902646373896497226913904457327994080504271798651358706636453059949377387742804353973513521969936501752549\",\r\n \"1.000700245057176672234080084397124317808729972049887082920697544556118662092675751649525697937257144190017868483717030126300200509168688033318071339742627167336587481821812960447646818515221045591253213703416322339042019757058294741478286115192071830262104121\",\r\n \"1.000800320085350402731030797169875671484970787023831957698136827590544488579455328399517237263085338370118947386598991767922241276098928474413390097019906957313039688997723589590992573554820372138559418413121238600026229549189496894374911921472634282466150763\",\r\n \"1.000900405121527342421488207410855909240960364438870706386170964512041266577901813243995078190574746902747080924348105047677314326983090277701922714443700530813227920787438119571392945308376198426393506918634436746759027328287815213664693795332524735463087053\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000010000050000166667083334166668055557539685019844025575947974286518040859924541627171360141414808527964710456114808568579194429073542519236311802480484946481318067459005203787629467197723492854996446403371670522585399835010157731202234906636252385776731651\",\r\n \"1.00002000020000133334000002666675555580952444444585538201058714126235905329240541941460463111260447087759745526170244469724542720133236462083910268982377765723546309959873516346614722768345641097465014525930010435730044916587618556635026327839524395833885967\",\r\n \"1.000030000450004500033750202501012504339301986661384091295086648836751748647469450015964451670052983888622000581616827713185780669338108129262463661100560276359891431254482497644594518311264674989317833539411130935378547235234149850030248683847558235949192424\",\r\n \"1.000040000800010666773334186672355588063654603897004653273294246986372534769339653940902480758988473452263946419318465732269864516290202354028672947499884769594544980789708021919265600923317888907545126143154207287758799568586448736519103967528945971526548865\",\r\n \"1.000050001250020833593752604188368210566445007862474552660354358193300410181171307606063524320643523978564544928969865946453669990898899456698349198366716859128164016860292475535424871378362068018619464946001908269309911380465115625730470139574546168248414669\",\r\n \"1.0000600018000360005400064800648005554327371706287380580517448041768184715082802102822710639972596644286364335407098336787101683082519331743726773721831155799714031419453036224798582793575860149124712362688085932620035829070681390851428693479523215791315023\",\r\n \"1.000070002450057167667097339330069689583742177176723647063988790354210467474771865973142735988449874178404296043885131632312715760670823804989006222060531708444185344331114273860623983993837941069162433957327267046454693493702350816632053640929378397569224776\",\r\n \"1.000080003200085335040027307030759716613039100029766726281645469033146244455371326825242410362812667390249632806855063393511294820363074995773170886211112043017322472818660214389638836378249754133527844678406244041534554373988144575477289266056935662827704568\",\r\n \"1.000090004050121502733799208238121990124620911386617650268545997115197477729772808193789097698902228616779638545143688002498080668191392250030819907953393555632250735284651864761358652086319522549247127067080851958286265291953836318860562133321982933710810154\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000001000000500000166666708333341666668055555753968278769844025573467813076198494952835391203458229748677004015804035149881283353005876638466337275595012771755160063386490687362457247978228580884154230359796042066216890640463145470846706955844825203502338433\",\r\n \"1.000002000002000001333334000000266666755555580952387301588712522328042379349054566833660167181437047765093225411054231512232000686252213399825626439733598663743759193375087814488620462276244525976983466408498021993849036041894526504322094571719953352997296398\",\r\n \"1.000003000004500004500003375002025001012500433928734151839955373415183009335525061132656460958137667580015165164788249607585867396819057285326555960166937649697973379255965258502453132749605555659281253337641722497540635905649955343904464110817430087236277383\",\r\n \"1.000004000008000010666677333341866672355558806350831746754144909770828180249872278427090395131851159823632422197402740977847069569299698172678405177176752031063667161866596069388686444135669904957535469560754938297276129090532495319450469310001482708633857767\",\r\n \"1.000005000012500020833359375026041688368071056557307173041021760810581713597910150822615040172518383155879039901575224781594686498583161076660122024484253078169629131959213103609416701449976071941387410235464597750689312106461726726423745914525437286467921547\",\r\n \"1.000006000018000036000054000064800064800055542898800027771445234294803121427534564955943850794837297671518974352450646804505269707458299371394556170457704109967851854196460183929711397642333451409044458139769431977686515948803676537433882198942436033685726107\",\r\n \"1.000007000024500057166766708473391830068218957087420770926023058705014627836931346376561248648943914301771998667561988061508464250718883634451632563486535656537167272887888081122818446250297457337741167996349750029452642438203264827808024523752573238419578446\",\r\n \"1.000008000032000085333504000273067030755971657558959100027103654818370719061312164579253428366464456865704272537228885187015821963109960213301575481664899700318156977468627339004606537398549611534419591779145085995021987503286692083161615280400738437478228082\",\r\n \"1.000009000040500121500273375492075738113449002853342362270826936522769439053506312434733891423696475231451840105639022034099547530631069357197734900223780917121362697414411169834162425824448828187739490931751957990245737110414834239697625619798509198502096658\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000000100000005000000166666670833333416666668055555575396825644841272597001791225749809603978358318652155457825720723310835749477655921114381043370965778946803600487177628675696518849337844070626989834763657881129895761844201299169626521857477088528076787941\",\r\n \"1.0000002000000200000013333334000000026666667555555580952381587301601410935026455031585698337876116969450321577305954872095570508305771300267271499578847512370499623533827733553612983384410604230310443624550120630972400618605844172547533274118825780193176817\",\r\n \"1.000000300000045000004500000337500020250001012500043392858770089339955358770089330093345265320642486420378812047150951932585414871265710565736755891829214719352313336596892188244686930029886632072476330684236070498981285061952559758496574715013905892895701089\",\r\n \"1.000000400000080000010666667733333418666672355555880634936888889611287506850089234183135875154730635650316057486370988380148651512646061821375107132862137685917854711244758264394403486935467487834601381881074388794755133200215304180036071713259670219661843655\",\r\n \"1.00000050000012500002083333593750026041668836805710565485878596768387648163650363459170938183586448223517322491984417230264503853560225899248618260891812286125687715790717851056332021067227280094027013605976616483231712313908590884158078628449553297320265405\",\r\n \"1.000000600000180000036000005400000648000064800005554286130857170628573094857233745459089870339612396601341875185399525960230416993842863520266038257286707886476669929341390017488971653286696873950479551896971679958715383478746119711068288028062391371149489013\",\r\n \"1.000000700000245000057166676670834733916830068071895695874206708425953000310487646018304089060036787599147676275105859400474689895123100075425333066539374860872723840060463730171521439940751466901429495510481112965046593615553202195597459116945123426063272682\",\r\n \"1.000000800000320000085333350400002730667030755597165718446730528598265921018024975740706254352576521064770040651166185959246668919556974378390605929012147885350292967351465271446885744407117136286055594702758682175847035062242848897900206718995002247133857028\",\r\n \"1.000000900000405000121500027337504920750738112594900189247699728341390729295808046226796645426268557424285412997921532857831252559494834249449859109227293811330322601387155767798258269722975398926936389317746988260923777387227501391642065587929462420948649232\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000000010000000050000000166666667083333334166666668055555557539682542162698415454144623567019402857944526698866978250658807361436330455014317926127615562200160084332078829335070241590368747866364909946478207830319530929114193223423472427136476351070384633625\",\r\n \"1.000000020000000200000001333333340000000026666666755555555809523810158730160141093477248677253807920483138260929194262546389530541572869646520440208084154592575244829846475616092104703889032125897195071483101405504938379453255735383526992590359391748128287405\",\r\n \"1.000000030000000450000004500000033750000202500001012500004339285730558035768526785877008929015219156953632307755135494996911581545128998738775212024344872737597647678017165824376945452724547758781666745678104162427281549813045542731484072320901013699751540848\",\r\n \"1.000000040000000800000010666666773333334186666672355555588063492226031746754144623700881844722783424475442360990450187254251567422193813585987728199005661346037368045665532810641944716974411635496550894053342760394407334227944985761375822664063299977760202737\",\r\n \"1.000000050000001250000020833333593750002604166688368055710565477159288199826733382290633389520515681243290082960907019379206809977191789257370469042321233232800461660402341054369158081918084989239338793682313776586227863512850221202421400273283373014626367211\",\r\n \"1.000000060000001800000036000000540000006480000064800000555428575594285742057143023771429480311692856103917078121968011417513832454609367779840918760983285672034325842279012880873143319189323358452529556891585903632812397146307138829975274828994563695371179662\",\r\n \"1.000000070000002450000057166667667083347339166830068057189569458742066083425945994475448626459922975804831403503407994163590626814758811340046507352358986760731455499065728116768159458733073621810040408316793287135185674491416007904172650363644834002683382753\",\r\n \"1.00000008000000320000008533333504000002730666703075555971657147018158767145538214765716437674024287074857138074282562507322952457285899884827258634480202409132370650245847484059340021912733791131203856792980510306420862566617226572338856338435031664716693301\",\r\n \"1.000000090000004050000121500002733750049207500738112509490017963905559103341304251500301830456961374530766246749440063115416691606198573254987480954117363856553419891520480849271064924566428807047867009390728824337185742582403824875085506729653219774600501303\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000000001000000000500000000166666666708333333341666666668055555555753968253993055555558311287478229717813076198492867247207525145893201460227749911054309202505145378825438957130678837687266560105088389907332936208344126353435648007509079302366904838332737965\",\r\n \"1.000000002000000002000000001333333334000000000266666666755555555580952380958730158731569664903280423280474587141262359040138133471466992736834031733502636105810709353815485197855429903174537090912633982404546033943476658527442915537642542256751648098540938329\",\r\n \"1.000000003000000004500000004500000003375000002025000001012500000433928571591294642911383928587700892861580762988122463474282007055499419665167245143251664943594715148543087862808485217520052561838182926761331655514641487182847805900109952106216843867588068853\",\r\n \"1.000000004000000008000000010666666677333333341866666672355555558806349207974603175325573192528818342256751643453335471124025932917900958536700278753394083087253080794330245466119358391768262310261548181640401381566398544617645066573738726605241457683162358406\",\r\n \"1.000000005000000012500000020833333359375000026041666688368055571056547628735739092683876215213190312069808326828429435504808836584577556241828530001848857197197448211202934610464624745817298908884851334334032243517528230506352913584728945540127503247334304454\",\r\n \"1.000000006000000018000000036000000054000000064800000064800000055542857184514285742057142873805714294803116887661298703396123877022771514559643784921476238095255198598792535200905864592462478874938320339031361777709608682003676296114904000848969978666037676208\",\r\n \"1.000000007000000024500000057166666766708333473391666830068055718956944587420659833425945293891988861264598969692976408540181920613546886836709421546188906759485969317880330268377230197365586777939297035267858198945289644124491347823705980150597478089811238908\",\r\n \"1.000000008000000032000000085333333504000000273066667030755555971657143273244444814312522341749841485037242407372912278975495665944488178378343886315424095469213776993555687392616104926576737106225715914016443147964116812712649070583759250245851205008677469484\",\r\n \"1.00000000900000004050000012150000027337500049207500073811250094900178678191272428191272417515002310759027859286803358595908816669708328358557549585827919550781509555184392013474906695251704896486905504823982001490494955628430631018008515640009464192836762086\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000000000100000000005000000000166666666670833333333416666666668055555555575396825397073412698415454144620838844797178381032547701302041579835416640972311235208061369602374898159661717890890636377876292167626807167118097418250089799613232822429561584839732436\",\r\n \"1.00000000020000000002000000000133333333340000000000266666666675555555555809523809530158730158871252204588359788359839666506334028111805902739236072757342598614945704892826162667432877205675217861820898140236791877216104086843490250510449150481689310382491997\",\r\n \"1.000000000300000000045000000004500000000337500000020250000001012500000043392857144484375000054241071430198660714330093344156953632305220408497752796394453771498033216988957610473517976082538957931840649372284007980778387079364588612237999322952503353246629272\",\r\n \"1.000000000400000000080000000010666666667733333333418666666672355555555880634920651174603175325573192268754850089234183100884792902571758052646972327378677406133744778611081257066906765018961252872327129135458024179406515595154985765757709114409879325763582657\",\r\n \"1.000000000500000000125000000020833333335937500000260416666688368055557105654762001643105164112447641362588872366729829295443148050046993630164903199619632307099045282865341315842970320393225917211453732599727661119186787432356941799959234635398296083997006139\",\r\n \"1.000000000600000000180000000036000000005400000000648000000064800000005554285714702285714313485714287380571428662316883121427532467742209790218779163693808965891265088968175158346191639365407702043087739343368804570472330777845741875602316524836720744596838442\",\r\n \"1.000000000700000000245000000057166666676670833334733916666830068055571895694445874206597333425945223833643326112645989436864693566253849841192829330529553945887353131797463326009328289333089933370063364144225191646223300847249495173234424373673541944624979205\",\r\n \"1.00000000080000000032000000008533333335040000000273066666703075555559716571428987530158767145537921830196825612021369262382312864973497139947588769798444529279829947588643443285558056813237014675084862707667638417307510222862170506049780991734222020598622395\",\r\n \"1.000000000900000000405000000121500000027337500004920750000738112500094900178582104841518924769866167515002240004474209193517383867930324377468044757492746949756095835764624498574071199440142689339384466863378791519731786238325701991449155383573875144382022735\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000000000010000000000050000000000166666666667083333333334166666666668055555555557539682539685019841269844025573192242614638447974286515953184707524985304368984924541627170595425328394905114959781791792654948681248246092509415204617290487417116640524671775301\",\r\n \"1.000000000020000000000200000000001333333333340000000000026666666666755555555555809523809524444444444445855379188715343915343920474587141262359040136831070164403516530500657509842695027911535848043821402053583856122155392523906401192251402380938316915480143814\",\r\n \"1.000000000030000000000450000000004500000000033750000000202500000001012500000004339285714301986607142911383928571591294642857586647727273836749188314248641983022469439043110730229591857308776602897731494805150380123093913492034937508031925936525164255550480239\",\r\n \"1.00000000004000000000080000000001066666666677333333333418666666667235555555558806349206365460317460389700176367131992945327329421196091365293143081697890586810267216616505076424653349506852152837802535905072055073786420151577785100640838396137277112251514735\",\r\n \"1.00000000005000000000125000000002083333333359375000000260416666668836805555571056547619144500248016411244764112038587136255618718183873319134007264068095774525059241470925396170577487944738923374878447003205386484881914018245946707333822256547575648332174683\",\r\n \"1.000000000060000000001800000000036000000000540000000006480000000064800000000555428571432737142857170628571428738057142858051740259744804155844176818381618471507920651137351791067425123447985349695682484654572318487957897918242801974673257648070007868679130426\",\r\n \"1.000000000070000000002450000000057166666667667083333347339166666830068055557189569444458742065972333425945216827808777011126459894108581865282025216633943931012807982367336200600492753258650819501465012407695965228823807927322155096641118825460150386445518263\",\r\n \"1.000000000080000000003200000000085333333335040000000027306666667030755555559716571428613038730159100026807763100038095259614835337645468150286810918977324022206242931561668484892962175461856164162854060279811767399853148829723227492951123779037914467762124188\",\r\n \"1.000000000090000000004050000000121500000002733750000049207500000738112500009490017857249619843751067627008938180071651864330456372342868033181841733736211930697323760184868971758523921789168189768615744476250539036111741578555829725167955219694647353096622696\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000000000001000000000000500000000000166666666666708333333333341666666666668055555555555753968253968278769841269844025573192240134479717813076198492865161619501897279835647891203458229747912288359543650548989349005883400229246206526163527289595008850667173127\",\r\n \"1.000000000002000000000002000000000001333333333334000000000000266666666666755555555555580952380952387301587301588712522045855661375661375712682379349054566832344611437944771278292548133818000146042474087934405394723223543640599392717523920626753962817433470826\",\r\n \"1.000000000003000000000004500000000004500000000003375000000002025000000001012500000000433928571428734151785714339955357142873415178571433009334415585525060876623632656406093960958126694744810435100615729450516002218359617667057380685556574837983621173494200824\",\r\n \"1.000000000004000000000008000000000010666666666677333333333341866666666672355555555558806349206350831746031746754144620811576437389770828180214846916538934316722871531760423728464363385819413586609559082109346707911677721834735995817714714655658155017123966004\",\r\n \"1.00000000000500000000001250000000002083333333335937500000002604166666668836805555557105654761905730716765873554101906966759414269180016504642155734790995478949110032280612198459362555198266157726625772874678331610798998177006297680609976524115439541173420259\",\r\n \"1.000000000006000000000018000000000036000000000054000000000064800000000064800000000055542857142898800000000027771428571445234285714294803116883121427532467534564955044955943850435279366265734265869100042814376117193730654971650198545964167632457503232017871985\",\r\n \"1.000000000007000000000024500000000057166666666766708333333473391666666830068055555718956944444587420659722333425945216127225322145111264598940825753582453602353313225972915411685074603803437053433977043894247041815994636316149529701778786472611784462703889138\",\r\n \"1.000000000008000000000032000000000085333333333504000000000273066666667030755555555971657142857558958730159100026807760436987936508151703908930719061223879089942306582357031179238190271212908602022996939574698978718233321541425959528060975659005527346418528599\",\r\n \"1.000000000009000000000040500000000121500000000273375000000492075000000738112500000949001785715353341294643924769866072389435736607929018849432407803098113232874672320130046233975445553072196307524291707537220510858488196407197643148826305620029216908081970869\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000000000000100000000000005000000000000166666666666670833333333333416666666666668055555555555575396825396825644841269841272597001763668457892416225749809603976270645024985302763096599902155457825720722546120136232570095008736915152259095717555490353654637693\",\r\n \"1.000000000000200000000000020000000000001333333333333400000000000002666666666666755555555555558095238095238158730158730160141093474426835978835978836491903158569833787611565389474722808056143268841681540119296733053347123188393029666555965964618355391948779923\",\r\n \"1.000000000000300000000000045000000000004500000000000337500000000020250000000001012500000000043392857142858770089285714339955357142858770089285714330093344155845265320616883142486419830170378812036178118579523155416218299696954834514122792910931153971094557661\",\r\n \"1.00000000000040000000000008000000000001066666666666773333333333341866666666667235555555555588063492063493688888888888961128747795417351675485008923418310084980254182031959917508006396898364938999859716891065039215240131218967246103644485220410726154752182813\",\r\n \"1.000000000000500000000000125000000000020833333333335937500000000260416666666688368055555557105654761904858785962301592683876212522314969824735461967924533029209381816261176142259312832929617646027019562700585870131297332583548849712255111360166306405086567142\",\r\n \"1.000000000000600000000000180000000000036000000000005400000000000648000000000064800000000005554285714286130857142857170628571428573094857142857233745454545459089870129870339612387612396601341515627589471100328256668816897388801845549408590481518481518982450895\",\r\n \"1.000000000000700000000000245000000000057166666666676670833333334733916666666830068055555571895694444445874206597222333425945216057166976658951112645989407997470754170760066981154246423015810712407224886058134625535319860314645696585222499332309114404479010322\",\r\n \"1.000000000000800000000000320000000000085333333333350400000000002730666666667030755555555597165714285718446730158730528598236331599254349206351358308930575740706245524032130353794354298842520912389088268868503018037747790192050898910086286503634618149465704747\",\r\n \"1.000000000000900000000000405000000000121500000000027337500000004920750000000738112500000094900178571439247698660715353341294642953229287946436433045637175914296604606371988765933288088674127964826707631922216113496674674148986363044496860143671243577643241797\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.00000000000001000000000000005000000000000016666666666666708333333333333416666666666666805555555555555753968253968254216269841269841545414462081129023368606701940285794452461119336553364331142269510325065880736143632969029870898257141643432824401739745683204\",\r\n \"1.000000000000020000000000000200000000000001333333333333340000000000000026666666666666755555555555555809523809523810158730158730160141093474426810582010582010587141253807920483138260916038706972040305373657500641627625779668107710435784086577737371425015371482\",\r\n \"1.000000000000030000000000000450000000000004500000000000033750000000000202500000000001012500000000004339285714285730558035714285768526785714285877008928571429015219155844156953632305194807755135489510494996911570572295830843263878998738775175717176310059097941\",\r\n \"1.000000000000040000000000000800000000000010666666666666773333333333334186666666666672355555555555588063492063492226031746031746754144620811290367548500881844722783389450091142108919886805434894323783520587584079648392819017157643549035718347892490103756832682\",\r\n \"1.000000000000050000000000001250000000000020833333333333593750000000002604166666666688368055555555710565476190477159288194444449826733355379215623966600529222853848504890681243288122630360738677795976463823627917153238548547431722212537579252513491528497895141\",\r\n \"1.000000000000060000000000001800000000000036000000000000540000000000006480000000000064800000000000555428571428575594285714285742057142857143023771428571429480311688311692856103896103917078121878121968011417154274656689596118168895082060796351269490173691870225\",\r\n \"1.000000000000070000000000002450000000000057166666666667667083333333347339166666666830068055555557189569444444458742065972222333425945216050161142110339511126459894079714642471342475838347947074466949660826626759076737909986334434737200569423813868209125061118\",\r\n \"1.000000000000080000000000003200000000000085333333333335040000000000027306666666667030755555555559716571428571470181587301587671455379188715480990476190497710073432740242870747688526349158515558520603402824101263705714914519281853707209898319172054430569538082\",\r\n \"1.000000000000090000000000004050000000000121500000000002733750000000049207500000000738112500000009490017857142963905558035715353341294642866751500223214364330456371753836374526684257328746723198702565062957968528363119291981226734282851988084786564653406103472\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000000000000001000000000000000500000000000000166666666666666708333333333333341666666666666668055555555555555753968253968253993055555555555558311287477954144896384479717813076198492865159533913874191651969590337645893201460227749910289593593991742139890335833\",\r\n \"1.000000000000002000000000000002000000000000001333333333333334000000000000000266666666666666755555555555555580952380952380958730158730158731569664902998236613756613756613807920474587141262359040136817915911249244582578103847945117786412685883585354487957662562\",\r\n \"1.000000000000003000000000000004500000000000004500000000000003375000000000002025000000000001012500000000000433928571428571591294642857142911383928571428587700892857142861580762987012988122463474025974282007055444555499419665156272310102286106750394522086451494\",\r\n \"1.000000000000004000000000000008000000000000010666666666666677333333333333341866666666666672355555555555558806349206349207974603174603175325573192239859195485008818342256751643418310120002137779915568470377359266251234291869212504954247007157060272389965511657\",\r\n \"1.000000000000005000000000000012500000000000020833333333333359375000000000026041666666666688368055555555571056547619047628735739087301592683876212522048546523644179895403141659652076828429435308775782586614292343529022000662935706114244280270246557851904047187\",\r\n \"1.00000000000000600000000000001800000000000003600000000000005400000000000006480000000000006480000000000005554285714285718451428571428574205714285714287380571428571429480311688311688766129870129870339612387612387702277151420008598821521335807063576195233338095\",\r\n \"1.000000000000007000000000000024500000000000057166666666666766708333333333473391666666666830068055555555718956944444444587420659722222333425945216049460558655478395111264598940796886359643059647415484626357278274780213549872841697820531068941222114832031381804\",\r\n \"1.000000000000008000000000000032000000000000085333333333333504000000000000273066666666667030755555555555971657142857143273244444444444814312522045855675083174603174818370575597242407372912190690056753273393273443722265929250083140248634767166738704512418804466\",\r\n \"1.000000000000009000000000000040500000000000121500000000000273375000000000492075000000000738112500000000949001785714286781912723214286781912723214286675150022321429357590278003247342868033177760148459087904283479197083126137413049861121579402108279148620678486\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000000000000000100000000000000005000000000000000166666666666666670833333333333333416666666666666668055555555555555575396825396825397073412698412698415454144620811287505511463844797178381032547699214367968708246486024279861085416640972311235208060604886766427\",\r\n \"1.00000000000000020000000000000002000000000000000133333333333333340000000000000000266666666666666675555555555555555809523809523809530158730158730158871252204585537921693121693121693172999839666506334028111805889583680517013850347183868453709723550995898085845\",\r\n \"1.000000000000000300000000000000045000000000000004500000000000000337500000000000020250000000000001012500000000000043392857142857144484375000000000054241071428571430198660714285714330093344155844156953632305194805220408497752247752796394453760525200069461788209\",\r\n \"1.000000000000000400000000000000080000000000000010666666666666667733333333333333418666666666666672355555555555555880634920634920651174603174603175325573192239858935421516754850089234183100849767551459569237347016202497091385980305660712009918359945816284440624\",\r\n \"1.000000000000000500000000000000125000000000000020833333333333335937500000000000260416666666666688368055555555557105654761904762001643105158730164112447641093474695922205687830700063162628266795443148050027390324771407941980859347644064053414275164241901696431\",\r\n \"1.000000000000000600000000000000180000000000000036000000000000005400000000000000648000000000000064800000000000005554285714285714702285714285714313485714285714287380571428571428662316883116883121427532467532467742209790209790218779163693449408094680176965891264\",\r\n \"1.000000000000000700000000000000245000000000000057166666666666676670833333333334733916666666666830068055555555571895694444444445874206597222222333425945216049390500309992283951112645989407968603531360231364573198294285559476609495997192590078165056998305407027\",\r\n \"1.000000000000000800000000000000320000000000000085333333333333350400000000000002730666666666667030755555555555597165714285714289875301587301587671455379188712551635301587301589453547025813692623823128640906427512749176749177253665475735317032064340416001793007\",\r\n \"1.000000000000000900000000000000405000000000000121500000000000027337500000000004920750000000000738112500000000094900178571428582104841517857143924769866071428667515002232142865004474208603896693517383827110430430324374843908718044757335298787389806890096519491\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000000000000000010000000000000000050000000000000000166666666666666667083333333333333334166666666666666668055555555555555557539682539682539685019841269841269844025573192239858909281305114638447974286515953182619851374191651969429748813429368984924541627170598\",\r\n \"1.000000000000000020000000000000000200000000000000001333333333333333340000000000000000026666666666666666755555555555555555809523809523809524444444444444444445855379188712522048677248677248677253807920474587141262359040136817914608847942181275514627641611768596\",\r\n \"1.000000000000000030000000000000000450000000000000004500000000000000033750000000000000202500000000000001012500000000000004339285714285714301986607142857142911383928571428571591294642857142857586647727272727273836749188311688314248641983016983022469439043099755\",\r\n \"1.000000000000000040000000000000000800000000000000010666666666666666773333333333333334186666666666666672355555555555555588063492063492063654603174603174603897001763668430337986596119929453273294211960878627580319598097375875261423350312239201436005499497562994\",\r\n \"1.000000000000000050000000000000001250000000000000020833333333333333593750000000000002604166666666666688368055555555555710565476190476191445002480158730164112447641093474453719204695767195889520515171556838733191340070680350418458735516027189695036859130361164\",\r\n \"1.000000000000000060000000000000001800000000000000036000000000000000540000000000000006480000000000000064800000000000000555428571428571432737142857142857170628571428571428738057142857142858051740259740259744804155844155844176818381618381618471507920650777793995\",\r\n \"1.000000000000000070000000000000002450000000000000057166666666666667667083333333333347339166666666666830068055555555557189569444444444458742065972222222333425945216049383494475443672839511126459894079685775248531948536288969661078387597485597679474645403468476\",\r\n \"1.00000000000000008000000000000000320000000000000008533333333333333504000000000000002730666666666666703075555555555555971657142857142861303873015873015910002680776014109643337142857142859294816867083533764546815028592806458869675509675510179998402068243340775\",\r\n \"1.000000000000000090000000000000004050000000000000121500000000000002733750000000000049207500000000000738112500000000009490017857142857249619843750000001067627008928571438180071651785714364330456371753247342868033177759744341733736185689336930697323602736706615\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000000000000000001000000000000000000500000000000000000166666666666666666708333333333333333341666666666666666668055555555555555555753968253968253968278769841269841269844025573192239858906801146384479717813076198492865159531828286168563946341724280092335647892\",\r\n \"1.000000000000000002000000000000000002000000000000000001333333333333333334000000000000000000266666666666666666755555555555555555580952380952380952387301587301587301588712522045855379188994708994708994709046015712682379349054566832344610122389215722549055882388\",\r\n \"1.000000000000000003000000000000000004500000000000000004500000000000000003375000000000000002025000000000000001012500000000000000433928571428571428734151785714285714339955357142857142873415178571428571433009334415584415585525060876623376623632656406093906093961\",\r\n \"1.000000000000000004000000000000000008000000000000000010666666666666666677333333333333333341866666666666666672355555555555555558806349206349206350831746031746031746754144620811287478243104056437389770828180214846881513583205600983378761167315976204865093757063\",\r\n \"1.000000000000000005000000000000000012500000000000000020833333333333333359375000000000000026041666666666666688368055555555555571056547619047619057307167658730158735541019069664903000927476025132275133498379754890171557347909954789295067268878100583829750566431\",\r\n \"1.000000000000000006000000000000000018000000000000000036000000000000000054000000000000000064800000000000000064800000000000000055542857142857142898800000000000000027771428571428571445234285714285714294803116883116883121427532467532467534564955044955044955943848\",\r\n \"1.000000000000000007000000000000000024500000000000000057166666666666666766708333333333333473391666666666666830068055555555555718956944444444444587420659722222222333425945216049382793891988811728395111264598940796857492420249120253460546797757670409580139582076\",\r\n \"1.000000000000000008000000000000000032000000000000000085333333333333333504000000000000000273066666666666667030755555555555555971657142857142857558958730158730159100026807760141093770321269841269841485037242263908930719061223879001656867720084360084360134808958\",\r\n \"1.000000000000000009000000000000000040500000000000000121500000000000000273375000000000000492075000000000000738112500000000000949001785714285715353341294642857143924769866071428572389435736607142857929018849431818182407803098112824675732874672319867632630046236\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000000000000000000100000000000000000005000000000000000000166666666666666666670833333333333333333416666666666666666668055555555555555555575396825396825396825644841269841269841272597001763668430335124559082892416225749809603976270642937311691651969429747207541\",\r\n \"1.000000000000000000200000000000000000020000000000000000001333333333333333333400000000000000000002666666666666666666755555555555555555558095238095238095238158730158730158730160141093474426807760169312169312169312169825236491903158569833787611565389343167252501\",\r\n \"1.000000000000000000300000000000000000045000000000000000004500000000000000000337500000000000000020250000000000000001012500000000000000043392857142857142858770089285714285714339955357142857142858770089285714285714330093344155844155845265320616883116883142486419\",\r\n \"1.000000000000000000400000000000000000080000000000000000010666666666666666667733333333333333333418666666666666666672355555555555555555880634920634920634936888888888888888889611287477954144620840183421516754850089234183100849767516469208486986264764043619524508\",\r\n \"1.00000000000000000050000000000000000012500000000000000002083333333333333333593750000000000000026041666666666666668836805555555555555710565476190476190485878596230158730159268387621252204585564830315806878306879530125786636203302920938181626115653895392003709\",\r\n \"1.00000000000000000060000000000000000018000000000000000003600000000000000000540000000000000000064800000000000000006480000000000000000555428571428571428613085714285714285717062857142857142857309485714285714285723374545454545454545908987012987012987033961238761\",\r\n \"1.000000000000000000700000000000000000245000000000000000057166666666666666676670833333333333334733916666666666666830068055555555555571895694444444444445874206597222222222333425945216049382723833643325617283951112645989407968574664137420837425177704511425598692\",\r\n \"1.000000000000000000800000000000000000320000000000000000085333333333333333350400000000000000002730666666666666667030755555555555555597165714285714285718446730158730158730528598236331569664932587682539682539684691642263908930575740706245524023301809908131572135\",\r\n \"1.000000000000000000900000000000000000405000000000000000121500000000000000027337500000000000004920750000000000000738112500000000000094900178571428571439247698660714285715353341294642857142953229287946428571436433045637175324675914296604606331168871988765933284\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000000000000000000010000000000000000000050000000000000000000166666666666666666667083333333333333333334166666666666666666668055555555555555555557539682539682539682542162698412698412698415454144620811287477956900352733686067019402857944524611191277860032200311\",\r\n \"1.000000000000000000020000000000000000000200000000000000000001333333333333333333340000000000000000000026666666666666666666755555555555555555555809523809523809523810158730158730158730160141093474426807760143915343915343915343920474587141253807920483138260916037\",\r\n \"1.000000000000000000030000000000000000000450000000000000000004500000000000000000033750000000000000000202500000000000000001012500000000000000004339285714285714285730558035714285714285768526785714285714285877008928571428571429015219155844155844156953632305194803\",\r\n \"1.000000000000000000040000000000000000000800000000000000000010666666666666666666773333333333333333334186666666666666666672355555555555555555588063492063492063492226031746031746031746754144620811287477957034215167548500881844722783389450056116757808775586553367\",\r\n \"1.0000000000000000000500000000000000000012500000000000000000208333333333333333335937500000000000000026041666666666666666883680555555555555557105654761904761904771592881944444444444498267333553791887125489572999338624338625561871818382235048906812432881226284\",\r\n \"1.000000000000000000060000000000000000001800000000000000000036000000000000000000540000000000000000006480000000000000000064800000000000000000555428571428571428575594285714285714285742057142857142857143023771428571428571429480311688311688311692856103896103896105\",\r\n \"1.000000000000000000070000000000000000002450000000000000000057166666666666666667667083333333333333347339166666666666666830068055555555555557189569444444444444458742065972222222222333425945216049382716827808777006172839511126459894079685746381309138009142349419\",\r\n \"1.000000000000000000080000000000000000003200000000000000000085333333333333333335040000000000000000027306666666666666667030755555555555555559716571428571428571470181587301587301587671455379188712522048814323809523809523831043406766073432740242870747688525466307\",\r\n \"1.000000000000000000090000000000000000004050000000000000000121500000000000000002733750000000000000049207500000000000000738112500000000000009490017857142857142963905558035714285715353341294642857142866751500223214285714364330456371753246753836374526684253246756\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000000000000000000001000000000000000000000500000000000000000000166666666666666666666708333333333333333333341666666666666666666668055555555555555555555753968253968253968253993055555555555555555558311287477954144620811563051146384479717813076198492865159531825\",\r\n \"1.000000000000000000002000000000000000000002000000000000000000001333333333333333333334000000000000000000000266666666666666666666755555555555555555555580952380952380952380958730158730158730158731569664902998236331569947089947089947089947141253807920474587141263\",\r\n \"1.000000000000000000003000000000000000000004500000000000000000004500000000000000000003375000000000000000002025000000000000000001012500000000000000000433928571428571428571591294642857142857142911383928571428571428587700892857142857142861580762987012987012988123\",\r\n \"1.000000000000000000004000000000000000000008000000000000000000010666666666666666666677333333333333333333341866666666666666666672355555555555555555558806349206349206349207974603174603174603175325573192239858906525862151675485008818342256751643418310084976786668\",\r\n \"1.000000000000000000005000000000000000000012500000000000000000020833333333333333333359375000000000000000026041666666666666666688368055555555555555571056547619047619047628735739087301587301592683876212522045855381879856977513227513228736474992985409652076828429\",\r\n \"1.000000000000000000006000000000000000000018000000000000000000036000000000000000000054000000000000000000064800000000000000000064800000000000000000055542857142857142857184514285714285714285742057142857142857142873805714285714285714294803116883116883116887661297\",\r\n \"1.000000000000000000007000000000000000000024500000000000000000057166666666666666666766708333333333333333473391666666666666666830068055555555555555718956944444444444444587420659722222222222333425945216049382716127225322145061728395111264598940796857463553026308\",\r\n \"1.000000000000000000008000000000000000000032000000000000000000085333333333333333333504000000000000000000273066666666666666667030755555555555555555971657142857142857143273244444444444444444814312522045855379189008416507936507936508151703908930575597242407372915\",\r\n \"1.000000000000000000009000000000000000000040500000000000000000121500000000000000000273375000000000000000492075000000000000000738112500000000000000949001785714285714286781912723214285714286781912723214285714286675150022321428571429357590278003246753247342868031\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000000000000000000000100000000000000000000005000000000000000000000166666666666666666666670833333333333333333333416666666666666666666668055555555555555555555575396825396825396825397073412698412698412698415454144620811287477954172178130511463844797178381032548\",\r\n \"1.00000000000000000000020000000000000000000002000000000000000000000133333333333333333333340000000000000000000000266666666666666666666675555555555555555555555809523809523809523809530158730158730158730158871252204585537918871255026455026455026455026506333173\",\r\n \"1.000000000000000000000300000000000000000000045000000000000000000004500000000000000000000337500000000000000000020250000000000000000001012500000000000000000043392857142857142857144484375000000000000000054241071428571428571430198660714285714285714330093344155846\",\r\n \"1.000000000000000000000400000000000000000000080000000000000000000010666666666666666666667733333333333333333333418666666666666666666672355555555555555555555880634920634920634920651174603174603174603175325573192239858906525602088183421516754850089234183100849766\",\r\n \"1.00000000000000000000050000000000000000000012500000000000000000002083333333333333333333593750000000000000000026041666666666666666668836805555555555555555710565476190476190476200164310515873015873016411244764109347442680802925553902116402116403339649596160013\",\r\n \"1.000000000000000000000600000000000000000000180000000000000000000036000000000000000000005400000000000000000000648000000000000000000064800000000000000000005554285714285714285714702285714285714285714313485714285714285714287380571428571428571428662316883116883115\",\r\n \"1.000000000000000000000700000000000000000000245000000000000000000057166666666666666666676670833333333333333334733916666666666666666830068055555555555555571895694444444444444445874206597222222222222333425945216049382716057166976658950617283951112645989407968576\",\r\n \"1.000000000000000000000800000000000000000000320000000000000000000085333333333333333333350400000000000000000002730666666666666666667030755555555555555555597165714285714285714289875301587301587301587671455379188712522045884968634920634920634922786880359147025816\",\r\n \"1.000000000000000000000900000000000000000000405000000000000000000121500000000000000000027337500000000000000004920750000000000000000738112500000000000000094900178571428571428582104841517857142857143924769866071428571428667515002232142857142865004474208603896105\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000000000000000000000010000000000000000000000050000000000000000000000166666666666666666666667083333333333333333333334166666666666666666666668055555555555555555555557539682539682539682539685019841269841269841269844025573192239858906525575947971781305114638449\",\r\n \"1.000000000000000000000020000000000000000000000200000000000000000000001333333333333333333333340000000000000000000000026666666666666666666666755555555555555555555555809523809523809523809524444444444444444444444445855379188712522045855382010582010582010582010585\",\r\n \"1.000000000000000000000030000000000000000000000450000000000000000000004500000000000000000000033750000000000000000000202500000000000000000001012500000000000000000004339285714285714285714301986607142857142857142911383928571428571428571591294642857142857142857586\",\r\n \"1.000000000000000000000040000000000000000000000800000000000000000000010666666666666666666666773333333333333333333334186666666666666666666672355555555555555555555588063492063492063492063654603174603174603174603897001763668430335097004653262786596119929453273303\",\r\n \"1.000000000000000000000050000000000000000000001250000000000000000000020833333333333333333333593750000000000000000002604166666666666666666688368055555555555555555710565476190476190476191445002480158730158730164112447641093474426807787052538029100529100529222855\",\r\n \"1.000000000000000000000060000000000000000000001800000000000000000000036000000000000000000000540000000000000000000006480000000000000000000064800000000000000000000555428571428571428571432737142857142857142857170628571428571428571428738057142857142857142858051741\",\r\n \"1.000000000000000000000070000000000000000000002450000000000000000000057166666666666666666667667083333333333333333347339166666666666666666830068055555555555555557189569444444444444444458742065972222222222222333425945216049382716050161142110339506172839511126458\",\r\n \"1.000000000000000000000080000000000000000000003200000000000000000000085333333333333333333335040000000000000000000027306666666666666666667030755555555555555555559716571428571428571428613038730158730158730159100026807760141093474429766704761904761904761926281501\",\r\n \"1.000000000000000000000090000000000000000000004050000000000000000000121500000000000000000002733750000000000000000049207500000000000000000738112500000000000000009490017857142857142857249619843750000000000001067627008928571428571438180071651785714285714364330459\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000000000000000000000001000000000000000000000000500000000000000000000000166666666666666666666666708333333333333333333333341666666666666666666666668055555555555555555555555753968253968253968253968278769841269841269841269844025573192239858906525573467813051147\",\r\n \"1.000000000000000000000002000000000000000000000002000000000000000000000001333333333333333333333334000000000000000000000000266666666666666666666666755555555555555555555555580952380952380952380952387301587301587301587301588712522045855379188712522328042328042329\",\r\n \"1.000000000000000000000003000000000000000000000004500000000000000000000004500000000000000000000003375000000000000000000002025000000000000000000001012500000000000000000000433928571428571428571428734151785714285714285714339955357142857142857142873415178571428569\",\r\n \"1.000000000000000000000004000000000000000000000008000000000000000000000010666666666666666666666677333333333333333333333341866666666666666666666672355555555555555555555558806349206349206349206350831746031746031746031746754144620811287477954144909770723104056436\",\r\n \"1.000000000000000000000005000000000000000000000012500000000000000000000020833333333333333333333359375000000000000000000026041666666666666666666688368055555555555555555571056547619047619047619057307167658730158730158735541019069664902998236334260809358465608467\",\r\n \"1.000000000000000000000006000000000000000000000018000000000000000000000036000000000000000000000054000000000000000000000064800000000000000000000064800000000000000000000055542857142857142857142898800000000000000000000027771428571428571428571445234285714285714286\",\r\n \"1.000000000000000000000007000000000000000000000024500000000000000000000057166666666666666666666766708333333333333333333473391666666666666666666830068055555555555555555718956944444444444444444587420659722222222222222333425945216049382716049460558655478395061727\",\r\n \"1.000000000000000000000008000000000000000000000032000000000000000000000085333333333333333333333504000000000000000000000273066666666666666666667030755555555555555555555971657142857142857142857558958730158730158730159100026807760141093474427103654603174603174605\",\r\n \"1.000000000000000000000009000000000000000000000040500000000000000000000121500000000000000000000273375000000000000000000492075000000000000000000738112500000000000000000949001785714285714285715353341294642857142857143924769866071428571428572389435736607142857144\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000000000000000000000000100000000000000000000000005000000000000000000000000166666666666666666666666670833333333333333333333333416666666666666666666666668055555555555555555555555575396825396825396825396825644841269841269841269841272597001763668430335097001788\",\r\n \"1.000000000000000000000000200000000000000000000000020000000000000000000000001333333333333333333333333400000000000000000000000002666666666666666666666666755555555555555555555555558095238095238095238095238158730158730158730158730160141093474426807760141093502646\",\r\n \"1.000000000000000000000000300000000000000000000000045000000000000000000000004500000000000000000000000337500000000000000000000020250000000000000000000001012500000000000000000000043392857142857142857142858770089285714285714285714339955357142857142857142858770088\",\r\n \"1.000000000000000000000000400000000000000000000000080000000000000000000000010666666666666666666666667733333333333333333333333418666666666666666666666672355555555555555555555555880634920634920634920634936888888888888888888888889611287477954144620811287506850092\",\r\n \"1.000000000000000000000000500000000000000000000000125000000000000000000000020833333333333333333333335937500000000000000000000260416666666666666666666688368055555555555555555557105654761904761904761904858785962301587301587301592683876212522045855379188981636508\",\r\n \"1.000000000000000000000000600000000000000000000000180000000000000000000000036000000000000000000000005400000000000000000000000648000000000000000000000064800000000000000000000005554285714285714285714286130857142857142857142857170628571428571428571428573094857144\",\r\n \"1.00000000000000000000000070000000000000000000000024500000000000000000000005716666666666666666666667667083333333333333333333473391666666666666666666683006805555555555555555557189569444444444444444444587420659722222222222222233342594521604938271604939050030999\",\r\n \"1.000000000000000000000000800000000000000000000000320000000000000000000000085333333333333333333333350400000000000000000000002730666666666666666666667030755555555555555555555597165714285714285714285718446730158730158730158730528598236331569664902998265921015871\",\r\n \"1.000000000000000000000000900000000000000000000000405000000000000000000000121500000000000000000000027337500000000000000000004920750000000000000000000738112500000000000000000094900178571428571428571439247698660714285714285715353341294642857142857142953229287949\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000000000000000000000000010000000000000000000000000050000000000000000000000000166666666666666666666666667083333333333333333333333334166666666666666666666666668055555555555555555555555557539682539682539682539682542162698412698412698412698415454144620811287477\",\r\n \"1.000000000000000000000000020000000000000000000000000200000000000000000000000001333333333333333333333333340000000000000000000000000026666666666666666666666666755555555555555555555555555809523809523809523809523810158730158730158730158730160141093474426807760139\",\r\n \"1.000000000000000000000000030000000000000000000000000450000000000000000000000004500000000000000000000000033750000000000000000000000202500000000000000000000001012500000000000000000000004339285714285714285714285730558035714285714285714285768526785714285714285713\",\r\n \"1.000000000000000000000000040000000000000000000000000800000000000000000000000010666666666666666666666666773333333333333333333333334186666666666666666666666672355555555555555555555555588063492063492063492063492226031746031746031746031746754144620811287477954144\",\r\n \"1.000000000000000000000000050000000000000000000000001250000000000000000000000020833333333333333333333333593750000000000000000000002604166666666666666666666688368055555555555555555555710565476190476190476190477159288194444444444444444449826733355379188712522045\",\r\n \"1.000000000000000000000000060000000000000000000000001800000000000000000000000036000000000000000000000000540000000000000000000000006480000000000000000000000064800000000000000000000000555428571428571428571428575594285714285714285714285742057142857142857142857143\",\r\n \"1.000000000000000000000000070000000000000000000000002450000000000000000000000057166666666666666666666667667083333333333333333333347339166666666666666666666830068055555555555555555557189569444444444444444444458742065972222222222222222333425945216049382716049381\",\r\n \"1.000000000000000000000000080000000000000000000000003200000000000000000000000085333333333333333333333335040000000000000000000000027306666666666666666666667030755555555555555555555559716571428571428571428571470181587301587301587301587671455379188712522045855382\",\r\n \"1.000000000000000000000000090000000000000000000000004050000000000000000000000121500000000000000000000002733750000000000000000000049207500000000000000000000738112500000000000000000009490017857142857142857142963905558035714285714285715353341294642857142857142868\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000000000000000000000000001000000000000000000000000000500000000000000000000000000166666666666666666666666666708333333333333333333333333341666666666666666666666666668055555555555555555555555555753968253968253968253968253993055555555555555555555555558311287479\",\r\n \"1.000000000000000000000000002000000000000000000000000002000000000000000000000000001333333333333333333333333334000000000000000000000000000266666666666666666666666666755555555555555555555555555580952380952380952380952380958730158730158730158730158731569664902999\",\r\n \"1.00000000000000000000000000300000000000000000000000000450000000000000000000000000450000000000000000000000000337500000000000000000000000202500000000000000000000000101250000000000000000000000043392857142857142857142857159129464285714285714285714291138392857143\",\r\n \"1.000000000000000000000000004000000000000000000000000008000000000000000000000000010666666666666666666666666677333333333333333333333333341866666666666666666666666672355555555555555555555555558806349206349206349206349207974603174603174603174603175325573192239859\",\r\n \"1.000000000000000000000000005000000000000000000000000012500000000000000000000000020833333333333333333333333359375000000000000000000000026041666666666666666666666688368055555555555555555555571056547619047619047619047628735739087301587301587301592683876212522047\",\r\n \"1.000000000000000000000000006000000000000000000000000018000000000000000000000000036000000000000000000000000054000000000000000000000000064800000000000000000000000064800000000000000000000000055542857142857142857142857184514285714285714285714285742057142857142858\",\r\n \"1.000000000000000000000000007000000000000000000000000024500000000000000000000000057166666666666666666666666766708333333333333333333333473391666666666666666666666830068055555555555555555555718956944444444444444444444587420659722222222222222222333425945216049384\",\r\n \"1.000000000000000000000000008000000000000000000000000032000000000000000000000000085333333333333333333333333504000000000000000000000000273066666666666666666666667030755555555555555555555555971657142857142857142857143273244444444444444444444444814312522045855381\",\r\n \"1.000000000000000000000000009000000000000000000000000040500000000000000000000000121500000000000000000000000273375000000000000000000000492075000000000000000000000738112500000000000000000000949001785714285714285714286781912723214285714285714286781912723214285713\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000000000000000000000000000100000000000000000000000000005000000000000000000000000000166666666666666666666666666670833333333333333333333333333416666666666666666666666666668055555555555555555555555555575396825396825396825396825397073412698412698412698412698414\",\r\n \"1.000000000000000000000000000200000000000000000000000000020000000000000000000000000001333333333333333333333333333400000000000000000000000000002666666666666666666666666666755555555555555555555555555558095238095238095238095238095301587301587301587301587301588711\",\r\n \"1.000000000000000000000000000300000000000000000000000000045000000000000000000000000004500000000000000000000000000337500000000000000000000000020250000000000000000000000001012500000000000000000000000043392857142857142857142857144484375000000000000000000000054239\",\r\n \"1.000000000000000000000000000400000000000000000000000000080000000000000000000000000010666666666666666666666666667733333333333333333333333333418666666666666666666666666672355555555555555555555555555880634920634920634920634920651174603174603174603174603175325574\",\r\n \"1.000000000000000000000000000500000000000000000000000000125000000000000000000000000020833333333333333333333333335937500000000000000000000000260416666666666666666666666688368055555555555555555555557105654761904761904761904762001643105158730158730158730164112449\",\r\n \"1.000000000000000000000000000600000000000000000000000000180000000000000000000000000036000000000000000000000000005400000000000000000000000000648000000000000000000000000064800000000000000000000000005554285714285714285714285714702285714285714285714285714313485713\",\r\n \"1.000000000000000000000000000700000000000000000000000000245000000000000000000000000057166666666666666666666666676670833333333333333333333334733916666666666666666666666830068055555555555555555555571895694444444444444444444445874206597222222222222222222333425947\",\r\n \"1.000000000000000000000000000800000000000000000000000000320000000000000000000000000085333333333333333333333333350400000000000000000000000002730666666666666666666666667030755555555555555555555555597165714285714285714285714289875301587301587301587301587671455379\",\r\n \"1.000000000000000000000000000900000000000000000000000000405000000000000000000000000121500000000000000000000000027337500000000000000000000004920750000000000000000000000738112500000000000000000000094900178571428571428571428582104841517857142857142857143924769868\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000000000000000000000000000010000000000000000000000000000050000000000000000000000000000166666666666666666666666666667083333333333333333333333333334166666666666666666666666666668055555555555555555555555555557539682539682539682539682539685019841269841269841268\",\r\n \"1.000000000000000000000000000020000000000000000000000000000200000000000000000000000000001333333333333333333333333333340000000000000000000000000000026666666666666666666666666666755555555555555555555555555555809523809523809523809523809524444444444444444444444447\",\r\n \"1.000000000000000000000000000030000000000000000000000000000450000000000000000000000000004500000000000000000000000000033750000000000000000000000000202500000000000000000000000001012500000000000000000000000004339285714285714285714285714301986607142857142857142859\",\r\n \"1.000000000000000000000000000040000000000000000000000000000800000000000000000000000000010666666666666666666666666666773333333333333333333333333334186666666666666666666666666672355555555555555555555555555588063492063492063492063492063654603174603174603174603175\",\r\n \"1.000000000000000000000000000050000000000000000000000000001250000000000000000000000000020833333333333333333333333333593750000000000000000000000002604166666666666666666666666688368055555555555555555555555710565476190476190476190476191445002480158730158730158732\",\r\n \"1.000000000000000000000000000060000000000000000000000000001800000000000000000000000000036000000000000000000000000000540000000000000000000000000006480000000000000000000000000064800000000000000000000000000555428571428571428571428571432737142857142857142857142857\",\r\n \"1.000000000000000000000000000070000000000000000000000000002450000000000000000000000000057166666666666666666666666667667083333333333333333333333347339166666666666666666666666830068055555555555555555555557189569444444444444444444444458742065972222222222222222222\",\r\n \"1.000000000000000000000000000080000000000000000000000000003200000000000000000000000000085333333333333333333333333335040000000000000000000000000027306666666666666666666666667030755555555555555555555555559716571428571428571428571428613038730158730158730158730158\",\r\n \"1.00000000000000000000000000009000000000000000000000000000405000000000000000000000000012150000000000000000000000000273375000000000000000000000004920750000000000000000000000073811250000000000000000000000949001785714285714285714285724961984375\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.00000000000000000000000000000100000000000000000000000000000050000000000000000000000000000016666666666666666666666666666670833333333333333333333333333334166666666666666666666666666666805555555555555555555555555555575396825396825396825396825396827876984126984\",\r\n \"1.000000000000000000000000000002000000000000000000000000000002000000000000000000000000000001333333333333333333333333333334000000000000000000000000000000266666666666666666666666666666755555555555555555555555555555580952380952380952380952380952387301587301587304\",\r\n \"1.000000000000000000000000000003000000000000000000000000000004500000000000000000000000000004500000000000000000000000000003375000000000000000000000000002025000000000000000000000000001012500000000000000000000000000433928571428571428571428571428734151785714285719\",\r\n \"1.000000000000000000000000000004000000000000000000000000000008000000000000000000000000000010666666666666666666666666666677333333333333333333333333333341866666666666666666666666666672355555555555555555555555555558806349206349206349206349206350831746031746031746\",\r\n \"1.00000000000000000000000000000500000000000000000000000000001250000000000000000000000000002083333333333333333333333333335937500000000000000000000000002604166666666666666666666666668836805555555555555555555555557105654761904761904761904761905730716765873015873\",\r\n \"1.000000000000000000000000000006000000000000000000000000000018000000000000000000000000000036000000000000000000000000000054000000000000000000000000000064800000000000000000000000000064800000000000000000000000000055542857142857142857142857142898799999999999999999\",\r\n \"1.00000000000000000000000000000700000000000000000000000000002450000000000000000000000000005716666666666666666666666666676670833333333333333333333333347339166666666666666666666666683006805555555555555555555555571895694444444444444444444444458742065972222222222\",\r\n \"1.00000000000000000000000000000800000000000000000000000000003200000000000000000000000000008533333333333333333333333333350400000000000000000000000000027306666666666666666666666666703075555555555555555555555555597165714285714285714285714285755895873015873015873\",\r\n \"1.000000000000000000000000000009000000000000000000000000000040500000000000000000000000000121500000000000000000000000000273375000000000000000000000000492075000000000000000000000000738112500000000000000000000000949001785714285714285714285715353341294642857142859\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000000000000000000000000000000100000000000000000000000000000005000000000000000000000000000000166666666666666666666666666666670833333333333333333333333333333416666666666666666666666666666668055555555555555555555555555555575396825396825396825396825396825644842\",\r\n \"1.000000000000000000000000000000200000000000000000000000000000020000000000000000000000000000001333333333333333333333333333333400000000000000000000000000000002666666666666666666666666666666755555555555555555555555555555558095238095238095238095238095238158730159\",\r\n \"1.000000000000000000000000000000300000000000000000000000000000045000000000000000000000000000004500000000000000000000000000000337500000000000000000000000000020250000000000000000000000000001012500000000000000000000000000043392857142857142857142857142858770089287\",\r\n \"1.000000000000000000000000000000400000000000000000000000000000080000000000000000000000000000010666666666666666666666666666667733333333333333333333333333333418666666666666666666666666666672355555555555555555555555555555880634920634920634920634920634936888888889\",\r\n \"1.000000000000000000000000000000500000000000000000000000000000125000000000000000000000000000020833333333333333333333333333335937500000000000000000000000000260416666666666666666666666666688368055555555555555555555555557105654761904761904761904761904858785962301\",\r\n \"1.000000000000000000000000000000600000000000000000000000000000180000000000000000000000000000036000000000000000000000000000005400000000000000000000000000000648000000000000000000000000000064800000000000000000000000000005554285714285714285714285714286130857142859\",\r\n \"1.00000000000000000000000000000070000000000000000000000000000024500000000000000000000000000005716666666666666666666666666667667083333333333333333333333333473391666666666666666666666666683006805555555555555555555555557189569444444444444444444444444587420659722\",\r\n \"1.000000000000000000000000000000800000000000000000000000000000320000000000000000000000000000085333333333333333333333333333350400000000000000000000000000002730666666666666666666666666667030755555555555555555555555555597165714285714285714285714285718446730158732\",\r\n \"1.000000000000000000000000000000900000000000000000000000000000405000000000000000000000000000121500000000000000000000000000027337500000000000000000000000004920750000000000000000000000000738112500000000000000000000000094900178571428571428571428571439247698660714\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000000000000000000000000000000010000000000000000000000000000000050000000000000000000000000000000166666666666666666666666666666667083333333333333333333333333333334166666666666666666666666666666668055555555555555555555555555555557539682539682539682539682539682\",\r\n \"1.000000000000000000000000000000020000000000000000000000000000000200000000000000000000000000000001333333333333333333333333333333340000000000000000000000000000000026666666666666666666666666666666755555555555555555555555555555555809523809523809523809523809523812\",\r\n \"1.000000000000000000000000000000030000000000000000000000000000000450000000000000000000000000000004500000000000000000000000000000033750000000000000000000000000000202500000000000000000000000000001012500000000000000000000000000004339285714285714285714285714285728\",\r\n \"1.000000000000000000000000000000040000000000000000000000000000000800000000000000000000000000000010666666666666666666666666666666773333333333333333333333333333334186666666666666666666666666666672355555555555555555555555555555588063492063492063492063492063492225\",\r\n \"1.000000000000000000000000000000050000000000000000000000000000001250000000000000000000000000000020833333333333333333333333333333593750000000000000000000000000002604166666666666666666666666666688368055555555555555555555555555710565476190476190476190476190477159\",\r\n \"1.000000000000000000000000000000060000000000000000000000000000001800000000000000000000000000000036000000000000000000000000000000540000000000000000000000000000006480000000000000000000000000000064800000000000000000000000000000555428571428571428571428571428575594\",\r\n \"1.00000000000000000000000000000007000000000000000000000000000000245000000000000000000000000000005716666666666666666666666666666766708333333333333333333333333334733916666666666666666666666666683006805555555555555555555555555718956944444444444444444444444445874\",\r\n \"1.000000000000000000000000000000080000000000000000000000000000003200000000000000000000000000000085333333333333333333333333333335040000000000000000000000000000027306666666666666666666666666667030755555555555555555555555555559716571428571428571428571428571470183\",\r\n \"1.000000000000000000000000000000090000000000000000000000000000004050000000000000000000000000000121500000000000000000000000000002733750000000000000000000000000049207500000000000000000000000000738112500000000000000000000000009490017857142857142857142857142963907\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000000000000000000000000000000001000000000000000000000000000000000500000000000000000000000000000000166666666666666666666666666666666708333333333333333333333333333333341666666666666666666666666666666668055555555555555555555555555555555753968253968253968253988\",\r\n \"1.000000000000000000000000000000002000000000000000000000000000000002000000000000000000000000000000001333333333333333333333333333333334000000000000000000000000000000000266666666666666666666666666666666755555555555555555555555555555555580952380952380952380952383\",\r\n \"1.00000000000000000000000000000000300000000000000000000000000000000450000000000000000000000000000000450000000000000000000000000000000337500000000000000000000000000000202500000000000000000000000000000101250000000000000000000000000000043392857142857142857142857\",\r\n \"1.000000000000000000000000000000004000000000000000000000000000000008000000000000000000000000000000010666666666666666666666666666666677333333333333333333333333333333341866666666666666666666666666666672355555555555555555555555555555558806349206349206349206349208\",\r\n \"1.000000000000000000000000000000005000000000000000000000000000000012500000000000000000000000000000020833333333333333333333333333333359375000000000000000000000000000026041666666666666666666666666666688368055555555555555555555555555571056547619047619047619047618\",\r\n \"1.00000000000000000000000000000000600000000000000000000000000000001800000000000000000000000000000003600000000000000000000000000000005400000000000000000000000000000006480000000000000000000000000000006480000000000000000000000000000005554285714285714285714285714\",\r\n \"1.000000000000000000000000000000007000000000000000000000000000000024500000000000000000000000000000057166666666666666666666666666666766708333333333333333333333333333473391666666666666666666666666666830068055555555555555555555555555718956944444444444444444444443\",\r\n \"1.000000000000000000000000000000008000000000000000000000000000000032000000000000000000000000000000085333333333333333333333333333333504000000000000000000000000000000273066666666666666666666666666667030755555555555555555555555555555971657142857142857142857142858\",\r\n \"1.000000000000000000000000000000009000000000000000000000000000000040500000000000000000000000000000121500000000000000000000000000000273375000000000000000000000000000492075000000000000000000000000000738112500000000000000000000000000949001785714285714285714285715\"\r\n ],\r\n [\r\n \"1\",\r\n \"1.000000000000000000000000000000000100000000000000000000000000000000005000000000000000000000000000000000166666666666666666666666666666666670833333333333333333333333333333333416666666666666666666666666666666668055555555555555555555555555555555575396825396825398\",\r\n \"1.000000000000000000000000000000000200000000000000000000000000000000020000000000000000000000000000000001333333333333333333333333333333333400000000000000000000000000000000002666666666666666666666666666666666755555555555555555555555555555555558095238095238095238\",\r\n \"1.000000000000000000000000000000000300000000000000000000000000000000045000000000000000000000000000000004500000000000000000000000000000000337500000000000000000000000000000020250000000000000000000000000000001012500000000000000000000000000000043392857142857142855\",\r\n \"1.000000000000000000000000000000000400000000000000000000000000000000080000000000000000000000000000000010666666666666666666666666666666667733333333333333333333333333333333418666666666666666666666666666666672355555555555555555555555555555555880634920634920634923\",\r\n \"1.000000000000000000000000000000000500000000000000000000000000000000125000000000000000000000000000000020833333333333333333333333333333335937500000000000000000000000000000260416666666666666666666666666666688368055555555555555555555555555557105654761904761904763\",\r\n \"1.000000000000000000000000000000000600000000000000000000000000000000180000000000000000000000000000000036000000000000000000000000000000005400000000000000000000000000000000648000000000000000000000000000000064800000000000000000000000000000005554285714285714285715\",\r\n \"1.000000000000000000000000000000000700000000000000000000000000000000245000000000000000000000000000000057166666666666666666666666666666676670833333333333333333333333333334733916666666666666666666666666666830068055555555555555555555555555571895694444444444444448\",\r\n \"1.000000000000000000000000000000000800000000000000000000000000000000320000000000000000000000000000000085333333333333333333333333333333350400000000000000000000000000000002730666666666666666666666666666667030755555555555555555555555555555597165714285714285714288\",\r\n \"1.00000000000000000000000000000000090000000000000000000000000000000040500000000000000000000000000000012150000000000000000000000000000002733750000000000000000000000000000492075000000000000000000000000000073811250000000000000000000000000009490017857142857142858\"\r\n ]\r\n]","import { abs } from \"./abs\";\r\nimport { add } from \"./add\";\r\nimport { lessThan, equals, greaterThan } from \"./compareTo\";\r\nimport { divide } from \"./divide\";\r\nimport { multiply } from \"./multiply\";\r\nimport { pow } from \"./pow\";\r\nimport { roundOff } from \"./round\";\r\nimport { subtract } from \"./subtract\";\r\nimport { E_ROOTS_FOR_POW } from \"./tables/e\";\r\nimport { tolerance } from \"./utils\";\r\n\r\nexport const E = roundOff('2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921817413596629043572900334295260595630738132328627943490763233829880753195251019011573834187930702154089149934884167509244761460668082264', 257);\r\nexport const LN2 = '0.69314718055994530941723212145818';\r\nexport const LOG2E = '1.44269504088896340735992468100188';\r\nexport const LN10 = '2.30258509299404568392825848336901';\r\nexport const LOG10E = '0.43429448190325182766805360691429';\r\n\r\nexport function Euler(precision: number = 32) {\r\n precision = Math.max(16, precision)\r\n let result = '1';\r\n let n = '1';\r\n let f = '1';\r\n\r\n while(true){\r\n f = multiply(f, n);\r\n const next = divide('1', f, precision + 2)\r\n\r\n if(lessThan(abs(next), tolerance(precision))){\r\n return roundOff(result, precision);\r\n }\r\n\r\n result = add(result, next);\r\n n = add(n,'1');\r\n }\r\n}\r\n\r\nexport function exp(exponent: number | string) {\r\n exponent = exponent.toString();\r\n const remainder = exponent.split('.')[1];\r\n let result = pow(E, abs(exponent).split('.')[0], 33);\r\n let fractionalExponent = '1';\r\n\r\n if (remainder) {\r\n for (let i = 0; i < Math.min(33,remainder.length); i++) {\r\n fractionalExponent = multiply(fractionalExponent, E_ROOTS_FOR_POW[i][remainder[i]])\r\n }\r\n result = multiply(result, fractionalExponent)\r\n }\r\n\r\n return pow(E, exponent, 33);\r\n}\r\n\r\nexport function expm1(exponent: number | string) {\r\n exponent = exponent.toString();\r\n return subtract(exp(exponent), '1')\r\n}\r\n\r\nexport function ln(x: string | number = 2) {\r\n x = x.toString();\r\n if (lessThan(x, '0', true)) {\r\n throw \"[ln]: x must be greater than 0\";\r\n }\r\n\r\n if (equals(x, '1')) {\r\n return '0'; // ln(1) = 0\r\n }\r\n\r\n let result = '0';\r\n let term = divide(subtract(x, '1'), add(x, '1'), 33);\r\n let i = 0;\r\n while (true) {\r\n i++\r\n let iteration = subtract(multiply('2', i), '1');\r\n let next = multiply(divide('1', iteration, 33), pow(term, iteration));\r\n if (lessThan(next, tolerance(33))) {\r\n return roundOff(multiply('2', add(result, next)), 32);\r\n }\r\n result = add(result, next);\r\n }\r\n\r\n}\r\n\r\nexport function ln2(x: string | number = 2) {\r\n x = x.toString();\r\n if (lessThan(x, '0', true)) {\r\n throw \"[ln2]: x must be greater than 0\";\r\n }\r\n let result = '0';\r\n while (greaterThan(x, '2', true)) {\r\n x = divide(x, 2, 33);\r\n result = add(result, '1');\r\n }\r\n return roundOff(add(result, divide(ln(x), LN2,33)), 32);\r\n}\r\n\r\nexport function log(base: string | number) {\r\n base = base.toString();\r\n return roundOff(multiply(ln2(base), LN2), 32);\r\n}\r\n\r\nexport function log10(base: string | number) {\r\n base = base.toString();\r\n return divide(log(base), LN10, 32);\r\n}","import { abs } from \"./abs\";\r\nimport { add } from \"./add\";\r\nimport { greaterThan, isExatclyZero, lessThan } from \"./compareTo\";\r\nimport { divide } from \"./divide\";\r\nimport { exp } from \"./logarithm\";\r\nimport { modulus } from \"./modulus\";\r\nimport { multiply } from \"./multiply\";\r\nimport { pow, sqRoot } from \"./pow\";\r\nimport { roundOff } from \"./round\";\r\nimport { stripTrailingZero } from \"./stripTrailingZero\";\r\nimport { negate, subtract } from \"./subtract\";\r\nimport { alternatingSeries, factorial, isAproxOne, isAproxZero, sign, tolerance } from \"./utils\";\r\n\r\n// PI up to the first 64 decimal places\r\nexport const PI = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229'\r\n\r\n// Hypotenuse \r\nexport function hypot(a: number | string, b: number | string) {\r\n a = a.toString();\r\n b = b.toString();\r\n return sqRoot(add(pow(a, '2'), add(pow(b, '2'))));\r\n}\r\n\r\n// Sine functions\r\nexport function sin(x: number | string) {\r\n x = x.toString();\r\n\r\n if (greaterThan(abs(x), PI)) {\r\n let r = divide(x, PI, 33).split('.')\r\n x = stripTrailingZero(roundOff(multiply(pow(negate(sign(x).toString()), r[0]), multiply(PI, (r[1]) ? '0.' + r[1] : '0')), 32));\r\n }\r\n\r\n let result = '0';\r\n let _sign = '1';\r\n let n = '1'; // Series iteration\r\n let f = '1'; // Factorial product\r\n\r\n while (true) {\r\n const N = subtract(multiply(n, '2'), '1'); // Next real term in series (even terms cancel)\r\n f = multiply(f, N);\r\n\r\n const next = multiply(_sign, divide(pow(x, N, 33), f, 34));\r\n\r\n if (lessThan(abs(next), tolerance(33))) {\r\n result = add(result, next);\r\n return stripTrailingZero(isAproxZero(result) ? '0' : isAproxOne(result) ? multiply('1', sign(result).toString()) : result);\r\n }\r\n result = add(result, next);\r\n _sign = negate(_sign)\r\n f = multiply(f, multiply(n, '2')); // Iterate once to synchronize Factorial\r\n n = add(n, '1');\r\n }\r\n}\r\n\r\nexport function asin(x: number | string) {\r\n x = x.toString();\r\n if (greaterThan(abs(x), '1')) {\r\n throw Error('[Arcsine]: argument x is out of range.')\r\n }\r\n let result = '0';\r\n let n = '1';\r\n let even = '1';\r\n let odd = '1';\r\n while (true) {\r\n const N = multiply(n, '2');\r\n const R = add(N, '1');\r\n\r\n even = multiply(even, N);\r\n odd = multiply(odd, subtract(N, '1'));\r\n let next = divide(multiply(odd, pow(x, R)), multiply(even, R), 34);\r\n\r\n if (lessThan(next, tolerance(33))) {\r\n result = add(result, next);\r\n return stripTrailingZero(roundOff(add(result, x), 32));\r\n }\r\n\r\n result = add(result, next);\r\n n = add(n, '1');\r\n }\r\n}\r\n\r\nexport function sinh(x: number | string) {\r\n x = x.toString();\r\n return stripTrailingZero(subtract(divide(exp(x), '2', 33), divide(exp(negate(x)), '2', 33)));\r\n}\r\n\r\n// Cosine functions\r\n\r\nexport function cos(x: number | string) {\r\n x = x.toString();\r\n\r\n if (greaterThan(abs(x), PI)) {\r\n let r = divide(x, PI, 33).split('.')\r\n x = stripTrailingZero(roundOff(multiply(pow(negate(sign(x).toString()), r[0]), multiply(PI, (r[1]) ? '0.' + r[1] : '0')), 32));\r\n }\r\n\r\n let result = '0';\r\n let _sign = '1';\r\n let n = '1'; // Series iteration\r\n let f = '1'; // Factorial product\r\n\r\n while (true) {\r\n const N = multiply(n, '2'); // Next real term in series (odd terms cancel)\r\n f = multiply(f, subtract(N, '1')); // Iterate once to synchronize Factorial\r\n f = multiply(f, N);\r\n\r\n const next = multiply(_sign, divide(pow(x, N, 33), f, 34));\r\n\r\n if (lessThan(abs(next), tolerance(33))) {\r\n result = subtract('1',add(result, next));\r\n return stripTrailingZero(isAproxOne(result) ? multiply('1', sign(result).toString()) : isAproxZero(result) ? '0' : result);\r\n }\r\n result = add(result, next);\r\n _sign = negate(_sign)\r\n n = add(n, '1');\r\n }\r\n}\r\n\r\nexport function acos(x: number | string) {\r\n x = x.toString();\r\n if (greaterThan(abs(x), '1')) {\r\n throw Error('[Arccosine]: argument x is out of range.')\r\n }\r\n return stripTrailingZero(subtract(divide(PI, 2, 32), asin(x)));\r\n}\r\n\r\nexport function cosh(x: number | string) {\r\n x = x.toString();\r\n return stripTrailingZero(divide(add(exp(x), exp(negate(x))), '2', 32));\r\n}\r\n\r\n// Tangant functions\r\n\r\nexport function tan(x: number | string) {\r\n x = x.toString();\r\n return stripTrailingZero(divide(sin(x), cos(x), 32));\r\n}\r\n\r\nexport function atan(x: number | string) {\r\n x = x.toString();\r\n\r\n if (greaterThan(abs(x), '1')) {\r\n return stripTrailingZero(subtract(divide(PI, 2, 33), atan(divide(1, x, 33))));\r\n }\r\n\r\n let result = '0';\r\n let n = '0';\r\n while (true) {\r\n let N = multiply('2', n);\r\n let next = divide(multiply(pow('-1', n), pow(x, add(N, '1'))), add(N, '1'), 32)\r\n if (lessThan(abs(next), tolerance(33))) {\r\n return stripTrailingZero(roundOff(add(result, next), 32));\r\n }\r\n result = add(result, next);\r\n n = add(n, '1');\r\n }\r\n}\r\n\r\nexport function atan2(y: number | string, x: number | string) {\r\n x = x.toString();\r\n y = y.toString();\r\n\r\n let offset = '0';\r\n\r\n if (isExatclyZero(x) && isExatclyZero(y)) {\r\n return '0';\r\n }\r\n\r\n if (isExatclyZero(x) && greaterThan(y, '0')) {\r\n return stripTrailingZero(roundOff(divide(PI, 2, 33), 32));\r\n }\r\n\r\n if (isExatclyZero(x) && lessThan(y, '0')) {\r\n return stripTrailingZero(roundOff(negate(divide(PI, 2, 33)), 32));\r\n }\r\n\r\n if (lessThan(x, '0')) {\r\n offset = (greaterThan(y, '0', true)) ? PI : negate(PI);\r\n }\r\n\r\n return stripTrailingZero(roundOff(add(atan(divide(y, x, 33)), offset), 32));\r\n\r\n}\r\n\r\nexport function tanh(x: number | string) {\r\n x = x.toString();\r\n return stripTrailingZero(divide(sinh(x), cosh(x), 32));\r\n}","import { add, trim } from \"./add\";\r\nimport { abs } from \"./abs\";\r\nimport { roundOff } from \"./round\";\r\nimport { multiply } from \"./multiply\";\r\nimport { divide } from \"./divide\";\r\nimport { modulus, modulusE } from \"./modulus\";\r\nimport { compareTo, equals, greaterThan, lessThan } from \"./compareTo\";\r\nimport { subtract, negate } from \"./subtract\";\r\nimport { RoundingModes as Modes, RoundingModes } from \"./roundingModes\";\r\nimport { stripTrailingZero } from \"./stripTrailingZero\";\r\nimport { cbRoot, pow, sqRoot } from \"./pow\";\r\nimport { factorial, sign } from \"./utils\";\r\nimport { acos, asin, atan, atan2, cos, cosh, hypot, sin, sinh, tan, tanh } from \"./trig\";\r\nimport { ln, log, ln2, log10, exp, LN2, LN10, LOG2E, LOG10E, Euler, expm1 } from \"./logarithm\";\r\n\r\nclass bigDecimal {\r\n private value: string;\r\n static RoundingModes = Modes;\r\n private static validate(number: number | string | bigint ): string {\r\n if (number) {\r\n number = number.toString();\r\n if (isNaN(Number(number))) throw Error(\"Parameter is not a number: \" + number);\r\n if (number[0] == \"+\") number = number.substring(1);\r\n } else number = \"0\";\r\n\r\n //handle missing leading zero\r\n if (number.startsWith(\".\")) number = \"0\" + number;\r\n else if (number.startsWith(\"-.\")) number = \"-0\" + number.substring(1);\r\n\r\n //handle exponentiation (scientific notation)\r\n if (/e/i.test(number)) {\r\n let [mantisa, exponent] = number.split(/[eE]/);\r\n let exponentIndex = Number(exponent)\r\n mantisa = trim(mantisa);\r\n let sign = \"\";\r\n if (mantisa[0] == \"-\") {\r\n sign = \"-\";\r\n mantisa = mantisa.substring(1);\r\n }\r\n\r\n if (mantisa.indexOf(\".\") >= 0) {\r\n exponentIndex = parseInt(exponent) + mantisa.indexOf(\".\");\r\n mantisa = mantisa.replace(\".\", \"\");\r\n } else {\r\n exponentIndex = parseInt(exponent) + mantisa.length;\r\n }\r\n\r\n if (mantisa.length < exponentIndex) {\r\n number =\r\n sign + mantisa + new Array(exponentIndex - mantisa.length + 1).join(\"0\");\r\n } else if (mantisa.length >= exponentIndex && exponentIndex > 0) {\r\n number =\r\n sign +\r\n trim(mantisa.substring(0, exponentIndex)) +\r\n (mantisa.length > exponentIndex ? \".\" + mantisa.substring(exponentIndex) : \"\");\r\n } else {\r\n number = sign + \"0.\" + new Array(-exponentIndex + 1).join(\"0\") + mantisa;\r\n }\r\n }\r\n\r\n return number;\r\n }\r\n\r\n constructor(number: number | string | bigint = \"0\") {\r\n this.value = bigDecimal.validate(number);\r\n }\r\n\r\n getValue() {\r\n return this.value;\r\n }\r\n\r\n setValue(num: number | string | bigint) {\r\n this.value = bigDecimal.validate(num);\r\n }\r\n\r\n static getPrettyValue(number, digits = 3, separator = \",\"): string {\r\n // if (!(digits || separator)) {\r\n // digits = 3;\r\n // separator = ',';\r\n // } else if (!(digits && separator)) {\r\n // throw Error('Illegal Arguments. Should pass both digits and separator or pass none');\r\n // }\r\n number = bigDecimal.validate(number);\r\n let neg = number.charAt(0) == \"-\";\r\n if (neg) number = number.substring(1);\r\n var len = number.indexOf(\".\");\r\n len = len > 0 ? len : number.length;\r\n var temp = \"\";\r\n for (var i = len; i > 0; ) {\r\n if (i < digits) {\r\n digits = i;\r\n i = 0;\r\n } else i -= digits;\r\n\r\n temp =\r\n number.substring(i, i + digits) +\r\n (i < len - digits && i >= 0 ? separator : \"\") +\r\n temp;\r\n }\r\n return (neg ? \"-\" : \"\") + temp + number.substring(len);\r\n }\r\n getPrettyValue(digits = 3, separator = \",\") {\r\n return bigDecimal.getPrettyValue(this.value, digits, separator);\r\n }\r\n\r\n static round(number, precision = 0, mode = Modes.HALF_EVEN) {\r\n number = bigDecimal.validate(number);\r\n // console.log(number)\r\n if (isNaN(precision))\r\n throw Error(\"Precision is not a number: \" + precision);\r\n return roundOff(number, precision, mode);\r\n }\r\n\r\n round(precision = 0, mode = Modes.HALF_EVEN) {\r\n if (isNaN(precision))\r\n throw Error(\"Precision is not a number: \" + precision);\r\n\r\n return new bigDecimal(roundOff(this.value, precision, mode));\r\n }\r\n\r\n static abs(number) {\r\n number = bigDecimal.validate(number);\r\n return abs(number);\r\n }\r\n\r\n abs() {\r\n return new bigDecimal(abs(this.value));\r\n }\r\n\r\n static floor(number) {\r\n number = bigDecimal.validate(number);\r\n if (number.indexOf(\".\") === -1) return number;\r\n return bigDecimal.round(number, 0, RoundingModes.FLOOR);\r\n }\r\n\r\n floor() {\r\n if (this.value.indexOf(\".\") === -1) return new bigDecimal(this.value);\r\n return new bigDecimal(this.value).round(0, RoundingModes.FLOOR);\r\n }\r\n\r\n static ceil(number) {\r\n number = bigDecimal.validate(number);\r\n if (number.indexOf(\".\") === -1) return number;\r\n return bigDecimal.round(number, 0, RoundingModes.CEILING);\r\n }\r\n\r\n ceil() {\r\n if (this.value.indexOf(\".\") === -1) return new bigDecimal(this.value);\r\n return new bigDecimal(this.value).round(0, RoundingModes.CEILING);\r\n }\r\n\r\n static add(number1, number2) {\r\n number1 = bigDecimal.validate(number1);\r\n number2 = bigDecimal.validate(number2);\r\n return add(number1, number2);\r\n }\r\n\r\n add(number: bigDecimal) {\r\n return new bigDecimal(add(this.value, number.getValue()));\r\n }\r\n\r\n static subtract(number1, number2) {\r\n number1 = bigDecimal.validate(number1);\r\n number2 = bigDecimal.validate(number2);\r\n return subtract(number1, number2);\r\n }\r\n\r\n subtract(number: bigDecimal) {\r\n return new bigDecimal(subtract(this.value, number.getValue()));\r\n }\r\n\r\n static multiply(number1, number2) {\r\n number1 = bigDecimal.validate(number1);\r\n number2 = bigDecimal.validate(number2);\r\n return multiply(number1, number2);\r\n }\r\n\r\n multiply(number: bigDecimal) {\r\n return new bigDecimal(multiply(this.value, number.getValue()));\r\n }\r\n\r\n static divide(number1, number2, precision?: number) {\r\n number1 = bigDecimal.validate(number1);\r\n number2 = bigDecimal.validate(number2);\r\n return divide(number1, number2, precision);\r\n }\r\n\r\n divide(number: bigDecimal, precision?: number) {\r\n return new bigDecimal(divide(this.value, number.getValue(), precision));\r\n }\r\n\r\n static modulus(number1, number2) {\r\n number1 = bigDecimal.validate(number1);\r\n number2 = bigDecimal.validate(number2);\r\n return modulus(number1, number2);\r\n }\r\n\r\n modulus(number: bigDecimal) {\r\n return new bigDecimal(modulus(this.value, number.getValue()));\r\n }\r\n\r\n static modulusE(number1, number2) {\r\n number1 = bigDecimal.validate(number1);\r\n number2 = bigDecimal.validate(number2);\r\n return modulusE(number1, number2);\r\n }\r\n\r\n modulusE(number: bigDecimal) {\r\n return new bigDecimal(modulusE(this.value, number.getValue()));\r\n }\r\n\r\n static negate(number) {\r\n number = bigDecimal.validate(number);\r\n return negate(number);\r\n }\r\n\r\n negate() {\r\n return new bigDecimal(negate(this.value));\r\n }\r\n\r\n // Powers\r\n\r\n static pow(base: number|string, exponent: number|string) {\r\n base = bigDecimal.validate(base);\r\n exponent = bigDecimal.validate(exponent);\r\n return pow(base, exponent);\r\n }\r\n\r\n pow(exponent: bigDecimal) {\r\n return new bigDecimal(pow(this.value, exponent.getValue(), 32));\r\n }\r\n\r\n // Roots\r\n\r\n static get SQRT1_2() {\r\n return sqRoot('.5');\r\n }\r\n\r\n static get SQRT2() {\r\n return sqRoot('2');\r\n }\r\n\r\n static sqRoot(number: number|string): string {\r\n number = bigDecimal.validate(number);\r\n return sqRoot(number);\r\n }\r\n\r\n sqRoot(): bigDecimal {\r\n return new bigDecimal(sqRoot(this.value));\r\n }\r\n\r\n static cbRoot(number: number|string): string {\r\n number = bigDecimal.validate(number);\r\n return cbRoot(number);\r\n }\r\n\r\n cbRoot(): bigDecimal {\r\n return new bigDecimal(cbRoot(this.value));\r\n }\r\n\r\n // Logarithms\r\n\r\n static get E() {\r\n return Euler(32);\r\n }\r\n\r\n static get LN2(){\r\n return LN2\r\n }\r\n\r\n static get LN10(){\r\n return LN10\r\n }\r\n\r\n static get LOG2E(){\r\n return LOG2E\r\n }\r\n\r\n static get LOG10E(){\r\n return LOG10E\r\n }\r\n\r\n static log2(number: number|string){\r\n number = bigDecimal.validate(number);\r\n return ln2(number)\r\n } \r\n\r\n static log10(number: number|string){\r\n number = bigDecimal.validate(number);\r\n return log10(number)\r\n }\r\n\r\n static log1p(number: number|string){\r\n number = bigDecimal.validate(number);\r\n return log(add('1', number))\r\n }\r\n\r\n static log(number: number|string){\r\n number = bigDecimal.validate(number);\r\n return log(number)\r\n }\r\n\r\n static exp(number: number|string): string {\r\n number = bigDecimal.validate(number);\r\n return exp(number);\r\n }\r\n\r\n static expm1(number: number|string): string {\r\n number = bigDecimal.validate(number);\r\n return expm1(number)\r\n }\r\n\r\n // Trig\r\n static hypot(a: number|string, b: number|string){\r\n a = bigDecimal.validate(a);\r\n b = bigDecimal.validate(b);\r\n\r\n return hypot(a,b);\r\n\r\n }\r\n\r\n static sin(number: number|string): string {\r\n number = bigDecimal.validate(number);\r\n return sin(number);\r\n }\r\n\r\n static sinh(number: number|string): string {\r\n number = bigDecimal.validate(number);\r\n return sinh(number);\r\n }\r\n\r\n static asin(number: number|string): string {\r\n number = bigDecimal.validate(number);\r\n return asin(number);\r\n }\r\n\r\n static cos(number: number|string): string {\r\n number = bigDecimal.validate(number);\r\n return cos(number);\r\n }\r\n\r\n static cosh(number: number|string): string {\r\n number = bigDecimal.validate(number);\r\n return cosh(number);\r\n }\r\n\r\n static acos(number: number|string): string {\r\n number = bigDecimal.validate(number);\r\n return acos(number);\r\n }\r\n\r\n static tan(number: number|string): string {\r\n number = bigDecimal.validate(number);\r\n return tan(number);\r\n }\r\n\r\n static tanh(number: number|string): string {\r\n number = bigDecimal.validate(number);\r\n return tanh(number);\r\n }\r\n\r\n static atan(number: number|string): string {\r\n number = bigDecimal.validate(number);\r\n return atan(number);\r\n }\r\n\r\n static atan2(y: number|string, x: number|string): string {\r\n x = bigDecimal.validate(x);\r\n y = bigDecimal.validate(y);\r\n return atan2(y, x);\r\n }\r\n\r\n // Comparisons\r\n static compareTo(number1: number|string, number2: number|string) {\r\n number1 = bigDecimal.validate(number1);\r\n number2 = bigDecimal.validate(number2);\r\n return compareTo(number1, number2);\r\n }\r\n\r\n compareTo(number: bigDecimal) {\r\n return compareTo(this.value, number.getValue());\r\n }\r\n\r\n static equals(number1: number|string, number2: number|string){\r\n number1 = bigDecimal.validate(number1);\r\n number2 = bigDecimal.validate(number2);\r\n return equals(number1, number2);\r\n }\r\n\r\n equals(number: bigDecimal){\r\n return equals(this.value, number.getValue());\r\n }\r\n\r\n static lt(number1: number|string, number2: number|string){\r\n number1 = bigDecimal.validate(number1);\r\n number2 = bigDecimal.validate(number2);\r\n return lessThan(number1, number2);\r\n }\r\n\r\n lt(number: bigDecimal){\r\n return lessThan(this.value, number.getValue());\r\n }\r\n\r\n static leq(number1: number|string, number2: number|string){\r\n number1 = bigDecimal.validate(number1);\r\n number2 = bigDecimal.validate(number2);\r\n return lessThan(number1, number2, true);\r\n }\r\n\r\n leq(number: bigDecimal){\r\n return lessThan(this.value, number.getValue(), true);\r\n }\r\n\r\n static gt(number1: number|string, number2: number|string){\r\n number1 = bigDecimal.validate(number1);\r\n number2 = bigDecimal.validate(number2);\r\n return greaterThan(number1, number2);\r\n }\r\n\r\n gt(number: bigDecimal){\r\n return greaterThan(this.value, number.getValue());\r\n }\r\n\r\n static geq(number1: number|string, number2: number|string){\r\n number1 = bigDecimal.validate(number1);\r\n number2 = bigDecimal.validate(number2);\r\n return greaterThan(number1, number2, true);\r\n }\r\n\r\n geq(number: bigDecimal){\r\n return greaterThan(this.value, number.getValue(), true);\r\n }\r\n\r\n static sign(number: number|string){\r\n number = bigDecimal.validate(number);\r\n return sign(number);\r\n }\r\n\r\n sign(){\r\n return sign(this.value);\r\n }\r\n\r\n // Misc.\r\n\r\n static factorial(number: number|string): string {\r\n number = bigDecimal.validate(number);\r\n return factorial(number);\r\n }\r\n\r\n static stripTrailingZero(number) {\r\n number = bigDecimal.validate(number);\r\n return stripTrailingZero(number);\r\n }\r\n\r\n stripTrailingZero() {\r\n return new bigDecimal(stripTrailingZero(this.value));\r\n }\r\n\r\n\r\n}\r\nexport default bigDecimal;\r\n"],"names":["validate","negate","negateFn","Modes"],"mappings":"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"} \ No newline at end of file diff --git a/dist/esm/compareTo.d.ts b/dist/esm/compareTo.d.ts index d70d0c8..a536a64 100644 --- a/dist/esm/compareTo.d.ts +++ b/dist/esm/compareTo.d.ts @@ -1 +1,8 @@ export declare function compareTo(number1: string, number2: string): 0 | 1 | -1; +export declare function lessThan(left: string, right: string, orEquals?: boolean): boolean; +export declare function greaterThan(left: string, right: string, orEquals?: boolean): boolean; +export declare function equals(left: string, right: string): boolean; +export declare function isExatclyZero(number: string): boolean; +export declare function isExatclyOne(number: string): boolean; +export declare function isEven(number: string): boolean; +export declare function isOdd(number: string): boolean; diff --git a/dist/esm/divide.d.ts b/dist/esm/divide.d.ts index 281ed48..9287511 100644 --- a/dist/esm/divide.d.ts +++ b/dist/esm/divide.d.ts @@ -1 +1 @@ -export declare function divide(dividend: any, divisor: any, precission?: number): string; +export declare function divide(dividend: string | number, divisor: string | number, precission?: number): string; diff --git a/dist/esm/logarithm.d.ts b/dist/esm/logarithm.d.ts new file mode 100644 index 0000000..dd063f4 --- /dev/null +++ b/dist/esm/logarithm.d.ts @@ -0,0 +1,12 @@ +export declare const E: string; +export declare const LN2 = "0.69314718055994530941723212145818"; +export declare const LOG2E = "1.44269504088896340735992468100188"; +export declare const LN10 = "2.30258509299404568392825848336901"; +export declare const LOG10E = "0.43429448190325182766805360691429"; +export declare function Euler(precision?: number): string; +export declare function exp(exponent: number | string): string; +export declare function expm1(exponent: number | string): string; +export declare function ln(x?: string | number): string; +export declare function ln2(x?: string | number): string; +export declare function log(base: string | number): string; +export declare function log10(base: string | number): string; diff --git a/dist/esm/modulus.d.ts b/dist/esm/modulus.d.ts index 0136667..69e7642 100644 --- a/dist/esm/modulus.d.ts +++ b/dist/esm/modulus.d.ts @@ -1 +1,2 @@ -export declare function modulus(dividend: number | string, divisor: number | string): string; +export declare function modulusE(n: number | string, base?: number | string, precision?: number | undefined): string; +export declare function modulus(dividend: number | string, divisor?: number | string, precision?: number | undefined): string; diff --git a/dist/esm/pow.d.ts b/dist/esm/pow.d.ts new file mode 100644 index 0000000..d5e84dd --- /dev/null +++ b/dist/esm/pow.d.ts @@ -0,0 +1,46 @@ +/** + * Calculates the power of a given base raised to an integer exponent + * + * @param base - Base number + * @param exponent - Exponent integer + * @param negate - If set to true, parameters will be evaluated as `-(x ^ n)` + * + * @returns The resulting power as a string + * + * + * @example Basic usage: + * ``` + * // Positive Base + * console.log(pow(2,2)) // Prints '4' + * // Negative Base + * console.log(pow(-2,2)) // Prints '4' + * // Negative Base where the result will be a negative number + * console.log(pow(-2,3)) // Prints '-8' + * ``` + * + * @example Negation usage: + * ``` + * // Positive Base + * console.log(pow(2, 2, true)) // Prints '-4' + * // Negative Base + * console.log(pow(-2, 2, true)) // Prints '-4' + * // Negative Base where the result will be a negative number + * console.log(pow(-2, 3, true)) // Prints '8' + * ``` + * + * @example Special cases: + * ``` + * // Exponent of 0 + * console.log(pow(2, 0)) // Prints '1' + * // Exponent of 1 + * console.log(pow(2, 1)) // Prints '2' + * ``` + */ +export declare function pow(base: number | string, exponent: number | string, precision?: number | undefined, negate?: boolean | undefined): string; +export declare function nthRoot(x: number | string, n: number | string, precision?: number): string; +export declare function inverseSqRoot(number: string): string; +export declare function sqRoot(base: string | number, precision?: number): string; +export declare function cbRoot(base: string | number, precision?: number): string; +export declare function root4(base: string | number, precision?: number): string; +export declare function root5(base: string | number, precision?: number): string; +export declare function root10(base: string | number, precision?: number): string; diff --git a/dist/esm/stripTrailingZero.d.ts b/dist/esm/stripTrailingZero.d.ts index c64e0a4..da63d32 100644 --- a/dist/esm/stripTrailingZero.d.ts +++ b/dist/esm/stripTrailingZero.d.ts @@ -1 +1 @@ -export declare function stripTrailingZero(number: any): any; +export declare function stripTrailingZero(number: string): string; diff --git a/dist/esm/tables/e.d.ts b/dist/esm/tables/e.d.ts new file mode 100644 index 0000000..2c0877c --- /dev/null +++ b/dist/esm/tables/e.d.ts @@ -0,0 +1 @@ +export declare const E_ROOTS_FOR_POW: string[][]; diff --git a/dist/esm/trig.d.ts b/dist/esm/trig.d.ts new file mode 100644 index 0000000..9499a5c --- /dev/null +++ b/dist/esm/trig.d.ts @@ -0,0 +1,12 @@ +export declare const PI = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229"; +export declare function hypot(a: number | string, b: number | string): string; +export declare function sin(x: number | string): string; +export declare function asin(x: number | string): string; +export declare function sinh(x: number | string): string; +export declare function cos(x: number | string): string; +export declare function acos(x: number | string): string; +export declare function cosh(x: number | string): string; +export declare function tan(x: number | string): string; +export declare function atan(x: number | string): any; +export declare function atan2(y: number | string, x: number | string): string; +export declare function tanh(x: number | string): string; diff --git a/dist/esm/utils.d.ts b/dist/esm/utils.d.ts new file mode 100644 index 0000000..56f0dc5 --- /dev/null +++ b/dist/esm/utils.d.ts @@ -0,0 +1,7 @@ +export declare const factorial: (n: number | string) => string; +export declare function sigma(n: number | string, limit: number | string, fn: (n: number | string, ...args: any[]) => any, ...args: any): string; +export declare function alternatingSeries(n: number | string, limit: number | string, fn: (n: number | string) => any, _sign?: number | string): string; +export declare function tolerance(precision: number | string): string; +export declare function isAproxZero(number: string | number, precision?: number): boolean; +export declare function isAproxOne(number: string | number, precision?: number): boolean; +export declare function sign(number: string | number): 0 | 1 | -1; diff --git a/dist/esm/workers/pow.worker.d.ts b/dist/esm/workers/pow.worker.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/dist/esm/workers/pow.worker.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/dist/node/big-decimal.d.ts b/dist/node/big-decimal.d.ts index 7ea832f..67d15be 100644 --- a/dist/node/big-decimal.d.ts +++ b/dist/node/big-decimal.d.ts @@ -26,11 +26,56 @@ declare class bigDecimal { divide(number: bigDecimal, precision?: number): bigDecimal; static modulus(number1: any, number2: any): string; modulus(number: bigDecimal): bigDecimal; - static compareTo(number1: any, number2: any): 0 | 1 | -1; - compareTo(number: bigDecimal): 0 | 1 | -1; + static modulusE(number1: any, number2: any): string; + modulusE(number: bigDecimal): bigDecimal; static negate(number: any): string; negate(): bigDecimal; - static stripTrailingZero(number: any): any; + static pow(base: number | string, exponent: number | string): string; + pow(exponent: bigDecimal): bigDecimal; + static get SQRT1_2(): string; + static get SQRT2(): string; + static sqRoot(number: number | string): string; + sqRoot(): bigDecimal; + static cbRoot(number: number | string): string; + cbRoot(): bigDecimal; + static get E(): string; + static get LN2(): string; + static get LN10(): string; + static get LOG2E(): string; + static get LOG10E(): string; + static log2(number: number | string): string; + static log10(number: number | string): string; + static log1p(number: number | string): string; + static log(number: number | string): string; + static exp(number: number | string): string; + static expm1(number: number | string): string; + static hypot(a: number | string, b: number | string): string; + static sin(number: number | string): string; + static sinh(number: number | string): string; + static asin(number: number | string): string; + static cos(number: number | string): string; + static cosh(number: number | string): string; + static acos(number: number | string): string; + static tan(number: number | string): string; + static tanh(number: number | string): string; + static atan(number: number | string): string; + static atan2(y: number | string, x: number | string): string; + static compareTo(number1: number | string, number2: number | string): 0 | 1 | -1; + compareTo(number: bigDecimal): 0 | 1 | -1; + static equals(number1: number | string, number2: number | string): boolean; + equals(number: bigDecimal): boolean; + static lt(number1: number | string, number2: number | string): boolean; + lt(number: bigDecimal): boolean; + static leq(number1: number | string, number2: number | string): boolean; + leq(number: bigDecimal): boolean; + static gt(number1: number | string, number2: number | string): boolean; + gt(number: bigDecimal): boolean; + static geq(number1: number | string, number2: number | string): boolean; + geq(number: bigDecimal): boolean; + static sign(number: number | string): 0 | 1 | -1; + sign(): 0 | 1 | -1; + static factorial(number: number | string): string; + static stripTrailingZero(number: any): string; stripTrailingZero(): bigDecimal; } export default bigDecimal; diff --git a/dist/node/js-big-decimal.js b/dist/node/js-big-decimal.js index fe311b4..5cfadb1 100644 --- a/dist/node/js-big-decimal.js +++ b/dist/node/js-big-decimal.js @@ -7,40 +7,55 @@ exports["bigDecimal"] = factory(); else root["bigDecimal"] = factory(); -})(global, function() { +})(typeof self !== 'undefined' ? self : this, function() { return /******/ (function() { // webpackBootstrap /******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ 165: -/***/ (function(__unused_webpack_module, exports) { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.abs = void 0; -function abs(n) { - if (typeof n == "number" || typeof n == "bigint") - n = n.toString(); - if (n[0] == "-") - return n.substring(1); - return n; -} -exports.abs = abs; - - -/***/ }), - -/***/ 217: -/***/ (function(__unused_webpack_module, exports) { +/******/ // The require scope +/******/ var __webpack_require__ = {}; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ !function() { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = function(exports, definition) { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ !function() { +/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } +/******/ }(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ !function() { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ }(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// ESM COMPAT FLAG +__webpack_require__.r(__webpack_exports__); +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + "default": function() { return /* binding */ big_decimal; } +}); -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.pad = exports.trim = exports.add = void 0; +;// CONCATENATED MODULE: ./lib/add.js //function add { -function add(number1, number2) { - var _a; - if (number2 === void 0) { number2 = "0"; } - var neg = 0, ind = -1, neg_len; +function add_add(number1, number2 = "0") { + let neg = 0, ind = -1, neg_len; //check for negatives if (number1[0] == "-") { number1 = number1.substring(1); @@ -60,14 +75,14 @@ function add(number1, number2) { } number1 = trim(number1); number2 = trim(number2); - _a = pad(trim(number1), trim(number2)), number1 = _a[0], number2 = _a[1]; + [number1, number2] = pad(trim(number1), trim(number2)); if (neg == 1) { if (ind === 1) number1 = compliment(number1); else if (ind === 2) number2 = compliment(number2); } - var res = addCore(number1, number2); + let res = addCore(number1, number2); if (!neg) return trim(res); else if (neg == 2) @@ -79,74 +94,53 @@ function add(number1, number2) { return "-" + trim(compliment(res)); } } -exports.add = add; function compliment(number) { if (testZero(number)) { return number; } - var s = "", l = number.length, dec = number.split(".")[1], ld = dec ? dec.length : 0; - for (var i = 0; i < l; i++) { + let s = "", l = number.length, dec = number.split(".")[1], ld = dec ? dec.length : 0; + for (let i = 0; i < l; i++) { if (number[i] >= "0" && number[i] <= "9") s += 9 - parseInt(number[i]); else s += number[i]; } - var one = ld > 0 ? "0." + new Array(ld).join("0") + "1" : "1"; + let one = ld > 0 ? "0." + new Array(ld).join("0") + "1" : "1"; return addCore(s, one); } function trim(number) { - var parts = number.split("."); + let parts = number.split("."); if (!parts[0]) parts[0] = "0"; while (parts[0][0] == "0" && parts[0].length > 1) parts[0] = parts[0].substring(1); return parts[0] + (parts[1] ? "." + parts[1] : ""); } -exports.trim = trim; function pad(number1, number2) { - var parts1 = number1.split("."), parts2 = number2.split("."); + let parts1 = number1.split("."), parts2 = number2.split("."); //pad integral part - var length1 = parts1[0].length, length2 = parts2[0].length; - if (length1 > length2) { - parts2[0] = - new Array(Math.abs(length1 - length2) + 1).join("0") + - (parts2[0] ? parts2[0] : ""); - } - else { - parts1[0] = - new Array(Math.abs(length1 - length2) + 1).join("0") + - (parts1[0] ? parts1[0] : ""); - } + let length = Math.max(parts1[0].length, parts2[0].length); + parts1[0] = parts1[0].padStart(length, "0"); + parts2[0] = parts2[0].padStart(length, "0"); //pad fractional part - (length1 = parts1[1] ? parts1[1].length : 0), - (length2 = parts2[1] ? parts2[1].length : 0); - if (length1 || length2) { - if (length1 > length2) { - parts2[1] = - (parts2[1] ? parts2[1] : "") + - new Array(Math.abs(length1 - length2) + 1).join("0"); - } - else { - parts1[1] = - (parts1[1] ? parts1[1] : "") + - new Array(Math.abs(length1 - length2) + 1).join("0"); - } - } + parts1[1] = parts1[1] || ""; + parts2[1] = parts2[1] || ""; + length = Math.max(parts1[1].length, parts2[1].length); + parts1[1] = parts1[1].padEnd(length, "0"); + parts2[1] = parts2[1].padEnd(length, "0"); number1 = parts1[0] + (parts1[1] ? "." + parts1[1] : ""); number2 = parts2[0] + (parts2[1] ? "." + parts2[1] : ""); return [number1, number2]; } -exports.pad = pad; function addCore(number1, number2) { - var _a; - _a = pad(number1, number2), number1 = _a[0], number2 = _a[1]; - var sum = "", carry = 0; - for (var i = number1.length - 1; i >= 0; i--) { + [number1, number2] = pad(number1, number2); + let sum = "", carry = 0; + for (let i = number1.length - 1; i >= 0; i--) { if (number1[i] === ".") { sum = "." + sum; continue; } - var temp = parseInt(number1[i]) + parseInt(number2[i]) + carry; + let temp = parseInt(number1[i]) + parseInt(number2[i]) + carry; sum = (temp % 10) + sum; carry = Math.floor(temp / 10); } @@ -156,87 +150,315 @@ function testZero(number) { return /^0[0]*[.]{0,1}[0]*$/.test(number); } +;// CONCATENATED MODULE: ./lib/abs.js +function abs_abs(n) { + if (typeof n == "number" || typeof n == "bigint") + n = n.toString(); + if (n[0] == "-") + return n.substring(1); + return n; +} -/***/ }), - -/***/ 664: -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - +;// CONCATENATED MODULE: ./lib/roundingModes.js +var RoundingModes; +(function (RoundingModes) { + /** + * Rounding mode to round towards positive infinity. + */ + RoundingModes[RoundingModes["CEILING"] = 0] = "CEILING"; + /** + * Rounding mode to round towards zero. + */ + RoundingModes[RoundingModes["DOWN"] = 1] = "DOWN"; + /** + * Rounding mode to round towards negative infinity. + */ + RoundingModes[RoundingModes["FLOOR"] = 2] = "FLOOR"; + /** + * Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, + * in which case round down. + */ + RoundingModes[RoundingModes["HALF_DOWN"] = 3] = "HALF_DOWN"; + /** + * Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, + * in which case, round towards the even neighbor. + */ + RoundingModes[RoundingModes["HALF_EVEN"] = 4] = "HALF_EVEN"; + /** + * Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, + * in which case round up. + */ + RoundingModes[RoundingModes["HALF_UP"] = 5] = "HALF_UP"; + /** + * Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary. + * UNIMPLEMENTED + */ + RoundingModes[RoundingModes["UNNECESSARY"] = 6] = "UNNECESSARY"; + /** + * Rounding mode to round away from zero. + */ + RoundingModes[RoundingModes["UP"] = 7] = "UP"; +})(RoundingModes || (RoundingModes = {})); -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.compareTo = void 0; -var add_1 = __webpack_require__(217); -var stripTrailingZero_1 = __webpack_require__(859); -function compareTo(number1, number2) { - var _a, _b; - var negative = false; - _a = [number1, number2].map(function (n) { return (0, stripTrailingZero_1.stripTrailingZero)(n); }), number1 = _a[0], number2 = _a[1]; - if (number1[0] == '-' && number2[0] != "-") { - return -1; +;// CONCATENATED MODULE: ./lib/stripTrailingZero.js +/* +* Removes zero from front and back*/ +function stripTrailingZero_stripTrailingZero(number) { + const isNegative = number[0] === '-'; + if (isNegative) { + number = number.substring(1); } - else if (number1[0] != '-' && number2[0] == '-') { - return 1; + while (number[0] == '0') { + number = number.substring(1); } - else if (number1[0] == '-' && number2[0] == '-') { - number1 = number1.substr(1); - number2 = number2.substr(1); - negative = true; + if (number.indexOf('.') != -1) { + while (number[number.length - 1] == '0') { + number = number.substring(0, number.length - 1); + } } - _b = (0, add_1.pad)(number1, number2), number1 = _b[0], number2 = _b[1]; - if (number1.localeCompare(number2) == 0) { - return 0; + if (number == "" || number == ".") { + number = '0'; } - for (var i = 0; i < number1.length; i++) { - if (number1[i] == number2[i]) { - continue; - } - else if (number1[i] > number2[i]) { - if (negative) { - return -1; + else if (number[number.length - 1] == '.') { + number = number.substring(0, number.length - 1); + } + if (number[0] == '.') { + number = '0' + number; + } + if (isNegative && number != '0') { + number = '-' + number; + } + return number; +} + +;// CONCATENATED MODULE: ./lib/round.js + + +/** + * + * @param input the number to round + * @param n precision + * @param mode Rounding Mode + */ +function round_roundOff(input, n = 0, mode = RoundingModes.HALF_EVEN) { + if (typeof (input) == 'number' || typeof (input) == 'bigint') + input = input.toString(); + if (mode === RoundingModes.UNNECESSARY) { + let [integers, mantissa] = stripTrailingZero_stripTrailingZero(input.replace('-', '')).split('.'); + if (n > 0 && mantissa) { + if (mantissa.length <= n) { + return input; } - else { - return 1; + if (/[^0]/.test(mantissa.slice(n))) { + throw new Error('Number is not an exact value. Rounding necessary.'); } + return input; } - else { - if (negative) { - return 1; - } - else { - return -1; + else if (n < 0 && mantissa) { + throw new Error('Number is not an exact value. Rounding necessary.'); + } + else if (n < 0) { + if (integers.length <= Math.abs(n) || /[^0]/.test(integers.slice(n))) { + throw new Error('Number is not an exact value. Rounding necessary.'); } + return input; } + else if (n == 0 && mantissa) { + throw new Error('Number is not an exact value. Rounding necessary.'); + } + return input; + } + let neg = false; + if (input[0] === '-') { + neg = true; + input = input.substring(1); + } + let parts = input.split('.'), partInt = parts[0], partDec = parts[1]; + //handle case of -ve n: roundOff(12564,-2)=12600 + if (n < 0) { + n = -n; + if (partInt.length <= n) + return '0'; + else { + let prefix = partInt.substring(0, partInt.length - n); + input = prefix + '.' + partInt.substring(partInt.length - n) + partDec; + prefix = round_roundOff(input, 0, mode); + return (neg ? '-' : '') + prefix + (new Array(n + 1).join('0')); + } + } + // handle case when integer output is desired + if (n == 0) { + let l = partInt.length; + if (greaterThanFive(parts[1], partInt, neg, mode)) { + partInt = increment(partInt); + } + return (neg && parseInt(partInt) ? '-' : '') + partInt; + } + // handle case when n>0 + if (!parts[1]) { + return (neg ? '-' : '') + partInt + '.' + (new Array(n + 1).join('0')); + } + else if (parts[1].length < n) { + return (neg ? '-' : '') + partInt + '.' + parts[1] + (new Array(n - parts[1].length + 1).join('0')); + } + partDec = parts[1].substring(0, n); + let rem = parts[1].substring(n); + if (rem && greaterThanFive(rem, partDec, neg, mode)) { + partDec = increment(partDec); + if (partDec.length > n) { + return (neg ? '-' : '') + increment(partInt, parseInt(partDec[0])) + '.' + partDec.substring(1); + } + } + return (neg && (parseInt(partInt) || parseInt(partDec)) ? '-' : '') + partInt + '.' + partDec; +} +function greaterThanFive(part, pre, neg, mode) { + if (!part || part === new Array(part.length + 1).join('0')) + return false; + // #region UP, DOWN, CEILING, FLOOR + if (mode === RoundingModes.DOWN || (!neg && mode === RoundingModes.FLOOR) || + (neg && mode === RoundingModes.CEILING)) + return false; + if (mode === RoundingModes.UP || (neg && mode === RoundingModes.FLOOR) || + (!neg && mode === RoundingModes.CEILING)) + return true; + // #endregion + // case when part !== five + let five = '5' + (new Array(part.length).join('0')); + if (part > five) + return true; + else if (part < five) + return false; + // case when part === five + switch (mode) { + case RoundingModes.HALF_DOWN: return false; + case RoundingModes.HALF_UP: return true; + case RoundingModes.HALF_EVEN: + default: return (parseInt(pre[pre.length - 1]) % 2 == 1); } - return 0; } -exports.compareTo = compareTo; -function checkZero(number) { +function increment(part, c = 0) { + if (!c) + c = 1; + if (typeof (part) == 'number') + part.toString(); + let l = part.length - 1, s = ''; + for (let i = l; i >= 0; i--) { + let x = parseInt(part[i]) + c; + if (x == 10) { + c = 1; + x = 0; + } + else { + c = 0; + } + s += x; + } + if (c) + s += c; + return s.split('').reverse().join(''); } +;// CONCATENATED MODULE: ./lib/multiply.js -/***/ }), +function multiply_multiply(number1, number2) { + number1 = number1.toString(); + number2 = number2.toString(); + /*Filter numbers*/ + let negative = 0; + if (number1[0] == '-') { + negative++; + number1 = number1.substr(1); + } + if (number2[0] == '-') { + negative++; + number2 = number2.substr(1); + } + number1 = stripTrailingZero_stripTrailingZero(number1); + number2 = stripTrailingZero_stripTrailingZero(number2); + let decimalLength1 = 0; + let decimalLength2 = 0; + if (number1.indexOf('.') != -1) { + decimalLength1 = number1.length - number1.indexOf('.') - 1; + } + if (number2.indexOf('.') != -1) { + decimalLength2 = number2.length - number2.indexOf('.') - 1; + } + let decimalLength = decimalLength1 + decimalLength2; + number1 = stripTrailingZero_stripTrailingZero(number1.replace('.', '')); + number2 = stripTrailingZero_stripTrailingZero(number2.replace('.', '')); + if (number1.length < number2.length) { + let temp = number1; + number1 = number2; + number2 = temp; + } + if (number2 == '0') { + return '0'; + } + /* + * Core multiplication + */ + let length = number2.length; + let carry = 0; + let positionVector = []; + let currentPosition = length - 1; + let result = ""; + for (let i = 0; i < length; i++) { + positionVector[i] = number1.length - 1; + } + for (let i = 0; i < 2 * number1.length; i++) { + let sum = 0; + for (let j = number2.length - 1; j >= currentPosition && j >= 0; j--) { + if (positionVector[j] > -1 && positionVector[j] < number1.length) { + sum += parseInt(number1[positionVector[j]--]) * parseInt(number2[j]); + } + } + sum += carry; + carry = Math.floor(sum / 10); + result = sum % 10 + result; + currentPosition--; + } + /* + * Formatting result + */ + result = stripTrailingZero_stripTrailingZero(adjustDecimal(result, decimalLength)); + if (negative == 1) { + result = '-' + result; + } + return result; +} +/* +* Add decimal point +*/ +function adjustDecimal(number, decimal) { + if (decimal == 0) + return number; + else { + number = (decimal >= number.length) ? ((new Array(decimal - number.length + 1)).join('0') + number) : number; + return number.substr(0, number.length - decimal) + '.' + number.substr(number.length - decimal, decimal); + } +} -/***/ 415: -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +;// CONCATENATED MODULE: ./lib/divide.js -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.divide = void 0; -var add_1 = __webpack_require__(217); -var round_1 = __webpack_require__(350); -function divide(dividend, divisor, precission) { - if (precission === void 0) { precission = 8; } - if (divisor == 0) { - throw new Error('Cannot divide by 0'); +function divide_divide(dividend, divisor, precission) { + // Convert to string + if (typeof dividend == 'number' || typeof divisor == 'number') { + dividend = dividend.toString(); + divisor = divisor.toString(); + } + // Return 0 + if (divisor == '0') { + return '0' + (!precission) ? '' : 0; + } + // Set default precission + if (typeof precission == 'undefined') { + precission = 8; } - dividend = dividend.toString(); - divisor = divisor.toString(); // remove trailing zeros in decimal ISSUE#18 dividend = dividend.replace(/(\.\d*?[1-9])0+$/g, "$1").replace(/\.0+$/, ""); divisor = divisor.replace(/(\.\d*?[1-9])0+$/g, "$1").replace(/\.0+$/, ""); - if (dividend == 0) - return '0'; - var neg = 0; + let neg = 0; if (divisor[0] == '-') { divisor = divisor.substring(1); neg++; @@ -246,32 +468,32 @@ function divide(dividend, divisor, precission) { neg++; } var pt_dvsr = divisor.indexOf('.') > 0 ? divisor.length - divisor.indexOf('.') - 1 : -1; - divisor = (0, add_1.trim)(divisor.replace('.', '')); + divisor = trim(divisor.replace('.', '')); if (pt_dvsr >= 0) { - var pt_dvnd = dividend.indexOf('.') > 0 ? dividend.length - dividend.indexOf('.') - 1 : -1; + let pt_dvnd = dividend.indexOf('.') > 0 ? dividend.length - dividend.indexOf('.') - 1 : -1; if (pt_dvnd == -1) { - dividend = (0, add_1.trim)(dividend + (new Array(pt_dvsr + 1)).join('0')); + dividend = trim(dividend + (new Array(pt_dvsr + 1)).join('0')); } else { if (pt_dvsr > pt_dvnd) { dividend = dividend.replace('.', ''); - dividend = (0, add_1.trim)(dividend + (new Array(pt_dvsr - pt_dvnd + 1)).join('0')); + dividend = trim(dividend + (new Array(pt_dvsr - pt_dvnd + 1)).join('0')); } else if (pt_dvsr < pt_dvnd) { dividend = dividend.replace('.', ''); - var loc = dividend.length - pt_dvnd + pt_dvsr; - dividend = (0, add_1.trim)(dividend.substring(0, loc) + '.' + dividend.substring(loc)); + let loc = dividend.length - pt_dvnd + pt_dvsr; + dividend = trim(dividend.substring(0, loc) + '.' + dividend.substring(loc)); } else if (pt_dvsr == pt_dvnd) { - dividend = (0, add_1.trim)(dividend.replace('.', '')); + dividend = trim(dividend.replace('.', '')); } } } - var prec = 0, dl = divisor.length, rem = '0', quotent = ''; - var dvnd = (dividend.indexOf('.') > -1 && dividend.indexOf('.') < dl) ? dividend.substring(0, dl + 1) : dividend.substring(0, dl); + let prec = 0, dl = divisor.length, rem = '0', quotent = ''; + let dvnd = (dividend.indexOf('.') > -1 && dividend.indexOf('.') < dl) ? dividend.substring(0, dl + 1) : dividend.substring(0, dl); dividend = (dividend.indexOf('.') > -1 && dividend.indexOf('.') < dl) ? dividend.substring(dl + 1) : dividend.substring(dl); if (dvnd.indexOf('.') > -1) { - var shift = dvnd.length - dvnd.indexOf('.') - 1; + let shift = dvnd.length - dvnd.indexOf('.') - 1; dvnd = dvnd.replace('.', ''); if (dl > dvnd.length) { shift += dl - dvnd.length; @@ -282,9 +504,9 @@ function divide(dividend, divisor, precission) { } precission = precission + 2; while (prec <= precission) { - var qt = 0; + let qt = 0; while (parseInt(dvnd) >= parseInt(divisor)) { - dvnd = (0, add_1.add)(dvnd, '-' + divisor); + dvnd = add_add(dvnd, '-' + divisor); qt++; } quotent += qt; @@ -304,427 +526,1266 @@ function divide(dividend, divisor, precission) { dividend = dividend.substring(1); } } - return ((neg == 1) ? '-' : '') + (0, add_1.trim)((0, round_1.roundOff)(quotent, precission - 2)); + return ((neg == 1) ? '-' : '') + trim(round_roundOff(quotent, precission - 2)); } -exports.divide = divide; - - -/***/ }), -/***/ 213: -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +;// CONCATENATED MODULE: ./lib/subtract.js + +function subtract_subtract(number1, number2) { + number1 = number1.toString(); + number2 = number2.toString(); + number2 = subtract_negate(number2); + return add_add(number1, number2); +} +function subtract_negate(number) { + if (number[0] == '-') { + number = number.substr(1); + } + else { + number = '-' + number; + } + return number; +} + +;// CONCATENATED MODULE: ./lib/modulus.js + + -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.modulus = void 0; -var divide_1 = __webpack_require__(415); -var round_1 = __webpack_require__(350); -var multiply_1 = __webpack_require__(182); -var subtract_1 = __webpack_require__(26); -var roundingModes_1 = __webpack_require__(916); -function modulus(dividend, divisor) { + + +function modulusE(n, base = 1, precision = undefined) { + if (base == 0) { + throw new Error('Cannot divide by 0'); + } + n = n.toString(); + base = base.toString(); + validate(base); + return subtract_subtract(n, multiply_multiply(base, round_roundOff(divide_divide(n, base, precision), 0, RoundingModes.FLOOR))); +} +function modulus(dividend, divisor = 1, precision = undefined) { if (divisor == 0) { throw new Error('Cannot divide by 0'); } dividend = dividend.toString(); divisor = divisor.toString(); - validate(dividend); validate(divisor); - var sign = ''; - if (dividend[0] == '-') { - sign = '-'; - dividend = dividend.substr(1); - } - if (divisor[0] == '-') { - divisor = divisor.substr(1); - } - var result = (0, subtract_1.subtract)(dividend, (0, multiply_1.multiply)(divisor, (0, round_1.roundOff)((0, divide_1.divide)(dividend, divisor), 0, roundingModes_1.RoundingModes.FLOOR))); - return sign + result; + const result = modulusE(abs_abs(dividend), abs_abs(divisor), precision); + return (dividend.includes('-')) ? subtract_negate(result) : result; } -exports.modulus = modulus; function validate(oparand) { - if (oparand.indexOf('.') != -1) { + if (oparand.includes('.')) { throw new Error('Modulus of non-integers not supported'); } } +;// CONCATENATED MODULE: ./lib/compareTo.js -/***/ }), - -/***/ 182: -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.multiply = void 0; -var stripTrailingZero_1 = __webpack_require__(859); -function multiply(number1, number2) { - number1 = number1.toString(); - number2 = number2.toString(); - /*Filter numbers*/ - var negative = 0; - if (number1[0] == '-') { - negative++; - number1 = number1.substr(1); - } - if (number2[0] == '-') { - negative++; - number2 = number2.substr(1); +function compareTo(number1, number2) { + let negative = false; + [number1, number2] = [number1, number2].map(n => stripTrailingZero_stripTrailingZero(n)); + // Early escapes + // If num 1 is negative and num 2 is positive + if (number1[0] == '-' && number2[0] != "-") + return -1; + // If num 2 is negative and num 1 is positive + if (number1[0] != '-' && number2[0] == '-') + return 1; + if (number1[0] == '-' && number2[0] == '-') { + number1 = number1.substring(1); + number2 = number2.substring(1); + negative = true; } - number1 = (0, stripTrailingZero_1.stripTrailingZero)(number1); - number2 = (0, stripTrailingZero_1.stripTrailingZero)(number2); - var decimalLength1 = 0; - var decimalLength2 = 0; - if (number1.indexOf('.') != -1) { - decimalLength1 = number1.length - number1.indexOf('.') - 1; + let decimal1 = number1.indexOf('.'); + let decimal2 = number2.indexOf('.'); + // If both numbers dont have decimals, compare lengths + if (decimal1 == -1 && decimal1 == decimal2) { + if (number1.length > number2.length) + return (negative) ? -1 : 1; + if (number1.length < number2.length) + return (negative) ? 1 : -1; } - if (number2.indexOf('.') != -1) { - decimalLength2 = number2.length - number2.indexOf('.') - 1; + // If num 1 has no decimal, and num 2 has, then compare integer length to the decimal index of num 2 + if (decimal1 == -1 && decimal2 !== -1) { + if (number1.length < decimal2) + return (negative) ? 1 : -1; + if (number1.length > decimal2) + return (negative) ? -1 : 1; } - var decimalLength = decimalLength1 + decimalLength2; - number1 = (0, stripTrailingZero_1.stripTrailingZero)(number1.replace('.', '')); - number2 = (0, stripTrailingZero_1.stripTrailingZero)(number2.replace('.', '')); - if (number1.length < number2.length) { - var temp = number1; - number1 = number2; - number2 = temp; + // If num 1 has a decimal, and num 2 has none, then compare integer length to the decimal index of num 1 + if (decimal1 !== -1 && decimal2 == -1) { + if (number2.length < decimal1) + return (negative) ? 1 : -1; + if (number2.length > decimal1) + return (negative) ? -1 : 1; } - if (number2 == '0') { - return '0'; + [number1, number2] = pad(number1, number2); + // If equal + if (number1.localeCompare(number2) == 0) + return 0; + for (let i = 0; i < number1.length; i++) { + if (number1[i] == number2[i]) { + continue; + } + else if (number1[i] > number2[i]) { + return (negative) ? -1 : 1; + } + else { + return (negative) ? 1 : -1; + } } - /* - * Core multiplication - */ - var length = number2.length; - var carry = 0; - var positionVector = []; - var currentPosition = length - 1; - var result = ""; - for (var i = 0; i < length; i++) { - positionVector[i] = number1.length - 1; + return 0; +} +// Wrapper functions +function compareTo_lessThan(left, right, orEquals = false) { + return (orEquals) ? (compareTo(left, right) === 0 || compareTo(left, right) === -1) : (compareTo(left, right) === -1); +} +function compareTo_greaterThan(left, right, orEquals = false) { + return (orEquals) ? (compareTo(left, right) === 0 || compareTo(left, right) === 1) : (compareTo(left, right) === 1); +} +function equals(left, right) { + return (compareTo(stripTrailingZero_stripTrailingZero(left), stripTrailingZero_stripTrailingZero(right)) === 0); +} +function isExatclyZero(number) { + return equals(stripTrailingZero_stripTrailingZero(abs_abs(number)), '0'); +} +function isExatclyOne(number) { + return equals(stripTrailingZero_stripTrailingZero(abs_abs(number)), '1'); +} +function isEven(number) { + return /[02468]{1}$/.test(number.split('.')[0]); +} +function isOdd(number) { + return /[13579]{1}$/.test(number.split('.')[0]); +} + +;// CONCATENATED MODULE: ./lib/utils.js + + + + + +const factorial = (n) => { + n = n.toString(); + validateInteger(n); + validatePositive(n); + if (isExatclyZero(n) || isExatclyOne(n)) { + return '1'; } - for (var i = 0; i < 2 * number1.length; i++) { - var sum = 0; - for (var j = number2.length - 1; j >= currentPosition && j >= 0; j--) { - if (positionVector[j] > -1 && positionVector[j] < number1.length) { - sum += parseInt(number1[positionVector[j]--]) * parseInt(number2[j]); - } + let result = n; + while (true) { + if (isExatclyOne(n)) { + return result; } - sum += carry; - carry = Math.floor(sum / 10); - result = sum % 10 + result; - currentPosition--; + let next = subtract_subtract(n, '1'); + result = multiply_multiply(result, next); + n = next; } - /* - * Formatting result - */ - result = (0, stripTrailingZero_1.stripTrailingZero)(adjustDecimal(result, decimalLength)); - if (negative == 1) { - result = '-' + result; +}; +function sigma(n, limit, fn, ...args) { + n = n.toString(); + limit = limit.toString(); + validateInteger(n); + validateInteger(limit); + validatePositive(n); + validatePositive(limit); + let result = '0'; + while (greaterThan(limit, subtract(n, '1'))) { + result = add(result, fn(limit, ...args)); + limit = subtract(limit, '1'); } return result; } -exports.multiply = multiply; -/* -* Add decimal point -*/ -function adjustDecimal(number, decimal) { - if (decimal == 0) - return number; - else { - number = (decimal >= number.length) ? ((new Array(decimal - number.length + 1)).join('0') + number) : number; - return number.substr(0, number.length - decimal) + '.' + number.substr(number.length - decimal, decimal); +function alternatingSeries(n, limit, fn, _sign = '1') { + n = n.toString(); + limit = limit.toString(); + _sign = sign(_sign).toString(); + if (lessThan(n, '1')) { + throw new Error('[alternatingSeries]: Argument n is less than 1'); } + validateInteger(n); + validateInteger(limit); + validatePositive(limit); + let result = '0'; + while (true) { + const next = multiply(_sign, fn(n)); + if (lessThan(abs(next), utils_tolerance(limit))) { + return result; + } + result = add(result, next); + _sign = negate(_sign); + n = add(n, '1'); + } +} +function utils_tolerance(precision) { + precision = precision.toString(); + validateInteger(precision); + if (precision == '0') + return '0'; + if (precision.startsWith('-')) + return `1${new Array(Number(-precision)).join('0')}`; + return `0.${new Array(Number(precision) - 1).join('0')}1`; +} +function isAproxZero(number, precision = 8) { + precision = Math.max(1, precision); + number = abs_abs(number.toString()); + if (isExatclyZero(number)) + return true; + if (compareTo_lessThan(number, utils_tolerance(precision), true)) + return true; + return false; } +function isAproxOne(number, precision = 8) { + precision = Math.max(1, precision); + number = abs_abs(number.toString()); + if (isExatclyOne(number)) + return true; + if (compareTo_lessThan(abs_abs(subtract_subtract('1', number)), utils_tolerance(precision), true)) + return true; + return false; +} +function sign(number) { + number = number.toString(); + if (isExatclyZero(number)) + return 0; + if (number.includes('-')) + return -1; + return 1; +} +function validateInteger(number) { + if (number.includes('.')) { + throw new Error('Non-integers not supported'); + } +} +function validatePositive(number) { + if (number.includes('-')) { + throw new Error('Negatives not supported'); + } +} + +;// CONCATENATED MODULE: ./lib/pow.js + + + -/***/ }), -/***/ 350: -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.roundOff = void 0; -var roundingModes_1 = __webpack_require__(916); + +// import { AddInstantiate } from "./assembly/math"; /** + * Calculates the power of a given base raised to an integer exponent * - * @param input the number to round - * @param n precision - * @param mode Rounding Mode + * @param base - Base number + * @param exponent - Exponent integer + * @param negate - If set to true, parameters will be evaluated as `-(x ^ n)` + * + * @returns The resulting power as a string + * + * + * @example Basic usage: + * ``` + * // Positive Base + * console.log(pow(2,2)) // Prints '4' + * // Negative Base + * console.log(pow(-2,2)) // Prints '4' + * // Negative Base where the result will be a negative number + * console.log(pow(-2,3)) // Prints '-8' + * ``` + * + * @example Negation usage: + * ``` + * // Positive Base + * console.log(pow(2, 2, true)) // Prints '-4' + * // Negative Base + * console.log(pow(-2, 2, true)) // Prints '-4' + * // Negative Base where the result will be a negative number + * console.log(pow(-2, 3, true)) // Prints '8' + * ``` + * + * @example Special cases: + * ``` + * // Exponent of 0 + * console.log(pow(2, 0)) // Prints '1' + * // Exponent of 1 + * console.log(pow(2, 1)) // Prints '2' + * ``` */ -function roundOff(input, n, mode) { - if (n === void 0) { n = 0; } - if (mode === void 0) { mode = roundingModes_1.RoundingModes.HALF_EVEN; } - if (mode === roundingModes_1.RoundingModes.UNNECESSARY) { - throw new Error("UNNECESSARY Rounding Mode has not yet been implemented"); +function pow(base, exponent, precision = undefined, negate = false) { + // AddInstantiate.then((res)=>{ + // console.log('custom wasm loader',res.__add('00001', '1')) + // }) + // const v = await (async url => await AddInstantiate)(); + // console.log('custom wasm loader', AddWebAssembly('1', '1')) + exponent = exponent.toString(); + base = base.toString(); + if (isExatclyZero(exponent)) { + return '1'; } - if (typeof (input) == 'number' || typeof (input) == 'bigint') - input = input.toString(); - var neg = false; - if (input[0] === '-') { - neg = true; - input = input.substring(1); + if (!exponent.includes('-') && isExatclyOne(exponent)) { + return base; } - var parts = input.split('.'), partInt = parts[0], partDec = parts[1]; - //handle case of -ve n: roundOff(12564,-2)=12600 - if (n < 0) { - n = -n; - if (partInt.length <= n) - return '0'; - else { - var prefix = partInt.substr(0, partInt.length - n); - input = prefix + '.' + partInt.substr(partInt.length - n) + partDec; - prefix = roundOff(input, 0, mode); - return (neg ? '-' : '') + prefix + (new Array(n + 1).join('0')); - } + if (isExatclyZero(base) && exponent.includes('-') && isExatclyOne(exponent)) { + throw Error('0^(-1) is undefined'); } - // handle case when integer output is desired - if (n == 0) { - var l = partInt.length; - if (greaterThanFive(parts[1], partInt, neg, mode)) { - partInt = increment(partInt); - } - return (neg && parseInt(partInt) ? '-' : '') + partInt; + const finalize = (result) => { + result = (negativeExponent) ? divide_divide(1, result, precision + 1) : result; + result = (precision) ? round_roundOff(result, precision) : result; + return (negate) ? stripTrailingZero_stripTrailingZero(subtract_negate(result)) : stripTrailingZero_stripTrailingZero(result); + }; + const negativeBase = base.includes('-'); + const negativeExponent = exponent.includes('-'); + const exponentParts = exponent.split('.'); + const exponentSignificand = exponentParts[1]; + const isBase10 = equals(abs_abs(base), '10'); + if (isBase10) { + base = abs_abs(base); + negate = !negate; } - // handle case when n>0 - if (!parts[1]) { - return (neg ? '-' : '') + partInt + '.' + (new Array(n + 1).join('0')); + let fractionalExponent = '1'; + let result; + if (equals(abs_abs(base), '10')) { + result = (negativeExponent) ? `0.${new Array(Number(abs_abs(exponentParts[0])) - 1).join('0')}1` : `1${new Array(exponentParts[0]).join('0')}`; } - else if (parts[1].length < n) { - return (neg ? '-' : '') + partInt + '.' + parts[1] + (new Array(n - parts[1].length + 1).join('0')); + else { + result = intPow(abs_abs(base), abs_abs(exponentParts[0])); } - partDec = parts[1].substring(0, n); - var rem = parts[1].substring(n); - if (rem && greaterThanFive(rem, partDec, neg, mode)) { - partDec = increment(partDec); - if (partDec.length > n) { - return (neg ? '-' : '') + increment(partInt, parseInt(partDec[0])) + '.' + partDec.substring(1); + if (exponentSignificand) { + if (negativeBase) { + negate = !negate; + } + precision = Math.max(precision, 32); + // const testworker = new Worker(new URL("./workers/pow.worker.js", import.meta.url)); + // testworker.postMessage({ base: abs(base), significand: exponentSignificand }); + // testworker.onmessage = (event) => { + // console.log('webresult', result) + // // console.log('web', multiply(result, event.data)) + // // testworker.terminate(); + // // fractionalExponent = event.data + // return finalize(multiply(result, event.data)) + // // testworker.terminate(); + // } + let tempBase = root10(abs_abs(base)); + for (let i = 0; i < exponentSignificand.length; i++) { + fractionalExponent = multiply_multiply(fractionalExponent, pow(tempBase, exponentSignificand[i])); + tempBase = root10(tempBase); } + return finalize(multiply_multiply(result, fractionalExponent)); } - return (neg && (parseInt(partInt) || parseInt(partDec)) ? '-' : '') + partInt + '.' + partDec; + else { + return finalize(result); + } + // let exponentIntegers = abs(exponentParts[0]); + // if (equals(abs(base), '10')) { + // result = (negativeExponent) ? `0.${new Array(Number(exponentIntegers) - 1).join('0')}1` : `1${new Array(exponentIntegers).join('0')}` + // return multiply(multiply(result, fractionalExponent), pow(sign(base), exponentIntegers)) + // } + // while (greaterThan(exponentIntegers, '0')) { + // if (isOdd(exponentIntegers)) { result = multiply(result, base) } + // base = multiply(base, base); + // exponentIntegers = divide(exponentIntegers, 2).split('.')[0]; + // } + // result = multiply(result, fractionalExponent); + // result = (negativeExponent) ? divide(1, result, precision + 1) : result; + // result = (precision) ? roundOff(result, precision) : result; + // return (negate) ? stripTrailingZero(negateFn(result)) : stripTrailingZero(result); } -exports.roundOff = roundOff; -function greaterThanFive(part, pre, neg, mode) { - if (!part || part === new Array(part.length + 1).join('0')) - return false; - // #region UP, DOWN, CEILING, FLOOR - if (mode === roundingModes_1.RoundingModes.DOWN || (!neg && mode === roundingModes_1.RoundingModes.FLOOR) || - (neg && mode === roundingModes_1.RoundingModes.CEILING)) - return false; - if (mode === roundingModes_1.RoundingModes.UP || (neg && mode === roundingModes_1.RoundingModes.FLOOR) || - (!neg && mode === roundingModes_1.RoundingModes.CEILING)) - return true; - // #endregion - // case when part !== five - var five = '5' + (new Array(part.length).join('0')); - if (part > five) - return true; - else if (part < five) - return false; - // case when part === five - switch (mode) { - case roundingModes_1.RoundingModes.HALF_DOWN: return false; - case roundingModes_1.RoundingModes.HALF_UP: return true; - case roundingModes_1.RoundingModes.HALF_EVEN: - default: return (parseInt(pre[pre.length - 1]) % 2 == 1); +; +function intPow(base, exponent, precision = 32) { + exponent = abs_abs(exponent); + let result = '1'; + while (compareTo_greaterThan(exponent, '0')) { + if (isOdd(exponent)) { + result = multiply_multiply(result, base); + } + base = multiply_multiply(base, base); + exponent = divide_divide(exponent, 2).split('.')[0]; } + return result; } -function increment(part, c) { - if (c === void 0) { c = 0; } - if (!c) - c = 1; - if (typeof (part) == 'number') - part.toString(); - var l = part.length - 1, s = ''; - for (var i = l; i >= 0; i--) { - var x = parseInt(part[i]) + c; - if (x == 10) { - c = 1; - x = 0; +function nthRoot(x, n, precision = 8) { + x = x.toString(); + n = n.toString(); + pow_validate(n); + if (compareTo_lessThan(n, '4', true)) { + let guess = '1'; + let nMinusOne = subtract_subtract(n, 1); + let difference = '0'; + let lastDifference = x; + let i = 0; + while (true) { + let newGuess = divide_divide(add_add(stripTrailingZero_stripTrailingZero(divide_divide(x, pow(guess, nMinusOne, precision + 2), precision + 2)), multiply_multiply(guess, nMinusOne)), n, precision + 2); + difference = abs_abs(subtract_subtract(guess, newGuess)); + if (compareTo_greaterThan(difference, lastDifference)) { + // console.log('root exit under p') + return stripTrailingZero_stripTrailingZero(round_roundOff(guess, precision + 1)); + } + if (compareTo_lessThan(difference, utils_tolerance(precision - 1))) { + // console.log('newGuess exit under p') + return stripTrailingZero_stripTrailingZero(round_roundOff(newGuess, precision + 1)); + } + lastDifference = difference; + guess = stripTrailingZero_stripTrailingZero(newGuess); + i++; } - else { - c = 0; + // console.log('guess exit over itt') + // return stripTrailingZero(roundOff(guess, precision + 1)) + } + else { + let x0 = '1'; + let x1 = '2'; + let x2 = '1.5'; + let i = 0; + while (true) { + let f0 = subtract_subtract(pow(x0, n, precision + 2), x); + let f1 = subtract_subtract(pow(x1, n, precision + 2), x); + let next = multiply_multiply(f1, divide_divide(subtract_subtract(x1, x0), subtract_subtract(f1, f0), precision + 2)); + x2 = subtract_subtract(round_roundOff(x1, precision + 2), round_roundOff(next, precision + 2)); + if (compareTo_lessThan(abs_abs(subtract_subtract(x2, x1)), utils_tolerance(precision + 1))) { + return stripTrailingZero_stripTrailingZero(round_roundOff(x2, precision + 1)); + } + if (sign(f0) !== sign(f1)) { + x1 = divide_divide(add_add(x0 + x1), 2, precision + 2); // Switch to bisection method + } + x0 = x1; + x1 = stripTrailingZero_stripTrailingZero(round_roundOff(x2, precision + 2)); + i++; } - s += x; + // return stripTrailingZero(roundOff(x2, precision + 1)) + } +} +function inverseSqRoot(number) { + number = number.toString(); + let n = abs(number); + let guess = '1'; + let difference = '0'; + let previousDifference = n; + let i = 0; + while (i < 10) { + // console.log('guess', guess) + let newGuess = roundOff(multiply(guess, subtract('1.5', roundOff(multiply(divide(number, 2, 33), pow(guess, 2, 33)), 33))), 33); + // console.log('newGuess', guess) + difference = abs(subtract(guess, newGuess)); + if (greaterThan(difference, previousDifference)) { + // console.log('root exit under p') + return stripTrailingZero(roundOff(guess, 32 + 1)); + } + if (lessThan(difference, tolerance(32 - 1))) { + // console.log('newGuess exit under p') + return stripTrailingZero(roundOff(guess, 32 + 1)); + } + previousDifference = difference; + guess = newGuess; + i++; + } + // let [integer, fraction] = n.split('.'); + // let exponent = '0'; + // let integerBits = ''; + // let fractionBits = ''; + // let exponentBits = ''; + // let mantissaBits = ''; + // let mantissa = divide(integer + fraction, '1'); + // while (greaterThan(integer, '1', true)) { + // integerBits = isOdd(integer) ? '1' + integerBits : '0' + integerBits; + // integer = divide(integer, 2, 0); + // } + // if (fraction) { + // let precision = '32'; + // fraction = '0.' + fraction; + // while (greaterThan(precision, '0')) { + // fraction = multiply(fraction, 2); + // fractionBits += fraction.split('.')[0]; + // fraction = '0.' + fraction.split('.')[1]; + // if (isAproxZero(fraction, 2)) break + // precision = subtract(precision, 1); + // } + // } + // if (integer == '0') { + // let lastDigit = '0'; + // let i = 1; + // while (true) { + // if (lastDigit !== fractionBits[i - 1]) { + // i++ + // break + // } + // i++ + // } + // exponent = negateFn(i.toString()) + // } else { + // exponent = (integerBits.length - 1).toString() + // } + // mantissaBits = integerBits + fractionBits; + // mantissa = add('1', divide(divide(mantissa, pow('2', mantissaBits.length), mantissaBits.length), '2', mantissaBits.length)); + // console.log('log a', subtract(multiply(divide('1', pow('2', mantissaBits.length), mantissaBits.length), add(mantissa, multiply(pow('2', mantissaBits.length), add(exponent, (mantissaBits.length - 1).toString())))), (mantissaBits.length - 1).toString())) + // let E = roundOff(multiply(add(exponent, (mantissaBits.length - 1).toString()), '0.5'), 0, RoundingModes.FLOOR); + // exponent = add(exponent, (mantissaBits.length - 1).toString()) + // while (greaterThan(exponent, '1', true)) { + // exponentBits += isOdd(exponent) ? '1' : '0'; + // exponent = roundOff(divide(exponent, 2), 0, RoundingModes.FLOOR); + // } + // exponent = roundOff(multiply(add(exponent, (mantissaBits.length - 1).toString()), '0.5'), 0, RoundingModes.FLOOR) + // console.log('integer', integer) + // console.log('integerBits', integerBits) + // console.log('fractionBits', fractionBits) + // console.log('exponent', exponent) + // console.log('exponentBits', exponentBits) + // // const mantissaBits = integerBits + fractionBits; + // const logBits = exponentBits + mantissaBits; + // const binaryBits = '0' + logBits.substring(0, logBits.length - 1); //right bitshift + // exponentBits = binaryBits.substring(0, exponentBits.length) + // mantissaBits = binaryBits.substring(exponentBits.length) + // const exponentRange = pow('2', exponentBits.length); + // const mantissaRange = multiply('1.5', pow('2', mantissaBits.length - 1)); + // const correction = multiply(exponentRange, mantissaRange); + // const log = '1.' + binaryBits.split('').reduce((p, c, i) => { + // return add(p, (c == '0') ? '0' : pow('2', binaryBits.length - i)) + // }, '0'); + // // console.log('mantissa', mantissa) + // // console.log('mantissaBits', mantissaBits) + // // console.log('logBits', logBits) + // // console.log('binaryBits', binaryBits) + // // console.log('mantissaRange', mantissaRange) + // // console.log('exponentRange', exponentRange) + // // console.log('correction', correction) + // // console.log('log', log) + // const initial = multiply(log, '.5'); + // const initialSq = multiply(initial, initial); + // // let x = multiply(multiply(multiply(number, '0.5'), multiply(initial, initial)), '.5'); + // // x = multiply(multiply(multiply(number, '0.5'), multiply(x, x)), '.5'); + // // const y = multiply(initial, subtract('1.5', x)); + // let guess = initial; + // let difference = '0' + // let lastDifference = number + // let i = 0; + // while (i < 10) { + // console.log('guess', guess) + // guess = roundOff(multiply(guess, subtract('1.5', roundOff(multiply(divide(number, 2, 33), pow(guess, 2, 33)), 33))), 33) + // console.log('newGuess', guess) + // // difference = abs(subtract(guess, newGuess)) + // // if (greaterThan(difference, lastDifference)) { + // // // console.log('root exit under p') + // // return stripTrailingZero(roundOff(guess, 32 + 1)) + // // } + // // if (lessThan(difference, tolerance(32 - 1))) { + // // // console.log('newGuess exit under p') + // // return stripTrailingZero(roundOff(guess, 32 + 1)) + // // } + // // lastDifference = difference; + // // guess = newGuess; + // i++; + // } + // console.log('initial', initial) + // console.log('initialSq', initialSq) + // // console.log('x', x) + // // console.log('y', y) + // return guess +} +function sqRoot(base, precision = 32) { + precision = Math.max(precision, 32); + return nthRoot(base, 2, precision); +} +function cbRoot(base, precision = 32) { + precision = Math.max(precision, 32); + return nthRoot(base, 3, precision); +} +function root4(base, precision = 32) { + precision = Math.max(precision, 32); + return sqRoot(sqRoot(base, precision), precision); +} +function root5(base, precision = 32) { + precision = Math.max(precision, 32); + return nthRoot(base, 5, precision); +} +function root10(base, precision = 32) { + precision = Math.max(precision, 32); + return sqRoot(root5(base, precision), precision + 1); +} +function pow_validate(oparand) { + if (oparand.includes('.')) { + throw Error('Root base of non-integers not supported'); } - if (c) - s += c; - return s.split('').reverse().join(''); } +;// CONCATENATED MODULE: ./lib/tables/e.js +const E_ROOTS_FOR_POW = [ + [ + "1", + "1.1051709180756476248117078264902466682245471947375187187928632894409679667476543029891433189707486536329171204854012445361537347145315787020068902997574505197515004866018321613310249357028047934586850494525645057122112661163770326284627042965573236001851139", + "1.22140275816016983392107199463967417030758094152050364127342509859920623308363781624228874401337247396902783756582071222657872335735698322420203091783847852468196963515090275879656423105784038067892980765878816657563573480602908117582872101992234299467757368987418370836563153389462747746988296269108061275281392456208243249268026539778924251026176313926132967183139404485664941616843691597024447586738912784063277359127768204092782706320234475212712014508481918262357879464226202483894518888192549035034715597321", + "1.349858807576003103983744313328007330378299697359365803049917989939612587399539891293796485784096715182993915046496649823555281317904746176330174697914134611623510180348776728882134107658893142886237546315268956423659470780978312757181276728365015226253890933258389419871658954993580579042712940646224891469297274304073301451390889351970899528642926347862338071149211408737527216178389071834814268450261525986465964604240725313283687637440963107718301330951356415753972714631376348680064772218613611483339228569651085445294350178104320530288284696175866807479054565245092139097584381245312021271592764191527971036208743048564156633628960281631838046184539943675102487856097772374221297245505051183848015221680960625161769660863247928466143070056933155076029152109198619", + "1.4918246976412703178248529528372222806432827739374252815956331500723650987080270940005743751395204332995146049712374327554149926253602141716230772600403407491873867150724945487212617660656620072704264395870570315311010113322105932230805422737018500206392527177438579578556189926416736085144638705057672356404429354629959069215296346423445412842930842338368651426888702440282339072078820428812172552291679864844405874392991397534151119907597315402375400805761858764070148579243901394571509123129260659970829149641445173093621736697471495715486927871427608521974813357303938049045027055274617248235377478635882464544179074744286716592660820629566276461885843196142347558399965088751380486680925242174092668548306167997919161040598441807559801618039547286283635268768983411911084036444003391406619758488846706626640355860622307506467065190571454306273600406778135267686009580686515055777572568306309595260360492639973537087137347050023394616393906703697628564832791198689610819908805991960205502002473532624419443167353822377041", + "1.64872127070012814684865078781416357165377610071014801157507931164066102119421560863277652005636664300286663775630779700467116697521960915984097145249005979692942265909840391471994846465948924489686890533641846572084106665685980008892498121171228737521497221259813802364604394123302337702342564441115073997210339345543632427971478640993009214371685872851424554356204792843238295646431490989989559298639300873734528343887199639936097616043887791159196535233519726480396696337931220763089035352455056481345843941842020212763119317243234414790916753474172146106996570450921757574263944725690829548117247432018340633298482417480890385134505857727555061166714846142254643382172817464252944064119480610550411214216150015806428026218072435549458500264910615270634896131341405150953300907304199696610224898662704055364699222488547803416596626400854705247760207415313247478751208997988819063167774971424158059320000508837926711487592221411833120473118940174150839318956411265214927589489222002618989424703890008658172723963726628180320021102408885281948306909133579708714540083108622117282123853386065037903914832977915548985425218334949782721619507339453842540738918246146490048448660414624464961524536296212426067836554424656828424228138566437904693429740129065343555896062662077213299699", + "1.822118800390508974875367668162864513382238808546435386320547476588819650298619237506071841611824533131511980084733212162604411051946388331577800804030556735220810982370501962391864313333554698490208265658190969819090734754749827177848273296632519555680103680326369352437791893895038152776723546377012529473207851151551688242638129468067423693457788686737322308859196635577406424535317253509122371220622994977976488678953227355968535226011981026891265759205286137730603315671631660105006528658431765125587595376593446335729037108814939435477611527959248377638771800033625299101758522787812658726842991493891554409933462204120505376533298706281045546514892620277647385214857618436655863924892218047400811116831042680487895029611648906250960278076271249277145102395991693860611831983025203596058754756019516099900266095850415178719614749200451630535061160489190411763823857450791548961055118169806794713874454939988586811643596429338746010525986899857961587944139308107436769695508633096338687346716373921410474524266689139689311366516947054631031160462923809187729982871513915427654871105844432037418907865839686988704917607346571370310822906994525483818469890762365701037332197459906166318134391275013867439967207601879970902034384688314406747097203766024003073884672273060729687254540281852107793074492986426871326231804793173823349508810551286252776477149073401952138042782050652434065326561952854233161279618029767330128021096195903742999575860846854523510091165177814675930213024375018164078691687009724255773069550816206514391507161", + "2.0137527074704765216245493885830652700175423941458673115689893008797813008588679406324379355851788044338331898308254040110152144406355672122332987484386680282011586454587874291207920063096506060092121746339385003035706369942761654499650114370277576609074394476969349195415563411287148054594195014950075492700297283186501952215548266611861363515166840789209921665299236941497660514195676818497506715216174857824667584113677462277646521368145755169801610652069383900929636397476997976928986121402340613272005739386746343595131239407140625657434766755405604726559983098911197009867487590223559613492600292768297051485732713550448835403835352549463376130577581804732758041958835979535301727820054018405592264887175988369901092552028042689226587551744843184492524888491684438908350917254501814719615534981346941241332070048752850076613909872221227923256131385070038327284304187184081154788930005575892847954811706365631293695056764191098947623473863749480484940756222177807267238801516870654540558247853395741216289690556742625956213865161202746032011088919700768154544490761339022261482519814495299963404741430504214836798155729249493697925254743226038042230995868518047785789005613825713835594435128868667771495101069180401795064269233374799738867352453002639997668416935366386592304127698022250575283863420166408296272643322148060907484201210428960680526033446678578974007350742511058399463304152252983283111059782340661351915733128923447394041481646451630961371702270477501539244567625913375076027018672900253183869684213821854331885455218593203695168621845862590839866070698465191768354775162667919687787234057113703426381234125007404970096051044315268874858727339518165207062282508219103550897032474383182390962719939041810953987104324795493331907049865728024468068697764264074787176174506379", + "2.22554092849246760457953753139507675705363413504848459611858395555662261021440632023826379767119915026374251878156387711619774619379855963687103747368472284226448865340655354317185985377030850245682664363225661079813536128785653726513719167842427129812110484311349165777902729389254511878094742813123387667848699059429446010657151043572826832010313208047732807930998614309870757227929101960381147954847517822334863279319666225559304046050087758825776791641245416220959090737379947978891910964567194089715072100803252233073248441719882854257031516049204581676853691460008296615228145430792751845579928748303335224298540140591302535466469498156065075049022167880244375473655622669689327650015305079415315439914200799195123789362957387187941117003174099693531506115168225416846731445216503066154563061060352226369700173570788781093516825383897874045751999350339808378867887307801498607904212244602606554161614131633524614531883236101562055698735197422864246157477439558784175923341664781731182017904677692890038751961431930364624097536076577459379586929940521167397559605869035407545793472238578147959537818114915637152419390460744941310780904484651026135598787393535566242027093950477170576851928767959213832520123359412209544604227356318776838329784976706937070674967308806522361845995066951391233792165311759338384098919371408326428769572713806130074267342996786117989877955011626521519806731160466960246214623368412017241669817519218938975787703688279670969520255459580782566824698766683025943011418413515424475714850262109066781102851851979626998205883326687030200455933362261083827188323248686155376982520491891859193912296678363031851095031585999296235557983401989894925443480452646143604665935035873612963289853124279447614565761048011466854209825044470072858946253771110646120878816878134534234062942337153869787247084363695742055676354219872791968697195149737804123025516854480966929100783654238470977617175020837913707478778991341149220208658404839283930641502839083068918900160104096532950404697685876434536064090817056280532188943563915681", + "2.459603111156949663800126563602470695421772306440083020748545736657466552943365860870497185275930801502314734282469001211863377120754375262961184698244101923873118980752553546206085511483915775565746633877944570171310441342807039240011800950067877653276578939207957922264156281735850299153120666705464183289626292382107850626757086481112777076313695819244326645247215187769898739208923979309373990446742434297871759538487547808364593778694498844772835078016714351373598016467631087278899749286697713740248674901887803256296138548656549872572977525766104722565107146500648985987203867132117547677722793432947466268434715992314177189845879538433878518025300096774542323436522591754634721655783263629640839419113447179019145648844517390978320904868643199845305360956544494557422964230972024073035383722263932056673976596266688976321828928564444485955130282123956383440560652142134812702650195318853004793654327694163135311018560302434548157745596278924049359462262875684655024660621143270223276160205111113928674619513010825531773437719585670055905189480192487461443889421286148006246588358783823432756235263368472035520311691553695512537108796193920657766396287812148336508130560411995851432991098150316151710626822458450166702368954969918890855718477702866142861632457171714589428586925352111493288264877793764611187635117419219667724089358648691849349019774953975112073361668366390843101189643022503196449529273850914731962177302267814885008720265909052869903077134292211446012339728016145173776605298068332932215627064339536349963737505457519321720111235396885978665426051921476079008722809300128117266650623362110732864760301900017299660039379063962560499694800926090914390798018070659760804286858439659842007948172165140806138672059440570988428291170643822030057401246220069601172550649731972117725967828449725240661095291919679379580274098603455617464670785310583926637393873619156058283990235643046346147091976283156228115434842186613044398987912680078472025977495377880564317393705447963819914365733951865401782223781823067701249854212472507082498852675712141033436456921920235635932416059888043961227210308986402540506511344650923632565845792598802341393743342422242830490309556974956001755607771592980368429255689748738593726168543904401740920843388611933767910638184739366965114643113679309810659" + ], + [ + "1", + "1.010050167084168057542165456902860033807362201524292515164404031254374190731323852253210417020805424644822048349018187461836882962867029471348122509994980620193343756983419263331678116890952977342412525238660052128564771661099141138373740030932375484797474253", + "1.020201340026755810160143920483151435303508991193925577274241055989764698001799473651140929048897747567783800834245028828510331946890882290633380114769851598685744140375597170707424349379520528467454229732767262381708980414285750783230743973744291273147993499", + "1.030454533953516855612439953831198132905025142988223325669945482984656275528143507413690159736153367833262717667969420762924665205128543186726815728146644027749899016551570459982549960946831724287476034271222234314936525314771353449031855228611755471551229794", + "1.040810774192388226757044757916854744082977050312312035233957186052848044168317778353605489758071664887267683574643292017752950273390217859298583514134022896444615385627894619269308729639149680681368915289974692924712790670871941809116920080546004777009977082", + "1.051271096376024039697517636335645220174821296055062528783938479166279869650561268909887381693097467956359959802287840109856898277991870910996931622269015847528217521038290049746389922767632968070266132836298958452051202283898407113137668129272719733709427182", + "1.061836546545359622224684877168372328428260420330079059772946224885572614646084795028727107540254028462725979079478817859771763808885702260691363941508870196834078432934454312238181936983945541942068693355958230093508349025302765186495840221334120606071291923", + "1.072508181254216479053103949889114605574958973093013631368581996384184663872870122142938195770222664418254764408892720110775221918308589471660420537322754050996390544947060412014702775390723097905171301841614973139324709852063472998538152057727154702871352078", + "1.083287067674958554435987758674888500198713572836593968977149136159258009574303026493771584720423995154971654271223663348911143174715668624259808265653232762681246142307810608195731327006732520819601068839992977872631673981442100729100750479561971721703257072", + "1.094174283705210357872897623544886011846519908747085113495537273829677943694135052107150933181696135377161199865920871107158317262615140642553465724478938198810156930341222455108468641066277461818416868403944990238207068911482417587752512679561090991848685506" + ], + [ + "1", + "1.001000500166708341668055753993058311563076200580701460228514674460359748251448298412718226004153260943068218872095099342063678696119623840972330905531768311923556198498023652909377677730283868486287409870317224336827290668524342227007650646080335377683539402", + "1.002002001334000266755580958731569947141262360355881650784254327401407826211342908735167751841578573842087720874539215063369808541481798858488186179510193185360846688470245765779287676702093047345577268794005585346872102348621068884894677639696274087962023832", + "1.00300450450337702601293409134890020533187271956193064005816386977887704167032778817835718449794009129738172654330257629939497609228121058276487935834566645111932939622158438169617802320237286016173845852664382662772735225891910141326100743286140812329716465", + "1.004008010677341872358807975325862256786679584568446515824520101445505613334720499643274149387061934130095719684438458233489149633082954545826902702369355374132139019359038155028498554482932087796695756199850948857306997101347029384618537438780565191707911304", + "1.005012520859401063383566241124068580734875538593956360758053700178766756245814257769725878531005582561752872914964453059693371357350351629785031289228112479393000390737852735490064653453473263950263469180412515034868068037410009410423281936206661529650777831", + "1.006018036054064864855584542073814807663397023131207238128209310729162232251624511692721095036373574483233356676638823820201979261982436682169260741126877359539784408851803860808991870535936635545440055073405777167775394256588337226812975070293010932647774324", + "1.007024557266848555231600031941337387260626958324843573515364689887121935057426030048643842343378401601112246752543195873570584146404476681012065985847363008474306541126869561447531097035189821427350474715365757081347202689171315251277667530845240665265299241", + "1.008032085504273431172073614608631847461248193629898477319670850659315558055203072544926387076982815517924276700035813263652577025921163294422287501988755195063376817413349886928919042162630307237198554733730866338155519701284057736281012337251398647856788345", + "1.009040621773867814062570481311874274057745096807557533536793791893309190089211313774252518807101361017003109570357638320235688072443915664196164220142177807129999765515285503655079866550036049450757501377434724079219971788693007550857637620196056994725614551" + ], + [ + "1", + "1.000100005000166670833416668055575397073415454172178381034635390972311235972781757573430475110294393277744056856189456093377349308639835234864147024859575654444223594337482525749599468629752896998058770389517981545014836069937171108315141768826558752790276236", + "1.000200020001333400002666755558095301588712550265063340281249616462339933552635650404575689469783860722328853092919751879277515614513727994472210356634280535514759912694604145062526466543039555669877231954222323073542460530523928410171365347075351011821920295", + "1.000300045004500337520251012543394484429242698705094453657909046405426810389812679452584785775653629322172025648290344728788948443651164069121340691369780280752072301321554544169816823932077142996969576906644974657939554818844412637302594762038150619715293429", + "1.000400080010667733418672355880651175325602089234218127313638994866471733257393689147689037528495706906710548020054317971434500261679934483484883365324764324379786145945431964915418427301969396382574915094633029858419556374510345888380818423418110019646700504", + "1.000500125020835937760438369605751648487716767772005667654052528513185499225469269404161288162290263445071720143880459750657027560342513592842257775359779789305459334406770729214405898908865552327309638003027229853587275580967668200112228756540688352311154381", + "1.000600180036005400648064805554702313487380662321427742218779523265089444076340698564952604142576704373734829905992750918066261276845603358030914225286385902646373896497226913904457327994080504271798651358706636453059949377387742804353973513521969936501752549", + "1.000700245057176672234080084397124317808729972049887082920697544556118662092675751649525697937257144190017868483717030126300200509168688033318071339742627167336587481821812960447646818515221045591253213703416322339042019757058294741478286115192071830262104121", + "1.000800320085350402731030797169875671484970787023831957698136827590544488579455328399517237263085338370118947386598991767922241276098928474413390097019906957313039688997723589590992573554820372138559418413121238600026229549189496894374911921472634282466150763", + "1.000900405121527342421488207410855909240960364438870706386170964512041266577901813243995078190574746902747080924348105047677314326983090277701922714443700530813227920787438119571392945308376198426393506918634436746759027328287815213664693795332524735463087053" + ], + [ + "1", + "1.000010000050000166667083334166668055557539685019844025575947974286518040859924541627171360141414808527964710456114808568579194429073542519236311802480484946481318067459005203787629467197723492854996446403371670522585399835010157731202234906636252385776731651", + "1.00002000020000133334000002666675555580952444444585538201058714126235905329240541941460463111260447087759745526170244469724542720133236462083910268982377765723546309959873516346614722768345641097465014525930010435730044916587618556635026327839524395833885967", + "1.000030000450004500033750202501012504339301986661384091295086648836751748647469450015964451670052983888622000581616827713185780669338108129262463661100560276359891431254482497644594518311264674989317833539411130935378547235234149850030248683847558235949192424", + "1.000040000800010666773334186672355588063654603897004653273294246986372534769339653940902480758988473452263946419318465732269864516290202354028672947499884769594544980789708021919265600923317888907545126143154207287758799568586448736519103967528945971526548865", + "1.000050001250020833593752604188368210566445007862474552660354358193300410181171307606063524320643523978564544928969865946453669990898899456698349198366716859128164016860292475535424871378362068018619464946001908269309911380465115625730470139574546168248414669", + "1.0000600018000360005400064800648005554327371706287380580517448041768184715082802102822710639972596644286364335407098336787101683082519331743726773721831155799714031419453036224798582793575860149124712362688085932620035829070681390851428693479523215791315023", + "1.000070002450057167667097339330069689583742177176723647063988790354210467474771865973142735988449874178404296043885131632312715760670823804989006222060531708444185344331114273860623983993837941069162433957327267046454693493702350816632053640929378397569224776", + "1.000080003200085335040027307030759716613039100029766726281645469033146244455371326825242410362812667390249632806855063393511294820363074995773170886211112043017322472818660214389638836378249754133527844678406244041534554373988144575477289266056935662827704568", + "1.000090004050121502733799208238121990124620911386617650268545997115197477729772808193789097698902228616779638545143688002498080668191392250030819907953393555632250735284651864761358652086319522549247127067080851958286265291953836318860562133321982933710810154" + ], + [ + "1", + "1.000001000000500000166666708333341666668055555753968278769844025573467813076198494952835391203458229748677004015804035149881283353005876638466337275595012771755160063386490687362457247978228580884154230359796042066216890640463145470846706955844825203502338433", + "1.000002000002000001333334000000266666755555580952387301588712522328042379349054566833660167181437047765093225411054231512232000686252213399825626439733598663743759193375087814488620462276244525976983466408498021993849036041894526504322094571719953352997296398", + "1.000003000004500004500003375002025001012500433928734151839955373415183009335525061132656460958137667580015165164788249607585867396819057285326555960166937649697973379255965258502453132749605555659281253337641722497540635905649955343904464110817430087236277383", + "1.000004000008000010666677333341866672355558806350831746754144909770828180249872278427090395131851159823632422197402740977847069569299698172678405177176752031063667161866596069388686444135669904957535469560754938297276129090532495319450469310001482708633857767", + "1.000005000012500020833359375026041688368071056557307173041021760810581713597910150822615040172518383155879039901575224781594686498583161076660122024484253078169629131959213103609416701449976071941387410235464597750689312106461726726423745914525437286467921547", + "1.000006000018000036000054000064800064800055542898800027771445234294803121427534564955943850794837297671518974352450646804505269707458299371394556170457704109967851854196460183929711397642333451409044458139769431977686515948803676537433882198942436033685726107", + "1.000007000024500057166766708473391830068218957087420770926023058705014627836931346376561248648943914301771998667561988061508464250718883634451632563486535656537167272887888081122818446250297457337741167996349750029452642438203264827808024523752573238419578446", + "1.000008000032000085333504000273067030755971657558959100027103654818370719061312164579253428366464456865704272537228885187015821963109960213301575481664899700318156977468627339004606537398549611534419591779145085995021987503286692083161615280400738437478228082", + "1.000009000040500121500273375492075738113449002853342362270826936522769439053506312434733891423696475231451840105639022034099547530631069357197734900223780917121362697414411169834162425824448828187739490931751957990245737110414834239697625619798509198502096658" + ], + [ + "1", + "1.000000100000005000000166666670833333416666668055555575396825644841272597001791225749809603978358318652155457825720723310835749477655921114381043370965778946803600487177628675696518849337844070626989834763657881129895761844201299169626521857477088528076787941", + "1.0000002000000200000013333334000000026666667555555580952381587301601410935026455031585698337876116969450321577305954872095570508305771300267271499578847512370499623533827733553612983384410604230310443624550120630972400618605844172547533274118825780193176817", + "1.000000300000045000004500000337500020250001012500043392858770089339955358770089330093345265320642486420378812047150951932585414871265710565736755891829214719352313336596892188244686930029886632072476330684236070498981285061952559758496574715013905892895701089", + "1.000000400000080000010666667733333418666672355555880634936888889611287506850089234183135875154730635650316057486370988380148651512646061821375107132862137685917854711244758264394403486935467487834601381881074388794755133200215304180036071713259670219661843655", + "1.00000050000012500002083333593750026041668836805710565485878596768387648163650363459170938183586448223517322491984417230264503853560225899248618260891812286125687715790717851056332021067227280094027013605976616483231712313908590884158078628449553297320265405", + "1.000000600000180000036000005400000648000064800005554286130857170628573094857233745459089870339612396601341875185399525960230416993842863520266038257286707886476669929341390017488971653286696873950479551896971679958715383478746119711068288028062391371149489013", + "1.000000700000245000057166676670834733916830068071895695874206708425953000310487646018304089060036787599147676275105859400474689895123100075425333066539374860872723840060463730171521439940751466901429495510481112965046593615553202195597459116945123426063272682", + "1.000000800000320000085333350400002730667030755597165718446730528598265921018024975740706254352576521064770040651166185959246668919556974378390605929012147885350292967351465271446885744407117136286055594702758682175847035062242848897900206718995002247133857028", + "1.000000900000405000121500027337504920750738112594900189247699728341390729295808046226796645426268557424285412997921532857831252559494834249449859109227293811330322601387155767798258269722975398926936389317746988260923777387227501391642065587929462420948649232" + ], + [ + "1", + "1.000000010000000050000000166666667083333334166666668055555557539682542162698415454144623567019402857944526698866978250658807361436330455014317926127615562200160084332078829335070241590368747866364909946478207830319530929114193223423472427136476351070384633625", + "1.000000020000000200000001333333340000000026666666755555555809523810158730160141093477248677253807920483138260929194262546389530541572869646520440208084154592575244829846475616092104703889032125897195071483101405504938379453255735383526992590359391748128287405", + "1.000000030000000450000004500000033750000202500001012500004339285730558035768526785877008929015219156953632307755135494996911581545128998738775212024344872737597647678017165824376945452724547758781666745678104162427281549813045542731484072320901013699751540848", + "1.000000040000000800000010666666773333334186666672355555588063492226031746754144623700881844722783424475442360990450187254251567422193813585987728199005661346037368045665532810641944716974411635496550894053342760394407334227944985761375822664063299977760202737", + "1.000000050000001250000020833333593750002604166688368055710565477159288199826733382290633389520515681243290082960907019379206809977191789257370469042321233232800461660402341054369158081918084989239338793682313776586227863512850221202421400273283373014626367211", + "1.000000060000001800000036000000540000006480000064800000555428575594285742057143023771429480311692856103917078121968011417513832454609367779840918760983285672034325842279012880873143319189323358452529556891585903632812397146307138829975274828994563695371179662", + "1.000000070000002450000057166667667083347339166830068057189569458742066083425945994475448626459922975804831403503407994163590626814758811340046507352358986760731455499065728116768159458733073621810040408316793287135185674491416007904172650363644834002683382753", + "1.00000008000000320000008533333504000002730666703075555971657147018158767145538214765716437674024287074857138074282562507322952457285899884827258634480202409132370650245847484059340021912733791131203856792980510306420862566617226572338856338435031664716693301", + "1.000000090000004050000121500002733750049207500738112509490017963905559103341304251500301830456961374530766246749440063115416691606198573254987480954117363856553419891520480849271064924566428807047867009390728824337185742582403824875085506729653219774600501303" + ], + [ + "1", + "1.000000001000000000500000000166666666708333333341666666668055555555753968253993055555558311287478229717813076198492867247207525145893201460227749911054309202505145378825438957130678837687266560105088389907332936208344126353435648007509079302366904838332737965", + "1.000000002000000002000000001333333334000000000266666666755555555580952380958730158731569664903280423280474587141262359040138133471466992736834031733502636105810709353815485197855429903174537090912633982404546033943476658527442915537642542256751648098540938329", + "1.000000003000000004500000004500000003375000002025000001012500000433928571591294642911383928587700892861580762988122463474282007055499419665167245143251664943594715148543087862808485217520052561838182926761331655514641487182847805900109952106216843867588068853", + "1.000000004000000008000000010666666677333333341866666672355555558806349207974603175325573192528818342256751643453335471124025932917900958536700278753394083087253080794330245466119358391768262310261548181640401381566398544617645066573738726605241457683162358406", + "1.000000005000000012500000020833333359375000026041666688368055571056547628735739092683876215213190312069808326828429435504808836584577556241828530001848857197197448211202934610464624745817298908884851334334032243517528230506352913584728945540127503247334304454", + "1.000000006000000018000000036000000054000000064800000064800000055542857184514285742057142873805714294803116887661298703396123877022771514559643784921476238095255198598792535200905864592462478874938320339031361777709608682003676296114904000848969978666037676208", + "1.000000007000000024500000057166666766708333473391666830068055718956944587420659833425945293891988861264598969692976408540181920613546886836709421546188906759485969317880330268377230197365586777939297035267858198945289644124491347823705980150597478089811238908", + "1.000000008000000032000000085333333504000000273066667030755555971657143273244444814312522341749841485037242407372912278975495665944488178378343886315424095469213776993555687392616104926576737106225715914016443147964116812712649070583759250245851205008677469484", + "1.00000000900000004050000012150000027337500049207500073811250094900178678191272428191272417515002310759027859286803358595908816669708328358557549585827919550781509555184392013474906695251704896486905504823982001490494955628430631018008515640009464192836762086" + ], + [ + "1", + "1.000000000100000000005000000000166666666670833333333416666666668055555555575396825397073412698415454144620838844797178381032547701302041579835416640972311235208061369602374898159661717890890636377876292167626807167118097418250089799613232822429561584839732436", + "1.00000000020000000002000000000133333333340000000000266666666675555555555809523809530158730158871252204588359788359839666506334028111805902739236072757342598614945704892826162667432877205675217861820898140236791877216104086843490250510449150481689310382491997", + "1.000000000300000000045000000004500000000337500000020250000001012500000043392857144484375000054241071430198660714330093344156953632305220408497752796394453771498033216988957610473517976082538957931840649372284007980778387079364588612237999322952503353246629272", + "1.000000000400000000080000000010666666667733333333418666666672355555555880634920651174603175325573192268754850089234183100884792902571758052646972327378677406133744778611081257066906765018961252872327129135458024179406515595154985765757709114409879325763582657", + "1.000000000500000000125000000020833333335937500000260416666688368055557105654762001643105164112447641362588872366729829295443148050046993630164903199619632307099045282865341315842970320393225917211453732599727661119186787432356941799959234635398296083997006139", + "1.000000000600000000180000000036000000005400000000648000000064800000005554285714702285714313485714287380571428662316883121427532467742209790218779163693808965891265088968175158346191639365407702043087739343368804570472330777845741875602316524836720744596838442", + "1.000000000700000000245000000057166666676670833334733916666830068055571895694445874206597333425945223833643326112645989436864693566253849841192829330529553945887353131797463326009328289333089933370063364144225191646223300847249495173234424373673541944624979205", + "1.00000000080000000032000000008533333335040000000273066666703075555559716571428987530158767145537921830196825612021369262382312864973497139947588769798444529279829947588643443285558056813237014675084862707667638417307510222862170506049780991734222020598622395", + "1.000000000900000000405000000121500000027337500004920750000738112500094900178582104841518924769866167515002240004474209193517383867930324377468044757492746949756095835764624498574071199440142689339384466863378791519731786238325701991449155383573875144382022735" + ], + [ + "1", + "1.000000000010000000000050000000000166666666667083333333334166666666668055555555557539682539685019841269844025573192242614638447974286515953184707524985304368984924541627170595425328394905114959781791792654948681248246092509415204617290487417116640524671775301", + "1.000000000020000000000200000000001333333333340000000000026666666666755555555555809523809524444444444445855379188715343915343920474587141262359040136831070164403516530500657509842695027911535848043821402053583856122155392523906401192251402380938316915480143814", + "1.000000000030000000000450000000004500000000033750000000202500000001012500000004339285714301986607142911383928571591294642857586647727273836749188314248641983022469439043110730229591857308776602897731494805150380123093913492034937508031925936525164255550480239", + "1.00000000004000000000080000000001066666666677333333333418666666667235555555558806349206365460317460389700176367131992945327329421196091365293143081697890586810267216616505076424653349506852152837802535905072055073786420151577785100640838396137277112251514735", + "1.00000000005000000000125000000002083333333359375000000260416666668836805555571056547619144500248016411244764112038587136255618718183873319134007264068095774525059241470925396170577487944738923374878447003205386484881914018245946707333822256547575648332174683", + "1.000000000060000000001800000000036000000000540000000006480000000064800000000555428571432737142857170628571428738057142858051740259744804155844176818381618471507920651137351791067425123447985349695682484654572318487957897918242801974673257648070007868679130426", + "1.000000000070000000002450000000057166666667667083333347339166666830068055557189569444458742065972333425945216827808777011126459894108581865282025216633943931012807982367336200600492753258650819501465012407695965228823807927322155096641118825460150386445518263", + "1.000000000080000000003200000000085333333335040000000027306666667030755555559716571428613038730159100026807763100038095259614835337645468150286810918977324022206242931561668484892962175461856164162854060279811767399853148829723227492951123779037914467762124188", + "1.000000000090000000004050000000121500000002733750000049207500000738112500009490017857249619843751067627008938180071651864330456372342868033181841733736211930697323760184868971758523921789168189768615744476250539036111741578555829725167955219694647353096622696" + ], + [ + "1", + "1.000000000001000000000000500000000000166666666666708333333333341666666666668055555555555753968253968278769841269844025573192240134479717813076198492865161619501897279835647891203458229747912288359543650548989349005883400229246206526163527289595008850667173127", + "1.000000000002000000000002000000000001333333333334000000000000266666666666755555555555580952380952387301587301588712522045855661375661375712682379349054566832344611437944771278292548133818000146042474087934405394723223543640599392717523920626753962817433470826", + "1.000000000003000000000004500000000004500000000003375000000002025000000001012500000000433928571428734151785714339955357142873415178571433009334415585525060876623632656406093960958126694744810435100615729450516002218359617667057380685556574837983621173494200824", + "1.000000000004000000000008000000000010666666666677333333333341866666666672355555555558806349206350831746031746754144620811576437389770828180214846916538934316722871531760423728464363385819413586609559082109346707911677721834735995817714714655658155017123966004", + "1.00000000000500000000001250000000002083333333335937500000002604166666668836805555557105654761905730716765873554101906966759414269180016504642155734790995478949110032280612198459362555198266157726625772874678331610798998177006297680609976524115439541173420259", + "1.000000000006000000000018000000000036000000000054000000000064800000000064800000000055542857142898800000000027771428571445234285714294803116883121427532467534564955044955943850435279366265734265869100042814376117193730654971650198545964167632457503232017871985", + "1.000000000007000000000024500000000057166666666766708333333473391666666830068055555718956944444587420659722333425945216127225322145111264598940825753582453602353313225972915411685074603803437053433977043894247041815994636316149529701778786472611784462703889138", + "1.000000000008000000000032000000000085333333333504000000000273066666667030755555555971657142857558958730159100026807760436987936508151703908930719061223879089942306582357031179238190271212908602022996939574698978718233321541425959528060975659005527346418528599", + "1.000000000009000000000040500000000121500000000273375000000492075000000738112500000949001785715353341294643924769866072389435736607929018849432407803098113232874672320130046233975445553072196307524291707537220510858488196407197643148826305620029216908081970869" + ], + [ + "1", + "1.000000000000100000000000005000000000000166666666666670833333333333416666666666668055555555555575396825396825644841269841272597001763668457892416225749809603976270645024985302763096599902155457825720722546120136232570095008736915152259095717555490353654637693", + "1.000000000000200000000000020000000000001333333333333400000000000002666666666666755555555555558095238095238158730158730160141093474426835978835978836491903158569833787611565389474722808056143268841681540119296733053347123188393029666555965964618355391948779923", + "1.000000000000300000000000045000000000004500000000000337500000000020250000000001012500000000043392857142858770089285714339955357142858770089285714330093344155845265320616883142486419830170378812036178118579523155416218299696954834514122792910931153971094557661", + "1.00000000000040000000000008000000000001066666666666773333333333341866666666667235555555555588063492063493688888888888961128747795417351675485008923418310084980254182031959917508006396898364938999859716891065039215240131218967246103644485220410726154752182813", + "1.000000000000500000000000125000000000020833333333335937500000000260416666666688368055555557105654761904858785962301592683876212522314969824735461967924533029209381816261176142259312832929617646027019562700585870131297332583548849712255111360166306405086567142", + "1.000000000000600000000000180000000000036000000000005400000000000648000000000064800000000005554285714286130857142857170628571428573094857142857233745454545459089870129870339612387612396601341515627589471100328256668816897388801845549408590481518481518982450895", + "1.000000000000700000000000245000000000057166666666676670833333334733916666666830068055555571895694444445874206597222333425945216057166976658951112645989407997470754170760066981154246423015810712407224886058134625535319860314645696585222499332309114404479010322", + "1.000000000000800000000000320000000000085333333333350400000000002730666666667030755555555597165714285718446730158730528598236331599254349206351358308930575740706245524032130353794354298842520912389088268868503018037747790192050898910086286503634618149465704747", + "1.000000000000900000000000405000000000121500000000027337500000004920750000000738112500000094900178571439247698660715353341294642953229287946436433045637175914296604606371988765933288088674127964826707631922216113496674674148986363044496860143671243577643241797" + ], + [ + "1", + "1.00000000000001000000000000005000000000000016666666666666708333333333333416666666666666805555555555555753968253968254216269841269841545414462081129023368606701940285794452461119336553364331142269510325065880736143632969029870898257141643432824401739745683204", + "1.000000000000020000000000000200000000000001333333333333340000000000000026666666666666755555555555555809523809523810158730158730160141093474426810582010582010587141253807920483138260916038706972040305373657500641627625779668107710435784086577737371425015371482", + "1.000000000000030000000000000450000000000004500000000000033750000000000202500000000001012500000000004339285714285730558035714285768526785714285877008928571429015219155844156953632305194807755135489510494996911570572295830843263878998738775175717176310059097941", + "1.000000000000040000000000000800000000000010666666666666773333333333334186666666666672355555555555588063492063492226031746031746754144620811290367548500881844722783389450091142108919886805434894323783520587584079648392819017157643549035718347892490103756832682", + "1.000000000000050000000000001250000000000020833333333333593750000000002604166666666688368055555555710565476190477159288194444449826733355379215623966600529222853848504890681243288122630360738677795976463823627917153238548547431722212537579252513491528497895141", + "1.000000000000060000000000001800000000000036000000000000540000000000006480000000000064800000000000555428571428575594285714285742057142857143023771428571429480311688311692856103896103917078121878121968011417154274656689596118168895082060796351269490173691870225", + "1.000000000000070000000000002450000000000057166666666667667083333333347339166666666830068055555557189569444444458742065972222333425945216050161142110339511126459894079714642471342475838347947074466949660826626759076737909986334434737200569423813868209125061118", + "1.000000000000080000000000003200000000000085333333333335040000000000027306666666667030755555555559716571428571470181587301587671455379188715480990476190497710073432740242870747688526349158515558520603402824101263705714914519281853707209898319172054430569538082", + "1.000000000000090000000000004050000000000121500000000002733750000000049207500000000738112500000009490017857142963905558035715353341294642866751500223214364330456371753836374526684257328746723198702565062957968528363119291981226734282851988084786564653406103472" + ], + [ + "1", + "1.000000000000001000000000000000500000000000000166666666666666708333333333333341666666666666668055555555555555753968253968253993055555555555558311287477954144896384479717813076198492865159533913874191651969590337645893201460227749910289593593991742139890335833", + "1.000000000000002000000000000002000000000000001333333333333334000000000000000266666666666666755555555555555580952380952380958730158730158731569664902998236613756613756613807920474587141262359040136817915911249244582578103847945117786412685883585354487957662562", + "1.000000000000003000000000000004500000000000004500000000000003375000000000002025000000000001012500000000000433928571428571591294642857142911383928571428587700892857142861580762987012988122463474025974282007055444555499419665156272310102286106750394522086451494", + "1.000000000000004000000000000008000000000000010666666666666677333333333333341866666666666672355555555555558806349206349207974603174603175325573192239859195485008818342256751643418310120002137779915568470377359266251234291869212504954247007157060272389965511657", + "1.000000000000005000000000000012500000000000020833333333333359375000000000026041666666666688368055555555571056547619047628735739087301592683876212522048546523644179895403141659652076828429435308775782586614292343529022000662935706114244280270246557851904047187", + "1.00000000000000600000000000001800000000000003600000000000005400000000000006480000000000006480000000000005554285714285718451428571428574205714285714287380571428571429480311688311688766129870129870339612387612387702277151420008598821521335807063576195233338095", + "1.000000000000007000000000000024500000000000057166666666666766708333333333473391666666666830068055555555718956944444444587420659722222333425945216049460558655478395111264598940796886359643059647415484626357278274780213549872841697820531068941222114832031381804", + "1.000000000000008000000000000032000000000000085333333333333504000000000000273066666666667030755555555555971657142857143273244444444444814312522045855675083174603174818370575597242407372912190690056753273393273443722265929250083140248634767166738704512418804466", + "1.000000000000009000000000000040500000000000121500000000000273375000000000492075000000000738112500000000949001785714286781912723214286781912723214286675150022321429357590278003247342868033177760148459087904283479197083126137413049861121579402108279148620678486" + ], + [ + "1", + "1.000000000000000100000000000000005000000000000000166666666666666670833333333333333416666666666666668055555555555555575396825396825397073412698412698415454144620811287505511463844797178381032547699214367968708246486024279861085416640972311235208060604886766427", + "1.00000000000000020000000000000002000000000000000133333333333333340000000000000000266666666666666675555555555555555809523809523809530158730158730158871252204585537921693121693121693172999839666506334028111805889583680517013850347183868453709723550995898085845", + "1.000000000000000300000000000000045000000000000004500000000000000337500000000000020250000000000001012500000000000043392857142857144484375000000000054241071428571430198660714285714330093344155844156953632305194805220408497752247752796394453760525200069461788209", + "1.000000000000000400000000000000080000000000000010666666666666667733333333333333418666666666666672355555555555555880634920634920651174603174603175325573192239858935421516754850089234183100849767551459569237347016202497091385980305660712009918359945816284440624", + "1.000000000000000500000000000000125000000000000020833333333333335937500000000000260416666666666688368055555555557105654761904762001643105158730164112447641093474695922205687830700063162628266795443148050027390324771407941980859347644064053414275164241901696431", + "1.000000000000000600000000000000180000000000000036000000000000005400000000000000648000000000000064800000000000005554285714285714702285714285714313485714285714287380571428571428662316883116883121427532467532467742209790209790218779163693449408094680176965891264", + "1.000000000000000700000000000000245000000000000057166666666666676670833333333334733916666666666830068055555555571895694444444445874206597222222333425945216049390500309992283951112645989407968603531360231364573198294285559476609495997192590078165056998305407027", + "1.000000000000000800000000000000320000000000000085333333333333350400000000000002730666666666667030755555555555597165714285714289875301587301587671455379188712551635301587301589453547025813692623823128640906427512749176749177253665475735317032064340416001793007", + "1.000000000000000900000000000000405000000000000121500000000000027337500000000004920750000000000738112500000000094900178571428582104841517857143924769866071428667515002232142865004474208603896693517383827110430430324374843908718044757335298787389806890096519491" + ], + [ + "1", + "1.000000000000000010000000000000000050000000000000000166666666666666667083333333333333334166666666666666668055555555555555557539682539682539685019841269841269844025573192239858909281305114638447974286515953182619851374191651969429748813429368984924541627170598", + "1.000000000000000020000000000000000200000000000000001333333333333333340000000000000000026666666666666666755555555555555555809523809523809524444444444444444445855379188712522048677248677248677253807920474587141262359040136817914608847942181275514627641611768596", + "1.000000000000000030000000000000000450000000000000004500000000000000033750000000000000202500000000000001012500000000000004339285714285714301986607142857142911383928571428571591294642857142857586647727272727273836749188311688314248641983016983022469439043099755", + "1.000000000000000040000000000000000800000000000000010666666666666666773333333333333334186666666666666672355555555555555588063492063492063654603174603174603897001763668430337986596119929453273294211960878627580319598097375875261423350312239201436005499497562994", + "1.000000000000000050000000000000001250000000000000020833333333333333593750000000000002604166666666666688368055555555555710565476190476191445002480158730164112447641093474453719204695767195889520515171556838733191340070680350418458735516027189695036859130361164", + "1.000000000000000060000000000000001800000000000000036000000000000000540000000000000006480000000000000064800000000000000555428571428571432737142857142857170628571428571428738057142857142858051740259740259744804155844155844176818381618381618471507920650777793995", + "1.000000000000000070000000000000002450000000000000057166666666666667667083333333333347339166666666666830068055555555557189569444444444458742065972222222333425945216049383494475443672839511126459894079685775248531948536288969661078387597485597679474645403468476", + "1.00000000000000008000000000000000320000000000000008533333333333333504000000000000002730666666666666703075555555555555971657142857142861303873015873015910002680776014109643337142857142859294816867083533764546815028592806458869675509675510179998402068243340775", + "1.000000000000000090000000000000004050000000000000121500000000000002733750000000000049207500000000000738112500000000009490017857142857249619843750000001067627008928571438180071651785714364330456371753247342868033177759744341733736185689336930697323602736706615" + ], + [ + "1", + "1.000000000000000001000000000000000000500000000000000000166666666666666666708333333333333333341666666666666666668055555555555555555753968253968253968278769841269841269844025573192239858906801146384479717813076198492865159531828286168563946341724280092335647892", + "1.000000000000000002000000000000000002000000000000000001333333333333333334000000000000000000266666666666666666755555555555555555580952380952380952387301587301587301588712522045855379188994708994708994709046015712682379349054566832344610122389215722549055882388", + "1.000000000000000003000000000000000004500000000000000004500000000000000003375000000000000002025000000000000001012500000000000000433928571428571428734151785714285714339955357142857142873415178571428571433009334415584415585525060876623376623632656406093906093961", + "1.000000000000000004000000000000000008000000000000000010666666666666666677333333333333333341866666666666666672355555555555555558806349206349206350831746031746031746754144620811287478243104056437389770828180214846881513583205600983378761167315976204865093757063", + "1.000000000000000005000000000000000012500000000000000020833333333333333359375000000000000026041666666666666688368055555555555571056547619047619057307167658730158735541019069664903000927476025132275133498379754890171557347909954789295067268878100583829750566431", + "1.000000000000000006000000000000000018000000000000000036000000000000000054000000000000000064800000000000000064800000000000000055542857142857142898800000000000000027771428571428571445234285714285714294803116883116883121427532467532467534564955044955044955943848", + "1.000000000000000007000000000000000024500000000000000057166666666666666766708333333333333473391666666666666830068055555555555718956944444444444587420659722222222333425945216049382793891988811728395111264598940796857492420249120253460546797757670409580139582076", + "1.000000000000000008000000000000000032000000000000000085333333333333333504000000000000000273066666666666667030755555555555555971657142857142857558958730158730159100026807760141093770321269841269841485037242263908930719061223879001656867720084360084360134808958", + "1.000000000000000009000000000000000040500000000000000121500000000000000273375000000000000492075000000000000738112500000000000949001785714285715353341294642857143924769866071428572389435736607142857929018849431818182407803098112824675732874672319867632630046236" + ], + [ + "1", + "1.000000000000000000100000000000000000005000000000000000000166666666666666666670833333333333333333416666666666666666668055555555555555555575396825396825396825644841269841269841272597001763668430335124559082892416225749809603976270642937311691651969429747207541", + "1.000000000000000000200000000000000000020000000000000000001333333333333333333400000000000000000002666666666666666666755555555555555555558095238095238095238158730158730158730160141093474426807760169312169312169312169825236491903158569833787611565389343167252501", + "1.000000000000000000300000000000000000045000000000000000004500000000000000000337500000000000000020250000000000000001012500000000000000043392857142857142858770089285714285714339955357142857142858770089285714285714330093344155844155845265320616883116883142486419", + "1.000000000000000000400000000000000000080000000000000000010666666666666666667733333333333333333418666666666666666672355555555555555555880634920634920634936888888888888888889611287477954144620840183421516754850089234183100849767516469208486986264764043619524508", + "1.00000000000000000050000000000000000012500000000000000002083333333333333333593750000000000000026041666666666666668836805555555555555710565476190476190485878596230158730159268387621252204585564830315806878306879530125786636203302920938181626115653895392003709", + "1.00000000000000000060000000000000000018000000000000000003600000000000000000540000000000000000064800000000000000006480000000000000000555428571428571428613085714285714285717062857142857142857309485714285714285723374545454545454545908987012987012987033961238761", + "1.000000000000000000700000000000000000245000000000000000057166666666666666676670833333333333334733916666666666666830068055555555555571895694444444444445874206597222222222333425945216049382723833643325617283951112645989407968574664137420837425177704511425598692", + "1.000000000000000000800000000000000000320000000000000000085333333333333333350400000000000000002730666666666666667030755555555555555597165714285714285718446730158730158730528598236331569664932587682539682539684691642263908930575740706245524023301809908131572135", + "1.000000000000000000900000000000000000405000000000000000121500000000000000027337500000000000004920750000000000000738112500000000000094900178571428571439247698660714285715353341294642857142953229287946428571436433045637175324675914296604606331168871988765933284" + ], + [ + "1", + "1.000000000000000000010000000000000000000050000000000000000000166666666666666666667083333333333333333334166666666666666666668055555555555555555557539682539682539682542162698412698412698415454144620811287477956900352733686067019402857944524611191277860032200311", + "1.000000000000000000020000000000000000000200000000000000000001333333333333333333340000000000000000000026666666666666666666755555555555555555555809523809523809523810158730158730158730160141093474426807760143915343915343915343920474587141253807920483138260916037", + "1.000000000000000000030000000000000000000450000000000000000004500000000000000000033750000000000000000202500000000000000001012500000000000000004339285714285714285730558035714285714285768526785714285714285877008928571428571429015219155844155844156953632305194803", + "1.000000000000000000040000000000000000000800000000000000000010666666666666666666773333333333333333334186666666666666666672355555555555555555588063492063492063492226031746031746031746754144620811287477957034215167548500881844722783389450056116757808775586553367", + "1.0000000000000000000500000000000000000012500000000000000000208333333333333333335937500000000000000026041666666666666666883680555555555555557105654761904761904771592881944444444444498267333553791887125489572999338624338625561871818382235048906812432881226284", + "1.000000000000000000060000000000000000001800000000000000000036000000000000000000540000000000000000006480000000000000000064800000000000000000555428571428571428575594285714285714285742057142857142857143023771428571428571429480311688311688311692856103896103896105", + "1.000000000000000000070000000000000000002450000000000000000057166666666666666667667083333333333333347339166666666666666830068055555555555557189569444444444444458742065972222222222333425945216049382716827808777006172839511126459894079685746381309138009142349419", + "1.000000000000000000080000000000000000003200000000000000000085333333333333333335040000000000000000027306666666666666667030755555555555555559716571428571428571470181587301587301587671455379188712522048814323809523809523831043406766073432740242870747688525466307", + "1.000000000000000000090000000000000000004050000000000000000121500000000000000002733750000000000000049207500000000000000738112500000000000009490017857142857142963905558035714285715353341294642857142866751500223214285714364330456371753246753836374526684253246756" + ], + [ + "1", + "1.000000000000000000001000000000000000000000500000000000000000000166666666666666666666708333333333333333333341666666666666666666668055555555555555555555753968253968253968253993055555555555555555558311287477954144620811563051146384479717813076198492865159531825", + "1.000000000000000000002000000000000000000002000000000000000000001333333333333333333334000000000000000000000266666666666666666666755555555555555555555580952380952380952380958730158730158730158731569664902998236331569947089947089947089947141253807920474587141263", + "1.000000000000000000003000000000000000000004500000000000000000004500000000000000000003375000000000000000002025000000000000000001012500000000000000000433928571428571428571591294642857142857142911383928571428571428587700892857142857142861580762987012987012988123", + "1.000000000000000000004000000000000000000008000000000000000000010666666666666666666677333333333333333333341866666666666666666672355555555555555555558806349206349206349207974603174603174603175325573192239858906525862151675485008818342256751643418310084976786668", + "1.000000000000000000005000000000000000000012500000000000000000020833333333333333333359375000000000000000026041666666666666666688368055555555555555571056547619047619047628735739087301587301592683876212522045855381879856977513227513228736474992985409652076828429", + "1.000000000000000000006000000000000000000018000000000000000000036000000000000000000054000000000000000000064800000000000000000064800000000000000000055542857142857142857184514285714285714285742057142857142857142873805714285714285714294803116883116883116887661297", + "1.000000000000000000007000000000000000000024500000000000000000057166666666666666666766708333333333333333473391666666666666666830068055555555555555718956944444444444444587420659722222222222333425945216049382716127225322145061728395111264598940796857463553026308", + "1.000000000000000000008000000000000000000032000000000000000000085333333333333333333504000000000000000000273066666666666666667030755555555555555555971657142857142857143273244444444444444444814312522045855379189008416507936507936508151703908930575597242407372915", + "1.000000000000000000009000000000000000000040500000000000000000121500000000000000000273375000000000000000492075000000000000000738112500000000000000949001785714285714286781912723214285714286781912723214285714286675150022321428571429357590278003246753247342868031" + ], + [ + "1", + "1.000000000000000000000100000000000000000000005000000000000000000000166666666666666666666670833333333333333333333416666666666666666666668055555555555555555555575396825396825396825397073412698412698412698415454144620811287477954172178130511463844797178381032548", + "1.00000000000000000000020000000000000000000002000000000000000000000133333333333333333333340000000000000000000000266666666666666666666675555555555555555555555809523809523809523809530158730158730158730158871252204585537918871255026455026455026455026506333173", + "1.000000000000000000000300000000000000000000045000000000000000000004500000000000000000000337500000000000000000020250000000000000000001012500000000000000000043392857142857142857144484375000000000000000054241071428571428571430198660714285714285714330093344155846", + "1.000000000000000000000400000000000000000000080000000000000000000010666666666666666666667733333333333333333333418666666666666666666672355555555555555555555880634920634920634920651174603174603174603175325573192239858906525602088183421516754850089234183100849766", + "1.00000000000000000000050000000000000000000012500000000000000000002083333333333333333333593750000000000000000026041666666666666666668836805555555555555555710565476190476190476200164310515873015873016411244764109347442680802925553902116402116403339649596160013", + "1.000000000000000000000600000000000000000000180000000000000000000036000000000000000000005400000000000000000000648000000000000000000064800000000000000000005554285714285714285714702285714285714285714313485714285714285714287380571428571428571428662316883116883115", + "1.000000000000000000000700000000000000000000245000000000000000000057166666666666666666676670833333333333333334733916666666666666666830068055555555555555571895694444444444444445874206597222222222222333425945216049382716057166976658950617283951112645989407968576", + "1.000000000000000000000800000000000000000000320000000000000000000085333333333333333333350400000000000000000002730666666666666666667030755555555555555555597165714285714285714289875301587301587301587671455379188712522045884968634920634920634922786880359147025816", + "1.000000000000000000000900000000000000000000405000000000000000000121500000000000000000027337500000000000000004920750000000000000000738112500000000000000094900178571428571428582104841517857142857143924769866071428571428667515002232142857142865004474208603896105" + ], + [ + "1", + "1.000000000000000000000010000000000000000000000050000000000000000000000166666666666666666666667083333333333333333333334166666666666666666666668055555555555555555555557539682539682539682539685019841269841269841269844025573192239858906525575947971781305114638449", + "1.000000000000000000000020000000000000000000000200000000000000000000001333333333333333333333340000000000000000000000026666666666666666666666755555555555555555555555809523809523809523809524444444444444444444444445855379188712522045855382010582010582010582010585", + "1.000000000000000000000030000000000000000000000450000000000000000000004500000000000000000000033750000000000000000000202500000000000000000001012500000000000000000004339285714285714285714301986607142857142857142911383928571428571428571591294642857142857142857586", + "1.000000000000000000000040000000000000000000000800000000000000000000010666666666666666666666773333333333333333333334186666666666666666666672355555555555555555555588063492063492063492063654603174603174603174603897001763668430335097004653262786596119929453273303", + "1.000000000000000000000050000000000000000000001250000000000000000000020833333333333333333333593750000000000000000002604166666666666666666688368055555555555555555710565476190476190476191445002480158730158730164112447641093474426807787052538029100529100529222855", + "1.000000000000000000000060000000000000000000001800000000000000000000036000000000000000000000540000000000000000000006480000000000000000000064800000000000000000000555428571428571428571432737142857142857142857170628571428571428571428738057142857142857142858051741", + "1.000000000000000000000070000000000000000000002450000000000000000000057166666666666666666667667083333333333333333347339166666666666666666830068055555555555555557189569444444444444444458742065972222222222222333425945216049382716050161142110339506172839511126458", + "1.000000000000000000000080000000000000000000003200000000000000000000085333333333333333333335040000000000000000000027306666666666666666667030755555555555555555559716571428571428571428613038730158730158730159100026807760141093474429766704761904761904761926281501", + "1.000000000000000000000090000000000000000000004050000000000000000000121500000000000000000002733750000000000000000049207500000000000000000738112500000000000000009490017857142857142857249619843750000000000001067627008928571428571438180071651785714285714364330459" + ], + [ + "1", + "1.000000000000000000000001000000000000000000000000500000000000000000000000166666666666666666666666708333333333333333333333341666666666666666666666668055555555555555555555555753968253968253968253968278769841269841269841269844025573192239858906525573467813051147", + "1.000000000000000000000002000000000000000000000002000000000000000000000001333333333333333333333334000000000000000000000000266666666666666666666666755555555555555555555555580952380952380952380952387301587301587301587301588712522045855379188712522328042328042329", + "1.000000000000000000000003000000000000000000000004500000000000000000000004500000000000000000000003375000000000000000000002025000000000000000000001012500000000000000000000433928571428571428571428734151785714285714285714339955357142857142857142873415178571428569", + "1.000000000000000000000004000000000000000000000008000000000000000000000010666666666666666666666677333333333333333333333341866666666666666666666672355555555555555555555558806349206349206349206350831746031746031746031746754144620811287477954144909770723104056436", + "1.000000000000000000000005000000000000000000000012500000000000000000000020833333333333333333333359375000000000000000000026041666666666666666666688368055555555555555555571056547619047619047619057307167658730158730158735541019069664902998236334260809358465608467", + "1.000000000000000000000006000000000000000000000018000000000000000000000036000000000000000000000054000000000000000000000064800000000000000000000064800000000000000000000055542857142857142857142898800000000000000000000027771428571428571428571445234285714285714286", + "1.000000000000000000000007000000000000000000000024500000000000000000000057166666666666666666666766708333333333333333333473391666666666666666666830068055555555555555555718956944444444444444444587420659722222222222222333425945216049382716049460558655478395061727", + "1.000000000000000000000008000000000000000000000032000000000000000000000085333333333333333333333504000000000000000000000273066666666666666666667030755555555555555555555971657142857142857142857558958730158730158730159100026807760141093474427103654603174603174605", + "1.000000000000000000000009000000000000000000000040500000000000000000000121500000000000000000000273375000000000000000000492075000000000000000000738112500000000000000000949001785714285714285715353341294642857142857143924769866071428571428572389435736607142857144" + ], + [ + "1", + "1.000000000000000000000000100000000000000000000000005000000000000000000000000166666666666666666666666670833333333333333333333333416666666666666666666666668055555555555555555555555575396825396825396825396825644841269841269841269841272597001763668430335097001788", + "1.000000000000000000000000200000000000000000000000020000000000000000000000001333333333333333333333333400000000000000000000000002666666666666666666666666755555555555555555555555558095238095238095238095238158730158730158730158730160141093474426807760141093502646", + "1.000000000000000000000000300000000000000000000000045000000000000000000000004500000000000000000000000337500000000000000000000020250000000000000000000001012500000000000000000000043392857142857142857142858770089285714285714285714339955357142857142857142858770088", + "1.000000000000000000000000400000000000000000000000080000000000000000000000010666666666666666666666667733333333333333333333333418666666666666666666666672355555555555555555555555880634920634920634920634936888888888888888888888889611287477954144620811287506850092", + "1.000000000000000000000000500000000000000000000000125000000000000000000000020833333333333333333333335937500000000000000000000260416666666666666666666688368055555555555555555557105654761904761904761904858785962301587301587301592683876212522045855379188981636508", + "1.000000000000000000000000600000000000000000000000180000000000000000000000036000000000000000000000005400000000000000000000000648000000000000000000000064800000000000000000000005554285714285714285714286130857142857142857142857170628571428571428571428573094857144", + "1.00000000000000000000000070000000000000000000000024500000000000000000000005716666666666666666666667667083333333333333333333473391666666666666666666683006805555555555555555557189569444444444444444444587420659722222222222222233342594521604938271604939050030999", + "1.000000000000000000000000800000000000000000000000320000000000000000000000085333333333333333333333350400000000000000000000002730666666666666666666667030755555555555555555555597165714285714285714285718446730158730158730158730528598236331569664902998265921015871", + "1.000000000000000000000000900000000000000000000000405000000000000000000000121500000000000000000000027337500000000000000000004920750000000000000000000738112500000000000000000094900178571428571428571439247698660714285714285715353341294642857142857142953229287949" + ], + [ + "1", + "1.000000000000000000000000010000000000000000000000000050000000000000000000000000166666666666666666666666667083333333333333333333333334166666666666666666666666668055555555555555555555555557539682539682539682539682542162698412698412698412698415454144620811287477", + "1.000000000000000000000000020000000000000000000000000200000000000000000000000001333333333333333333333333340000000000000000000000000026666666666666666666666666755555555555555555555555555809523809523809523809523810158730158730158730158730160141093474426807760139", + "1.000000000000000000000000030000000000000000000000000450000000000000000000000004500000000000000000000000033750000000000000000000000202500000000000000000000001012500000000000000000000004339285714285714285714285730558035714285714285714285768526785714285714285713", + "1.000000000000000000000000040000000000000000000000000800000000000000000000000010666666666666666666666666773333333333333333333333334186666666666666666666666672355555555555555555555555588063492063492063492063492226031746031746031746031746754144620811287477954144", + "1.000000000000000000000000050000000000000000000000001250000000000000000000000020833333333333333333333333593750000000000000000000002604166666666666666666666688368055555555555555555555710565476190476190476190477159288194444444444444444449826733355379188712522045", + "1.000000000000000000000000060000000000000000000000001800000000000000000000000036000000000000000000000000540000000000000000000000006480000000000000000000000064800000000000000000000000555428571428571428571428575594285714285714285714285742057142857142857142857143", + "1.000000000000000000000000070000000000000000000000002450000000000000000000000057166666666666666666666667667083333333333333333333347339166666666666666666666830068055555555555555555557189569444444444444444444458742065972222222222222222333425945216049382716049381", + "1.000000000000000000000000080000000000000000000000003200000000000000000000000085333333333333333333333335040000000000000000000000027306666666666666666666667030755555555555555555555559716571428571428571428571470181587301587301587301587671455379188712522045855382", + "1.000000000000000000000000090000000000000000000000004050000000000000000000000121500000000000000000000002733750000000000000000000049207500000000000000000000738112500000000000000000009490017857142857142857142963905558035714285714285715353341294642857142857142868" + ], + [ + "1", + "1.000000000000000000000000001000000000000000000000000000500000000000000000000000000166666666666666666666666666708333333333333333333333333341666666666666666666666666668055555555555555555555555555753968253968253968253968253993055555555555555555555555558311287479", + "1.000000000000000000000000002000000000000000000000000002000000000000000000000000001333333333333333333333333334000000000000000000000000000266666666666666666666666666755555555555555555555555555580952380952380952380952380958730158730158730158730158731569664902999", + "1.00000000000000000000000000300000000000000000000000000450000000000000000000000000450000000000000000000000000337500000000000000000000000202500000000000000000000000101250000000000000000000000043392857142857142857142857159129464285714285714285714291138392857143", + "1.000000000000000000000000004000000000000000000000000008000000000000000000000000010666666666666666666666666677333333333333333333333333341866666666666666666666666672355555555555555555555555558806349206349206349206349207974603174603174603174603175325573192239859", + "1.000000000000000000000000005000000000000000000000000012500000000000000000000000020833333333333333333333333359375000000000000000000000026041666666666666666666666688368055555555555555555555571056547619047619047619047628735739087301587301587301592683876212522047", + "1.000000000000000000000000006000000000000000000000000018000000000000000000000000036000000000000000000000000054000000000000000000000000064800000000000000000000000064800000000000000000000000055542857142857142857142857184514285714285714285714285742057142857142858", + "1.000000000000000000000000007000000000000000000000000024500000000000000000000000057166666666666666666666666766708333333333333333333333473391666666666666666666666830068055555555555555555555718956944444444444444444444587420659722222222222222222333425945216049384", + "1.000000000000000000000000008000000000000000000000000032000000000000000000000000085333333333333333333333333504000000000000000000000000273066666666666666666666667030755555555555555555555555971657142857142857142857143273244444444444444444444444814312522045855381", + "1.000000000000000000000000009000000000000000000000000040500000000000000000000000121500000000000000000000000273375000000000000000000000492075000000000000000000000738112500000000000000000000949001785714285714285714286781912723214285714285714286781912723214285713" + ], + [ + "1", + "1.000000000000000000000000000100000000000000000000000000005000000000000000000000000000166666666666666666666666666670833333333333333333333333333416666666666666666666666666668055555555555555555555555555575396825396825396825396825397073412698412698412698412698414", + "1.000000000000000000000000000200000000000000000000000000020000000000000000000000000001333333333333333333333333333400000000000000000000000000002666666666666666666666666666755555555555555555555555555558095238095238095238095238095301587301587301587301587301588711", + "1.000000000000000000000000000300000000000000000000000000045000000000000000000000000004500000000000000000000000000337500000000000000000000000020250000000000000000000000001012500000000000000000000000043392857142857142857142857144484375000000000000000000000054239", + "1.000000000000000000000000000400000000000000000000000000080000000000000000000000000010666666666666666666666666667733333333333333333333333333418666666666666666666666666672355555555555555555555555555880634920634920634920634920651174603174603174603174603175325574", + "1.000000000000000000000000000500000000000000000000000000125000000000000000000000000020833333333333333333333333335937500000000000000000000000260416666666666666666666666688368055555555555555555555557105654761904761904761904762001643105158730158730158730164112449", + "1.000000000000000000000000000600000000000000000000000000180000000000000000000000000036000000000000000000000000005400000000000000000000000000648000000000000000000000000064800000000000000000000000005554285714285714285714285714702285714285714285714285714313485713", + "1.000000000000000000000000000700000000000000000000000000245000000000000000000000000057166666666666666666666666676670833333333333333333333334733916666666666666666666666830068055555555555555555555571895694444444444444444444445874206597222222222222222222333425947", + "1.000000000000000000000000000800000000000000000000000000320000000000000000000000000085333333333333333333333333350400000000000000000000000002730666666666666666666666667030755555555555555555555555597165714285714285714285714289875301587301587301587301587671455379", + "1.000000000000000000000000000900000000000000000000000000405000000000000000000000000121500000000000000000000000027337500000000000000000000004920750000000000000000000000738112500000000000000000000094900178571428571428571428582104841517857142857142857143924769868" + ], + [ + "1", + "1.000000000000000000000000000010000000000000000000000000000050000000000000000000000000000166666666666666666666666666667083333333333333333333333333334166666666666666666666666666668055555555555555555555555555557539682539682539682539682539685019841269841269841268", + "1.000000000000000000000000000020000000000000000000000000000200000000000000000000000000001333333333333333333333333333340000000000000000000000000000026666666666666666666666666666755555555555555555555555555555809523809523809523809523809524444444444444444444444447", + "1.000000000000000000000000000030000000000000000000000000000450000000000000000000000000004500000000000000000000000000033750000000000000000000000000202500000000000000000000000001012500000000000000000000000004339285714285714285714285714301986607142857142857142859", + "1.000000000000000000000000000040000000000000000000000000000800000000000000000000000000010666666666666666666666666666773333333333333333333333333334186666666666666666666666666672355555555555555555555555555588063492063492063492063492063654603174603174603174603175", + "1.000000000000000000000000000050000000000000000000000000001250000000000000000000000000020833333333333333333333333333593750000000000000000000000002604166666666666666666666666688368055555555555555555555555710565476190476190476190476191445002480158730158730158732", + "1.000000000000000000000000000060000000000000000000000000001800000000000000000000000000036000000000000000000000000000540000000000000000000000000006480000000000000000000000000064800000000000000000000000000555428571428571428571428571432737142857142857142857142857", + "1.000000000000000000000000000070000000000000000000000000002450000000000000000000000000057166666666666666666666666667667083333333333333333333333347339166666666666666666666666830068055555555555555555555557189569444444444444444444444458742065972222222222222222222", + "1.000000000000000000000000000080000000000000000000000000003200000000000000000000000000085333333333333333333333333335040000000000000000000000000027306666666666666666666666667030755555555555555555555555559716571428571428571428571428613038730158730158730158730158", + "1.00000000000000000000000000009000000000000000000000000000405000000000000000000000000012150000000000000000000000000273375000000000000000000000004920750000000000000000000000073811250000000000000000000000949001785714285714285714285724961984375" + ], + [ + "1", + "1.00000000000000000000000000000100000000000000000000000000000050000000000000000000000000000016666666666666666666666666666670833333333333333333333333333334166666666666666666666666666666805555555555555555555555555555575396825396825396825396825396827876984126984", + "1.000000000000000000000000000002000000000000000000000000000002000000000000000000000000000001333333333333333333333333333334000000000000000000000000000000266666666666666666666666666666755555555555555555555555555555580952380952380952380952380952387301587301587304", + "1.000000000000000000000000000003000000000000000000000000000004500000000000000000000000000004500000000000000000000000000003375000000000000000000000000002025000000000000000000000000001012500000000000000000000000000433928571428571428571428571428734151785714285719", + "1.000000000000000000000000000004000000000000000000000000000008000000000000000000000000000010666666666666666666666666666677333333333333333333333333333341866666666666666666666666666672355555555555555555555555555558806349206349206349206349206350831746031746031746", + "1.00000000000000000000000000000500000000000000000000000000001250000000000000000000000000002083333333333333333333333333335937500000000000000000000000002604166666666666666666666666668836805555555555555555555555557105654761904761904761904761905730716765873015873", + "1.000000000000000000000000000006000000000000000000000000000018000000000000000000000000000036000000000000000000000000000054000000000000000000000000000064800000000000000000000000000064800000000000000000000000000055542857142857142857142857142898799999999999999999", + "1.00000000000000000000000000000700000000000000000000000000002450000000000000000000000000005716666666666666666666666666676670833333333333333333333333347339166666666666666666666666683006805555555555555555555555571895694444444444444444444444458742065972222222222", + "1.00000000000000000000000000000800000000000000000000000000003200000000000000000000000000008533333333333333333333333333350400000000000000000000000000027306666666666666666666666666703075555555555555555555555555597165714285714285714285714285755895873015873015873", + "1.000000000000000000000000000009000000000000000000000000000040500000000000000000000000000121500000000000000000000000000273375000000000000000000000000492075000000000000000000000000738112500000000000000000000000949001785714285714285714285715353341294642857142859" + ], + [ + "1", + "1.000000000000000000000000000000100000000000000000000000000000005000000000000000000000000000000166666666666666666666666666666670833333333333333333333333333333416666666666666666666666666666668055555555555555555555555555555575396825396825396825396825396825644842", + "1.000000000000000000000000000000200000000000000000000000000000020000000000000000000000000000001333333333333333333333333333333400000000000000000000000000000002666666666666666666666666666666755555555555555555555555555555558095238095238095238095238095238158730159", + "1.000000000000000000000000000000300000000000000000000000000000045000000000000000000000000000004500000000000000000000000000000337500000000000000000000000000020250000000000000000000000000001012500000000000000000000000000043392857142857142857142857142858770089287", + "1.000000000000000000000000000000400000000000000000000000000000080000000000000000000000000000010666666666666666666666666666667733333333333333333333333333333418666666666666666666666666666672355555555555555555555555555555880634920634920634920634920634936888888889", + "1.000000000000000000000000000000500000000000000000000000000000125000000000000000000000000000020833333333333333333333333333335937500000000000000000000000000260416666666666666666666666666688368055555555555555555555555557105654761904761904761904761904858785962301", + "1.000000000000000000000000000000600000000000000000000000000000180000000000000000000000000000036000000000000000000000000000005400000000000000000000000000000648000000000000000000000000000064800000000000000000000000000005554285714285714285714285714286130857142859", + "1.00000000000000000000000000000070000000000000000000000000000024500000000000000000000000000005716666666666666666666666666667667083333333333333333333333333473391666666666666666666666666683006805555555555555555555555557189569444444444444444444444444587420659722", + "1.000000000000000000000000000000800000000000000000000000000000320000000000000000000000000000085333333333333333333333333333350400000000000000000000000000002730666666666666666666666666667030755555555555555555555555555597165714285714285714285714285718446730158732", + "1.000000000000000000000000000000900000000000000000000000000000405000000000000000000000000000121500000000000000000000000000027337500000000000000000000000004920750000000000000000000000000738112500000000000000000000000094900178571428571428571428571439247698660714" + ], + [ + "1", + "1.000000000000000000000000000000010000000000000000000000000000000050000000000000000000000000000000166666666666666666666666666666667083333333333333333333333333333334166666666666666666666666666666668055555555555555555555555555555557539682539682539682539682539682", + "1.000000000000000000000000000000020000000000000000000000000000000200000000000000000000000000000001333333333333333333333333333333340000000000000000000000000000000026666666666666666666666666666666755555555555555555555555555555555809523809523809523809523809523812", + "1.000000000000000000000000000000030000000000000000000000000000000450000000000000000000000000000004500000000000000000000000000000033750000000000000000000000000000202500000000000000000000000000001012500000000000000000000000000004339285714285714285714285714285728", + "1.000000000000000000000000000000040000000000000000000000000000000800000000000000000000000000000010666666666666666666666666666666773333333333333333333333333333334186666666666666666666666666666672355555555555555555555555555555588063492063492063492063492063492225", + "1.000000000000000000000000000000050000000000000000000000000000001250000000000000000000000000000020833333333333333333333333333333593750000000000000000000000000002604166666666666666666666666666688368055555555555555555555555555710565476190476190476190476190477159", + "1.000000000000000000000000000000060000000000000000000000000000001800000000000000000000000000000036000000000000000000000000000000540000000000000000000000000000006480000000000000000000000000000064800000000000000000000000000000555428571428571428571428571428575594", + "1.00000000000000000000000000000007000000000000000000000000000000245000000000000000000000000000005716666666666666666666666666666766708333333333333333333333333334733916666666666666666666666666683006805555555555555555555555555718956944444444444444444444444445874", + "1.000000000000000000000000000000080000000000000000000000000000003200000000000000000000000000000085333333333333333333333333333335040000000000000000000000000000027306666666666666666666666666667030755555555555555555555555555559716571428571428571428571428571470183", + "1.000000000000000000000000000000090000000000000000000000000000004050000000000000000000000000000121500000000000000000000000000002733750000000000000000000000000049207500000000000000000000000000738112500000000000000000000000009490017857142857142857142857142963907" + ], + [ + "1", + "1.000000000000000000000000000000001000000000000000000000000000000000500000000000000000000000000000000166666666666666666666666666666666708333333333333333333333333333333341666666666666666666666666666666668055555555555555555555555555555555753968253968253968253988", + "1.000000000000000000000000000000002000000000000000000000000000000002000000000000000000000000000000001333333333333333333333333333333334000000000000000000000000000000000266666666666666666666666666666666755555555555555555555555555555555580952380952380952380952383", + "1.00000000000000000000000000000000300000000000000000000000000000000450000000000000000000000000000000450000000000000000000000000000000337500000000000000000000000000000202500000000000000000000000000000101250000000000000000000000000000043392857142857142857142857", + "1.000000000000000000000000000000004000000000000000000000000000000008000000000000000000000000000000010666666666666666666666666666666677333333333333333333333333333333341866666666666666666666666666666672355555555555555555555555555555558806349206349206349206349208", + "1.000000000000000000000000000000005000000000000000000000000000000012500000000000000000000000000000020833333333333333333333333333333359375000000000000000000000000000026041666666666666666666666666666688368055555555555555555555555555571056547619047619047619047618", + "1.00000000000000000000000000000000600000000000000000000000000000001800000000000000000000000000000003600000000000000000000000000000005400000000000000000000000000000006480000000000000000000000000000006480000000000000000000000000000005554285714285714285714285714", + "1.000000000000000000000000000000007000000000000000000000000000000024500000000000000000000000000000057166666666666666666666666666666766708333333333333333333333333333473391666666666666666666666666666830068055555555555555555555555555718956944444444444444444444443", + "1.000000000000000000000000000000008000000000000000000000000000000032000000000000000000000000000000085333333333333333333333333333333504000000000000000000000000000000273066666666666666666666666666667030755555555555555555555555555555971657142857142857142857142858", + "1.000000000000000000000000000000009000000000000000000000000000000040500000000000000000000000000000121500000000000000000000000000000273375000000000000000000000000000492075000000000000000000000000000738112500000000000000000000000000949001785714285714285714285715" + ], + [ + "1", + "1.000000000000000000000000000000000100000000000000000000000000000000005000000000000000000000000000000000166666666666666666666666666666666670833333333333333333333333333333333416666666666666666666666666666666668055555555555555555555555555555555575396825396825398", + "1.000000000000000000000000000000000200000000000000000000000000000000020000000000000000000000000000000001333333333333333333333333333333333400000000000000000000000000000000002666666666666666666666666666666666755555555555555555555555555555555558095238095238095238", + "1.000000000000000000000000000000000300000000000000000000000000000000045000000000000000000000000000000004500000000000000000000000000000000337500000000000000000000000000000020250000000000000000000000000000001012500000000000000000000000000000043392857142857142855", + "1.000000000000000000000000000000000400000000000000000000000000000000080000000000000000000000000000000010666666666666666666666666666666667733333333333333333333333333333333418666666666666666666666666666666672355555555555555555555555555555555880634920634920634923", + "1.000000000000000000000000000000000500000000000000000000000000000000125000000000000000000000000000000020833333333333333333333333333333335937500000000000000000000000000000260416666666666666666666666666666688368055555555555555555555555555557105654761904761904763", + "1.000000000000000000000000000000000600000000000000000000000000000000180000000000000000000000000000000036000000000000000000000000000000005400000000000000000000000000000000648000000000000000000000000000000064800000000000000000000000000000005554285714285714285715", + "1.000000000000000000000000000000000700000000000000000000000000000000245000000000000000000000000000000057166666666666666666666666666666676670833333333333333333333333333334733916666666666666666666666666666830068055555555555555555555555555571895694444444444444448", + "1.000000000000000000000000000000000800000000000000000000000000000000320000000000000000000000000000000085333333333333333333333333333333350400000000000000000000000000000002730666666666666666666666666666667030755555555555555555555555555555597165714285714285714288", + "1.00000000000000000000000000000000090000000000000000000000000000000040500000000000000000000000000000012150000000000000000000000000000002733750000000000000000000000000000492075000000000000000000000000000073811250000000000000000000000000009490017857142857142858" + ] +]; -/***/ }), +;// CONCATENATED MODULE: ./lib/logarithm.js -/***/ 916: -/***/ (function(__unused_webpack_module, exports) { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.RoundingModes = void 0; -var RoundingModes; -(function (RoundingModes) { - /** - * Rounding mode to round towards positive infinity. - */ - RoundingModes[RoundingModes["CEILING"] = 0] = "CEILING"; - /** - * Rounding mode to round towards zero. - */ - RoundingModes[RoundingModes["DOWN"] = 1] = "DOWN"; - /** - * Rounding mode to round towards negative infinity. - */ - RoundingModes[RoundingModes["FLOOR"] = 2] = "FLOOR"; - /** - * Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, - * in which case round down. - */ - RoundingModes[RoundingModes["HALF_DOWN"] = 3] = "HALF_DOWN"; - /** - * Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, - * in which case, round towards the even neighbor. - */ - RoundingModes[RoundingModes["HALF_EVEN"] = 4] = "HALF_EVEN"; - /** - * Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, - * in which case round up. - */ - RoundingModes[RoundingModes["HALF_UP"] = 5] = "HALF_UP"; - /** - * Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary. - * UNIMPLEMENTED - */ - RoundingModes[RoundingModes["UNNECESSARY"] = 6] = "UNNECESSARY"; - /** - * Rounding mode to round away from zero. - */ - RoundingModes[RoundingModes["UP"] = 7] = "UP"; -})(RoundingModes = exports.RoundingModes || (exports.RoundingModes = {})); -/***/ }), -/***/ 859: -/***/ (function(__unused_webpack_module, exports) { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.stripTrailingZero = void 0; -/* -* Removes zero from front and back*/ -function stripTrailingZero(number) { - var isNegative = number[0] === '-'; - if (isNegative) { - number = number.substr(1); - } - while (number[0] == '0') { - number = number.substr(1); + + +const E = round_roundOff('2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921817413596629043572900334295260595630738132328627943490763233829880753195251019011573834187930702154089149934884167509244761460668082264', 257); +const LN2 = '0.69314718055994530941723212145818'; +const LOG2E = '1.44269504088896340735992468100188'; +const LN10 = '2.30258509299404568392825848336901'; +const LOG10E = '0.43429448190325182766805360691429'; +function Euler(precision = 32) { + precision = Math.max(16, precision); + let result = '1'; + let n = '1'; + let f = '1'; + while (true) { + f = multiply_multiply(f, n); + const next = divide_divide('1', f, precision + 2); + if (compareTo_lessThan(abs_abs(next), utils_tolerance(precision))) { + return round_roundOff(result, precision); + } + result = add_add(result, next); + n = add_add(n, '1'); } - if (number.indexOf('.') != -1) { - while (number[number.length - 1] == '0') { - number = number.substr(0, number.length - 1); +} +function exp(exponent) { + exponent = exponent.toString(); + const remainder = exponent.split('.')[1]; + let result = pow(E, abs_abs(exponent).split('.')[0], 33); + let fractionalExponent = '1'; + if (remainder) { + for (let i = 0; i < Math.min(33, remainder.length); i++) { + fractionalExponent = multiply_multiply(fractionalExponent, E_ROOTS_FOR_POW[i][remainder[i]]); } + result = multiply_multiply(result, fractionalExponent); } - if (number == "" || number == ".") { - number = '0'; + return pow(E, exponent, 33); +} +function expm1(exponent) { + exponent = exponent.toString(); + return subtract_subtract(exp(exponent), '1'); +} +function ln(x = 2) { + x = x.toString(); + if (compareTo_lessThan(x, '0', true)) { + throw "[ln]: x must be greater than 0"; } - else if (number[number.length - 1] == '.') { - number = number.substr(0, number.length - 1); + if (equals(x, '1')) { + return '0'; // ln(1) = 0 } - if (number[0] == '.') { - number = '0' + number; + let result = '0'; + let term = divide_divide(subtract_subtract(x, '1'), add_add(x, '1'), 33); + let i = 0; + while (true) { + i++; + let iteration = subtract_subtract(multiply_multiply('2', i), '1'); + let next = multiply_multiply(divide_divide('1', iteration, 33), pow(term, iteration)); + if (compareTo_lessThan(next, utils_tolerance(33))) { + return round_roundOff(multiply_multiply('2', add_add(result, next)), 32); + } + result = add_add(result, next); } - if (isNegative && number != '0') { - number = '-' + number; +} +function ln2(x = 2) { + x = x.toString(); + if (compareTo_lessThan(x, '0', true)) { + throw "[ln2]: x must be greater than 0"; } - return number; + let result = '0'; + while (compareTo_greaterThan(x, '2', true)) { + x = divide_divide(x, 2, 33); + result = add_add(result, '1'); + } + return round_roundOff(add_add(result, divide_divide(ln(x), LN2, 33)), 32); +} +function log(base) { + base = base.toString(); + return round_roundOff(multiply_multiply(ln2(base), LN2), 32); +} +function log10(base) { + base = base.toString(); + return divide_divide(log(base), LN10, 32); } -exports.stripTrailingZero = stripTrailingZero; +;// CONCATENATED MODULE: ./lib/trig.js -/***/ }), -/***/ 26: -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.negate = exports.subtract = void 0; -var add_1 = __webpack_require__(217); -function subtract(number1, number2) { - number1 = number1.toString(); - number2 = number2.toString(); - number2 = negate(number2); - return (0, add_1.add)(number1, number2); + + + + + + + +// PI up to the first 64 decimal places +const PI = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229'; +// Hypotenuse +function hypot(a, b) { + a = a.toString(); + b = b.toString(); + return sqRoot(add_add(pow(a, '2'), add_add(pow(b, '2')))); } -exports.subtract = subtract; -function negate(number) { - if (number[0] == '-') { - number = number.substr(1); +// Sine functions +function sin(x) { + x = x.toString(); + if (compareTo_greaterThan(abs_abs(x), PI)) { + let r = divide_divide(x, PI, 33).split('.'); + x = stripTrailingZero_stripTrailingZero(round_roundOff(multiply_multiply(pow(subtract_negate(sign(x).toString()), r[0]), multiply_multiply(PI, (r[1]) ? '0.' + r[1] : '0')), 32)); } - else { - number = '-' + number; + let result = '0'; + let _sign = '1'; + let n = '1'; // Series iteration + let f = '1'; // Factorial product + while (true) { + const N = subtract_subtract(multiply_multiply(n, '2'), '1'); // Next real term in series (even terms cancel) + f = multiply_multiply(f, N); + const next = multiply_multiply(_sign, divide_divide(pow(x, N, 33), f, 34)); + if (compareTo_lessThan(abs_abs(next), utils_tolerance(33))) { + result = add_add(result, next); + return stripTrailingZero_stripTrailingZero(isAproxZero(result) ? '0' : isAproxOne(result) ? multiply_multiply('1', sign(result).toString()) : result); + } + result = add_add(result, next); + _sign = subtract_negate(_sign); + f = multiply_multiply(f, multiply_multiply(n, '2')); // Iterate once to synchronize Factorial + n = add_add(n, '1'); } - return number; } -exports.negate = negate; +function asin(x) { + x = x.toString(); + if (compareTo_greaterThan(abs_abs(x), '1')) { + throw Error('[Arcsine]: argument x is out of range.'); + } + let result = '0'; + let n = '1'; + let even = '1'; + let odd = '1'; + while (true) { + const N = multiply_multiply(n, '2'); + const R = add_add(N, '1'); + even = multiply_multiply(even, N); + odd = multiply_multiply(odd, subtract_subtract(N, '1')); + let next = divide_divide(multiply_multiply(odd, pow(x, R)), multiply_multiply(even, R), 34); + if (compareTo_lessThan(next, utils_tolerance(33))) { + result = add_add(result, next); + return stripTrailingZero_stripTrailingZero(round_roundOff(add_add(result, x), 32)); + } + result = add_add(result, next); + n = add_add(n, '1'); + } +} +function sinh(x) { + x = x.toString(); + return stripTrailingZero_stripTrailingZero(subtract_subtract(divide_divide(exp(x), '2', 33), divide_divide(exp(subtract_negate(x)), '2', 33))); +} +// Cosine functions +function cos(x) { + x = x.toString(); + if (compareTo_greaterThan(abs_abs(x), PI)) { + let r = divide_divide(x, PI, 33).split('.'); + x = stripTrailingZero_stripTrailingZero(round_roundOff(multiply_multiply(pow(subtract_negate(sign(x).toString()), r[0]), multiply_multiply(PI, (r[1]) ? '0.' + r[1] : '0')), 32)); + } + let result = '0'; + let _sign = '1'; + let n = '1'; // Series iteration + let f = '1'; // Factorial product + while (true) { + const N = multiply_multiply(n, '2'); // Next real term in series (odd terms cancel) + f = multiply_multiply(f, subtract_subtract(N, '1')); // Iterate once to synchronize Factorial + f = multiply_multiply(f, N); + const next = multiply_multiply(_sign, divide_divide(pow(x, N, 33), f, 34)); + if (compareTo_lessThan(abs_abs(next), utils_tolerance(33))) { + result = subtract_subtract('1', add_add(result, next)); + return stripTrailingZero_stripTrailingZero(isAproxOne(result) ? multiply_multiply('1', sign(result).toString()) : isAproxZero(result) ? '0' : result); + } + result = add_add(result, next); + _sign = subtract_negate(_sign); + n = add_add(n, '1'); + } +} +function acos(x) { + x = x.toString(); + if (compareTo_greaterThan(abs_abs(x), '1')) { + throw Error('[Arccosine]: argument x is out of range.'); + } + return stripTrailingZero_stripTrailingZero(subtract_subtract(divide_divide(PI, 2, 32), asin(x))); +} +function cosh(x) { + x = x.toString(); + return stripTrailingZero_stripTrailingZero(divide_divide(add_add(exp(x), exp(subtract_negate(x))), '2', 32)); +} +// Tangant functions +function tan(x) { + x = x.toString(); + return stripTrailingZero_stripTrailingZero(divide_divide(sin(x), cos(x), 32)); +} +function atan(x) { + x = x.toString(); + if (compareTo_greaterThan(abs_abs(x), '1')) { + return stripTrailingZero_stripTrailingZero(subtract_subtract(divide_divide(PI, 2, 33), atan(divide_divide(1, x, 33)))); + } + let result = '0'; + let n = '0'; + while (true) { + let N = multiply_multiply('2', n); + let next = divide_divide(multiply_multiply(pow('-1', n), pow(x, add_add(N, '1'))), add_add(N, '1'), 32); + if (compareTo_lessThan(abs_abs(next), utils_tolerance(33))) { + return stripTrailingZero_stripTrailingZero(round_roundOff(add_add(result, next), 32)); + } + result = add_add(result, next); + n = add_add(n, '1'); + } +} +function atan2(y, x) { + x = x.toString(); + y = y.toString(); + let offset = '0'; + if (isExatclyZero(x) && isExatclyZero(y)) { + return '0'; + } + if (isExatclyZero(x) && compareTo_greaterThan(y, '0')) { + return stripTrailingZero_stripTrailingZero(round_roundOff(divide_divide(PI, 2, 33), 32)); + } + if (isExatclyZero(x) && compareTo_lessThan(y, '0')) { + return stripTrailingZero_stripTrailingZero(round_roundOff(subtract_negate(divide_divide(PI, 2, 33)), 32)); + } + if (compareTo_lessThan(x, '0')) { + offset = (compareTo_greaterThan(y, '0', true)) ? PI : subtract_negate(PI); + } + return stripTrailingZero_stripTrailingZero(round_roundOff(add_add(atan(divide_divide(y, x, 33)), offset), 32)); +} +function tanh(x) { + x = x.toString(); + return stripTrailingZero_stripTrailingZero(divide_divide(sinh(x), cosh(x), 32)); +} +;// CONCATENATED MODULE: ./lib/big-decimal.js -/***/ }) -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. -!function() { -var exports = __webpack_exports__; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -var add_1 = __webpack_require__(217); -var abs_1 = __webpack_require__(165); -var round_1 = __webpack_require__(350); -var multiply_1 = __webpack_require__(182); -var divide_1 = __webpack_require__(415); -var modulus_1 = __webpack_require__(213); -var compareTo_1 = __webpack_require__(664); -var subtract_1 = __webpack_require__(26); -var roundingModes_1 = __webpack_require__(916); -var stripTrailingZero_1 = __webpack_require__(859); -var bigDecimal = /** @class */ (function () { - function bigDecimal(number) { - if (number === void 0) { number = "0"; } - this.value = bigDecimal.validate(number); - } - bigDecimal.validate = function (number) { + + + + + + + + + + + + +class bigDecimal { + value; + static RoundingModes = RoundingModes; + static validate(number) { if (number) { number = number.toString(); - if (isNaN(number)) + if (isNaN(Number(number))) throw Error("Parameter is not a number: " + number); if (number[0] == "+") number = number.substring(1); @@ -735,48 +1796,50 @@ var bigDecimal = /** @class */ (function () { if (number.startsWith(".")) number = "0" + number; else if (number.startsWith("-.")) - number = "-0" + number.substr(1); - //handle exponentiation + number = "-0" + number.substring(1); + //handle exponentiation (scientific notation) if (/e/i.test(number)) { - var _a = number.split(/[eE]/), mantisa = _a[0], exponent = _a[1]; - mantisa = (0, add_1.trim)(mantisa); - var sign = ""; + let [mantisa, exponent] = number.split(/[eE]/); + let exponentIndex = Number(exponent); + mantisa = trim(mantisa); + let sign = ""; if (mantisa[0] == "-") { sign = "-"; mantisa = mantisa.substring(1); } if (mantisa.indexOf(".") >= 0) { - exponent = parseInt(exponent) + mantisa.indexOf("."); + exponentIndex = parseInt(exponent) + mantisa.indexOf("."); mantisa = mantisa.replace(".", ""); } else { - exponent = parseInt(exponent) + mantisa.length; + exponentIndex = parseInt(exponent) + mantisa.length; } - if (mantisa.length < exponent) { + if (mantisa.length < exponentIndex) { number = - sign + mantisa + new Array(exponent - mantisa.length + 1).join("0"); + sign + mantisa + new Array(exponentIndex - mantisa.length + 1).join("0"); } - else if (mantisa.length >= exponent && exponent > 0) { + else if (mantisa.length >= exponentIndex && exponentIndex > 0) { number = sign + - (0, add_1.trim)(mantisa.substring(0, exponent)) + - (mantisa.length > exponent ? "." + mantisa.substring(exponent) : ""); + trim(mantisa.substring(0, exponentIndex)) + + (mantisa.length > exponentIndex ? "." + mantisa.substring(exponentIndex) : ""); } else { - number = sign + "0." + new Array(-exponent + 1).join("0") + mantisa; + number = sign + "0." + new Array(-exponentIndex + 1).join("0") + mantisa; } } return number; - }; - bigDecimal.prototype.getValue = function () { + } + constructor(number = "0") { + this.value = bigDecimal.validate(number); + } + getValue() { return this.value; - }; - bigDecimal.prototype.setValue = function (num) { + } + setValue(num) { this.value = bigDecimal.validate(num); - }; - bigDecimal.getPrettyValue = function (number, digits, separator) { - if (digits === void 0) { digits = 3; } - if (separator === void 0) { separator = ","; } + } + static getPrettyValue(number, digits = 3, separator = ",") { // if (!(digits || separator)) { // digits = 3; // separator = ','; @@ -784,7 +1847,7 @@ var bigDecimal = /** @class */ (function () { // throw Error('Illegal Arguments. Should pass both digits and separator or pass none'); // } number = bigDecimal.validate(number); - var neg = number.charAt(0) == "-"; + let neg = number.charAt(0) == "-"; if (neg) number = number.substring(1); var len = number.indexOf("."); @@ -803,125 +1866,294 @@ var bigDecimal = /** @class */ (function () { temp; } return (neg ? "-" : "") + temp + number.substring(len); - }; - bigDecimal.prototype.getPrettyValue = function (digits, separator) { - if (digits === void 0) { digits = 3; } - if (separator === void 0) { separator = ","; } + } + getPrettyValue(digits = 3, separator = ",") { return bigDecimal.getPrettyValue(this.value, digits, separator); - }; - bigDecimal.round = function (number, precision, mode) { - if (precision === void 0) { precision = 0; } - if (mode === void 0) { mode = roundingModes_1.RoundingModes.HALF_EVEN; } + } + static round(number, precision = 0, mode = RoundingModes.HALF_EVEN) { number = bigDecimal.validate(number); // console.log(number) if (isNaN(precision)) throw Error("Precision is not a number: " + precision); - return (0, round_1.roundOff)(number, precision, mode); - }; - bigDecimal.prototype.round = function (precision, mode) { - if (precision === void 0) { precision = 0; } - if (mode === void 0) { mode = roundingModes_1.RoundingModes.HALF_EVEN; } + return round_roundOff(number, precision, mode); + } + round(precision = 0, mode = RoundingModes.HALF_EVEN) { if (isNaN(precision)) throw Error("Precision is not a number: " + precision); - return new bigDecimal((0, round_1.roundOff)(this.value, precision, mode)); - }; - bigDecimal.abs = function (number) { + return new bigDecimal(round_roundOff(this.value, precision, mode)); + } + static abs(number) { number = bigDecimal.validate(number); - return (0, abs_1.abs)(number); - }; - bigDecimal.prototype.abs = function () { - return new bigDecimal((0, abs_1.abs)(this.value)); - }; - bigDecimal.floor = function (number) { + return abs_abs(number); + } + abs() { + return new bigDecimal(abs_abs(this.value)); + } + static floor(number) { number = bigDecimal.validate(number); if (number.indexOf(".") === -1) return number; - return bigDecimal.round(number, 0, roundingModes_1.RoundingModes.FLOOR); - }; - bigDecimal.prototype.floor = function () { + return bigDecimal.round(number, 0, RoundingModes.FLOOR); + } + floor() { if (this.value.indexOf(".") === -1) return new bigDecimal(this.value); - return new bigDecimal(this.value).round(0, roundingModes_1.RoundingModes.FLOOR); - }; - bigDecimal.ceil = function (number) { + return new bigDecimal(this.value).round(0, RoundingModes.FLOOR); + } + static ceil(number) { number = bigDecimal.validate(number); if (number.indexOf(".") === -1) return number; - return bigDecimal.round(number, 0, roundingModes_1.RoundingModes.CEILING); - }; - bigDecimal.prototype.ceil = function () { + return bigDecimal.round(number, 0, RoundingModes.CEILING); + } + ceil() { if (this.value.indexOf(".") === -1) return new bigDecimal(this.value); - return new bigDecimal(this.value).round(0, roundingModes_1.RoundingModes.CEILING); - }; - bigDecimal.add = function (number1, number2) { + return new bigDecimal(this.value).round(0, RoundingModes.CEILING); + } + static add(number1, number2) { number1 = bigDecimal.validate(number1); number2 = bigDecimal.validate(number2); - return (0, add_1.add)(number1, number2); - }; - bigDecimal.prototype.add = function (number) { - return new bigDecimal((0, add_1.add)(this.value, number.getValue())); - }; - bigDecimal.subtract = function (number1, number2) { + return add_add(number1, number2); + } + add(number) { + return new bigDecimal(add_add(this.value, number.getValue())); + } + static subtract(number1, number2) { number1 = bigDecimal.validate(number1); number2 = bigDecimal.validate(number2); - return (0, subtract_1.subtract)(number1, number2); - }; - bigDecimal.prototype.subtract = function (number) { - return new bigDecimal((0, subtract_1.subtract)(this.value, number.getValue())); - }; - bigDecimal.multiply = function (number1, number2) { + return subtract_subtract(number1, number2); + } + subtract(number) { + return new bigDecimal(subtract_subtract(this.value, number.getValue())); + } + static multiply(number1, number2) { number1 = bigDecimal.validate(number1); number2 = bigDecimal.validate(number2); - return (0, multiply_1.multiply)(number1, number2); - }; - bigDecimal.prototype.multiply = function (number) { - return new bigDecimal((0, multiply_1.multiply)(this.value, number.getValue())); - }; - bigDecimal.divide = function (number1, number2, precision) { + return multiply_multiply(number1, number2); + } + multiply(number) { + return new bigDecimal(multiply_multiply(this.value, number.getValue())); + } + static divide(number1, number2, precision) { number1 = bigDecimal.validate(number1); number2 = bigDecimal.validate(number2); - return (0, divide_1.divide)(number1, number2, precision); - }; - bigDecimal.prototype.divide = function (number, precision) { - return new bigDecimal((0, divide_1.divide)(this.value, number.getValue(), precision)); - }; - bigDecimal.modulus = function (number1, number2) { + return divide_divide(number1, number2, precision); + } + divide(number, precision) { + return new bigDecimal(divide_divide(this.value, number.getValue(), precision)); + } + static modulus(number1, number2) { number1 = bigDecimal.validate(number1); number2 = bigDecimal.validate(number2); - return (0, modulus_1.modulus)(number1, number2); - }; - bigDecimal.prototype.modulus = function (number) { - return new bigDecimal((0, modulus_1.modulus)(this.value, number.getValue())); - }; - bigDecimal.compareTo = function (number1, number2) { + return modulus(number1, number2); + } + modulus(number) { + return new bigDecimal(modulus(this.value, number.getValue())); + } + static modulusE(number1, number2) { number1 = bigDecimal.validate(number1); number2 = bigDecimal.validate(number2); - return (0, compareTo_1.compareTo)(number1, number2); - }; - bigDecimal.prototype.compareTo = function (number) { - return (0, compareTo_1.compareTo)(this.value, number.getValue()); - }; - bigDecimal.negate = function (number) { + return modulusE(number1, number2); + } + modulusE(number) { + return new bigDecimal(modulusE(this.value, number.getValue())); + } + static negate(number) { number = bigDecimal.validate(number); - return (0, subtract_1.negate)(number); - }; - bigDecimal.prototype.negate = function () { - return new bigDecimal((0, subtract_1.negate)(this.value)); - }; - bigDecimal.stripTrailingZero = function (number) { + return subtract_negate(number); + } + negate() { + return new bigDecimal(subtract_negate(this.value)); + } + // Powers + static pow(base, exponent) { + base = bigDecimal.validate(base); + exponent = bigDecimal.validate(exponent); + return pow(base, exponent); + } + pow(exponent) { + return new bigDecimal(pow(this.value, exponent.getValue(), 32)); + } + // Roots + static get SQRT1_2() { + return sqRoot('.5'); + } + static get SQRT2() { + return sqRoot('2'); + } + static sqRoot(number) { number = bigDecimal.validate(number); - return (0, stripTrailingZero_1.stripTrailingZero)(number); - }; - bigDecimal.prototype.stripTrailingZero = function () { - return new bigDecimal((0, stripTrailingZero_1.stripTrailingZero)(this.value)); - }; - bigDecimal.RoundingModes = roundingModes_1.RoundingModes; - return bigDecimal; -}()); -exports["default"] = bigDecimal; + return sqRoot(number); + } + sqRoot() { + return new bigDecimal(sqRoot(this.value)); + } + static cbRoot(number) { + number = bigDecimal.validate(number); + return cbRoot(number); + } + cbRoot() { + return new bigDecimal(cbRoot(this.value)); + } + // Logarithms + static get E() { + return Euler(32); + } + static get LN2() { + return LN2; + } + static get LN10() { + return LN10; + } + static get LOG2E() { + return LOG2E; + } + static get LOG10E() { + return LOG10E; + } + static log2(number) { + number = bigDecimal.validate(number); + return ln2(number); + } + static log10(number) { + number = bigDecimal.validate(number); + return log10(number); + } + static log1p(number) { + number = bigDecimal.validate(number); + return log(add_add('1', number)); + } + static log(number) { + number = bigDecimal.validate(number); + return log(number); + } + static exp(number) { + number = bigDecimal.validate(number); + return exp(number); + } + static expm1(number) { + number = bigDecimal.validate(number); + return expm1(number); + } + // Trig + static hypot(a, b) { + a = bigDecimal.validate(a); + b = bigDecimal.validate(b); + return hypot(a, b); + } + static sin(number) { + number = bigDecimal.validate(number); + return sin(number); + } + static sinh(number) { + number = bigDecimal.validate(number); + return sinh(number); + } + static asin(number) { + number = bigDecimal.validate(number); + return asin(number); + } + static cos(number) { + number = bigDecimal.validate(number); + return cos(number); + } + static cosh(number) { + number = bigDecimal.validate(number); + return cosh(number); + } + static acos(number) { + number = bigDecimal.validate(number); + return acos(number); + } + static tan(number) { + number = bigDecimal.validate(number); + return tan(number); + } + static tanh(number) { + number = bigDecimal.validate(number); + return tanh(number); + } + static atan(number) { + number = bigDecimal.validate(number); + return atan(number); + } + static atan2(y, x) { + x = bigDecimal.validate(x); + y = bigDecimal.validate(y); + return atan2(y, x); + } + // Comparisons + static compareTo(number1, number2) { + number1 = bigDecimal.validate(number1); + number2 = bigDecimal.validate(number2); + return compareTo(number1, number2); + } + compareTo(number) { + return compareTo(this.value, number.getValue()); + } + static equals(number1, number2) { + number1 = bigDecimal.validate(number1); + number2 = bigDecimal.validate(number2); + return equals(number1, number2); + } + equals(number) { + return equals(this.value, number.getValue()); + } + static lt(number1, number2) { + number1 = bigDecimal.validate(number1); + number2 = bigDecimal.validate(number2); + return compareTo_lessThan(number1, number2); + } + lt(number) { + return compareTo_lessThan(this.value, number.getValue()); + } + static leq(number1, number2) { + number1 = bigDecimal.validate(number1); + number2 = bigDecimal.validate(number2); + return compareTo_lessThan(number1, number2, true); + } + leq(number) { + return compareTo_lessThan(this.value, number.getValue(), true); + } + static gt(number1, number2) { + number1 = bigDecimal.validate(number1); + number2 = bigDecimal.validate(number2); + return compareTo_greaterThan(number1, number2); + } + gt(number) { + return compareTo_greaterThan(this.value, number.getValue()); + } + static geq(number1, number2) { + number1 = bigDecimal.validate(number1); + number2 = bigDecimal.validate(number2); + return compareTo_greaterThan(number1, number2, true); + } + geq(number) { + return compareTo_greaterThan(this.value, number.getValue(), true); + } + static sign(number) { + number = bigDecimal.validate(number); + return sign(number); + } + sign() { + return sign(this.value); + } + // Misc. + static factorial(number) { + number = bigDecimal.validate(number); + return factorial(number); + } + static stripTrailingZero(number) { + number = bigDecimal.validate(number); + return stripTrailingZero_stripTrailingZero(number); + } + stripTrailingZero() { + return new bigDecimal(stripTrailingZero_stripTrailingZero(this.value)); + } +} +/* harmony default export */ var big_decimal = (bigDecimal); -}(); /******/ return __webpack_exports__; /******/ })() ; diff --git a/dist/node/js-big-decimal.min.js b/dist/node/js-big-decimal.min.js index 3097115..ae65b53 100644 --- a/dist/node/js-big-decimal.min.js +++ b/dist/node/js-big-decimal.min.js @@ -1 +1 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.bigDecimal=t():e.bigDecimal=t()}(global,(function(){return function(){"use strict";var e={165:function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.abs=void 0,t.abs=function(e){return"number"!=typeof e&&"bigint"!=typeof e||(e=e.toString()),"-"==e[0]?e.substring(1):e}},217:function(e,t){function n(e){if(u(e))return e;for(var t="",n=e.length,r=e.split(".")[1],i=r?r.length:0,a=0;a="0"&&e[a]<="9"?t+=9-parseInt(e[a]):t+=e[a];return o(t,i>0?"0."+new Array(i).join("0")+"1":"1")}function r(e){var t=e.split(".");for(t[0]||(t[0]="0");"0"==t[0][0]&&t[0].length>1;)t[0]=t[0].substring(1);return t[0]+(t[1]?"."+t[1]:"")}function i(e,t){var n=e.split("."),r=t.split("."),i=n[0].length,o=r[0].length;return i>o?r[0]=new Array(Math.abs(i-o)+1).join("0")+(r[0]?r[0]:""):n[0]=new Array(Math.abs(i-o)+1).join("0")+(n[0]?n[0]:""),i=n[1]?n[1].length:0,o=r[1]?r[1].length:0,(i||o)&&(i>o?r[1]=(r[1]?r[1]:"")+new Array(Math.abs(i-o)+1).join("0"):n[1]=(n[1]?n[1]:"")+new Array(Math.abs(i-o)+1).join("0")),[e=n[0]+(n[1]?"."+n[1]:""),t=r[0]+(r[1]?"."+r[1]:"")]}function o(e,t){var n;e=(n=i(e,t))[0],t=n[1];for(var r="",o=0,u=e.length-1;u>=0;u--)if("."!==e[u]){var a=parseInt(e[u])+parseInt(t[u])+o;r=a%10+r,o=Math.floor(a/10)}else r="."+r;return o?o.toString()+r:r}function u(e){return/^0[0]*[.]{0,1}[0]*$/.test(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.pad=t.trim=t.add=void 0,t.add=function(e,t){var a;void 0===t&&(t="0");var s=0,d=-1;"-"==e[0]&&(u(e=e.substring(1))||(s++,d=1,e.length)),"-"==t[0]&&(u(t=t.substring(1))||(s++,d=2,t.length)),e=r(e),t=r(t),e=(a=i(r(e),r(t)))[0],t=a[1],1==s&&(1===d?e=n(e):2===d&&(t=n(t)));var l=o(e,t);return s?2==s?"-"+r(l):e.lengtht[a]?u?-1:1:u?1:-1;return 0}},415:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.divide=void 0;var r=n(217),i=n(350);t.divide=function(e,t,n){if(void 0===n&&(n=8),0==t)throw new Error("Cannot divide by 0");if(e=e.toString(),t=t.toString(),e=e.replace(/(\.\d*?[1-9])0+$/g,"$1").replace(/\.0+$/,""),t=t.replace(/(\.\d*?[1-9])0+$/g,"$1").replace(/\.0+$/,""),0==e)return"0";var o=0;"-"==t[0]&&(t=t.substring(1),o++),"-"==e[0]&&(e=e.substring(1),o++);var u=t.indexOf(".")>0?t.length-t.indexOf(".")-1:-1;if(t=(0,r.trim)(t.replace(".","")),u>=0){var a=e.indexOf(".")>0?e.length-e.indexOf(".")-1:-1;if(-1==a)e=(0,r.trim)(e+new Array(u+1).join("0"));else if(u>a)e=e.replace(".",""),e=(0,r.trim)(e+new Array(u-a+1).join("0"));else if(u-1&&e.indexOf(".")-1&&e.indexOf(".")-1){var v=g.length-g.indexOf(".")-1;l>(g=g.replace(".","")).length&&(v+=l-g.length,g+=new Array(l-g.length+1).join("0")),d=v,f="0."+new Array(v).join("0")}for(n+=2;d<=n;){for(var p=0;parseInt(g)>=parseInt(t);)g=(0,r.add)(g,"-"+t),p++;f+=p,e?("."==e[0]&&(f+=".",d++,e=e.substring(1)),g+=e.substring(0,1),e=e.substring(1)):(d||(f+="."),d++,g+="0")}return(1==o?"-":"")+(0,r.trim)((0,i.roundOff)(f,n-2))}},213:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.modulus=void 0;var r=n(415),i=n(350),o=n(182),u=n(26),a=n(916);function s(e){if(-1!=e.indexOf("."))throw new Error("Modulus of non-integers not supported")}t.modulus=function(e,t){if(0==t)throw new Error("Cannot divide by 0");e=e.toString(),t=t.toString(),s(e),s(t);var n="";return"-"==e[0]&&(n="-",e=e.substr(1)),"-"==t[0]&&(t=t.substr(1)),n+(0,u.subtract)(e,(0,o.multiply)(t,(0,i.roundOff)((0,r.divide)(e,t),0,a.RoundingModes.FLOOR)))}},182:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.multiply=void 0;var r=n(859);t.multiply=function(e,t){e=e.toString(),t=t.toString();var n=0;"-"==e[0]&&(n++,e=e.substr(1)),"-"==t[0]&&(n++,t=t.substr(1)),e=(0,r.stripTrailingZero)(e),t=(0,r.stripTrailingZero)(t);var i=0,o=0;-1!=e.indexOf(".")&&(i=e.length-e.indexOf(".")-1),-1!=t.indexOf(".")&&(o=t.length-t.indexOf(".")-1);var u=i+o;if(e=(0,r.stripTrailingZero)(e.replace(".","")),t=(0,r.stripTrailingZero)(t.replace(".","")),e.length=v&&b>=0;b--)g[b]>-1&&g[b]=s.length?new Array(d-s.length+1).join("0")+s:s).substr(0,s.length-d)+"."+s.substr(s.length-d,d))),1==n&&(p="-"+p),p}},350:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.roundOff=void 0;var r=n(916);function i(e,t,n,i){if(!e||e===new Array(e.length+1).join("0"))return!1;if(i===r.RoundingModes.DOWN||!n&&i===r.RoundingModes.FLOOR||n&&i===r.RoundingModes.CEILING)return!1;if(i===r.RoundingModes.UP||n&&i===r.RoundingModes.FLOOR||!n&&i===r.RoundingModes.CEILING)return!0;var o="5"+new Array(e.length).join("0");if(e>o)return!0;if(e=0;r--){var i=parseInt(e[r])+t;10==i?(t=1,i=0):t=0,n+=i}return t&&(n+=t),n.split("").reverse().join("")}t.roundOff=function e(t,n,u){if(void 0===n&&(n=0),void 0===u&&(u=r.RoundingModes.HALF_EVEN),u===r.RoundingModes.UNNECESSARY)throw new Error("UNNECESSARY Rounding Mode has not yet been implemented");"number"!=typeof t&&"bigint"!=typeof t||(t=t.toString());var a=!1;"-"===t[0]&&(a=!0,t=t.substring(1));var s=t.split("."),d=s[0],l=s[1];if(n<0){if(n=-n,d.length<=n)return"0";var f=d.substr(0,d.length-n);return(a?"-":"")+(f=e(t=f+"."+d.substr(d.length-n)+l,0,u))+new Array(n+1).join("0")}if(0==n){d.length;return i(s[1],d,a,u)&&(d=o(d)),(a&&parseInt(d)?"-":"")+d}if(!s[1])return(a?"-":"")+d+"."+new Array(n+1).join("0");if(s[1].lengthn?(a?"-":"")+o(d,parseInt(l[0]))+"."+l.substring(1):(a&&(parseInt(d)||parseInt(l))?"-":"")+d+"."+l}},916:function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.RoundingModes=void 0,function(e){e[e.CEILING=0]="CEILING",e[e.DOWN=1]="DOWN",e[e.FLOOR=2]="FLOOR",e[e.HALF_DOWN=3]="HALF_DOWN",e[e.HALF_EVEN=4]="HALF_EVEN",e[e.HALF_UP=5]="HALF_UP",e[e.UNNECESSARY=6]="UNNECESSARY",e[e.UP=7]="UP"}(t.RoundingModes||(t.RoundingModes={}))},859:function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.stripTrailingZero=void 0,t.stripTrailingZero=function(e){var t="-"===e[0];for(t&&(e=e.substr(1));"0"==e[0];)e=e.substr(1);if(-1!=e.indexOf("."))for(;"0"==e[e.length-1];)e=e.substr(0,e.length-1);return""==e||"."==e?e="0":"."==e[e.length-1]&&(e=e.substr(0,e.length-1)),"."==e[0]&&(e="0"+e),t&&"0"!=e&&(e="-"+e),e}},26:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.negate=t.subtract=void 0;var r=n(217);function i(e){return e="-"==e[0]?e.substr(1):"-"+e}t.subtract=function(e,t){return e=e.toString(),t=i(t=t.toString()),(0,r.add)(e,t)},t.negate=i}},t={};function n(r){var i=t[r];if(void 0!==i)return i.exports;var o=t[r]={exports:{}};return e[r](o,o.exports,n),o.exports}var r={};return function(){var e=r;Object.defineProperty(e,"__esModule",{value:!0});var t=n(217),i=n(165),o=n(350),u=n(182),a=n(415),s=n(213),d=n(664),l=n(26),f=n(916),g=n(859),v=function(){function e(t){void 0===t&&(t="0"),this.value=e.validate(t)}return e.validate=function(e){if(e){if(e=e.toString(),isNaN(e))throw Error("Parameter is not a number: "+e);"+"==e[0]&&(e=e.substring(1))}else e="0";if(e.startsWith(".")?e="0"+e:e.startsWith("-.")&&(e="-0"+e.substr(1)),/e/i.test(e)){var n=e.split(/[eE]/),r=n[0],i=n[1],o="";"-"==(r=(0,t.trim)(r))[0]&&(o="-",r=r.substring(1)),r.indexOf(".")>=0?(i=parseInt(i)+r.indexOf("."),r=r.replace(".","")):i=parseInt(i)+r.length,e=r.length=i&&i>0?o+(0,t.trim)(r.substring(0,i))+(r.length>i?"."+r.substring(i):""):o+"0."+new Array(1-i).join("0")+r}return e},e.prototype.getValue=function(){return this.value},e.prototype.setValue=function(t){this.value=e.validate(t)},e.getPrettyValue=function(t,n,r){void 0===n&&(n=3),void 0===r&&(r=",");var i="-"==(t=e.validate(t)).charAt(0);i&&(t=t.substring(1));for(var o=t.indexOf("."),u="",a=o=o>0?o:t.length;a>0;)a=0?r:"")+u;return(i?"-":"")+u+t.substring(o)},e.prototype.getPrettyValue=function(t,n){return void 0===t&&(t=3),void 0===n&&(n=","),e.getPrettyValue(this.value,t,n)},e.round=function(t,n,r){if(void 0===n&&(n=0),void 0===r&&(r=f.RoundingModes.HALF_EVEN),t=e.validate(t),isNaN(n))throw Error("Precision is not a number: "+n);return(0,o.roundOff)(t,n,r)},e.prototype.round=function(t,n){if(void 0===t&&(t=0),void 0===n&&(n=f.RoundingModes.HALF_EVEN),isNaN(t))throw Error("Precision is not a number: "+t);return new e((0,o.roundOff)(this.value,t,n))},e.abs=function(t){return t=e.validate(t),(0,i.abs)(t)},e.prototype.abs=function(){return new e((0,i.abs)(this.value))},e.floor=function(t){return-1===(t=e.validate(t)).indexOf(".")?t:e.round(t,0,f.RoundingModes.FLOOR)},e.prototype.floor=function(){return-1===this.value.indexOf(".")?new e(this.value):new e(this.value).round(0,f.RoundingModes.FLOOR)},e.ceil=function(t){return-1===(t=e.validate(t)).indexOf(".")?t:e.round(t,0,f.RoundingModes.CEILING)},e.prototype.ceil=function(){return-1===this.value.indexOf(".")?new e(this.value):new e(this.value).round(0,f.RoundingModes.CEILING)},e.add=function(n,r){return n=e.validate(n),r=e.validate(r),(0,t.add)(n,r)},e.prototype.add=function(n){return new e((0,t.add)(this.value,n.getValue()))},e.subtract=function(t,n){return t=e.validate(t),n=e.validate(n),(0,l.subtract)(t,n)},e.prototype.subtract=function(t){return new e((0,l.subtract)(this.value,t.getValue()))},e.multiply=function(t,n){return t=e.validate(t),n=e.validate(n),(0,u.multiply)(t,n)},e.prototype.multiply=function(t){return new e((0,u.multiply)(this.value,t.getValue()))},e.divide=function(t,n,r){return t=e.validate(t),n=e.validate(n),(0,a.divide)(t,n,r)},e.prototype.divide=function(t,n){return new e((0,a.divide)(this.value,t.getValue(),n))},e.modulus=function(t,n){return t=e.validate(t),n=e.validate(n),(0,s.modulus)(t,n)},e.prototype.modulus=function(t){return new e((0,s.modulus)(this.value,t.getValue()))},e.compareTo=function(t,n){return t=e.validate(t),n=e.validate(n),(0,d.compareTo)(t,n)},e.prototype.compareTo=function(e){return(0,d.compareTo)(this.value,e.getValue())},e.negate=function(t){return t=e.validate(t),(0,l.negate)(t)},e.prototype.negate=function(){return new e((0,l.negate)(this.value))},e.stripTrailingZero=function(t){return t=e.validate(t),(0,g.stripTrailingZero)(t)},e.prototype.stripTrailingZero=function(){return new e((0,g.stripTrailingZero)(this.value))},e.RoundingModes=f.RoundingModes,e}();e.default=v}(),r}()})); \ No newline at end of file +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.bigDecimal=e():t.bigDecimal=e()}("undefined"!=typeof self?self:this,(function(){return function(){"use strict";var t,e={d:function(t,r){for(var i in r)e.o(r,i)&&!e.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:r[i]})},o:function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r:function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},r={};function i(t,e="0"){let r,i=0,s=-1;"-"==t[0]&&(o(t=t.substring(1))||(i++,s=1,r=t.length)),"-"==e[0]&&(o(e=e.substring(1))||(i++,s=2,r=e.length)),t=a(t),e=a(e),[t,e]=l(a(t),a(e)),1==i&&(1===s?t=n(t):2===s&&(e=n(e)));let g=u(t,e);return i?2==i?"-"+a(g):t.length="0"&&t[i]<="9"?e+=9-parseInt(t[i]):e+=t[i];return u(e,n>0?"0."+new Array(n).join("0")+"1":"1")}function a(t){let e=t.split(".");for(e[0]||(e[0]="0");"0"==e[0][0]&&e[0].length>1;)e[0]=e[0].substring(1);return e[0]+(e[1]?"."+e[1]:"")}function l(t,e){let r=t.split("."),i=e.split("."),n=Math.max(r[0].length,i[0].length);return r[0]=r[0].padStart(n,"0"),i[0]=i[0].padStart(n,"0"),r[1]=r[1]||"",i[1]=i[1]||"",n=Math.max(r[1].length,i[1].length),r[1]=r[1].padEnd(n,"0"),i[1]=i[1].padEnd(n,"0"),[t=r[0]+(r[1]?"."+r[1]:""),e=i[0]+(i[1]?"."+i[1]:"")]}function u(t,e){[t,e]=l(t,e);let r="",i=0;for(let n=t.length-1;n>=0;n--){if("."===t[n]){r="."+r;continue}let a=parseInt(t[n])+parseInt(e[n])+i;r=a%10+r,i=Math.floor(a/10)}return i?i.toString()+r:r}function o(t){return/^0[0]*[.]{0,1}[0]*$/.test(t)}function s(t){return"number"!=typeof t&&"bigint"!=typeof t||(t=t.toString()),"-"==t[0]?t.substring(1):t}function g(t){const e="-"===t[0];for(e&&(t=t.substring(1));"0"==t[0];)t=t.substring(1);if(-1!=t.indexOf("."))for(;"0"==t[t.length-1];)t=t.substring(0,t.length-1);return""==t||"."==t?t="0":"."==t[t.length-1]&&(t=t.substring(0,t.length-1)),"."==t[0]&&(t="0"+t),e&&"0"!=t&&(t="-"+t),t}function c(e,r=0,i=t.HALF_EVEN){if("number"!=typeof e&&"bigint"!=typeof e||(e=e.toString()),i===t.UNNECESSARY){let[t,i]=g(e.replace("-","")).split(".");if(r>0&&i){if(i.length<=r)return e;if(/[^0]/.test(i.slice(r)))throw new Error("Number is not an exact value. Rounding necessary.");return e}if(r<0&&i)throw new Error("Number is not an exact value. Rounding necessary.");if(r<0){if(t.length<=Math.abs(r)||/[^0]/.test(t.slice(r)))throw new Error("Number is not an exact value. Rounding necessary.");return e}if(0==r&&i)throw new Error("Number is not an exact value. Rounding necessary.");return e}let n=!1;"-"===e[0]&&(n=!0,e=e.substring(1));let a=e.split("."),l=a[0],u=a[1];if(r<0){if(r=-r,l.length<=r)return"0";{let t=l.substring(0,l.length-r);return t=c(e=t+"."+l.substring(l.length-r)+u,0,i),(n?"-":"")+t+new Array(r+1).join("0")}}if(0==r){l.length;return f(a[1],l,n,i)&&(l=b(l)),(n&&parseInt(l)?"-":"")+l}if(!a[1])return(n?"-":"")+l+"."+new Array(r+1).join("0");if(a[1].lengthr)?(n?"-":"")+b(l,parseInt(u[0]))+"."+u.substring(1):(n&&(parseInt(l)||parseInt(u))?"-":"")+l+"."+u}function f(e,r,i,n){if(!e||e===new Array(e.length+1).join("0"))return!1;if(n===t.DOWN||!i&&n===t.FLOOR||i&&n===t.CEILING)return!1;if(n===t.UP||i&&n===t.FLOOR||!i&&n===t.CEILING)return!0;let a="5"+new Array(e.length).join("0");if(e>a)return!0;if(e=0;i--){let n=parseInt(t[i])+e;10==n?(e=1,n=0):e=0,r+=n}return e&&(r+=e),r.split("").reverse().join("")}function d(t,e){t=t.toString(),e=e.toString();let r=0;"-"==t[0]&&(r++,t=t.substr(1)),"-"==e[0]&&(r++,e=e.substr(1)),t=g(t),e=g(e);let i=0,n=0;-1!=t.indexOf(".")&&(i=t.length-t.indexOf(".")-1),-1!=e.indexOf(".")&&(n=e.length-e.indexOf(".")-1);let a=i+n;if(t=g(t.replace(".","")),e=g(e.replace(".","")),t.length=s&&i>=0;i--)o[i]>-1&&o[i]=f.length?new Array(b-f.length+1).join("0")+f:f).substr(0,f.length-b)+"."+f.substr(f.length-b,b))),1==r&&(c="-"+c),c}function h(t,e,r){if("number"!=typeof t&&"number"!=typeof e||(t=t.toString(),e=e.toString()),"0"==e)return"";void 0===r&&(r=8),t=t.replace(/(\.\d*?[1-9])0+$/g,"$1").replace(/\.0+$/,"");let n=0;"-"==(e=e.replace(/(\.\d*?[1-9])0+$/g,"$1").replace(/\.0+$/,""))[0]&&(e=e.substring(1),n++),"-"==t[0]&&(t=t.substring(1),n++);var l=e.indexOf(".")>0?e.length-e.indexOf(".")-1:-1;if(e=a(e.replace(".","")),l>=0){let e=t.indexOf(".")>0?t.length-t.indexOf(".")-1:-1;if(-1==e)t=a(t+new Array(l+1).join("0"));else if(l>e)t=a((t=t.replace(".",""))+new Array(l-e+1).join("0"));else if(l-1&&t.indexOf(".")-1&&t.indexOf(".")-1){let t=g.length-g.indexOf(".")-1;g=g.replace(".",""),o>g.length&&(t+=o-g.length,g+=new Array(o-g.length+1).join("0")),u=t,s="0."+new Array(t).join("0")}for(r+=2;u<=r;){let r=0;for(;parseInt(g)>=parseInt(e);)g=i(g,"-"+e),r++;s+=r,t?("."==t[0]&&(s+=".",u++,t=t.substring(1)),g+=t.substring(0,1),t=t.substring(1)):(u||(s+="."),u++,g+="0")}return(1==n?"-":"")+a(c(s,r-2))}function m(t,e){return i(t=t.toString(),e=v(e=e.toString()))}function v(t){return t="-"==t[0]?t.substr(1):"-"+t}function p(e,r=1,i){if(0==r)throw new Error("Cannot divide by 0");return e=e.toString(),w(r=r.toString()),m(e,d(r,c(h(e,r,i),0,t.FLOOR)))}function D(t,e=1,r){if(0==e)throw new Error("Cannot divide by 0");t=t.toString(),w(e=e.toString());const i=p(s(t),s(e),r);return t.includes("-")?v(i):i}function w(t){if(t.includes("."))throw new Error("Modulus of non-integers not supported")}function S(t,e){let r=!1;if([t,e]=[t,e].map((t=>g(t))),"-"==t[0]&&"-"!=e[0])return-1;if("-"!=t[0]&&"-"==e[0])return 1;"-"==t[0]&&"-"==e[0]&&(t=t.substring(1),e=e.substring(1),r=!0);let i=t.indexOf("."),n=e.indexOf(".");if(-1==i&&i==n){if(t.length>e.length)return r?-1:1;if(t.lengthn)return r?-1:1}if(-1!==i&&-1==n){if(e.lengthi)return r?-1:1}if([t,e]=l(t,e),0==t.localeCompare(e))return 0;for(let i=0;ie[i]?r?-1:1:r?1:-1;return 0}function O(t,e,r=!1){return r&&0===S(t,e)||-1===S(t,e)}function y(t,e,r=!1){return r&&0===S(t,e)||1===S(t,e)}function x(t,e){return 0===S(g(t),g(e))}function E(t){return x(g(s(t)),"0")}function N(t){return x(g(s(t)),"1")}function A(t){return/[13579]{1}$/.test(t.split(".")[0])}e.r(r),e.d(r,{default:function(){return X}}),function(t){t[t.CEILING=0]="CEILING",t[t.DOWN=1]="DOWN",t[t.FLOOR=2]="FLOOR",t[t.HALF_DOWN=3]="HALF_DOWN",t[t.HALF_EVEN=4]="HALF_EVEN",t[t.HALF_UP=5]="HALF_UP",t[t.UNNECESSARY=6]="UNNECESSARY",t[t.UP=7]="UP"}(t||(t={}));function L(t){return R(t=t.toString()),"0"==t?"0":t.startsWith("-")?`1${new Array(Number(-t)).join("0")}`:`0.${new Array(Number(t)-1).join("0")}1`}function I(t,e=8){return e=Math.max(1,e),!!E(t=s(t.toString()))||!!O(t,L(e),!0)}function j(t,e=8){return e=Math.max(1,e),!!N(t=s(t.toString()))||!!O(s(m("1",t)),L(e),!0)}function V(t){return E(t=t.toString())?0:t.includes("-")?-1:1}function R(t){if(t.includes("."))throw new Error("Non-integers not supported")}function F(t){if(t.includes("-"))throw new Error("Negatives not supported")}function M(t,e,r,i=!1){if(e=e.toString(),t=t.toString(),E(e))return"1";if(!e.includes("-")&&N(e))return t;if(E(t)&&e.includes("-")&&N(e))throw Error("0^(-1) is undefined");const n=t=>(t=l?h(1,t,r+1):t,t=r?c(t,r):t,g(i?v(t):t)),a=t.includes("-"),l=e.includes("-"),u=e.split("."),o=u[1];x(s(t),"10")&&(t=s(t),i=!i);let f,b="1";if(f=x(s(t),"10")?l?`0.${new Array(Number(s(u[0]))-1).join("0")}1`:`1${new Array(u[0]).join("0")}`:function(t,e,r=32){e=s(e);let i="1";for(;y(e,"0");)A(e)&&(i=d(i,t)),t=d(t,t),e=h(e,2).split(".")[0];return i}(s(t),s(u[0])),o){a&&(i=!i),r=Math.max(r,32);let e=H(s(t));for(let t=0;t=0?(i=parseInt(r)+e.indexOf("."),e=e.replace(".","")):i=parseInt(r)+e.length,t=e.length=i&&i>0?n+a(e.substring(0,i))+(e.length>i?"."+e.substring(i):""):n+"0."+new Array(1-i).join("0")+e}return t}constructor(t="0"){this.value=bigDecimal.validate(t)}getValue(){return this.value}setValue(t){this.value=bigDecimal.validate(t)}static getPrettyValue(t,e=3,r=","){let i="-"==(t=bigDecimal.validate(t)).charAt(0);i&&(t=t.substring(1));for(var n=t.indexOf("."),a="",l=n=n>0?n:t.length;l>0;)l=0?r:"")+a;return(i?"-":"")+a+t.substring(n)}getPrettyValue(t=3,e=","){return bigDecimal.getPrettyValue(this.value,t,e)}static round(e,r=0,i=t.HALF_EVEN){if(e=bigDecimal.validate(e),isNaN(r))throw Error("Precision is not a number: "+r);return c(e,r,i)}round(e=0,r=t.HALF_EVEN){if(isNaN(e))throw Error("Precision is not a number: "+e);return new bigDecimal(c(this.value,e,r))}static abs(t){return s(t=bigDecimal.validate(t))}abs(){return new bigDecimal(s(this.value))}static floor(e){return-1===(e=bigDecimal.validate(e)).indexOf(".")?e:bigDecimal.round(e,0,t.FLOOR)}floor(){return-1===this.value.indexOf(".")?new bigDecimal(this.value):new bigDecimal(this.value).round(0,t.FLOOR)}static ceil(e){return-1===(e=bigDecimal.validate(e)).indexOf(".")?e:bigDecimal.round(e,0,t.CEILING)}ceil(){return-1===this.value.indexOf(".")?new bigDecimal(this.value):new bigDecimal(this.value).round(0,t.CEILING)}static add(t,e){return i(t=bigDecimal.validate(t),e=bigDecimal.validate(e))}add(t){return new bigDecimal(i(this.value,t.getValue()))}static subtract(t,e){return m(t=bigDecimal.validate(t),e=bigDecimal.validate(e))}subtract(t){return new bigDecimal(m(this.value,t.getValue()))}static multiply(t,e){return d(t=bigDecimal.validate(t),e=bigDecimal.validate(e))}multiply(t){return new bigDecimal(d(this.value,t.getValue()))}static divide(t,e,r){return h(t=bigDecimal.validate(t),e=bigDecimal.validate(e),r)}divide(t,e){return new bigDecimal(h(this.value,t.getValue(),e))}static modulus(t,e){return D(t=bigDecimal.validate(t),e=bigDecimal.validate(e))}modulus(t){return new bigDecimal(D(this.value,t.getValue()))}static modulusE(t,e){return p(t=bigDecimal.validate(t),e=bigDecimal.validate(e))}modulusE(t){return new bigDecimal(p(this.value,t.getValue()))}static negate(t){return v(t=bigDecimal.validate(t))}negate(){return new bigDecimal(v(this.value))}static pow(t,e){return M(t=bigDecimal.validate(t),e=bigDecimal.validate(e))}pow(t){return new bigDecimal(M(this.value,t.getValue(),32))}static get SQRT1_2(){return _(".5")}static get SQRT2(){return _("2")}static sqRoot(t){return _(t=bigDecimal.validate(t))}sqRoot(){return new bigDecimal(_(this.value))}static cbRoot(t){return C(t=bigDecimal.validate(t))}cbRoot(){return new bigDecimal(C(this.value))}static get E(){return function(t=32){t=Math.max(16,t);let e="1",r="1",n="1";for(;;){n=d(n,r);const a=h("1",n,t+2);if(O(s(a),L(t)))return c(e,t);e=i(e,a),r=i(r,"1")}}(32)}static get LN2(){return W}static get LN10(){return q}static get LOG2E(){return"1.44269504088896340735992468100188"}static get LOG10E(){return"0.43429448190325182766805360691429"}static log2(t){return T(t=bigDecimal.validate(t))}static log10(t){return t=bigDecimal.validate(t),h(Y(t.toString()),q,32)}static log1p(t){return Y(i("1",t=bigDecimal.validate(t)))}static log(t){return Y(t=bigDecimal.validate(t))}static exp(t){return G(t=bigDecimal.validate(t))}static expm1(t){return t=bigDecimal.validate(t),m(G(t.toString()),"1")}static hypot(t,e){return function(t,e){return t=t.toString(),e=e.toString(),_(i(M(t,"2"),i(M(e,"2"))))}(t=bigDecimal.validate(t),e=bigDecimal.validate(e))}static sin(t){return Z(t=bigDecimal.validate(t))}static sinh(t){return z(t=bigDecimal.validate(t))}static asin(t){return k(t=bigDecimal.validate(t))}static cos(t){return B(t=bigDecimal.validate(t))}static cosh(t){return J(t=bigDecimal.validate(t))}static acos(t){return function(t){if(y(s(t=t.toString()),"1"))throw Error("[Arccosine]: argument x is out of range.");return g(m(h(Q,2,32),k(t)))}(t=bigDecimal.validate(t))}static tan(t){return t=bigDecimal.validate(t),g(h(Z(e=(e=t).toString()),B(e),32));var e}static tanh(t){return t=bigDecimal.validate(t),g(h(z(e=(e=t).toString()),J(e),32));var e}static atan(t){return K(t=bigDecimal.validate(t))}static atan2(t,e){return e=bigDecimal.validate(e),function(t,e){e=e.toString(),t=t.toString();let r="0";return E(e)&&E(t)?"0":E(e)&&y(t,"0")?g(c(h(Q,2,33),32)):E(e)&&O(t,"0")?g(c(v(h(Q,2,33)),32)):(O(e,"0")&&(r=y(t,"0",!0)?Q:v(Q)),g(c(i(K(h(t,e,33)),r),32)))}(t=bigDecimal.validate(t),e)}static compareTo(t,e){return S(t=bigDecimal.validate(t),e=bigDecimal.validate(e))}compareTo(t){return S(this.value,t.getValue())}static equals(t,e){return x(t=bigDecimal.validate(t),e=bigDecimal.validate(e))}equals(t){return x(this.value,t.getValue())}static lt(t,e){return O(t=bigDecimal.validate(t),e=bigDecimal.validate(e))}lt(t){return O(this.value,t.getValue())}static leq(t,e){return O(t=bigDecimal.validate(t),e=bigDecimal.validate(e),!0)}leq(t){return O(this.value,t.getValue(),!0)}static gt(t,e){return y(t=bigDecimal.validate(t),e=bigDecimal.validate(e))}gt(t){return y(this.value,t.getValue())}static geq(t,e){return y(t=bigDecimal.validate(t),e=bigDecimal.validate(e),!0)}geq(t){return y(this.value,t.getValue(),!0)}static sign(t){return V(t=bigDecimal.validate(t))}sign(){return V(this.value)}static factorial(t){return(t=>{if(R(t=t.toString()),F(t),E(t)||N(t))return"1";let e=t;for(;;){if(N(t))return e;let r=m(t,"1");e=d(e,r),t=r}})(t=bigDecimal.validate(t))}static stripTrailingZero(t){return g(t=bigDecimal.validate(t))}stripTrailingZero(){return new bigDecimal(g(this.value))}}var X=bigDecimal;return r}()})); \ No newline at end of file diff --git a/dist/web/js-big-decimal.js b/dist/web/js-big-decimal.js index c0d7bab..ba908b2 100644 --- a/dist/web/js-big-decimal.js +++ b/dist/web/js-big-decimal.js @@ -1,37 +1,54 @@ var bigDecimal; /******/ (function() { // webpackBootstrap /******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ 165: -/***/ (function(__unused_webpack_module, exports) { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.abs = void 0; -function abs(n) { - if (typeof n == "number" || typeof n == "bigint") - n = n.toString(); - if (n[0] == "-") - return n.substring(1); - return n; -} -exports.abs = abs; - - -/***/ }), - -/***/ 217: -/***/ (function(__unused_webpack_module, exports) { +/******/ // The require scope +/******/ var __webpack_require__ = {}; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ !function() { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = function(exports, definition) { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ !function() { +/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } +/******/ }(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ !function() { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ }(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it declares 'bigDecimal' on top-level, which conflicts with the current library output. +!function() { +// ESM COMPAT FLAG +__webpack_require__.r(__webpack_exports__); +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + "default": function() { return /* binding */ big_decimal; } +}); -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.pad = exports.trim = exports.add = void 0; +;// CONCATENATED MODULE: ./lib/add.js //function add { -function add(number1, number2) { - var _a; - if (number2 === void 0) { number2 = "0"; } - var neg = 0, ind = -1, neg_len; +function add_add(number1, number2 = "0") { + let neg = 0, ind = -1, neg_len; //check for negatives if (number1[0] == "-") { number1 = number1.substring(1); @@ -51,14 +68,14 @@ function add(number1, number2) { } number1 = trim(number1); number2 = trim(number2); - _a = pad(trim(number1), trim(number2)), number1 = _a[0], number2 = _a[1]; + [number1, number2] = pad(trim(number1), trim(number2)); if (neg == 1) { if (ind === 1) number1 = compliment(number1); else if (ind === 2) number2 = compliment(number2); } - var res = addCore(number1, number2); + let res = addCore(number1, number2); if (!neg) return trim(res); else if (neg == 2) @@ -70,74 +87,53 @@ function add(number1, number2) { return "-" + trim(compliment(res)); } } -exports.add = add; function compliment(number) { if (testZero(number)) { return number; } - var s = "", l = number.length, dec = number.split(".")[1], ld = dec ? dec.length : 0; - for (var i = 0; i < l; i++) { + let s = "", l = number.length, dec = number.split(".")[1], ld = dec ? dec.length : 0; + for (let i = 0; i < l; i++) { if (number[i] >= "0" && number[i] <= "9") s += 9 - parseInt(number[i]); else s += number[i]; } - var one = ld > 0 ? "0." + new Array(ld).join("0") + "1" : "1"; + let one = ld > 0 ? "0." + new Array(ld).join("0") + "1" : "1"; return addCore(s, one); } function trim(number) { - var parts = number.split("."); + let parts = number.split("."); if (!parts[0]) parts[0] = "0"; while (parts[0][0] == "0" && parts[0].length > 1) parts[0] = parts[0].substring(1); return parts[0] + (parts[1] ? "." + parts[1] : ""); } -exports.trim = trim; function pad(number1, number2) { - var parts1 = number1.split("."), parts2 = number2.split("."); + let parts1 = number1.split("."), parts2 = number2.split("."); //pad integral part - var length1 = parts1[0].length, length2 = parts2[0].length; - if (length1 > length2) { - parts2[0] = - new Array(Math.abs(length1 - length2) + 1).join("0") + - (parts2[0] ? parts2[0] : ""); - } - else { - parts1[0] = - new Array(Math.abs(length1 - length2) + 1).join("0") + - (parts1[0] ? parts1[0] : ""); - } + let length = Math.max(parts1[0].length, parts2[0].length); + parts1[0] = parts1[0].padStart(length, "0"); + parts2[0] = parts2[0].padStart(length, "0"); //pad fractional part - (length1 = parts1[1] ? parts1[1].length : 0), - (length2 = parts2[1] ? parts2[1].length : 0); - if (length1 || length2) { - if (length1 > length2) { - parts2[1] = - (parts2[1] ? parts2[1] : "") + - new Array(Math.abs(length1 - length2) + 1).join("0"); - } - else { - parts1[1] = - (parts1[1] ? parts1[1] : "") + - new Array(Math.abs(length1 - length2) + 1).join("0"); - } - } + parts1[1] = parts1[1] || ""; + parts2[1] = parts2[1] || ""; + length = Math.max(parts1[1].length, parts2[1].length); + parts1[1] = parts1[1].padEnd(length, "0"); + parts2[1] = parts2[1].padEnd(length, "0"); number1 = parts1[0] + (parts1[1] ? "." + parts1[1] : ""); number2 = parts2[0] + (parts2[1] ? "." + parts2[1] : ""); return [number1, number2]; } -exports.pad = pad; function addCore(number1, number2) { - var _a; - _a = pad(number1, number2), number1 = _a[0], number2 = _a[1]; - var sum = "", carry = 0; - for (var i = number1.length - 1; i >= 0; i--) { + [number1, number2] = pad(number1, number2); + let sum = "", carry = 0; + for (let i = number1.length - 1; i >= 0; i--) { if (number1[i] === ".") { sum = "." + sum; continue; } - var temp = parseInt(number1[i]) + parseInt(number2[i]) + carry; + let temp = parseInt(number1[i]) + parseInt(number2[i]) + carry; sum = (temp % 10) + sum; carry = Math.floor(temp / 10); } @@ -147,87 +143,315 @@ function testZero(number) { return /^0[0]*[.]{0,1}[0]*$/.test(number); } +;// CONCATENATED MODULE: ./lib/abs.js +function abs_abs(n) { + if (typeof n == "number" || typeof n == "bigint") + n = n.toString(); + if (n[0] == "-") + return n.substring(1); + return n; +} -/***/ }), - -/***/ 664: -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - +;// CONCATENATED MODULE: ./lib/roundingModes.js +var RoundingModes; +(function (RoundingModes) { + /** + * Rounding mode to round towards positive infinity. + */ + RoundingModes[RoundingModes["CEILING"] = 0] = "CEILING"; + /** + * Rounding mode to round towards zero. + */ + RoundingModes[RoundingModes["DOWN"] = 1] = "DOWN"; + /** + * Rounding mode to round towards negative infinity. + */ + RoundingModes[RoundingModes["FLOOR"] = 2] = "FLOOR"; + /** + * Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, + * in which case round down. + */ + RoundingModes[RoundingModes["HALF_DOWN"] = 3] = "HALF_DOWN"; + /** + * Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, + * in which case, round towards the even neighbor. + */ + RoundingModes[RoundingModes["HALF_EVEN"] = 4] = "HALF_EVEN"; + /** + * Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, + * in which case round up. + */ + RoundingModes[RoundingModes["HALF_UP"] = 5] = "HALF_UP"; + /** + * Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary. + * UNIMPLEMENTED + */ + RoundingModes[RoundingModes["UNNECESSARY"] = 6] = "UNNECESSARY"; + /** + * Rounding mode to round away from zero. + */ + RoundingModes[RoundingModes["UP"] = 7] = "UP"; +})(RoundingModes || (RoundingModes = {})); -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.compareTo = void 0; -var add_1 = __webpack_require__(217); -var stripTrailingZero_1 = __webpack_require__(859); -function compareTo(number1, number2) { - var _a, _b; - var negative = false; - _a = [number1, number2].map(function (n) { return (0, stripTrailingZero_1.stripTrailingZero)(n); }), number1 = _a[0], number2 = _a[1]; - if (number1[0] == '-' && number2[0] != "-") { - return -1; +;// CONCATENATED MODULE: ./lib/stripTrailingZero.js +/* +* Removes zero from front and back*/ +function stripTrailingZero_stripTrailingZero(number) { + const isNegative = number[0] === '-'; + if (isNegative) { + number = number.substring(1); } - else if (number1[0] != '-' && number2[0] == '-') { - return 1; + while (number[0] == '0') { + number = number.substring(1); } - else if (number1[0] == '-' && number2[0] == '-') { - number1 = number1.substr(1); - number2 = number2.substr(1); - negative = true; + if (number.indexOf('.') != -1) { + while (number[number.length - 1] == '0') { + number = number.substring(0, number.length - 1); + } } - _b = (0, add_1.pad)(number1, number2), number1 = _b[0], number2 = _b[1]; - if (number1.localeCompare(number2) == 0) { - return 0; + if (number == "" || number == ".") { + number = '0'; } - for (var i = 0; i < number1.length; i++) { - if (number1[i] == number2[i]) { - continue; - } - else if (number1[i] > number2[i]) { - if (negative) { - return -1; + else if (number[number.length - 1] == '.') { + number = number.substring(0, number.length - 1); + } + if (number[0] == '.') { + number = '0' + number; + } + if (isNegative && number != '0') { + number = '-' + number; + } + return number; +} + +;// CONCATENATED MODULE: ./lib/round.js + + +/** + * + * @param input the number to round + * @param n precision + * @param mode Rounding Mode + */ +function round_roundOff(input, n = 0, mode = RoundingModes.HALF_EVEN) { + if (typeof (input) == 'number' || typeof (input) == 'bigint') + input = input.toString(); + if (mode === RoundingModes.UNNECESSARY) { + let [integers, mantissa] = stripTrailingZero_stripTrailingZero(input.replace('-', '')).split('.'); + if (n > 0 && mantissa) { + if (mantissa.length <= n) { + return input; } - else { - return 1; + if (/[^0]/.test(mantissa.slice(n))) { + throw new Error('Number is not an exact value. Rounding necessary.'); } + return input; } - else { - if (negative) { - return 1; - } - else { - return -1; + else if (n < 0 && mantissa) { + throw new Error('Number is not an exact value. Rounding necessary.'); + } + else if (n < 0) { + if (integers.length <= Math.abs(n) || /[^0]/.test(integers.slice(n))) { + throw new Error('Number is not an exact value. Rounding necessary.'); } + return input; + } + else if (n == 0 && mantissa) { + throw new Error('Number is not an exact value. Rounding necessary.'); } + return input; + } + let neg = false; + if (input[0] === '-') { + neg = true; + input = input.substring(1); + } + let parts = input.split('.'), partInt = parts[0], partDec = parts[1]; + //handle case of -ve n: roundOff(12564,-2)=12600 + if (n < 0) { + n = -n; + if (partInt.length <= n) + return '0'; + else { + let prefix = partInt.substring(0, partInt.length - n); + input = prefix + '.' + partInt.substring(partInt.length - n) + partDec; + prefix = round_roundOff(input, 0, mode); + return (neg ? '-' : '') + prefix + (new Array(n + 1).join('0')); + } + } + // handle case when integer output is desired + if (n == 0) { + let l = partInt.length; + if (greaterThanFive(parts[1], partInt, neg, mode)) { + partInt = increment(partInt); + } + return (neg && parseInt(partInt) ? '-' : '') + partInt; + } + // handle case when n>0 + if (!parts[1]) { + return (neg ? '-' : '') + partInt + '.' + (new Array(n + 1).join('0')); + } + else if (parts[1].length < n) { + return (neg ? '-' : '') + partInt + '.' + parts[1] + (new Array(n - parts[1].length + 1).join('0')); + } + partDec = parts[1].substring(0, n); + let rem = parts[1].substring(n); + if (rem && greaterThanFive(rem, partDec, neg, mode)) { + partDec = increment(partDec); + if (partDec.length > n) { + return (neg ? '-' : '') + increment(partInt, parseInt(partDec[0])) + '.' + partDec.substring(1); + } + } + return (neg && (parseInt(partInt) || parseInt(partDec)) ? '-' : '') + partInt + '.' + partDec; +} +function greaterThanFive(part, pre, neg, mode) { + if (!part || part === new Array(part.length + 1).join('0')) + return false; + // #region UP, DOWN, CEILING, FLOOR + if (mode === RoundingModes.DOWN || (!neg && mode === RoundingModes.FLOOR) || + (neg && mode === RoundingModes.CEILING)) + return false; + if (mode === RoundingModes.UP || (neg && mode === RoundingModes.FLOOR) || + (!neg && mode === RoundingModes.CEILING)) + return true; + // #endregion + // case when part !== five + let five = '5' + (new Array(part.length).join('0')); + if (part > five) + return true; + else if (part < five) + return false; + // case when part === five + switch (mode) { + case RoundingModes.HALF_DOWN: return false; + case RoundingModes.HALF_UP: return true; + case RoundingModes.HALF_EVEN: + default: return (parseInt(pre[pre.length - 1]) % 2 == 1); } - return 0; } -exports.compareTo = compareTo; -function checkZero(number) { +function increment(part, c = 0) { + if (!c) + c = 1; + if (typeof (part) == 'number') + part.toString(); + let l = part.length - 1, s = ''; + for (let i = l; i >= 0; i--) { + let x = parseInt(part[i]) + c; + if (x == 10) { + c = 1; + x = 0; + } + else { + c = 0; + } + s += x; + } + if (c) + s += c; + return s.split('').reverse().join(''); } +;// CONCATENATED MODULE: ./lib/multiply.js -/***/ }), +function multiply_multiply(number1, number2) { + number1 = number1.toString(); + number2 = number2.toString(); + /*Filter numbers*/ + let negative = 0; + if (number1[0] == '-') { + negative++; + number1 = number1.substr(1); + } + if (number2[0] == '-') { + negative++; + number2 = number2.substr(1); + } + number1 = stripTrailingZero_stripTrailingZero(number1); + number2 = stripTrailingZero_stripTrailingZero(number2); + let decimalLength1 = 0; + let decimalLength2 = 0; + if (number1.indexOf('.') != -1) { + decimalLength1 = number1.length - number1.indexOf('.') - 1; + } + if (number2.indexOf('.') != -1) { + decimalLength2 = number2.length - number2.indexOf('.') - 1; + } + let decimalLength = decimalLength1 + decimalLength2; + number1 = stripTrailingZero_stripTrailingZero(number1.replace('.', '')); + number2 = stripTrailingZero_stripTrailingZero(number2.replace('.', '')); + if (number1.length < number2.length) { + let temp = number1; + number1 = number2; + number2 = temp; + } + if (number2 == '0') { + return '0'; + } + /* + * Core multiplication + */ + let length = number2.length; + let carry = 0; + let positionVector = []; + let currentPosition = length - 1; + let result = ""; + for (let i = 0; i < length; i++) { + positionVector[i] = number1.length - 1; + } + for (let i = 0; i < 2 * number1.length; i++) { + let sum = 0; + for (let j = number2.length - 1; j >= currentPosition && j >= 0; j--) { + if (positionVector[j] > -1 && positionVector[j] < number1.length) { + sum += parseInt(number1[positionVector[j]--]) * parseInt(number2[j]); + } + } + sum += carry; + carry = Math.floor(sum / 10); + result = sum % 10 + result; + currentPosition--; + } + /* + * Formatting result + */ + result = stripTrailingZero_stripTrailingZero(adjustDecimal(result, decimalLength)); + if (negative == 1) { + result = '-' + result; + } + return result; +} +/* +* Add decimal point +*/ +function adjustDecimal(number, decimal) { + if (decimal == 0) + return number; + else { + number = (decimal >= number.length) ? ((new Array(decimal - number.length + 1)).join('0') + number) : number; + return number.substr(0, number.length - decimal) + '.' + number.substr(number.length - decimal, decimal); + } +} -/***/ 415: -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +;// CONCATENATED MODULE: ./lib/divide.js -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.divide = void 0; -var add_1 = __webpack_require__(217); -var round_1 = __webpack_require__(350); -function divide(dividend, divisor, precission) { - if (precission === void 0) { precission = 8; } - if (divisor == 0) { - throw new Error('Cannot divide by 0'); +function divide_divide(dividend, divisor, precission) { + // Convert to string + if (typeof dividend == 'number' || typeof divisor == 'number') { + dividend = dividend.toString(); + divisor = divisor.toString(); + } + // Return 0 + if (divisor == '0') { + return '0' + (!precission) ? '' : 0; + } + // Set default precission + if (typeof precission == 'undefined') { + precission = 8; } - dividend = dividend.toString(); - divisor = divisor.toString(); // remove trailing zeros in decimal ISSUE#18 dividend = dividend.replace(/(\.\d*?[1-9])0+$/g, "$1").replace(/\.0+$/, ""); divisor = divisor.replace(/(\.\d*?[1-9])0+$/g, "$1").replace(/\.0+$/, ""); - if (dividend == 0) - return '0'; - var neg = 0; + let neg = 0; if (divisor[0] == '-') { divisor = divisor.substring(1); neg++; @@ -237,32 +461,32 @@ function divide(dividend, divisor, precission) { neg++; } var pt_dvsr = divisor.indexOf('.') > 0 ? divisor.length - divisor.indexOf('.') - 1 : -1; - divisor = (0, add_1.trim)(divisor.replace('.', '')); + divisor = trim(divisor.replace('.', '')); if (pt_dvsr >= 0) { - var pt_dvnd = dividend.indexOf('.') > 0 ? dividend.length - dividend.indexOf('.') - 1 : -1; + let pt_dvnd = dividend.indexOf('.') > 0 ? dividend.length - dividend.indexOf('.') - 1 : -1; if (pt_dvnd == -1) { - dividend = (0, add_1.trim)(dividend + (new Array(pt_dvsr + 1)).join('0')); + dividend = trim(dividend + (new Array(pt_dvsr + 1)).join('0')); } else { if (pt_dvsr > pt_dvnd) { dividend = dividend.replace('.', ''); - dividend = (0, add_1.trim)(dividend + (new Array(pt_dvsr - pt_dvnd + 1)).join('0')); + dividend = trim(dividend + (new Array(pt_dvsr - pt_dvnd + 1)).join('0')); } else if (pt_dvsr < pt_dvnd) { dividend = dividend.replace('.', ''); - var loc = dividend.length - pt_dvnd + pt_dvsr; - dividend = (0, add_1.trim)(dividend.substring(0, loc) + '.' + dividend.substring(loc)); + let loc = dividend.length - pt_dvnd + pt_dvsr; + dividend = trim(dividend.substring(0, loc) + '.' + dividend.substring(loc)); } else if (pt_dvsr == pt_dvnd) { - dividend = (0, add_1.trim)(dividend.replace('.', '')); + dividend = trim(dividend.replace('.', '')); } } } - var prec = 0, dl = divisor.length, rem = '0', quotent = ''; - var dvnd = (dividend.indexOf('.') > -1 && dividend.indexOf('.') < dl) ? dividend.substring(0, dl + 1) : dividend.substring(0, dl); + let prec = 0, dl = divisor.length, rem = '0', quotent = ''; + let dvnd = (dividend.indexOf('.') > -1 && dividend.indexOf('.') < dl) ? dividend.substring(0, dl + 1) : dividend.substring(0, dl); dividend = (dividend.indexOf('.') > -1 && dividend.indexOf('.') < dl) ? dividend.substring(dl + 1) : dividend.substring(dl); if (dvnd.indexOf('.') > -1) { - var shift = dvnd.length - dvnd.indexOf('.') - 1; + let shift = dvnd.length - dvnd.indexOf('.') - 1; dvnd = dvnd.replace('.', ''); if (dl > dvnd.length) { shift += dl - dvnd.length; @@ -273,9 +497,9 @@ function divide(dividend, divisor, precission) { } precission = precission + 2; while (prec <= precission) { - var qt = 0; + let qt = 0; while (parseInt(dvnd) >= parseInt(divisor)) { - dvnd = (0, add_1.add)(dvnd, '-' + divisor); + dvnd = add_add(dvnd, '-' + divisor); qt++; } quotent += qt; @@ -295,427 +519,1266 @@ function divide(dividend, divisor, precission) { dividend = dividend.substring(1); } } - return ((neg == 1) ? '-' : '') + (0, add_1.trim)((0, round_1.roundOff)(quotent, precission - 2)); + return ((neg == 1) ? '-' : '') + trim(round_roundOff(quotent, precission - 2)); } -exports.divide = divide; - -/***/ }), +;// CONCATENATED MODULE: ./lib/subtract.js + +function subtract_subtract(number1, number2) { + number1 = number1.toString(); + number2 = number2.toString(); + number2 = subtract_negate(number2); + return add_add(number1, number2); +} +function subtract_negate(number) { + if (number[0] == '-') { + number = number.substr(1); + } + else { + number = '-' + number; + } + return number; +} + +;// CONCATENATED MODULE: ./lib/modulus.js + + -/***/ 213: -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.modulus = void 0; -var divide_1 = __webpack_require__(415); -var round_1 = __webpack_require__(350); -var multiply_1 = __webpack_require__(182); -var subtract_1 = __webpack_require__(26); -var roundingModes_1 = __webpack_require__(916); -function modulus(dividend, divisor) { + +function modulusE(n, base = 1, precision = undefined) { + if (base == 0) { + throw new Error('Cannot divide by 0'); + } + n = n.toString(); + base = base.toString(); + validate(base); + return subtract_subtract(n, multiply_multiply(base, round_roundOff(divide_divide(n, base, precision), 0, RoundingModes.FLOOR))); +} +function modulus(dividend, divisor = 1, precision = undefined) { if (divisor == 0) { throw new Error('Cannot divide by 0'); } dividend = dividend.toString(); divisor = divisor.toString(); - validate(dividend); validate(divisor); - var sign = ''; - if (dividend[0] == '-') { - sign = '-'; - dividend = dividend.substr(1); - } - if (divisor[0] == '-') { - divisor = divisor.substr(1); - } - var result = (0, subtract_1.subtract)(dividend, (0, multiply_1.multiply)(divisor, (0, round_1.roundOff)((0, divide_1.divide)(dividend, divisor), 0, roundingModes_1.RoundingModes.FLOOR))); - return sign + result; + const result = modulusE(abs_abs(dividend), abs_abs(divisor), precision); + return (dividend.includes('-')) ? subtract_negate(result) : result; } -exports.modulus = modulus; function validate(oparand) { - if (oparand.indexOf('.') != -1) { + if (oparand.includes('.')) { throw new Error('Modulus of non-integers not supported'); } } +;// CONCATENATED MODULE: ./lib/compareTo.js -/***/ }), -/***/ 182: -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.multiply = void 0; -var stripTrailingZero_1 = __webpack_require__(859); -function multiply(number1, number2) { - number1 = number1.toString(); - number2 = number2.toString(); - /*Filter numbers*/ - var negative = 0; - if (number1[0] == '-') { - negative++; - number1 = number1.substr(1); - } - if (number2[0] == '-') { - negative++; - number2 = number2.substr(1); +function compareTo(number1, number2) { + let negative = false; + [number1, number2] = [number1, number2].map(n => stripTrailingZero_stripTrailingZero(n)); + // Early escapes + // If num 1 is negative and num 2 is positive + if (number1[0] == '-' && number2[0] != "-") + return -1; + // If num 2 is negative and num 1 is positive + if (number1[0] != '-' && number2[0] == '-') + return 1; + if (number1[0] == '-' && number2[0] == '-') { + number1 = number1.substring(1); + number2 = number2.substring(1); + negative = true; } - number1 = (0, stripTrailingZero_1.stripTrailingZero)(number1); - number2 = (0, stripTrailingZero_1.stripTrailingZero)(number2); - var decimalLength1 = 0; - var decimalLength2 = 0; - if (number1.indexOf('.') != -1) { - decimalLength1 = number1.length - number1.indexOf('.') - 1; + let decimal1 = number1.indexOf('.'); + let decimal2 = number2.indexOf('.'); + // If both numbers dont have decimals, compare lengths + if (decimal1 == -1 && decimal1 == decimal2) { + if (number1.length > number2.length) + return (negative) ? -1 : 1; + if (number1.length < number2.length) + return (negative) ? 1 : -1; } - if (number2.indexOf('.') != -1) { - decimalLength2 = number2.length - number2.indexOf('.') - 1; + // If num 1 has no decimal, and num 2 has, then compare integer length to the decimal index of num 2 + if (decimal1 == -1 && decimal2 !== -1) { + if (number1.length < decimal2) + return (negative) ? 1 : -1; + if (number1.length > decimal2) + return (negative) ? -1 : 1; } - var decimalLength = decimalLength1 + decimalLength2; - number1 = (0, stripTrailingZero_1.stripTrailingZero)(number1.replace('.', '')); - number2 = (0, stripTrailingZero_1.stripTrailingZero)(number2.replace('.', '')); - if (number1.length < number2.length) { - var temp = number1; - number1 = number2; - number2 = temp; + // If num 1 has a decimal, and num 2 has none, then compare integer length to the decimal index of num 1 + if (decimal1 !== -1 && decimal2 == -1) { + if (number2.length < decimal1) + return (negative) ? 1 : -1; + if (number2.length > decimal1) + return (negative) ? -1 : 1; } - if (number2 == '0') { - return '0'; + [number1, number2] = pad(number1, number2); + // If equal + if (number1.localeCompare(number2) == 0) + return 0; + for (let i = 0; i < number1.length; i++) { + if (number1[i] == number2[i]) { + continue; + } + else if (number1[i] > number2[i]) { + return (negative) ? -1 : 1; + } + else { + return (negative) ? 1 : -1; + } } - /* - * Core multiplication - */ - var length = number2.length; - var carry = 0; - var positionVector = []; - var currentPosition = length - 1; - var result = ""; - for (var i = 0; i < length; i++) { - positionVector[i] = number1.length - 1; + return 0; +} +// Wrapper functions +function compareTo_lessThan(left, right, orEquals = false) { + return (orEquals) ? (compareTo(left, right) === 0 || compareTo(left, right) === -1) : (compareTo(left, right) === -1); +} +function compareTo_greaterThan(left, right, orEquals = false) { + return (orEquals) ? (compareTo(left, right) === 0 || compareTo(left, right) === 1) : (compareTo(left, right) === 1); +} +function equals(left, right) { + return (compareTo(stripTrailingZero_stripTrailingZero(left), stripTrailingZero_stripTrailingZero(right)) === 0); +} +function isExatclyZero(number) { + return equals(stripTrailingZero_stripTrailingZero(abs_abs(number)), '0'); +} +function isExatclyOne(number) { + return equals(stripTrailingZero_stripTrailingZero(abs_abs(number)), '1'); +} +function isEven(number) { + return /[02468]{1}$/.test(number.split('.')[0]); +} +function isOdd(number) { + return /[13579]{1}$/.test(number.split('.')[0]); +} + +;// CONCATENATED MODULE: ./lib/utils.js + + + + + +const factorial = (n) => { + n = n.toString(); + validateInteger(n); + validatePositive(n); + if (isExatclyZero(n) || isExatclyOne(n)) { + return '1'; } - for (var i = 0; i < 2 * number1.length; i++) { - var sum = 0; - for (var j = number2.length - 1; j >= currentPosition && j >= 0; j--) { - if (positionVector[j] > -1 && positionVector[j] < number1.length) { - sum += parseInt(number1[positionVector[j]--]) * parseInt(number2[j]); - } + let result = n; + while (true) { + if (isExatclyOne(n)) { + return result; } - sum += carry; - carry = Math.floor(sum / 10); - result = sum % 10 + result; - currentPosition--; + let next = subtract_subtract(n, '1'); + result = multiply_multiply(result, next); + n = next; } - /* - * Formatting result - */ - result = (0, stripTrailingZero_1.stripTrailingZero)(adjustDecimal(result, decimalLength)); - if (negative == 1) { - result = '-' + result; +}; +function sigma(n, limit, fn, ...args) { + n = n.toString(); + limit = limit.toString(); + validateInteger(n); + validateInteger(limit); + validatePositive(n); + validatePositive(limit); + let result = '0'; + while (greaterThan(limit, subtract(n, '1'))) { + result = add(result, fn(limit, ...args)); + limit = subtract(limit, '1'); } return result; } -exports.multiply = multiply; -/* -* Add decimal point -*/ -function adjustDecimal(number, decimal) { - if (decimal == 0) - return number; - else { - number = (decimal >= number.length) ? ((new Array(decimal - number.length + 1)).join('0') + number) : number; - return number.substr(0, number.length - decimal) + '.' + number.substr(number.length - decimal, decimal); +function alternatingSeries(n, limit, fn, _sign = '1') { + n = n.toString(); + limit = limit.toString(); + _sign = sign(_sign).toString(); + if (lessThan(n, '1')) { + throw new Error('[alternatingSeries]: Argument n is less than 1'); } + validateInteger(n); + validateInteger(limit); + validatePositive(limit); + let result = '0'; + while (true) { + const next = multiply(_sign, fn(n)); + if (lessThan(abs(next), utils_tolerance(limit))) { + return result; + } + result = add(result, next); + _sign = negate(_sign); + n = add(n, '1'); + } +} +function utils_tolerance(precision) { + precision = precision.toString(); + validateInteger(precision); + if (precision == '0') + return '0'; + if (precision.startsWith('-')) + return `1${new Array(Number(-precision)).join('0')}`; + return `0.${new Array(Number(precision) - 1).join('0')}1`; } +function isAproxZero(number, precision = 8) { + precision = Math.max(1, precision); + number = abs_abs(number.toString()); + if (isExatclyZero(number)) + return true; + if (compareTo_lessThan(number, utils_tolerance(precision), true)) + return true; + return false; +} +function isAproxOne(number, precision = 8) { + precision = Math.max(1, precision); + number = abs_abs(number.toString()); + if (isExatclyOne(number)) + return true; + if (compareTo_lessThan(abs_abs(subtract_subtract('1', number)), utils_tolerance(precision), true)) + return true; + return false; +} +function sign(number) { + number = number.toString(); + if (isExatclyZero(number)) + return 0; + if (number.includes('-')) + return -1; + return 1; +} +function validateInteger(number) { + if (number.includes('.')) { + throw new Error('Non-integers not supported'); + } +} +function validatePositive(number) { + if (number.includes('-')) { + throw new Error('Negatives not supported'); + } +} + +;// CONCATENATED MODULE: ./lib/pow.js + + + + -/***/ }), -/***/ 350: -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.roundOff = void 0; -var roundingModes_1 = __webpack_require__(916); +// import { AddInstantiate } from "./assembly/math"; /** + * Calculates the power of a given base raised to an integer exponent * - * @param input the number to round - * @param n precision - * @param mode Rounding Mode + * @param base - Base number + * @param exponent - Exponent integer + * @param negate - If set to true, parameters will be evaluated as `-(x ^ n)` + * + * @returns The resulting power as a string + * + * + * @example Basic usage: + * ``` + * // Positive Base + * console.log(pow(2,2)) // Prints '4' + * // Negative Base + * console.log(pow(-2,2)) // Prints '4' + * // Negative Base where the result will be a negative number + * console.log(pow(-2,3)) // Prints '-8' + * ``` + * + * @example Negation usage: + * ``` + * // Positive Base + * console.log(pow(2, 2, true)) // Prints '-4' + * // Negative Base + * console.log(pow(-2, 2, true)) // Prints '-4' + * // Negative Base where the result will be a negative number + * console.log(pow(-2, 3, true)) // Prints '8' + * ``` + * + * @example Special cases: + * ``` + * // Exponent of 0 + * console.log(pow(2, 0)) // Prints '1' + * // Exponent of 1 + * console.log(pow(2, 1)) // Prints '2' + * ``` */ -function roundOff(input, n, mode) { - if (n === void 0) { n = 0; } - if (mode === void 0) { mode = roundingModes_1.RoundingModes.HALF_EVEN; } - if (mode === roundingModes_1.RoundingModes.UNNECESSARY) { - throw new Error("UNNECESSARY Rounding Mode has not yet been implemented"); +function pow(base, exponent, precision = undefined, negate = false) { + // AddInstantiate.then((res)=>{ + // console.log('custom wasm loader',res.__add('00001', '1')) + // }) + // const v = await (async url => await AddInstantiate)(); + // console.log('custom wasm loader', AddWebAssembly('1', '1')) + exponent = exponent.toString(); + base = base.toString(); + if (isExatclyZero(exponent)) { + return '1'; } - if (typeof (input) == 'number' || typeof (input) == 'bigint') - input = input.toString(); - var neg = false; - if (input[0] === '-') { - neg = true; - input = input.substring(1); + if (!exponent.includes('-') && isExatclyOne(exponent)) { + return base; } - var parts = input.split('.'), partInt = parts[0], partDec = parts[1]; - //handle case of -ve n: roundOff(12564,-2)=12600 - if (n < 0) { - n = -n; - if (partInt.length <= n) - return '0'; - else { - var prefix = partInt.substr(0, partInt.length - n); - input = prefix + '.' + partInt.substr(partInt.length - n) + partDec; - prefix = roundOff(input, 0, mode); - return (neg ? '-' : '') + prefix + (new Array(n + 1).join('0')); - } + if (isExatclyZero(base) && exponent.includes('-') && isExatclyOne(exponent)) { + throw Error('0^(-1) is undefined'); } - // handle case when integer output is desired - if (n == 0) { - var l = partInt.length; - if (greaterThanFive(parts[1], partInt, neg, mode)) { - partInt = increment(partInt); - } - return (neg && parseInt(partInt) ? '-' : '') + partInt; + const finalize = (result) => { + result = (negativeExponent) ? divide_divide(1, result, precision + 1) : result; + result = (precision) ? round_roundOff(result, precision) : result; + return (negate) ? stripTrailingZero_stripTrailingZero(subtract_negate(result)) : stripTrailingZero_stripTrailingZero(result); + }; + const negativeBase = base.includes('-'); + const negativeExponent = exponent.includes('-'); + const exponentParts = exponent.split('.'); + const exponentSignificand = exponentParts[1]; + const isBase10 = equals(abs_abs(base), '10'); + if (isBase10) { + base = abs_abs(base); + negate = !negate; } - // handle case when n>0 - if (!parts[1]) { - return (neg ? '-' : '') + partInt + '.' + (new Array(n + 1).join('0')); + let fractionalExponent = '1'; + let result; + if (equals(abs_abs(base), '10')) { + result = (negativeExponent) ? `0.${new Array(Number(abs_abs(exponentParts[0])) - 1).join('0')}1` : `1${new Array(exponentParts[0]).join('0')}`; } - else if (parts[1].length < n) { - return (neg ? '-' : '') + partInt + '.' + parts[1] + (new Array(n - parts[1].length + 1).join('0')); + else { + result = intPow(abs_abs(base), abs_abs(exponentParts[0])); } - partDec = parts[1].substring(0, n); - var rem = parts[1].substring(n); - if (rem && greaterThanFive(rem, partDec, neg, mode)) { - partDec = increment(partDec); - if (partDec.length > n) { - return (neg ? '-' : '') + increment(partInt, parseInt(partDec[0])) + '.' + partDec.substring(1); + if (exponentSignificand) { + if (negativeBase) { + negate = !negate; + } + precision = Math.max(precision, 32); + // const testworker = new Worker(new URL("./workers/pow.worker.js", import.meta.url)); + // testworker.postMessage({ base: abs(base), significand: exponentSignificand }); + // testworker.onmessage = (event) => { + // console.log('webresult', result) + // // console.log('web', multiply(result, event.data)) + // // testworker.terminate(); + // // fractionalExponent = event.data + // return finalize(multiply(result, event.data)) + // // testworker.terminate(); + // } + let tempBase = root10(abs_abs(base)); + for (let i = 0; i < exponentSignificand.length; i++) { + fractionalExponent = multiply_multiply(fractionalExponent, pow(tempBase, exponentSignificand[i])); + tempBase = root10(tempBase); } + return finalize(multiply_multiply(result, fractionalExponent)); } - return (neg && (parseInt(partInt) || parseInt(partDec)) ? '-' : '') + partInt + '.' + partDec; + else { + return finalize(result); + } + // let exponentIntegers = abs(exponentParts[0]); + // if (equals(abs(base), '10')) { + // result = (negativeExponent) ? `0.${new Array(Number(exponentIntegers) - 1).join('0')}1` : `1${new Array(exponentIntegers).join('0')}` + // return multiply(multiply(result, fractionalExponent), pow(sign(base), exponentIntegers)) + // } + // while (greaterThan(exponentIntegers, '0')) { + // if (isOdd(exponentIntegers)) { result = multiply(result, base) } + // base = multiply(base, base); + // exponentIntegers = divide(exponentIntegers, 2).split('.')[0]; + // } + // result = multiply(result, fractionalExponent); + // result = (negativeExponent) ? divide(1, result, precision + 1) : result; + // result = (precision) ? roundOff(result, precision) : result; + // return (negate) ? stripTrailingZero(negateFn(result)) : stripTrailingZero(result); } -exports.roundOff = roundOff; -function greaterThanFive(part, pre, neg, mode) { - if (!part || part === new Array(part.length + 1).join('0')) - return false; - // #region UP, DOWN, CEILING, FLOOR - if (mode === roundingModes_1.RoundingModes.DOWN || (!neg && mode === roundingModes_1.RoundingModes.FLOOR) || - (neg && mode === roundingModes_1.RoundingModes.CEILING)) - return false; - if (mode === roundingModes_1.RoundingModes.UP || (neg && mode === roundingModes_1.RoundingModes.FLOOR) || - (!neg && mode === roundingModes_1.RoundingModes.CEILING)) - return true; - // #endregion - // case when part !== five - var five = '5' + (new Array(part.length).join('0')); - if (part > five) - return true; - else if (part < five) - return false; - // case when part === five - switch (mode) { - case roundingModes_1.RoundingModes.HALF_DOWN: return false; - case roundingModes_1.RoundingModes.HALF_UP: return true; - case roundingModes_1.RoundingModes.HALF_EVEN: - default: return (parseInt(pre[pre.length - 1]) % 2 == 1); +; +function intPow(base, exponent, precision = 32) { + exponent = abs_abs(exponent); + let result = '1'; + while (compareTo_greaterThan(exponent, '0')) { + if (isOdd(exponent)) { + result = multiply_multiply(result, base); + } + base = multiply_multiply(base, base); + exponent = divide_divide(exponent, 2).split('.')[0]; } + return result; } -function increment(part, c) { - if (c === void 0) { c = 0; } - if (!c) - c = 1; - if (typeof (part) == 'number') - part.toString(); - var l = part.length - 1, s = ''; - for (var i = l; i >= 0; i--) { - var x = parseInt(part[i]) + c; - if (x == 10) { - c = 1; - x = 0; +function nthRoot(x, n, precision = 8) { + x = x.toString(); + n = n.toString(); + pow_validate(n); + if (compareTo_lessThan(n, '4', true)) { + let guess = '1'; + let nMinusOne = subtract_subtract(n, 1); + let difference = '0'; + let lastDifference = x; + let i = 0; + while (true) { + let newGuess = divide_divide(add_add(stripTrailingZero_stripTrailingZero(divide_divide(x, pow(guess, nMinusOne, precision + 2), precision + 2)), multiply_multiply(guess, nMinusOne)), n, precision + 2); + difference = abs_abs(subtract_subtract(guess, newGuess)); + if (compareTo_greaterThan(difference, lastDifference)) { + // console.log('root exit under p') + return stripTrailingZero_stripTrailingZero(round_roundOff(guess, precision + 1)); + } + if (compareTo_lessThan(difference, utils_tolerance(precision - 1))) { + // console.log('newGuess exit under p') + return stripTrailingZero_stripTrailingZero(round_roundOff(newGuess, precision + 1)); + } + lastDifference = difference; + guess = stripTrailingZero_stripTrailingZero(newGuess); + i++; } - else { - c = 0; + // console.log('guess exit over itt') + // return stripTrailingZero(roundOff(guess, precision + 1)) + } + else { + let x0 = '1'; + let x1 = '2'; + let x2 = '1.5'; + let i = 0; + while (true) { + let f0 = subtract_subtract(pow(x0, n, precision + 2), x); + let f1 = subtract_subtract(pow(x1, n, precision + 2), x); + let next = multiply_multiply(f1, divide_divide(subtract_subtract(x1, x0), subtract_subtract(f1, f0), precision + 2)); + x2 = subtract_subtract(round_roundOff(x1, precision + 2), round_roundOff(next, precision + 2)); + if (compareTo_lessThan(abs_abs(subtract_subtract(x2, x1)), utils_tolerance(precision + 1))) { + return stripTrailingZero_stripTrailingZero(round_roundOff(x2, precision + 1)); + } + if (sign(f0) !== sign(f1)) { + x1 = divide_divide(add_add(x0 + x1), 2, precision + 2); // Switch to bisection method + } + x0 = x1; + x1 = stripTrailingZero_stripTrailingZero(round_roundOff(x2, precision + 2)); + i++; } - s += x; + // return stripTrailingZero(roundOff(x2, precision + 1)) + } +} +function inverseSqRoot(number) { + number = number.toString(); + let n = abs(number); + let guess = '1'; + let difference = '0'; + let previousDifference = n; + let i = 0; + while (i < 10) { + // console.log('guess', guess) + let newGuess = roundOff(multiply(guess, subtract('1.5', roundOff(multiply(divide(number, 2, 33), pow(guess, 2, 33)), 33))), 33); + // console.log('newGuess', guess) + difference = abs(subtract(guess, newGuess)); + if (greaterThan(difference, previousDifference)) { + // console.log('root exit under p') + return stripTrailingZero(roundOff(guess, 32 + 1)); + } + if (lessThan(difference, tolerance(32 - 1))) { + // console.log('newGuess exit under p') + return stripTrailingZero(roundOff(guess, 32 + 1)); + } + previousDifference = difference; + guess = newGuess; + i++; + } + // let [integer, fraction] = n.split('.'); + // let exponent = '0'; + // let integerBits = ''; + // let fractionBits = ''; + // let exponentBits = ''; + // let mantissaBits = ''; + // let mantissa = divide(integer + fraction, '1'); + // while (greaterThan(integer, '1', true)) { + // integerBits = isOdd(integer) ? '1' + integerBits : '0' + integerBits; + // integer = divide(integer, 2, 0); + // } + // if (fraction) { + // let precision = '32'; + // fraction = '0.' + fraction; + // while (greaterThan(precision, '0')) { + // fraction = multiply(fraction, 2); + // fractionBits += fraction.split('.')[0]; + // fraction = '0.' + fraction.split('.')[1]; + // if (isAproxZero(fraction, 2)) break + // precision = subtract(precision, 1); + // } + // } + // if (integer == '0') { + // let lastDigit = '0'; + // let i = 1; + // while (true) { + // if (lastDigit !== fractionBits[i - 1]) { + // i++ + // break + // } + // i++ + // } + // exponent = negateFn(i.toString()) + // } else { + // exponent = (integerBits.length - 1).toString() + // } + // mantissaBits = integerBits + fractionBits; + // mantissa = add('1', divide(divide(mantissa, pow('2', mantissaBits.length), mantissaBits.length), '2', mantissaBits.length)); + // console.log('log a', subtract(multiply(divide('1', pow('2', mantissaBits.length), mantissaBits.length), add(mantissa, multiply(pow('2', mantissaBits.length), add(exponent, (mantissaBits.length - 1).toString())))), (mantissaBits.length - 1).toString())) + // let E = roundOff(multiply(add(exponent, (mantissaBits.length - 1).toString()), '0.5'), 0, RoundingModes.FLOOR); + // exponent = add(exponent, (mantissaBits.length - 1).toString()) + // while (greaterThan(exponent, '1', true)) { + // exponentBits += isOdd(exponent) ? '1' : '0'; + // exponent = roundOff(divide(exponent, 2), 0, RoundingModes.FLOOR); + // } + // exponent = roundOff(multiply(add(exponent, (mantissaBits.length - 1).toString()), '0.5'), 0, RoundingModes.FLOOR) + // console.log('integer', integer) + // console.log('integerBits', integerBits) + // console.log('fractionBits', fractionBits) + // console.log('exponent', exponent) + // console.log('exponentBits', exponentBits) + // // const mantissaBits = integerBits + fractionBits; + // const logBits = exponentBits + mantissaBits; + // const binaryBits = '0' + logBits.substring(0, logBits.length - 1); //right bitshift + // exponentBits = binaryBits.substring(0, exponentBits.length) + // mantissaBits = binaryBits.substring(exponentBits.length) + // const exponentRange = pow('2', exponentBits.length); + // const mantissaRange = multiply('1.5', pow('2', mantissaBits.length - 1)); + // const correction = multiply(exponentRange, mantissaRange); + // const log = '1.' + binaryBits.split('').reduce((p, c, i) => { + // return add(p, (c == '0') ? '0' : pow('2', binaryBits.length - i)) + // }, '0'); + // // console.log('mantissa', mantissa) + // // console.log('mantissaBits', mantissaBits) + // // console.log('logBits', logBits) + // // console.log('binaryBits', binaryBits) + // // console.log('mantissaRange', mantissaRange) + // // console.log('exponentRange', exponentRange) + // // console.log('correction', correction) + // // console.log('log', log) + // const initial = multiply(log, '.5'); + // const initialSq = multiply(initial, initial); + // // let x = multiply(multiply(multiply(number, '0.5'), multiply(initial, initial)), '.5'); + // // x = multiply(multiply(multiply(number, '0.5'), multiply(x, x)), '.5'); + // // const y = multiply(initial, subtract('1.5', x)); + // let guess = initial; + // let difference = '0' + // let lastDifference = number + // let i = 0; + // while (i < 10) { + // console.log('guess', guess) + // guess = roundOff(multiply(guess, subtract('1.5', roundOff(multiply(divide(number, 2, 33), pow(guess, 2, 33)), 33))), 33) + // console.log('newGuess', guess) + // // difference = abs(subtract(guess, newGuess)) + // // if (greaterThan(difference, lastDifference)) { + // // // console.log('root exit under p') + // // return stripTrailingZero(roundOff(guess, 32 + 1)) + // // } + // // if (lessThan(difference, tolerance(32 - 1))) { + // // // console.log('newGuess exit under p') + // // return stripTrailingZero(roundOff(guess, 32 + 1)) + // // } + // // lastDifference = difference; + // // guess = newGuess; + // i++; + // } + // console.log('initial', initial) + // console.log('initialSq', initialSq) + // // console.log('x', x) + // // console.log('y', y) + // return guess +} +function sqRoot(base, precision = 32) { + precision = Math.max(precision, 32); + return nthRoot(base, 2, precision); +} +function cbRoot(base, precision = 32) { + precision = Math.max(precision, 32); + return nthRoot(base, 3, precision); +} +function root4(base, precision = 32) { + precision = Math.max(precision, 32); + return sqRoot(sqRoot(base, precision), precision); +} +function root5(base, precision = 32) { + precision = Math.max(precision, 32); + return nthRoot(base, 5, precision); +} +function root10(base, precision = 32) { + precision = Math.max(precision, 32); + return sqRoot(root5(base, precision), precision + 1); +} +function pow_validate(oparand) { + if (oparand.includes('.')) { + throw Error('Root base of non-integers not supported'); } - if (c) - s += c; - return s.split('').reverse().join(''); } +;// CONCATENATED MODULE: ./lib/tables/e.js +const E_ROOTS_FOR_POW = [ + [ + "1", + "1.1051709180756476248117078264902466682245471947375187187928632894409679667476543029891433189707486536329171204854012445361537347145315787020068902997574505197515004866018321613310249357028047934586850494525645057122112661163770326284627042965573236001851139", + "1.22140275816016983392107199463967417030758094152050364127342509859920623308363781624228874401337247396902783756582071222657872335735698322420203091783847852468196963515090275879656423105784038067892980765878816657563573480602908117582872101992234299467757368987418370836563153389462747746988296269108061275281392456208243249268026539778924251026176313926132967183139404485664941616843691597024447586738912784063277359127768204092782706320234475212712014508481918262357879464226202483894518888192549035034715597321", + "1.349858807576003103983744313328007330378299697359365803049917989939612587399539891293796485784096715182993915046496649823555281317904746176330174697914134611623510180348776728882134107658893142886237546315268956423659470780978312757181276728365015226253890933258389419871658954993580579042712940646224891469297274304073301451390889351970899528642926347862338071149211408737527216178389071834814268450261525986465964604240725313283687637440963107718301330951356415753972714631376348680064772218613611483339228569651085445294350178104320530288284696175866807479054565245092139097584381245312021271592764191527971036208743048564156633628960281631838046184539943675102487856097772374221297245505051183848015221680960625161769660863247928466143070056933155076029152109198619", + "1.4918246976412703178248529528372222806432827739374252815956331500723650987080270940005743751395204332995146049712374327554149926253602141716230772600403407491873867150724945487212617660656620072704264395870570315311010113322105932230805422737018500206392527177438579578556189926416736085144638705057672356404429354629959069215296346423445412842930842338368651426888702440282339072078820428812172552291679864844405874392991397534151119907597315402375400805761858764070148579243901394571509123129260659970829149641445173093621736697471495715486927871427608521974813357303938049045027055274617248235377478635882464544179074744286716592660820629566276461885843196142347558399965088751380486680925242174092668548306167997919161040598441807559801618039547286283635268768983411911084036444003391406619758488846706626640355860622307506467065190571454306273600406778135267686009580686515055777572568306309595260360492639973537087137347050023394616393906703697628564832791198689610819908805991960205502002473532624419443167353822377041", + "1.64872127070012814684865078781416357165377610071014801157507931164066102119421560863277652005636664300286663775630779700467116697521960915984097145249005979692942265909840391471994846465948924489686890533641846572084106665685980008892498121171228737521497221259813802364604394123302337702342564441115073997210339345543632427971478640993009214371685872851424554356204792843238295646431490989989559298639300873734528343887199639936097616043887791159196535233519726480396696337931220763089035352455056481345843941842020212763119317243234414790916753474172146106996570450921757574263944725690829548117247432018340633298482417480890385134505857727555061166714846142254643382172817464252944064119480610550411214216150015806428026218072435549458500264910615270634896131341405150953300907304199696610224898662704055364699222488547803416596626400854705247760207415313247478751208997988819063167774971424158059320000508837926711487592221411833120473118940174150839318956411265214927589489222002618989424703890008658172723963726628180320021102408885281948306909133579708714540083108622117282123853386065037903914832977915548985425218334949782721619507339453842540738918246146490048448660414624464961524536296212426067836554424656828424228138566437904693429740129065343555896062662077213299699", + "1.822118800390508974875367668162864513382238808546435386320547476588819650298619237506071841611824533131511980084733212162604411051946388331577800804030556735220810982370501962391864313333554698490208265658190969819090734754749827177848273296632519555680103680326369352437791893895038152776723546377012529473207851151551688242638129468067423693457788686737322308859196635577406424535317253509122371220622994977976488678953227355968535226011981026891265759205286137730603315671631660105006528658431765125587595376593446335729037108814939435477611527959248377638771800033625299101758522787812658726842991493891554409933462204120505376533298706281045546514892620277647385214857618436655863924892218047400811116831042680487895029611648906250960278076271249277145102395991693860611831983025203596058754756019516099900266095850415178719614749200451630535061160489190411763823857450791548961055118169806794713874454939988586811643596429338746010525986899857961587944139308107436769695508633096338687346716373921410474524266689139689311366516947054631031160462923809187729982871513915427654871105844432037418907865839686988704917607346571370310822906994525483818469890762365701037332197459906166318134391275013867439967207601879970902034384688314406747097203766024003073884672273060729687254540281852107793074492986426871326231804793173823349508810551286252776477149073401952138042782050652434065326561952854233161279618029767330128021096195903742999575860846854523510091165177814675930213024375018164078691687009724255773069550816206514391507161", + "2.0137527074704765216245493885830652700175423941458673115689893008797813008588679406324379355851788044338331898308254040110152144406355672122332987484386680282011586454587874291207920063096506060092121746339385003035706369942761654499650114370277576609074394476969349195415563411287148054594195014950075492700297283186501952215548266611861363515166840789209921665299236941497660514195676818497506715216174857824667584113677462277646521368145755169801610652069383900929636397476997976928986121402340613272005739386746343595131239407140625657434766755405604726559983098911197009867487590223559613492600292768297051485732713550448835403835352549463376130577581804732758041958835979535301727820054018405592264887175988369901092552028042689226587551744843184492524888491684438908350917254501814719615534981346941241332070048752850076613909872221227923256131385070038327284304187184081154788930005575892847954811706365631293695056764191098947623473863749480484940756222177807267238801516870654540558247853395741216289690556742625956213865161202746032011088919700768154544490761339022261482519814495299963404741430504214836798155729249493697925254743226038042230995868518047785789005613825713835594435128868667771495101069180401795064269233374799738867352453002639997668416935366386592304127698022250575283863420166408296272643322148060907484201210428960680526033446678578974007350742511058399463304152252983283111059782340661351915733128923447394041481646451630961371702270477501539244567625913375076027018672900253183869684213821854331885455218593203695168621845862590839866070698465191768354775162667919687787234057113703426381234125007404970096051044315268874858727339518165207062282508219103550897032474383182390962719939041810953987104324795493331907049865728024468068697764264074787176174506379", + "2.22554092849246760457953753139507675705363413504848459611858395555662261021440632023826379767119915026374251878156387711619774619379855963687103747368472284226448865340655354317185985377030850245682664363225661079813536128785653726513719167842427129812110484311349165777902729389254511878094742813123387667848699059429446010657151043572826832010313208047732807930998614309870757227929101960381147954847517822334863279319666225559304046050087758825776791641245416220959090737379947978891910964567194089715072100803252233073248441719882854257031516049204581676853691460008296615228145430792751845579928748303335224298540140591302535466469498156065075049022167880244375473655622669689327650015305079415315439914200799195123789362957387187941117003174099693531506115168225416846731445216503066154563061060352226369700173570788781093516825383897874045751999350339808378867887307801498607904212244602606554161614131633524614531883236101562055698735197422864246157477439558784175923341664781731182017904677692890038751961431930364624097536076577459379586929940521167397559605869035407545793472238578147959537818114915637152419390460744941310780904484651026135598787393535566242027093950477170576851928767959213832520123359412209544604227356318776838329784976706937070674967308806522361845995066951391233792165311759338384098919371408326428769572713806130074267342996786117989877955011626521519806731160466960246214623368412017241669817519218938975787703688279670969520255459580782566824698766683025943011418413515424475714850262109066781102851851979626998205883326687030200455933362261083827188323248686155376982520491891859193912296678363031851095031585999296235557983401989894925443480452646143604665935035873612963289853124279447614565761048011466854209825044470072858946253771110646120878816878134534234062942337153869787247084363695742055676354219872791968697195149737804123025516854480966929100783654238470977617175020837913707478778991341149220208658404839283930641502839083068918900160104096532950404697685876434536064090817056280532188943563915681", + "2.459603111156949663800126563602470695421772306440083020748545736657466552943365860870497185275930801502314734282469001211863377120754375262961184698244101923873118980752553546206085511483915775565746633877944570171310441342807039240011800950067877653276578939207957922264156281735850299153120666705464183289626292382107850626757086481112777076313695819244326645247215187769898739208923979309373990446742434297871759538487547808364593778694498844772835078016714351373598016467631087278899749286697713740248674901887803256296138548656549872572977525766104722565107146500648985987203867132117547677722793432947466268434715992314177189845879538433878518025300096774542323436522591754634721655783263629640839419113447179019145648844517390978320904868643199845305360956544494557422964230972024073035383722263932056673976596266688976321828928564444485955130282123956383440560652142134812702650195318853004793654327694163135311018560302434548157745596278924049359462262875684655024660621143270223276160205111113928674619513010825531773437719585670055905189480192487461443889421286148006246588358783823432756235263368472035520311691553695512537108796193920657766396287812148336508130560411995851432991098150316151710626822458450166702368954969918890855718477702866142861632457171714589428586925352111493288264877793764611187635117419219667724089358648691849349019774953975112073361668366390843101189643022503196449529273850914731962177302267814885008720265909052869903077134292211446012339728016145173776605298068332932215627064339536349963737505457519321720111235396885978665426051921476079008722809300128117266650623362110732864760301900017299660039379063962560499694800926090914390798018070659760804286858439659842007948172165140806138672059440570988428291170643822030057401246220069601172550649731972117725967828449725240661095291919679379580274098603455617464670785310583926637393873619156058283990235643046346147091976283156228115434842186613044398987912680078472025977495377880564317393705447963819914365733951865401782223781823067701249854212472507082498852675712141033436456921920235635932416059888043961227210308986402540506511344650923632565845792598802341393743342422242830490309556974956001755607771592980368429255689748738593726168543904401740920843388611933767910638184739366965114643113679309810659" + ], + [ + "1", + "1.010050167084168057542165456902860033807362201524292515164404031254374190731323852253210417020805424644822048349018187461836882962867029471348122509994980620193343756983419263331678116890952977342412525238660052128564771661099141138373740030932375484797474253", + "1.020201340026755810160143920483151435303508991193925577274241055989764698001799473651140929048897747567783800834245028828510331946890882290633380114769851598685744140375597170707424349379520528467454229732767262381708980414285750783230743973744291273147993499", + "1.030454533953516855612439953831198132905025142988223325669945482984656275528143507413690159736153367833262717667969420762924665205128543186726815728146644027749899016551570459982549960946831724287476034271222234314936525314771353449031855228611755471551229794", + "1.040810774192388226757044757916854744082977050312312035233957186052848044168317778353605489758071664887267683574643292017752950273390217859298583514134022896444615385627894619269308729639149680681368915289974692924712790670871941809116920080546004777009977082", + "1.051271096376024039697517636335645220174821296055062528783938479166279869650561268909887381693097467956359959802287840109856898277991870910996931622269015847528217521038290049746389922767632968070266132836298958452051202283898407113137668129272719733709427182", + "1.061836546545359622224684877168372328428260420330079059772946224885572614646084795028727107540254028462725979079478817859771763808885702260691363941508870196834078432934454312238181936983945541942068693355958230093508349025302765186495840221334120606071291923", + "1.072508181254216479053103949889114605574958973093013631368581996384184663872870122142938195770222664418254764408892720110775221918308589471660420537322754050996390544947060412014702775390723097905171301841614973139324709852063472998538152057727154702871352078", + "1.083287067674958554435987758674888500198713572836593968977149136159258009574303026493771584720423995154971654271223663348911143174715668624259808265653232762681246142307810608195731327006732520819601068839992977872631673981442100729100750479561971721703257072", + "1.094174283705210357872897623544886011846519908747085113495537273829677943694135052107150933181696135377161199865920871107158317262615140642553465724478938198810156930341222455108468641066277461818416868403944990238207068911482417587752512679561090991848685506" + ], + [ + "1", + "1.001000500166708341668055753993058311563076200580701460228514674460359748251448298412718226004153260943068218872095099342063678696119623840972330905531768311923556198498023652909377677730283868486287409870317224336827290668524342227007650646080335377683539402", + "1.002002001334000266755580958731569947141262360355881650784254327401407826211342908735167751841578573842087720874539215063369808541481798858488186179510193185360846688470245765779287676702093047345577268794005585346872102348621068884894677639696274087962023832", + "1.00300450450337702601293409134890020533187271956193064005816386977887704167032778817835718449794009129738172654330257629939497609228121058276487935834566645111932939622158438169617802320237286016173845852664382662772735225891910141326100743286140812329716465", + "1.004008010677341872358807975325862256786679584568446515824520101445505613334720499643274149387061934130095719684438458233489149633082954545826902702369355374132139019359038155028498554482932087796695756199850948857306997101347029384618537438780565191707911304", + "1.005012520859401063383566241124068580734875538593956360758053700178766756245814257769725878531005582561752872914964453059693371357350351629785031289228112479393000390737852735490064653453473263950263469180412515034868068037410009410423281936206661529650777831", + "1.006018036054064864855584542073814807663397023131207238128209310729162232251624511692721095036373574483233356676638823820201979261982436682169260741126877359539784408851803860808991870535936635545440055073405777167775394256588337226812975070293010932647774324", + "1.007024557266848555231600031941337387260626958324843573515364689887121935057426030048643842343378401601112246752543195873570584146404476681012065985847363008474306541126869561447531097035189821427350474715365757081347202689171315251277667530845240665265299241", + "1.008032085504273431172073614608631847461248193629898477319670850659315558055203072544926387076982815517924276700035813263652577025921163294422287501988755195063376817413349886928919042162630307237198554733730866338155519701284057736281012337251398647856788345", + "1.009040621773867814062570481311874274057745096807557533536793791893309190089211313774252518807101361017003109570357638320235688072443915664196164220142177807129999765515285503655079866550036049450757501377434724079219971788693007550857637620196056994725614551" + ], + [ + "1", + "1.000100005000166670833416668055575397073415454172178381034635390972311235972781757573430475110294393277744056856189456093377349308639835234864147024859575654444223594337482525749599468629752896998058770389517981545014836069937171108315141768826558752790276236", + "1.000200020001333400002666755558095301588712550265063340281249616462339933552635650404575689469783860722328853092919751879277515614513727994472210356634280535514759912694604145062526466543039555669877231954222323073542460530523928410171365347075351011821920295", + "1.000300045004500337520251012543394484429242698705094453657909046405426810389812679452584785775653629322172025648290344728788948443651164069121340691369780280752072301321554544169816823932077142996969576906644974657939554818844412637302594762038150619715293429", + "1.000400080010667733418672355880651175325602089234218127313638994866471733257393689147689037528495706906710548020054317971434500261679934483484883365324764324379786145945431964915418427301969396382574915094633029858419556374510345888380818423418110019646700504", + "1.000500125020835937760438369605751648487716767772005667654052528513185499225469269404161288162290263445071720143880459750657027560342513592842257775359779789305459334406770729214405898908865552327309638003027229853587275580967668200112228756540688352311154381", + "1.000600180036005400648064805554702313487380662321427742218779523265089444076340698564952604142576704373734829905992750918066261276845603358030914225286385902646373896497226913904457327994080504271798651358706636453059949377387742804353973513521969936501752549", + "1.000700245057176672234080084397124317808729972049887082920697544556118662092675751649525697937257144190017868483717030126300200509168688033318071339742627167336587481821812960447646818515221045591253213703416322339042019757058294741478286115192071830262104121", + "1.000800320085350402731030797169875671484970787023831957698136827590544488579455328399517237263085338370118947386598991767922241276098928474413390097019906957313039688997723589590992573554820372138559418413121238600026229549189496894374911921472634282466150763", + "1.000900405121527342421488207410855909240960364438870706386170964512041266577901813243995078190574746902747080924348105047677314326983090277701922714443700530813227920787438119571392945308376198426393506918634436746759027328287815213664693795332524735463087053" + ], + [ + "1", + "1.000010000050000166667083334166668055557539685019844025575947974286518040859924541627171360141414808527964710456114808568579194429073542519236311802480484946481318067459005203787629467197723492854996446403371670522585399835010157731202234906636252385776731651", + "1.00002000020000133334000002666675555580952444444585538201058714126235905329240541941460463111260447087759745526170244469724542720133236462083910268982377765723546309959873516346614722768345641097465014525930010435730044916587618556635026327839524395833885967", + "1.000030000450004500033750202501012504339301986661384091295086648836751748647469450015964451670052983888622000581616827713185780669338108129262463661100560276359891431254482497644594518311264674989317833539411130935378547235234149850030248683847558235949192424", + "1.000040000800010666773334186672355588063654603897004653273294246986372534769339653940902480758988473452263946419318465732269864516290202354028672947499884769594544980789708021919265600923317888907545126143154207287758799568586448736519103967528945971526548865", + "1.000050001250020833593752604188368210566445007862474552660354358193300410181171307606063524320643523978564544928969865946453669990898899456698349198366716859128164016860292475535424871378362068018619464946001908269309911380465115625730470139574546168248414669", + "1.0000600018000360005400064800648005554327371706287380580517448041768184715082802102822710639972596644286364335407098336787101683082519331743726773721831155799714031419453036224798582793575860149124712362688085932620035829070681390851428693479523215791315023", + "1.000070002450057167667097339330069689583742177176723647063988790354210467474771865973142735988449874178404296043885131632312715760670823804989006222060531708444185344331114273860623983993837941069162433957327267046454693493702350816632053640929378397569224776", + "1.000080003200085335040027307030759716613039100029766726281645469033146244455371326825242410362812667390249632806855063393511294820363074995773170886211112043017322472818660214389638836378249754133527844678406244041534554373988144575477289266056935662827704568", + "1.000090004050121502733799208238121990124620911386617650268545997115197477729772808193789097698902228616779638545143688002498080668191392250030819907953393555632250735284651864761358652086319522549247127067080851958286265291953836318860562133321982933710810154" + ], + [ + "1", + "1.000001000000500000166666708333341666668055555753968278769844025573467813076198494952835391203458229748677004015804035149881283353005876638466337275595012771755160063386490687362457247978228580884154230359796042066216890640463145470846706955844825203502338433", + "1.000002000002000001333334000000266666755555580952387301588712522328042379349054566833660167181437047765093225411054231512232000686252213399825626439733598663743759193375087814488620462276244525976983466408498021993849036041894526504322094571719953352997296398", + "1.000003000004500004500003375002025001012500433928734151839955373415183009335525061132656460958137667580015165164788249607585867396819057285326555960166937649697973379255965258502453132749605555659281253337641722497540635905649955343904464110817430087236277383", + "1.000004000008000010666677333341866672355558806350831746754144909770828180249872278427090395131851159823632422197402740977847069569299698172678405177176752031063667161866596069388686444135669904957535469560754938297276129090532495319450469310001482708633857767", + "1.000005000012500020833359375026041688368071056557307173041021760810581713597910150822615040172518383155879039901575224781594686498583161076660122024484253078169629131959213103609416701449976071941387410235464597750689312106461726726423745914525437286467921547", + "1.000006000018000036000054000064800064800055542898800027771445234294803121427534564955943850794837297671518974352450646804505269707458299371394556170457704109967851854196460183929711397642333451409044458139769431977686515948803676537433882198942436033685726107", + "1.000007000024500057166766708473391830068218957087420770926023058705014627836931346376561248648943914301771998667561988061508464250718883634451632563486535656537167272887888081122818446250297457337741167996349750029452642438203264827808024523752573238419578446", + "1.000008000032000085333504000273067030755971657558959100027103654818370719061312164579253428366464456865704272537228885187015821963109960213301575481664899700318156977468627339004606537398549611534419591779145085995021987503286692083161615280400738437478228082", + "1.000009000040500121500273375492075738113449002853342362270826936522769439053506312434733891423696475231451840105639022034099547530631069357197734900223780917121362697414411169834162425824448828187739490931751957990245737110414834239697625619798509198502096658" + ], + [ + "1", + "1.000000100000005000000166666670833333416666668055555575396825644841272597001791225749809603978358318652155457825720723310835749477655921114381043370965778946803600487177628675696518849337844070626989834763657881129895761844201299169626521857477088528076787941", + "1.0000002000000200000013333334000000026666667555555580952381587301601410935026455031585698337876116969450321577305954872095570508305771300267271499578847512370499623533827733553612983384410604230310443624550120630972400618605844172547533274118825780193176817", + "1.000000300000045000004500000337500020250001012500043392858770089339955358770089330093345265320642486420378812047150951932585414871265710565736755891829214719352313336596892188244686930029886632072476330684236070498981285061952559758496574715013905892895701089", + "1.000000400000080000010666667733333418666672355555880634936888889611287506850089234183135875154730635650316057486370988380148651512646061821375107132862137685917854711244758264394403486935467487834601381881074388794755133200215304180036071713259670219661843655", + "1.00000050000012500002083333593750026041668836805710565485878596768387648163650363459170938183586448223517322491984417230264503853560225899248618260891812286125687715790717851056332021067227280094027013605976616483231712313908590884158078628449553297320265405", + "1.000000600000180000036000005400000648000064800005554286130857170628573094857233745459089870339612396601341875185399525960230416993842863520266038257286707886476669929341390017488971653286696873950479551896971679958715383478746119711068288028062391371149489013", + "1.000000700000245000057166676670834733916830068071895695874206708425953000310487646018304089060036787599147676275105859400474689895123100075425333066539374860872723840060463730171521439940751466901429495510481112965046593615553202195597459116945123426063272682", + "1.000000800000320000085333350400002730667030755597165718446730528598265921018024975740706254352576521064770040651166185959246668919556974378390605929012147885350292967351465271446885744407117136286055594702758682175847035062242848897900206718995002247133857028", + "1.000000900000405000121500027337504920750738112594900189247699728341390729295808046226796645426268557424285412997921532857831252559494834249449859109227293811330322601387155767798258269722975398926936389317746988260923777387227501391642065587929462420948649232" + ], + [ + "1", + "1.000000010000000050000000166666667083333334166666668055555557539682542162698415454144623567019402857944526698866978250658807361436330455014317926127615562200160084332078829335070241590368747866364909946478207830319530929114193223423472427136476351070384633625", + "1.000000020000000200000001333333340000000026666666755555555809523810158730160141093477248677253807920483138260929194262546389530541572869646520440208084154592575244829846475616092104703889032125897195071483101405504938379453255735383526992590359391748128287405", + "1.000000030000000450000004500000033750000202500001012500004339285730558035768526785877008929015219156953632307755135494996911581545128998738775212024344872737597647678017165824376945452724547758781666745678104162427281549813045542731484072320901013699751540848", + "1.000000040000000800000010666666773333334186666672355555588063492226031746754144623700881844722783424475442360990450187254251567422193813585987728199005661346037368045665532810641944716974411635496550894053342760394407334227944985761375822664063299977760202737", + "1.000000050000001250000020833333593750002604166688368055710565477159288199826733382290633389520515681243290082960907019379206809977191789257370469042321233232800461660402341054369158081918084989239338793682313776586227863512850221202421400273283373014626367211", + "1.000000060000001800000036000000540000006480000064800000555428575594285742057143023771429480311692856103917078121968011417513832454609367779840918760983285672034325842279012880873143319189323358452529556891585903632812397146307138829975274828994563695371179662", + "1.000000070000002450000057166667667083347339166830068057189569458742066083425945994475448626459922975804831403503407994163590626814758811340046507352358986760731455499065728116768159458733073621810040408316793287135185674491416007904172650363644834002683382753", + "1.00000008000000320000008533333504000002730666703075555971657147018158767145538214765716437674024287074857138074282562507322952457285899884827258634480202409132370650245847484059340021912733791131203856792980510306420862566617226572338856338435031664716693301", + "1.000000090000004050000121500002733750049207500738112509490017963905559103341304251500301830456961374530766246749440063115416691606198573254987480954117363856553419891520480849271064924566428807047867009390728824337185742582403824875085506729653219774600501303" + ], + [ + "1", + "1.000000001000000000500000000166666666708333333341666666668055555555753968253993055555558311287478229717813076198492867247207525145893201460227749911054309202505145378825438957130678837687266560105088389907332936208344126353435648007509079302366904838332737965", + "1.000000002000000002000000001333333334000000000266666666755555555580952380958730158731569664903280423280474587141262359040138133471466992736834031733502636105810709353815485197855429903174537090912633982404546033943476658527442915537642542256751648098540938329", + "1.000000003000000004500000004500000003375000002025000001012500000433928571591294642911383928587700892861580762988122463474282007055499419665167245143251664943594715148543087862808485217520052561838182926761331655514641487182847805900109952106216843867588068853", + "1.000000004000000008000000010666666677333333341866666672355555558806349207974603175325573192528818342256751643453335471124025932917900958536700278753394083087253080794330245466119358391768262310261548181640401381566398544617645066573738726605241457683162358406", + "1.000000005000000012500000020833333359375000026041666688368055571056547628735739092683876215213190312069808326828429435504808836584577556241828530001848857197197448211202934610464624745817298908884851334334032243517528230506352913584728945540127503247334304454", + "1.000000006000000018000000036000000054000000064800000064800000055542857184514285742057142873805714294803116887661298703396123877022771514559643784921476238095255198598792535200905864592462478874938320339031361777709608682003676296114904000848969978666037676208", + "1.000000007000000024500000057166666766708333473391666830068055718956944587420659833425945293891988861264598969692976408540181920613546886836709421546188906759485969317880330268377230197365586777939297035267858198945289644124491347823705980150597478089811238908", + "1.000000008000000032000000085333333504000000273066667030755555971657143273244444814312522341749841485037242407372912278975495665944488178378343886315424095469213776993555687392616104926576737106225715914016443147964116812712649070583759250245851205008677469484", + "1.00000000900000004050000012150000027337500049207500073811250094900178678191272428191272417515002310759027859286803358595908816669708328358557549585827919550781509555184392013474906695251704896486905504823982001490494955628430631018008515640009464192836762086" + ], + [ + "1", + "1.000000000100000000005000000000166666666670833333333416666666668055555555575396825397073412698415454144620838844797178381032547701302041579835416640972311235208061369602374898159661717890890636377876292167626807167118097418250089799613232822429561584839732436", + "1.00000000020000000002000000000133333333340000000000266666666675555555555809523809530158730158871252204588359788359839666506334028111805902739236072757342598614945704892826162667432877205675217861820898140236791877216104086843490250510449150481689310382491997", + "1.000000000300000000045000000004500000000337500000020250000001012500000043392857144484375000054241071430198660714330093344156953632305220408497752796394453771498033216988957610473517976082538957931840649372284007980778387079364588612237999322952503353246629272", + "1.000000000400000000080000000010666666667733333333418666666672355555555880634920651174603175325573192268754850089234183100884792902571758052646972327378677406133744778611081257066906765018961252872327129135458024179406515595154985765757709114409879325763582657", + "1.000000000500000000125000000020833333335937500000260416666688368055557105654762001643105164112447641362588872366729829295443148050046993630164903199619632307099045282865341315842970320393225917211453732599727661119186787432356941799959234635398296083997006139", + "1.000000000600000000180000000036000000005400000000648000000064800000005554285714702285714313485714287380571428662316883121427532467742209790218779163693808965891265088968175158346191639365407702043087739343368804570472330777845741875602316524836720744596838442", + "1.000000000700000000245000000057166666676670833334733916666830068055571895694445874206597333425945223833643326112645989436864693566253849841192829330529553945887353131797463326009328289333089933370063364144225191646223300847249495173234424373673541944624979205", + "1.00000000080000000032000000008533333335040000000273066666703075555559716571428987530158767145537921830196825612021369262382312864973497139947588769798444529279829947588643443285558056813237014675084862707667638417307510222862170506049780991734222020598622395", + "1.000000000900000000405000000121500000027337500004920750000738112500094900178582104841518924769866167515002240004474209193517383867930324377468044757492746949756095835764624498574071199440142689339384466863378791519731786238325701991449155383573875144382022735" + ], + [ + "1", + "1.000000000010000000000050000000000166666666667083333333334166666666668055555555557539682539685019841269844025573192242614638447974286515953184707524985304368984924541627170595425328394905114959781791792654948681248246092509415204617290487417116640524671775301", + "1.000000000020000000000200000000001333333333340000000000026666666666755555555555809523809524444444444445855379188715343915343920474587141262359040136831070164403516530500657509842695027911535848043821402053583856122155392523906401192251402380938316915480143814", + "1.000000000030000000000450000000004500000000033750000000202500000001012500000004339285714301986607142911383928571591294642857586647727273836749188314248641983022469439043110730229591857308776602897731494805150380123093913492034937508031925936525164255550480239", + "1.00000000004000000000080000000001066666666677333333333418666666667235555555558806349206365460317460389700176367131992945327329421196091365293143081697890586810267216616505076424653349506852152837802535905072055073786420151577785100640838396137277112251514735", + "1.00000000005000000000125000000002083333333359375000000260416666668836805555571056547619144500248016411244764112038587136255618718183873319134007264068095774525059241470925396170577487944738923374878447003205386484881914018245946707333822256547575648332174683", + "1.000000000060000000001800000000036000000000540000000006480000000064800000000555428571432737142857170628571428738057142858051740259744804155844176818381618471507920651137351791067425123447985349695682484654572318487957897918242801974673257648070007868679130426", + "1.000000000070000000002450000000057166666667667083333347339166666830068055557189569444458742065972333425945216827808777011126459894108581865282025216633943931012807982367336200600492753258650819501465012407695965228823807927322155096641118825460150386445518263", + "1.000000000080000000003200000000085333333335040000000027306666667030755555559716571428613038730159100026807763100038095259614835337645468150286810918977324022206242931561668484892962175461856164162854060279811767399853148829723227492951123779037914467762124188", + "1.000000000090000000004050000000121500000002733750000049207500000738112500009490017857249619843751067627008938180071651864330456372342868033181841733736211930697323760184868971758523921789168189768615744476250539036111741578555829725167955219694647353096622696" + ], + [ + "1", + "1.000000000001000000000000500000000000166666666666708333333333341666666666668055555555555753968253968278769841269844025573192240134479717813076198492865161619501897279835647891203458229747912288359543650548989349005883400229246206526163527289595008850667173127", + "1.000000000002000000000002000000000001333333333334000000000000266666666666755555555555580952380952387301587301588712522045855661375661375712682379349054566832344611437944771278292548133818000146042474087934405394723223543640599392717523920626753962817433470826", + "1.000000000003000000000004500000000004500000000003375000000002025000000001012500000000433928571428734151785714339955357142873415178571433009334415585525060876623632656406093960958126694744810435100615729450516002218359617667057380685556574837983621173494200824", + "1.000000000004000000000008000000000010666666666677333333333341866666666672355555555558806349206350831746031746754144620811576437389770828180214846916538934316722871531760423728464363385819413586609559082109346707911677721834735995817714714655658155017123966004", + "1.00000000000500000000001250000000002083333333335937500000002604166666668836805555557105654761905730716765873554101906966759414269180016504642155734790995478949110032280612198459362555198266157726625772874678331610798998177006297680609976524115439541173420259", + "1.000000000006000000000018000000000036000000000054000000000064800000000064800000000055542857142898800000000027771428571445234285714294803116883121427532467534564955044955943850435279366265734265869100042814376117193730654971650198545964167632457503232017871985", + "1.000000000007000000000024500000000057166666666766708333333473391666666830068055555718956944444587420659722333425945216127225322145111264598940825753582453602353313225972915411685074603803437053433977043894247041815994636316149529701778786472611784462703889138", + "1.000000000008000000000032000000000085333333333504000000000273066666667030755555555971657142857558958730159100026807760436987936508151703908930719061223879089942306582357031179238190271212908602022996939574698978718233321541425959528060975659005527346418528599", + "1.000000000009000000000040500000000121500000000273375000000492075000000738112500000949001785715353341294643924769866072389435736607929018849432407803098113232874672320130046233975445553072196307524291707537220510858488196407197643148826305620029216908081970869" + ], + [ + "1", + "1.000000000000100000000000005000000000000166666666666670833333333333416666666666668055555555555575396825396825644841269841272597001763668457892416225749809603976270645024985302763096599902155457825720722546120136232570095008736915152259095717555490353654637693", + "1.000000000000200000000000020000000000001333333333333400000000000002666666666666755555555555558095238095238158730158730160141093474426835978835978836491903158569833787611565389474722808056143268841681540119296733053347123188393029666555965964618355391948779923", + "1.000000000000300000000000045000000000004500000000000337500000000020250000000001012500000000043392857142858770089285714339955357142858770089285714330093344155845265320616883142486419830170378812036178118579523155416218299696954834514122792910931153971094557661", + "1.00000000000040000000000008000000000001066666666666773333333333341866666666667235555555555588063492063493688888888888961128747795417351675485008923418310084980254182031959917508006396898364938999859716891065039215240131218967246103644485220410726154752182813", + "1.000000000000500000000000125000000000020833333333335937500000000260416666666688368055555557105654761904858785962301592683876212522314969824735461967924533029209381816261176142259312832929617646027019562700585870131297332583548849712255111360166306405086567142", + "1.000000000000600000000000180000000000036000000000005400000000000648000000000064800000000005554285714286130857142857170628571428573094857142857233745454545459089870129870339612387612396601341515627589471100328256668816897388801845549408590481518481518982450895", + "1.000000000000700000000000245000000000057166666666676670833333334733916666666830068055555571895694444445874206597222333425945216057166976658951112645989407997470754170760066981154246423015810712407224886058134625535319860314645696585222499332309114404479010322", + "1.000000000000800000000000320000000000085333333333350400000000002730666666667030755555555597165714285718446730158730528598236331599254349206351358308930575740706245524032130353794354298842520912389088268868503018037747790192050898910086286503634618149465704747", + "1.000000000000900000000000405000000000121500000000027337500000004920750000000738112500000094900178571439247698660715353341294642953229287946436433045637175914296604606371988765933288088674127964826707631922216113496674674148986363044496860143671243577643241797" + ], + [ + "1", + "1.00000000000001000000000000005000000000000016666666666666708333333333333416666666666666805555555555555753968253968254216269841269841545414462081129023368606701940285794452461119336553364331142269510325065880736143632969029870898257141643432824401739745683204", + "1.000000000000020000000000000200000000000001333333333333340000000000000026666666666666755555555555555809523809523810158730158730160141093474426810582010582010587141253807920483138260916038706972040305373657500641627625779668107710435784086577737371425015371482", + "1.000000000000030000000000000450000000000004500000000000033750000000000202500000000001012500000000004339285714285730558035714285768526785714285877008928571429015219155844156953632305194807755135489510494996911570572295830843263878998738775175717176310059097941", + "1.000000000000040000000000000800000000000010666666666666773333333333334186666666666672355555555555588063492063492226031746031746754144620811290367548500881844722783389450091142108919886805434894323783520587584079648392819017157643549035718347892490103756832682", + "1.000000000000050000000000001250000000000020833333333333593750000000002604166666666688368055555555710565476190477159288194444449826733355379215623966600529222853848504890681243288122630360738677795976463823627917153238548547431722212537579252513491528497895141", + "1.000000000000060000000000001800000000000036000000000000540000000000006480000000000064800000000000555428571428575594285714285742057142857143023771428571429480311688311692856103896103917078121878121968011417154274656689596118168895082060796351269490173691870225", + "1.000000000000070000000000002450000000000057166666666667667083333333347339166666666830068055555557189569444444458742065972222333425945216050161142110339511126459894079714642471342475838347947074466949660826626759076737909986334434737200569423813868209125061118", + "1.000000000000080000000000003200000000000085333333333335040000000000027306666666667030755555555559716571428571470181587301587671455379188715480990476190497710073432740242870747688526349158515558520603402824101263705714914519281853707209898319172054430569538082", + "1.000000000000090000000000004050000000000121500000000002733750000000049207500000000738112500000009490017857142963905558035715353341294642866751500223214364330456371753836374526684257328746723198702565062957968528363119291981226734282851988084786564653406103472" + ], + [ + "1", + "1.000000000000001000000000000000500000000000000166666666666666708333333333333341666666666666668055555555555555753968253968253993055555555555558311287477954144896384479717813076198492865159533913874191651969590337645893201460227749910289593593991742139890335833", + "1.000000000000002000000000000002000000000000001333333333333334000000000000000266666666666666755555555555555580952380952380958730158730158731569664902998236613756613756613807920474587141262359040136817915911249244582578103847945117786412685883585354487957662562", + "1.000000000000003000000000000004500000000000004500000000000003375000000000002025000000000001012500000000000433928571428571591294642857142911383928571428587700892857142861580762987012988122463474025974282007055444555499419665156272310102286106750394522086451494", + "1.000000000000004000000000000008000000000000010666666666666677333333333333341866666666666672355555555555558806349206349207974603174603175325573192239859195485008818342256751643418310120002137779915568470377359266251234291869212504954247007157060272389965511657", + "1.000000000000005000000000000012500000000000020833333333333359375000000000026041666666666688368055555555571056547619047628735739087301592683876212522048546523644179895403141659652076828429435308775782586614292343529022000662935706114244280270246557851904047187", + "1.00000000000000600000000000001800000000000003600000000000005400000000000006480000000000006480000000000005554285714285718451428571428574205714285714287380571428571429480311688311688766129870129870339612387612387702277151420008598821521335807063576195233338095", + "1.000000000000007000000000000024500000000000057166666666666766708333333333473391666666666830068055555555718956944444444587420659722222333425945216049460558655478395111264598940796886359643059647415484626357278274780213549872841697820531068941222114832031381804", + "1.000000000000008000000000000032000000000000085333333333333504000000000000273066666666667030755555555555971657142857143273244444444444814312522045855675083174603174818370575597242407372912190690056753273393273443722265929250083140248634767166738704512418804466", + "1.000000000000009000000000000040500000000000121500000000000273375000000000492075000000000738112500000000949001785714286781912723214286781912723214286675150022321429357590278003247342868033177760148459087904283479197083126137413049861121579402108279148620678486" + ], + [ + "1", + "1.000000000000000100000000000000005000000000000000166666666666666670833333333333333416666666666666668055555555555555575396825396825397073412698412698415454144620811287505511463844797178381032547699214367968708246486024279861085416640972311235208060604886766427", + "1.00000000000000020000000000000002000000000000000133333333333333340000000000000000266666666666666675555555555555555809523809523809530158730158730158871252204585537921693121693121693172999839666506334028111805889583680517013850347183868453709723550995898085845", + "1.000000000000000300000000000000045000000000000004500000000000000337500000000000020250000000000001012500000000000043392857142857144484375000000000054241071428571430198660714285714330093344155844156953632305194805220408497752247752796394453760525200069461788209", + "1.000000000000000400000000000000080000000000000010666666666666667733333333333333418666666666666672355555555555555880634920634920651174603174603175325573192239858935421516754850089234183100849767551459569237347016202497091385980305660712009918359945816284440624", + "1.000000000000000500000000000000125000000000000020833333333333335937500000000000260416666666666688368055555555557105654761904762001643105158730164112447641093474695922205687830700063162628266795443148050027390324771407941980859347644064053414275164241901696431", + "1.000000000000000600000000000000180000000000000036000000000000005400000000000000648000000000000064800000000000005554285714285714702285714285714313485714285714287380571428571428662316883116883121427532467532467742209790209790218779163693449408094680176965891264", + "1.000000000000000700000000000000245000000000000057166666666666676670833333333334733916666666666830068055555555571895694444444445874206597222222333425945216049390500309992283951112645989407968603531360231364573198294285559476609495997192590078165056998305407027", + "1.000000000000000800000000000000320000000000000085333333333333350400000000000002730666666666667030755555555555597165714285714289875301587301587671455379188712551635301587301589453547025813692623823128640906427512749176749177253665475735317032064340416001793007", + "1.000000000000000900000000000000405000000000000121500000000000027337500000000004920750000000000738112500000000094900178571428582104841517857143924769866071428667515002232142865004474208603896693517383827110430430324374843908718044757335298787389806890096519491" + ], + [ + "1", + "1.000000000000000010000000000000000050000000000000000166666666666666667083333333333333334166666666666666668055555555555555557539682539682539685019841269841269844025573192239858909281305114638447974286515953182619851374191651969429748813429368984924541627170598", + "1.000000000000000020000000000000000200000000000000001333333333333333340000000000000000026666666666666666755555555555555555809523809523809524444444444444444445855379188712522048677248677248677253807920474587141262359040136817914608847942181275514627641611768596", + "1.000000000000000030000000000000000450000000000000004500000000000000033750000000000000202500000000000001012500000000000004339285714285714301986607142857142911383928571428571591294642857142857586647727272727273836749188311688314248641983016983022469439043099755", + "1.000000000000000040000000000000000800000000000000010666666666666666773333333333333334186666666666666672355555555555555588063492063492063654603174603174603897001763668430337986596119929453273294211960878627580319598097375875261423350312239201436005499497562994", + "1.000000000000000050000000000000001250000000000000020833333333333333593750000000000002604166666666666688368055555555555710565476190476191445002480158730164112447641093474453719204695767195889520515171556838733191340070680350418458735516027189695036859130361164", + "1.000000000000000060000000000000001800000000000000036000000000000000540000000000000006480000000000000064800000000000000555428571428571432737142857142857170628571428571428738057142857142858051740259740259744804155844155844176818381618381618471507920650777793995", + "1.000000000000000070000000000000002450000000000000057166666666666667667083333333333347339166666666666830068055555555557189569444444444458742065972222222333425945216049383494475443672839511126459894079685775248531948536288969661078387597485597679474645403468476", + "1.00000000000000008000000000000000320000000000000008533333333333333504000000000000002730666666666666703075555555555555971657142857142861303873015873015910002680776014109643337142857142859294816867083533764546815028592806458869675509675510179998402068243340775", + "1.000000000000000090000000000000004050000000000000121500000000000002733750000000000049207500000000000738112500000000009490017857142857249619843750000001067627008928571438180071651785714364330456371753247342868033177759744341733736185689336930697323602736706615" + ], + [ + "1", + "1.000000000000000001000000000000000000500000000000000000166666666666666666708333333333333333341666666666666666668055555555555555555753968253968253968278769841269841269844025573192239858906801146384479717813076198492865159531828286168563946341724280092335647892", + "1.000000000000000002000000000000000002000000000000000001333333333333333334000000000000000000266666666666666666755555555555555555580952380952380952387301587301587301588712522045855379188994708994708994709046015712682379349054566832344610122389215722549055882388", + "1.000000000000000003000000000000000004500000000000000004500000000000000003375000000000000002025000000000000001012500000000000000433928571428571428734151785714285714339955357142857142873415178571428571433009334415584415585525060876623376623632656406093906093961", + "1.000000000000000004000000000000000008000000000000000010666666666666666677333333333333333341866666666666666672355555555555555558806349206349206350831746031746031746754144620811287478243104056437389770828180214846881513583205600983378761167315976204865093757063", + "1.000000000000000005000000000000000012500000000000000020833333333333333359375000000000000026041666666666666688368055555555555571056547619047619057307167658730158735541019069664903000927476025132275133498379754890171557347909954789295067268878100583829750566431", + "1.000000000000000006000000000000000018000000000000000036000000000000000054000000000000000064800000000000000064800000000000000055542857142857142898800000000000000027771428571428571445234285714285714294803116883116883121427532467532467534564955044955044955943848", + "1.000000000000000007000000000000000024500000000000000057166666666666666766708333333333333473391666666666666830068055555555555718956944444444444587420659722222222333425945216049382793891988811728395111264598940796857492420249120253460546797757670409580139582076", + "1.000000000000000008000000000000000032000000000000000085333333333333333504000000000000000273066666666666667030755555555555555971657142857142857558958730158730159100026807760141093770321269841269841485037242263908930719061223879001656867720084360084360134808958", + "1.000000000000000009000000000000000040500000000000000121500000000000000273375000000000000492075000000000000738112500000000000949001785714285715353341294642857143924769866071428572389435736607142857929018849431818182407803098112824675732874672319867632630046236" + ], + [ + "1", + "1.000000000000000000100000000000000000005000000000000000000166666666666666666670833333333333333333416666666666666666668055555555555555555575396825396825396825644841269841269841272597001763668430335124559082892416225749809603976270642937311691651969429747207541", + "1.000000000000000000200000000000000000020000000000000000001333333333333333333400000000000000000002666666666666666666755555555555555555558095238095238095238158730158730158730160141093474426807760169312169312169312169825236491903158569833787611565389343167252501", + "1.000000000000000000300000000000000000045000000000000000004500000000000000000337500000000000000020250000000000000001012500000000000000043392857142857142858770089285714285714339955357142857142858770089285714285714330093344155844155845265320616883116883142486419", + "1.000000000000000000400000000000000000080000000000000000010666666666666666667733333333333333333418666666666666666672355555555555555555880634920634920634936888888888888888889611287477954144620840183421516754850089234183100849767516469208486986264764043619524508", + "1.00000000000000000050000000000000000012500000000000000002083333333333333333593750000000000000026041666666666666668836805555555555555710565476190476190485878596230158730159268387621252204585564830315806878306879530125786636203302920938181626115653895392003709", + "1.00000000000000000060000000000000000018000000000000000003600000000000000000540000000000000000064800000000000000006480000000000000000555428571428571428613085714285714285717062857142857142857309485714285714285723374545454545454545908987012987012987033961238761", + "1.000000000000000000700000000000000000245000000000000000057166666666666666676670833333333333334733916666666666666830068055555555555571895694444444444445874206597222222222333425945216049382723833643325617283951112645989407968574664137420837425177704511425598692", + "1.000000000000000000800000000000000000320000000000000000085333333333333333350400000000000000002730666666666666667030755555555555555597165714285714285718446730158730158730528598236331569664932587682539682539684691642263908930575740706245524023301809908131572135", + "1.000000000000000000900000000000000000405000000000000000121500000000000000027337500000000000004920750000000000000738112500000000000094900178571428571439247698660714285715353341294642857142953229287946428571436433045637175324675914296604606331168871988765933284" + ], + [ + "1", + "1.000000000000000000010000000000000000000050000000000000000000166666666666666666667083333333333333333334166666666666666666668055555555555555555557539682539682539682542162698412698412698415454144620811287477956900352733686067019402857944524611191277860032200311", + "1.000000000000000000020000000000000000000200000000000000000001333333333333333333340000000000000000000026666666666666666666755555555555555555555809523809523809523810158730158730158730160141093474426807760143915343915343915343920474587141253807920483138260916037", + "1.000000000000000000030000000000000000000450000000000000000004500000000000000000033750000000000000000202500000000000000001012500000000000000004339285714285714285730558035714285714285768526785714285714285877008928571428571429015219155844155844156953632305194803", + "1.000000000000000000040000000000000000000800000000000000000010666666666666666666773333333333333333334186666666666666666672355555555555555555588063492063492063492226031746031746031746754144620811287477957034215167548500881844722783389450056116757808775586553367", + "1.0000000000000000000500000000000000000012500000000000000000208333333333333333335937500000000000000026041666666666666666883680555555555555557105654761904761904771592881944444444444498267333553791887125489572999338624338625561871818382235048906812432881226284", + "1.000000000000000000060000000000000000001800000000000000000036000000000000000000540000000000000000006480000000000000000064800000000000000000555428571428571428575594285714285714285742057142857142857143023771428571428571429480311688311688311692856103896103896105", + "1.000000000000000000070000000000000000002450000000000000000057166666666666666667667083333333333333347339166666666666666830068055555555555557189569444444444444458742065972222222222333425945216049382716827808777006172839511126459894079685746381309138009142349419", + "1.000000000000000000080000000000000000003200000000000000000085333333333333333335040000000000000000027306666666666666667030755555555555555559716571428571428571470181587301587301587671455379188712522048814323809523809523831043406766073432740242870747688525466307", + "1.000000000000000000090000000000000000004050000000000000000121500000000000000002733750000000000000049207500000000000000738112500000000000009490017857142857142963905558035714285715353341294642857142866751500223214285714364330456371753246753836374526684253246756" + ], + [ + "1", + "1.000000000000000000001000000000000000000000500000000000000000000166666666666666666666708333333333333333333341666666666666666666668055555555555555555555753968253968253968253993055555555555555555558311287477954144620811563051146384479717813076198492865159531825", + "1.000000000000000000002000000000000000000002000000000000000000001333333333333333333334000000000000000000000266666666666666666666755555555555555555555580952380952380952380958730158730158730158731569664902998236331569947089947089947089947141253807920474587141263", + "1.000000000000000000003000000000000000000004500000000000000000004500000000000000000003375000000000000000002025000000000000000001012500000000000000000433928571428571428571591294642857142857142911383928571428571428587700892857142857142861580762987012987012988123", + "1.000000000000000000004000000000000000000008000000000000000000010666666666666666666677333333333333333333341866666666666666666672355555555555555555558806349206349206349207974603174603174603175325573192239858906525862151675485008818342256751643418310084976786668", + "1.000000000000000000005000000000000000000012500000000000000000020833333333333333333359375000000000000000026041666666666666666688368055555555555555571056547619047619047628735739087301587301592683876212522045855381879856977513227513228736474992985409652076828429", + "1.000000000000000000006000000000000000000018000000000000000000036000000000000000000054000000000000000000064800000000000000000064800000000000000000055542857142857142857184514285714285714285742057142857142857142873805714285714285714294803116883116883116887661297", + "1.000000000000000000007000000000000000000024500000000000000000057166666666666666666766708333333333333333473391666666666666666830068055555555555555718956944444444444444587420659722222222222333425945216049382716127225322145061728395111264598940796857463553026308", + "1.000000000000000000008000000000000000000032000000000000000000085333333333333333333504000000000000000000273066666666666666667030755555555555555555971657142857142857143273244444444444444444814312522045855379189008416507936507936508151703908930575597242407372915", + "1.000000000000000000009000000000000000000040500000000000000000121500000000000000000273375000000000000000492075000000000000000738112500000000000000949001785714285714286781912723214285714286781912723214285714286675150022321428571429357590278003246753247342868031" + ], + [ + "1", + "1.000000000000000000000100000000000000000000005000000000000000000000166666666666666666666670833333333333333333333416666666666666666666668055555555555555555555575396825396825396825397073412698412698412698415454144620811287477954172178130511463844797178381032548", + "1.00000000000000000000020000000000000000000002000000000000000000000133333333333333333333340000000000000000000000266666666666666666666675555555555555555555555809523809523809523809530158730158730158730158871252204585537918871255026455026455026455026506333173", + "1.000000000000000000000300000000000000000000045000000000000000000004500000000000000000000337500000000000000000020250000000000000000001012500000000000000000043392857142857142857144484375000000000000000054241071428571428571430198660714285714285714330093344155846", + "1.000000000000000000000400000000000000000000080000000000000000000010666666666666666666667733333333333333333333418666666666666666666672355555555555555555555880634920634920634920651174603174603174603175325573192239858906525602088183421516754850089234183100849766", + "1.00000000000000000000050000000000000000000012500000000000000000002083333333333333333333593750000000000000000026041666666666666666668836805555555555555555710565476190476190476200164310515873015873016411244764109347442680802925553902116402116403339649596160013", + "1.000000000000000000000600000000000000000000180000000000000000000036000000000000000000005400000000000000000000648000000000000000000064800000000000000000005554285714285714285714702285714285714285714313485714285714285714287380571428571428571428662316883116883115", + "1.000000000000000000000700000000000000000000245000000000000000000057166666666666666666676670833333333333333334733916666666666666666830068055555555555555571895694444444444444445874206597222222222222333425945216049382716057166976658950617283951112645989407968576", + "1.000000000000000000000800000000000000000000320000000000000000000085333333333333333333350400000000000000000002730666666666666666667030755555555555555555597165714285714285714289875301587301587301587671455379188712522045884968634920634920634922786880359147025816", + "1.000000000000000000000900000000000000000000405000000000000000000121500000000000000000027337500000000000000004920750000000000000000738112500000000000000094900178571428571428582104841517857142857143924769866071428571428667515002232142857142865004474208603896105" + ], + [ + "1", + "1.000000000000000000000010000000000000000000000050000000000000000000000166666666666666666666667083333333333333333333334166666666666666666666668055555555555555555555557539682539682539682539685019841269841269841269844025573192239858906525575947971781305114638449", + "1.000000000000000000000020000000000000000000000200000000000000000000001333333333333333333333340000000000000000000000026666666666666666666666755555555555555555555555809523809523809523809524444444444444444444444445855379188712522045855382010582010582010582010585", + "1.000000000000000000000030000000000000000000000450000000000000000000004500000000000000000000033750000000000000000000202500000000000000000001012500000000000000000004339285714285714285714301986607142857142857142911383928571428571428571591294642857142857142857586", + "1.000000000000000000000040000000000000000000000800000000000000000000010666666666666666666666773333333333333333333334186666666666666666666672355555555555555555555588063492063492063492063654603174603174603174603897001763668430335097004653262786596119929453273303", + "1.000000000000000000000050000000000000000000001250000000000000000000020833333333333333333333593750000000000000000002604166666666666666666688368055555555555555555710565476190476190476191445002480158730158730164112447641093474426807787052538029100529100529222855", + "1.000000000000000000000060000000000000000000001800000000000000000000036000000000000000000000540000000000000000000006480000000000000000000064800000000000000000000555428571428571428571432737142857142857142857170628571428571428571428738057142857142857142858051741", + "1.000000000000000000000070000000000000000000002450000000000000000000057166666666666666666667667083333333333333333347339166666666666666666830068055555555555555557189569444444444444444458742065972222222222222333425945216049382716050161142110339506172839511126458", + "1.000000000000000000000080000000000000000000003200000000000000000000085333333333333333333335040000000000000000000027306666666666666666667030755555555555555555559716571428571428571428613038730158730158730159100026807760141093474429766704761904761904761926281501", + "1.000000000000000000000090000000000000000000004050000000000000000000121500000000000000000002733750000000000000000049207500000000000000000738112500000000000000009490017857142857142857249619843750000000000001067627008928571428571438180071651785714285714364330459" + ], + [ + "1", + "1.000000000000000000000001000000000000000000000000500000000000000000000000166666666666666666666666708333333333333333333333341666666666666666666666668055555555555555555555555753968253968253968253968278769841269841269841269844025573192239858906525573467813051147", + "1.000000000000000000000002000000000000000000000002000000000000000000000001333333333333333333333334000000000000000000000000266666666666666666666666755555555555555555555555580952380952380952380952387301587301587301587301588712522045855379188712522328042328042329", + "1.000000000000000000000003000000000000000000000004500000000000000000000004500000000000000000000003375000000000000000000002025000000000000000000001012500000000000000000000433928571428571428571428734151785714285714285714339955357142857142857142873415178571428569", + "1.000000000000000000000004000000000000000000000008000000000000000000000010666666666666666666666677333333333333333333333341866666666666666666666672355555555555555555555558806349206349206349206350831746031746031746031746754144620811287477954144909770723104056436", + "1.000000000000000000000005000000000000000000000012500000000000000000000020833333333333333333333359375000000000000000000026041666666666666666666688368055555555555555555571056547619047619047619057307167658730158730158735541019069664902998236334260809358465608467", + "1.000000000000000000000006000000000000000000000018000000000000000000000036000000000000000000000054000000000000000000000064800000000000000000000064800000000000000000000055542857142857142857142898800000000000000000000027771428571428571428571445234285714285714286", + "1.000000000000000000000007000000000000000000000024500000000000000000000057166666666666666666666766708333333333333333333473391666666666666666666830068055555555555555555718956944444444444444444587420659722222222222222333425945216049382716049460558655478395061727", + "1.000000000000000000000008000000000000000000000032000000000000000000000085333333333333333333333504000000000000000000000273066666666666666666667030755555555555555555555971657142857142857142857558958730158730158730159100026807760141093474427103654603174603174605", + "1.000000000000000000000009000000000000000000000040500000000000000000000121500000000000000000000273375000000000000000000492075000000000000000000738112500000000000000000949001785714285714285715353341294642857142857143924769866071428571428572389435736607142857144" + ], + [ + "1", + "1.000000000000000000000000100000000000000000000000005000000000000000000000000166666666666666666666666670833333333333333333333333416666666666666666666666668055555555555555555555555575396825396825396825396825644841269841269841269841272597001763668430335097001788", + "1.000000000000000000000000200000000000000000000000020000000000000000000000001333333333333333333333333400000000000000000000000002666666666666666666666666755555555555555555555555558095238095238095238095238158730158730158730158730160141093474426807760141093502646", + "1.000000000000000000000000300000000000000000000000045000000000000000000000004500000000000000000000000337500000000000000000000020250000000000000000000001012500000000000000000000043392857142857142857142858770089285714285714285714339955357142857142857142858770088", + "1.000000000000000000000000400000000000000000000000080000000000000000000000010666666666666666666666667733333333333333333333333418666666666666666666666672355555555555555555555555880634920634920634920634936888888888888888888888889611287477954144620811287506850092", + "1.000000000000000000000000500000000000000000000000125000000000000000000000020833333333333333333333335937500000000000000000000260416666666666666666666688368055555555555555555557105654761904761904761904858785962301587301587301592683876212522045855379188981636508", + "1.000000000000000000000000600000000000000000000000180000000000000000000000036000000000000000000000005400000000000000000000000648000000000000000000000064800000000000000000000005554285714285714285714286130857142857142857142857170628571428571428571428573094857144", + "1.00000000000000000000000070000000000000000000000024500000000000000000000005716666666666666666666667667083333333333333333333473391666666666666666666683006805555555555555555557189569444444444444444444587420659722222222222222233342594521604938271604939050030999", + "1.000000000000000000000000800000000000000000000000320000000000000000000000085333333333333333333333350400000000000000000000002730666666666666666666667030755555555555555555555597165714285714285714285718446730158730158730158730528598236331569664902998265921015871", + "1.000000000000000000000000900000000000000000000000405000000000000000000000121500000000000000000000027337500000000000000000004920750000000000000000000738112500000000000000000094900178571428571428571439247698660714285714285715353341294642857142857142953229287949" + ], + [ + "1", + "1.000000000000000000000000010000000000000000000000000050000000000000000000000000166666666666666666666666667083333333333333333333333334166666666666666666666666668055555555555555555555555557539682539682539682539682542162698412698412698412698415454144620811287477", + "1.000000000000000000000000020000000000000000000000000200000000000000000000000001333333333333333333333333340000000000000000000000000026666666666666666666666666755555555555555555555555555809523809523809523809523810158730158730158730158730160141093474426807760139", + "1.000000000000000000000000030000000000000000000000000450000000000000000000000004500000000000000000000000033750000000000000000000000202500000000000000000000001012500000000000000000000004339285714285714285714285730558035714285714285714285768526785714285714285713", + "1.000000000000000000000000040000000000000000000000000800000000000000000000000010666666666666666666666666773333333333333333333333334186666666666666666666666672355555555555555555555555588063492063492063492063492226031746031746031746031746754144620811287477954144", + "1.000000000000000000000000050000000000000000000000001250000000000000000000000020833333333333333333333333593750000000000000000000002604166666666666666666666688368055555555555555555555710565476190476190476190477159288194444444444444444449826733355379188712522045", + "1.000000000000000000000000060000000000000000000000001800000000000000000000000036000000000000000000000000540000000000000000000000006480000000000000000000000064800000000000000000000000555428571428571428571428575594285714285714285714285742057142857142857142857143", + "1.000000000000000000000000070000000000000000000000002450000000000000000000000057166666666666666666666667667083333333333333333333347339166666666666666666666830068055555555555555555557189569444444444444444444458742065972222222222222222333425945216049382716049381", + "1.000000000000000000000000080000000000000000000000003200000000000000000000000085333333333333333333333335040000000000000000000000027306666666666666666666667030755555555555555555555559716571428571428571428571470181587301587301587301587671455379188712522045855382", + "1.000000000000000000000000090000000000000000000000004050000000000000000000000121500000000000000000000002733750000000000000000000049207500000000000000000000738112500000000000000000009490017857142857142857142963905558035714285714285715353341294642857142857142868" + ], + [ + "1", + "1.000000000000000000000000001000000000000000000000000000500000000000000000000000000166666666666666666666666666708333333333333333333333333341666666666666666666666666668055555555555555555555555555753968253968253968253968253993055555555555555555555555558311287479", + "1.000000000000000000000000002000000000000000000000000002000000000000000000000000001333333333333333333333333334000000000000000000000000000266666666666666666666666666755555555555555555555555555580952380952380952380952380958730158730158730158730158731569664902999", + "1.00000000000000000000000000300000000000000000000000000450000000000000000000000000450000000000000000000000000337500000000000000000000000202500000000000000000000000101250000000000000000000000043392857142857142857142857159129464285714285714285714291138392857143", + "1.000000000000000000000000004000000000000000000000000008000000000000000000000000010666666666666666666666666677333333333333333333333333341866666666666666666666666672355555555555555555555555558806349206349206349206349207974603174603174603174603175325573192239859", + "1.000000000000000000000000005000000000000000000000000012500000000000000000000000020833333333333333333333333359375000000000000000000000026041666666666666666666666688368055555555555555555555571056547619047619047619047628735739087301587301587301592683876212522047", + "1.000000000000000000000000006000000000000000000000000018000000000000000000000000036000000000000000000000000054000000000000000000000000064800000000000000000000000064800000000000000000000000055542857142857142857142857184514285714285714285714285742057142857142858", + "1.000000000000000000000000007000000000000000000000000024500000000000000000000000057166666666666666666666666766708333333333333333333333473391666666666666666666666830068055555555555555555555718956944444444444444444444587420659722222222222222222333425945216049384", + "1.000000000000000000000000008000000000000000000000000032000000000000000000000000085333333333333333333333333504000000000000000000000000273066666666666666666666667030755555555555555555555555971657142857142857142857143273244444444444444444444444814312522045855381", + "1.000000000000000000000000009000000000000000000000000040500000000000000000000000121500000000000000000000000273375000000000000000000000492075000000000000000000000738112500000000000000000000949001785714285714285714286781912723214285714285714286781912723214285713" + ], + [ + "1", + "1.000000000000000000000000000100000000000000000000000000005000000000000000000000000000166666666666666666666666666670833333333333333333333333333416666666666666666666666666668055555555555555555555555555575396825396825396825396825397073412698412698412698412698414", + "1.000000000000000000000000000200000000000000000000000000020000000000000000000000000001333333333333333333333333333400000000000000000000000000002666666666666666666666666666755555555555555555555555555558095238095238095238095238095301587301587301587301587301588711", + "1.000000000000000000000000000300000000000000000000000000045000000000000000000000000004500000000000000000000000000337500000000000000000000000020250000000000000000000000001012500000000000000000000000043392857142857142857142857144484375000000000000000000000054239", + "1.000000000000000000000000000400000000000000000000000000080000000000000000000000000010666666666666666666666666667733333333333333333333333333418666666666666666666666666672355555555555555555555555555880634920634920634920634920651174603174603174603174603175325574", + "1.000000000000000000000000000500000000000000000000000000125000000000000000000000000020833333333333333333333333335937500000000000000000000000260416666666666666666666666688368055555555555555555555557105654761904761904761904762001643105158730158730158730164112449", + "1.000000000000000000000000000600000000000000000000000000180000000000000000000000000036000000000000000000000000005400000000000000000000000000648000000000000000000000000064800000000000000000000000005554285714285714285714285714702285714285714285714285714313485713", + "1.000000000000000000000000000700000000000000000000000000245000000000000000000000000057166666666666666666666666676670833333333333333333333334733916666666666666666666666830068055555555555555555555571895694444444444444444444445874206597222222222222222222333425947", + "1.000000000000000000000000000800000000000000000000000000320000000000000000000000000085333333333333333333333333350400000000000000000000000002730666666666666666666666667030755555555555555555555555597165714285714285714285714289875301587301587301587301587671455379", + "1.000000000000000000000000000900000000000000000000000000405000000000000000000000000121500000000000000000000000027337500000000000000000000004920750000000000000000000000738112500000000000000000000094900178571428571428571428582104841517857142857142857143924769868" + ], + [ + "1", + "1.000000000000000000000000000010000000000000000000000000000050000000000000000000000000000166666666666666666666666666667083333333333333333333333333334166666666666666666666666666668055555555555555555555555555557539682539682539682539682539685019841269841269841268", + "1.000000000000000000000000000020000000000000000000000000000200000000000000000000000000001333333333333333333333333333340000000000000000000000000000026666666666666666666666666666755555555555555555555555555555809523809523809523809523809524444444444444444444444447", + "1.000000000000000000000000000030000000000000000000000000000450000000000000000000000000004500000000000000000000000000033750000000000000000000000000202500000000000000000000000001012500000000000000000000000004339285714285714285714285714301986607142857142857142859", + "1.000000000000000000000000000040000000000000000000000000000800000000000000000000000000010666666666666666666666666666773333333333333333333333333334186666666666666666666666666672355555555555555555555555555588063492063492063492063492063654603174603174603174603175", + "1.000000000000000000000000000050000000000000000000000000001250000000000000000000000000020833333333333333333333333333593750000000000000000000000002604166666666666666666666666688368055555555555555555555555710565476190476190476190476191445002480158730158730158732", + "1.000000000000000000000000000060000000000000000000000000001800000000000000000000000000036000000000000000000000000000540000000000000000000000000006480000000000000000000000000064800000000000000000000000000555428571428571428571428571432737142857142857142857142857", + "1.000000000000000000000000000070000000000000000000000000002450000000000000000000000000057166666666666666666666666667667083333333333333333333333347339166666666666666666666666830068055555555555555555555557189569444444444444444444444458742065972222222222222222222", + "1.000000000000000000000000000080000000000000000000000000003200000000000000000000000000085333333333333333333333333335040000000000000000000000000027306666666666666666666666667030755555555555555555555555559716571428571428571428571428613038730158730158730158730158", + "1.00000000000000000000000000009000000000000000000000000000405000000000000000000000000012150000000000000000000000000273375000000000000000000000004920750000000000000000000000073811250000000000000000000000949001785714285714285714285724961984375" + ], + [ + "1", + "1.00000000000000000000000000000100000000000000000000000000000050000000000000000000000000000016666666666666666666666666666670833333333333333333333333333334166666666666666666666666666666805555555555555555555555555555575396825396825396825396825396827876984126984", + "1.000000000000000000000000000002000000000000000000000000000002000000000000000000000000000001333333333333333333333333333334000000000000000000000000000000266666666666666666666666666666755555555555555555555555555555580952380952380952380952380952387301587301587304", + "1.000000000000000000000000000003000000000000000000000000000004500000000000000000000000000004500000000000000000000000000003375000000000000000000000000002025000000000000000000000000001012500000000000000000000000000433928571428571428571428571428734151785714285719", + "1.000000000000000000000000000004000000000000000000000000000008000000000000000000000000000010666666666666666666666666666677333333333333333333333333333341866666666666666666666666666672355555555555555555555555555558806349206349206349206349206350831746031746031746", + "1.00000000000000000000000000000500000000000000000000000000001250000000000000000000000000002083333333333333333333333333335937500000000000000000000000002604166666666666666666666666668836805555555555555555555555557105654761904761904761904761905730716765873015873", + "1.000000000000000000000000000006000000000000000000000000000018000000000000000000000000000036000000000000000000000000000054000000000000000000000000000064800000000000000000000000000064800000000000000000000000000055542857142857142857142857142898799999999999999999", + "1.00000000000000000000000000000700000000000000000000000000002450000000000000000000000000005716666666666666666666666666676670833333333333333333333333347339166666666666666666666666683006805555555555555555555555571895694444444444444444444444458742065972222222222", + "1.00000000000000000000000000000800000000000000000000000000003200000000000000000000000000008533333333333333333333333333350400000000000000000000000000027306666666666666666666666666703075555555555555555555555555597165714285714285714285714285755895873015873015873", + "1.000000000000000000000000000009000000000000000000000000000040500000000000000000000000000121500000000000000000000000000273375000000000000000000000000492075000000000000000000000000738112500000000000000000000000949001785714285714285714285715353341294642857142859" + ], + [ + "1", + "1.000000000000000000000000000000100000000000000000000000000000005000000000000000000000000000000166666666666666666666666666666670833333333333333333333333333333416666666666666666666666666666668055555555555555555555555555555575396825396825396825396825396825644842", + "1.000000000000000000000000000000200000000000000000000000000000020000000000000000000000000000001333333333333333333333333333333400000000000000000000000000000002666666666666666666666666666666755555555555555555555555555555558095238095238095238095238095238158730159", + "1.000000000000000000000000000000300000000000000000000000000000045000000000000000000000000000004500000000000000000000000000000337500000000000000000000000000020250000000000000000000000000001012500000000000000000000000000043392857142857142857142857142858770089287", + "1.000000000000000000000000000000400000000000000000000000000000080000000000000000000000000000010666666666666666666666666666667733333333333333333333333333333418666666666666666666666666666672355555555555555555555555555555880634920634920634920634920634936888888889", + "1.000000000000000000000000000000500000000000000000000000000000125000000000000000000000000000020833333333333333333333333333335937500000000000000000000000000260416666666666666666666666666688368055555555555555555555555557105654761904761904761904761904858785962301", + "1.000000000000000000000000000000600000000000000000000000000000180000000000000000000000000000036000000000000000000000000000005400000000000000000000000000000648000000000000000000000000000064800000000000000000000000000005554285714285714285714285714286130857142859", + "1.00000000000000000000000000000070000000000000000000000000000024500000000000000000000000000005716666666666666666666666666667667083333333333333333333333333473391666666666666666666666666683006805555555555555555555555557189569444444444444444444444444587420659722", + "1.000000000000000000000000000000800000000000000000000000000000320000000000000000000000000000085333333333333333333333333333350400000000000000000000000000002730666666666666666666666666667030755555555555555555555555555597165714285714285714285714285718446730158732", + "1.000000000000000000000000000000900000000000000000000000000000405000000000000000000000000000121500000000000000000000000000027337500000000000000000000000004920750000000000000000000000000738112500000000000000000000000094900178571428571428571428571439247698660714" + ], + [ + "1", + "1.000000000000000000000000000000010000000000000000000000000000000050000000000000000000000000000000166666666666666666666666666666667083333333333333333333333333333334166666666666666666666666666666668055555555555555555555555555555557539682539682539682539682539682", + "1.000000000000000000000000000000020000000000000000000000000000000200000000000000000000000000000001333333333333333333333333333333340000000000000000000000000000000026666666666666666666666666666666755555555555555555555555555555555809523809523809523809523809523812", + "1.000000000000000000000000000000030000000000000000000000000000000450000000000000000000000000000004500000000000000000000000000000033750000000000000000000000000000202500000000000000000000000000001012500000000000000000000000000004339285714285714285714285714285728", + "1.000000000000000000000000000000040000000000000000000000000000000800000000000000000000000000000010666666666666666666666666666666773333333333333333333333333333334186666666666666666666666666666672355555555555555555555555555555588063492063492063492063492063492225", + "1.000000000000000000000000000000050000000000000000000000000000001250000000000000000000000000000020833333333333333333333333333333593750000000000000000000000000002604166666666666666666666666666688368055555555555555555555555555710565476190476190476190476190477159", + "1.000000000000000000000000000000060000000000000000000000000000001800000000000000000000000000000036000000000000000000000000000000540000000000000000000000000000006480000000000000000000000000000064800000000000000000000000000000555428571428571428571428571428575594", + "1.00000000000000000000000000000007000000000000000000000000000000245000000000000000000000000000005716666666666666666666666666666766708333333333333333333333333334733916666666666666666666666666683006805555555555555555555555555718956944444444444444444444444445874", + "1.000000000000000000000000000000080000000000000000000000000000003200000000000000000000000000000085333333333333333333333333333335040000000000000000000000000000027306666666666666666666666666667030755555555555555555555555555559716571428571428571428571428571470183", + "1.000000000000000000000000000000090000000000000000000000000000004050000000000000000000000000000121500000000000000000000000000002733750000000000000000000000000049207500000000000000000000000000738112500000000000000000000000009490017857142857142857142857142963907" + ], + [ + "1", + "1.000000000000000000000000000000001000000000000000000000000000000000500000000000000000000000000000000166666666666666666666666666666666708333333333333333333333333333333341666666666666666666666666666666668055555555555555555555555555555555753968253968253968253988", + "1.000000000000000000000000000000002000000000000000000000000000000002000000000000000000000000000000001333333333333333333333333333333334000000000000000000000000000000000266666666666666666666666666666666755555555555555555555555555555555580952380952380952380952383", + "1.00000000000000000000000000000000300000000000000000000000000000000450000000000000000000000000000000450000000000000000000000000000000337500000000000000000000000000000202500000000000000000000000000000101250000000000000000000000000000043392857142857142857142857", + "1.000000000000000000000000000000004000000000000000000000000000000008000000000000000000000000000000010666666666666666666666666666666677333333333333333333333333333333341866666666666666666666666666666672355555555555555555555555555555558806349206349206349206349208", + "1.000000000000000000000000000000005000000000000000000000000000000012500000000000000000000000000000020833333333333333333333333333333359375000000000000000000000000000026041666666666666666666666666666688368055555555555555555555555555571056547619047619047619047618", + "1.00000000000000000000000000000000600000000000000000000000000000001800000000000000000000000000000003600000000000000000000000000000005400000000000000000000000000000006480000000000000000000000000000006480000000000000000000000000000005554285714285714285714285714", + "1.000000000000000000000000000000007000000000000000000000000000000024500000000000000000000000000000057166666666666666666666666666666766708333333333333333333333333333473391666666666666666666666666666830068055555555555555555555555555718956944444444444444444444443", + "1.000000000000000000000000000000008000000000000000000000000000000032000000000000000000000000000000085333333333333333333333333333333504000000000000000000000000000000273066666666666666666666666666667030755555555555555555555555555555971657142857142857142857142858", + "1.000000000000000000000000000000009000000000000000000000000000000040500000000000000000000000000000121500000000000000000000000000000273375000000000000000000000000000492075000000000000000000000000000738112500000000000000000000000000949001785714285714285714285715" + ], + [ + "1", + "1.000000000000000000000000000000000100000000000000000000000000000000005000000000000000000000000000000000166666666666666666666666666666666670833333333333333333333333333333333416666666666666666666666666666666668055555555555555555555555555555555575396825396825398", + "1.000000000000000000000000000000000200000000000000000000000000000000020000000000000000000000000000000001333333333333333333333333333333333400000000000000000000000000000000002666666666666666666666666666666666755555555555555555555555555555555558095238095238095238", + "1.000000000000000000000000000000000300000000000000000000000000000000045000000000000000000000000000000004500000000000000000000000000000000337500000000000000000000000000000020250000000000000000000000000000001012500000000000000000000000000000043392857142857142855", + "1.000000000000000000000000000000000400000000000000000000000000000000080000000000000000000000000000000010666666666666666666666666666666667733333333333333333333333333333333418666666666666666666666666666666672355555555555555555555555555555555880634920634920634923", + "1.000000000000000000000000000000000500000000000000000000000000000000125000000000000000000000000000000020833333333333333333333333333333335937500000000000000000000000000000260416666666666666666666666666666688368055555555555555555555555555557105654761904761904763", + "1.000000000000000000000000000000000600000000000000000000000000000000180000000000000000000000000000000036000000000000000000000000000000005400000000000000000000000000000000648000000000000000000000000000000064800000000000000000000000000000005554285714285714285715", + "1.000000000000000000000000000000000700000000000000000000000000000000245000000000000000000000000000000057166666666666666666666666666666676670833333333333333333333333333334733916666666666666666666666666666830068055555555555555555555555555571895694444444444444448", + "1.000000000000000000000000000000000800000000000000000000000000000000320000000000000000000000000000000085333333333333333333333333333333350400000000000000000000000000000002730666666666666666666666666666667030755555555555555555555555555555597165714285714285714288", + "1.00000000000000000000000000000000090000000000000000000000000000000040500000000000000000000000000000012150000000000000000000000000000002733750000000000000000000000000000492075000000000000000000000000000073811250000000000000000000000000009490017857142857142858" + ] +]; -/***/ }), +;// CONCATENATED MODULE: ./lib/logarithm.js -/***/ 916: -/***/ (function(__unused_webpack_module, exports) { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.RoundingModes = void 0; -var RoundingModes; -(function (RoundingModes) { - /** - * Rounding mode to round towards positive infinity. - */ - RoundingModes[RoundingModes["CEILING"] = 0] = "CEILING"; - /** - * Rounding mode to round towards zero. - */ - RoundingModes[RoundingModes["DOWN"] = 1] = "DOWN"; - /** - * Rounding mode to round towards negative infinity. - */ - RoundingModes[RoundingModes["FLOOR"] = 2] = "FLOOR"; - /** - * Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, - * in which case round down. - */ - RoundingModes[RoundingModes["HALF_DOWN"] = 3] = "HALF_DOWN"; - /** - * Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, - * in which case, round towards the even neighbor. - */ - RoundingModes[RoundingModes["HALF_EVEN"] = 4] = "HALF_EVEN"; - /** - * Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, - * in which case round up. - */ - RoundingModes[RoundingModes["HALF_UP"] = 5] = "HALF_UP"; - /** - * Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary. - * UNIMPLEMENTED - */ - RoundingModes[RoundingModes["UNNECESSARY"] = 6] = "UNNECESSARY"; - /** - * Rounding mode to round away from zero. - */ - RoundingModes[RoundingModes["UP"] = 7] = "UP"; -})(RoundingModes = exports.RoundingModes || (exports.RoundingModes = {})); -/***/ }), -/***/ 859: -/***/ (function(__unused_webpack_module, exports) { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.stripTrailingZero = void 0; -/* -* Removes zero from front and back*/ -function stripTrailingZero(number) { - var isNegative = number[0] === '-'; - if (isNegative) { - number = number.substr(1); - } - while (number[0] == '0') { - number = number.substr(1); + + +const E = round_roundOff('2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921817413596629043572900334295260595630738132328627943490763233829880753195251019011573834187930702154089149934884167509244761460668082264', 257); +const LN2 = '0.69314718055994530941723212145818'; +const LOG2E = '1.44269504088896340735992468100188'; +const LN10 = '2.30258509299404568392825848336901'; +const LOG10E = '0.43429448190325182766805360691429'; +function Euler(precision = 32) { + precision = Math.max(16, precision); + let result = '1'; + let n = '1'; + let f = '1'; + while (true) { + f = multiply_multiply(f, n); + const next = divide_divide('1', f, precision + 2); + if (compareTo_lessThan(abs_abs(next), utils_tolerance(precision))) { + return round_roundOff(result, precision); + } + result = add_add(result, next); + n = add_add(n, '1'); } - if (number.indexOf('.') != -1) { - while (number[number.length - 1] == '0') { - number = number.substr(0, number.length - 1); +} +function exp(exponent) { + exponent = exponent.toString(); + const remainder = exponent.split('.')[1]; + let result = pow(E, abs_abs(exponent).split('.')[0], 33); + let fractionalExponent = '1'; + if (remainder) { + for (let i = 0; i < Math.min(33, remainder.length); i++) { + fractionalExponent = multiply_multiply(fractionalExponent, E_ROOTS_FOR_POW[i][remainder[i]]); } + result = multiply_multiply(result, fractionalExponent); } - if (number == "" || number == ".") { - number = '0'; + return pow(E, exponent, 33); +} +function expm1(exponent) { + exponent = exponent.toString(); + return subtract_subtract(exp(exponent), '1'); +} +function ln(x = 2) { + x = x.toString(); + if (compareTo_lessThan(x, '0', true)) { + throw "[ln]: x must be greater than 0"; } - else if (number[number.length - 1] == '.') { - number = number.substr(0, number.length - 1); + if (equals(x, '1')) { + return '0'; // ln(1) = 0 } - if (number[0] == '.') { - number = '0' + number; + let result = '0'; + let term = divide_divide(subtract_subtract(x, '1'), add_add(x, '1'), 33); + let i = 0; + while (true) { + i++; + let iteration = subtract_subtract(multiply_multiply('2', i), '1'); + let next = multiply_multiply(divide_divide('1', iteration, 33), pow(term, iteration)); + if (compareTo_lessThan(next, utils_tolerance(33))) { + return round_roundOff(multiply_multiply('2', add_add(result, next)), 32); + } + result = add_add(result, next); } - if (isNegative && number != '0') { - number = '-' + number; +} +function ln2(x = 2) { + x = x.toString(); + if (compareTo_lessThan(x, '0', true)) { + throw "[ln2]: x must be greater than 0"; } - return number; + let result = '0'; + while (compareTo_greaterThan(x, '2', true)) { + x = divide_divide(x, 2, 33); + result = add_add(result, '1'); + } + return round_roundOff(add_add(result, divide_divide(ln(x), LN2, 33)), 32); +} +function log(base) { + base = base.toString(); + return round_roundOff(multiply_multiply(ln2(base), LN2), 32); +} +function log10(base) { + base = base.toString(); + return divide_divide(log(base), LN10, 32); } -exports.stripTrailingZero = stripTrailingZero; +;// CONCATENATED MODULE: ./lib/trig.js -/***/ }), -/***/ 26: -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.negate = exports.subtract = void 0; -var add_1 = __webpack_require__(217); -function subtract(number1, number2) { - number1 = number1.toString(); - number2 = number2.toString(); - number2 = negate(number2); - return (0, add_1.add)(number1, number2); + + + + + + + +// PI up to the first 64 decimal places +const PI = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229'; +// Hypotenuse +function hypot(a, b) { + a = a.toString(); + b = b.toString(); + return sqRoot(add_add(pow(a, '2'), add_add(pow(b, '2')))); } -exports.subtract = subtract; -function negate(number) { - if (number[0] == '-') { - number = number.substr(1); +// Sine functions +function sin(x) { + x = x.toString(); + if (compareTo_greaterThan(abs_abs(x), PI)) { + let r = divide_divide(x, PI, 33).split('.'); + x = stripTrailingZero_stripTrailingZero(round_roundOff(multiply_multiply(pow(subtract_negate(sign(x).toString()), r[0]), multiply_multiply(PI, (r[1]) ? '0.' + r[1] : '0')), 32)); } - else { - number = '-' + number; + let result = '0'; + let _sign = '1'; + let n = '1'; // Series iteration + let f = '1'; // Factorial product + while (true) { + const N = subtract_subtract(multiply_multiply(n, '2'), '1'); // Next real term in series (even terms cancel) + f = multiply_multiply(f, N); + const next = multiply_multiply(_sign, divide_divide(pow(x, N, 33), f, 34)); + if (compareTo_lessThan(abs_abs(next), utils_tolerance(33))) { + result = add_add(result, next); + return stripTrailingZero_stripTrailingZero(isAproxZero(result) ? '0' : isAproxOne(result) ? multiply_multiply('1', sign(result).toString()) : result); + } + result = add_add(result, next); + _sign = subtract_negate(_sign); + f = multiply_multiply(f, multiply_multiply(n, '2')); // Iterate once to synchronize Factorial + n = add_add(n, '1'); } - return number; } -exports.negate = negate; +function asin(x) { + x = x.toString(); + if (compareTo_greaterThan(abs_abs(x), '1')) { + throw Error('[Arcsine]: argument x is out of range.'); + } + let result = '0'; + let n = '1'; + let even = '1'; + let odd = '1'; + while (true) { + const N = multiply_multiply(n, '2'); + const R = add_add(N, '1'); + even = multiply_multiply(even, N); + odd = multiply_multiply(odd, subtract_subtract(N, '1')); + let next = divide_divide(multiply_multiply(odd, pow(x, R)), multiply_multiply(even, R), 34); + if (compareTo_lessThan(next, utils_tolerance(33))) { + result = add_add(result, next); + return stripTrailingZero_stripTrailingZero(round_roundOff(add_add(result, x), 32)); + } + result = add_add(result, next); + n = add_add(n, '1'); + } +} +function sinh(x) { + x = x.toString(); + return stripTrailingZero_stripTrailingZero(subtract_subtract(divide_divide(exp(x), '2', 33), divide_divide(exp(subtract_negate(x)), '2', 33))); +} +// Cosine functions +function cos(x) { + x = x.toString(); + if (compareTo_greaterThan(abs_abs(x), PI)) { + let r = divide_divide(x, PI, 33).split('.'); + x = stripTrailingZero_stripTrailingZero(round_roundOff(multiply_multiply(pow(subtract_negate(sign(x).toString()), r[0]), multiply_multiply(PI, (r[1]) ? '0.' + r[1] : '0')), 32)); + } + let result = '0'; + let _sign = '1'; + let n = '1'; // Series iteration + let f = '1'; // Factorial product + while (true) { + const N = multiply_multiply(n, '2'); // Next real term in series (odd terms cancel) + f = multiply_multiply(f, subtract_subtract(N, '1')); // Iterate once to synchronize Factorial + f = multiply_multiply(f, N); + const next = multiply_multiply(_sign, divide_divide(pow(x, N, 33), f, 34)); + if (compareTo_lessThan(abs_abs(next), utils_tolerance(33))) { + result = subtract_subtract('1', add_add(result, next)); + return stripTrailingZero_stripTrailingZero(isAproxOne(result) ? multiply_multiply('1', sign(result).toString()) : isAproxZero(result) ? '0' : result); + } + result = add_add(result, next); + _sign = subtract_negate(_sign); + n = add_add(n, '1'); + } +} +function acos(x) { + x = x.toString(); + if (compareTo_greaterThan(abs_abs(x), '1')) { + throw Error('[Arccosine]: argument x is out of range.'); + } + return stripTrailingZero_stripTrailingZero(subtract_subtract(divide_divide(PI, 2, 32), asin(x))); +} +function cosh(x) { + x = x.toString(); + return stripTrailingZero_stripTrailingZero(divide_divide(add_add(exp(x), exp(subtract_negate(x))), '2', 32)); +} +// Tangant functions +function tan(x) { + x = x.toString(); + return stripTrailingZero_stripTrailingZero(divide_divide(sin(x), cos(x), 32)); +} +function atan(x) { + x = x.toString(); + if (compareTo_greaterThan(abs_abs(x), '1')) { + return stripTrailingZero_stripTrailingZero(subtract_subtract(divide_divide(PI, 2, 33), atan(divide_divide(1, x, 33)))); + } + let result = '0'; + let n = '0'; + while (true) { + let N = multiply_multiply('2', n); + let next = divide_divide(multiply_multiply(pow('-1', n), pow(x, add_add(N, '1'))), add_add(N, '1'), 32); + if (compareTo_lessThan(abs_abs(next), utils_tolerance(33))) { + return stripTrailingZero_stripTrailingZero(round_roundOff(add_add(result, next), 32)); + } + result = add_add(result, next); + n = add_add(n, '1'); + } +} +function atan2(y, x) { + x = x.toString(); + y = y.toString(); + let offset = '0'; + if (isExatclyZero(x) && isExatclyZero(y)) { + return '0'; + } + if (isExatclyZero(x) && compareTo_greaterThan(y, '0')) { + return stripTrailingZero_stripTrailingZero(round_roundOff(divide_divide(PI, 2, 33), 32)); + } + if (isExatclyZero(x) && compareTo_lessThan(y, '0')) { + return stripTrailingZero_stripTrailingZero(round_roundOff(subtract_negate(divide_divide(PI, 2, 33)), 32)); + } + if (compareTo_lessThan(x, '0')) { + offset = (compareTo_greaterThan(y, '0', true)) ? PI : subtract_negate(PI); + } + return stripTrailingZero_stripTrailingZero(round_roundOff(add_add(atan(divide_divide(y, x, 33)), offset), 32)); +} +function tanh(x) { + x = x.toString(); + return stripTrailingZero_stripTrailingZero(divide_divide(sinh(x), cosh(x), 32)); +} +;// CONCATENATED MODULE: ./lib/big-decimal.js -/***/ }) -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. -!function() { -var exports = __webpack_exports__; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -var add_1 = __webpack_require__(217); -var abs_1 = __webpack_require__(165); -var round_1 = __webpack_require__(350); -var multiply_1 = __webpack_require__(182); -var divide_1 = __webpack_require__(415); -var modulus_1 = __webpack_require__(213); -var compareTo_1 = __webpack_require__(664); -var subtract_1 = __webpack_require__(26); -var roundingModes_1 = __webpack_require__(916); -var stripTrailingZero_1 = __webpack_require__(859); -var bigDecimal = /** @class */ (function () { - function bigDecimal(number) { - if (number === void 0) { number = "0"; } - this.value = bigDecimal.validate(number); - } - bigDecimal.validate = function (number) { + + + + + + + + + + + + +class bigDecimal { + value; + static RoundingModes = RoundingModes; + static validate(number) { if (number) { number = number.toString(); - if (isNaN(number)) + if (isNaN(Number(number))) throw Error("Parameter is not a number: " + number); if (number[0] == "+") number = number.substring(1); @@ -726,48 +1789,50 @@ var bigDecimal = /** @class */ (function () { if (number.startsWith(".")) number = "0" + number; else if (number.startsWith("-.")) - number = "-0" + number.substr(1); - //handle exponentiation + number = "-0" + number.substring(1); + //handle exponentiation (scientific notation) if (/e/i.test(number)) { - var _a = number.split(/[eE]/), mantisa = _a[0], exponent = _a[1]; - mantisa = (0, add_1.trim)(mantisa); - var sign = ""; + let [mantisa, exponent] = number.split(/[eE]/); + let exponentIndex = Number(exponent); + mantisa = trim(mantisa); + let sign = ""; if (mantisa[0] == "-") { sign = "-"; mantisa = mantisa.substring(1); } if (mantisa.indexOf(".") >= 0) { - exponent = parseInt(exponent) + mantisa.indexOf("."); + exponentIndex = parseInt(exponent) + mantisa.indexOf("."); mantisa = mantisa.replace(".", ""); } else { - exponent = parseInt(exponent) + mantisa.length; + exponentIndex = parseInt(exponent) + mantisa.length; } - if (mantisa.length < exponent) { + if (mantisa.length < exponentIndex) { number = - sign + mantisa + new Array(exponent - mantisa.length + 1).join("0"); + sign + mantisa + new Array(exponentIndex - mantisa.length + 1).join("0"); } - else if (mantisa.length >= exponent && exponent > 0) { + else if (mantisa.length >= exponentIndex && exponentIndex > 0) { number = sign + - (0, add_1.trim)(mantisa.substring(0, exponent)) + - (mantisa.length > exponent ? "." + mantisa.substring(exponent) : ""); + trim(mantisa.substring(0, exponentIndex)) + + (mantisa.length > exponentIndex ? "." + mantisa.substring(exponentIndex) : ""); } else { - number = sign + "0." + new Array(-exponent + 1).join("0") + mantisa; + number = sign + "0." + new Array(-exponentIndex + 1).join("0") + mantisa; } } return number; - }; - bigDecimal.prototype.getValue = function () { + } + constructor(number = "0") { + this.value = bigDecimal.validate(number); + } + getValue() { return this.value; - }; - bigDecimal.prototype.setValue = function (num) { + } + setValue(num) { this.value = bigDecimal.validate(num); - }; - bigDecimal.getPrettyValue = function (number, digits, separator) { - if (digits === void 0) { digits = 3; } - if (separator === void 0) { separator = ","; } + } + static getPrettyValue(number, digits = 3, separator = ",") { // if (!(digits || separator)) { // digits = 3; // separator = ','; @@ -775,7 +1840,7 @@ var bigDecimal = /** @class */ (function () { // throw Error('Illegal Arguments. Should pass both digits and separator or pass none'); // } number = bigDecimal.validate(number); - var neg = number.charAt(0) == "-"; + let neg = number.charAt(0) == "-"; if (neg) number = number.substring(1); var len = number.indexOf("."); @@ -794,123 +1859,293 @@ var bigDecimal = /** @class */ (function () { temp; } return (neg ? "-" : "") + temp + number.substring(len); - }; - bigDecimal.prototype.getPrettyValue = function (digits, separator) { - if (digits === void 0) { digits = 3; } - if (separator === void 0) { separator = ","; } + } + getPrettyValue(digits = 3, separator = ",") { return bigDecimal.getPrettyValue(this.value, digits, separator); - }; - bigDecimal.round = function (number, precision, mode) { - if (precision === void 0) { precision = 0; } - if (mode === void 0) { mode = roundingModes_1.RoundingModes.HALF_EVEN; } + } + static round(number, precision = 0, mode = RoundingModes.HALF_EVEN) { number = bigDecimal.validate(number); // console.log(number) if (isNaN(precision)) throw Error("Precision is not a number: " + precision); - return (0, round_1.roundOff)(number, precision, mode); - }; - bigDecimal.prototype.round = function (precision, mode) { - if (precision === void 0) { precision = 0; } - if (mode === void 0) { mode = roundingModes_1.RoundingModes.HALF_EVEN; } + return round_roundOff(number, precision, mode); + } + round(precision = 0, mode = RoundingModes.HALF_EVEN) { if (isNaN(precision)) throw Error("Precision is not a number: " + precision); - return new bigDecimal((0, round_1.roundOff)(this.value, precision, mode)); - }; - bigDecimal.abs = function (number) { + return new bigDecimal(round_roundOff(this.value, precision, mode)); + } + static abs(number) { number = bigDecimal.validate(number); - return (0, abs_1.abs)(number); - }; - bigDecimal.prototype.abs = function () { - return new bigDecimal((0, abs_1.abs)(this.value)); - }; - bigDecimal.floor = function (number) { + return abs_abs(number); + } + abs() { + return new bigDecimal(abs_abs(this.value)); + } + static floor(number) { number = bigDecimal.validate(number); if (number.indexOf(".") === -1) return number; - return bigDecimal.round(number, 0, roundingModes_1.RoundingModes.FLOOR); - }; - bigDecimal.prototype.floor = function () { + return bigDecimal.round(number, 0, RoundingModes.FLOOR); + } + floor() { if (this.value.indexOf(".") === -1) return new bigDecimal(this.value); - return new bigDecimal(this.value).round(0, roundingModes_1.RoundingModes.FLOOR); - }; - bigDecimal.ceil = function (number) { + return new bigDecimal(this.value).round(0, RoundingModes.FLOOR); + } + static ceil(number) { number = bigDecimal.validate(number); if (number.indexOf(".") === -1) return number; - return bigDecimal.round(number, 0, roundingModes_1.RoundingModes.CEILING); - }; - bigDecimal.prototype.ceil = function () { + return bigDecimal.round(number, 0, RoundingModes.CEILING); + } + ceil() { if (this.value.indexOf(".") === -1) return new bigDecimal(this.value); - return new bigDecimal(this.value).round(0, roundingModes_1.RoundingModes.CEILING); - }; - bigDecimal.add = function (number1, number2) { + return new bigDecimal(this.value).round(0, RoundingModes.CEILING); + } + static add(number1, number2) { number1 = bigDecimal.validate(number1); number2 = bigDecimal.validate(number2); - return (0, add_1.add)(number1, number2); - }; - bigDecimal.prototype.add = function (number) { - return new bigDecimal((0, add_1.add)(this.value, number.getValue())); - }; - bigDecimal.subtract = function (number1, number2) { + return add_add(number1, number2); + } + add(number) { + return new bigDecimal(add_add(this.value, number.getValue())); + } + static subtract(number1, number2) { number1 = bigDecimal.validate(number1); number2 = bigDecimal.validate(number2); - return (0, subtract_1.subtract)(number1, number2); - }; - bigDecimal.prototype.subtract = function (number) { - return new bigDecimal((0, subtract_1.subtract)(this.value, number.getValue())); - }; - bigDecimal.multiply = function (number1, number2) { + return subtract_subtract(number1, number2); + } + subtract(number) { + return new bigDecimal(subtract_subtract(this.value, number.getValue())); + } + static multiply(number1, number2) { number1 = bigDecimal.validate(number1); number2 = bigDecimal.validate(number2); - return (0, multiply_1.multiply)(number1, number2); - }; - bigDecimal.prototype.multiply = function (number) { - return new bigDecimal((0, multiply_1.multiply)(this.value, number.getValue())); - }; - bigDecimal.divide = function (number1, number2, precision) { + return multiply_multiply(number1, number2); + } + multiply(number) { + return new bigDecimal(multiply_multiply(this.value, number.getValue())); + } + static divide(number1, number2, precision) { number1 = bigDecimal.validate(number1); number2 = bigDecimal.validate(number2); - return (0, divide_1.divide)(number1, number2, precision); - }; - bigDecimal.prototype.divide = function (number, precision) { - return new bigDecimal((0, divide_1.divide)(this.value, number.getValue(), precision)); - }; - bigDecimal.modulus = function (number1, number2) { + return divide_divide(number1, number2, precision); + } + divide(number, precision) { + return new bigDecimal(divide_divide(this.value, number.getValue(), precision)); + } + static modulus(number1, number2) { number1 = bigDecimal.validate(number1); number2 = bigDecimal.validate(number2); - return (0, modulus_1.modulus)(number1, number2); - }; - bigDecimal.prototype.modulus = function (number) { - return new bigDecimal((0, modulus_1.modulus)(this.value, number.getValue())); - }; - bigDecimal.compareTo = function (number1, number2) { + return modulus(number1, number2); + } + modulus(number) { + return new bigDecimal(modulus(this.value, number.getValue())); + } + static modulusE(number1, number2) { number1 = bigDecimal.validate(number1); number2 = bigDecimal.validate(number2); - return (0, compareTo_1.compareTo)(number1, number2); - }; - bigDecimal.prototype.compareTo = function (number) { - return (0, compareTo_1.compareTo)(this.value, number.getValue()); - }; - bigDecimal.negate = function (number) { + return modulusE(number1, number2); + } + modulusE(number) { + return new bigDecimal(modulusE(this.value, number.getValue())); + } + static negate(number) { number = bigDecimal.validate(number); - return (0, subtract_1.negate)(number); - }; - bigDecimal.prototype.negate = function () { - return new bigDecimal((0, subtract_1.negate)(this.value)); - }; - bigDecimal.stripTrailingZero = function (number) { + return subtract_negate(number); + } + negate() { + return new bigDecimal(subtract_negate(this.value)); + } + // Powers + static pow(base, exponent) { + base = bigDecimal.validate(base); + exponent = bigDecimal.validate(exponent); + return pow(base, exponent); + } + pow(exponent) { + return new bigDecimal(pow(this.value, exponent.getValue(), 32)); + } + // Roots + static get SQRT1_2() { + return sqRoot('.5'); + } + static get SQRT2() { + return sqRoot('2'); + } + static sqRoot(number) { number = bigDecimal.validate(number); - return (0, stripTrailingZero_1.stripTrailingZero)(number); - }; - bigDecimal.prototype.stripTrailingZero = function () { - return new bigDecimal((0, stripTrailingZero_1.stripTrailingZero)(this.value)); - }; - bigDecimal.RoundingModes = roundingModes_1.RoundingModes; - return bigDecimal; -}()); -exports["default"] = bigDecimal; + return sqRoot(number); + } + sqRoot() { + return new bigDecimal(sqRoot(this.value)); + } + static cbRoot(number) { + number = bigDecimal.validate(number); + return cbRoot(number); + } + cbRoot() { + return new bigDecimal(cbRoot(this.value)); + } + // Logarithms + static get E() { + return Euler(32); + } + static get LN2() { + return LN2; + } + static get LN10() { + return LN10; + } + static get LOG2E() { + return LOG2E; + } + static get LOG10E() { + return LOG10E; + } + static log2(number) { + number = bigDecimal.validate(number); + return ln2(number); + } + static log10(number) { + number = bigDecimal.validate(number); + return log10(number); + } + static log1p(number) { + number = bigDecimal.validate(number); + return log(add_add('1', number)); + } + static log(number) { + number = bigDecimal.validate(number); + return log(number); + } + static exp(number) { + number = bigDecimal.validate(number); + return exp(number); + } + static expm1(number) { + number = bigDecimal.validate(number); + return expm1(number); + } + // Trig + static hypot(a, b) { + a = bigDecimal.validate(a); + b = bigDecimal.validate(b); + return hypot(a, b); + } + static sin(number) { + number = bigDecimal.validate(number); + return sin(number); + } + static sinh(number) { + number = bigDecimal.validate(number); + return sinh(number); + } + static asin(number) { + number = bigDecimal.validate(number); + return asin(number); + } + static cos(number) { + number = bigDecimal.validate(number); + return cos(number); + } + static cosh(number) { + number = bigDecimal.validate(number); + return cosh(number); + } + static acos(number) { + number = bigDecimal.validate(number); + return acos(number); + } + static tan(number) { + number = bigDecimal.validate(number); + return tan(number); + } + static tanh(number) { + number = bigDecimal.validate(number); + return tanh(number); + } + static atan(number) { + number = bigDecimal.validate(number); + return atan(number); + } + static atan2(y, x) { + x = bigDecimal.validate(x); + y = bigDecimal.validate(y); + return atan2(y, x); + } + // Comparisons + static compareTo(number1, number2) { + number1 = bigDecimal.validate(number1); + number2 = bigDecimal.validate(number2); + return compareTo(number1, number2); + } + compareTo(number) { + return compareTo(this.value, number.getValue()); + } + static equals(number1, number2) { + number1 = bigDecimal.validate(number1); + number2 = bigDecimal.validate(number2); + return equals(number1, number2); + } + equals(number) { + return equals(this.value, number.getValue()); + } + static lt(number1, number2) { + number1 = bigDecimal.validate(number1); + number2 = bigDecimal.validate(number2); + return compareTo_lessThan(number1, number2); + } + lt(number) { + return compareTo_lessThan(this.value, number.getValue()); + } + static leq(number1, number2) { + number1 = bigDecimal.validate(number1); + number2 = bigDecimal.validate(number2); + return compareTo_lessThan(number1, number2, true); + } + leq(number) { + return compareTo_lessThan(this.value, number.getValue(), true); + } + static gt(number1, number2) { + number1 = bigDecimal.validate(number1); + number2 = bigDecimal.validate(number2); + return compareTo_greaterThan(number1, number2); + } + gt(number) { + return compareTo_greaterThan(this.value, number.getValue()); + } + static geq(number1, number2) { + number1 = bigDecimal.validate(number1); + number2 = bigDecimal.validate(number2); + return compareTo_greaterThan(number1, number2, true); + } + geq(number) { + return compareTo_greaterThan(this.value, number.getValue(), true); + } + static sign(number) { + number = bigDecimal.validate(number); + return sign(number); + } + sign() { + return sign(this.value); + } + // Misc. + static factorial(number) { + number = bigDecimal.validate(number); + return factorial(number); + } + static stripTrailingZero(number) { + number = bigDecimal.validate(number); + return stripTrailingZero_stripTrailingZero(number); + } + stripTrailingZero() { + return new bigDecimal(stripTrailingZero_stripTrailingZero(this.value)); + } +} +/* harmony default export */ var big_decimal = (bigDecimal); }(); bigDecimal = __webpack_exports__; diff --git a/dist/web/js-big-decimal.min.js b/dist/web/js-big-decimal.min.js index 23115af..4adb87b 100644 --- a/dist/web/js-big-decimal.min.js +++ b/dist/web/js-big-decimal.min.js @@ -1 +1 @@ -var bigDecimal;!function(){"use strict";var e={165:function(e,n){Object.defineProperty(n,"__esModule",{value:!0}),n.abs=void 0,n.abs=function(e){return"number"!=typeof e&&"bigint"!=typeof e||(e=e.toString()),"-"==e[0]?e.substring(1):e}},217:function(e,n){function t(e){if(u(e))return e;for(var n="",t=e.length,r=e.split(".")[1],i=r?r.length:0,a=0;a="0"&&e[a]<="9"?n+=9-parseInt(e[a]):n+=e[a];return o(n,i>0?"0."+new Array(i).join("0")+"1":"1")}function r(e){var n=e.split(".");for(n[0]||(n[0]="0");"0"==n[0][0]&&n[0].length>1;)n[0]=n[0].substring(1);return n[0]+(n[1]?"."+n[1]:"")}function i(e,n){var t=e.split("."),r=n.split("."),i=t[0].length,o=r[0].length;return i>o?r[0]=new Array(Math.abs(i-o)+1).join("0")+(r[0]?r[0]:""):t[0]=new Array(Math.abs(i-o)+1).join("0")+(t[0]?t[0]:""),i=t[1]?t[1].length:0,o=r[1]?r[1].length:0,(i||o)&&(i>o?r[1]=(r[1]?r[1]:"")+new Array(Math.abs(i-o)+1).join("0"):t[1]=(t[1]?t[1]:"")+new Array(Math.abs(i-o)+1).join("0")),[e=t[0]+(t[1]?"."+t[1]:""),n=r[0]+(r[1]?"."+r[1]:"")]}function o(e,n){var t;e=(t=i(e,n))[0],n=t[1];for(var r="",o=0,u=e.length-1;u>=0;u--)if("."!==e[u]){var a=parseInt(e[u])+parseInt(n[u])+o;r=a%10+r,o=Math.floor(a/10)}else r="."+r;return o?o.toString()+r:r}function u(e){return/^0[0]*[.]{0,1}[0]*$/.test(e)}Object.defineProperty(n,"__esModule",{value:!0}),n.pad=n.trim=n.add=void 0,n.add=function(e,n){var a;void 0===n&&(n="0");var s=0,d=-1;"-"==e[0]&&(u(e=e.substring(1))||(s++,d=1,e.length)),"-"==n[0]&&(u(n=n.substring(1))||(s++,d=2,n.length)),e=r(e),n=r(n),e=(a=i(r(e),r(n)))[0],n=a[1],1==s&&(1===d?e=t(e):2===d&&(n=t(n)));var l=o(e,n);return s?2==s?"-"+r(l):e.lengthn[a]?u?-1:1:u?1:-1;return 0}},415:function(e,n,t){Object.defineProperty(n,"__esModule",{value:!0}),n.divide=void 0;var r=t(217),i=t(350);n.divide=function(e,n,t){if(void 0===t&&(t=8),0==n)throw new Error("Cannot divide by 0");if(e=e.toString(),n=n.toString(),e=e.replace(/(\.\d*?[1-9])0+$/g,"$1").replace(/\.0+$/,""),n=n.replace(/(\.\d*?[1-9])0+$/g,"$1").replace(/\.0+$/,""),0==e)return"0";var o=0;"-"==n[0]&&(n=n.substring(1),o++),"-"==e[0]&&(e=e.substring(1),o++);var u=n.indexOf(".")>0?n.length-n.indexOf(".")-1:-1;if(n=(0,r.trim)(n.replace(".","")),u>=0){var a=e.indexOf(".")>0?e.length-e.indexOf(".")-1:-1;if(-1==a)e=(0,r.trim)(e+new Array(u+1).join("0"));else if(u>a)e=e.replace(".",""),e=(0,r.trim)(e+new Array(u-a+1).join("0"));else if(u-1&&e.indexOf(".")-1&&e.indexOf(".")-1){var v=g.length-g.indexOf(".")-1;l>(g=g.replace(".","")).length&&(v+=l-g.length,g+=new Array(l-g.length+1).join("0")),d=v,f="0."+new Array(v).join("0")}for(t+=2;d<=t;){for(var p=0;parseInt(g)>=parseInt(n);)g=(0,r.add)(g,"-"+n),p++;f+=p,e?("."==e[0]&&(f+=".",d++,e=e.substring(1)),g+=e.substring(0,1),e=e.substring(1)):(d||(f+="."),d++,g+="0")}return(1==o?"-":"")+(0,r.trim)((0,i.roundOff)(f,t-2))}},213:function(e,n,t){Object.defineProperty(n,"__esModule",{value:!0}),n.modulus=void 0;var r=t(415),i=t(350),o=t(182),u=t(26),a=t(916);function s(e){if(-1!=e.indexOf("."))throw new Error("Modulus of non-integers not supported")}n.modulus=function(e,n){if(0==n)throw new Error("Cannot divide by 0");e=e.toString(),n=n.toString(),s(e),s(n);var t="";return"-"==e[0]&&(t="-",e=e.substr(1)),"-"==n[0]&&(n=n.substr(1)),t+(0,u.subtract)(e,(0,o.multiply)(n,(0,i.roundOff)((0,r.divide)(e,n),0,a.RoundingModes.FLOOR)))}},182:function(e,n,t){Object.defineProperty(n,"__esModule",{value:!0}),n.multiply=void 0;var r=t(859);n.multiply=function(e,n){e=e.toString(),n=n.toString();var t=0;"-"==e[0]&&(t++,e=e.substr(1)),"-"==n[0]&&(t++,n=n.substr(1)),e=(0,r.stripTrailingZero)(e),n=(0,r.stripTrailingZero)(n);var i=0,o=0;-1!=e.indexOf(".")&&(i=e.length-e.indexOf(".")-1),-1!=n.indexOf(".")&&(o=n.length-n.indexOf(".")-1);var u=i+o;if(e=(0,r.stripTrailingZero)(e.replace(".","")),n=(0,r.stripTrailingZero)(n.replace(".","")),e.length=v&&b>=0;b--)g[b]>-1&&g[b]=s.length?new Array(d-s.length+1).join("0")+s:s).substr(0,s.length-d)+"."+s.substr(s.length-d,d))),1==t&&(p="-"+p),p}},350:function(e,n,t){Object.defineProperty(n,"__esModule",{value:!0}),n.roundOff=void 0;var r=t(916);function i(e,n,t,i){if(!e||e===new Array(e.length+1).join("0"))return!1;if(i===r.RoundingModes.DOWN||!t&&i===r.RoundingModes.FLOOR||t&&i===r.RoundingModes.CEILING)return!1;if(i===r.RoundingModes.UP||t&&i===r.RoundingModes.FLOOR||!t&&i===r.RoundingModes.CEILING)return!0;var o="5"+new Array(e.length).join("0");if(e>o)return!0;if(e=0;r--){var i=parseInt(e[r])+n;10==i?(n=1,i=0):n=0,t+=i}return n&&(t+=n),t.split("").reverse().join("")}n.roundOff=function e(n,t,u){if(void 0===t&&(t=0),void 0===u&&(u=r.RoundingModes.HALF_EVEN),u===r.RoundingModes.UNNECESSARY)throw new Error("UNNECESSARY Rounding Mode has not yet been implemented");"number"!=typeof n&&"bigint"!=typeof n||(n=n.toString());var a=!1;"-"===n[0]&&(a=!0,n=n.substring(1));var s=n.split("."),d=s[0],l=s[1];if(t<0){if(t=-t,d.length<=t)return"0";var f=d.substr(0,d.length-t);return(a?"-":"")+(f=e(n=f+"."+d.substr(d.length-t)+l,0,u))+new Array(t+1).join("0")}if(0==t){d.length;return i(s[1],d,a,u)&&(d=o(d)),(a&&parseInt(d)?"-":"")+d}if(!s[1])return(a?"-":"")+d+"."+new Array(t+1).join("0");if(s[1].lengtht?(a?"-":"")+o(d,parseInt(l[0]))+"."+l.substring(1):(a&&(parseInt(d)||parseInt(l))?"-":"")+d+"."+l}},916:function(e,n){Object.defineProperty(n,"__esModule",{value:!0}),n.RoundingModes=void 0,function(e){e[e.CEILING=0]="CEILING",e[e.DOWN=1]="DOWN",e[e.FLOOR=2]="FLOOR",e[e.HALF_DOWN=3]="HALF_DOWN",e[e.HALF_EVEN=4]="HALF_EVEN",e[e.HALF_UP=5]="HALF_UP",e[e.UNNECESSARY=6]="UNNECESSARY",e[e.UP=7]="UP"}(n.RoundingModes||(n.RoundingModes={}))},859:function(e,n){Object.defineProperty(n,"__esModule",{value:!0}),n.stripTrailingZero=void 0,n.stripTrailingZero=function(e){var n="-"===e[0];for(n&&(e=e.substr(1));"0"==e[0];)e=e.substr(1);if(-1!=e.indexOf("."))for(;"0"==e[e.length-1];)e=e.substr(0,e.length-1);return""==e||"."==e?e="0":"."==e[e.length-1]&&(e=e.substr(0,e.length-1)),"."==e[0]&&(e="0"+e),n&&"0"!=e&&(e="-"+e),e}},26:function(e,n,t){Object.defineProperty(n,"__esModule",{value:!0}),n.negate=n.subtract=void 0;var r=t(217);function i(e){return e="-"==e[0]?e.substr(1):"-"+e}n.subtract=function(e,n){return e=e.toString(),n=i(n=n.toString()),(0,r.add)(e,n)},n.negate=i}},n={};function t(r){var i=n[r];if(void 0!==i)return i.exports;var o=n[r]={exports:{}};return e[r](o,o.exports,t),o.exports}var r={};!function(){var e=r;Object.defineProperty(e,"__esModule",{value:!0});var n=t(217),i=t(165),o=t(350),u=t(182),a=t(415),s=t(213),d=t(664),l=t(26),f=t(916),g=t(859),v=function(){function e(n){void 0===n&&(n="0"),this.value=e.validate(n)}return e.validate=function(e){if(e){if(e=e.toString(),isNaN(e))throw Error("Parameter is not a number: "+e);"+"==e[0]&&(e=e.substring(1))}else e="0";if(e.startsWith(".")?e="0"+e:e.startsWith("-.")&&(e="-0"+e.substr(1)),/e/i.test(e)){var t=e.split(/[eE]/),r=t[0],i=t[1],o="";"-"==(r=(0,n.trim)(r))[0]&&(o="-",r=r.substring(1)),r.indexOf(".")>=0?(i=parseInt(i)+r.indexOf("."),r=r.replace(".","")):i=parseInt(i)+r.length,e=r.length=i&&i>0?o+(0,n.trim)(r.substring(0,i))+(r.length>i?"."+r.substring(i):""):o+"0."+new Array(1-i).join("0")+r}return e},e.prototype.getValue=function(){return this.value},e.prototype.setValue=function(n){this.value=e.validate(n)},e.getPrettyValue=function(n,t,r){void 0===t&&(t=3),void 0===r&&(r=",");var i="-"==(n=e.validate(n)).charAt(0);i&&(n=n.substring(1));for(var o=n.indexOf("."),u="",a=o=o>0?o:n.length;a>0;)a=0?r:"")+u;return(i?"-":"")+u+n.substring(o)},e.prototype.getPrettyValue=function(n,t){return void 0===n&&(n=3),void 0===t&&(t=","),e.getPrettyValue(this.value,n,t)},e.round=function(n,t,r){if(void 0===t&&(t=0),void 0===r&&(r=f.RoundingModes.HALF_EVEN),n=e.validate(n),isNaN(t))throw Error("Precision is not a number: "+t);return(0,o.roundOff)(n,t,r)},e.prototype.round=function(n,t){if(void 0===n&&(n=0),void 0===t&&(t=f.RoundingModes.HALF_EVEN),isNaN(n))throw Error("Precision is not a number: "+n);return new e((0,o.roundOff)(this.value,n,t))},e.abs=function(n){return n=e.validate(n),(0,i.abs)(n)},e.prototype.abs=function(){return new e((0,i.abs)(this.value))},e.floor=function(n){return-1===(n=e.validate(n)).indexOf(".")?n:e.round(n,0,f.RoundingModes.FLOOR)},e.prototype.floor=function(){return-1===this.value.indexOf(".")?new e(this.value):new e(this.value).round(0,f.RoundingModes.FLOOR)},e.ceil=function(n){return-1===(n=e.validate(n)).indexOf(".")?n:e.round(n,0,f.RoundingModes.CEILING)},e.prototype.ceil=function(){return-1===this.value.indexOf(".")?new e(this.value):new e(this.value).round(0,f.RoundingModes.CEILING)},e.add=function(t,r){return t=e.validate(t),r=e.validate(r),(0,n.add)(t,r)},e.prototype.add=function(t){return new e((0,n.add)(this.value,t.getValue()))},e.subtract=function(n,t){return n=e.validate(n),t=e.validate(t),(0,l.subtract)(n,t)},e.prototype.subtract=function(n){return new e((0,l.subtract)(this.value,n.getValue()))},e.multiply=function(n,t){return n=e.validate(n),t=e.validate(t),(0,u.multiply)(n,t)},e.prototype.multiply=function(n){return new e((0,u.multiply)(this.value,n.getValue()))},e.divide=function(n,t,r){return n=e.validate(n),t=e.validate(t),(0,a.divide)(n,t,r)},e.prototype.divide=function(n,t){return new e((0,a.divide)(this.value,n.getValue(),t))},e.modulus=function(n,t){return n=e.validate(n),t=e.validate(t),(0,s.modulus)(n,t)},e.prototype.modulus=function(n){return new e((0,s.modulus)(this.value,n.getValue()))},e.compareTo=function(n,t){return n=e.validate(n),t=e.validate(t),(0,d.compareTo)(n,t)},e.prototype.compareTo=function(e){return(0,d.compareTo)(this.value,e.getValue())},e.negate=function(n){return n=e.validate(n),(0,l.negate)(n)},e.prototype.negate=function(){return new e((0,l.negate)(this.value))},e.stripTrailingZero=function(n){return n=e.validate(n),(0,g.stripTrailingZero)(n)},e.prototype.stripTrailingZero=function(){return new e((0,g.stripTrailingZero)(this.value))},e.RoundingModes=f.RoundingModes,e}();e.default=v}(),bigDecimal=r}(); \ No newline at end of file +var bigDecimal;!function(){"use strict";var t={d:function(e,r){for(var i in r)t.o(r,i)&&!t.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:r[i]})},o:function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r:function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};!function(){function r(t,e="0"){let r,o=0,s=-1;"-"==t[0]&&(u(t=t.substring(1))||(o++,s=1,r=t.length)),"-"==e[0]&&(u(e=e.substring(1))||(o++,s=2,r=e.length)),t=n(t),e=n(e),[t,e]=a(n(t),n(e)),1==o&&(1===s?t=i(t):2===s&&(e=i(e)));let g=l(t,e);return o?2==o?"-"+n(g):t.length="0"&&t[i]<="9"?e+=9-parseInt(t[i]):e+=t[i];return l(e,n>0?"0."+new Array(n).join("0")+"1":"1")}function n(t){let e=t.split(".");for(e[0]||(e[0]="0");"0"==e[0][0]&&e[0].length>1;)e[0]=e[0].substring(1);return e[0]+(e[1]?"."+e[1]:"")}function a(t,e){let r=t.split("."),i=e.split("."),n=Math.max(r[0].length,i[0].length);return r[0]=r[0].padStart(n,"0"),i[0]=i[0].padStart(n,"0"),r[1]=r[1]||"",i[1]=i[1]||"",n=Math.max(r[1].length,i[1].length),r[1]=r[1].padEnd(n,"0"),i[1]=i[1].padEnd(n,"0"),[t=r[0]+(r[1]?"."+r[1]:""),e=i[0]+(i[1]?"."+i[1]:"")]}function l(t,e){[t,e]=a(t,e);let r="",i=0;for(let n=t.length-1;n>=0;n--){if("."===t[n]){r="."+r;continue}let a=parseInt(t[n])+parseInt(e[n])+i;r=a%10+r,i=Math.floor(a/10)}return i?i.toString()+r:r}function u(t){return/^0[0]*[.]{0,1}[0]*$/.test(t)}function o(t){return"number"!=typeof t&&"bigint"!=typeof t||(t=t.toString()),"-"==t[0]?t.substring(1):t}var s;function g(t){const e="-"===t[0];for(e&&(t=t.substring(1));"0"==t[0];)t=t.substring(1);if(-1!=t.indexOf("."))for(;"0"==t[t.length-1];)t=t.substring(0,t.length-1);return""==t||"."==t?t="0":"."==t[t.length-1]&&(t=t.substring(0,t.length-1)),"."==t[0]&&(t="0"+t),e&&"0"!=t&&(t="-"+t),t}function c(t,e=0,r=s.HALF_EVEN){if("number"!=typeof t&&"bigint"!=typeof t||(t=t.toString()),r===s.UNNECESSARY){let[r,i]=g(t.replace("-","")).split(".");if(e>0&&i){if(i.length<=e)return t;if(/[^0]/.test(i.slice(e)))throw new Error("Number is not an exact value. Rounding necessary.");return t}if(e<0&&i)throw new Error("Number is not an exact value. Rounding necessary.");if(e<0){if(r.length<=Math.abs(e)||/[^0]/.test(r.slice(e)))throw new Error("Number is not an exact value. Rounding necessary.");return t}if(0==e&&i)throw new Error("Number is not an exact value. Rounding necessary.");return t}let i=!1;"-"===t[0]&&(i=!0,t=t.substring(1));let n=t.split("."),a=n[0],l=n[1];if(e<0){if(e=-e,a.length<=e)return"0";{let n=a.substring(0,a.length-e);return n=c(t=n+"."+a.substring(a.length-e)+l,0,r),(i?"-":"")+n+new Array(e+1).join("0")}}if(0==e){a.length;return f(n[1],a,i,r)&&(a=b(a)),(i&&parseInt(a)?"-":"")+a}if(!n[1])return(i?"-":"")+a+"."+new Array(e+1).join("0");if(n[1].lengthe)?(i?"-":"")+b(a,parseInt(l[0]))+"."+l.substring(1):(i&&(parseInt(a)||parseInt(l))?"-":"")+a+"."+l}function f(t,e,r,i){if(!t||t===new Array(t.length+1).join("0"))return!1;if(i===s.DOWN||!r&&i===s.FLOOR||r&&i===s.CEILING)return!1;if(i===s.UP||r&&i===s.FLOOR||!r&&i===s.CEILING)return!0;let n="5"+new Array(t.length).join("0");if(t>n)return!0;if(t=0;i--){let n=parseInt(t[i])+e;10==n?(e=1,n=0):e=0,r+=n}return e&&(r+=e),r.split("").reverse().join("")}function d(t,e){t=t.toString(),e=e.toString();let r=0;"-"==t[0]&&(r++,t=t.substr(1)),"-"==e[0]&&(r++,e=e.substr(1)),t=g(t),e=g(e);let i=0,n=0;-1!=t.indexOf(".")&&(i=t.length-t.indexOf(".")-1),-1!=e.indexOf(".")&&(n=e.length-e.indexOf(".")-1);let a=i+n;if(t=g(t.replace(".","")),e=g(e.replace(".","")),t.length=s&&i>=0;i--)o[i]>-1&&o[i]=f.length?new Array(b-f.length+1).join("0")+f:f).substr(0,f.length-b)+"."+f.substr(f.length-b,b))),1==r&&(c="-"+c),c}function h(t,e,i){if("number"!=typeof t&&"number"!=typeof e||(t=t.toString(),e=e.toString()),"0"==e)return"";void 0===i&&(i=8),t=t.replace(/(\.\d*?[1-9])0+$/g,"$1").replace(/\.0+$/,"");let a=0;"-"==(e=e.replace(/(\.\d*?[1-9])0+$/g,"$1").replace(/\.0+$/,""))[0]&&(e=e.substring(1),a++),"-"==t[0]&&(t=t.substring(1),a++);var l=e.indexOf(".")>0?e.length-e.indexOf(".")-1:-1;if(e=n(e.replace(".","")),l>=0){let e=t.indexOf(".")>0?t.length-t.indexOf(".")-1:-1;if(-1==e)t=n(t+new Array(l+1).join("0"));else if(l>e)t=n((t=t.replace(".",""))+new Array(l-e+1).join("0"));else if(l-1&&t.indexOf(".")-1&&t.indexOf(".")-1){let t=g.length-g.indexOf(".")-1;g=g.replace(".",""),o>g.length&&(t+=o-g.length,g+=new Array(o-g.length+1).join("0")),u=t,s="0."+new Array(t).join("0")}for(i+=2;u<=i;){let i=0;for(;parseInt(g)>=parseInt(e);)g=r(g,"-"+e),i++;s+=i,t?("."==t[0]&&(s+=".",u++,t=t.substring(1)),g+=t.substring(0,1),t=t.substring(1)):(u||(s+="."),u++,g+="0")}return(1==a?"-":"")+n(c(s,i-2))}function m(t,e){return r(t=t.toString(),e=v(e=e.toString()))}function v(t){return t="-"==t[0]?t.substr(1):"-"+t}function D(t,e=1,r){if(0==e)throw new Error("Cannot divide by 0");return t=t.toString(),w(e=e.toString()),m(t,d(e,c(h(t,e,r),0,s.FLOOR)))}function p(t,e=1,r){if(0==e)throw new Error("Cannot divide by 0");t=t.toString(),w(e=e.toString());const i=D(o(t),o(e),r);return t.includes("-")?v(i):i}function w(t){if(t.includes("."))throw new Error("Modulus of non-integers not supported")}function S(t,e){let r=!1;if([t,e]=[t,e].map((t=>g(t))),"-"==t[0]&&"-"!=e[0])return-1;if("-"!=t[0]&&"-"==e[0])return 1;"-"==t[0]&&"-"==e[0]&&(t=t.substring(1),e=e.substring(1),r=!0);let i=t.indexOf("."),n=e.indexOf(".");if(-1==i&&i==n){if(t.length>e.length)return r?-1:1;if(t.lengthn)return r?-1:1}if(-1!==i&&-1==n){if(e.lengthi)return r?-1:1}if([t,e]=a(t,e),0==t.localeCompare(e))return 0;for(let i=0;ie[i]?r?-1:1:r?1:-1;return 0}function O(t,e,r=!1){return r&&0===S(t,e)||-1===S(t,e)}function E(t,e,r=!1){return r&&0===S(t,e)||1===S(t,e)}function y(t,e){return 0===S(g(t),g(e))}function x(t){return y(g(o(t)),"0")}function N(t){return y(g(o(t)),"1")}function A(t){return/[13579]{1}$/.test(t.split(".")[0])}t.r(e),t.d(e,{default:function(){return X}}),function(t){t[t.CEILING=0]="CEILING",t[t.DOWN=1]="DOWN",t[t.FLOOR=2]="FLOOR",t[t.HALF_DOWN=3]="HALF_DOWN",t[t.HALF_EVEN=4]="HALF_EVEN",t[t.HALF_UP=5]="HALF_UP",t[t.UNNECESSARY=6]="UNNECESSARY",t[t.UP=7]="UP"}(s||(s={}));function L(t){return R(t=t.toString()),"0"==t?"0":t.startsWith("-")?`1${new Array(Number(-t)).join("0")}`:`0.${new Array(Number(t)-1).join("0")}1`}function I(t,e=8){return e=Math.max(1,e),!!x(t=o(t.toString()))||!!O(t,L(e),!0)}function V(t,e=8){return e=Math.max(1,e),!!N(t=o(t.toString()))||!!O(o(m("1",t)),L(e),!0)}function j(t){return x(t=t.toString())?0:t.includes("-")?-1:1}function R(t){if(t.includes("."))throw new Error("Non-integers not supported")}function F(t){if(t.includes("-"))throw new Error("Negatives not supported")}function M(t,e,r,i=!1){if(e=e.toString(),t=t.toString(),x(e))return"1";if(!e.includes("-")&&N(e))return t;if(x(t)&&e.includes("-")&&N(e))throw Error("0^(-1) is undefined");const n=t=>(t=l?h(1,t,r+1):t,t=r?c(t,r):t,g(i?v(t):t)),a=t.includes("-"),l=e.includes("-"),u=e.split("."),s=u[1];y(o(t),"10")&&(t=o(t),i=!i);let f,b="1";if(f=y(o(t),"10")?l?`0.${new Array(Number(o(u[0]))-1).join("0")}1`:`1${new Array(u[0]).join("0")}`:function(t,e,r=32){e=o(e);let i="1";for(;E(e,"0");)A(e)&&(i=d(i,t)),t=d(t,t),e=h(e,2).split(".")[0];return i}(o(t),o(u[0])),s){a&&(i=!i),r=Math.max(r,32);let e=H(o(t));for(let t=0;t=0?(i=parseInt(r)+e.indexOf("."),e=e.replace(".","")):i=parseInt(r)+e.length,t=e.length=i&&i>0?a+n(e.substring(0,i))+(e.length>i?"."+e.substring(i):""):a+"0."+new Array(1-i).join("0")+e}return t}constructor(t="0"){this.value=bigDecimal.validate(t)}getValue(){return this.value}setValue(t){this.value=bigDecimal.validate(t)}static getPrettyValue(t,e=3,r=","){let i="-"==(t=bigDecimal.validate(t)).charAt(0);i&&(t=t.substring(1));for(var n=t.indexOf("."),a="",l=n=n>0?n:t.length;l>0;)l=0?r:"")+a;return(i?"-":"")+a+t.substring(n)}getPrettyValue(t=3,e=","){return bigDecimal.getPrettyValue(this.value,t,e)}static round(t,e=0,r=s.HALF_EVEN){if(t=bigDecimal.validate(t),isNaN(e))throw Error("Precision is not a number: "+e);return c(t,e,r)}round(t=0,e=s.HALF_EVEN){if(isNaN(t))throw Error("Precision is not a number: "+t);return new bigDecimal(c(this.value,t,e))}static abs(t){return o(t=bigDecimal.validate(t))}abs(){return new bigDecimal(o(this.value))}static floor(t){return-1===(t=bigDecimal.validate(t)).indexOf(".")?t:bigDecimal.round(t,0,s.FLOOR)}floor(){return-1===this.value.indexOf(".")?new bigDecimal(this.value):new bigDecimal(this.value).round(0,s.FLOOR)}static ceil(t){return-1===(t=bigDecimal.validate(t)).indexOf(".")?t:bigDecimal.round(t,0,s.CEILING)}ceil(){return-1===this.value.indexOf(".")?new bigDecimal(this.value):new bigDecimal(this.value).round(0,s.CEILING)}static add(t,e){return r(t=bigDecimal.validate(t),e=bigDecimal.validate(e))}add(t){return new bigDecimal(r(this.value,t.getValue()))}static subtract(t,e){return m(t=bigDecimal.validate(t),e=bigDecimal.validate(e))}subtract(t){return new bigDecimal(m(this.value,t.getValue()))}static multiply(t,e){return d(t=bigDecimal.validate(t),e=bigDecimal.validate(e))}multiply(t){return new bigDecimal(d(this.value,t.getValue()))}static divide(t,e,r){return h(t=bigDecimal.validate(t),e=bigDecimal.validate(e),r)}divide(t,e){return new bigDecimal(h(this.value,t.getValue(),e))}static modulus(t,e){return p(t=bigDecimal.validate(t),e=bigDecimal.validate(e))}modulus(t){return new bigDecimal(p(this.value,t.getValue()))}static modulusE(t,e){return D(t=bigDecimal.validate(t),e=bigDecimal.validate(e))}modulusE(t){return new bigDecimal(D(this.value,t.getValue()))}static negate(t){return v(t=bigDecimal.validate(t))}negate(){return new bigDecimal(v(this.value))}static pow(t,e){return M(t=bigDecimal.validate(t),e=bigDecimal.validate(e))}pow(t){return new bigDecimal(M(this.value,t.getValue(),32))}static get SQRT1_2(){return _(".5")}static get SQRT2(){return _("2")}static sqRoot(t){return _(t=bigDecimal.validate(t))}sqRoot(){return new bigDecimal(_(this.value))}static cbRoot(t){return C(t=bigDecimal.validate(t))}cbRoot(){return new bigDecimal(C(this.value))}static get E(){return function(t=32){t=Math.max(16,t);let e="1",i="1",n="1";for(;;){n=d(n,i);const a=h("1",n,t+2);if(O(o(a),L(t)))return c(e,t);e=r(e,a),i=r(i,"1")}}(32)}static get LN2(){return W}static get LN10(){return q}static get LOG2E(){return"1.44269504088896340735992468100188"}static get LOG10E(){return"0.43429448190325182766805360691429"}static log2(t){return T(t=bigDecimal.validate(t))}static log10(t){return t=bigDecimal.validate(t),h(Y(t.toString()),q,32)}static log1p(t){return Y(r("1",t=bigDecimal.validate(t)))}static log(t){return Y(t=bigDecimal.validate(t))}static exp(t){return G(t=bigDecimal.validate(t))}static expm1(t){return t=bigDecimal.validate(t),m(G(t.toString()),"1")}static hypot(t,e){return function(t,e){return t=t.toString(),e=e.toString(),_(r(M(t,"2"),r(M(e,"2"))))}(t=bigDecimal.validate(t),e=bigDecimal.validate(e))}static sin(t){return Z(t=bigDecimal.validate(t))}static sinh(t){return z(t=bigDecimal.validate(t))}static asin(t){return k(t=bigDecimal.validate(t))}static cos(t){return B(t=bigDecimal.validate(t))}static cosh(t){return J(t=bigDecimal.validate(t))}static acos(t){return function(t){if(E(o(t=t.toString()),"1"))throw Error("[Arccosine]: argument x is out of range.");return g(m(h(Q,2,32),k(t)))}(t=bigDecimal.validate(t))}static tan(t){return t=bigDecimal.validate(t),g(h(Z(e=(e=t).toString()),B(e),32));var e}static tanh(t){return t=bigDecimal.validate(t),g(h(z(e=(e=t).toString()),J(e),32));var e}static atan(t){return K(t=bigDecimal.validate(t))}static atan2(t,e){return e=bigDecimal.validate(e),function(t,e){e=e.toString(),t=t.toString();let i="0";return x(e)&&x(t)?"0":x(e)&&E(t,"0")?g(c(h(Q,2,33),32)):x(e)&&O(t,"0")?g(c(v(h(Q,2,33)),32)):(O(e,"0")&&(i=E(t,"0",!0)?Q:v(Q)),g(c(r(K(h(t,e,33)),i),32)))}(t=bigDecimal.validate(t),e)}static compareTo(t,e){return S(t=bigDecimal.validate(t),e=bigDecimal.validate(e))}compareTo(t){return S(this.value,t.getValue())}static equals(t,e){return y(t=bigDecimal.validate(t),e=bigDecimal.validate(e))}equals(t){return y(this.value,t.getValue())}static lt(t,e){return O(t=bigDecimal.validate(t),e=bigDecimal.validate(e))}lt(t){return O(this.value,t.getValue())}static leq(t,e){return O(t=bigDecimal.validate(t),e=bigDecimal.validate(e),!0)}leq(t){return O(this.value,t.getValue(),!0)}static gt(t,e){return E(t=bigDecimal.validate(t),e=bigDecimal.validate(e))}gt(t){return E(this.value,t.getValue())}static geq(t,e){return E(t=bigDecimal.validate(t),e=bigDecimal.validate(e),!0)}geq(t){return E(this.value,t.getValue(),!0)}static sign(t){return j(t=bigDecimal.validate(t))}sign(){return j(this.value)}static factorial(t){return(t=>{if(R(t=t.toString()),F(t),x(t)||N(t))return"1";let e=t;for(;;){if(N(t))return e;let r=m(t,"1");e=d(e,r),t=r}})(t=bigDecimal.validate(t))}static stripTrailingZero(t){return g(t=bigDecimal.validate(t))}stripTrailingZero(){return new bigDecimal(g(this.value))}}var X=bigDecimal}(),bigDecimal=e}(); \ No newline at end of file diff --git a/package.json b/package.json index 824285b..4feef55 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "compile:watch": "chokidar \"src/**/*.ts\" -c \"npm run compile\"", "dist": "gulp dist", "dist:watch": "chokidar \"lib/**/*.js\" -c \"npm run dist\"", + "start-min": "npm-run-all -s --parallel compile dist", "start": "npm-run-all -s --parallel compile:watch test:watch dist:watch", "toc": "doctoc --title \"## Contents\" ./README.md" }, diff --git a/src/add.ts b/src/add.ts index f677a4f..9cc48ec 100644 --- a/src/add.ts +++ b/src/add.ts @@ -77,32 +77,16 @@ export function pad(number1: string, number2: string) { parts2 = number2.split("."); //pad integral part - let length1 = parts1[0].length, - length2 = parts2[0].length; - if (length1 > length2) { - parts2[0] = - new Array(Math.abs(length1 - length2) + 1).join("0") + - (parts2[0] ? parts2[0] : ""); - } else { - parts1[0] = - new Array(Math.abs(length1 - length2) + 1).join("0") + - (parts1[0] ? parts1[0] : ""); - } + let length = Math.max(parts1[0].length, parts2[0].length) + parts1[0] = parts1[0].padStart(length, "0"); + parts2[0] = parts2[0].padStart(length, "0"); //pad fractional part - (length1 = parts1[1] ? parts1[1].length : 0), - (length2 = parts2[1] ? parts2[1].length : 0); - if (length1 || length2) { - if (length1 > length2) { - parts2[1] = - (parts2[1] ? parts2[1] : "") + - new Array(Math.abs(length1 - length2) + 1).join("0"); - } else { - parts1[1] = - (parts1[1] ? parts1[1] : "") + - new Array(Math.abs(length1 - length2) + 1).join("0"); - } - } + parts1[1] = parts1[1] || "" + parts2[1] = parts2[1] || "" + length = Math.max(parts1[1].length, parts2[1].length) + parts1[1] = parts1[1].padEnd(length, "0"); + parts2[1] = parts2[1].padEnd(length, "0"); number1 = parts1[0] + (parts1[1] ? "." + parts1[1] : ""); number2 = parts2[0] + (parts2[1] ? "." + parts2[1] : ""); diff --git a/src/big-decimal.ts b/src/big-decimal.ts index f257eaa..0a5ff3b 100644 --- a/src/big-decimal.ts +++ b/src/big-decimal.ts @@ -3,33 +3,35 @@ import { abs } from "./abs"; import { roundOff } from "./round"; import { multiply } from "./multiply"; import { divide } from "./divide"; -import { modulus } from "./modulus"; -import { compareTo } from "./compareTo"; +import { modulus, modulusE } from "./modulus"; +import { compareTo, equals, greaterThan, lessThan } from "./compareTo"; import { subtract, negate } from "./subtract"; import { RoundingModes as Modes, RoundingModes } from "./roundingModes"; import { stripTrailingZero } from "./stripTrailingZero"; +import { cbRoot, pow, sqRoot } from "./pow"; +import { factorial, sign } from "./utils"; +import { acos, asin, atan, atan2, cos, cosh, hypot, sin, sinh, tan, tanh } from "./trig"; +import { ln, log, ln2, log10, exp, LN2, LN10, LOG2E, LOG10E, Euler, expm1 } from "./logarithm"; class bigDecimal { private value: string; static RoundingModes = Modes; - - private static validate(number): string { + private static validate(number: number | string | bigint ): string { if (number) { number = number.toString(); - if (isNaN(number)) throw Error("Parameter is not a number: " + number); - + if (isNaN(Number(number))) throw Error("Parameter is not a number: " + number); if (number[0] == "+") number = number.substring(1); } else number = "0"; //handle missing leading zero if (number.startsWith(".")) number = "0" + number; - else if (number.startsWith("-.")) number = "-0" + number.substr(1); + else if (number.startsWith("-.")) number = "-0" + number.substring(1); - //handle exponentiation + //handle exponentiation (scientific notation) if (/e/i.test(number)) { let [mantisa, exponent] = number.split(/[eE]/); + let exponentIndex = Number(exponent) mantisa = trim(mantisa); - let sign = ""; if (mantisa[0] == "-") { sign = "-"; @@ -37,22 +39,22 @@ class bigDecimal { } if (mantisa.indexOf(".") >= 0) { - exponent = parseInt(exponent) + mantisa.indexOf("."); + exponentIndex = parseInt(exponent) + mantisa.indexOf("."); mantisa = mantisa.replace(".", ""); } else { - exponent = parseInt(exponent) + mantisa.length; + exponentIndex = parseInt(exponent) + mantisa.length; } - if (mantisa.length < exponent) { + if (mantisa.length < exponentIndex) { number = - sign + mantisa + new Array(exponent - mantisa.length + 1).join("0"); - } else if (mantisa.length >= exponent && exponent > 0) { + sign + mantisa + new Array(exponentIndex - mantisa.length + 1).join("0"); + } else if (mantisa.length >= exponentIndex && exponentIndex > 0) { number = sign + - trim(mantisa.substring(0, exponent)) + - (mantisa.length > exponent ? "." + mantisa.substring(exponent) : ""); + trim(mantisa.substring(0, exponentIndex)) + + (mantisa.length > exponentIndex ? "." + mantisa.substring(exponentIndex) : ""); } else { - number = sign + "0." + new Array(-exponent + 1).join("0") + mantisa; + number = sign + "0." + new Array(-exponentIndex + 1).join("0") + mantisa; } } @@ -197,14 +199,14 @@ class bigDecimal { return new bigDecimal(modulus(this.value, number.getValue())); } - static compareTo(number1, number2) { + static modulusE(number1, number2) { number1 = bigDecimal.validate(number1); number2 = bigDecimal.validate(number2); - return compareTo(number1, number2); + return modulusE(number1, number2); } - compareTo(number: bigDecimal) { - return compareTo(this.value, number.getValue()); + modulusE(number: bigDecimal) { + return new bigDecimal(modulusE(this.value, number.getValue())); } static negate(number) { @@ -216,6 +218,235 @@ class bigDecimal { return new bigDecimal(negate(this.value)); } + // Powers + + static pow(base: number|string, exponent: number|string) { + base = bigDecimal.validate(base); + exponent = bigDecimal.validate(exponent); + return pow(base, exponent); + } + + pow(exponent: bigDecimal) { + return new bigDecimal(pow(this.value, exponent.getValue(), 32)); + } + + // Roots + + static get SQRT1_2() { + return sqRoot('.5'); + } + + static get SQRT2() { + return sqRoot('2'); + } + + static sqRoot(number: number|string): string { + number = bigDecimal.validate(number); + return sqRoot(number); + } + + sqRoot(): bigDecimal { + return new bigDecimal(sqRoot(this.value)); + } + + static cbRoot(number: number|string): string { + number = bigDecimal.validate(number); + return cbRoot(number); + } + + cbRoot(): bigDecimal { + return new bigDecimal(cbRoot(this.value)); + } + + // Logarithms + + static get E() { + return Euler(32); + } + + static get LN2(){ + return LN2 + } + + static get LN10(){ + return LN10 + } + + static get LOG2E(){ + return LOG2E + } + + static get LOG10E(){ + return LOG10E + } + + static log2(number: number|string){ + number = bigDecimal.validate(number); + return ln2(number) + } + + static log10(number: number|string){ + number = bigDecimal.validate(number); + return log10(number) + } + + static log1p(number: number|string){ + number = bigDecimal.validate(number); + return log(add('1', number)) + } + + static log(number: number|string){ + number = bigDecimal.validate(number); + return log(number) + } + + static exp(number: number|string): string { + number = bigDecimal.validate(number); + return exp(number); + } + + static expm1(number: number|string): string { + number = bigDecimal.validate(number); + return expm1(number) + } + + // Trig + static hypot(a: number|string, b: number|string){ + a = bigDecimal.validate(a); + b = bigDecimal.validate(b); + + return hypot(a,b); + + } + + static sin(number: number|string): string { + number = bigDecimal.validate(number); + return sin(number); + } + + static sinh(number: number|string): string { + number = bigDecimal.validate(number); + return sinh(number); + } + + static asin(number: number|string): string { + number = bigDecimal.validate(number); + return asin(number); + } + + static cos(number: number|string): string { + number = bigDecimal.validate(number); + return cos(number); + } + + static cosh(number: number|string): string { + number = bigDecimal.validate(number); + return cosh(number); + } + + static acos(number: number|string): string { + number = bigDecimal.validate(number); + return acos(number); + } + + static tan(number: number|string): string { + number = bigDecimal.validate(number); + return tan(number); + } + + static tanh(number: number|string): string { + number = bigDecimal.validate(number); + return tanh(number); + } + + static atan(number: number|string): string { + number = bigDecimal.validate(number); + return atan(number); + } + + static atan2(y: number|string, x: number|string): string { + x = bigDecimal.validate(x); + y = bigDecimal.validate(y); + return atan2(y, x); + } + + // Comparisons + static compareTo(number1: number|string, number2: number|string) { + number1 = bigDecimal.validate(number1); + number2 = bigDecimal.validate(number2); + return compareTo(number1, number2); + } + + compareTo(number: bigDecimal) { + return compareTo(this.value, number.getValue()); + } + + static equals(number1: number|string, number2: number|string){ + number1 = bigDecimal.validate(number1); + number2 = bigDecimal.validate(number2); + return equals(number1, number2); + } + + equals(number: bigDecimal){ + return equals(this.value, number.getValue()); + } + + static lt(number1: number|string, number2: number|string){ + number1 = bigDecimal.validate(number1); + number2 = bigDecimal.validate(number2); + return lessThan(number1, number2); + } + + lt(number: bigDecimal){ + return lessThan(this.value, number.getValue()); + } + + static leq(number1: number|string, number2: number|string){ + number1 = bigDecimal.validate(number1); + number2 = bigDecimal.validate(number2); + return lessThan(number1, number2, true); + } + + leq(number: bigDecimal){ + return lessThan(this.value, number.getValue(), true); + } + + static gt(number1: number|string, number2: number|string){ + number1 = bigDecimal.validate(number1); + number2 = bigDecimal.validate(number2); + return greaterThan(number1, number2); + } + + gt(number: bigDecimal){ + return greaterThan(this.value, number.getValue()); + } + + static geq(number1: number|string, number2: number|string){ + number1 = bigDecimal.validate(number1); + number2 = bigDecimal.validate(number2); + return greaterThan(number1, number2, true); + } + + geq(number: bigDecimal){ + return greaterThan(this.value, number.getValue(), true); + } + + static sign(number: number|string){ + number = bigDecimal.validate(number); + return sign(number); + } + + sign(){ + return sign(this.value); + } + + // Misc. + + static factorial(number: number|string): string { + number = bigDecimal.validate(number); + return factorial(number); + } + static stripTrailingZero(number) { number = bigDecimal.validate(number); return stripTrailingZero(number); @@ -224,5 +455,7 @@ class bigDecimal { stripTrailingZero() { return new bigDecimal(stripTrailingZero(this.value)); } + + } export default bigDecimal; diff --git a/src/compareTo.spec.ts b/src/compareTo.spec.ts index 9c53767..dcfe373 100644 --- a/src/compareTo.spec.ts +++ b/src/compareTo.spec.ts @@ -1,4 +1,4 @@ -import { compareTo } from "./compareTo"; +import { compareTo, equals, greaterThan, lessThan } from "./compareTo"; describe("compareTo", function () { it("should be defined", function () { @@ -66,4 +66,45 @@ describe("compareTo", function () { it("should: -0, 0 = 0", function () { expect(compareTo("-0", "0")).toBe(0); }); + + describe('Wrapper functions', function () { + describe('lessThan', function () { + it("should: -1 < 0 is true", function () { + expect(lessThan("-1", "0")).toBeTruthy() + }); + it("should: 0 < 0 is false", function () { + expect(lessThan("0", "0")).toBeFalsy() + }); + it("should: -1 =< 0 is true", function () { + expect(lessThan("-1", "0", true)).toBeTruthy() + }); + it("should: 0 =< 0 is true", function () { + expect(lessThan("0", "0", true)).toBeTruthy() + }); + }); + describe('greaterThan', function () { + it("should: 1 > 0 is true", function () { + expect(greaterThan("1", "0")).toBeTruthy() + }); + it("should: 0 < 0 is false", function () { + expect(greaterThan("0", "0")).toBeFalsy() + }); + it("should: -1 >= 0 is true", function () { + expect(greaterThan("1", "0", true)).toBeTruthy() + }); + it("should: 0 >= 0 is true", function () { + expect(greaterThan("0", "0", true)).toBeTruthy() + }); + }); + describe('equals', function () { + it("should: 1 = 0 is false", function () { + expect(equals("1", "0")).toBeFalsy() + }); + it("should: 0 = 0 is true", function () { + expect(equals("0", "0")).toBeTruthy() + }); + }); + }); }); + + diff --git a/src/compareTo.ts b/src/compareTo.ts index e97b0a5..06fb109 100644 --- a/src/compareTo.ts +++ b/src/compareTo.ts @@ -1,42 +1,92 @@ +import { abs } from './abs'; import { pad } from './add'; import {stripTrailingZero} from './stripTrailingZero'; export function compareTo(number1 : string, number2 : string) { let negative = false; + [number1, number2] = [number1, number2].map(n => stripTrailingZero(n)); - if(number1[0] == '-' && number2[0] != "-"){ - return -1; - }else if(number1[0] != '-' && number2[0] == '-'){ - return 1; - }else if(number1[0] == '-' && number2[0] == '-'){ - number1 = number1.substr(1); - number2 = number2.substr(1); + + // Early escapes + + // If num 1 is negative and num 2 is positive + if(number1[0] == '-' && number2[0] != "-") return -1; + + // If num 2 is negative and num 1 is positive + if(number1[0] != '-' && number2[0] == '-') return 1; + + + if(number1[0] == '-' && number2[0] == '-'){ + number1 = number1.substring(1); + number2 = number2.substring(1); negative = true; } - [number1, number2] = pad(number1, number2); - if(number1.localeCompare(number2) == 0){ - return 0; + + + let decimal1 = number1.indexOf('.'); + let decimal2 = number2.indexOf('.'); + + // If both numbers dont have decimals, compare lengths + if(decimal1 == -1 && decimal1 == decimal2) { + if(number1.length > number2.length) return (negative)? -1: 1; + if(number1.length < number2.length) return (negative)? 1: -1; + } + + // If num 1 has no decimal, and num 2 has, then compare integer length to the decimal index of num 2 + if(decimal1 == -1 && decimal2 !== -1){ + if(number1.length < decimal2) return (negative)? 1: -1; + if(number1.length > decimal2) return (negative)? -1: 1; } + + // If num 1 has a decimal, and num 2 has none, then compare integer length to the decimal index of num 1 + if(decimal1 !== -1 && decimal2 == -1){ + if(number2.length < decimal1) return (negative)? 1: -1; + if(number2.length > decimal1) return (negative)? -1: 1; + } + + [number1, number2] = pad(number1, number2); + + // If equal + if(number1.localeCompare(number2) == 0) return 0; + for(let i = 0 ; i < number1.length ; i++){ if(number1[i] == number2[i]){ continue; - }else if(number1[i] > number2[i]){ - if(negative){ - return -1; - }else{ - return 1; - } - }else{ - if(negative){ - return 1; - }else{ - return -1; - } + } else if(number1[i] > number2[i]){ + return (negative)? -1: 1; + } else { + return (negative)? 1: -1; } } return 0; } -function checkZero(number){ +// Wrapper functions + +export function lessThan(left: string, right: string, orEquals: boolean = false){ + return (orEquals)? (compareTo(left, right) === 0 || compareTo(left, right) === -1): (compareTo(left, right) === -1) +} + +export function greaterThan(left: string, right: string, orEquals: boolean = false){ + return (orEquals)? (compareTo(left, right) === 0 || compareTo(left, right) === 1): (compareTo(left, right) === 1) +} + +export function equals(left: string, right: string){ + return (compareTo(stripTrailingZero(left), stripTrailingZero(right)) === 0) +} + +export function isExatclyZero(number: string) { + return equals(stripTrailingZero(abs(number)), '0') +} + +export function isExatclyOne(number: string) { + return equals(stripTrailingZero(abs(number)), '1') +} + +export function isEven(number: string) { + return /[02468]{1}$/.test(number.split('.')[0]) +} +export function isOdd(number: string) { + return /[13579]{1}$/.test(number.split('.')[0]) } \ No newline at end of file diff --git a/src/divide.spec.ts b/src/divide.spec.ts index 0c7d83e..9416b53 100644 --- a/src/divide.spec.ts +++ b/src/divide.spec.ts @@ -100,4 +100,7 @@ describe("divide", function () { it(".102 / .0383292 = 2.66115651", function () { expect(divide(".102", ".0383292", 8)).toBe("2.66115651"); }); + it("divide(0, 2, 3) should add trailing 0s", function () { + expect(divide(0, 2, 3)).toBe("0.000"); + }); }); diff --git a/src/divide.ts b/src/divide.ts index 9991659..8f85524 100644 --- a/src/divide.ts +++ b/src/divide.ts @@ -1,21 +1,27 @@ import { add, trim } from './add'; import { roundOff } from './round'; -export function divide(dividend, divisor, precission = 8) { - if (divisor == 0) { - throw new Error('Cannot divide by 0'); +export function divide(dividend: string | number, divisor: string | number, precission?:number) { + // Convert to string + if (typeof dividend == 'number' || typeof divisor == 'number') { + dividend = dividend.toString(); + divisor = divisor.toString(); } - dividend = dividend.toString(); - divisor = divisor.toString(); + // Return 0 + if (divisor == '0') { + return '0' + (!precission)? '': '.' + new Array(precission).join('0'); + } + + // Set default precission + if(typeof precission == 'undefined'){ + precission = 8; + } // remove trailing zeros in decimal ISSUE#18 dividend = dividend.replace(/(\.\d*?[1-9])0+$/g, "$1").replace(/\.0+$/, ""); divisor = divisor.replace(/(\.\d*?[1-9])0+$/g, "$1").replace(/\.0+$/, ""); - if (dividend == 0) - return '0'; - let neg = 0; if (divisor[0] == '-') { divisor = divisor.substring(1); @@ -51,7 +57,7 @@ export function divide(dividend, divisor, precission = 8) { let prec = 0, dl = divisor.length, rem = '0', quotent = ''; let dvnd = (dividend.indexOf('.') > -1 && dividend.indexOf('.') < dl) ? dividend.substring(0, dl + 1) : dividend.substring(0, dl); dividend = (dividend.indexOf('.') > -1 && dividend.indexOf('.') < dl) ? dividend.substring(dl + 1) : dividend.substring(dl); - + if (dvnd.indexOf('.') > -1) { let shift = dvnd.length - dvnd.indexOf('.') - 1; dvnd = dvnd.replace('.', ''); diff --git a/src/logarithm.spec.ts b/src/logarithm.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/logarithm.ts b/src/logarithm.ts new file mode 100644 index 0000000..8b996f0 --- /dev/null +++ b/src/logarithm.ts @@ -0,0 +1,104 @@ +import { abs } from "./abs"; +import { add } from "./add"; +import { lessThan, equals, greaterThan } from "./compareTo"; +import { divide } from "./divide"; +import { multiply } from "./multiply"; +import { pow } from "./pow"; +import { roundOff } from "./round"; +import { subtract } from "./subtract"; +import { E_ROOTS_FOR_POW } from "./tables/e"; +import { tolerance } from "./utils"; + +export const E = roundOff('2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921817413596629043572900334295260595630738132328627943490763233829880753195251019011573834187930702154089149934884167509244761460668082264', 257); +export const LN2 = '0.69314718055994530941723212145818'; +export const LOG2E = '1.44269504088896340735992468100188'; +export const LN10 = '2.30258509299404568392825848336901'; +export const LOG10E = '0.43429448190325182766805360691429'; + +export function Euler(precision: number = 32) { + precision = Math.max(16, precision) + let result = '1'; + let n = '1'; + let f = '1'; + + while(true){ + f = multiply(f, n); + const next = divide('1', f, precision + 2) + + if(lessThan(abs(next), tolerance(precision))){ + return roundOff(result, precision); + } + + result = add(result, next); + n = add(n,'1'); + } +} + +export function exp(exponent: number | string) { + exponent = exponent.toString(); + const remainder = exponent.split('.')[1]; + let result = pow(E, abs(exponent).split('.')[0], 33); + let fractionalExponent = '1'; + + if (remainder) { + for (let i = 0; i < Math.min(33,remainder.length); i++) { + fractionalExponent = multiply(fractionalExponent, E_ROOTS_FOR_POW[i][remainder[i]]) + } + result = multiply(result, fractionalExponent) + } + + return pow(E, exponent, 33); +} + +export function expm1(exponent: number | string) { + exponent = exponent.toString(); + return subtract(exp(exponent), '1') +} + +export function ln(x: string | number = 2) { + x = x.toString(); + if (lessThan(x, '0', true)) { + throw "[ln]: x must be greater than 0"; + } + + if (equals(x, '1')) { + return '0'; // ln(1) = 0 + } + + let result = '0'; + let term = divide(subtract(x, '1'), add(x, '1'), 33); + let i = 0; + while (true) { + i++ + let iteration = subtract(multiply('2', i), '1'); + let next = multiply(divide('1', iteration, 33), pow(term, iteration)); + if (lessThan(next, tolerance(33))) { + return roundOff(multiply('2', add(result, next)), 32); + } + result = add(result, next); + } + +} + +export function ln2(x: string | number = 2) { + x = x.toString(); + if (lessThan(x, '0', true)) { + throw "[ln2]: x must be greater than 0"; + } + let result = '0'; + while (greaterThan(x, '2', true)) { + x = divide(x, 2, 33); + result = add(result, '1'); + } + return roundOff(add(result, divide(ln(x), LN2,33)), 32); +} + +export function log(base: string | number) { + base = base.toString(); + return roundOff(multiply(ln2(base), LN2), 32); +} + +export function log10(base: string | number) { + base = base.toString(); + return divide(log(base), LN10, 32); +} \ No newline at end of file diff --git a/src/modulus.spec.ts b/src/modulus.spec.ts index 3004979..71c7e01 100644 --- a/src/modulus.spec.ts +++ b/src/modulus.spec.ts @@ -1,65 +1,157 @@ import { modulus, modulusE } from "./modulus"; describe("modulus(remainder)", function () { - it("should modulus(7,4) = 3", function () { - expect(modulus(7, 4)).toBe("3"); - }); - it("should modulus(-7,4) = -3", function () { - expect(modulus(-7, 4)).toBe("-3"); - }); - it("should modulus(7,-4) = 3", function () { - expect(modulus(7, -4)).toBe("3"); - }); - it("should modulus(-7,-4) = -3", function () { - expect(modulus(-7, -4)).toBe("-3"); - }); - it("should modulus(-7,0) throw", function () { - expect(() => modulus(-7, 0)).toThrowError(); - }); - - it("should modulus(76457896543456%77732) = 45352", function () { - expect(modulus("76457896543456", "77732")).toBe("45352"); - }); - - it("should modulus(7.5%3.2) to throw error", function () { - expect(() => modulus("7.5", "3.2")).toThrowError(); - }); - it("should modulus(75%3.2) to throw error", function () { - expect(() => modulus("75", "3.2")).toThrowError(); - }); - it("should modulus(7.5%32) to throw error", function () { - expect(() => modulus("7.5", "32")).toThrowError(); - }); + + describe('Basic operations', function () { + + it("should modulus(7,4) = 3", function () { + expect(modulus(7, 4)).toBe("3"); + }); + + it("should modulus(32.6, 7) = 4.6", function () { + expect(modulus(32.6, 7)).toBe("4.6"); + }); + + it("should modulus(-7, 4) = 1", function () { + expect(modulus(-7, 4)).toBe("-3"); + }); + + it("should modulus(-32.6, 7) = -4.6", function () { + expect(modulus(-32.6, 7)).toBe("-4.6"); + }); + + it("should modulus(7, -4) = 3", function () { + expect(modulus(7, -4)).toBe("3"); + }); + + it("should modulus(32.6, -7) = 4.6", function () { + expect(modulus(32.6, -7)).toBe("4.6"); + }); + + it("should modulus(-7, -4) = -3", function () { + expect(modulus(-7, -4)).toBe("-3"); + }); + + it("should modulus(-32.6, -7) = -4.6", function () { + expect(modulus(-32.6, -7)).toBe("-4.6"); + }); + + it("should modulus(-7,0) throw", function () { + expect(() => modulus(-7, 0)).toThrowError(); + }); + + it("should modulus(76457896543456, 77732) = 45352", function () { + expect(modulus("76457896543456", "77732")).toBe("45352"); + }); + }) + + describe('Mantissa', function () { + + it("should modulus(7.5) = 0.5", function () { + expect(modulus("7.5")).toBe("0.5") + }); + + it("should modulus(-7.5) = 0.5", function () { + expect(modulus("-7.5")).toBe("-0.5") + }); + + it("should modulus(7.2) = 0.2", function () { + expect(modulus("7.2")).toBe("0.2") + }); + + it("should modulus(-7.2) = -0.2", function () { + expect(modulus("-7.2")).toBe("-0.2") + }); + }) + + describe('Non-integer Base Error', function () { + + it("should modulus(7.5%3.2) to throw error", function () { + expect(() => modulus("7.5", "3.2")).toThrowError(); + }); + + it("should modulus(75%3.2) to throw error", function () { + expect(() => modulus("75", "3.2")).toThrowError(); + }); + }) + }); describe("modulus(Euclidean division)", function () { - it("should modulusE(7,4) = 3", function () { - expect(modulusE(7, 4)).toBe("3"); - }); - it("should modulusE(-7,4) = 1", function () { - expect(modulusE(-7, 4)).toBe("1"); - }); - it("should modulus(7,-4) = -1", function () { - expect(modulusE(7, -4)).toBe("-1"); - }); - it("should modulus(-7,-4) = -3", function () { - expect(modulusE(-7, -4)).toBe("-3"); - }); - it("should modulus(-7,0) throw", function () { - expect(() => modulusE(-7, 0)).toThrowError(); - }); - - it("should modulusE(76457896543456, 77732) = 45352", function () { - expect(modulusE("76457896543456", "77732")).toBe("45352"); - }); - - it("should modulusE(7.5, 3.2) to throw error", function () { - expect(() => modulusE("7.5", "3.2")).toThrowError(); - }); - it("should modulusE(75, 3.2) to throw error", function () { - expect(() => modulusE("75", "3.2")).toThrowError(); - }); - it("should modulusE(7.5, 32) to throw error", function () { - expect(() => modulusE("7.5", "32")).toThrowError(); - }); + + describe('Basic operations', function () { + + it("should modulusE(7,4) = 3", function () { + expect(modulusE(7, 4)).toBe("3"); + }); + + it("should modulusE(32.6, 7) = 4.6", function () { + expect(modulusE(32.6, 7)).toBe("4.6"); + }); + + it("should modulusE(-7, 4) = 1", function () { + expect(modulusE(-7, 4)).toBe("1"); + }); + + it("should modulusE(-32.6, 7) = 2.4", function () { + expect(modulusE(-32.6, 7)).toBe("2.4"); + }); + + it("should modulus(7, -4) = -1", function () { + expect(modulusE(7, -4)).toBe("-1"); + }); + + it("should modulusE(32.6, -7) = 2.4", function () { + expect(modulusE(32.6, -7)).toBe("-2.4"); + }); + + it("should modulus(-7, -4) = -3", function () { + expect(modulusE(-7, -4)).toBe("-3"); + }); + + it("should modulusE(-32.6, -7) = -4.6", function () { + expect(modulusE(-32.6, -7)).toBe("-4.6"); + }); + + it("should modulusE(-7, 0) throw", function () { + expect(() => modulusE(-7, 0)).toThrowError(); + }); + + it("should modulusE(76457896543456, 77732) = 45352", function () { + expect(modulusE("76457896543456", "77732")).toBe("45352"); + }); + }) + + describe('Mantissa', function () { + + it("should modulusE(7.5) = 0.5", function () { + expect(modulusE("7.5")).toBe("0.5") + }); + + it("should modulusE(-7.5) = 0.5", function () { + expect(modulusE("-7.5")).toBe("0.5") + }); + + it("should modulusE(7.2) = 0.2", function () { + expect(modulusE("7.2")).toBe("0.2") + }); + + it("should modulusE(-7.2) = -0.2", function () { + expect(modulusE("-7.2")).toBe("0.8") + }); + + }) + + describe('Non-integer Base', function () { + + it("should modulusE(7.5%3.2) to throw error", function () { + expect(() => modulusE("7.5", "3.2")).toThrowError(); + }); + + it("should modulusE(75%3.2) to throw error", function () { + expect(() => modulusE("75", "3.2")).toThrowError(); + }); + }) + }); + diff --git a/src/modulus.ts b/src/modulus.ts index 41b9935..dbe4bcc 100644 --- a/src/modulus.ts +++ b/src/modulus.ts @@ -5,67 +5,21 @@ import { negate, subtract } from './subtract'; import { RoundingModes } from './roundingModes'; import { abs } from './abs'; - -// export function modulus(dividend: number | string, divisor: number | string) { -// if (divisor == 0) { -// throw new Error('Cannot divide by 0'); -// } - -// dividend = dividend.toString(); -// divisor = divisor.toString(); - -// validate(dividend); -// validate(divisor); - -// let sign = ''; -// if (dividend[0] == '-') { -// sign = '-'; -// dividend = dividend.substr(1); -// } -// if (divisor[0] == '-') { -// divisor = divisor.substr(1); -// } - -// let result = subtract(dividend, multiply(divisor, roundOff(divide(dividend, divisor), 0, RoundingModes.FLOOR))); -// return sign + result; -// } - -// function validate(oparand: string) { -// if (oparand.indexOf('.') != -1) { // oparand.includes('.') could also work here -// throw new Error('Modulus of non-integers not supported'); -// } -// } - - -// For technical purposes, this is actually Remainder, and not Modulus (Euclidean division). -// Could seperate the Modulus equation into its own function, -// then use it within the Remainder function after proper negation. -// Proper neation only depends on the sign of the dividend, where the result takes the sign -// of the divident, and ignores the sign of the divisor. For this effect, the absolute values of -// each oparand is used, then the original sign of the divident dictates -// nagation of the result to negative or not. - - -// To ensure backwards compatibility, the new Modulus function could be named 'modulusE', -// where 'E' denotes 'Euclidean' in 'Euclidean division'. - -// Sugested changes are bellow - -export function modulusE(n: number | string, base: number | string = '1', percision: number | undefined = undefined) { +export function modulusE(n: number | string, base: number | string = 1, precision: number | undefined = undefined) { + if (base == 0) { throw new Error('Cannot divide by 0'); } n = n.toString(); base = base.toString(); - - validate(n); + validate(base); - return subtract(n, multiply(base, roundOff(divide(n, base, percision), 0, RoundingModes.FLOOR))); + return subtract(n, multiply(base, roundOff(divide(n, base, precision), 0, RoundingModes.FLOOR))); } -export function modulus(dividend: number | string, divisor: number | string, percision: number | undefined = undefined) { +export function modulus(dividend: number | string, divisor: number | string = 1, precision: number | undefined = undefined) { if (divisor == 0) { throw new Error('Cannot divide by 0'); } @@ -73,20 +27,14 @@ export function modulus(dividend: number | string, divisor: number | string, per dividend = dividend.toString(); divisor = divisor.toString(); - validate(dividend); validate(divisor); - let sign = false; - if (dividend[0] == '-') { // or dividend.includes('-') - sign = true; - } - - const result = modulusE(abs(dividend), abs(divisor), percision); - return (sign) ? negate(result) : result; + const result = modulusE(abs(dividend), abs(divisor), precision); + return (dividend.includes('-')) ? negate(result) : result; } function validate(oparand: string) { - if (oparand.indexOf('.') != -1) { // or oparand.includes('.') + if (oparand.includes('.')) { throw new Error('Modulus of non-integers not supported'); } } diff --git a/src/pow.spec.ts b/src/pow.spec.ts index bab4937..f20f33c 100644 --- a/src/pow.spec.ts +++ b/src/pow.spec.ts @@ -1,53 +1,206 @@ -import { NonIntegerExponentError, intPow } from "./pow"; +import { pow, nthRoot, sqRoot, cbRoot, root4, root5, root10 } from "./pow"; -describe("intPow", function () { +describe("Pow", function () { it("should be defined", function () { - expect(intPow).toBeDefined(); + expect(pow).toBeDefined(); }); it("should: 2^2 = 4", function () { - expect(intPow(2, 2)).toBe("4"); + expect(pow(2, 2)).toBe("4"); }); it("should: -2^2 = 4", function () { - expect(intPow(-2, 2)).toBe("4"); + expect(pow(-2, 2)).toBe("4"); }); it("should: -2^3 = -8", function () { - expect(intPow(-2, 3)).toBe("-8"); + expect(pow(-2, 3)).toBe("-8"); }); describe('Negated', function () { it("should: -(2^2) = -4", function () { - expect(intPow(2, 2, true)).toBe("-4"); + expect(pow(2, 2, undefined, true)).toBe("-4"); }); it("should: -(-2^2) = -4", function () { - expect(intPow(2, 2, true)).toBe("-4"); + expect(pow(2, 2, undefined, true)).toBe("-4"); }); it("should: -(-2^3) = 8", function () { - expect(intPow(-2, 3, true)).toBe("8"); + expect(pow(-2, 3, undefined, true)).toBe("8"); }); }) + describe('handle fractional base', function () { + + it("should: 2.5^2 = 6.25", function () { + expect(pow(2.5, 2)).toBe("6.25"); + }); + + it("should: -2.5^2 = 6.25", function () { + expect(pow(-2.5, 2)).toBe("6.25"); + }); + + it("should: -2.5^3 = 6.25", function () { + expect(pow(-2.5, 3)).toBe("-15.625"); + }); + }) + + describe('should handle fractional exponent', function () { + + it("should: 2^2.5 = 5.65685424949238019520675489683879", function () { + expect(pow(2, 2.5, 32)).toBe("5.65685424949238019520675489683879"); + }); + + it("should: 2^.5 = 1.4142135623730950488016887242097", function () { + expect(pow(2, .5, 32)).toBe("1.4142135623730950488016887242097"); + }); + + it("should: 2.5^2.2 = 7.50702771238394520776312433499478", function () { + expect(pow(2.5, 2.2, 32)).toBe("7.50702771238394520776312433499478"); + }); + + it("should: 2.5^-2.2 = 0.13320851318429970246653555493722", function () { + expect(pow(2.5, -2.2, 32)).toBe("0.13320851318429970246653555493722"); + }); + + it("should: -2.5^2.2 = -7.50702771238394520776312433499478", function () { + expect(pow(-2.5, 2.2, 32)).toBe("-7.50702771238394520776312433499478"); + }); + + it("should: -2.5^-2.2 = -0.13320851318429970246653555493722", function () { + expect(pow(-2.5, -2.2, 32)).toBe("-0.13320851318429970246653555493722"); + }); + + }) + + describe('should handle powers of 10', function () { + + it("should: 10^2 = 100", function () { + expect(pow(10, 2, 32, undefined)).toBe("100"); + }); + + it("should: 10^-2 = .01", function () { + expect(pow(10, -2, 32, undefined)).toBe("0.01"); + }); + + it("should: 10^.2 = 1.58489319246111348520210137339151", function () { + expect(pow(10, .2, 32, undefined)).toBe("1.58489319246111348520210137339151"); + }); + + it("should: 10^-.2 = 0.63095734448019324943436013662234", function () { + expect(pow(10, -.2, 32, undefined)).toBe("0.63095734448019324943436013662234"); + }); + + }) + + describe('Special Cases', function () { it("should: 2^0 = 1", function () { - expect(intPow(2, 0)).toBe("1"); + expect(pow(2, 0)).toBe("1"); }); it("should: -2^1 = 2", function () { - expect(intPow(2, 1)).toBe("2"); + expect(pow(2, 1)).toBe("2"); + }); + + it("should: 0^1 = 0", function () { + expect(pow(0, 1)).toBe("0"); + }); + + it("should: 0^0 = 1", function () { + expect(pow(0, 0)).toBe("1"); + }); + }) + + describe("should handle negative exponent", function () { + it("should: 2^-2 = 0.25", function () { + expect(pow(2, -2)).toBe("0.25"); + }); + + it("should: -2^-2 = 0.25", function () { + expect(pow(-2, -2)).toBe("0.25"); + }); + + it("should: -2^-3 = -0.125", function () { + expect(pow(-2, -3)).toBe("-0.125"); }); }) describe('Errors and Exceptions', function () { it("should throw error", function () { - expect(()=>{intPow(2, 2.5)}).toThrowError(); + expect(() => pow(0, -1)).toThrowError(); }); - }) }); + +describe('Roots', function () { + + describe('nthRoot', function () { + + it("should: 4root2 = 2", function () { + expect(nthRoot(4, 2)).toBe("2"); + }); + + it("should: 9root2 = 9", function () { + expect(nthRoot(81, 2)).toBe("9"); + }); + + it("should: 452root2 = 21.260291625", function () { + expect(nthRoot(452, 2)).toBe("21.260291625"); + }); + + it("should: 452root2 = 21.260...", function () { + expect(nthRoot(452, 2, 32)).toBe("21.260291625469298815998243829858628"); + }); + + it("should: 45.76root3 = 3.576805615", function () { + expect(nthRoot(45.76, 3)).toBe("3.576805615"); + }); + + it("should: 45.76root3 = 3.576...", function () { + expect(nthRoot(45.76, 3, 32)).toBe("3.576805614696509204554520668745324"); + }); + + }); + + describe('sqRoot', function () { + it("sqRoot(4) = '2'", function () { + expect(sqRoot(4)).toBe('2'); + }); + }); + + describe('cbRoot', function () { + it("cbRoot(27) = '3'", function () { + expect(cbRoot(27)).toBe('3'); + }); + }); + + describe('root4', function () { + it("root4(16) = '2'", function () { + expect(root4(16)).toBe('2'); + }); + }); + + describe('root5', function () { + it("root5(243) = '3'", function () { + expect(root5(243)).toBe('3'); + }); + }); + + describe('root10', function () { + it("root10(1024) = '2'", function () { + expect(root10(1024)).toBe('2'); + }); + }); + + describe('Errors and Exceptions', function () { + it("should throw error", function () { + expect(() => nthRoot(4, 3.5)).toThrowError(); + }); + }); +}); + diff --git a/src/pow.ts b/src/pow.ts index 6fc444e..50cb283 100644 --- a/src/pow.ts +++ b/src/pow.ts @@ -1,28 +1,13 @@ import { abs } from "./abs"; -import { compareTo } from "./compareTo"; +import { equals, greaterThan, isExatclyOne, isExatclyZero, isOdd, lessThan } from "./compareTo"; import { divide } from "./divide"; -import { modulus } from "./modulus"; import { multiply } from "./multiply"; import { roundOff } from "./round"; -import { RoundingModes } from "./roundingModes"; +import { stripTrailingZero } from "./stripTrailingZero"; import { negate as negateFn, subtract } from "./subtract"; - -export type ExponentErrorOrException = { - message: string, - type: 'error' | 'exception', -} - -export const NonIntegerExponentError: ExponentErrorOrException = { - message: `Exponent must be an integer.`, - type: 'error', -} - -export const ComplexExponentException: ExponentErrorOrException = { - message: `Result is a Complex number with only an Imaginary component.`, - type: 'exception', -} - - +import { add } from "./add"; +import { isAproxOne, isAproxZero, sign, tolerance } from "./utils"; +// import { AddInstantiate } from "./assembly/math"; /** @@ -34,7 +19,6 @@ export const ComplexExponentException: ExponentErrorOrException = { * * @returns The resulting power as a string * - * @throws {NonIntegerExponentError} - If `exponent` is a non-integer number, this error is thrown. * * @example Basic usage: * ``` @@ -65,104 +49,397 @@ export const ComplexExponentException: ExponentErrorOrException = { * ``` */ -// Integer Exponent Only Implementation +export function pow(base: number | string, exponent: number | string, precision: number | undefined = undefined, negate: boolean | undefined = false): string { -export function intPow(base: number | string, exponent: number | string, negate: boolean = false) { + + // AddInstantiate.then((res)=>{ + // console.log('custom wasm loader',res.__add('00001', '1')) + // }) + + // const v = await (async url => await AddInstantiate)(); + + // console.log('custom wasm loader', AddWebAssembly('1', '1')) exponent = exponent.toString(); base = base.toString(); - try { - if (exponent.includes('.')) { - throw NonIntegerExponentError + if (isExatclyZero(exponent)) { + return '1' + } + + if (!exponent.includes('-') && isExatclyOne(exponent)) { + return base + } + + if (isExatclyZero(base) && exponent.includes('-') && isExatclyOne(exponent)) { + throw Error('0^(-1) is undefined'); + } + + const finalize = (result: string) => { + result = (negativeExponent) ? divide(1, result, precision + 1) : result; + result = (precision) ? roundOff(result, precision) : result; + return (negate) ? stripTrailingZero(negateFn(result)) : stripTrailingZero(result); + }; + + const negativeBase = base.includes('-'); + + const negativeExponent = exponent.includes('-'); + const exponentParts = exponent.split('.'); + const exponentSignificand = exponentParts[1]; + + const isBase10 = equals(abs(base), '10'); + + if (isBase10) { + base = abs(base); + negate = !negate; + } + + let fractionalExponent = '1'; + let result; + + if (equals(abs(base), '10')) { + result = (negativeExponent) ? `0.${new Array(Number(abs(exponentParts[0])) - 1).join('0')}1` : `1${new Array(exponentParts[0]).join('0')}` + } else { + result = intPow(abs(base), abs(exponentParts[0])) + } + + if (exponentSignificand) { + + if (negativeBase) { + negate = !negate } - // Special Handling of Complex numbers - // const imaginary = exponent < 0 && Number(remainder) > 0 && Number(remainder) < 1; + precision = Math.max(precision, 32); + // const testworker = new Worker(new URL("./workers/pow.worker.js", import.meta.url)); + // testworker.postMessage({ base: abs(base), significand: exponentSignificand }); + + // testworker.onmessage = (event) => { + // console.log('webresult', result) + // // console.log('web', multiply(result, event.data)) + // // testworker.terminate(); - // if (imaginary) { - // throw ComplexExponentException + // // fractionalExponent = event.data + // return finalize(multiply(result, event.data)) + // // testworker.terminate(); // } - } catch (errorOrException) { - errorOrException = errorOrException - switch (errorOrException.type) { - case 'error': - const error = Error(`${errorOrException.message}`) - console.error(error) - throw error - // case 'exception': // For Complex nunmbers - // console.error(`Exception(${errorOrException.severity}): ${errorOrException.message}`) - // return NaN // Todo: Break or continue + let tempBase = root10(abs(base)); + + for (let i = 0; i < exponentSignificand.length; i++) { + fractionalExponent = multiply(fractionalExponent, pow(tempBase, exponentSignificand[i])) + tempBase = root10(tempBase) } + return finalize(multiply(result, fractionalExponent)) + + } else { + return finalize(result) } - const reciprical = compareTo(exponent, '0') == -1; - const base10Percision = compareTo(base, '10') == 0 ? exponent.length : undefined; + // let exponentIntegers = abs(exponentParts[0]); - let result = '1'; + // if (equals(abs(base), '10')) { + // result = (negativeExponent) ? `0.${new Array(Number(exponentIntegers) - 1).join('0')}1` : `1${new Array(exponentIntegers).join('0')}` + // return multiply(multiply(result, fractionalExponent), pow(sign(base), exponentIntegers)) + // } - exponent = abs(exponent) + // while (greaterThan(exponentIntegers, '0')) { + // if (isOdd(exponentIntegers)) { result = multiply(result, base) } + // base = multiply(base, base); + // exponentIntegers = divide(exponentIntegers, 2).split('.')[0]; + // } - while (compareTo(exponent, '0') == 1) { - if (modulus(exponent, 2) == '1') { result = multiply(result, base) } + // result = multiply(result, fractionalExponent); + // result = (negativeExponent) ? divide(1, result, precision + 1) : result; + // result = (precision) ? roundOff(result, precision) : result; + // return (negate) ? stripTrailingZero(negateFn(result)) : stripTrailingZero(result); +}; + +function intPow(base: string, exponent: string, precision: number | undefined = 32) { + exponent = abs(exponent); + let result = '1'; + + while (greaterThan(exponent, '0')) { + if (isOdd(exponent)) { result = multiply(result, base) } base = multiply(base, base); - exponent = roundOff(divide(exponent, 2), 0, RoundingModes.FLOOR); + exponent = divide(exponent, 2).split('.')[0]; } - result = (reciprical) ? divide(1, result, base10Percision) : result; - return (negate) ? negateFn(result) : result; -}; + return result +} + +export function nthRoot(x: number | string, n: number | string, precision = 8) { + + x = x.toString(); + n = n.toString(); + + validate(n); + + if (lessThan(n, '4', true)) { + let guess = '1'; + let nMinusOne = subtract(n, 1); + let difference = '0' + let lastDifference = x + let i = 0; + while (true) { + + let newGuess = divide(add(stripTrailingZero(divide(x, pow(guess, nMinusOne, precision + 2), precision + 2)), multiply(guess, nMinusOne)), n, precision + 2); + + difference = abs(subtract(guess, newGuess)) + + if (greaterThan(difference, lastDifference)) { + // console.log('root exit under p') + return stripTrailingZero(roundOff(guess, precision + 1)) + } + + if (lessThan(difference, tolerance(precision - 1))) { + // console.log('newGuess exit under p') + return stripTrailingZero(roundOff(newGuess, precision + 1)) + } + + lastDifference = difference; + guess = stripTrailingZero(newGuess); + + i++; + } + // console.log('guess exit over itt') + + // return stripTrailingZero(roundOff(guess, precision + 1)) + } else { + let x0 = '1'; + let x1 = '2'; + let x2 = '1.5'; + let i = 0; + + while (true) { + let f0 = subtract(pow(x0, n, precision + 2), x); + let f1 = subtract(pow(x1, n, precision + 2), x); + let next = multiply(f1, divide(subtract(x1, x0), subtract(f1, f0), precision + 2)); + x2 = subtract(roundOff(x1, precision + 2), roundOff(next, precision + 2)); + + if (lessThan(abs(subtract(x2, x1)), tolerance(precision + 1))) { + return stripTrailingZero(roundOff(x2, precision + 1)); + } + + if (sign(f0) !== sign(f1)) { + x1 = divide(add(x0 + x1), 2, precision + 2); // Switch to bisection method + } + + x0 = x1; + x1 = stripTrailingZero(roundOff(x2, precision + 2)); + i++; + } + + // return stripTrailingZero(roundOff(x2, precision + 1)) + } + +} + +export function inverseSqRoot(number: string) { + number = number.toString(); + + let n = abs(number); + + let guess = '1'; + let difference = '0' + let previousDifference = n + let i = 0; + + while (i < 10) { + // console.log('guess', guess) + + let newGuess = roundOff(multiply(guess, subtract('1.5', roundOff(multiply(divide(number, 2, 33), pow(guess, 2, 33)), 33))), 33) + // console.log('newGuess', guess) + + difference = abs(subtract(guess, newGuess)) + + if (greaterThan(difference, previousDifference)) { + // console.log('root exit under p') + return stripTrailingZero(roundOff(guess, 32 + 1)) + } + + if (lessThan(difference, tolerance(32 - 1))) { + // console.log('newGuess exit under p') + return stripTrailingZero(roundOff(guess, 32 + 1)) + } + + previousDifference = difference; + guess = newGuess; + + i++; + } + + + + // let [integer, fraction] = n.split('.'); + // let exponent = '0'; + + // let integerBits = ''; + // let fractionBits = ''; + // let exponentBits = ''; + // let mantissaBits = ''; + + // let mantissa = divide(integer + fraction, '1'); + + + // while (greaterThan(integer, '1', true)) { + // integerBits = isOdd(integer) ? '1' + integerBits : '0' + integerBits; + // integer = divide(integer, 2, 0); + // } + + + // if (fraction) { + + // let precision = '32'; + // fraction = '0.' + fraction; + + // while (greaterThan(precision, '0')) { + // fraction = multiply(fraction, 2); + // fractionBits += fraction.split('.')[0]; + // fraction = '0.' + fraction.split('.')[1]; + // if (isAproxZero(fraction, 2)) break + // precision = subtract(precision, 1); + // } + // } + + + // if (integer == '0') { + // let lastDigit = '0'; + // let i = 1; + + // while (true) { + // if (lastDigit !== fractionBits[i - 1]) { + // i++ + // break + // } + // i++ + // } + + // exponent = negateFn(i.toString()) + // } else { + // exponent = (integerBits.length - 1).toString() + // } + + // mantissaBits = integerBits + fractionBits; + // mantissa = add('1', divide(divide(mantissa, pow('2', mantissaBits.length), mantissaBits.length), '2', mantissaBits.length)); + // console.log('log a', subtract(multiply(divide('1', pow('2', mantissaBits.length), mantissaBits.length), add(mantissa, multiply(pow('2', mantissaBits.length), add(exponent, (mantissaBits.length - 1).toString())))), (mantissaBits.length - 1).toString())) + + // let E = roundOff(multiply(add(exponent, (mantissaBits.length - 1).toString()), '0.5'), 0, RoundingModes.FLOOR); + + // exponent = add(exponent, (mantissaBits.length - 1).toString()) + + // while (greaterThan(exponent, '1', true)) { + // exponentBits += isOdd(exponent) ? '1' : '0'; + // exponent = roundOff(divide(exponent, 2), 0, RoundingModes.FLOOR); + // } + + // exponent = roundOff(multiply(add(exponent, (mantissaBits.length - 1).toString()), '0.5'), 0, RoundingModes.FLOOR) + + + // console.log('integer', integer) + // console.log('integerBits', integerBits) + // console.log('fractionBits', fractionBits) + // console.log('exponent', exponent) + // console.log('exponentBits', exponentBits) + + // // const mantissaBits = integerBits + fractionBits; + // const logBits = exponentBits + mantissaBits; + // const binaryBits = '0' + logBits.substring(0, logBits.length - 1); //right bitshift + + // exponentBits = binaryBits.substring(0, exponentBits.length) + // mantissaBits = binaryBits.substring(exponentBits.length) + // const exponentRange = pow('2', exponentBits.length); + // const mantissaRange = multiply('1.5', pow('2', mantissaBits.length - 1)); + // const correction = multiply(exponentRange, mantissaRange); + + // const log = '1.' + binaryBits.split('').reduce((p, c, i) => { + // return add(p, (c == '0') ? '0' : pow('2', binaryBits.length - i)) + // }, '0'); + + + // // console.log('mantissa', mantissa) + // // console.log('mantissaBits', mantissaBits) + // // console.log('logBits', logBits) + // // console.log('binaryBits', binaryBits) + // // console.log('mantissaRange', mantissaRange) + // // console.log('exponentRange', exponentRange) + // // console.log('correction', correction) + // // console.log('log', log) + + // const initial = multiply(log, '.5'); + // const initialSq = multiply(initial, initial); + // // let x = multiply(multiply(multiply(number, '0.5'), multiply(initial, initial)), '.5'); + // // x = multiply(multiply(multiply(number, '0.5'), multiply(x, x)), '.5'); + // // const y = multiply(initial, subtract('1.5', x)); + + + // let guess = initial; + // let difference = '0' + // let lastDifference = number + // let i = 0; + + // while (i < 10) { + // console.log('guess', guess) + + // guess = roundOff(multiply(guess, subtract('1.5', roundOff(multiply(divide(number, 2, 33), pow(guess, 2, 33)), 33))), 33) + // console.log('newGuess', guess) + + // // difference = abs(subtract(guess, newGuess)) + + // // if (greaterThan(difference, lastDifference)) { + // // // console.log('root exit under p') + // // return stripTrailingZero(roundOff(guess, 32 + 1)) + // // } + + // // if (lessThan(difference, tolerance(32 - 1))) { + // // // console.log('newGuess exit under p') + // // return stripTrailingZero(roundOff(guess, 32 + 1)) + // // } + + // // lastDifference = difference; + // // guess = newGuess; + + // i++; + // } + + // console.log('initial', initial) + // console.log('initialSq', initialSq) + // // console.log('x', x) + // // console.log('y', y) + + // return guess + +} + +export function sqRoot(base: string | number, precision = 32) { + precision = Math.max(precision, 32); + return nthRoot(base, 2, precision); +} + +export function cbRoot(base: string | number, precision = 32) { + precision = Math.max(precision, 32); + return nthRoot(base, 3, precision); +} + +export function root4(base: string | number, precision = 32) { + precision = Math.max(precision, 32); + return sqRoot(sqRoot(base, precision), precision); +} + +export function root5(base: string | number, precision = 32) { + precision = Math.max(precision, 32); + return nthRoot(base, 5, precision); +} + +export function root10(base: string | number, precision = 32) { + precision = Math.max(precision, 32); + return sqRoot(root5(base, precision), precision + 1); +} + +function validate(oparand: string) { + if (oparand.includes('.')) { + throw Error('Root base of non-integers not supported'); + } +} + -// Todo: Core Powers function -// Needs Nth-Root implementation for fractional powers - -// export function pow(x: number, n: number, negate: boolean = false) { - -// const reciprical = n < 0; -// const percision = x == 10 && n >= 1 ? Math.abs(n) : undefined - -// const exp = abs(n); -// const floor = roundOff(exp, 0, RoundingModes.FLOOR); -// const remainder = subtract(exp, floor); -// const imaginary = x < 0 && Number(remainder) > 0 && Number(remainder) < 1; - -// try { -// if (imaginary) { -// x = Math.abs(x); -// negate = true; -// throw `Complex Number Exception: Cannot calculate powers resulting in Imaginary Numbers. Base will be subsituted with it's absolute value, and result will be negated.`; -// } -// } catch (warning) { -// console.warn(warning); -// } - -// const base = x; - -// let result = x.toString(); - -// if (Number(remainder) > 0 && Number(remainder) < 1) { -// const factor = divide(1, remainder, 3); -// const root = nthRoot(x, Number(factor)); - -// if (Number(floor) > 0) { -// for (let i = 0; i < Number(floor) - 1; i++) { -// result = multiply(result, base); -// } -// } else { -// result = '1'; -// } - -// result = multiply(result, root); -// } else if (n == 0) { -// result = '1'; -// } else { -// for (let i = 0; i < Number(exp) - 1; i++) { -// result = multiply(result, base); -// } -// } -// result = negate ? negateFn(result) : result; -// result = reciprical ? divide(1, result, percision) : result; -// return result; -// }; \ No newline at end of file diff --git a/src/round.spec.ts b/src/round.spec.ts index a0b3ea4..dc90faf 100644 --- a/src/round.spec.ts +++ b/src/round.spec.ts @@ -251,6 +251,58 @@ describe("round", function () { }); }); + describe("test rounding mode UNNECESSARY", function () { + it("should round(5.5, 1, UNNECESSARY) = 5.5", function () { + expect(roundOff("5.5", 1, RoundingModes.UNNECESSARY)).toBe("5.5"); + }); + it("should round(6.5, 1, UNNECESSARY) = 6.5", function () { + expect(roundOff("6.5", 1, RoundingModes.UNNECESSARY)).toBe("6.5"); + }); + it("should round(2.6, 1, UNNECESSARY) = 2.6", function () { + expect(roundOff("2.6", 1, RoundingModes.UNNECESSARY)).toBe("2.6"); + }); + it("should round(1.15, 2, UNNECESSARY) = 1.15", function () { + expect(roundOff("1.15", 2, RoundingModes.UNNECESSARY)).toBe("1.15"); + }); + it("should round(1.15, 3, UNNECESSARY) = 1.15", function () { + expect(roundOff("1.15", 3, RoundingModes.UNNECESSARY)).toBe("1.15"); + }); + it("should round(23000.00, -3, UNNECESSARY) = 23000.00", function () { + expect(roundOff("23000.00", -3, RoundingModes.UNNECESSARY)).toBe("23000.00"); + }); + it("should round(23000.00, -2, UNNECESSARY) = 23000.00", function () { + expect(roundOff("23000.00", -2, RoundingModes.UNNECESSARY)).toBe("23000.00"); + }); + it("should round(23000.00, 0, UNNECESSARY) = 23000.00", function () { + expect(roundOff("23000.00", 0, RoundingModes.UNNECESSARY)).toBe("23000.00"); + }); + it("should round(745, 0, UNNECESSARY) = 745", function () { + expect(roundOff("745", 0, RoundingModes.UNNECESSARY)).toBe("745"); + }); + + describe('Errors and Exceptions', function () { + it("round(0.3487, 2, UNNECESSARY) should throw error", function () { + expect(() => roundOff("0.3487", 2, RoundingModes.UNNECESSARY)).toThrowError(); + }); + it("round(245.53158, 3, UNNECESSARY) should throw error", function () { + expect(() => roundOff("245.53158", 3, RoundingModes.UNNECESSARY)).toThrowError(); + }); + it("round(3654, -2, UNNECESSARY) should throw error", function () { + expect(() => roundOff("3654", -2, RoundingModes.UNNECESSARY)).toThrowError(); + }); + it("round(3600.74, -2, UNNECESSARY) should throw error", function () { + expect(() => roundOff("3600.74", -2, RoundingModes.UNNECESSARY)).toThrowError(); + }); + it("round(23000.01, 0, UNNECESSARY) should throw error", function () { + expect(() => roundOff("23000.01", 0, RoundingModes.UNNECESSARY)).toThrowError(); + }); + it("round(745, 0, UNNECESSARY) should throw error", function () { + expect(() => roundOff("745.1", 0, RoundingModes.UNNECESSARY)).toThrowError(); + }); + }); + + }); + describe("test rounding mode HALF_EVEN - default", function () { it("should round(5.5, 0) = 6", function () { expect(roundOff("5.5", 0)).toBe("6"); diff --git a/src/round.ts b/src/round.ts index 0674e0c..c2e7004 100644 --- a/src/round.ts +++ b/src/round.ts @@ -1,18 +1,37 @@ import { RoundingModes } from './roundingModes'; +import { stripTrailingZero } from './stripTrailingZero'; /** * * @param input the number to round * @param n precision * @param mode Rounding Mode */ -export function roundOff(input: number | string | bigint, n: number = 0, mode=RoundingModes.HALF_EVEN) { +export function roundOff(input: number | string | bigint, n: number = 0, mode = RoundingModes.HALF_EVEN) { + if (typeof (input) == 'number' || typeof (input) == 'bigint') input = input.toString(); + if (mode === RoundingModes.UNNECESSARY) { - throw new Error("UNNECESSARY Rounding Mode has not yet been implemented"); + let [integers, mantissa] = stripTrailingZero(input.replace('-', '')).split('.'); + if (n > 0 && mantissa) { + if (mantissa.length <= n) { + return input + } + if (/[^0]/.test(mantissa.slice(n))) { + throw new Error('Number is not an exact value. Rounding necessary.') + } + return input + } else if (n < 0 && mantissa) { + throw new Error('Number is not an exact value. Rounding necessary.') + } else if (n < 0) { + if (integers.length <= Math.abs(n) || /[^0]/.test(integers.slice(n))) { + throw new Error('Number is not an exact value. Rounding necessary.') + } + return input + } else if (n == 0 && mantissa) { + throw new Error('Number is not an exact value. Rounding necessary.') + } + return input } - if (typeof (input) == 'number' || typeof (input) == 'bigint') - input = input.toString(); - let neg = false; if (input[0] === '-') { neg = true; @@ -29,8 +48,8 @@ export function roundOff(input: number | string | bigint, n: number = 0, mode=Ro if (partInt.length <= n) return '0'; else { - let prefix = partInt.substr(0, partInt.length - n); - input = prefix + '.' + partInt.substr(partInt.length - n) + partDec; + let prefix = partInt.substring(0, partInt.length - n); + input = prefix + '.' + partInt.substring(partInt.length - n) + partDec; prefix = roundOff(input, 0, mode); return (neg ? '-' : '') + prefix + (new Array(n + 1).join('0')); } @@ -43,7 +62,7 @@ export function roundOff(input: number | string | bigint, n: number = 0, mode=Ro if (greaterThanFive(parts[1], partInt, neg, mode)) { partInt = increment(partInt); } - return (neg&&parseInt(partInt) ? '-' : '') + partInt; + return (neg && parseInt(partInt) ? '-' : '') + partInt; } @@ -63,7 +82,7 @@ export function roundOff(input: number | string | bigint, n: number = 0, mode=Ro return (neg ? '-' : '') + increment(partInt, parseInt(partDec[0])) + '.' + partDec.substring(1); } } - return (neg&&(parseInt(partInt) || parseInt(partDec)) ? '-' : '') + partInt + '.' + partDec; + return (neg && (parseInt(partInt) || parseInt(partDec)) ? '-' : '') + partInt + '.' + partDec; } function greaterThanFive(part: string, pre: string, neg: boolean, mode: RoundingModes) { diff --git a/src/stripTrailingZero.ts b/src/stripTrailingZero.ts index 8780113..b02c95e 100644 --- a/src/stripTrailingZero.ts +++ b/src/stripTrailingZero.ts @@ -1,22 +1,22 @@ /* * Removes zero from front and back*/ -export function stripTrailingZero(number) { +export function stripTrailingZero(number: string) { const isNegative = number[0] === '-'; if (isNegative) { - number = number.substr(1); + number = number.substring(1); } while (number[0] == '0') { - number = number.substr(1); + number = number.substring(1); } if (number.indexOf('.') != -1) { while (number[number.length - 1] == '0') { - number = number.substr(0, number.length - 1); + number = number.substring(0, number.length - 1); } } if (number == "" || number == ".") { number = '0'; } else if (number[number.length - 1] == '.') { - number = number.substr(0, number.length - 1); + number = number.substring(0, number.length - 1); } if (number[0] == '.') { number = '0' + number; diff --git a/src/tables/e.ts b/src/tables/e.ts new file mode 100644 index 0000000..4dcf906 --- /dev/null +++ b/src/tables/e.ts @@ -0,0 +1,410 @@ +export const E_ROOTS_FOR_POW = [ + [ + "1", + "1.1051709180756476248117078264902466682245471947375187187928632894409679667476543029891433189707486536329171204854012445361537347145315787020068902997574505197515004866018321613310249357028047934586850494525645057122112661163770326284627042965573236001851139", + "1.22140275816016983392107199463967417030758094152050364127342509859920623308363781624228874401337247396902783756582071222657872335735698322420203091783847852468196963515090275879656423105784038067892980765878816657563573480602908117582872101992234299467757368987418370836563153389462747746988296269108061275281392456208243249268026539778924251026176313926132967183139404485664941616843691597024447586738912784063277359127768204092782706320234475212712014508481918262357879464226202483894518888192549035034715597321", + "1.349858807576003103983744313328007330378299697359365803049917989939612587399539891293796485784096715182993915046496649823555281317904746176330174697914134611623510180348776728882134107658893142886237546315268956423659470780978312757181276728365015226253890933258389419871658954993580579042712940646224891469297274304073301451390889351970899528642926347862338071149211408737527216178389071834814268450261525986465964604240725313283687637440963107718301330951356415753972714631376348680064772218613611483339228569651085445294350178104320530288284696175866807479054565245092139097584381245312021271592764191527971036208743048564156633628960281631838046184539943675102487856097772374221297245505051183848015221680960625161769660863247928466143070056933155076029152109198619", + "1.4918246976412703178248529528372222806432827739374252815956331500723650987080270940005743751395204332995146049712374327554149926253602141716230772600403407491873867150724945487212617660656620072704264395870570315311010113322105932230805422737018500206392527177438579578556189926416736085144638705057672356404429354629959069215296346423445412842930842338368651426888702440282339072078820428812172552291679864844405874392991397534151119907597315402375400805761858764070148579243901394571509123129260659970829149641445173093621736697471495715486927871427608521974813357303938049045027055274617248235377478635882464544179074744286716592660820629566276461885843196142347558399965088751380486680925242174092668548306167997919161040598441807559801618039547286283635268768983411911084036444003391406619758488846706626640355860622307506467065190571454306273600406778135267686009580686515055777572568306309595260360492639973537087137347050023394616393906703697628564832791198689610819908805991960205502002473532624419443167353822377041", + "1.64872127070012814684865078781416357165377610071014801157507931164066102119421560863277652005636664300286663775630779700467116697521960915984097145249005979692942265909840391471994846465948924489686890533641846572084106665685980008892498121171228737521497221259813802364604394123302337702342564441115073997210339345543632427971478640993009214371685872851424554356204792843238295646431490989989559298639300873734528343887199639936097616043887791159196535233519726480396696337931220763089035352455056481345843941842020212763119317243234414790916753474172146106996570450921757574263944725690829548117247432018340633298482417480890385134505857727555061166714846142254643382172817464252944064119480610550411214216150015806428026218072435549458500264910615270634896131341405150953300907304199696610224898662704055364699222488547803416596626400854705247760207415313247478751208997988819063167774971424158059320000508837926711487592221411833120473118940174150839318956411265214927589489222002618989424703890008658172723963726628180320021102408885281948306909133579708714540083108622117282123853386065037903914832977915548985425218334949782721619507339453842540738918246146490048448660414624464961524536296212426067836554424656828424228138566437904693429740129065343555896062662077213299699", + "1.822118800390508974875367668162864513382238808546435386320547476588819650298619237506071841611824533131511980084733212162604411051946388331577800804030556735220810982370501962391864313333554698490208265658190969819090734754749827177848273296632519555680103680326369352437791893895038152776723546377012529473207851151551688242638129468067423693457788686737322308859196635577406424535317253509122371220622994977976488678953227355968535226011981026891265759205286137730603315671631660105006528658431765125587595376593446335729037108814939435477611527959248377638771800033625299101758522787812658726842991493891554409933462204120505376533298706281045546514892620277647385214857618436655863924892218047400811116831042680487895029611648906250960278076271249277145102395991693860611831983025203596058754756019516099900266095850415178719614749200451630535061160489190411763823857450791548961055118169806794713874454939988586811643596429338746010525986899857961587944139308107436769695508633096338687346716373921410474524266689139689311366516947054631031160462923809187729982871513915427654871105844432037418907865839686988704917607346571370310822906994525483818469890762365701037332197459906166318134391275013867439967207601879970902034384688314406747097203766024003073884672273060729687254540281852107793074492986426871326231804793173823349508810551286252776477149073401952138042782050652434065326561952854233161279618029767330128021096195903742999575860846854523510091165177814675930213024375018164078691687009724255773069550816206514391507161", + "2.0137527074704765216245493885830652700175423941458673115689893008797813008588679406324379355851788044338331898308254040110152144406355672122332987484386680282011586454587874291207920063096506060092121746339385003035706369942761654499650114370277576609074394476969349195415563411287148054594195014950075492700297283186501952215548266611861363515166840789209921665299236941497660514195676818497506715216174857824667584113677462277646521368145755169801610652069383900929636397476997976928986121402340613272005739386746343595131239407140625657434766755405604726559983098911197009867487590223559613492600292768297051485732713550448835403835352549463376130577581804732758041958835979535301727820054018405592264887175988369901092552028042689226587551744843184492524888491684438908350917254501814719615534981346941241332070048752850076613909872221227923256131385070038327284304187184081154788930005575892847954811706365631293695056764191098947623473863749480484940756222177807267238801516870654540558247853395741216289690556742625956213865161202746032011088919700768154544490761339022261482519814495299963404741430504214836798155729249493697925254743226038042230995868518047785789005613825713835594435128868667771495101069180401795064269233374799738867352453002639997668416935366386592304127698022250575283863420166408296272643322148060907484201210428960680526033446678578974007350742511058399463304152252983283111059782340661351915733128923447394041481646451630961371702270477501539244567625913375076027018672900253183869684213821854331885455218593203695168621845862590839866070698465191768354775162667919687787234057113703426381234125007404970096051044315268874858727339518165207062282508219103550897032474383182390962719939041810953987104324795493331907049865728024468068697764264074787176174506379", + "2.22554092849246760457953753139507675705363413504848459611858395555662261021440632023826379767119915026374251878156387711619774619379855963687103747368472284226448865340655354317185985377030850245682664363225661079813536128785653726513719167842427129812110484311349165777902729389254511878094742813123387667848699059429446010657151043572826832010313208047732807930998614309870757227929101960381147954847517822334863279319666225559304046050087758825776791641245416220959090737379947978891910964567194089715072100803252233073248441719882854257031516049204581676853691460008296615228145430792751845579928748303335224298540140591302535466469498156065075049022167880244375473655622669689327650015305079415315439914200799195123789362957387187941117003174099693531506115168225416846731445216503066154563061060352226369700173570788781093516825383897874045751999350339808378867887307801498607904212244602606554161614131633524614531883236101562055698735197422864246157477439558784175923341664781731182017904677692890038751961431930364624097536076577459379586929940521167397559605869035407545793472238578147959537818114915637152419390460744941310780904484651026135598787393535566242027093950477170576851928767959213832520123359412209544604227356318776838329784976706937070674967308806522361845995066951391233792165311759338384098919371408326428769572713806130074267342996786117989877955011626521519806731160466960246214623368412017241669817519218938975787703688279670969520255459580782566824698766683025943011418413515424475714850262109066781102851851979626998205883326687030200455933362261083827188323248686155376982520491891859193912296678363031851095031585999296235557983401989894925443480452646143604665935035873612963289853124279447614565761048011466854209825044470072858946253771110646120878816878134534234062942337153869787247084363695742055676354219872791968697195149737804123025516854480966929100783654238470977617175020837913707478778991341149220208658404839283930641502839083068918900160104096532950404697685876434536064090817056280532188943563915681", + "2.459603111156949663800126563602470695421772306440083020748545736657466552943365860870497185275930801502314734282469001211863377120754375262961184698244101923873118980752553546206085511483915775565746633877944570171310441342807039240011800950067877653276578939207957922264156281735850299153120666705464183289626292382107850626757086481112777076313695819244326645247215187769898739208923979309373990446742434297871759538487547808364593778694498844772835078016714351373598016467631087278899749286697713740248674901887803256296138548656549872572977525766104722565107146500648985987203867132117547677722793432947466268434715992314177189845879538433878518025300096774542323436522591754634721655783263629640839419113447179019145648844517390978320904868643199845305360956544494557422964230972024073035383722263932056673976596266688976321828928564444485955130282123956383440560652142134812702650195318853004793654327694163135311018560302434548157745596278924049359462262875684655024660621143270223276160205111113928674619513010825531773437719585670055905189480192487461443889421286148006246588358783823432756235263368472035520311691553695512537108796193920657766396287812148336508130560411995851432991098150316151710626822458450166702368954969918890855718477702866142861632457171714589428586925352111493288264877793764611187635117419219667724089358648691849349019774953975112073361668366390843101189643022503196449529273850914731962177302267814885008720265909052869903077134292211446012339728016145173776605298068332932215627064339536349963737505457519321720111235396885978665426051921476079008722809300128117266650623362110732864760301900017299660039379063962560499694800926090914390798018070659760804286858439659842007948172165140806138672059440570988428291170643822030057401246220069601172550649731972117725967828449725240661095291919679379580274098603455617464670785310583926637393873619156058283990235643046346147091976283156228115434842186613044398987912680078472025977495377880564317393705447963819914365733951865401782223781823067701249854212472507082498852675712141033436456921920235635932416059888043961227210308986402540506511344650923632565845792598802341393743342422242830490309556974956001755607771592980368429255689748738593726168543904401740920843388611933767910638184739366965114643113679309810659" + ], + [ + "1", + "1.010050167084168057542165456902860033807362201524292515164404031254374190731323852253210417020805424644822048349018187461836882962867029471348122509994980620193343756983419263331678116890952977342412525238660052128564771661099141138373740030932375484797474253", + "1.020201340026755810160143920483151435303508991193925577274241055989764698001799473651140929048897747567783800834245028828510331946890882290633380114769851598685744140375597170707424349379520528467454229732767262381708980414285750783230743973744291273147993499", + "1.030454533953516855612439953831198132905025142988223325669945482984656275528143507413690159736153367833262717667969420762924665205128543186726815728146644027749899016551570459982549960946831724287476034271222234314936525314771353449031855228611755471551229794", + "1.040810774192388226757044757916854744082977050312312035233957186052848044168317778353605489758071664887267683574643292017752950273390217859298583514134022896444615385627894619269308729639149680681368915289974692924712790670871941809116920080546004777009977082", + "1.051271096376024039697517636335645220174821296055062528783938479166279869650561268909887381693097467956359959802287840109856898277991870910996931622269015847528217521038290049746389922767632968070266132836298958452051202283898407113137668129272719733709427182", + "1.061836546545359622224684877168372328428260420330079059772946224885572614646084795028727107540254028462725979079478817859771763808885702260691363941508870196834078432934454312238181936983945541942068693355958230093508349025302765186495840221334120606071291923", + "1.072508181254216479053103949889114605574958973093013631368581996384184663872870122142938195770222664418254764408892720110775221918308589471660420537322754050996390544947060412014702775390723097905171301841614973139324709852063472998538152057727154702871352078", + "1.083287067674958554435987758674888500198713572836593968977149136159258009574303026493771584720423995154971654271223663348911143174715668624259808265653232762681246142307810608195731327006732520819601068839992977872631673981442100729100750479561971721703257072", + "1.094174283705210357872897623544886011846519908747085113495537273829677943694135052107150933181696135377161199865920871107158317262615140642553465724478938198810156930341222455108468641066277461818416868403944990238207068911482417587752512679561090991848685506" + ], + [ + "1", + "1.001000500166708341668055753993058311563076200580701460228514674460359748251448298412718226004153260943068218872095099342063678696119623840972330905531768311923556198498023652909377677730283868486287409870317224336827290668524342227007650646080335377683539402", + "1.002002001334000266755580958731569947141262360355881650784254327401407826211342908735167751841578573842087720874539215063369808541481798858488186179510193185360846688470245765779287676702093047345577268794005585346872102348621068884894677639696274087962023832", + "1.00300450450337702601293409134890020533187271956193064005816386977887704167032778817835718449794009129738172654330257629939497609228121058276487935834566645111932939622158438169617802320237286016173845852664382662772735225891910141326100743286140812329716465", + "1.004008010677341872358807975325862256786679584568446515824520101445505613334720499643274149387061934130095719684438458233489149633082954545826902702369355374132139019359038155028498554482932087796695756199850948857306997101347029384618537438780565191707911304", + "1.005012520859401063383566241124068580734875538593956360758053700178766756245814257769725878531005582561752872914964453059693371357350351629785031289228112479393000390737852735490064653453473263950263469180412515034868068037410009410423281936206661529650777831", + "1.006018036054064864855584542073814807663397023131207238128209310729162232251624511692721095036373574483233356676638823820201979261982436682169260741126877359539784408851803860808991870535936635545440055073405777167775394256588337226812975070293010932647774324", + "1.007024557266848555231600031941337387260626958324843573515364689887121935057426030048643842343378401601112246752543195873570584146404476681012065985847363008474306541126869561447531097035189821427350474715365757081347202689171315251277667530845240665265299241", + "1.008032085504273431172073614608631847461248193629898477319670850659315558055203072544926387076982815517924276700035813263652577025921163294422287501988755195063376817413349886928919042162630307237198554733730866338155519701284057736281012337251398647856788345", + "1.009040621773867814062570481311874274057745096807557533536793791893309190089211313774252518807101361017003109570357638320235688072443915664196164220142177807129999765515285503655079866550036049450757501377434724079219971788693007550857637620196056994725614551" + ], + [ + "1", + "1.000100005000166670833416668055575397073415454172178381034635390972311235972781757573430475110294393277744056856189456093377349308639835234864147024859575654444223594337482525749599468629752896998058770389517981545014836069937171108315141768826558752790276236", + "1.000200020001333400002666755558095301588712550265063340281249616462339933552635650404575689469783860722328853092919751879277515614513727994472210356634280535514759912694604145062526466543039555669877231954222323073542460530523928410171365347075351011821920295", + "1.000300045004500337520251012543394484429242698705094453657909046405426810389812679452584785775653629322172025648290344728788948443651164069121340691369780280752072301321554544169816823932077142996969576906644974657939554818844412637302594762038150619715293429", + "1.000400080010667733418672355880651175325602089234218127313638994866471733257393689147689037528495706906710548020054317971434500261679934483484883365324764324379786145945431964915418427301969396382574915094633029858419556374510345888380818423418110019646700504", + "1.000500125020835937760438369605751648487716767772005667654052528513185499225469269404161288162290263445071720143880459750657027560342513592842257775359779789305459334406770729214405898908865552327309638003027229853587275580967668200112228756540688352311154381", + "1.000600180036005400648064805554702313487380662321427742218779523265089444076340698564952604142576704373734829905992750918066261276845603358030914225286385902646373896497226913904457327994080504271798651358706636453059949377387742804353973513521969936501752549", + "1.000700245057176672234080084397124317808729972049887082920697544556118662092675751649525697937257144190017868483717030126300200509168688033318071339742627167336587481821812960447646818515221045591253213703416322339042019757058294741478286115192071830262104121", + "1.000800320085350402731030797169875671484970787023831957698136827590544488579455328399517237263085338370118947386598991767922241276098928474413390097019906957313039688997723589590992573554820372138559418413121238600026229549189496894374911921472634282466150763", + "1.000900405121527342421488207410855909240960364438870706386170964512041266577901813243995078190574746902747080924348105047677314326983090277701922714443700530813227920787438119571392945308376198426393506918634436746759027328287815213664693795332524735463087053" + ], + [ + "1", + "1.000010000050000166667083334166668055557539685019844025575947974286518040859924541627171360141414808527964710456114808568579194429073542519236311802480484946481318067459005203787629467197723492854996446403371670522585399835010157731202234906636252385776731651", + "1.00002000020000133334000002666675555580952444444585538201058714126235905329240541941460463111260447087759745526170244469724542720133236462083910268982377765723546309959873516346614722768345641097465014525930010435730044916587618556635026327839524395833885967", + "1.000030000450004500033750202501012504339301986661384091295086648836751748647469450015964451670052983888622000581616827713185780669338108129262463661100560276359891431254482497644594518311264674989317833539411130935378547235234149850030248683847558235949192424", + "1.000040000800010666773334186672355588063654603897004653273294246986372534769339653940902480758988473452263946419318465732269864516290202354028672947499884769594544980789708021919265600923317888907545126143154207287758799568586448736519103967528945971526548865", + "1.000050001250020833593752604188368210566445007862474552660354358193300410181171307606063524320643523978564544928969865946453669990898899456698349198366716859128164016860292475535424871378362068018619464946001908269309911380465115625730470139574546168248414669", + "1.0000600018000360005400064800648005554327371706287380580517448041768184715082802102822710639972596644286364335407098336787101683082519331743726773721831155799714031419453036224798582793575860149124712362688085932620035829070681390851428693479523215791315023", + "1.000070002450057167667097339330069689583742177176723647063988790354210467474771865973142735988449874178404296043885131632312715760670823804989006222060531708444185344331114273860623983993837941069162433957327267046454693493702350816632053640929378397569224776", + "1.000080003200085335040027307030759716613039100029766726281645469033146244455371326825242410362812667390249632806855063393511294820363074995773170886211112043017322472818660214389638836378249754133527844678406244041534554373988144575477289266056935662827704568", + "1.000090004050121502733799208238121990124620911386617650268545997115197477729772808193789097698902228616779638545143688002498080668191392250030819907953393555632250735284651864761358652086319522549247127067080851958286265291953836318860562133321982933710810154" + ], + [ + "1", + "1.000001000000500000166666708333341666668055555753968278769844025573467813076198494952835391203458229748677004015804035149881283353005876638466337275595012771755160063386490687362457247978228580884154230359796042066216890640463145470846706955844825203502338433", + "1.000002000002000001333334000000266666755555580952387301588712522328042379349054566833660167181437047765093225411054231512232000686252213399825626439733598663743759193375087814488620462276244525976983466408498021993849036041894526504322094571719953352997296398", + "1.000003000004500004500003375002025001012500433928734151839955373415183009335525061132656460958137667580015165164788249607585867396819057285326555960166937649697973379255965258502453132749605555659281253337641722497540635905649955343904464110817430087236277383", + "1.000004000008000010666677333341866672355558806350831746754144909770828180249872278427090395131851159823632422197402740977847069569299698172678405177176752031063667161866596069388686444135669904957535469560754938297276129090532495319450469310001482708633857767", + "1.000005000012500020833359375026041688368071056557307173041021760810581713597910150822615040172518383155879039901575224781594686498583161076660122024484253078169629131959213103609416701449976071941387410235464597750689312106461726726423745914525437286467921547", + "1.000006000018000036000054000064800064800055542898800027771445234294803121427534564955943850794837297671518974352450646804505269707458299371394556170457704109967851854196460183929711397642333451409044458139769431977686515948803676537433882198942436033685726107", + "1.000007000024500057166766708473391830068218957087420770926023058705014627836931346376561248648943914301771998667561988061508464250718883634451632563486535656537167272887888081122818446250297457337741167996349750029452642438203264827808024523752573238419578446", + "1.000008000032000085333504000273067030755971657558959100027103654818370719061312164579253428366464456865704272537228885187015821963109960213301575481664899700318156977468627339004606537398549611534419591779145085995021987503286692083161615280400738437478228082", + "1.000009000040500121500273375492075738113449002853342362270826936522769439053506312434733891423696475231451840105639022034099547530631069357197734900223780917121362697414411169834162425824448828187739490931751957990245737110414834239697625619798509198502096658" + ], + [ + "1", + "1.000000100000005000000166666670833333416666668055555575396825644841272597001791225749809603978358318652155457825720723310835749477655921114381043370965778946803600487177628675696518849337844070626989834763657881129895761844201299169626521857477088528076787941", + "1.0000002000000200000013333334000000026666667555555580952381587301601410935026455031585698337876116969450321577305954872095570508305771300267271499578847512370499623533827733553612983384410604230310443624550120630972400618605844172547533274118825780193176817", + "1.000000300000045000004500000337500020250001012500043392858770089339955358770089330093345265320642486420378812047150951932585414871265710565736755891829214719352313336596892188244686930029886632072476330684236070498981285061952559758496574715013905892895701089", + "1.000000400000080000010666667733333418666672355555880634936888889611287506850089234183135875154730635650316057486370988380148651512646061821375107132862137685917854711244758264394403486935467487834601381881074388794755133200215304180036071713259670219661843655", + "1.00000050000012500002083333593750026041668836805710565485878596768387648163650363459170938183586448223517322491984417230264503853560225899248618260891812286125687715790717851056332021067227280094027013605976616483231712313908590884158078628449553297320265405", + "1.000000600000180000036000005400000648000064800005554286130857170628573094857233745459089870339612396601341875185399525960230416993842863520266038257286707886476669929341390017488971653286696873950479551896971679958715383478746119711068288028062391371149489013", + "1.000000700000245000057166676670834733916830068071895695874206708425953000310487646018304089060036787599147676275105859400474689895123100075425333066539374860872723840060463730171521439940751466901429495510481112965046593615553202195597459116945123426063272682", + "1.000000800000320000085333350400002730667030755597165718446730528598265921018024975740706254352576521064770040651166185959246668919556974378390605929012147885350292967351465271446885744407117136286055594702758682175847035062242848897900206718995002247133857028", + "1.000000900000405000121500027337504920750738112594900189247699728341390729295808046226796645426268557424285412997921532857831252559494834249449859109227293811330322601387155767798258269722975398926936389317746988260923777387227501391642065587929462420948649232" + ], + [ + "1", + "1.000000010000000050000000166666667083333334166666668055555557539682542162698415454144623567019402857944526698866978250658807361436330455014317926127615562200160084332078829335070241590368747866364909946478207830319530929114193223423472427136476351070384633625", + "1.000000020000000200000001333333340000000026666666755555555809523810158730160141093477248677253807920483138260929194262546389530541572869646520440208084154592575244829846475616092104703889032125897195071483101405504938379453255735383526992590359391748128287405", + "1.000000030000000450000004500000033750000202500001012500004339285730558035768526785877008929015219156953632307755135494996911581545128998738775212024344872737597647678017165824376945452724547758781666745678104162427281549813045542731484072320901013699751540848", + "1.000000040000000800000010666666773333334186666672355555588063492226031746754144623700881844722783424475442360990450187254251567422193813585987728199005661346037368045665532810641944716974411635496550894053342760394407334227944985761375822664063299977760202737", + "1.000000050000001250000020833333593750002604166688368055710565477159288199826733382290633389520515681243290082960907019379206809977191789257370469042321233232800461660402341054369158081918084989239338793682313776586227863512850221202421400273283373014626367211", + "1.000000060000001800000036000000540000006480000064800000555428575594285742057143023771429480311692856103917078121968011417513832454609367779840918760983285672034325842279012880873143319189323358452529556891585903632812397146307138829975274828994563695371179662", + "1.000000070000002450000057166667667083347339166830068057189569458742066083425945994475448626459922975804831403503407994163590626814758811340046507352358986760731455499065728116768159458733073621810040408316793287135185674491416007904172650363644834002683382753", + "1.00000008000000320000008533333504000002730666703075555971657147018158767145538214765716437674024287074857138074282562507322952457285899884827258634480202409132370650245847484059340021912733791131203856792980510306420862566617226572338856338435031664716693301", + "1.000000090000004050000121500002733750049207500738112509490017963905559103341304251500301830456961374530766246749440063115416691606198573254987480954117363856553419891520480849271064924566428807047867009390728824337185742582403824875085506729653219774600501303" + ], + [ + "1", + "1.000000001000000000500000000166666666708333333341666666668055555555753968253993055555558311287478229717813076198492867247207525145893201460227749911054309202505145378825438957130678837687266560105088389907332936208344126353435648007509079302366904838332737965", + "1.000000002000000002000000001333333334000000000266666666755555555580952380958730158731569664903280423280474587141262359040138133471466992736834031733502636105810709353815485197855429903174537090912633982404546033943476658527442915537642542256751648098540938329", + "1.000000003000000004500000004500000003375000002025000001012500000433928571591294642911383928587700892861580762988122463474282007055499419665167245143251664943594715148543087862808485217520052561838182926761331655514641487182847805900109952106216843867588068853", + "1.000000004000000008000000010666666677333333341866666672355555558806349207974603175325573192528818342256751643453335471124025932917900958536700278753394083087253080794330245466119358391768262310261548181640401381566398544617645066573738726605241457683162358406", + "1.000000005000000012500000020833333359375000026041666688368055571056547628735739092683876215213190312069808326828429435504808836584577556241828530001848857197197448211202934610464624745817298908884851334334032243517528230506352913584728945540127503247334304454", + "1.000000006000000018000000036000000054000000064800000064800000055542857184514285742057142873805714294803116887661298703396123877022771514559643784921476238095255198598792535200905864592462478874938320339031361777709608682003676296114904000848969978666037676208", + "1.000000007000000024500000057166666766708333473391666830068055718956944587420659833425945293891988861264598969692976408540181920613546886836709421546188906759485969317880330268377230197365586777939297035267858198945289644124491347823705980150597478089811238908", + "1.000000008000000032000000085333333504000000273066667030755555971657143273244444814312522341749841485037242407372912278975495665944488178378343886315424095469213776993555687392616104926576737106225715914016443147964116812712649070583759250245851205008677469484", + "1.00000000900000004050000012150000027337500049207500073811250094900178678191272428191272417515002310759027859286803358595908816669708328358557549585827919550781509555184392013474906695251704896486905504823982001490494955628430631018008515640009464192836762086" + ], + [ + "1", + "1.000000000100000000005000000000166666666670833333333416666666668055555555575396825397073412698415454144620838844797178381032547701302041579835416640972311235208061369602374898159661717890890636377876292167626807167118097418250089799613232822429561584839732436", + "1.00000000020000000002000000000133333333340000000000266666666675555555555809523809530158730158871252204588359788359839666506334028111805902739236072757342598614945704892826162667432877205675217861820898140236791877216104086843490250510449150481689310382491997", + "1.000000000300000000045000000004500000000337500000020250000001012500000043392857144484375000054241071430198660714330093344156953632305220408497752796394453771498033216988957610473517976082538957931840649372284007980778387079364588612237999322952503353246629272", + "1.000000000400000000080000000010666666667733333333418666666672355555555880634920651174603175325573192268754850089234183100884792902571758052646972327378677406133744778611081257066906765018961252872327129135458024179406515595154985765757709114409879325763582657", + "1.000000000500000000125000000020833333335937500000260416666688368055557105654762001643105164112447641362588872366729829295443148050046993630164903199619632307099045282865341315842970320393225917211453732599727661119186787432356941799959234635398296083997006139", + "1.000000000600000000180000000036000000005400000000648000000064800000005554285714702285714313485714287380571428662316883121427532467742209790218779163693808965891265088968175158346191639365407702043087739343368804570472330777845741875602316524836720744596838442", + "1.000000000700000000245000000057166666676670833334733916666830068055571895694445874206597333425945223833643326112645989436864693566253849841192829330529553945887353131797463326009328289333089933370063364144225191646223300847249495173234424373673541944624979205", + "1.00000000080000000032000000008533333335040000000273066666703075555559716571428987530158767145537921830196825612021369262382312864973497139947588769798444529279829947588643443285558056813237014675084862707667638417307510222862170506049780991734222020598622395", + "1.000000000900000000405000000121500000027337500004920750000738112500094900178582104841518924769866167515002240004474209193517383867930324377468044757492746949756095835764624498574071199440142689339384466863378791519731786238325701991449155383573875144382022735" + ], + [ + "1", + "1.000000000010000000000050000000000166666666667083333333334166666666668055555555557539682539685019841269844025573192242614638447974286515953184707524985304368984924541627170595425328394905114959781791792654948681248246092509415204617290487417116640524671775301", + "1.000000000020000000000200000000001333333333340000000000026666666666755555555555809523809524444444444445855379188715343915343920474587141262359040136831070164403516530500657509842695027911535848043821402053583856122155392523906401192251402380938316915480143814", + "1.000000000030000000000450000000004500000000033750000000202500000001012500000004339285714301986607142911383928571591294642857586647727273836749188314248641983022469439043110730229591857308776602897731494805150380123093913492034937508031925936525164255550480239", + "1.00000000004000000000080000000001066666666677333333333418666666667235555555558806349206365460317460389700176367131992945327329421196091365293143081697890586810267216616505076424653349506852152837802535905072055073786420151577785100640838396137277112251514735", + "1.00000000005000000000125000000002083333333359375000000260416666668836805555571056547619144500248016411244764112038587136255618718183873319134007264068095774525059241470925396170577487944738923374878447003205386484881914018245946707333822256547575648332174683", + "1.000000000060000000001800000000036000000000540000000006480000000064800000000555428571432737142857170628571428738057142858051740259744804155844176818381618471507920651137351791067425123447985349695682484654572318487957897918242801974673257648070007868679130426", + "1.000000000070000000002450000000057166666667667083333347339166666830068055557189569444458742065972333425945216827808777011126459894108581865282025216633943931012807982367336200600492753258650819501465012407695965228823807927322155096641118825460150386445518263", + "1.000000000080000000003200000000085333333335040000000027306666667030755555559716571428613038730159100026807763100038095259614835337645468150286810918977324022206242931561668484892962175461856164162854060279811767399853148829723227492951123779037914467762124188", + "1.000000000090000000004050000000121500000002733750000049207500000738112500009490017857249619843751067627008938180071651864330456372342868033181841733736211930697323760184868971758523921789168189768615744476250539036111741578555829725167955219694647353096622696" + ], + [ + "1", + "1.000000000001000000000000500000000000166666666666708333333333341666666666668055555555555753968253968278769841269844025573192240134479717813076198492865161619501897279835647891203458229747912288359543650548989349005883400229246206526163527289595008850667173127", + "1.000000000002000000000002000000000001333333333334000000000000266666666666755555555555580952380952387301587301588712522045855661375661375712682379349054566832344611437944771278292548133818000146042474087934405394723223543640599392717523920626753962817433470826", + "1.000000000003000000000004500000000004500000000003375000000002025000000001012500000000433928571428734151785714339955357142873415178571433009334415585525060876623632656406093960958126694744810435100615729450516002218359617667057380685556574837983621173494200824", + "1.000000000004000000000008000000000010666666666677333333333341866666666672355555555558806349206350831746031746754144620811576437389770828180214846916538934316722871531760423728464363385819413586609559082109346707911677721834735995817714714655658155017123966004", + "1.00000000000500000000001250000000002083333333335937500000002604166666668836805555557105654761905730716765873554101906966759414269180016504642155734790995478949110032280612198459362555198266157726625772874678331610798998177006297680609976524115439541173420259", + "1.000000000006000000000018000000000036000000000054000000000064800000000064800000000055542857142898800000000027771428571445234285714294803116883121427532467534564955044955943850435279366265734265869100042814376117193730654971650198545964167632457503232017871985", + "1.000000000007000000000024500000000057166666666766708333333473391666666830068055555718956944444587420659722333425945216127225322145111264598940825753582453602353313225972915411685074603803437053433977043894247041815994636316149529701778786472611784462703889138", + "1.000000000008000000000032000000000085333333333504000000000273066666667030755555555971657142857558958730159100026807760436987936508151703908930719061223879089942306582357031179238190271212908602022996939574698978718233321541425959528060975659005527346418528599", + "1.000000000009000000000040500000000121500000000273375000000492075000000738112500000949001785715353341294643924769866072389435736607929018849432407803098113232874672320130046233975445553072196307524291707537220510858488196407197643148826305620029216908081970869" + ], + [ + "1", + "1.000000000000100000000000005000000000000166666666666670833333333333416666666666668055555555555575396825396825644841269841272597001763668457892416225749809603976270645024985302763096599902155457825720722546120136232570095008736915152259095717555490353654637693", + "1.000000000000200000000000020000000000001333333333333400000000000002666666666666755555555555558095238095238158730158730160141093474426835978835978836491903158569833787611565389474722808056143268841681540119296733053347123188393029666555965964618355391948779923", + "1.000000000000300000000000045000000000004500000000000337500000000020250000000001012500000000043392857142858770089285714339955357142858770089285714330093344155845265320616883142486419830170378812036178118579523155416218299696954834514122792910931153971094557661", + "1.00000000000040000000000008000000000001066666666666773333333333341866666666667235555555555588063492063493688888888888961128747795417351675485008923418310084980254182031959917508006396898364938999859716891065039215240131218967246103644485220410726154752182813", + "1.000000000000500000000000125000000000020833333333335937500000000260416666666688368055555557105654761904858785962301592683876212522314969824735461967924533029209381816261176142259312832929617646027019562700585870131297332583548849712255111360166306405086567142", + "1.000000000000600000000000180000000000036000000000005400000000000648000000000064800000000005554285714286130857142857170628571428573094857142857233745454545459089870129870339612387612396601341515627589471100328256668816897388801845549408590481518481518982450895", + "1.000000000000700000000000245000000000057166666666676670833333334733916666666830068055555571895694444445874206597222333425945216057166976658951112645989407997470754170760066981154246423015810712407224886058134625535319860314645696585222499332309114404479010322", + "1.000000000000800000000000320000000000085333333333350400000000002730666666667030755555555597165714285718446730158730528598236331599254349206351358308930575740706245524032130353794354298842520912389088268868503018037747790192050898910086286503634618149465704747", + "1.000000000000900000000000405000000000121500000000027337500000004920750000000738112500000094900178571439247698660715353341294642953229287946436433045637175914296604606371988765933288088674127964826707631922216113496674674148986363044496860143671243577643241797" + ], + [ + "1", + "1.00000000000001000000000000005000000000000016666666666666708333333333333416666666666666805555555555555753968253968254216269841269841545414462081129023368606701940285794452461119336553364331142269510325065880736143632969029870898257141643432824401739745683204", + "1.000000000000020000000000000200000000000001333333333333340000000000000026666666666666755555555555555809523809523810158730158730160141093474426810582010582010587141253807920483138260916038706972040305373657500641627625779668107710435784086577737371425015371482", + "1.000000000000030000000000000450000000000004500000000000033750000000000202500000000001012500000000004339285714285730558035714285768526785714285877008928571429015219155844156953632305194807755135489510494996911570572295830843263878998738775175717176310059097941", + "1.000000000000040000000000000800000000000010666666666666773333333333334186666666666672355555555555588063492063492226031746031746754144620811290367548500881844722783389450091142108919886805434894323783520587584079648392819017157643549035718347892490103756832682", + "1.000000000000050000000000001250000000000020833333333333593750000000002604166666666688368055555555710565476190477159288194444449826733355379215623966600529222853848504890681243288122630360738677795976463823627917153238548547431722212537579252513491528497895141", + "1.000000000000060000000000001800000000000036000000000000540000000000006480000000000064800000000000555428571428575594285714285742057142857143023771428571429480311688311692856103896103917078121878121968011417154274656689596118168895082060796351269490173691870225", + "1.000000000000070000000000002450000000000057166666666667667083333333347339166666666830068055555557189569444444458742065972222333425945216050161142110339511126459894079714642471342475838347947074466949660826626759076737909986334434737200569423813868209125061118", + "1.000000000000080000000000003200000000000085333333333335040000000000027306666666667030755555555559716571428571470181587301587671455379188715480990476190497710073432740242870747688526349158515558520603402824101263705714914519281853707209898319172054430569538082", + "1.000000000000090000000000004050000000000121500000000002733750000000049207500000000738112500000009490017857142963905558035715353341294642866751500223214364330456371753836374526684257328746723198702565062957968528363119291981226734282851988084786564653406103472" + ], + [ + "1", + "1.000000000000001000000000000000500000000000000166666666666666708333333333333341666666666666668055555555555555753968253968253993055555555555558311287477954144896384479717813076198492865159533913874191651969590337645893201460227749910289593593991742139890335833", + "1.000000000000002000000000000002000000000000001333333333333334000000000000000266666666666666755555555555555580952380952380958730158730158731569664902998236613756613756613807920474587141262359040136817915911249244582578103847945117786412685883585354487957662562", + "1.000000000000003000000000000004500000000000004500000000000003375000000000002025000000000001012500000000000433928571428571591294642857142911383928571428587700892857142861580762987012988122463474025974282007055444555499419665156272310102286106750394522086451494", + "1.000000000000004000000000000008000000000000010666666666666677333333333333341866666666666672355555555555558806349206349207974603174603175325573192239859195485008818342256751643418310120002137779915568470377359266251234291869212504954247007157060272389965511657", + "1.000000000000005000000000000012500000000000020833333333333359375000000000026041666666666688368055555555571056547619047628735739087301592683876212522048546523644179895403141659652076828429435308775782586614292343529022000662935706114244280270246557851904047187", + "1.00000000000000600000000000001800000000000003600000000000005400000000000006480000000000006480000000000005554285714285718451428571428574205714285714287380571428571429480311688311688766129870129870339612387612387702277151420008598821521335807063576195233338095", + "1.000000000000007000000000000024500000000000057166666666666766708333333333473391666666666830068055555555718956944444444587420659722222333425945216049460558655478395111264598940796886359643059647415484626357278274780213549872841697820531068941222114832031381804", + "1.000000000000008000000000000032000000000000085333333333333504000000000000273066666666667030755555555555971657142857143273244444444444814312522045855675083174603174818370575597242407372912190690056753273393273443722265929250083140248634767166738704512418804466", + "1.000000000000009000000000000040500000000000121500000000000273375000000000492075000000000738112500000000949001785714286781912723214286781912723214286675150022321429357590278003247342868033177760148459087904283479197083126137413049861121579402108279148620678486" + ], + [ + "1", + "1.000000000000000100000000000000005000000000000000166666666666666670833333333333333416666666666666668055555555555555575396825396825397073412698412698415454144620811287505511463844797178381032547699214367968708246486024279861085416640972311235208060604886766427", + "1.00000000000000020000000000000002000000000000000133333333333333340000000000000000266666666666666675555555555555555809523809523809530158730158730158871252204585537921693121693121693172999839666506334028111805889583680517013850347183868453709723550995898085845", + "1.000000000000000300000000000000045000000000000004500000000000000337500000000000020250000000000001012500000000000043392857142857144484375000000000054241071428571430198660714285714330093344155844156953632305194805220408497752247752796394453760525200069461788209", + "1.000000000000000400000000000000080000000000000010666666666666667733333333333333418666666666666672355555555555555880634920634920651174603174603175325573192239858935421516754850089234183100849767551459569237347016202497091385980305660712009918359945816284440624", + "1.000000000000000500000000000000125000000000000020833333333333335937500000000000260416666666666688368055555555557105654761904762001643105158730164112447641093474695922205687830700063162628266795443148050027390324771407941980859347644064053414275164241901696431", + "1.000000000000000600000000000000180000000000000036000000000000005400000000000000648000000000000064800000000000005554285714285714702285714285714313485714285714287380571428571428662316883116883121427532467532467742209790209790218779163693449408094680176965891264", + "1.000000000000000700000000000000245000000000000057166666666666676670833333333334733916666666666830068055555555571895694444444445874206597222222333425945216049390500309992283951112645989407968603531360231364573198294285559476609495997192590078165056998305407027", + "1.000000000000000800000000000000320000000000000085333333333333350400000000000002730666666666667030755555555555597165714285714289875301587301587671455379188712551635301587301589453547025813692623823128640906427512749176749177253665475735317032064340416001793007", + "1.000000000000000900000000000000405000000000000121500000000000027337500000000004920750000000000738112500000000094900178571428582104841517857143924769866071428667515002232142865004474208603896693517383827110430430324374843908718044757335298787389806890096519491" + ], + [ + "1", + "1.000000000000000010000000000000000050000000000000000166666666666666667083333333333333334166666666666666668055555555555555557539682539682539685019841269841269844025573192239858909281305114638447974286515953182619851374191651969429748813429368984924541627170598", + "1.000000000000000020000000000000000200000000000000001333333333333333340000000000000000026666666666666666755555555555555555809523809523809524444444444444444445855379188712522048677248677248677253807920474587141262359040136817914608847942181275514627641611768596", + "1.000000000000000030000000000000000450000000000000004500000000000000033750000000000000202500000000000001012500000000000004339285714285714301986607142857142911383928571428571591294642857142857586647727272727273836749188311688314248641983016983022469439043099755", + "1.000000000000000040000000000000000800000000000000010666666666666666773333333333333334186666666666666672355555555555555588063492063492063654603174603174603897001763668430337986596119929453273294211960878627580319598097375875261423350312239201436005499497562994", + "1.000000000000000050000000000000001250000000000000020833333333333333593750000000000002604166666666666688368055555555555710565476190476191445002480158730164112447641093474453719204695767195889520515171556838733191340070680350418458735516027189695036859130361164", + "1.000000000000000060000000000000001800000000000000036000000000000000540000000000000006480000000000000064800000000000000555428571428571432737142857142857170628571428571428738057142857142858051740259740259744804155844155844176818381618381618471507920650777793995", + "1.000000000000000070000000000000002450000000000000057166666666666667667083333333333347339166666666666830068055555555557189569444444444458742065972222222333425945216049383494475443672839511126459894079685775248531948536288969661078387597485597679474645403468476", + "1.00000000000000008000000000000000320000000000000008533333333333333504000000000000002730666666666666703075555555555555971657142857142861303873015873015910002680776014109643337142857142859294816867083533764546815028592806458869675509675510179998402068243340775", + "1.000000000000000090000000000000004050000000000000121500000000000002733750000000000049207500000000000738112500000000009490017857142857249619843750000001067627008928571438180071651785714364330456371753247342868033177759744341733736185689336930697323602736706615" + ], + [ + "1", + "1.000000000000000001000000000000000000500000000000000000166666666666666666708333333333333333341666666666666666668055555555555555555753968253968253968278769841269841269844025573192239858906801146384479717813076198492865159531828286168563946341724280092335647892", + "1.000000000000000002000000000000000002000000000000000001333333333333333334000000000000000000266666666666666666755555555555555555580952380952380952387301587301587301588712522045855379188994708994708994709046015712682379349054566832344610122389215722549055882388", + "1.000000000000000003000000000000000004500000000000000004500000000000000003375000000000000002025000000000000001012500000000000000433928571428571428734151785714285714339955357142857142873415178571428571433009334415584415585525060876623376623632656406093906093961", + "1.000000000000000004000000000000000008000000000000000010666666666666666677333333333333333341866666666666666672355555555555555558806349206349206350831746031746031746754144620811287478243104056437389770828180214846881513583205600983378761167315976204865093757063", + "1.000000000000000005000000000000000012500000000000000020833333333333333359375000000000000026041666666666666688368055555555555571056547619047619057307167658730158735541019069664903000927476025132275133498379754890171557347909954789295067268878100583829750566431", + "1.000000000000000006000000000000000018000000000000000036000000000000000054000000000000000064800000000000000064800000000000000055542857142857142898800000000000000027771428571428571445234285714285714294803116883116883121427532467532467534564955044955044955943848", + "1.000000000000000007000000000000000024500000000000000057166666666666666766708333333333333473391666666666666830068055555555555718956944444444444587420659722222222333425945216049382793891988811728395111264598940796857492420249120253460546797757670409580139582076", + "1.000000000000000008000000000000000032000000000000000085333333333333333504000000000000000273066666666666667030755555555555555971657142857142857558958730158730159100026807760141093770321269841269841485037242263908930719061223879001656867720084360084360134808958", + "1.000000000000000009000000000000000040500000000000000121500000000000000273375000000000000492075000000000000738112500000000000949001785714285715353341294642857143924769866071428572389435736607142857929018849431818182407803098112824675732874672319867632630046236" + ], + [ + "1", + "1.000000000000000000100000000000000000005000000000000000000166666666666666666670833333333333333333416666666666666666668055555555555555555575396825396825396825644841269841269841272597001763668430335124559082892416225749809603976270642937311691651969429747207541", + "1.000000000000000000200000000000000000020000000000000000001333333333333333333400000000000000000002666666666666666666755555555555555555558095238095238095238158730158730158730160141093474426807760169312169312169312169825236491903158569833787611565389343167252501", + "1.000000000000000000300000000000000000045000000000000000004500000000000000000337500000000000000020250000000000000001012500000000000000043392857142857142858770089285714285714339955357142857142858770089285714285714330093344155844155845265320616883116883142486419", + "1.000000000000000000400000000000000000080000000000000000010666666666666666667733333333333333333418666666666666666672355555555555555555880634920634920634936888888888888888889611287477954144620840183421516754850089234183100849767516469208486986264764043619524508", + "1.00000000000000000050000000000000000012500000000000000002083333333333333333593750000000000000026041666666666666668836805555555555555710565476190476190485878596230158730159268387621252204585564830315806878306879530125786636203302920938181626115653895392003709", + "1.00000000000000000060000000000000000018000000000000000003600000000000000000540000000000000000064800000000000000006480000000000000000555428571428571428613085714285714285717062857142857142857309485714285714285723374545454545454545908987012987012987033961238761", + "1.000000000000000000700000000000000000245000000000000000057166666666666666676670833333333333334733916666666666666830068055555555555571895694444444444445874206597222222222333425945216049382723833643325617283951112645989407968574664137420837425177704511425598692", + "1.000000000000000000800000000000000000320000000000000000085333333333333333350400000000000000002730666666666666667030755555555555555597165714285714285718446730158730158730528598236331569664932587682539682539684691642263908930575740706245524023301809908131572135", + "1.000000000000000000900000000000000000405000000000000000121500000000000000027337500000000000004920750000000000000738112500000000000094900178571428571439247698660714285715353341294642857142953229287946428571436433045637175324675914296604606331168871988765933284" + ], + [ + "1", + "1.000000000000000000010000000000000000000050000000000000000000166666666666666666667083333333333333333334166666666666666666668055555555555555555557539682539682539682542162698412698412698415454144620811287477956900352733686067019402857944524611191277860032200311", + "1.000000000000000000020000000000000000000200000000000000000001333333333333333333340000000000000000000026666666666666666666755555555555555555555809523809523809523810158730158730158730160141093474426807760143915343915343915343920474587141253807920483138260916037", + "1.000000000000000000030000000000000000000450000000000000000004500000000000000000033750000000000000000202500000000000000001012500000000000000004339285714285714285730558035714285714285768526785714285714285877008928571428571429015219155844155844156953632305194803", + "1.000000000000000000040000000000000000000800000000000000000010666666666666666666773333333333333333334186666666666666666672355555555555555555588063492063492063492226031746031746031746754144620811287477957034215167548500881844722783389450056116757808775586553367", + "1.0000000000000000000500000000000000000012500000000000000000208333333333333333335937500000000000000026041666666666666666883680555555555555557105654761904761904771592881944444444444498267333553791887125489572999338624338625561871818382235048906812432881226284", + "1.000000000000000000060000000000000000001800000000000000000036000000000000000000540000000000000000006480000000000000000064800000000000000000555428571428571428575594285714285714285742057142857142857143023771428571428571429480311688311688311692856103896103896105", + "1.000000000000000000070000000000000000002450000000000000000057166666666666666667667083333333333333347339166666666666666830068055555555555557189569444444444444458742065972222222222333425945216049382716827808777006172839511126459894079685746381309138009142349419", + "1.000000000000000000080000000000000000003200000000000000000085333333333333333335040000000000000000027306666666666666667030755555555555555559716571428571428571470181587301587301587671455379188712522048814323809523809523831043406766073432740242870747688525466307", + "1.000000000000000000090000000000000000004050000000000000000121500000000000000002733750000000000000049207500000000000000738112500000000000009490017857142857142963905558035714285715353341294642857142866751500223214285714364330456371753246753836374526684253246756" + ], + [ + "1", + "1.000000000000000000001000000000000000000000500000000000000000000166666666666666666666708333333333333333333341666666666666666666668055555555555555555555753968253968253968253993055555555555555555558311287477954144620811563051146384479717813076198492865159531825", + "1.000000000000000000002000000000000000000002000000000000000000001333333333333333333334000000000000000000000266666666666666666666755555555555555555555580952380952380952380958730158730158730158731569664902998236331569947089947089947089947141253807920474587141263", + "1.000000000000000000003000000000000000000004500000000000000000004500000000000000000003375000000000000000002025000000000000000001012500000000000000000433928571428571428571591294642857142857142911383928571428571428587700892857142857142861580762987012987012988123", + "1.000000000000000000004000000000000000000008000000000000000000010666666666666666666677333333333333333333341866666666666666666672355555555555555555558806349206349206349207974603174603174603175325573192239858906525862151675485008818342256751643418310084976786668", + "1.000000000000000000005000000000000000000012500000000000000000020833333333333333333359375000000000000000026041666666666666666688368055555555555555571056547619047619047628735739087301587301592683876212522045855381879856977513227513228736474992985409652076828429", + "1.000000000000000000006000000000000000000018000000000000000000036000000000000000000054000000000000000000064800000000000000000064800000000000000000055542857142857142857184514285714285714285742057142857142857142873805714285714285714294803116883116883116887661297", + "1.000000000000000000007000000000000000000024500000000000000000057166666666666666666766708333333333333333473391666666666666666830068055555555555555718956944444444444444587420659722222222222333425945216049382716127225322145061728395111264598940796857463553026308", + "1.000000000000000000008000000000000000000032000000000000000000085333333333333333333504000000000000000000273066666666666666667030755555555555555555971657142857142857143273244444444444444444814312522045855379189008416507936507936508151703908930575597242407372915", + "1.000000000000000000009000000000000000000040500000000000000000121500000000000000000273375000000000000000492075000000000000000738112500000000000000949001785714285714286781912723214285714286781912723214285714286675150022321428571429357590278003246753247342868031" + ], + [ + "1", + "1.000000000000000000000100000000000000000000005000000000000000000000166666666666666666666670833333333333333333333416666666666666666666668055555555555555555555575396825396825396825397073412698412698412698415454144620811287477954172178130511463844797178381032548", + "1.00000000000000000000020000000000000000000002000000000000000000000133333333333333333333340000000000000000000000266666666666666666666675555555555555555555555809523809523809523809530158730158730158730158871252204585537918871255026455026455026455026506333173", + "1.000000000000000000000300000000000000000000045000000000000000000004500000000000000000000337500000000000000000020250000000000000000001012500000000000000000043392857142857142857144484375000000000000000054241071428571428571430198660714285714285714330093344155846", + "1.000000000000000000000400000000000000000000080000000000000000000010666666666666666666667733333333333333333333418666666666666666666672355555555555555555555880634920634920634920651174603174603174603175325573192239858906525602088183421516754850089234183100849766", + "1.00000000000000000000050000000000000000000012500000000000000000002083333333333333333333593750000000000000000026041666666666666666668836805555555555555555710565476190476190476200164310515873015873016411244764109347442680802925553902116402116403339649596160013", + "1.000000000000000000000600000000000000000000180000000000000000000036000000000000000000005400000000000000000000648000000000000000000064800000000000000000005554285714285714285714702285714285714285714313485714285714285714287380571428571428571428662316883116883115", + "1.000000000000000000000700000000000000000000245000000000000000000057166666666666666666676670833333333333333334733916666666666666666830068055555555555555571895694444444444444445874206597222222222222333425945216049382716057166976658950617283951112645989407968576", + "1.000000000000000000000800000000000000000000320000000000000000000085333333333333333333350400000000000000000002730666666666666666667030755555555555555555597165714285714285714289875301587301587301587671455379188712522045884968634920634920634922786880359147025816", + "1.000000000000000000000900000000000000000000405000000000000000000121500000000000000000027337500000000000000004920750000000000000000738112500000000000000094900178571428571428582104841517857142857143924769866071428571428667515002232142857142865004474208603896105" + ], + [ + "1", + "1.000000000000000000000010000000000000000000000050000000000000000000000166666666666666666666667083333333333333333333334166666666666666666666668055555555555555555555557539682539682539682539685019841269841269841269844025573192239858906525575947971781305114638449", + "1.000000000000000000000020000000000000000000000200000000000000000000001333333333333333333333340000000000000000000000026666666666666666666666755555555555555555555555809523809523809523809524444444444444444444444445855379188712522045855382010582010582010582010585", + "1.000000000000000000000030000000000000000000000450000000000000000000004500000000000000000000033750000000000000000000202500000000000000000001012500000000000000000004339285714285714285714301986607142857142857142911383928571428571428571591294642857142857142857586", + "1.000000000000000000000040000000000000000000000800000000000000000000010666666666666666666666773333333333333333333334186666666666666666666672355555555555555555555588063492063492063492063654603174603174603174603897001763668430335097004653262786596119929453273303", + "1.000000000000000000000050000000000000000000001250000000000000000000020833333333333333333333593750000000000000000002604166666666666666666688368055555555555555555710565476190476190476191445002480158730158730164112447641093474426807787052538029100529100529222855", + "1.000000000000000000000060000000000000000000001800000000000000000000036000000000000000000000540000000000000000000006480000000000000000000064800000000000000000000555428571428571428571432737142857142857142857170628571428571428571428738057142857142857142858051741", + "1.000000000000000000000070000000000000000000002450000000000000000000057166666666666666666667667083333333333333333347339166666666666666666830068055555555555555557189569444444444444444458742065972222222222222333425945216049382716050161142110339506172839511126458", + "1.000000000000000000000080000000000000000000003200000000000000000000085333333333333333333335040000000000000000000027306666666666666666667030755555555555555555559716571428571428571428613038730158730158730159100026807760141093474429766704761904761904761926281501", + "1.000000000000000000000090000000000000000000004050000000000000000000121500000000000000000002733750000000000000000049207500000000000000000738112500000000000000009490017857142857142857249619843750000000000001067627008928571428571438180071651785714285714364330459" + ], + [ + "1", + "1.000000000000000000000001000000000000000000000000500000000000000000000000166666666666666666666666708333333333333333333333341666666666666666666666668055555555555555555555555753968253968253968253968278769841269841269841269844025573192239858906525573467813051147", + "1.000000000000000000000002000000000000000000000002000000000000000000000001333333333333333333333334000000000000000000000000266666666666666666666666755555555555555555555555580952380952380952380952387301587301587301587301588712522045855379188712522328042328042329", + "1.000000000000000000000003000000000000000000000004500000000000000000000004500000000000000000000003375000000000000000000002025000000000000000000001012500000000000000000000433928571428571428571428734151785714285714285714339955357142857142857142873415178571428569", + "1.000000000000000000000004000000000000000000000008000000000000000000000010666666666666666666666677333333333333333333333341866666666666666666666672355555555555555555555558806349206349206349206350831746031746031746031746754144620811287477954144909770723104056436", + "1.000000000000000000000005000000000000000000000012500000000000000000000020833333333333333333333359375000000000000000000026041666666666666666666688368055555555555555555571056547619047619047619057307167658730158730158735541019069664902998236334260809358465608467", + "1.000000000000000000000006000000000000000000000018000000000000000000000036000000000000000000000054000000000000000000000064800000000000000000000064800000000000000000000055542857142857142857142898800000000000000000000027771428571428571428571445234285714285714286", + "1.000000000000000000000007000000000000000000000024500000000000000000000057166666666666666666666766708333333333333333333473391666666666666666666830068055555555555555555718956944444444444444444587420659722222222222222333425945216049382716049460558655478395061727", + "1.000000000000000000000008000000000000000000000032000000000000000000000085333333333333333333333504000000000000000000000273066666666666666666667030755555555555555555555971657142857142857142857558958730158730158730159100026807760141093474427103654603174603174605", + "1.000000000000000000000009000000000000000000000040500000000000000000000121500000000000000000000273375000000000000000000492075000000000000000000738112500000000000000000949001785714285714285715353341294642857142857143924769866071428571428572389435736607142857144" + ], + [ + "1", + "1.000000000000000000000000100000000000000000000000005000000000000000000000000166666666666666666666666670833333333333333333333333416666666666666666666666668055555555555555555555555575396825396825396825396825644841269841269841269841272597001763668430335097001788", + "1.000000000000000000000000200000000000000000000000020000000000000000000000001333333333333333333333333400000000000000000000000002666666666666666666666666755555555555555555555555558095238095238095238095238158730158730158730158730160141093474426807760141093502646", + "1.000000000000000000000000300000000000000000000000045000000000000000000000004500000000000000000000000337500000000000000000000020250000000000000000000001012500000000000000000000043392857142857142857142858770089285714285714285714339955357142857142857142858770088", + "1.000000000000000000000000400000000000000000000000080000000000000000000000010666666666666666666666667733333333333333333333333418666666666666666666666672355555555555555555555555880634920634920634920634936888888888888888888888889611287477954144620811287506850092", + "1.000000000000000000000000500000000000000000000000125000000000000000000000020833333333333333333333335937500000000000000000000260416666666666666666666688368055555555555555555557105654761904761904761904858785962301587301587301592683876212522045855379188981636508", + "1.000000000000000000000000600000000000000000000000180000000000000000000000036000000000000000000000005400000000000000000000000648000000000000000000000064800000000000000000000005554285714285714285714286130857142857142857142857170628571428571428571428573094857144", + "1.00000000000000000000000070000000000000000000000024500000000000000000000005716666666666666666666667667083333333333333333333473391666666666666666666683006805555555555555555557189569444444444444444444587420659722222222222222233342594521604938271604939050030999", + "1.000000000000000000000000800000000000000000000000320000000000000000000000085333333333333333333333350400000000000000000000002730666666666666666666667030755555555555555555555597165714285714285714285718446730158730158730158730528598236331569664902998265921015871", + "1.000000000000000000000000900000000000000000000000405000000000000000000000121500000000000000000000027337500000000000000000004920750000000000000000000738112500000000000000000094900178571428571428571439247698660714285714285715353341294642857142857142953229287949" + ], + [ + "1", + "1.000000000000000000000000010000000000000000000000000050000000000000000000000000166666666666666666666666667083333333333333333333333334166666666666666666666666668055555555555555555555555557539682539682539682539682542162698412698412698412698415454144620811287477", + "1.000000000000000000000000020000000000000000000000000200000000000000000000000001333333333333333333333333340000000000000000000000000026666666666666666666666666755555555555555555555555555809523809523809523809523810158730158730158730158730160141093474426807760139", + "1.000000000000000000000000030000000000000000000000000450000000000000000000000004500000000000000000000000033750000000000000000000000202500000000000000000000001012500000000000000000000004339285714285714285714285730558035714285714285714285768526785714285714285713", + "1.000000000000000000000000040000000000000000000000000800000000000000000000000010666666666666666666666666773333333333333333333333334186666666666666666666666672355555555555555555555555588063492063492063492063492226031746031746031746031746754144620811287477954144", + "1.000000000000000000000000050000000000000000000000001250000000000000000000000020833333333333333333333333593750000000000000000000002604166666666666666666666688368055555555555555555555710565476190476190476190477159288194444444444444444449826733355379188712522045", + "1.000000000000000000000000060000000000000000000000001800000000000000000000000036000000000000000000000000540000000000000000000000006480000000000000000000000064800000000000000000000000555428571428571428571428575594285714285714285714285742057142857142857142857143", + "1.000000000000000000000000070000000000000000000000002450000000000000000000000057166666666666666666666667667083333333333333333333347339166666666666666666666830068055555555555555555557189569444444444444444444458742065972222222222222222333425945216049382716049381", + "1.000000000000000000000000080000000000000000000000003200000000000000000000000085333333333333333333333335040000000000000000000000027306666666666666666666667030755555555555555555555559716571428571428571428571470181587301587301587301587671455379188712522045855382", + "1.000000000000000000000000090000000000000000000000004050000000000000000000000121500000000000000000000002733750000000000000000000049207500000000000000000000738112500000000000000000009490017857142857142857142963905558035714285714285715353341294642857142857142868" + ], + [ + "1", + "1.000000000000000000000000001000000000000000000000000000500000000000000000000000000166666666666666666666666666708333333333333333333333333341666666666666666666666666668055555555555555555555555555753968253968253968253968253993055555555555555555555555558311287479", + "1.000000000000000000000000002000000000000000000000000002000000000000000000000000001333333333333333333333333334000000000000000000000000000266666666666666666666666666755555555555555555555555555580952380952380952380952380958730158730158730158730158731569664902999", + "1.00000000000000000000000000300000000000000000000000000450000000000000000000000000450000000000000000000000000337500000000000000000000000202500000000000000000000000101250000000000000000000000043392857142857142857142857159129464285714285714285714291138392857143", + "1.000000000000000000000000004000000000000000000000000008000000000000000000000000010666666666666666666666666677333333333333333333333333341866666666666666666666666672355555555555555555555555558806349206349206349206349207974603174603174603174603175325573192239859", + "1.000000000000000000000000005000000000000000000000000012500000000000000000000000020833333333333333333333333359375000000000000000000000026041666666666666666666666688368055555555555555555555571056547619047619047619047628735739087301587301587301592683876212522047", + "1.000000000000000000000000006000000000000000000000000018000000000000000000000000036000000000000000000000000054000000000000000000000000064800000000000000000000000064800000000000000000000000055542857142857142857142857184514285714285714285714285742057142857142858", + "1.000000000000000000000000007000000000000000000000000024500000000000000000000000057166666666666666666666666766708333333333333333333333473391666666666666666666666830068055555555555555555555718956944444444444444444444587420659722222222222222222333425945216049384", + "1.000000000000000000000000008000000000000000000000000032000000000000000000000000085333333333333333333333333504000000000000000000000000273066666666666666666666667030755555555555555555555555971657142857142857142857143273244444444444444444444444814312522045855381", + "1.000000000000000000000000009000000000000000000000000040500000000000000000000000121500000000000000000000000273375000000000000000000000492075000000000000000000000738112500000000000000000000949001785714285714285714286781912723214285714285714286781912723214285713" + ], + [ + "1", + "1.000000000000000000000000000100000000000000000000000000005000000000000000000000000000166666666666666666666666666670833333333333333333333333333416666666666666666666666666668055555555555555555555555555575396825396825396825396825397073412698412698412698412698414", + "1.000000000000000000000000000200000000000000000000000000020000000000000000000000000001333333333333333333333333333400000000000000000000000000002666666666666666666666666666755555555555555555555555555558095238095238095238095238095301587301587301587301587301588711", + "1.000000000000000000000000000300000000000000000000000000045000000000000000000000000004500000000000000000000000000337500000000000000000000000020250000000000000000000000001012500000000000000000000000043392857142857142857142857144484375000000000000000000000054239", + "1.000000000000000000000000000400000000000000000000000000080000000000000000000000000010666666666666666666666666667733333333333333333333333333418666666666666666666666666672355555555555555555555555555880634920634920634920634920651174603174603174603174603175325574", + "1.000000000000000000000000000500000000000000000000000000125000000000000000000000000020833333333333333333333333335937500000000000000000000000260416666666666666666666666688368055555555555555555555557105654761904761904761904762001643105158730158730158730164112449", + "1.000000000000000000000000000600000000000000000000000000180000000000000000000000000036000000000000000000000000005400000000000000000000000000648000000000000000000000000064800000000000000000000000005554285714285714285714285714702285714285714285714285714313485713", + "1.000000000000000000000000000700000000000000000000000000245000000000000000000000000057166666666666666666666666676670833333333333333333333334733916666666666666666666666830068055555555555555555555571895694444444444444444444445874206597222222222222222222333425947", + "1.000000000000000000000000000800000000000000000000000000320000000000000000000000000085333333333333333333333333350400000000000000000000000002730666666666666666666666667030755555555555555555555555597165714285714285714285714289875301587301587301587301587671455379", + "1.000000000000000000000000000900000000000000000000000000405000000000000000000000000121500000000000000000000000027337500000000000000000000004920750000000000000000000000738112500000000000000000000094900178571428571428571428582104841517857142857142857143924769868" + ], + [ + "1", + "1.000000000000000000000000000010000000000000000000000000000050000000000000000000000000000166666666666666666666666666667083333333333333333333333333334166666666666666666666666666668055555555555555555555555555557539682539682539682539682539685019841269841269841268", + "1.000000000000000000000000000020000000000000000000000000000200000000000000000000000000001333333333333333333333333333340000000000000000000000000000026666666666666666666666666666755555555555555555555555555555809523809523809523809523809524444444444444444444444447", + "1.000000000000000000000000000030000000000000000000000000000450000000000000000000000000004500000000000000000000000000033750000000000000000000000000202500000000000000000000000001012500000000000000000000000004339285714285714285714285714301986607142857142857142859", + "1.000000000000000000000000000040000000000000000000000000000800000000000000000000000000010666666666666666666666666666773333333333333333333333333334186666666666666666666666666672355555555555555555555555555588063492063492063492063492063654603174603174603174603175", + "1.000000000000000000000000000050000000000000000000000000001250000000000000000000000000020833333333333333333333333333593750000000000000000000000002604166666666666666666666666688368055555555555555555555555710565476190476190476190476191445002480158730158730158732", + "1.000000000000000000000000000060000000000000000000000000001800000000000000000000000000036000000000000000000000000000540000000000000000000000000006480000000000000000000000000064800000000000000000000000000555428571428571428571428571432737142857142857142857142857", + "1.000000000000000000000000000070000000000000000000000000002450000000000000000000000000057166666666666666666666666667667083333333333333333333333347339166666666666666666666666830068055555555555555555555557189569444444444444444444444458742065972222222222222222222", + "1.000000000000000000000000000080000000000000000000000000003200000000000000000000000000085333333333333333333333333335040000000000000000000000000027306666666666666666666666667030755555555555555555555555559716571428571428571428571428613038730158730158730158730158", + "1.00000000000000000000000000009000000000000000000000000000405000000000000000000000000012150000000000000000000000000273375000000000000000000000004920750000000000000000000000073811250000000000000000000000949001785714285714285714285724961984375" + ], + [ + "1", + "1.00000000000000000000000000000100000000000000000000000000000050000000000000000000000000000016666666666666666666666666666670833333333333333333333333333334166666666666666666666666666666805555555555555555555555555555575396825396825396825396825396827876984126984", + "1.000000000000000000000000000002000000000000000000000000000002000000000000000000000000000001333333333333333333333333333334000000000000000000000000000000266666666666666666666666666666755555555555555555555555555555580952380952380952380952380952387301587301587304", + "1.000000000000000000000000000003000000000000000000000000000004500000000000000000000000000004500000000000000000000000000003375000000000000000000000000002025000000000000000000000000001012500000000000000000000000000433928571428571428571428571428734151785714285719", + "1.000000000000000000000000000004000000000000000000000000000008000000000000000000000000000010666666666666666666666666666677333333333333333333333333333341866666666666666666666666666672355555555555555555555555555558806349206349206349206349206350831746031746031746", + "1.00000000000000000000000000000500000000000000000000000000001250000000000000000000000000002083333333333333333333333333335937500000000000000000000000002604166666666666666666666666668836805555555555555555555555557105654761904761904761904761905730716765873015873", + "1.000000000000000000000000000006000000000000000000000000000018000000000000000000000000000036000000000000000000000000000054000000000000000000000000000064800000000000000000000000000064800000000000000000000000000055542857142857142857142857142898799999999999999999", + "1.00000000000000000000000000000700000000000000000000000000002450000000000000000000000000005716666666666666666666666666676670833333333333333333333333347339166666666666666666666666683006805555555555555555555555571895694444444444444444444444458742065972222222222", + "1.00000000000000000000000000000800000000000000000000000000003200000000000000000000000000008533333333333333333333333333350400000000000000000000000000027306666666666666666666666666703075555555555555555555555555597165714285714285714285714285755895873015873015873", + "1.000000000000000000000000000009000000000000000000000000000040500000000000000000000000000121500000000000000000000000000273375000000000000000000000000492075000000000000000000000000738112500000000000000000000000949001785714285714285714285715353341294642857142859" + ], + [ + "1", + "1.000000000000000000000000000000100000000000000000000000000000005000000000000000000000000000000166666666666666666666666666666670833333333333333333333333333333416666666666666666666666666666668055555555555555555555555555555575396825396825396825396825396825644842", + "1.000000000000000000000000000000200000000000000000000000000000020000000000000000000000000000001333333333333333333333333333333400000000000000000000000000000002666666666666666666666666666666755555555555555555555555555555558095238095238095238095238095238158730159", + "1.000000000000000000000000000000300000000000000000000000000000045000000000000000000000000000004500000000000000000000000000000337500000000000000000000000000020250000000000000000000000000001012500000000000000000000000000043392857142857142857142857142858770089287", + "1.000000000000000000000000000000400000000000000000000000000000080000000000000000000000000000010666666666666666666666666666667733333333333333333333333333333418666666666666666666666666666672355555555555555555555555555555880634920634920634920634920634936888888889", + "1.000000000000000000000000000000500000000000000000000000000000125000000000000000000000000000020833333333333333333333333333335937500000000000000000000000000260416666666666666666666666666688368055555555555555555555555557105654761904761904761904761904858785962301", + "1.000000000000000000000000000000600000000000000000000000000000180000000000000000000000000000036000000000000000000000000000005400000000000000000000000000000648000000000000000000000000000064800000000000000000000000000005554285714285714285714285714286130857142859", + "1.00000000000000000000000000000070000000000000000000000000000024500000000000000000000000000005716666666666666666666666666667667083333333333333333333333333473391666666666666666666666666683006805555555555555555555555557189569444444444444444444444444587420659722", + "1.000000000000000000000000000000800000000000000000000000000000320000000000000000000000000000085333333333333333333333333333350400000000000000000000000000002730666666666666666666666666667030755555555555555555555555555597165714285714285714285714285718446730158732", + "1.000000000000000000000000000000900000000000000000000000000000405000000000000000000000000000121500000000000000000000000000027337500000000000000000000000004920750000000000000000000000000738112500000000000000000000000094900178571428571428571428571439247698660714" + ], + [ + "1", + "1.000000000000000000000000000000010000000000000000000000000000000050000000000000000000000000000000166666666666666666666666666666667083333333333333333333333333333334166666666666666666666666666666668055555555555555555555555555555557539682539682539682539682539682", + "1.000000000000000000000000000000020000000000000000000000000000000200000000000000000000000000000001333333333333333333333333333333340000000000000000000000000000000026666666666666666666666666666666755555555555555555555555555555555809523809523809523809523809523812", + "1.000000000000000000000000000000030000000000000000000000000000000450000000000000000000000000000004500000000000000000000000000000033750000000000000000000000000000202500000000000000000000000000001012500000000000000000000000000004339285714285714285714285714285728", + "1.000000000000000000000000000000040000000000000000000000000000000800000000000000000000000000000010666666666666666666666666666666773333333333333333333333333333334186666666666666666666666666666672355555555555555555555555555555588063492063492063492063492063492225", + "1.000000000000000000000000000000050000000000000000000000000000001250000000000000000000000000000020833333333333333333333333333333593750000000000000000000000000002604166666666666666666666666666688368055555555555555555555555555710565476190476190476190476190477159", + "1.000000000000000000000000000000060000000000000000000000000000001800000000000000000000000000000036000000000000000000000000000000540000000000000000000000000000006480000000000000000000000000000064800000000000000000000000000000555428571428571428571428571428575594", + "1.00000000000000000000000000000007000000000000000000000000000000245000000000000000000000000000005716666666666666666666666666666766708333333333333333333333333334733916666666666666666666666666683006805555555555555555555555555718956944444444444444444444444445874", + "1.000000000000000000000000000000080000000000000000000000000000003200000000000000000000000000000085333333333333333333333333333335040000000000000000000000000000027306666666666666666666666666667030755555555555555555555555555559716571428571428571428571428571470183", + "1.000000000000000000000000000000090000000000000000000000000000004050000000000000000000000000000121500000000000000000000000000002733750000000000000000000000000049207500000000000000000000000000738112500000000000000000000000009490017857142857142857142857142963907" + ], + [ + "1", + "1.000000000000000000000000000000001000000000000000000000000000000000500000000000000000000000000000000166666666666666666666666666666666708333333333333333333333333333333341666666666666666666666666666666668055555555555555555555555555555555753968253968253968253988", + "1.000000000000000000000000000000002000000000000000000000000000000002000000000000000000000000000000001333333333333333333333333333333334000000000000000000000000000000000266666666666666666666666666666666755555555555555555555555555555555580952380952380952380952383", + "1.00000000000000000000000000000000300000000000000000000000000000000450000000000000000000000000000000450000000000000000000000000000000337500000000000000000000000000000202500000000000000000000000000000101250000000000000000000000000000043392857142857142857142857", + "1.000000000000000000000000000000004000000000000000000000000000000008000000000000000000000000000000010666666666666666666666666666666677333333333333333333333333333333341866666666666666666666666666666672355555555555555555555555555555558806349206349206349206349208", + "1.000000000000000000000000000000005000000000000000000000000000000012500000000000000000000000000000020833333333333333333333333333333359375000000000000000000000000000026041666666666666666666666666666688368055555555555555555555555555571056547619047619047619047618", + "1.00000000000000000000000000000000600000000000000000000000000000001800000000000000000000000000000003600000000000000000000000000000005400000000000000000000000000000006480000000000000000000000000000006480000000000000000000000000000005554285714285714285714285714", + "1.000000000000000000000000000000007000000000000000000000000000000024500000000000000000000000000000057166666666666666666666666666666766708333333333333333333333333333473391666666666666666666666666666830068055555555555555555555555555718956944444444444444444444443", + "1.000000000000000000000000000000008000000000000000000000000000000032000000000000000000000000000000085333333333333333333333333333333504000000000000000000000000000000273066666666666666666666666666667030755555555555555555555555555555971657142857142857142857142858", + "1.000000000000000000000000000000009000000000000000000000000000000040500000000000000000000000000000121500000000000000000000000000000273375000000000000000000000000000492075000000000000000000000000000738112500000000000000000000000000949001785714285714285714285715" + ], + [ + "1", + "1.000000000000000000000000000000000100000000000000000000000000000000005000000000000000000000000000000000166666666666666666666666666666666670833333333333333333333333333333333416666666666666666666666666666666668055555555555555555555555555555555575396825396825398", + "1.000000000000000000000000000000000200000000000000000000000000000000020000000000000000000000000000000001333333333333333333333333333333333400000000000000000000000000000000002666666666666666666666666666666666755555555555555555555555555555555558095238095238095238", + "1.000000000000000000000000000000000300000000000000000000000000000000045000000000000000000000000000000004500000000000000000000000000000000337500000000000000000000000000000020250000000000000000000000000000001012500000000000000000000000000000043392857142857142855", + "1.000000000000000000000000000000000400000000000000000000000000000000080000000000000000000000000000000010666666666666666666666666666666667733333333333333333333333333333333418666666666666666666666666666666672355555555555555555555555555555555880634920634920634923", + "1.000000000000000000000000000000000500000000000000000000000000000000125000000000000000000000000000000020833333333333333333333333333333335937500000000000000000000000000000260416666666666666666666666666666688368055555555555555555555555555557105654761904761904763", + "1.000000000000000000000000000000000600000000000000000000000000000000180000000000000000000000000000000036000000000000000000000000000000005400000000000000000000000000000000648000000000000000000000000000000064800000000000000000000000000000005554285714285714285715", + "1.000000000000000000000000000000000700000000000000000000000000000000245000000000000000000000000000000057166666666666666666666666666666676670833333333333333333333333333334733916666666666666666666666666666830068055555555555555555555555555571895694444444444444448", + "1.000000000000000000000000000000000800000000000000000000000000000000320000000000000000000000000000000085333333333333333333333333333333350400000000000000000000000000000002730666666666666666666666666666667030755555555555555555555555555555597165714285714285714288", + "1.00000000000000000000000000000000090000000000000000000000000000000040500000000000000000000000000000012150000000000000000000000000000002733750000000000000000000000000000492075000000000000000000000000000073811250000000000000000000000000009490017857142857142858" + ] +] \ No newline at end of file diff --git a/src/trig.spec.ts b/src/trig.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/trig.ts b/src/trig.ts new file mode 100644 index 0000000..8b3d1ec --- /dev/null +++ b/src/trig.ts @@ -0,0 +1,188 @@ +import { abs } from "./abs"; +import { add } from "./add"; +import { greaterThan, isExatclyZero, lessThan } from "./compareTo"; +import { divide } from "./divide"; +import { exp } from "./logarithm"; +import { modulus } from "./modulus"; +import { multiply } from "./multiply"; +import { pow, sqRoot } from "./pow"; +import { roundOff } from "./round"; +import { stripTrailingZero } from "./stripTrailingZero"; +import { negate, subtract } from "./subtract"; +import { alternatingSeries, factorial, isAproxOne, isAproxZero, sign, tolerance } from "./utils"; + +// PI up to the first 64 decimal places +export const PI = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229' + +// Hypotenuse +export function hypot(a: number | string, b: number | string) { + a = a.toString(); + b = b.toString(); + return sqRoot(add(pow(a, '2'), add(pow(b, '2')))); +} + +// Sine functions +export function sin(x: number | string) { + x = x.toString(); + + if (greaterThan(abs(x), PI)) { + let r = divide(x, PI, 33).split('.') + x = stripTrailingZero(roundOff(multiply(pow(negate(sign(x).toString()), r[0]), multiply(PI, (r[1]) ? '0.' + r[1] : '0')), 32)); + } + + let result = '0'; + let _sign = '1'; + let n = '1'; // Series iteration + let f = '1'; // Factorial product + + while (true) { + const N = subtract(multiply(n, '2'), '1'); // Next real term in series (even terms cancel) + f = multiply(f, N); + + const next = multiply(_sign, divide(pow(x, N, 33), f, 34)); + + if (lessThan(abs(next), tolerance(33))) { + result = add(result, next); + return stripTrailingZero(isAproxZero(result) ? '0' : isAproxOne(result) ? multiply('1', sign(result).toString()) : result); + } + result = add(result, next); + _sign = negate(_sign) + f = multiply(f, multiply(n, '2')); // Iterate once to synchronize Factorial + n = add(n, '1'); + } +} + +export function asin(x: number | string) { + x = x.toString(); + if (greaterThan(abs(x), '1')) { + throw Error('[Arcsine]: argument x is out of range.') + } + let result = '0'; + let n = '1'; + let even = '1'; + let odd = '1'; + while (true) { + const N = multiply(n, '2'); + const R = add(N, '1'); + + even = multiply(even, N); + odd = multiply(odd, subtract(N, '1')); + let next = divide(multiply(odd, pow(x, R)), multiply(even, R), 34); + + if (lessThan(next, tolerance(33))) { + result = add(result, next); + return stripTrailingZero(roundOff(add(result, x), 32)); + } + + result = add(result, next); + n = add(n, '1'); + } +} + +export function sinh(x: number | string) { + x = x.toString(); + return stripTrailingZero(subtract(divide(exp(x), '2', 33), divide(exp(negate(x)), '2', 33))); +} + +// Cosine functions + +export function cos(x: number | string) { + x = x.toString(); + + if (greaterThan(abs(x), PI)) { + let r = divide(x, PI, 33).split('.') + x = stripTrailingZero(roundOff(multiply(pow(negate(sign(x).toString()), r[0]), multiply(PI, (r[1]) ? '0.' + r[1] : '0')), 32)); + } + + let result = '0'; + let _sign = '1'; + let n = '1'; // Series iteration + let f = '1'; // Factorial product + + while (true) { + const N = multiply(n, '2'); // Next real term in series (odd terms cancel) + f = multiply(f, subtract(N, '1')); // Iterate once to synchronize Factorial + f = multiply(f, N); + + const next = multiply(_sign, divide(pow(x, N, 33), f, 34)); + + if (lessThan(abs(next), tolerance(33))) { + result = subtract('1',add(result, next)); + return stripTrailingZero(isAproxOne(result) ? multiply('1', sign(result).toString()) : isAproxZero(result) ? '0' : result); + } + result = add(result, next); + _sign = negate(_sign) + n = add(n, '1'); + } +} + +export function acos(x: number | string) { + x = x.toString(); + if (greaterThan(abs(x), '1')) { + throw Error('[Arccosine]: argument x is out of range.') + } + return stripTrailingZero(subtract(divide(PI, 2, 32), asin(x))); +} + +export function cosh(x: number | string) { + x = x.toString(); + return stripTrailingZero(divide(add(exp(x), exp(negate(x))), '2', 32)); +} + +// Tangant functions + +export function tan(x: number | string) { + x = x.toString(); + return stripTrailingZero(divide(sin(x), cos(x), 32)); +} + +export function atan(x: number | string) { + x = x.toString(); + + if (greaterThan(abs(x), '1')) { + return stripTrailingZero(subtract(divide(PI, 2, 33), atan(divide(1, x, 33)))); + } + + let result = '0'; + let n = '0'; + while (true) { + let N = multiply('2', n); + let next = divide(multiply(pow('-1', n), pow(x, add(N, '1'))), add(N, '1'), 32) + if (lessThan(abs(next), tolerance(33))) { + return stripTrailingZero(roundOff(add(result, next), 32)); + } + result = add(result, next); + n = add(n, '1'); + } +} + +export function atan2(y: number | string, x: number | string) { + x = x.toString(); + y = y.toString(); + + let offset = '0'; + + if (isExatclyZero(x) && isExatclyZero(y)) { + return '0'; + } + + if (isExatclyZero(x) && greaterThan(y, '0')) { + return stripTrailingZero(roundOff(divide(PI, 2, 33), 32)); + } + + if (isExatclyZero(x) && lessThan(y, '0')) { + return stripTrailingZero(roundOff(negate(divide(PI, 2, 33)), 32)); + } + + if (lessThan(x, '0')) { + offset = (greaterThan(y, '0', true)) ? PI : negate(PI); + } + + return stripTrailingZero(roundOff(add(atan(divide(y, x, 33)), offset), 32)); + +} + +export function tanh(x: number | string) { + x = x.toString(); + return stripTrailingZero(divide(sinh(x), cosh(x), 32)); +} \ No newline at end of file diff --git a/src/utils.spec.ts b/src/utils.spec.ts new file mode 100644 index 0000000..b50067f --- /dev/null +++ b/src/utils.spec.ts @@ -0,0 +1,149 @@ +import { divide } from "./divide"; +import { multiply } from "./multiply"; +import { alternatingSeries, factorial, isAproxOne, isAproxZero, sigma, sign, tolerance } from "./utils"; + +describe('Utils', function () { + describe('sigma', function () { + it("0 + 1 + 2 + 3 = 6", function () { + expect(sigma(0, 3, (n)=>{ + return n + })).toBe("6") + }); + it("2(0) + 2(1) + 2(2) + 2(3) = 12", function () { + expect(sigma(0, 3, (n)=>{ + return multiply(n, '2') + })).toBe("12") + }); + }); + describe('alternatingSeries', function () { + it("where 2/(n + 1) < 10^-3, (2/1) - (2/1) + (2/3) ... (2/n) = 1.38130686096364843050453744294519", function () { + expect(alternatingSeries(1, 3, (n)=>{ + return divide(2, n, 32) + })).toBe("1.38130686096364843050453744294519") + }); + it("Throw error if n is less than 1", function () { + let n = 0; + expect(()=>{return alternatingSeries(n, 3, (n)=>{ + return divide(2, n, 32) + })}).toThrowError() + }); + it("Throw error if n is fractional", function () { + let n = 2.5; + expect(()=>{return alternatingSeries(n, 3, (n)=>{ + return divide(2, n, 32) + })}).toThrowError() + }); + it("Throw error if limit is fractional", function () { + let limit = 2.5; + expect(()=>{return alternatingSeries(1, limit, (n)=>{ + return divide(2, n, 32) + })}).toThrowError() + }); + it("Throw error if limit is negative", function () { + let limit = -1; + expect(()=>{return alternatingSeries(1, limit, (n)=>{ + return divide(2, n, 32) + })}).toThrowError() + }); + }); + describe('factorial', function () { + it("should: 1! = 1", function () { + expect(factorial("1")).toBe("1") + }); + it("should: 0! = 1", function () { + expect(factorial("0")).toBe("1") + }); + it("should: 52! = 80658175170943878571660636856403766975289505440883277824000000000000", function () { + expect(factorial("52")).toBe("80658175170943878571660636856403766975289505440883277824000000000000") + }); + }); + describe('tolerance', function () { + it("should: tolerance(1) = 0.1", function () { + expect(tolerance(1)).toBe("0.1") + }); + it("should: tolerance(-1) = 1", function () { + expect(tolerance(-1)).toBe("1") + }); + it("should: tolerance(16) = 0.000000000000001", function () { + expect(tolerance(16)).toBe("0.000000000000001") + }); + it("should: tolerance(-16) = 1000000000000000", function () { + expect(tolerance(-16)).toBe("1000000000000000") + }); + it("should: tolerance(0) = 0", function () { + expect(tolerance(0)).toBe("0") + }); + }); + describe('isAproxZero', function () { + it("should: isAproxZero(0) is true", function () { + expect(isAproxZero(0)).toBeTrue(); + }); + it("should: isAproxZero(0.0000001) is true", function () { + expect(isAproxZero('0.0000001')).toBeTrue(); + }); + it("should: isAproxZero(0.000000000000764658) is true", function () { + expect(isAproxZero('0.000000000000764658')).toBeTrue(); + }); + it("should: isAproxZero(0.1) is fasle", function () { + expect(isAproxZero('0.1')).toBeFalse(); + }); + it("should: isAproxZero(0.001) is fasle", function () { + expect(isAproxZero('0.001')).toBeFalse(); + }); + it("should: isAproxZero(0.005643) is fasle", function () { + expect(isAproxZero('0.005643')).toBeFalse(); + }); + }); + describe('isAproxOne', function () { + it("should: isAproxOne(1) is true", function () { + expect(isAproxOne(1)).toBeTrue(); + }); + it("should: isAproxOne(1.0000001) is true", function () { + expect(isAproxOne('1.0000001')).toBeTrue(); + }); + it("should: isAproxOne(-1.0000001) is true", function () { + expect(isAproxOne('-1.0000001')).toBeTrue(); + }); + it("should: isAproxOne(1.1) is fasle", function () { + expect(isAproxOne('1.1')).toBeFalse(); + }); + it("should: isAproxOne(-1.1) is fasle", function () { + expect(isAproxOne('-1.1')).toBeFalse(); + }); + it("should: isAproxOne(1.001) is fasle", function () { + expect(isAproxOne('1.001')).toBeFalse(); + }); + it("should: isAproxOne(-1.001) is fasle", function () { + expect(isAproxOne('-1.001')).toBeFalse(); + }); + it("should: isAproxOne(1.005643) is fasle", function () { + expect(isAproxOne('1.005643')).toBeFalse(); + }); + it("should: isAproxOne(-1.005643) is fasle", function () { + expect(isAproxOne('-1.005643')).toBeFalse(); + }); + }); + describe('sign', function () { + it("sign(1) is 1", function () { + expect(sign(1)).toBe(1); + }); + it("sign(-1) is -1", function () { + expect(sign(-1)).toBe(-1); + }); + it("sign(0) is 0", function () { + expect(sign(0)).toBe(0); + }); + it("sign(7645) is 1", function () { + expect(sign(7645)).toBe(1); + }); + it("sign(-7645) is -1", function () { + expect(sign(-7645)).toBe(-1); + }); + it("sign(.000864) is 1", function () { + expect(sign(.000864)).toBe(1); + }); + it("sign(-0.000864) is -1", function () { + expect(sign(-0.000864)).toBe(-1); + }); + }); +}); \ No newline at end of file diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 0000000..af902f0 --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,129 @@ +import { abs } from "./abs"; +import { add } from "./add"; +import { greaterThan, isExatclyOne, isExatclyZero, lessThan } from "./compareTo"; +import { multiply } from "./multiply"; +import { negate, subtract } from "./subtract"; + +export const factorial = (n: number | string): string => { + + n = n.toString(); + + validateInteger(n); + validatePositive(n); + + if (isExatclyZero(n) || isExatclyOne(n)) { + return '1'; + } + + let result = n; + + while(true){ + + if(isExatclyOne(n)){ + return result; + } + + let next = subtract(n,'1'); + result = multiply(result, next); + n = next; + } +} + +export function sigma(n: number | string, limit: number | string, fn: (n:number|string, ...args) => any, ...args:any): string { + + n = n.toString(); + limit = limit.toString(); + + validateInteger(n); + validateInteger(limit); + validatePositive(n); + validatePositive(limit); + + let result = '0'; + + while(greaterThan(limit, subtract(n,'1'))){ + result = add(result, fn(limit, ...args)); + limit = subtract(limit,'1'); + } + + return result + +} + +export function alternatingSeries(n: number | string, limit: number | string, fn: (n:number|string) => any, _sign: number | string = '1'): string { + + n = n.toString(); + limit = limit.toString(); + _sign = sign(_sign).toString(); + + if(lessThan(n, '1')){ + throw new Error('[alternatingSeries]: Argument n is less than 1'); + } + + validateInteger(n); + validateInteger(limit); + validatePositive(limit); + + let result = '0'; + while(true){ + + const next = multiply(_sign, fn(n)) + + if(lessThan(abs(next), tolerance(limit))){ + return result; + } + + result = add(result, next); + _sign = negate(_sign) + n = add(n,'1'); + } +} + +export function tolerance(precision: number | string){ + precision = precision.toString(); + validateInteger(precision); + if(precision == '0') return '0'; + if(precision.startsWith('-')) return `1${new Array(Number(-precision)).join('0')}`; + return `0.${new Array(Number(precision) - 1).join('0')}1` +} + +export function isAproxZero(number: string | number, precision: number = 8) { + precision = Math.max(1, precision) + number = abs(number.toString()); + + if(isExatclyZero(number)) return true; + if(lessThan(number, tolerance(precision), true)) return true; + + return false; +} + +export function isAproxOne(number: string | number, precision: number = 8) { + precision = Math.max(1, precision) + number = abs(number.toString()); + + if(isExatclyOne(number)) return true; + if(lessThan(abs(subtract('1', number)), tolerance(precision), true)) return true; + + return false; +} + +export function sign(number: string | number){ + number = number.toString(); + if(isExatclyZero(number)) return 0; + if(number.includes('-')) return -1; + return 1; +} + +function validateInteger(number: string) { + if (number.includes('.')) { + throw new Error('Non-integers not supported'); + } +} + +function validatePositive(number: string) { + if (number.includes('-')) { + throw new Error('Negatives not supported'); + } +} + + diff --git a/src/workers/pow.worker.ts b/src/workers/pow.worker.ts new file mode 100644 index 0000000..ebd6de9 --- /dev/null +++ b/src/workers/pow.worker.ts @@ -0,0 +1,151 @@ +import { abs } from "../abs"; +import { add } from "../add"; +import { lessThan, greaterThan, equals, isOdd, isExatclyZero, isEven, isExatclyOne } from "../compareTo"; +import { divide } from "../divide"; +import { log } from "../logarithm"; +import { multiply } from "../multiply"; +import { roundOff } from "../round"; +import { stripTrailingZero } from "../stripTrailingZero"; +import { subtract } from "../subtract"; +import { tolerance, sign } from "../utils"; + +const worker: Worker = self as any; + +function intPow(base: string, exponent: string, precision: number | undefined = 32) { + exponent = abs(exponent); + let result = '1'; + + while (greaterThan(exponent, '0')) { + if (isOdd(exponent)) { result = multiply(result, base) } + base = multiply(base, base); + exponent = divide(exponent, 2, 2).split('.')[0]; + } + + return result +} + +function nthRoot(x: number | string, n: number | string, precision = 8) { + + x = x.toString(); + n = n.toString(); + + if (equals(n, '2')) { + let guess = multiply(log(x), '-0.5'); + let nMinusOne = subtract(n, 1); + let difference = '0' + let lastDifference = x + let i = 0; + while (true) { + + let newGuess = divide(add(stripTrailingZero(divide(x, guess, precision + 2)), multiply(guess, nMinusOne)), n, precision + 2); + + difference = abs(subtract(guess, newGuess)) + + if (greaterThan(difference, lastDifference)) { + // console.log('root exit under p') + return stripTrailingZero(roundOff(guess, precision + 1)) + } + + if (lessThan(difference, tolerance(precision - 1))) { + // console.log('newGuess exit under p') + + return stripTrailingZero(roundOff(newGuess, precision + 1)) + } + + lastDifference = difference; + guess = stripTrailingZero(newGuess); + + i++; + } + // console.log('guess exit over itt') + + // return stripTrailingZero(roundOff(guess, precision + 1)) + } else if (equals(n, '5')) { + let x0 = '1'; + let x1 = '2'; + let x2 = '1.5'; + let i = 0; + + while (true) { + let f0 = subtract(intPow(x0, '5', precision + 2), x); + let f1 = subtract(intPow(x1, '5', precision + 2), x); + let next = multiply(f1, divide(subtract(x1, x0), subtract(f1, f0), precision + 2)); + x2 = subtract(roundOff(x1, precision + 2), roundOff(next, precision + 2)); + + if (lessThan(abs(subtract(x2, x1)), tolerance(precision + 1))) { + return stripTrailingZero(roundOff(x2, precision + 1)); + } + + if (sign(f0) !== sign(f1)) { + x1 = divide(add(x0 + x1), 2, precision + 2); // Switch to bisection method + } + + x0 = x1; + x1 = stripTrailingZero(roundOff(x2, precision + 2)); + i++; + } + + // return stripTrailingZero(roundOff(x2, precision + 1)) + } + +} + +worker.addEventListener("message", (event) => { + let fractionalExponent = '1'; + let tempBase = nthRoot(nthRoot(event.data.base, 5, 33), 2, 32); + + for (let i = 0; i < event.data.significand.length; i++) { + const significandDigit = event.data.significand[i] + const root5 = nthRoot(tempBase, 5, 33); // 2 + const root10 = (() => { return nthRoot(root5, 2, 33) })(); // 1 + + + if (isOdd(significandDigit)) { + + const root2 = nthRoot(tempBase, 2, 33); // 5 + + switch (significandDigit) { + case '9': + fractionalExponent = multiply(fractionalExponent, multiply(intPow(root5, '2', 33), root2)) + break; + case '7': + fractionalExponent = multiply(fractionalExponent, multiply(root2, root5)) + break; + case '5': + fractionalExponent = multiply(fractionalExponent, root2) + break; + case '3': + fractionalExponent = multiply(fractionalExponent, multiply(root5, root10)) + break; + case '1': + fractionalExponent = multiply(fractionalExponent, root10) + break; + } + + } + + if (isEven(significandDigit)) { + switch (significandDigit) { + case '8': + fractionalExponent = multiply(fractionalExponent, intPow(root5, '4', 33)) + break; + case '6': + fractionalExponent = multiply(fractionalExponent, intPow(root5, '3', 33)) + break; + case '4': + fractionalExponent = multiply(fractionalExponent, intPow(root5, '2', 33)) + break; + case '2': + fractionalExponent = multiply(fractionalExponent, root5) + break; + case '0': + break; + } + } + + tempBase = root10; + + } + + worker.postMessage(fractionalExponent); +}); \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 10ab625..7b223de 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,9 @@ { "compilerOptions": { - "lib": ["es5", "es2015.symbol", "es2015.symbol.wellknown"], - "target": "es5", + "lib": ["es5", "es2015.symbol", "es2015.symbol.wellknown", "es2020", "es2022", "WebWorker"], + "target": "es2022", + "module": "es2022", + "moduleResolution": "Node10", "declaration": true, "noImplicitAny": false, "outDir": "lib" diff --git a/webpack.config.js b/webpack.config.js index efae33c..328a227 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -14,7 +14,8 @@ module.exports = { path: WEB ? path.resolve(__dirname, "dist/web") : path.resolve(__dirname, "dist/node"), library: "bigDecimal", libraryTarget: WEB ? "var" : "umd", - filename: PROD ? "js-big-decimal.min.js" : "js-big-decimal.js" + filename: PROD ? "js-big-decimal.min.js" : "js-big-decimal.js", + globalObject: 'typeof self !== \'undefined\' ? self : this' }, resolve: { extensions: [".webpack.js", ".web.js", ".ts", ".js"] @@ -31,5 +32,18 @@ module.exports = { }, }) ] : [] - } + }, + module: { + rules: [ + { + test: /\.worker\.ts$/, + loader: "worker-loader", + options: { + inline: "no-fallback", + publicPath: "/workers/", + }, + }, + { test: /\.ts$/, loader: 'ts-loader' } + ] + }, }