2016-10-16 18 views
6

Есть ли трюк, чтобы получить по модулю большие числа в Javascript. Я получаю бесконечность с modulo(7, 16971, 25777)7^16971mod25777 = NaNModulo% с большим числом - ошибка Infinity - 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ưu Vĩnh Phúc Почему этот дубликат? он помечен javascript –

+0

, потому что алгоритм является агностиком языка, это чистая математика. – Bergi

ответ

9

Там в математическом «трюк» вы можете использовать, если вы можете предположить, что все параметры целые числа.

Рассмотрим следующую операцию по модулю:

(а * х + у)% х

Очевидно, что а * х часть может быть отброшен, и имеет место следующее:

(а * х + у)% х = у й%

Имея это в виду, мы можем предположить, большое число только а * х + у, и мы можем выполнять по модулю на любом этапе, и так часто, как нам нравится, так, чтобы получить результат, который вы хотите, сделайте следующее:

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

Вы, вероятно, хотите посмотреть на большое количество библиотеки, такие как big.js сделать это. Он имеет свою собственную функцию mod() для обработки больших чисел и большей точности с плавающей запятой.

Из инструкции:

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

номера JavaScript сохраняются как 64-bit floats.

Math.pow(7, 16971) is Infinity потому что значение слишком велико для этого представления. В частности, он больше Number.MAX_VALUE, что составляет 1.7976931348623157e+308.

Наибольшее безопасное целое число - Math.pow(2, 53) - 1), aka 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