【问题标题】:Calculating expressions modulo n计算表达式模n
【发布时间】:2011-12-31 10:27:31
【问题描述】:

在对大数进行模数计算时,您会遇到巨大的性能损失,例如mod (123456789^987654321) n。相反,您必须使用您自己的 ^ 内部计算 mod n 也用于中间计算。

当然,我可以轻松实现自己的功能,但是我必须为每个操作明确地说“mod 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-instance...
  • 我希望它在运行时可以更改。对不起,我应该提到它。

标签: haskell modulo


【解决方案1】:

Oleg 做了类似的事情,你为模算术创建了一个实例,但用于任意模数。 Implicit configurations.

【讨论】:

  • 我不明白。您是链接到科学论文还是实际实现?如果是实现,能否提供代码示例?
  • 您是否费心查看链接?它有论文,也有实现。还有一个 README 文件描述了文件包含的内容。
  • 我浏览了网页上的摘要,并没有发现任何关于模数的内容,显然这个理论比最初看到的要深刻。现在我找到了实现和论文。你完全正确,这就是我要找的。对不起,我最初的皱眉,我以为有人会链接到 github 存储库,而不是论文。
  • 我真的很震惊,我没有在 hackage 上找到任何其他东西。我可以发誓我在某个时候看到了一些东西......无论如何,ekmett 仅在这里有一个经过整理和支持的配置部分版本:hackage.haskell.org/package/reflection
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
相关资源
最近更新 更多