#代数 #多项式 #算术运算

nightly free-algebra

用于在集合上构造自由代数的类型

1个不稳定版本

0.1.0 2019年11月9日

#1561数学 类别中

MIT 许可证

64KB
717

Rust编程语言中用于在集合上构造自由代数的类型。

什么是“自由代数”?

在这个crate的上下文中,“代数”一词指的是涉及算术运算的一系列数学构造,而“自由”则指这些操作的通用性。特别是,一个“自由”操作是尽可能少的约束下进行操作的。

因此,在一般情况下,这种“自由”构造的过程是:从某种类型 T 开始,结合一组代数规则,然后按照规则对 T 的元素进行操作,就像它们是变量或符号一样。

虽然听起来很抽象,但实际上在标准库中已经存在这样一个例子。如果我们从某种类型 T 开始,假设乘法是结合的,并像处理变量一样操作元素,那么结果将与如果我们使用了 FreeMonoid 类型一样。

use maths_traits::algebra::One;
use free_algebra::FreeMonoid;

let x: FreeMonoid<char> = FreeMonoid::one();
let y = FreeMonoid::one() * 'a' * 'b';
let z = FreeMonoid::one() * 'c' * 'd';

assert_eq!(x, vec![]);
assert_eq!(y, vec!['a', 'b']);
assert_eq!(z, vec!['c', 'd']);
assert_eq!(&y * &z, vec!['a', 'b', 'c', 'd']);
assert_eq!(&z * &y, vec!['c', 'd', 'a', 'b']);

通过更改使用的类型、考虑的操作以及遵循的规则,可以实现许多其他构造。例如:

  • FreeModule:在关联和交换的方式下自由添加 T 的元素的结果。
  • FreeAlgebra:与 FreeModule 相同,但允许自由乘法(类似于 FreeMonoid)。
  • 多项式:一个 FreeAlgebra,其中 T 之间的乘法是交换和结合的。
  • 克利福德代数:一种 FreeAlgebra,但其中乘法是结合的,一个元素乘以其自身的结果是标量
  • 复数:当 T1i 时产生,并相应地相乘
  • 四元数:与复数相同,但具有更多的虚数单位

用例

这个软件包的主要目的可以分为两大类

  • 用作创建更具体系统(如多项式或克利福德代数)的抽象基础
  • 作为工具,用于懒加载昂贵的算术操作以供未来评估

软件包结构

本软件包包括以下内容

  • 两种主要结构,用于在某种类型上执行自由算术
  • 用于指定算术规则的特质
  • 特定组合的构造和规则的类型别名

具体来说

  • MonoidalString 使用顺序相关的内部表示法,通过 Vec<T> 来确定其乘法规则,该规则由特质 MonoidRule 的实现者提供。此结构的别名包括 FreeMonoidFreeGroup
  • ModuleString 构建由类型 T 的项和某些加法类型 R 的标量组成的类型,这些标量以顺序无关的 HashMap 存储起来。这使得所有 ModuleString 都可以通过添加相同项的系数来实现加法操作,并且可以通过可选的 AlgebraRule 参数包含自由乘法。此结构的别名包括 FreeModuleFreeAlgebra

更多信息,请参阅文档中的相应结构

依赖项

~2MB
~50K SLoC