模数运算%中的大数-无穷错误-Javascript

7

在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;
}

2
你正在寻找模幂运算,这与JavaScript无关。 - Bergi
1
@Lưu Vĩnh Phúc 为什么这是重复的?它被标记为javascript。 - user6937251
因为该算法与语言无关,它是纯数学。 - Bergi
4个回答

9
如果您能假设所有参数都是整数,那么就有一个数学“技巧”可用。考虑以下模运算:
(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));


3
@communitywiki - 数学通常是... ;-) - Amit

3
JavaScript数字以64位浮点数的形式存储。 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

{{链接1:JSFiddle}}


1
你可能需要查阅类似于big.js的大数库来完成此操作。它有自己的mod()函数来处理更大的数字和更高的浮点精度。
从手册中可以看到:
1 % 0.9                    // 0.09999999999999998
x = new Big(1)
x.mod(0.9)                 // '0.1'

1
请尝试这个,它应该对您有效...
 <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的值为(144157446840451635235083706110907852415749228859252529148906391999766994677256648514596635518338118874745245599504027645569205474259056773767697690363704468632892152795016715055324575445087682781252313005869045568884109150825799944546337893064300709178398146710515468212610079448225972249066488499049225372747076806433631659786194988344294497773759564575000162869574365014937829611100108282508068839769488427218809418476143641444334160948843097387146975458980549194883596975058014553601039150039974922599124812752683319818785474747861041069869797998022819369652619759825244859686407688179575508679861543683676353692931928781365284923967762962761189903683793268647203089135578161089792845634056425105473120490657724974694040110140134504449715061852058159494813855440466218772852172975097582562908895057311050472869260715192269051794091102837753073541384982827121618414372575452344004360364276677087398549812260325448141226947881328515773351976616276417638128022815680053293310617319251468387901625157...56951333749257599033126883342183151178668919812064049965349560466150682525651094508048667165975539000764644172767648163518366194953573817885103167718630743142062623550549541359220427411352708364483389060986844929269143259135008252906461288098421933603373774514126347477000279431329468363160423511545129487503178839098880369937328996412126931687097210220191726087729442555830870326323512951767388505151559227624666317971526350895004302090730198002124799887057180493028281166853990182770936726392403645367304961828645095221020100469965292184204520213166368848723223621651107654075062116217744242552262031457878341343131239324794711518591327361143916482110866686618572491075943511233044928342441933757654662089762470943194596874717623496819342403306038522266428198018364568515908102686200233757394776127456240030822204960242512397946554388855232832783930954979762030089547004776120626513910030444279665047610388454114197939348310563226006027400434616239674784018828580353008938225035036985223336494743),请看下面的输出屏幕。

enter image description here

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

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接