You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何JavaScript中(97**13)%77与(104**13)%77结果相同,而Python中结果不同?

为什么JavaScript和Python中(10413)%77与(9713)%77结果不同?

嘿,这个问题挺典型的——核心原因在于JavaScript和Python处理大整数的方式完全不同,导致模运算结果出现偏差。我来一步步拆解:

首先,先明确数学上的正确结果

我们可以用模运算的性质简化计算,先把底数对77取模:

  • 104 ÷ 77 = 1余27,所以 104 ≡ 27 mod 77,因此 104^13 ≡ 27^13 mod 77
  • 97 ÷77=1余20,所以 97 ≡20 mod77,因此 97^13≡20^13 mod77

接下来用中国剩余定理计算这两个值(因为77=7×11,且7和11互质):

计算27^13 mod77

  • 27 mod7=6,根据费马小定理,6^6≡1 mod7,所以613=6(6×2+1)= (66)2 ×6 ≡1^2×6=6 mod7
  • 27 mod11=5,5^10≡1 mod11,所以513=5(10+3)=510×53≡1×125≡125-11×11=4 mod11
  • 找满足x≡6 mod7且x≡4 mod11的数,解得x=48(验证:48÷7=6余6,48÷11=4余4)

计算20^13 mod77

  • 20 mod7=6,同样6^13≡6 mod7
  • 20 mod11=9,9^10≡1 mod11,913=9(10+3)=910×93≡1×729≡729-11×66=729-726=3 mod11
  • 找满足x≡6 mod7且x≡3 mod11的数,解得x=69(验证:69÷7=9余6,69÷11=6余3)

所以数学上的正确结果是(104**13)%77=48,(97**13)%77=69——和Python的输出一致。

为什么JavaScript会给出错误的相等结果?

JavaScript的Number类型是64位双精度浮点数,它只能精确表示范围在-2^53到2^53之间的整数(大约±9×10^15)。而104^13的结果是1.667×10^26,97^13是4.74×10^25,都远远超出了这个精确范围。

当JavaScript计算104**13时,它无法精确存储这个超大整数,会自动转换成一个近似的浮点数,丢失了末尾的有效数字。同样97**13也会被近似成另一个浮点数。这两个近似后的浮点数在取模77时,巧合地得到了相同的结果,但这和真实的整数运算结果完全不符。

如何在JavaScript中得到正确结果?

用JavaScript的BigInt类型来处理超大整数运算,它支持任意精度的整数计算:

console.log( (104n ** 13n) % 77n ); // 输出 48n
console.log( (97n ** 13n) % 77n );  // 输出 69n

这样就能得到和Python一致的正确结果了。

内容的提问来源于stack exchange,提问作者Moritttzzzz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 10:27:35