2013-02-26 11 views
6
*Test> ((3^40) `mod` 3) :: Int 
2 
*Test> ((3^40) `mod` 3) 
0 

Warum ist das so? Ich benutze GHCi 7.0.3. Wenn dies kein Fehler ist, wird eine Erklärung, wie Integral/Int in haskell funktioniert, geschätzt, oder ein Link zu einer Erklärung.Kann mir jemand dieses ingere modulare Verhalten in Haskell erklären?

Danke.

+1

Die erste ist ein Integer-Überlauf, das zweite Ergebnis ist wie erwartet, da 'Integer' verwendet wird, ein Integer-Typ mit beliebiger Genauigkeit. –

Antwort

13

Sie einfach außer Reichweite sind, 3^40 ist zu groß für eine Zahl sogar passen in ein 64-Bit-int:

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

Der Integer Typ auf der anderen Seite ist unbegrenzt und akzeptiert alle Zahlen nicht egal wie groß. In Ihrem zweiten Fall (wo Sie ein 0 Ergebnis erhalten haben) haben Sie einen Typ Integer abgeleitet.

+0

Standardregeln schlagen wieder zu! – MathematicalOrchid

2

Wenn Sie Potenzierung nur im Rahmen der modularen Arithmetik über die Verwendung, einen Blick auf die powerMod Funktion im arithmoi Paket haben:

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

import Math.NumberTheory.Powers (powerMod) 

test = powerMod 3 40 3 

powerMod reduziert das Ergebnis, während die Potenzierung der Berechnung der sollte zu weniger Arbeit führen.

Verwandte Themen