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

Tại sao lại như vậy? Tôi đang sử dụng GHCi 7.0.3. Nếu đây không phải là một lỗi, một giải thích về cách Integral/Int hoạt động trong haskell được đánh giá cao, hoặc một liên kết đến một giải thích.Ai đó có thể giải thích hành vi mô đun Integer này cho tôi trong Haskell?

Cảm ơn.

+1

Đầu tiên là tràn số nguyên, kết quả thứ hai là như mong đợi vì 'Integer' được sử dụng, một loại số nguyên chính xác tùy ý. –

Trả lời

13

Bạn chỉ đơn giản là ra khỏi phạm vi, 3^40 là quá lớn của một số thậm chí còn phù hợp trong một 64-bit int:

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

Loại Integer mặt khác là vô biên và chấp nhận tất cả các số không vấn đề lớn như thế nào. Trong trường hợp thứ hai của bạn (nơi bạn nhận được kết quả là 0), bạn đã nhận được loại Integer phỏng đoán.

+0

Quy tắc mặc định tấn công một lần nữa! – MathematicalOrchid

2

Nếu bạn về việc sử dụng lũy ​​thừa chỉ trong bối cảnh số học modula, có một cái nhìn tại powerMod chức năng trong gói arithmoi:

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

import Math.NumberTheory.Powers (powerMod) 

test = powerMod 3 40 3 

powerMod làm giảm kết quả khi tính toán lũy thừa mà nên làm ít công việc hơn.

Các vấn đề liên quan