1个不稳定版本
0.1.0 | 2019年11月9日 |
---|
#1561 在 数学 类别中
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
,但其中乘法是结合的,一个元素乘以其自身的结果是标量 - 复数:当
T
为1
和i
时产生,并相应地相乘 - 四元数:与复数相同,但具有更多的虚数单位
用例
这个软件包的主要目的可以分为两大类
- 用作创建更具体系统(如多项式或克利福德代数)的抽象基础
- 作为工具,用于懒加载昂贵的算术操作以供未来评估
软件包结构
本软件包包括以下内容
- 两种主要结构,用于在某种类型上执行自由算术
- 用于指定算术规则的特质
- 特定组合的构造和规则的类型别名
具体来说
MonoidalString
使用顺序相关的内部表示法,通过Vec<T>
来确定其乘法规则,该规则由特质MonoidRule
的实现者提供。此结构的别名包括FreeMonoid
和FreeGroup
。ModuleString
构建由类型T
的项和某些加法类型R
的标量组成的类型,这些标量以顺序无关的HashMap
存储起来。这使得所有ModuleString
都可以通过添加相同项的系数来实现加法操作,并且可以通过可选的AlgebraRule
参数包含自由乘法。此结构的别名包括FreeModule
和FreeAlgebra
。
更多信息,请参阅文档中的相应结构
依赖项
~2MB
~50K SLoC