2016-04-27 39 views
1

我需要在python3和javascript上對相當大的數字執行模冪運算。我有完成這項任務的功能,但他們給了我不同的輸出。爲什麼模塊化指數函數在Python和Javascript中以大數字的方式工作不同?

的Python(全部以同樣的方式三個工作):

pow(176672119508, 55, 200000023499) 

def expmod_iter(a,b,c): 
    x = 1 
    while(b>0): 
     if(b&1==1): x = (x*a)%c 
     a=(a*a)%c 
     b >>= 1 
    return x%c 

def pow_mod(x, y, z): 
    number = 1 
    while y: 
     if y & 1: 
      number = number * x % z 
     y >>= 1 
     x = x * x % z 
    return number 

# The result is always 124912252967 

現在的JavaScript(這兩種功能以相同的方式工作):

function powMod(x, y, z) { 
    let number = 1; 
    while (y) { 
     if (y & 1) { 
      number = number * x % z; 
     } 
     y >>= 1; 
     x = x * x % z; 
    } 
    return number; 
} 

function expmod_iter(a, b, c) { 
    let x = 1; 

    while (b > 0) { 
    if (b & 1 === 1) { 
     x = (x * a) % c; 
    } 
    a = (a * a) % c; 
    b >>= 1 
    } 
    return x % c; 
} 

console.log(powMod(176672119508, 55, 200000023499)); 
console.log(expmod_iter(176672119508, 55, 200000023499)); 

// The result is always 138693107570 

而且,當我用this service有我的號碼,我也得到了138693107570.


爲什麼會出現這種情況?我甚至不確定現在哪種變體是正確的。但是,對於較小的數字,這些功能會給出相同的結果

是否有可能以某種方式從函數中獲得相同的結果?即使結果在數學上是正確的,結果也應該至少是相同的。

你能解釋爲什麼會發生這種情況嗎?它是功能設計嗎?對我來說,兩種語言的功能似乎都是一樣的。

有沒有辦法從兩種語言的函數中獲得相同的結果?

回答

6

Python的結果是正確的。

Python使用任意精度的整數表示形式,而Javascript將所有數字存儲爲IEEE754 64位浮點數(並暫時將它們強制爲32位整數進行按位操作)。這意味着對於大整數,Javascript代碼開始失去精度,而Python代碼在整個計算過程中保留所有結果的確切值。

如果您想用Javascript準確處理大整數,您將需要使用an appropriate library。或者,你說你不關心結果是否正確。這是一個非常奇怪的事情不關心,但如果你真的有這種感覺:

# Python 
def wrongpow(a, b, c): 
    return 0 

// Javascript 
function wrongpow(a, b, c) { 
    return 0; 
} 
+0

謝謝澄清!有沒有辦法獲得相同的模數求冪的結果? –

+1

@DenisYakovenko:要做到這一點,你會想要一個提供任意精度整數的Javascript庫。或者,你說你不關心結果是否正確。這是一件很不奇怪的事情,我不確定我有多相信你,但是在這種情況下,你可以只爲兩種語言返回0。 – user2357112

+0

我的意思是我覺得我可以與javascript的結果或Python的結果一致,但是它們必須在兩側都是相同的(在這種情況下,是138693107570或124912252967)。 –

相關問題