为什么Modular Exponentiation函数在Python和Javascript中对大数字的工作方式不同?

Den*_*nko 1 javascript python algorithm modulo exponentiation

我需要在python3和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
Run Code Online (Sandbox Code Playgroud)

现在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
Run Code Online (Sandbox Code Playgroud)

而且,当我使用这个服务和我的号码时,我也得到了138693107570.


为什么会这样?我现在还不确定哪种变体是正确的.但是,对于较小的数字,函数给出相同的结果.

有可能以某种方式从函数中获得相同的结果吗?结果在数学上是正确的甚至不重要,结果应该至少相同.

你能解释一下为什么会这样吗?它是功能设计吗?对我来说,两种语言的功能似乎都是相同的.

有没有办法从两种语言的功能中获得相同的结果?

use*_*ica 6

Python的结果是正确的.

Python使用任意精度的整数表示,而Javascript将所有数字存储为IEEE754 64位浮点(并暂时将它们强制为32位整数以进行按位运算).这意味着对于大整数,Javascript代码开始失去精度,而Python代码在整个计算过程中保持所有结果的确切值.

如果要在Javascript中完全处理大整数,则需要使用适当的库.或者,你说你不关心结果是否正确.不关心这是一个非常奇怪的事情,但如果你真的有这种感觉:

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

// Javascript
function wrongpow(a, b, c) {
    return 0;
}
Run Code Online (Sandbox Code Playgroud)