• javascript 大数值数据运算


    javascript数字运算结果不准确:

    1、浮点型数字进行运算时,基本四则运算结果都可能不准确,一般是把浮点型数据转换为整型运算,然后在还原处理。

    这种情况下可以用一些常用转换方法计算,如下:

     1 /**
     2  * 加法运算
     3  */
     4 function numAdd(num1, num2) {
     5     var baseNum, baseNum1, baseNum2;
     6     try {
     7         baseNum1 = num1.toString().split(".")[1].length;
     8     } catch (e) {
     9         baseNum1 = 0;
    10     }
    11     try {
    12         baseNum2 = num2.toString().split(".")[1].length;
    13     } catch (e) {
    14         baseNum2 = 0;
    15     }
    16     baseNum = Math.pow(10, Math.max(baseNum1, baseNum2));
    17     return (num1 * baseNum + num2 * baseNum) / baseNum;
    18 };
    19 
    20 /**
    21  * 减法运算
    22  */
    23 function numSub(num1, num2) {
    24     var baseNum, baseNum1, baseNum2;
    25     var precision;
    26     //精度    
    27     try {
    28         baseNum1 = num1.toString().split(".")[1].length;
    29     } catch (e) {
    30         baseNum1 = 0;
    31     }
    32     try {
    33         baseNum2 = num2.toString().split(".")[1].length;
    34     } catch (e) {
    35         baseNum2 = 0;
    36     }
    37     baseNum = Math.pow(10, Math.max(baseNum1, baseNum2));
    38     precision = (baseNum1 >= baseNum2) ? baseNum1 : baseNum2;
    39     return ((num1 * baseNum - num2 * baseNum) / baseNum).toFixed(precision);
    40 }
    41 
    42 /**
    43  * 乘法运算
    44  */
    45 function numMulti(num1, num2) {
    46     var baseNum = 0;
    47     try {
    48         baseNum += num1.toString().split(".")[1].length;
    49     } catch (e) {
    50     }
    51     try {
    52         baseNum += num2.toString().split(".")[1].length;
    53     } catch (e) {
    54     }
    55     return Number(num1.toString().replace(".", ""))
    56             * Number(num2.toString().replace(".", "")) / Math.pow(10, baseNum);
    57 };
    58 
    59 
    60 /**
    61  * 除法運算
    62  */
    63 function numDiv(num1, num2) {
    64     var baseNum1 = 0, baseNum2 = 0;
    65     var baseNum3, baseNum4;
    66     try {
    67         baseNum1 = num1.toString().split(".")[1].length;
    68     } catch (e) {
    69         baseNum1 = 0;
    70     }
    71     try {
    72         baseNum2 = num2.toString().split(".")[1].length;
    73     } catch (e) {
    74         baseNum2 = 0;
    75     }
    76     with (Math) {
    77         baseNum3 = Number(num1.toString().replace(".", ""));
    78         baseNum4 = Number(num2.toString().replace(".", ""));
    79         return (baseNum3 / baseNum4) * pow(10, baseNum2 - baseNum1);
    80     }
    81 }

    2、整数运算在数字特别大的时候,计算结果的尾数也会不准确。如超过9个9乘以本身的乘法运算时,计算出的结果最大是999999998000000000,正常结果个位数应该为1,但是js运算结果将个位数去掉了,类似数据比较大时,经验证,7位数乘以7位数还是正常的,超过后就不准确了。网上搜到国外有个针对js计算大数值的情况,乘法运算可支持15位以内的运算。如下是js算法全文

      

       1 /*
       2     JavaScript BigInteger library version 0.9
       3     http://silentmatt.com/biginteger/
       4 
       5     Copyright (c) 2009 Matthew Crumley <email@matthewcrumley.com>
       6     Copyright (c) 2010,2011 by John Tobey <John.Tobey@gmail.com>
       7     Licensed under the MIT license.
       8 
       9     Support for arbitrary internal representation base was added by
      10     Vitaly Magerya.
      11 */
      12 
      13 /*
      14     File: biginteger.js
      15 
      16     Exports:
      17 
      18         <BigInteger>
      19 */
      20 (function(exports) {
      21 "use strict";
      22 /*
      23     Class: BigInteger
      24     An arbitrarily-large integer.
      25 
      26     <BigInteger> objects should be considered immutable. None of the "built-in"
      27     methods modify *this* or their arguments. All properties should be
      28     considered private.
      29 
      30     All the methods of <BigInteger> instances can be called "statically". The
      31     static versions are convenient if you don't already have a <BigInteger>
      32     object.
      33 
      34     As an example, these calls are equivalent.
      35 
      36     > BigInteger(4).multiply(5); // returns BigInteger(20);
      37     > BigInteger.multiply(4, 5); // returns BigInteger(20);
      38 
      39     > var a = 42;
      40     > var a = BigInteger.toJSValue("0b101010"); // Not completely useless...
      41 */
      42 
      43 var CONSTRUCT = {}; // Unique token to call "private" version of constructor
      44 
      45 /*
      46     Constructor: BigInteger()
      47     Convert a value to a <BigInteger>.
      48 
      49     Although <BigInteger()> is the constructor for <BigInteger> objects, it is
      50     best not to call it as a constructor. If *n* is a <BigInteger> object, it is
      51     simply returned as-is. Otherwise, <BigInteger()> is equivalent to <parse>
      52     without a radix argument.
      53 
      54     > var n0 = BigInteger();      // Same as <BigInteger.ZERO>
      55     > var n1 = BigInteger("123"); // Create a new <BigInteger> with value 123
      56     > var n2 = BigInteger(123);   // Create a new <BigInteger> with value 123
      57     > var n3 = BigInteger(n2);    // Return n2, unchanged
      58 
      59     The constructor form only takes an array and a sign. *n* must be an
      60     array of numbers in little-endian order, where each digit is between 0
      61     and BigInteger.base.  The second parameter sets the sign: -1 for
      62     negative, +1 for positive, or 0 for zero. The array is *not copied and
      63     may be modified*. If the array contains only zeros, the sign parameter
      64     is ignored and is forced to zero.
      65 
      66     > new BigInteger([5], -1): create a new BigInteger with value -5
      67 
      68     Parameters:
      69 
      70         n - Value to convert to a <BigInteger>.
      71 
      72     Returns:
      73 
      74         A <BigInteger> value.
      75 
      76     See Also:
      77 
      78         <parse>, <BigInteger>
      79 */
      80 function BigInteger(n, s, token) {
      81     if (token !== CONSTRUCT) {
      82         if (n instanceof BigInteger) {
      83             return n;
      84         }
      85         else if (typeof n === "undefined") {
      86             return ZERO;
      87         }
      88         return BigInteger.parse(n);
      89     }
      90 
      91     n = n || [];  // Provide the nullary constructor for subclasses.
      92     while (n.length && !n[n.length - 1]) {
      93         --n.length;
      94     }
      95     this._d = n;
      96     this._s = n.length ? (s || 1) : 0;
      97 }
      98 
      99 BigInteger._construct = function(n, s) {
     100     return new BigInteger(n, s, CONSTRUCT);
     101 };
     102 
     103 // Base-10 speedup hacks in parse, toString, exp10 and log functions
     104 // require base to be a power of 10. 10^7 is the largest such power
     105 // that won't cause a precision loss when digits are multiplied.
     106 var BigInteger_base = 10000000;
     107 var BigInteger_base_log10 = 7;
     108 
     109 BigInteger.base = BigInteger_base;
     110 BigInteger.base_log10 = BigInteger_base_log10;
     111 
     112 var ZERO = new BigInteger([], 0, CONSTRUCT);
     113 // Constant: ZERO
     114 // <BigInteger> 0.
     115 BigInteger.ZERO = ZERO;
     116 
     117 var ONE = new BigInteger([1], 1, CONSTRUCT);
     118 // Constant: ONE
     119 // <BigInteger> 1.
     120 BigInteger.ONE = ONE;
     121 
     122 var M_ONE = new BigInteger(ONE._d, -1, CONSTRUCT);
     123 // Constant: M_ONE
     124 // <BigInteger> -1.
     125 BigInteger.M_ONE = M_ONE;
     126 
     127 // Constant: _0
     128 // Shortcut for <ZERO>.
     129 BigInteger._0 = ZERO;
     130 
     131 // Constant: _1
     132 // Shortcut for <ONE>.
     133 BigInteger._1 = ONE;
     134 
     135 /*
     136     Constant: small
     137     Array of <BigIntegers> from 0 to 36.
     138 
     139     These are used internally for parsing, but useful when you need a "small"
     140     <BigInteger>.
     141 
     142     See Also:
     143 
     144         <ZERO>, <ONE>, <_0>, <_1>
     145 */
     146 BigInteger.small = [
     147     ZERO,
     148     ONE,
     149     /* Assuming BigInteger_base > 36 */
     150     new BigInteger( [2], 1, CONSTRUCT),
     151     new BigInteger( [3], 1, CONSTRUCT),
     152     new BigInteger( [4], 1, CONSTRUCT),
     153     new BigInteger( [5], 1, CONSTRUCT),
     154     new BigInteger( [6], 1, CONSTRUCT),
     155     new BigInteger( [7], 1, CONSTRUCT),
     156     new BigInteger( [8], 1, CONSTRUCT),
     157     new BigInteger( [9], 1, CONSTRUCT),
     158     new BigInteger([10], 1, CONSTRUCT),
     159     new BigInteger([11], 1, CONSTRUCT),
     160     new BigInteger([12], 1, CONSTRUCT),
     161     new BigInteger([13], 1, CONSTRUCT),
     162     new BigInteger([14], 1, CONSTRUCT),
     163     new BigInteger([15], 1, CONSTRUCT),
     164     new BigInteger([16], 1, CONSTRUCT),
     165     new BigInteger([17], 1, CONSTRUCT),
     166     new BigInteger([18], 1, CONSTRUCT),
     167     new BigInteger([19], 1, CONSTRUCT),
     168     new BigInteger([20], 1, CONSTRUCT),
     169     new BigInteger([21], 1, CONSTRUCT),
     170     new BigInteger([22], 1, CONSTRUCT),
     171     new BigInteger([23], 1, CONSTRUCT),
     172     new BigInteger([24], 1, CONSTRUCT),
     173     new BigInteger([25], 1, CONSTRUCT),
     174     new BigInteger([26], 1, CONSTRUCT),
     175     new BigInteger([27], 1, CONSTRUCT),
     176     new BigInteger([28], 1, CONSTRUCT),
     177     new BigInteger([29], 1, CONSTRUCT),
     178     new BigInteger([30], 1, CONSTRUCT),
     179     new BigInteger([31], 1, CONSTRUCT),
     180     new BigInteger([32], 1, CONSTRUCT),
     181     new BigInteger([33], 1, CONSTRUCT),
     182     new BigInteger([34], 1, CONSTRUCT),
     183     new BigInteger([35], 1, CONSTRUCT),
     184     new BigInteger([36], 1, CONSTRUCT)
     185 ];
     186 
     187 // Used for parsing/radix conversion
     188 BigInteger.digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
     189 
     190 /*
     191     Method: toString
     192     Convert a <BigInteger> to a string.
     193 
     194     When *base* is greater than 10, letters are upper case.
     195 
     196     Parameters:
     197 
     198         base - Optional base to represent the number in (default is base 10).
     199                Must be between 2 and 36 inclusive, or an Error will be thrown.
     200 
     201     Returns:
     202 
     203         The string representation of the <BigInteger>.
     204 */
     205 BigInteger.prototype.toString = function(base) {
     206     base = +base || 10;
     207     if (base < 2 || base > 36) {
     208         throw new Error("illegal radix " + base + ".");
     209     }
     210     if (this._s === 0) {
     211         return "0";
     212     }
     213     if (base === 10) {
     214         var str = this._s < 0 ? "-" : "";
     215         str += this._d[this._d.length - 1].toString();
     216         for (var i = this._d.length - 2; i >= 0; i--) {
     217             var group = this._d[i].toString();
     218             while (group.length < BigInteger_base_log10) group = '0' + group;
     219             str += group;
     220         }
     221         return str;
     222     }
     223     else {
     224         var numerals = BigInteger.digits;
     225         base = BigInteger.small[base];
     226         var sign = this._s;
     227 
     228         var n = this.abs();
     229         var digits = [];
     230         var digit;
     231 
     232         while (n._s !== 0) {
     233             var divmod = n.divRem(base);
     234             n = divmod[0];
     235             digit = divmod[1];
     236             // TODO: This could be changed to unshift instead of reversing at the end.
     237             // Benchmark both to compare speeds.
     238             digits.push(numerals[digit.valueOf()]);
     239         }
     240         return (sign < 0 ? "-" : "") + digits.reverse().join("");
     241     }
     242 };
     243 
     244 // Verify strings for parsing
     245 BigInteger.radixRegex = [
     246     /^$/,
     247     /^$/,
     248     /^[01]*$/,
     249     /^[012]*$/,
     250     /^[0-3]*$/,
     251     /^[0-4]*$/,
     252     /^[0-5]*$/,
     253     /^[0-6]*$/,
     254     /^[0-7]*$/,
     255     /^[0-8]*$/,
     256     /^[0-9]*$/,
     257     /^[0-9aA]*$/,
     258     /^[0-9abAB]*$/,
     259     /^[0-9abcABC]*$/,
     260     /^[0-9a-dA-D]*$/,
     261     /^[0-9a-eA-E]*$/,
     262     /^[0-9a-fA-F]*$/,
     263     /^[0-9a-gA-G]*$/,
     264     /^[0-9a-hA-H]*$/,
     265     /^[0-9a-iA-I]*$/,
     266     /^[0-9a-jA-J]*$/,
     267     /^[0-9a-kA-K]*$/,
     268     /^[0-9a-lA-L]*$/,
     269     /^[0-9a-mA-M]*$/,
     270     /^[0-9a-nA-N]*$/,
     271     /^[0-9a-oA-O]*$/,
     272     /^[0-9a-pA-P]*$/,
     273     /^[0-9a-qA-Q]*$/,
     274     /^[0-9a-rA-R]*$/,
     275     /^[0-9a-sA-S]*$/,
     276     /^[0-9a-tA-T]*$/,
     277     /^[0-9a-uA-U]*$/,
     278     /^[0-9a-vA-V]*$/,
     279     /^[0-9a-wA-W]*$/,
     280     /^[0-9a-xA-X]*$/,
     281     /^[0-9a-yA-Y]*$/,
     282     /^[0-9a-zA-Z]*$/
     283 ];
     284 
     285 /*
     286     Function: parse
     287     Parse a string into a <BigInteger>.
     288 
     289     *base* is optional but, if provided, must be from 2 to 36 inclusive. If
     290     *base* is not provided, it will be guessed based on the leading characters
     291     of *s* as follows:
     292 
     293     - "0x" or "0X": *base* = 16
     294     - "0c" or "0C": *base* = 8
     295     - "0b" or "0B": *base* = 2
     296     - else: *base* = 10
     297 
     298     If no base is provided, or *base* is 10, the number can be in exponential
     299     form. For example, these are all valid:
     300 
     301     > BigInteger.parse("1e9");              // Same as "1000000000"
     302     > BigInteger.parse("1.234*10^3");       // Same as 1234
     303     > BigInteger.parse("56789 * 10 ** -2"); // Same as 567
     304 
     305     If any characters fall outside the range defined by the radix, an exception
     306     will be thrown.
     307 
     308     Parameters:
     309 
     310         s - The string to parse.
     311         base - Optional radix (default is to guess based on *s*).
     312 
     313     Returns:
     314 
     315         a <BigInteger> instance.
     316 */
     317 BigInteger.parse = function(s, base) {
     318     // Expands a number in exponential form to decimal form.
     319     // expandExponential("-13.441*10^5") === "1344100";
     320     // expandExponential("1.12300e-1") === "0.112300";
     321     // expandExponential(1000000000000000000000000000000) === "1000000000000000000000000000000";
     322     function expandExponential(str) {
     323         str = str.replace(/s*[*xX]s*10s*(^|**)s*/, "e");
     324 
     325         return str.replace(/^([+-])?(d+).?(d*)[eE]([+-]?d+)$/, function(x, s, n, f, c) {
     326             c = +c;
     327             var l = c < 0;
     328             var i = n.length + c;
     329             x = (l ? n : f).length;
     330             c = ((c = Math.abs(c)) >= x ? c - x + l : 0);
     331             var z = (new Array(c + 1)).join("0");
     332             var r = n + f;
     333             return (s || "") + (l ? r = z + r : r += z).substr(0, i += l ? z.length : 0) + (i < r.length ? "." + r.substr(i) : "");
     334         });
     335     }
     336 
     337     s = s.toString();
     338     if (typeof base === "undefined" || +base === 10) {
     339         s = expandExponential(s);
     340     }
     341 
     342     var prefixRE;
     343     if (typeof base === "undefined") {
     344         prefixRE = '0[xcb]';
     345     }
     346     else if (base == 16) {
     347         prefixRE = '0x';
     348     }
     349     else if (base == 8) {
     350         prefixRE = '0c';
     351     }
     352     else if (base == 2) {
     353         prefixRE = '0b';
     354     }
     355     else {
     356         prefixRE = '';
     357     }
     358     var parts = new RegExp('^([+\-]?)(' + prefixRE + ')?([0-9a-z]*)(?:\.\d*)?$', 'i').exec(s);
     359     if (parts) {
     360         var sign = parts[1] || "+";
     361         var baseSection = parts[2] || "";
     362         var digits = parts[3] || "";
     363 
     364         if (typeof base === "undefined") {
     365             // Guess base
     366             if (baseSection === "0x" || baseSection === "0X") { // Hex
     367                 base = 16;
     368             }
     369             else if (baseSection === "0c" || baseSection === "0C") { // Octal
     370                 base = 8;
     371             }
     372             else if (baseSection === "0b" || baseSection === "0B") { // Binary
     373                 base = 2;
     374             }
     375             else {
     376                 base = 10;
     377             }
     378         }
     379         else if (base < 2 || base > 36) {
     380             throw new Error("Illegal radix " + base + ".");
     381         }
     382 
     383         base = +base;
     384 
     385         // Check for digits outside the range
     386         if (!(BigInteger.radixRegex[base].test(digits))) {
     387             throw new Error("Bad digit for radix " + base);
     388         }
     389 
     390         // Strip leading zeros, and convert to array
     391         digits = digits.replace(/^0+/, "").split("");
     392         if (digits.length === 0) {
     393             return ZERO;
     394         }
     395 
     396         // Get the sign (we know it's not zero)
     397         sign = (sign === "-") ? -1 : 1;
     398 
     399         // Optimize 10
     400         if (base == 10) {
     401             var d = [];
     402             while (digits.length >= BigInteger_base_log10) {
     403                 d.push(parseInt(digits.splice(digits.length-BigInteger.base_log10, BigInteger.base_log10).join(''), 10));
     404             }
     405             d.push(parseInt(digits.join(''), 10));
     406             return new BigInteger(d, sign, CONSTRUCT);
     407         }
     408 
     409         // Do the conversion
     410         var d = ZERO;
     411         base = BigInteger.small[base];
     412         var small = BigInteger.small;
     413         for (var i = 0; i < digits.length; i++) {
     414             d = d.multiply(base).add(small[parseInt(digits[i], 36)]);
     415         }
     416         return new BigInteger(d._d, sign, CONSTRUCT);
     417     }
     418     else {
     419         throw new Error("Invalid BigInteger format: " + s);
     420     }
     421 };
     422 
     423 /*
     424     Function: add
     425     Add two <BigIntegers>.
     426 
     427     Parameters:
     428 
     429         n - The number to add to *this*. Will be converted to a <BigInteger>.
     430 
     431     Returns:
     432 
     433         The numbers added together.
     434 
     435     See Also:
     436 
     437         <subtract>, <multiply>, <quotient>, <next>
     438 */
     439 BigInteger.prototype.add = function(n) {
     440     if (this._s === 0) {
     441         return BigInteger(n);
     442     }
     443 
     444     n = BigInteger(n);
     445     if (n._s === 0) {
     446         return this;
     447     }
     448     if (this._s !== n._s) {
     449         n = n.negate();
     450         return this.subtract(n);
     451     }
     452 
     453     var a = this._d;
     454     var b = n._d;
     455     var al = a.length;
     456     var bl = b.length;
     457     var sum = new Array(Math.max(al, bl) + 1);
     458     var size = Math.min(al, bl);
     459     var carry = 0;
     460     var digit;
     461 
     462     for (var i = 0; i < size; i++) {
     463         digit = a[i] + b[i] + carry;
     464         sum[i] = digit % BigInteger_base;
     465         carry = (digit / BigInteger_base) | 0;
     466     }
     467     if (bl > al) {
     468         a = b;
     469         al = bl;
     470     }
     471     for (i = size; carry && i < al; i++) {
     472         digit = a[i] + carry;
     473         sum[i] = digit % BigInteger_base;
     474         carry = (digit / BigInteger_base) | 0;
     475     }
     476     if (carry) {
     477         sum[i] = carry;
     478     }
     479 
     480     for ( ; i < al; i++) {
     481         sum[i] = a[i];
     482     }
     483 
     484     return new BigInteger(sum, this._s, CONSTRUCT);
     485 };
     486 
     487 /*
     488     Function: negate
     489     Get the additive inverse of a <BigInteger>.
     490 
     491     Returns:
     492 
     493         A <BigInteger> with the same magnatude, but with the opposite sign.
     494 
     495     See Also:
     496 
     497         <abs>
     498 */
     499 BigInteger.prototype.negate = function() {
     500     return new BigInteger(this._d, (-this._s) | 0, CONSTRUCT);
     501 };
     502 
     503 /*
     504     Function: abs
     505     Get the absolute value of a <BigInteger>.
     506 
     507     Returns:
     508 
     509         A <BigInteger> with the same magnatude, but always positive (or zero).
     510 
     511     See Also:
     512 
     513         <negate>
     514 */
     515 BigInteger.prototype.abs = function() {
     516     return (this._s < 0) ? this.negate() : this;
     517 };
     518 
     519 /*
     520     Function: subtract
     521     Subtract two <BigIntegers>.
     522 
     523     Parameters:
     524 
     525         n - The number to subtract from *this*. Will be converted to a <BigInteger>.
     526 
     527     Returns:
     528 
     529         The *n* subtracted from *this*.
     530 
     531     See Also:
     532 
     533         <add>, <multiply>, <quotient>, <prev>
     534 */
     535 BigInteger.prototype.subtract = function(n) {
     536     if (this._s === 0) {
     537         return BigInteger(n).negate();
     538     }
     539 
     540     n = BigInteger(n);
     541     if (n._s === 0) {
     542         return this;
     543     }
     544     if (this._s !== n._s) {
     545         n = n.negate();
     546         return this.add(n);
     547     }
     548 
     549     var m = this;
     550     // negative - negative => -|a| - -|b| => -|a| + |b| => |b| - |a|
     551     if (this._s < 0) {
     552         m = new BigInteger(n._d, 1, CONSTRUCT);
     553         n = new BigInteger(this._d, 1, CONSTRUCT);
     554     }
     555 
     556     // Both are positive => a - b
     557     var sign = m.compareAbs(n);
     558     if (sign === 0) {
     559         return ZERO;
     560     }
     561     else if (sign < 0) {
     562         // swap m and n
     563         var t = n;
     564         n = m;
     565         m = t;
     566     }
     567 
     568     // a > b
     569     var a = m._d;
     570     var b = n._d;
     571     var al = a.length;
     572     var bl = b.length;
     573     var diff = new Array(al); // al >= bl since a > b
     574     var borrow = 0;
     575     var i;
     576     var digit;
     577 
     578     for (i = 0; i < bl; i++) {
     579         digit = a[i] - borrow - b[i];
     580         if (digit < 0) {
     581             digit += BigInteger_base;
     582             borrow = 1;
     583         }
     584         else {
     585             borrow = 0;
     586         }
     587         diff[i] = digit;
     588     }
     589     for (i = bl; i < al; i++) {
     590         digit = a[i] - borrow;
     591         if (digit < 0) {
     592             digit += BigInteger_base;
     593         }
     594         else {
     595             diff[i++] = digit;
     596             break;
     597         }
     598         diff[i] = digit;
     599     }
     600     for ( ; i < al; i++) {
     601         diff[i] = a[i];
     602     }
     603 
     604     return new BigInteger(diff, sign, CONSTRUCT);
     605 };
     606 
     607 (function() {
     608     function addOne(n, sign) {
     609         var a = n._d;
     610         var sum = a.slice();
     611         var carry = true;
     612         var i = 0;
     613 
     614         while (true) {
     615             var digit = (a[i] || 0) + 1;
     616             sum[i] = digit % BigInteger_base;
     617             if (digit <= BigInteger_base - 1) {
     618                 break;
     619             }
     620             ++i;
     621         }
     622 
     623         return new BigInteger(sum, sign, CONSTRUCT);
     624     }
     625 
     626     function subtractOne(n, sign) {
     627         var a = n._d;
     628         var sum = a.slice();
     629         var borrow = true;
     630         var i = 0;
     631 
     632         while (true) {
     633             var digit = (a[i] || 0) - 1;
     634             if (digit < 0) {
     635                 sum[i] = digit + BigInteger_base;
     636             }
     637             else {
     638                 sum[i] = digit;
     639                 break;
     640             }
     641             ++i;
     642         }
     643 
     644         return new BigInteger(sum, sign, CONSTRUCT);
     645     }
     646 
     647     /*
     648         Function: next
     649         Get the next <BigInteger> (add one).
     650 
     651         Returns:
     652 
     653             *this* + 1.
     654 
     655         See Also:
     656 
     657             <add>, <prev>
     658     */
     659     BigInteger.prototype.next = function() {
     660         switch (this._s) {
     661         case 0:
     662             return ONE;
     663         case -1:
     664             return subtractOne(this, -1);
     665         // case 1:
     666         default:
     667             return addOne(this, 1);
     668         }
     669     };
     670 
     671     /*
     672         Function: prev
     673         Get the previous <BigInteger> (subtract one).
     674 
     675         Returns:
     676 
     677             *this* - 1.
     678 
     679         See Also:
     680 
     681             <next>, <subtract>
     682     */
     683     BigInteger.prototype.prev = function() {
     684         switch (this._s) {
     685         case 0:
     686             return M_ONE;
     687         case -1:
     688             return addOne(this, -1);
     689         // case 1:
     690         default:
     691             return subtractOne(this, 1);
     692         }
     693     };
     694 })();
     695 
     696 /*
     697     Function: compareAbs
     698     Compare the absolute value of two <BigIntegers>.
     699 
     700     Calling <compareAbs> is faster than calling <abs> twice, then <compare>.
     701 
     702     Parameters:
     703 
     704         n - The number to compare to *this*. Will be converted to a <BigInteger>.
     705 
     706     Returns:
     707 
     708         -1, 0, or +1 if *|this|* is less than, equal to, or greater than *|n|*.
     709 
     710     See Also:
     711 
     712         <compare>, <abs>
     713 */
     714 BigInteger.prototype.compareAbs = function(n) {
     715     if (this === n) {
     716         return 0;
     717     }
     718 
     719     if (!(n instanceof BigInteger)) {
     720         if (!isFinite(n)) {
     721             return(isNaN(n) ? n : -1);
     722         }
     723         n = BigInteger(n);
     724     }
     725 
     726     if (this._s === 0) {
     727         return (n._s !== 0) ? -1 : 0;
     728     }
     729     if (n._s === 0) {
     730         return 1;
     731     }
     732 
     733     var l = this._d.length;
     734     var nl = n._d.length;
     735     if (l < nl) {
     736         return -1;
     737     }
     738     else if (l > nl) {
     739         return 1;
     740     }
     741 
     742     var a = this._d;
     743     var b = n._d;
     744     for (var i = l-1; i >= 0; i--) {
     745         if (a[i] !== b[i]) {
     746             return a[i] < b[i] ? -1 : 1;
     747         }
     748     }
     749 
     750     return 0;
     751 };
     752 
     753 /*
     754     Function: compare
     755     Compare two <BigIntegers>.
     756 
     757     Parameters:
     758 
     759         n - The number to compare to *this*. Will be converted to a <BigInteger>.
     760 
     761     Returns:
     762 
     763         -1, 0, or +1 if *this* is less than, equal to, or greater than *n*.
     764 
     765     See Also:
     766 
     767         <compareAbs>, <isPositive>, <isNegative>, <isUnit>
     768 */
     769 BigInteger.prototype.compare = function(n) {
     770     if (this === n) {
     771         return 0;
     772     }
     773 
     774     n = BigInteger(n);
     775 
     776     if (this._s === 0) {
     777         return -n._s;
     778     }
     779 
     780     if (this._s === n._s) { // both positive or both negative
     781         var cmp = this.compareAbs(n);
     782         return cmp * this._s;
     783     }
     784     else {
     785         return this._s;
     786     }
     787 };
     788 
     789 /*
     790     Function: isUnit
     791     Return true iff *this* is either 1 or -1.
     792 
     793     Returns:
     794 
     795         true if *this* compares equal to <BigInteger.ONE> or <BigInteger.M_ONE>.
     796 
     797     See Also:
     798 
     799         <isZero>, <isNegative>, <isPositive>, <compareAbs>, <compare>,
     800         <BigInteger.ONE>, <BigInteger.M_ONE>
     801 */
     802 BigInteger.prototype.isUnit = function() {
     803     return this === ONE ||
     804         this === M_ONE ||
     805         (this._d.length === 1 && this._d[0] === 1);
     806 };
     807 
     808 /*
     809     Function: multiply
     810     Multiply two <BigIntegers>.
     811 
     812     Parameters:
     813 
     814         n - The number to multiply *this* by. Will be converted to a
     815         <BigInteger>.
     816 
     817     Returns:
     818 
     819         The numbers multiplied together.
     820 
     821     See Also:
     822 
     823         <add>, <subtract>, <quotient>, <square>
     824 */
     825 BigInteger.prototype.multiply = function(n) {
     826     // TODO: Consider adding Karatsuba multiplication for large numbers
     827     if (this._s === 0) {
     828         return ZERO;
     829     }
     830 
     831     n = BigInteger(n);
     832     if (n._s === 0) {
     833         return ZERO;
     834     }
     835     if (this.isUnit()) {
     836         if (this._s < 0) {
     837             return n.negate();
     838         }
     839         return n;
     840     }
     841     if (n.isUnit()) {
     842         if (n._s < 0) {
     843             return this.negate();
     844         }
     845         return this;
     846     }
     847     if (this === n) {
     848         return this.square();
     849     }
     850 
     851     var r = (this._d.length >= n._d.length);
     852     var a = (r ? this : n)._d; // a will be longer than b
     853     var b = (r ? n : this)._d;
     854     var al = a.length;
     855     var bl = b.length;
     856 
     857     var pl = al + bl;
     858     var partial = new Array(pl);
     859     var i;
     860     for (i = 0; i < pl; i++) {
     861         partial[i] = 0;
     862     }
     863 
     864     for (i = 0; i < bl; i++) {
     865         var carry = 0;
     866         var bi = b[i];
     867         var jlimit = al + i;
     868         var digit;
     869         for (var j = i; j < jlimit; j++) {
     870             digit = partial[j] + bi * a[j - i] + carry;
     871             carry = (digit / BigInteger_base) | 0;
     872             partial[j] = (digit % BigInteger_base) | 0;
     873         }
     874         if (carry) {
     875             digit = partial[j] + carry;
     876             carry = (digit / BigInteger_base) | 0;
     877             partial[j] = digit % BigInteger_base;
     878         }
     879     }
     880     return new BigInteger(partial, this._s * n._s, CONSTRUCT);
     881 };
     882 
     883 // Multiply a BigInteger by a single-digit native number
     884 // Assumes that this and n are >= 0
     885 // This is not really intended to be used outside the library itself
     886 BigInteger.prototype.multiplySingleDigit = function(n) {
     887     if (n === 0 || this._s === 0) {
     888         return ZERO;
     889     }
     890     if (n === 1) {
     891         return this;
     892     }
     893 
     894     var digit;
     895     if (this._d.length === 1) {
     896         digit = this._d[0] * n;
     897         if (digit >= BigInteger_base) {
     898             return new BigInteger([(digit % BigInteger_base)|0,
     899                     (digit / BigInteger_base)|0], 1, CONSTRUCT);
     900         }
     901         return new BigInteger([digit], 1, CONSTRUCT);
     902     }
     903 
     904     if (n === 2) {
     905         return this.add(this);
     906     }
     907     if (this.isUnit()) {
     908         return new BigInteger([n], 1, CONSTRUCT);
     909     }
     910 
     911     var a = this._d;
     912     var al = a.length;
     913 
     914     var pl = al + 1;
     915     var partial = new Array(pl);
     916     for (var i = 0; i < pl; i++) {
     917         partial[i] = 0;
     918     }
     919 
     920     var carry = 0;
     921     for (var j = 0; j < al; j++) {
     922         digit = n * a[j] + carry;
     923         carry = (digit / BigInteger_base) | 0;
     924         partial[j] = (digit % BigInteger_base) | 0;
     925     }
     926     if (carry) {
     927         partial[j] = carry;
     928     }
     929 
     930     return new BigInteger(partial, 1, CONSTRUCT);
     931 };
     932 
     933 /*
     934     Function: square
     935     Multiply a <BigInteger> by itself.
     936 
     937     This is slightly faster than regular multiplication, since it removes the
     938     duplicated multiplcations.
     939 
     940     Returns:
     941 
     942         > this.multiply(this)
     943 
     944     See Also:
     945         <multiply>
     946 */
     947 BigInteger.prototype.square = function() {
     948     // Normally, squaring a 10-digit number would take 100 multiplications.
     949     // Of these 10 are unique diagonals, of the remaining 90 (100-10), 45 are repeated.
     950     // This procedure saves (N*(N-1))/2 multiplications, (e.g., 45 of 100 multiplies).
     951     // Based on code by Gary Darby, Intellitech Systems Inc., www.DelphiForFun.org
     952 
     953     if (this._s === 0) {
     954         return ZERO;
     955     }
     956     if (this.isUnit()) {
     957         return ONE;
     958     }
     959 
     960     var digits = this._d;
     961     var length = digits.length;
     962     var imult1 = new Array(length + length + 1);
     963     var product, carry, k;
     964     var i;
     965 
     966     // Calculate diagonal
     967     for (i = 0; i < length; i++) {
     968         k = i * 2;
     969         product = digits[i] * digits[i];
     970         carry = (product / BigInteger_base) | 0;
     971         imult1[k] = product % BigInteger_base;
     972         imult1[k + 1] = carry;
     973     }
     974 
     975     // Calculate repeating part
     976     for (i = 0; i < length; i++) {
     977         carry = 0;
     978         k = i * 2 + 1;
     979         for (var j = i + 1; j < length; j++, k++) {
     980             product = digits[j] * digits[i] * 2 + imult1[k] + carry;
     981             carry = (product / BigInteger_base) | 0;
     982             imult1[k] = product % BigInteger_base;
     983         }
     984         k = length + i;
     985         var digit = carry + imult1[k];
     986         carry = (digit / BigInteger_base) | 0;
     987         imult1[k] = digit % BigInteger_base;
     988         imult1[k + 1] += carry;
     989     }
     990 
     991     return new BigInteger(imult1, 1, CONSTRUCT);
     992 };
     993 
     994 /*
     995     Function: quotient
     996     Divide two <BigIntegers> and truncate towards zero.
     997 
     998     <quotient> throws an exception if *n* is zero.
     999 
    1000     Parameters:
    1001 
    1002         n - The number to divide *this* by. Will be converted to a <BigInteger>.
    1003 
    1004     Returns:
    1005 
    1006         The *this* / *n*, truncated to an integer.
    1007 
    1008     See Also:
    1009 
    1010         <add>, <subtract>, <multiply>, <divRem>, <remainder>
    1011 */
    1012 BigInteger.prototype.quotient = function(n) {
    1013     return this.divRem(n)[0];
    1014 };
    1015 
    1016 /*
    1017     Function: divide
    1018     Deprecated synonym for <quotient>.
    1019 */
    1020 BigInteger.prototype.divide = BigInteger.prototype.quotient;
    1021 
    1022 /*
    1023     Function: remainder
    1024     Calculate the remainder of two <BigIntegers>.
    1025 
    1026     <remainder> throws an exception if *n* is zero.
    1027 
    1028     Parameters:
    1029 
    1030         n - The remainder after *this* is divided *this* by *n*. Will be
    1031             converted to a <BigInteger>.
    1032 
    1033     Returns:
    1034 
    1035         *this* % *n*.
    1036 
    1037     See Also:
    1038 
    1039         <divRem>, <quotient>
    1040 */
    1041 BigInteger.prototype.remainder = function(n) {
    1042     return this.divRem(n)[1];
    1043 };
    1044 
    1045 /*
    1046     Function: divRem
    1047     Calculate the integer quotient and remainder of two <BigIntegers>.
    1048 
    1049     <divRem> throws an exception if *n* is zero.
    1050 
    1051     Parameters:
    1052 
    1053         n - The number to divide *this* by. Will be converted to a <BigInteger>.
    1054 
    1055     Returns:
    1056 
    1057         A two-element array containing the quotient and the remainder.
    1058 
    1059         > a.divRem(b)
    1060 
    1061         is exactly equivalent to
    1062 
    1063         > [a.quotient(b), a.remainder(b)]
    1064 
    1065         except it is faster, because they are calculated at the same time.
    1066 
    1067     See Also:
    1068 
    1069         <quotient>, <remainder>
    1070 */
    1071 BigInteger.prototype.divRem = function(n) {
    1072     n = BigInteger(n);
    1073     if (n._s === 0) {
    1074         throw new Error("Divide by zero");
    1075     }
    1076     if (this._s === 0) {
    1077         return [ZERO, ZERO];
    1078     }
    1079     if (n._d.length === 1) {
    1080         return this.divRemSmall(n._s * n._d[0]);
    1081     }
    1082 
    1083     // Test for easy cases -- |n1| <= |n2|
    1084     switch (this.compareAbs(n)) {
    1085     case 0: // n1 == n2
    1086         return [this._s === n._s ? ONE : M_ONE, ZERO];
    1087     case -1: // |n1| < |n2|
    1088         return [ZERO, this];
    1089     }
    1090 
    1091     var sign = this._s * n._s;
    1092     var a = n.abs();
    1093     var b_digits = this._d;
    1094     var b_index = b_digits.length;
    1095     var digits = n._d.length;
    1096     var quot = [];
    1097     var guess;
    1098 
    1099     var part = new BigInteger([], 0, CONSTRUCT);
    1100     part._s = 1;
    1101 
    1102     while (b_index) {
    1103         part._d.unshift(b_digits[--b_index]);
    1104 
    1105         if (part.compareAbs(n) < 0) {
    1106             quot.push(0);
    1107             continue;
    1108         }
    1109         if (part._s === 0) {
    1110             guess = 0;
    1111         }
    1112         else {
    1113             var xlen = part._d.length, ylen = a._d.length;
    1114             var highx = part._d[xlen-1]*BigInteger_base + part._d[xlen-2];
    1115             var highy = a._d[ylen-1]*BigInteger_base + a._d[ylen-2];
    1116             if (part._d.length > a._d.length) {
    1117                 // The length of part._d can either match a._d length,
    1118                 // or exceed it by one.
    1119                 highx = (highx+1)*BigInteger_base;
    1120             }
    1121             guess = Math.ceil(highx/highy);
    1122         }
    1123         do {
    1124             var check = a.multiplySingleDigit(guess);
    1125             if (check.compareAbs(part) <= 0) {
    1126                 break;
    1127             }
    1128             guess--;
    1129         } while (guess);
    1130 
    1131         quot.push(guess);
    1132         if (!guess) {
    1133             continue;
    1134         }
    1135         var diff = part.subtract(check);
    1136         part._d = diff._d.slice();
    1137         if (part._d.length === 0) {
    1138             part._s = 0;
    1139         }
    1140     }
    1141 
    1142     return [new BigInteger(quot.reverse(), sign, CONSTRUCT),
    1143            new BigInteger(part._d, this._s, CONSTRUCT)];
    1144 };
    1145 
    1146 // Throws an exception if n is outside of (-BigInteger.base, -1] or
    1147 // [1, BigInteger.base).  It's not necessary to call this, since the
    1148 // other division functions will call it if they are able to.
    1149 BigInteger.prototype.divRemSmall = function(n) {
    1150     var r;
    1151     n = +n;
    1152     if (n === 0) {
    1153         throw new Error("Divide by zero");
    1154     }
    1155 
    1156     var n_s = n < 0 ? -1 : 1;
    1157     var sign = this._s * n_s;
    1158     n = Math.abs(n);
    1159 
    1160     if (n < 1 || n >= BigInteger_base) {
    1161         throw new Error("Argument out of range");
    1162     }
    1163 
    1164     if (this._s === 0) {
    1165         return [ZERO, ZERO];
    1166     }
    1167 
    1168     if (n === 1 || n === -1) {
    1169         return [(sign === 1) ? this.abs() : new BigInteger(this._d, sign, CONSTRUCT), ZERO];
    1170     }
    1171 
    1172     // 2 <= n < BigInteger_base
    1173 
    1174     // divide a single digit by a single digit
    1175     if (this._d.length === 1) {
    1176         var q = new BigInteger([(this._d[0] / n) | 0], 1, CONSTRUCT);
    1177         r = new BigInteger([(this._d[0] % n) | 0], 1, CONSTRUCT);
    1178         if (sign < 0) {
    1179             q = q.negate();
    1180         }
    1181         if (this._s < 0) {
    1182             r = r.negate();
    1183         }
    1184         return [q, r];
    1185     }
    1186 
    1187     var digits = this._d.slice();
    1188     var quot = new Array(digits.length);
    1189     var part = 0;
    1190     var diff = 0;
    1191     var i = 0;
    1192     var guess;
    1193 
    1194     while (digits.length) {
    1195         part = part * BigInteger_base + digits[digits.length - 1];
    1196         if (part < n) {
    1197             quot[i++] = 0;
    1198             digits.pop();
    1199             diff = BigInteger_base * diff + part;
    1200             continue;
    1201         }
    1202         if (part === 0) {
    1203             guess = 0;
    1204         }
    1205         else {
    1206             guess = (part / n) | 0;
    1207         }
    1208 
    1209         var check = n * guess;
    1210         diff = part - check;
    1211         quot[i++] = guess;
    1212         if (!guess) {
    1213             digits.pop();
    1214             continue;
    1215         }
    1216 
    1217         digits.pop();
    1218         part = diff;
    1219     }
    1220 
    1221     r = new BigInteger([diff], 1, CONSTRUCT);
    1222     if (this._s < 0) {
    1223         r = r.negate();
    1224     }
    1225     return [new BigInteger(quot.reverse(), sign, CONSTRUCT), r];
    1226 };
    1227 
    1228 /*
    1229     Function: isEven
    1230     Return true iff *this* is divisible by two.
    1231 
    1232     Note that <BigInteger.ZERO> is even.
    1233 
    1234     Returns:
    1235 
    1236         true if *this* is even, false otherwise.
    1237 
    1238     See Also:
    1239 
    1240         <isOdd>
    1241 */
    1242 BigInteger.prototype.isEven = function() {
    1243     var digits = this._d;
    1244     return this._s === 0 || digits.length === 0 || (digits[0] % 2) === 0;
    1245 };
    1246 
    1247 /*
    1248     Function: isOdd
    1249     Return true iff *this* is not divisible by two.
    1250 
    1251     Returns:
    1252 
    1253         true if *this* is odd, false otherwise.
    1254 
    1255     See Also:
    1256 
    1257         <isEven>
    1258 */
    1259 BigInteger.prototype.isOdd = function() {
    1260     return !this.isEven();
    1261 };
    1262 
    1263 /*
    1264     Function: sign
    1265     Get the sign of a <BigInteger>.
    1266 
    1267     Returns:
    1268 
    1269         * -1 if *this* < 0
    1270         * 0 if *this* == 0
    1271         * +1 if *this* > 0
    1272 
    1273     See Also:
    1274 
    1275         <isZero>, <isPositive>, <isNegative>, <compare>, <BigInteger.ZERO>
    1276 */
    1277 BigInteger.prototype.sign = function() {
    1278     return this._s;
    1279 };
    1280 
    1281 /*
    1282     Function: isPositive
    1283     Return true iff *this* > 0.
    1284 
    1285     Returns:
    1286 
    1287         true if *this*.compare(<BigInteger.ZERO>) == 1.
    1288 
    1289     See Also:
    1290 
    1291         <sign>, <isZero>, <isNegative>, <isUnit>, <compare>, <BigInteger.ZERO>
    1292 */
    1293 BigInteger.prototype.isPositive = function() {
    1294     return this._s > 0;
    1295 };
    1296 
    1297 /*
    1298     Function: isNegative
    1299     Return true iff *this* < 0.
    1300 
    1301     Returns:
    1302 
    1303         true if *this*.compare(<BigInteger.ZERO>) == -1.
    1304 
    1305     See Also:
    1306 
    1307         <sign>, <isPositive>, <isZero>, <isUnit>, <compare>, <BigInteger.ZERO>
    1308 */
    1309 BigInteger.prototype.isNegative = function() {
    1310     return this._s < 0;
    1311 };
    1312 
    1313 /*
    1314     Function: isZero
    1315     Return true iff *this* == 0.
    1316 
    1317     Returns:
    1318 
    1319         true if *this*.compare(<BigInteger.ZERO>) == 0.
    1320 
    1321     See Also:
    1322 
    1323         <sign>, <isPositive>, <isNegative>, <isUnit>, <BigInteger.ZERO>
    1324 */
    1325 BigInteger.prototype.isZero = function() {
    1326     return this._s === 0;
    1327 };
    1328 
    1329 /*
    1330     Function: exp10
    1331     Multiply a <BigInteger> by a power of 10.
    1332 
    1333     This is equivalent to, but faster than
    1334 
    1335     > if (n >= 0) {
    1336     >     return this.multiply(BigInteger("1e" + n));
    1337     > }
    1338     > else { // n <= 0
    1339     >     return this.quotient(BigInteger("1e" + -n));
    1340     > }
    1341 
    1342     Parameters:
    1343 
    1344         n - The power of 10 to multiply *this* by. *n* is converted to a
    1345         javascipt number and must be no greater than <BigInteger.MAX_EXP>
    1346         (0x7FFFFFFF), or an exception will be thrown.
    1347 
    1348     Returns:
    1349 
    1350         *this* * (10 ** *n*), truncated to an integer if necessary.
    1351 
    1352     See Also:
    1353 
    1354         <pow>, <multiply>
    1355 */
    1356 BigInteger.prototype.exp10 = function(n) {
    1357     n = +n;
    1358     if (n === 0) {
    1359         return this;
    1360     }
    1361     if (Math.abs(n) > Number(MAX_EXP)) {
    1362         throw new Error("exponent too large in BigInteger.exp10");
    1363     }
    1364     if (n > 0) {
    1365         var k = new BigInteger(this._d.slice(), this._s, CONSTRUCT);
    1366 
    1367         for (; n >= BigInteger_base_log10; n -= BigInteger_base_log10) {
    1368             k._d.unshift(0);
    1369         }
    1370         if (n == 0)
    1371             return k;
    1372         k._s = 1;
    1373         k = k.multiplySingleDigit(Math.pow(10, n));
    1374         return (this._s < 0 ? k.negate() : k);
    1375     } else if (-n >= this._d.length*BigInteger_base_log10) {
    1376         return ZERO;
    1377     } else {
    1378         var k = new BigInteger(this._d.slice(), this._s, CONSTRUCT);
    1379 
    1380         for (n = -n; n >= BigInteger_base_log10; n -= BigInteger_base_log10) {
    1381             k._d.shift();
    1382         }
    1383         return (n == 0) ? k : k.divRemSmall(Math.pow(10, n))[0];
    1384     }
    1385 };
    1386 
    1387 /*
    1388     Function: pow
    1389     Raise a <BigInteger> to a power.
    1390 
    1391     In this implementation, 0**0 is 1.
    1392 
    1393     Parameters:
    1394 
    1395         n - The exponent to raise *this* by. *n* must be no greater than
    1396         <BigInteger.MAX_EXP> (0x7FFFFFFF), or an exception will be thrown.
    1397 
    1398     Returns:
    1399 
    1400         *this* raised to the *nth* power.
    1401 
    1402     See Also:
    1403 
    1404         <modPow>
    1405 */
    1406 BigInteger.prototype.pow = function(n) {
    1407     if (this.isUnit()) {
    1408         if (this._s > 0) {
    1409             return this;
    1410         }
    1411         else {
    1412             return BigInteger(n).isOdd() ? this : this.negate();
    1413         }
    1414     }
    1415 
    1416     n = BigInteger(n);
    1417     if (n._s === 0) {
    1418         return ONE;
    1419     }
    1420     else if (n._s < 0) {
    1421         if (this._s === 0) {
    1422             throw new Error("Divide by zero");
    1423         }
    1424         else {
    1425             return ZERO;
    1426         }
    1427     }
    1428     if (this._s === 0) {
    1429         return ZERO;
    1430     }
    1431     if (n.isUnit()) {
    1432         return this;
    1433     }
    1434 
    1435     if (n.compareAbs(MAX_EXP) > 0) {
    1436         throw new Error("exponent too large in BigInteger.pow");
    1437     }
    1438     var x = this;
    1439     var aux = ONE;
    1440     var two = BigInteger.small[2];
    1441 
    1442     while (n.isPositive()) {
    1443         if (n.isOdd()) {
    1444             aux = aux.multiply(x);
    1445             if (n.isUnit()) {
    1446                 return aux;
    1447             }
    1448         }
    1449         x = x.square();
    1450         n = n.quotient(two);
    1451     }
    1452 
    1453     return aux;
    1454 };
    1455 
    1456 /*
    1457     Function: modPow
    1458     Raise a <BigInteger> to a power (mod m).
    1459 
    1460     Because it is reduced by a modulus, <modPow> is not limited by
    1461     <BigInteger.MAX_EXP> like <pow>.
    1462 
    1463     Parameters:
    1464 
    1465         exponent - The exponent to raise *this* by. Must be positive.
    1466         modulus - The modulus.
    1467 
    1468     Returns:
    1469 
    1470         *this* ^ *exponent* (mod *modulus*).
    1471 
    1472     See Also:
    1473 
    1474         <pow>, <mod>
    1475 */
    1476 BigInteger.prototype.modPow = function(exponent, modulus) {
    1477     var result = ONE;
    1478     var base = this;
    1479 
    1480     while (exponent.isPositive()) {
    1481         if (exponent.isOdd()) {
    1482             result = result.multiply(base).remainder(modulus);
    1483         }
    1484 
    1485         exponent = exponent.quotient(BigInteger.small[2]);
    1486         if (exponent.isPositive()) {
    1487             base = base.square().remainder(modulus);
    1488         }
    1489     }
    1490 
    1491     return result;
    1492 };
    1493 
    1494 /*
    1495     Function: log
    1496     Get the natural logarithm of a <BigInteger> as a native JavaScript number.
    1497 
    1498     This is equivalent to
    1499 
    1500     > Math.log(this.toJSValue())
    1501 
    1502     but handles values outside of the native number range.
    1503 
    1504     Returns:
    1505 
    1506         log( *this* )
    1507 
    1508     See Also:
    1509 
    1510         <toJSValue>
    1511 */
    1512 BigInteger.prototype.log = function() {
    1513     switch (this._s) {
    1514     case 0:     return -Infinity;
    1515     case -1: return NaN;
    1516     default: // Fall through.
    1517     }
    1518 
    1519     var l = this._d.length;
    1520 
    1521     if (l*BigInteger_base_log10 < 30) {
    1522         return Math.log(this.valueOf());
    1523     }
    1524 
    1525     var N = Math.ceil(30/BigInteger_base_log10);
    1526     var firstNdigits = this._d.slice(l - N);
    1527     return Math.log((new BigInteger(firstNdigits, 1, CONSTRUCT)).valueOf()) + (l - N) * Math.log(BigInteger_base);
    1528 };
    1529 
    1530 /*
    1531     Function: valueOf
    1532     Convert a <BigInteger> to a native JavaScript integer.
    1533 
    1534     This is called automatically by JavaScipt to convert a <BigInteger> to a
    1535     native value.
    1536 
    1537     Returns:
    1538 
    1539         > parseInt(this.toString(), 10)
    1540 
    1541     See Also:
    1542 
    1543         <toString>, <toJSValue>
    1544 */
    1545 BigInteger.prototype.valueOf = function() {
    1546     return parseInt(this.toString(), 10);
    1547 };
    1548 
    1549 /*
    1550     Function: toJSValue
    1551     Convert a <BigInteger> to a native JavaScript integer.
    1552 
    1553     This is the same as valueOf, but more explicitly named.
    1554 
    1555     Returns:
    1556 
    1557         > parseInt(this.toString(), 10)
    1558 
    1559     See Also:
    1560 
    1561         <toString>, <valueOf>
    1562 */
    1563 BigInteger.prototype.toJSValue = function() {
    1564     return parseInt(this.toString(), 10);
    1565 };
    1566 
    1567 var MAX_EXP = BigInteger(0x7FFFFFFF);
    1568 // Constant: MAX_EXP
    1569 // The largest exponent allowed in <pow> and <exp10> (0x7FFFFFFF or 2147483647).
    1570 BigInteger.MAX_EXP = MAX_EXP;
    1571 
    1572 (function() {
    1573     function makeUnary(fn) {
    1574         return function(a) {
    1575             return fn.call(BigInteger(a));
    1576         };
    1577     }
    1578 
    1579     function makeBinary(fn) {
    1580         return function(a, b) {
    1581             return fn.call(BigInteger(a), BigInteger(b));
    1582         };
    1583     }
    1584 
    1585     function makeTrinary(fn) {
    1586         return function(a, b, c) {
    1587             return fn.call(BigInteger(a), BigInteger(b), BigInteger(c));
    1588         };
    1589     }
    1590 
    1591     (function() {
    1592         var i, fn;
    1593         var unary = "toJSValue,isEven,isOdd,sign,isZero,isNegative,abs,isUnit,square,negate,isPositive,toString,next,prev,log".split(",");
    1594         var binary = "compare,remainder,divRem,subtract,add,quotient,divide,multiply,pow,compareAbs".split(",");
    1595         var trinary = ["modPow"];
    1596 
    1597         for (i = 0; i < unary.length; i++) {
    1598             fn = unary[i];
    1599             BigInteger[fn] = makeUnary(BigInteger.prototype[fn]);
    1600         }
    1601 
    1602         for (i = 0; i < binary.length; i++) {
    1603             fn = binary[i];
    1604             BigInteger[fn] = makeBinary(BigInteger.prototype[fn]);
    1605         }
    1606 
    1607         for (i = 0; i < trinary.length; i++) {
    1608             fn = trinary[i];
    1609             BigInteger[fn] = makeTrinary(BigInteger.prototype[fn]);
    1610         }
    1611 
    1612         BigInteger.exp10 = function(x, n) {
    1613             return BigInteger(x).exp10(n);
    1614         };
    1615     })();
    1616 })();
    1617 
    1618 exports.BigInteger = BigInteger;
    1619 })(typeof exports !== 'undefined' ? exports : this);
  • 相关阅读:
    进程相关知识点
    vue上传
    Storageclass 外挂NFS配置与应用
    centos强制关机后,网卡无法启动
    前端工程化2-webpack使用与学习
    android应用获取应用签名
    js获取tif格式图片的dpi
    查询生成二级树型结构最高效的方式
    03解决隔离的方案
    02SingleSpa实战
  • 原文地址:https://www.cnblogs.com/liuqingsha3/p/3830454.html
Copyright © 2020-2023  润新知