*Test> ((3^40) `mod` 3) :: Int
2
*Test> ((3^40) `mod` 3)
0
これはなぜですか?私はGHCi 7.0.3を使用しています。これがバグではない場合、Integr/Intがhaskellでどのように動作するかの説明、またはexplainationへのリンクです。誰かがHaskellでこのIntegerモジュラ動作を私に説明することはできますか?
ありがとうございました。
*Test> ((3^40) `mod` 3) :: Int
2
*Test> ((3^40) `mod` 3)
0
これはなぜですか?私はGHCi 7.0.3を使用しています。これがバグではない場合、Integr/Intがhaskellでどのように動作するかの説明、またはexplainationへのリンクです。誰かがHaskellでこのIntegerモジュラ動作を私に説明することはできますか?
ありがとうございました。
あなたが範囲外単純だ、3^40
も64ビットintに収まるように数の大きすぎる:
Prelude> 3^40 :: Int
-6289078614652622815
Prelude> 3^40 :: Integer
12157665459056928801
一方Integer
タイプが無制限であるとなしすべての数字を受け入れますどのくらい大きな問題。あなたの2番目のケース(0
の結果が得られた)では、タイプInteger
が推測されています。 、唯一のモジュラ算術のコンテキストで累乗を使用してのあなたはarithmoi
パッケージでpowerMod
機能を見ている場合
デフォルトルールが再び破られます! – MathematicalOrchid
は:累乗を計算しながら、
http://hackage.haskell.org/package/arithmoi
import Math.NumberTheory.Powers (powerMod)
test = powerMod 3 40 3
powerMod
は結果を減少させます作業が少なくて済みます。
最初は整数オーバーフローで、 'Integer'が使用され、任意の精度の整数型であるため、2番目の結果は期待通りです。 –