计算模数n

时间:2011-11-17 14:54:19

标签: haskell modulo

当以大数字模拟n进行计算时,在执行mod (123456789^987654321) n时会遇到巨大的性能惩罚。相反,您必须使用自己的^来内部计算mod 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

1 个答案:

答案 0 :(得分:3)

Oleg做过这样的事情,在那里你为模运算创建一个实例,但对于任意模数。 Implicit configurations.