【问题标题】:Haskell library like SymPy? [closed]像 SymPy 这样的 Haskell 库? [关闭]
【发布时间】:2015-01-10 02:51:37
【问题描述】:

我需要操作 1 + sqrt(3) 之类的表达式,并执行基本的算术运算,例如加法、减法和除法。我希望结果采用某种规范形式,以便它可以用作地图中的键。由于舍入问题,将 1 + sqrt(3) 转换为浮点数是不可行的。

我在 Python 中使用 SymPy 来完成这项任务。 Haskell 是否有等效的原生库?

【问题讨论】:

  • 你想要√2 - 1 == 1 / (√2 + 1)吗?

标签: haskell symbolic-math computer-algebra-systems


【解决方案1】:

请查看the numbers package。如果您只需要存储“1 + √3”之类的精确数字,您可能需要使用Data.Number.CReal 而不是符号算术。它存储表达式,并且可以在需要时计算到任意位数。

Prelude Data.Number.CReal> let cx = 1 + sqrt (3 :: CReal)
Prelude Data.Number.CReal> showCReal 400 cx 
"2.7320508075688772935274463415058723669428052538103806280558069794519330169088000370811461867572485756756261414154067030299699450949989524788116555120943736485280932319023055820679748201010846749232650153123432669033228866506722546689218379712270471316603678615880190499865373798593894676503475065760507566183481296061009476021871903250831458295239598329977898245082887144638329173472241639845878553977"

包中还有一个 Data.Number.Symbolic 模块,但描述说“它主要用于调试”。

【讨论】:

  • CReal 不会给你平等,对吧?所以我认为这是不行的。
  • @sclv:它实现了 CReal,除了如果正确完成它可能需要无限长的时间。 CReal 的 == 在 40 位后终止。
  • “请注意,CReal 上的比较操作可能会有所不同,因为(必然)不可能正确实现它们并始终终止。”这对我来说排除了 CReal。为了散列这些值,我需要避免转换为实数。
【解决方案2】:

您似乎正在 Haskell 中寻找计算机代数系统 (CAS)。尽管在 Haskell 包/模块的名称中引用了这么多代数对象,但我从未听说过 Haskell 中有通用且维护良好的 CA 系统(如 Python 中的 SymPy 或 Sage)。

但是在 Wikipedia 上的 the list of Computer Algebra Systems 中,我找到了对

的引用

DoCon. The Algebraic Domain Constructor

它使用non-standard license,但我敢说它仍然是开源的(尽管有重命名和归属要求)。截至 2010 年 7 月,docon-2.11 仍然使用 GHC 6.12.1 构建并运行演示/测试(我只需在演示的一个文件中插入 LANGUAGE FlexibleContexts 编译指示)。

DoCon 有据可查(手册的 362 页)。它的手册包含在 zip 中并附有源代码,因此为了方便,我将其单独放在网上:

DoCon 2.11 Manual.ps

请仔细查看它是否适合您的需求。

【讨论】:

  • DoCon 对于海报的目的来说似乎有点重量级。
  • 我同意,但我对 Haskell 的其他方面一无所知。
  • DoCon 看起来很强大。我真正需要的是Landau算法的Haskell实现,用于去嵌套根式(以及用有理数和平方根等进行基本算术的东西)。
  • haskell.org 上 DoCon 的链接似乎已失效,它的最新版本似乎在 ftp.botik.ru/pub/local/Mechveliani/docon/2.11
  • 你知道 DoCon 支持哪些功能吗?
【解决方案3】:

查看cyclotomic 包,它实现了对分圆数的精确算术。这些包括所有代数数(因此特别是 1+sqrt(3))和关键操作(如相等)是可判定的。

它们不提供Ord 实例(出于同样的原因,复数不提供),但是如果所有人都需要将它们用作查找表中的键,则可以实现非语义实例。您可能想联系作者了解如何正确执行此操作,因为可能存在一些不明显的不变量(例如,可能需要注意 coeffs 映射中的零)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-19
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多