Haskell 模n的计算表达式

Haskell 模n的计算表达式,haskell,modulo,Haskell,Modulo,当使用大数值进行模n计算时,您将遇到巨大的性能损失,例如mod(123456789^987654321)n。相反,您必须使用自己的^内部计算mod n,也用于交互计算 当然,我可以很容易地实现自己的函数,但是对于每个操作,我必须明确地说“mod n”。相反,我们可以构建一个数值表达式树并推迟实际计算,并且在最终状态下,只需模n一次。(见下面我的代码) 我开始这样做是为了清楚地说明我的意思,但我想知道是否已经有了这样的实现,它似乎非常有用,所以应该有人已经实现了它 module Modulo wh

当使用大数值进行模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

Oleg做了类似的事情,你做了一个模运算的例子,但是做了一个任意的模

我不明白。你是链接到一篇科学论文还是一个实际的实现?如果它是一个实现,您能提供一个代码示例吗?您是否费心检查该链接?它有论文,也有一个实现。还有一个自述文件,描述了文件包含的内容。我浏览了网页上的摘要,没有发现任何关于模的内容,显然这个理论比第一眼看到的要深刻。现在我找到了实现和文件。你完全正确,这就是我要找的。很抱歉我最初皱了皱眉,我以为有人会链接到github回购协议,而不是一份报纸。事实上,我很惊讶我在hackage上没有找到任何其他东西。我发誓我在某个时候看到了一些东西。。。总之,ekmett在这里有一个整洁且受支持的配置部分版本:您是否需要
mod m
中的
m
在运行时可以更改,或者在编译时修复它就足够了?如果编译时间足够,您可以简单地为一些新类型的
整数定义一个模算术
Num
-实例……我希望它在运行时可以更改。对不起,我应该提一下。