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 | 不可变的稠密单变量 DensePolynomial | API · 教程 · 设计 |
immut/term | 不可变的有序项 TermPolynomial | API · 教程 · 设计 |
immut/sparse | 不可变的有序映射 SparsePolynomial | API · 教程 · 设计 |
immut/context | 不可变的命名变量 ContextPolynomial 与代换 | API · 教程 · 设计 |
mutable | 可变层的门面包 | API · 教程 · 设计 |
mutable/dense | 可变的 DensePolynomial | API · 教程 · 设计 |
mutable/term | 可变的 TermPolynomial | API · 教程 · 设计 |
mutable/sparse | 可变的 SparsePolynomial | API · 教程 · 设计 |
mutable/context | 可变的 ContextPolynomial | API · 教程 · 设计 |
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;为旧根包编写的代码无法不加修改地编译。