6
*Test> ((3^40) `mod` 3) :: Int
2
*Test> ((3^40) `mod` 3)
0

为什么会这样?我正在使用 GHCi 7.0.3。如果这不是错误,请解释 Integral/Int 如何在 haskell 中工作,或提供解释链接。

谢谢。

4

2 回答 2

13

您只是超出范围,3^40数字太大,甚至无法放入 64 位 int:

Prelude> 3^40 :: Int
-6289078614652622815
Prelude> 3^40 :: Integer
12157665459056928801

另一方面,该Integer类型是无界的,并且接受所有数字,无论大小。在你的第二种情况下(你得到一个0结果)你得到了一个类型的Integer推断。

于 2013-02-26T20:24:37.407 回答
2

如果您仅在模运算的上下文中使用求幂,请查看包中的powerMod函数arithmoi

http://hackage.haskell.org/package/arithmoi

import Math.NumberTheory.Powers (powerMod)

test = powerMod 3 40 3

powerMod在计算幂运算时会减少结果,这应该会减少工作量。

于 2013-02-26T23:27:05.520 回答