为何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
相关产品推荐
相关产品推荐

