以大數字進行模n的計算時,例如在執行mod (123456789^987654321) n
時會遇到巨大的執行懲罰。相反,您必須使用自己的^
,它也可以在內部計算mod n以用於中介計算。以n爲模的表達式計算
當然,我可以很容易地實現我自己的功能,但是接下來我必須明確地爲每個操作說出「mod n」。相反,可以構建一個數值表達式樹並推遲實際計算,並且在最後狀態模n只能進行一次。 (看我的代碼如下)
我開始這個清楚地表明我的意思,但我不知道是否已經存在這樣的實現,它似乎很有用,所以有人應該已經實現它。
module Modulo where
data Expr =
V Integer
| Plus Expr Expr
| Mult Expr Expr
deriving (Eq, Show)
instance Num Expr where
(+) = Plus
(*) = Mult
fromInteger = V
eval :: Integer -> Expr -> Integer
eval m (V i) = i `mod` m
eval m (Plus e1 e2) = (eval m e1 + eval m e2) `mod` m
eval m (Mult e1 e2) = (eval m e1 * eval m e2) `mod` m
fifteen :: Expr
fifteen = 10 + 5
test = eval 13 fifteen
您是否需要'mod m'中的'm'在運行時可以更改,還是足夠讓它在編譯時修復?如果編譯時足夠的話,你可以簡單地爲一些新類型的Integer定義一個modulo-arithemtic的'Num'-instance ... – hvr
我希望它在運行時可以改變。對不起,我應該提到它。 – Tarrasch