2016-10-16 116 views
6

Czy istnieje trick, aby uzyskać modulo dużych liczb w JavaScript. Dostaję nieskończoność z modulo(7, 16971, 25777)7^16971mod25777 = NaNModulo% z dużą liczbą - Błąd nieskończoności - JavaScript

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

Szukacie [* modułowe potęgowanie *] (https://en.wikipedia.org/wiki/Modular_exponentiation), a to nie jest specyficzne dla JavaScriptu. – Bergi

+1

@ Lưu Vĩnh Phúc Dlaczego ten duplikat? jest oznaczony javascript –

+0

, ponieważ algorytm jest agnostyczny, jest to czysta matematyka. – Bergi

Odpowiedz

9

Jest matematyczny „trick” można użyć, jeśli można założyć, wszystkie parametry są liczby całkowite.

Rozważmy następującą operację modulo:

(a * x + y)% X

Oczywiście a * x część można odrzucić i zachodzi:

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

Mając to na uwadze, możemy przyjąć dużą liczbę właśnie a * x + y i możemy wykonać modulo na każdym etapie, a tak często, jak nam się podoba, tak, aby uzyskać wynik, który chcesz to zrobić:

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

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

+3

@communitywiki - matematyka zwykle jest ... ;-) – Amit

1

Prawdopodobnie będziesz chciał spojrzeć na dużą liczbę biblioteki takie jak big.js to zrobić. Posiada własną funkcję mod() do obsługi większych liczb i większej precyzji zmiennoprzecinkowej.

Z instrukcji:

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

numery JavaScript są przechowywane jako 64-bit floats.

Math.pow(7, 16971) to Infinity, ponieważ wartość jest za duża dla tej reprezentacji. W szczególności jest większy niż Number.MAX_VALUE, który jest 1.7976931348623157e+308.

Największa bezpieczna liczba całkowita to Math.pow(2, 53) - 1), czyli Number.MAX_SAFE_INTEGER.

Można użyć dowolnej wielkości całkowitej biblioteki jak big-integer pracować z większymi liczbami całkowitymi:

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

JSFiddle

0

spróbuj ten powinien pracować dla Ciebie ...

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

wartości X = (144157446840451635235083706110907852415749228859252529148906391999766994677256648514596635518338118874745245599504027645569205474259056773767697690363704468632892152795016715055324575445087682781252313005869045568884109150825799944546337893064300709178398146710515468212610079448225972249066488499049225372747076806433631659786194988344294497773759564575000162869574365014937829611100108282508068839769488427218809418476143641444334160948843097387146975458980549194883596975058014553601039150039974922599124812752683319818785474747861041069869797998022819369652619759825244859686407688179575508679861543683676353692931928781365284923967762962761189903 683793268647203089135578161089792845634056425105473120490657724974694040110140134504449715061852058159494813855440466218772852172975097582562908895057311050472869260715192269051794091102837753073541384982827121618414372575452344004360364276677087398549812260325448141226947881328515773351976616276417638128022815680053293310617319251468387901625157 ... 5695133374925759903312688334218315117866891981206404996534956046615068252565109450804866716597553900076464417276764816351836619495357381788510316771863074314206262355054954135922042741135270836448338906098684492926914325913500825290646128809842193360337377451412634747700027943132946836316042351154512948750317883909888036993732899641212693168709721022019172608772944255583087032632351295176738850515155922762466631797152635089500430209073019800212479988705718049302828116685399018277093672639240364536730496182864509522102010046996529218420452021316636884872322362165110765407506211621774424255226203145787834134313123932479471151859132736114391648 2110866686618572491075943511233044928342441933757654662089762470943194596874717623496819342403306038522266428198018364568515908102686200233757394776127456240030822204960242512397946554388855232832783930954979762030089547004776120626513910030444279665047610388454114197939348310563226006027400434616239674784018828580353008938225035036985223336494743), proszę spojrzeć na ekranie wyjściowym poniżej.

enter image description here

wartość Z = (857). proszę spojrzeć na ekran wyjściowy poniżej.

enter image description here