2016-10-16 2 views
6

Y a-t-il un truc pour obtenir le modulo des grands nombres en Javascript. Je reçois l'infini avec modulo(7, 16971, 25777)7^16971mod25777 = NaNModulo% avec grand nombre- Erreur infini - Javascript

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

Vous êtes à la recherche [* exponentiation modulaire *] (https://en.wikipedia.org/wiki/Modular_exponentiation), et ce n'est pas spécifique à JavaScript. – Bergi

+1

@ Lưu Vĩnh Phúc Pourquoi ce doublon? il est marqué javascript –

+0

parce que l'algorithme est agnostique, c'est un calcul pur. – Bergi

Répondre

9

Il y a un « truc » mathématique que vous pouvez utiliser, si vous pouvez supposer tous les paramètres sont entiers.

Tenir compte de l'opération modulo suivante:

(a * x + y)% x

De toute évidence, le a * x partie peut être mis au rebut et suivantes est remplie:

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

Dans cet esprit, on peut supposer le grand nombre est juste a * x + y, et nous pouvons effectuer le modulo à tout moment, et aussi souvent que nous aimons, donc, pour obtenir le résultat que vous veulent, faites ceci:

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

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

+3

@communitywiki - les maths sont habituellement ... ;-) – Amit

1

Vous aurez probablement envie de regarder dans une grande bibliothèque de numéro tel que big.js pour le faire. Il a sa propre fonction mod() pour gérer des nombres plus grands et une plus grande précision en virgule flottante.

A partir du manuel:

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

JavaScript numéros sont stockés sous forme 64-bit floats.

Math.pow(7, 16971) est Infinity car la valeur est trop grande pour cette représentation. Plus précisément, il est plus grand que Number.MAX_VALUE, ce qui correspond à 1.7976931348623157e+308.

Le plus grand entier sécurisé est Math.pow(2, 53) - 1), également connu sous le nom de Number.MAX_SAFE_INTEGER.

Vous pouvez utiliser une bibliothèque entière de taille arbitraire comme big-integer à travailler avec des nombres plus importants:

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

JSFiddle

0

S'il vous plaît essayer, il devrait fonctionner pour vous ...

<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> 

Valeur de X = (144157446840451635235083706110907852415749228859252529148906391999766994677256648514596635518338118874745245599504027645569205474259056773767697690363704468632892152795016715055324575445087682781252313005869045568884109150825799944546337893064300709178398146710515468212610079448225972249066488499049225372747076806433631659786194988344294497773759564575000162869574365014937829611100108282508068839769488427218809418476143641444334160948843097387146975458980549194883596975058014553601039150039974922599124812752683319818785474747861041069869797998022819369652619759825244859686407688179575508679861543683676353692931928781365284923967762962761189903 683793268647203089135578161089792845634056425105473120490657724974694040110140134504449715061852058159494813855440466218772852172975097582562908895057311050472869260715192269051794091102837753073541384982827121618414372575452344004360364276677087398549812260325448141226947881328515773351976616276417638128022815680053293310617319251468387901625157 ... 5695133374925759903312688334218315117866891981206404996534956046615068252565109450804866716597553900076464417276764816351836619495357381788510316771863074314206262355054954135922042741135270836448338906098684492926914325913500825290646128809842193360337377451412634747700027943132946836316042351154512948750317883909888036993732899641212693168709721022019172608772944255583087032632351295176738850515155922762466631797152635089500430209073019800212479988705718049302828116685399018277093672639240364536730496182864509522102010046996529218420452021316636884872322362165110765407506211621774424255226203145787834134313123932479471151859132736114391648 2110866686618572491075943511233044928342441933757654662089762470943194596874717623496819342403306038522266428198018364568515908102686200233757394776127456240030822204960242512397946554388855232832783930954979762030089547004776120626513910030444279665047610388454114197939348310563226006027400434616239674784018828580353008938225035036985223336494743), s'il vous plaît jeter un oeil à l'écran de sortie ci-dessous.

enter image description here

valeur de z = (857). s'il vous plaît jeter un oeil à l'écran de sortie ci-dessous.

enter image description here