当使用大数进行模n计算时,例如
当然,我可以轻松地实现自己的函数,但这样我必须明确地为每个操作说“mod n”。相反,可以构建一个数字表达式树并推迟实际计算,在最后只声明一次模n状态。(请参见下面的代码)
我开始清楚地展示我的意思,但我想知道是否已经存在此类实现,它似乎非常有用,因此应该有人已经实现了它。
mod (123456789^987654321) 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
定义一个模数算术Num
实例... - hvr