【问题标题】:Modulo % with big number- Infinity error - Javascript [duplicate]模数百分比大 - 无穷大错误 - Javascript [重复]
【发布时间】:2017-02-25 18:45:31
【问题描述】:

在 Javascript 中获得大数的模有什么技巧。 modulo(7, 16971, 25777) 7^16971mod25777=NaN

function modulo (n, p, m){
var x = Math.pow(n, p);
var y = m;
var z = x%y;
alert(x);
return z;
}

【问题讨论】:

  • 您正在寻找 modular exponentiation,它并非特定于 JavaScript。
  • @Lưu Vĩnh Phúc 为什么这个重复?它被标记为 javascript
  • 因为算法与语言无关,它是纯数学。

标签: javascript math modulo pow infinity


【解决方案1】:

如果您可以假设所有参数都是整数,那么您可以使用一个数学“技巧”。

考虑以下模运算:

(a*x + y) % x

显然,a*x 部分可以被丢弃,以下内容成立:

(a*x + y) % x = y % x

考虑到这一点,我们可以假设大数只是 a*x + y,我们可以在任何阶段执行模数,并且可以根据需要执行模数,因此,得到你想要的结果,这样做:

function modulo (n, p, m){
  var result = 1;
  while(p--) {
    result = (result * n) % m;
  }
  
  return result;
}

console.log(modulo(7, 16971, 25777));

【讨论】:

  • @communitywiki - 数学通常是... ;-)
【解决方案2】:

JavaScript 编号存储为 64-bit floats

Math.pow(7, 16971)Infinity,因为该值对于该表示来说太大了。具体来说,它大于Number.MAX_VALUE,即1.7976931348623157e+308

最大的安全整数是Math.pow(2, 53) - 1),又名Number.MAX_SAFE_INTEGER

您可以使用任意大小的整数库,例如 big-integer 来处理更大的整数:

const result = bigInt(7).modPow(16971, 25777);
console.log(result.value); // 857

JSFiddle

【讨论】:

    【解决方案3】:

    您可能需要查看诸如big.js 之类的大量库来执行此操作。它有自己的mod() 函数来处理更大的数字和更高的浮点精度。

    来自手册:

    1 % 0.9                    // 0.09999999999999998
    x = new Big(1)
    x.mod(0.9)                 // '0.1'
    

    【讨论】:

      【解决方案4】:

      请试试这个,它应该适合你...

       <script src="http://peterolson.github.com/BigInteger.js/BigInteger.min.js"></script>
      <script>
          function modulo(n, p, m) {
              var x = bigInt(n).pow(p);
              var y = m;
              var z = bigInt(x).mod(y);
              alert(x);
              alert(z);
              return z;
          }
          modulo(7, 16971, 25777);
      
      </script>
      

      X的值=(14415744684045163523508370611090785241574922885925252914890639199976699467725664851459663551833811887474524559950402764556920547425905677376769769036370446863289215279501671505532457544508768278125231300586904556888410915082579994454633789306430070917839814671051546821261007944822597224906648849904922537274707680643363165978619498834429449777375956457500016286957436501493782961110010828250806883976948842721880941847614364144433416094884309738714697545898054919488359697505801455360103915003997492259912481275268331981878547474786104106986979799802281936965261975982524485968640768817957550867986154368367635369293192878136528492396776296276118990368379326864720308913557816108979284563405642510547312049065772497469404011014013450444971506185205815949481385544046621877285217297509758256290889505731105047286926071519226905179409110283775307354138498282712161841437257545234400436036427667708739854981226032544814122694788132851577335197661627641763812802281568005329331061731925 1468387901625157 ... 569513337492575990331268833421831511786689198120640499653495604661506825256510945080486671659755390007646441727676481635183661949535738178851031677186307431420626235505495413592204274113527083644833890609868449292691432591350082529064612880984219336033737745141263474770002794313294683631604235115451294875031788390988803699373289964121269316870972102201917260877294425558308703263235129517673885051515592276246663179715263508950043020907301980021247998870571804930282811668539901827709367263924036453673049618286450952210201004699652921842045202131663688487232236216511076540750621162177442425522620314578783413431312393247947115185913273611439164821108666866185724910759435112330449283424419337576546620897624709431945968747176234968193424033060385222664281980183645685159081026862002337573947761274562400308222049602425123979465543888552328327839309549797620300895470047761206265139100304442796650476103884541141979393483105632260060274004346162396747840188285803530089382250350 36985223336494743),请看下面的输出屏幕。

      Z 的值=(857)。请看下面的输出屏幕。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-12
        • 2019-03-19
        • 1970-01-01
        • 1970-01-01
        • 2021-08-23
        • 1970-01-01
        • 2016-11-12
        • 1970-01-01
        相关资源
        最近更新 更多