2016-10-16 6 views
6

Javascriptで大きな数値のモジュロを得るためのトリックがありますか?私はあなたがおそらくこれを行うには、多数のライブラリーのようなbig.jsに見たいと思うでしょうmodulo(7, 16971, 25777)7^16971mod25777 = NaNに数値が大きいモジュロ% - 無限大エラー - Javascript

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

あなたは[*べき乗剰余*](https://en.wikipedia.org/wiki/Modular_exponentiation)を探している、それがJavaScriptに固有のものではないのです。 – Bergi

+1

@LưuVĩnhPhúcなぜこの複製はありますか?アルゴリズムは言語に依存しないため、javascript –

+0

とタグ付けされています。純粋な数学です。 – Bergi

答えて

9

数学「トリック」あなたはすべてのパラメータがをしていると仮定できる場合は、使用することができますがあります整数

は、次のモジュロ演算検討:

(* X + Y)%明らかX

* X部分を廃棄することができるが、次が成り立ちます。

(* X + Y)%X = Yの%X私たちは、大きな数をとることができることを念頭に置いて

だけ * 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

1

と無限を取得しています。これは、より大きな数とより大きな浮動小数点精度を処理する独自の​​関数を持っています。マニュアルから

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

JavaScriptの番号が64-bit floatsとして保存されます。

Math.pow(7, 16971)はです。値がその表現には大きすぎるためです。具体的には、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

0

これを試してみてください、それはあなたのために働く必要があります...

<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の値=(144157446840451635235083706110907852415749228859252529148906391999766994677256648514596635518338118874745245599504027645569205474259056773767697690363704468632892152795016715055324575445087682781252313005869045568884109150825799944546337893064300709178398146710515468212610079448225972249066488499049225372747076806433631659786194988344294497773759564575000162869574365014937829611100108282508068839769488427218809418476143641444334160948843097387146975458980549194883596975058014553601039150039974922599124812752683319818785474747861041069869797998022819369652619759825244859686407688179575508679861543683676353692931928781365284923967762962761189903 683793268647203089135578161089792845634056425105473120490657724974694040110140134504449715061852058159494813855440466218772852172975097582562908895057311050472869260715192269051794091102837753073541384982827121618414372575452344004360364276677087398549812260325448141226947881328515773351976616276417638128022815680053293310617319251468387901625157 ... 5695133374925759903312688334218315117866891981206404996534956046615068252565109450804866716597553900076464417276764816351836619495357381788510316771863074314206262355054954135922042741135270836448338906098684492926914325913500825290646128809842193360337377451412634747700027943132946836316042351154512948750317883909888036993732899641212693168709721022019172608772944255583087032632351295176738850515155922762466631797152635089500430209073019800212479988705718049302828116685399018277093672639240364536730496182864509522102010046996529218420452021316636884872322362165110765407506211621774424255226203145787834134313123932479471151859132736114391648 2110866686618572491075943511233044928342441933757654662089762470943194596874717623496819342403306038522266428198018364568515908102686200233757394776127456240030822204960242512397946554388855232832783930954979762030089547004776120626513910030444279665047610388454114197939348310563226006027400434616239674784018828580353008938225035036985223336494743)、以下の出力画面をご覧ください。

enter image description here

Z =(857)の値。下記の出力画面をご覧ください。

enter image description here

関連する問題