luna-poly

luna-poly 为 MoonBit 提供规范的多项式类型:稠密单变量多项式、以有序项数组或有序映射表示的多变量多项式,以及带求值、部分求值和代换的命名变量多项式。每种类型都有不可变版本(多项式是值)和可变版本(由显式命名的方法原地更新容器)。本手册描述 0.2.0 版。

你能得到什么

  • 规范形式。每种表示都会移除零项并保持唯一的范式,因此 == 就是多项式相等。
  • 共享的单项式模型。不固定变量个数的指数向量,按分次单项式序排序。
  • 标明开销的算法。教科书乘法与 Karatsuba 乘法、Horner 求值、复合、形式导数、二进制幂,以及作为环同态的同时代换。
  • 泛型代码。小型能力 trait、操作记录,以及由两个门面包重新导出的 luna-generic 代数 trait。
  • 命名变量通过变量上下文实现,并与 type_theory 的名字相衔接。
  • 每个部分操作都有带检查的变体,返回 None 而不是中止(abort)。

包

包作用页面
core指数向量、变量与上下文、形状、能力 trait、操作记录API · 教程 · 设计
immut不可变层的门面包API · 教程 · 设计
immut/dense不可变的稠密单变量 DensePolynomialAPI · 教程 · 设计
immut/term不可变的有序项 TermPolynomialAPI · 教程 · 设计
immut/sparse不可变的有序映射 SparsePolynomialAPI · 教程 · 设计
immut/context不可变的命名变量 ContextPolynomial 与代换API · 教程 · 设计
mutable可变层的门面包API · 教程 · 设计
mutable/dense可变的 DensePolynomialAPI · 教程 · 设计
mutable/term可变的 TermPolynomialAPI · 教程 · 设计
mutable/sparse可变的 SparsePolynomialAPI · 教程 · 设计
mutable/context可变的 ContextPolynomialAPI · 教程 · 设计
internal模块私有的辅助函数(自然数幂)API · 教程 · 设计
consistency仅用于测试的包,检查各层与各表示的一致性API · 教程 · 设计

架构指南展示了各包之间的依赖关系。

阅读路线

初次接触本库。先读 immut 教程,再读你所需表示的教程:单变量读 dense,多变量读 term 或 sparse,命名变量与代换读 context。

在应用中使用。把 immut API 和各表示的 API 页面放在手边;它们列出了每个前置条件、失败情形和开销。当性能分析表明中间值很重要时,再阅读 mutable 教程。

编写泛型代码或新的表示。阅读 core 教程 和 core 设计,后者推导了单项式序,并解释了能力 trait 和操作记录。

参与贡献。阅读架构指南、你所修改的包的设计页面、consistency 页面以及贡献指南。

要求与安装

luna-poly 需要 moonc 0.10 或更高版本的 MoonBit 工具链。用以下命令将其添加到模块中

moon add Luna-Flow/luna-poly@0.2.0

并在 moon.pkg 中导入一个门面包:

import {
  "Luna-Flow/luna-poly/immut",
}

它依赖 Luna-Flow/luna-generic、Luna-Flow/arithmetic 和 Luna-Flow/type_theory,moon 会自动安装它们。

第一个示例

test "first example" {
  let p = @immut.DensePolynomial::from_coefficients([1, 2, 3])
  inspect(p.pow(2).eval(2), content="289")

  let ctx = @immut.VariableContext::from_names(["x", "y"])
  let x = ctx.require_variable("x")
  let y = ctx.require_variable("y")
  let q = @immut.ContextPolynomial::from_named_terms_as_sparse(ctx, [
    ([(x, 2U)], 1),
    ([(x, 1U), (y, 1U)], 3),
    ([], 4),
  ])
  inspect(q.eval_named([(x, 2), (y, 5)]), content="38")
  inspect(q.eval_partial([(x, 2)]), content="8 + 6 * y")
}

0.2.0 版的布局

0.2.0 版用 core、各实现包和两个门面包取代了原先的单一根包。请显式导入 Luna-Flow/luna-poly/immut 或 Luna-Flow/luna-poly/mutable;为旧根包编写的代码无法不加修改地编译。