Search code examples
javascriptmathintegerpow

How can I get integer in Math.pow(10, 10000000)


I always get infinity from:

let power = Math.pow(2, 10000000);
console.log(power); //Infinity

So, can I get integer from this? Maybe I don't understand this task https://www.codewars.com/kata/5511b2f550906349a70004e1/train/javascript? Who knows, show me how to decide that?


Solution

  • The link that you give asks for the last digit of the number. In order to find such a thing, it would be insane to compute an extremely large number (which might exceed the storage capacity of the known universe to write down (*)) just to find the final digit. Work mod 10.

    Two observations:

    1) n^e % 10 === d^e % 10 // d = last digit of n
    2) If e = 10q+r then n^e % 10 === (n^10)^q * n^d %10
    

    This allows us to write:

    const lastDigit = function(str1, str2){
      //in the following helper function d is an integer and exp a string
      const lastDigitHelper = function(d,exp){
        if(exp.length === 1){
          let e = parseInt(exp);
          return Math.pow(d,e) % 10;
        } else {
          let r = parseInt(exp.slice(-1));
          let q = exp.slice(0,-1);
          return lastDigitHelper(Math.pow(d,10) % 10,q) * Math.pow(d,r) % 10;
        }
      }
    
      let d = parseInt(str1.slice(-1));
      return lastDigitHelper(d,str2);
    }
    

    This passes all of the tests, but isn't as efficient as it could be. The recursive helper function could be replaced by a loop.

    (*) For fun: one of the test cases was to compute the last digit of

    1606938044258990275541962092341162602522202993782792835301376 ^ 2037035976334486086268445688409378161051468393665936250636140449354381299763336706183397376
    

    If written in base 2, this number would be approximately 4.07 x 10^92 bits long. Since there are fewer than that many atoms in the universe, the number is much too large to store, not to mention too time consuming to compute.