*Test> ((3^40) `mod` 3) :: Int
2
*Test> ((3^40) `mod` 3)
0
なんでそうなの?GHCi7.0.3を使用しています。これがバグでない場合は、Integral/Intがhaskellでどのように機能するかについての説明または説明へのリンクをいただければ幸いです。
ありがとう。
*Test> ((3^40) `mod` 3) :: Int
2
*Test> ((3^40) `mod` 3)
0
なんでそうなの?GHCi7.0.3を使用しています。これがバグでない場合は、Integral/Intがhaskellでどのように機能するかについての説明または説明へのリンクをいただければ幸いです。
ありがとう。
あなたは単に範囲外であり3^40
、64ビットintに収まるには大きすぎます:
Prelude> 3^40 :: Int
-6289078614652622815
Prelude> 3^40 :: Integer
12157665459056928801
一方Integer
、型は無制限で、どんなに大きくてもすべての数値を受け入れます。2 番目のケース (0
結果が得られた場合) では、型がInteger
推論されました。
剰余算術のコンテキストでのみ累乗を使用する場合は、パッケージpowerMod
内の関数を見てください。arithmoi
http://hackage.haskell.org/package/arithmoi
import Math.NumberTheory.Powers (powerMod)
test = powerMod 3 40 3
powerMod
累乗を計算している間に結果を減らします。これにより、実行される作業が少なくなります。