2016-10-16 45 views
6

Javascript'te büyük sayılarda modulo almak için hile vardır. Ben Muhtemelen bunun için çok sayıda kütüphaneye gibi big.js içine bakmak isteyeceksiniz modulo(7, 16971, 25777)7^16971mod25777 = NaNBüyük sayı ile Modulo% - Sonsuzluk hatası - Javascript

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

[* Modüler üs alma *] (https://en.wikipedia.org/wiki/Modular_exponentiation) ve JavaScript özgü değil. – Bergi

+1

@ Lưu Vĩnh Phúc Neden bu yinelenen? javascript –

+0

etiketli, çünkü algoritma dil-agnostik, saf matematik. – Bergi

cevap

9

matematiksel "hile" Tüm parametreler olan varsayabiliriz eğer kullanabilirsiniz var tam sayı.

aşağıdaki modül işlemi göz önünde bulundurun:

(a * x + y)% Açıkçası x

, bir * x kısım atılır ve şu geçerlidir:

(a * x + y)% x = y% xBiz büyük sayıda varsayabiliriz göz önüne aldığımızda

sadece a * x + y ve biz sonuca almak için, herhangi bir aşamada modulo gerçekleştirmek ve sık olarak biz gibi, bu yüzden olabilir bunu yapmak istiyorum:

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

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

+3

@communitywiki - matematik genellikle ... ;-) – Amit

1

ile sonsuzluğu alıyorum. Daha büyük sayıları ve daha fazla kayan nokta hassasiyetini işlemek için kendi mod() işlevine sahiptir. kılavuzda itibaren

:

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

JavaScript numaraları 64-bit floats olarak depolanır. Infinity değeri olduğundan, bu gösterim için değer çok büyüktür. Spesifik olarak, 1.7976931348623157e+308 olan Number.MAX_VALUE'dan daha büyüktür.

En büyük güvenli tam sayı , Number.MAX_SAFE_INTEGER.

Daha büyük tamsayılar ile çalışmak big-integer gibi keyfi bir boyut tamsayı kütüphane kullanabilirsiniz:

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

JSFiddle

0

bu deneyin, sizin için çalışması gerekir ...X = bir

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

Değeri (144157446840451635235083706110907852415749228859252529148906391999766994677256648514596635518338118874745245599504027645569205474259056773767697690363704468632892152795016715055324575445087682781252313005869045568884109150825799944546337893064300709178398146710515468212610079448225972249066488499049225372747076806433631659786194988344294497773759564575000162869574365014937829611100108282508068839769488427218809418476143641444334160948843097387146975458980549194883596975058014553601039150039974922599124812752683319818785474747861041069869797998022819369652619759825244859686407688179575508679861543683676353692931928781365284923967762962761189903 683793268647203089135578161089792845634056425105473120490657724974694040110140134504449715061852058159494813855440466218772852172975097582562908895057311050472869260715192269051794091102837753073541384982827121618414372575452344004360364276677087398549812260325448141226947881328515773351976616276417638128022815680053293310617319251468387901625157 ... 5695133374925759903312688334218315117866891981206404996534956046615068252565109450804866716597553900076464417276764816351836619495357381788510316771863074314206262355054954135922042741135270836448338906098684492926914325913500825290646128809842193360337377451412634747700027943132946836316042351154512948750317883909888036993732899641212693168709721022019172608772944255583087032632351295176738850515155922762466631797152635089500430209073019800212479988705718049302828116685399018277093672639240364536730496182864509522102010046996529218420452021316636884872322362165110765407506211621774424255226203145787834134313123932479471151859132736114391648 2110866686618572491075943511233044928342441933757654662089762470943194596874717623496819342403306038522266428198018364568515908102686200233757394776127456240030822204960242512397946554388855232832783930954979762030089547004776120626513910030444279665047610388454114197939348310563226006027400434616239674784018828580353008938225035036985223336494743), aşağıda çıkış ekranına bir göz atın.

Z = (857) arasında

enter image description here

değer. lütfen aşağıdaki çıktı ekranına bir göz atın. Aradığın

enter image description here