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

なんでそうなの?GHCi7.0.3を使用しています。これがバグでない場合は、Integral/Intがhaskellでどのように機能するかについての説明または説明へのリンクをいただければ幸いです。

ありがとう。

4

2 に答える 2

13

あなたは単に範囲外であり3^40、64ビットintに収まるには大きすぎます:

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

一方Integer、型は無制限で、どんなに大きくてもすべての数値を受け入れます。2 番目のケース (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 に答える