计算表达式模n

当以大数字进行模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

奥列格做了这样的事情,你为模算术做了一个实例,但是对于任意模数。 隐式配置。

链接地址: http://www.djcxy.com/p/9995.html

上一篇: Calculating expressions modulo n

下一篇: Make JVM use My Own Class Loader