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

时间:2016-04-27 20:32:59

标签: 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

现在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.

为什么会这样?我现在还不确定哪种变体是正确的。但是,在较小的数字上,函数会得到相同的结果。

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

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

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

1 个答案:

答案 0 :(得分: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;
}