*Test> ((3^40) `mod` 3) :: Int
2
*Test> ((3^40) `mod` 3)
0
为什么会这样?我正在使用 GHCi 7.0.3。如果这不是错误,请解释 Integral/Int 如何在 haskell 中工作,或提供解释链接。
谢谢。
*Test> ((3^40) `mod` 3) :: Int
2
*Test> ((3^40) `mod` 3)
0
为什么会这样?我正在使用 GHCi 7.0.3。如果这不是错误,请解释 Integral/Int 如何在 haskell 中工作,或提供解释链接。
谢谢。
您只是超出范围,3^40
数字太大,甚至无法放入 64 位 int:
Prelude> 3^40 :: Int
-6289078614652622815
Prelude> 3^40 :: Integer
12157665459056928801
另一方面,该Integer
类型是无界的,并且接受所有数字,无论大小。在你的第二种情况下(你得到一个0
结果)你得到了一个类型的Integer
推断。
如果您仅在模运算的上下文中使用求幂,请查看包中的powerMod
函数arithmoi
:
http://hackage.haskell.org/package/arithmoi
import Math.NumberTheory.Powers (powerMod)
test = powerMod 3 40 3
powerMod
在计算幂运算时会减少结果,这应该会减少工作量。