1个不稳定版本
0.1.0 | 2022年11月29日 |
---|
#1230 in 数学
21KB
243 行
algebraic-gen
生成任何空间维度的几何积。
该crate提供了一个宏 generate_geometric_product!
。给定一个函数标识符和一个非负整数字面量,该宏生成一个计算两个多向量系数表示的几何积的函数。
例如,generate_geometric_product!(my_product, 3)
生成以下函数
pub fn my_product<A, B, T>(a: &A, b: &B) -> [T; 8]
where
A: ::core::ops::Index<usize, Output = T>,
B: ::core::ops::Index<usize, Output = T>,
T: Copy +
::core::ops::Mul<Output = T> +
::core::ops::Add<Output = T> +
::core::ops::Sub<Output = T>,
{
[
a[0] * b[0] - a[1] * b[1] - a[2] * b[2] - a[3] * b[3] - a[4] * b[4] - a[5] * b[5] - a[6] * b[6] + a[7] * b[7],
a[0] * b[1] + a[1] * b[0] + a[2] * b[3] - a[3] * b[2] + a[4] * b[5] - a[5] * b[4] - a[6] * b[7] - a[7] * b[6],
a[0] * b[2] - a[1] * b[3] + a[2] * b[0] + a[3] * b[1] + a[4] * b[6] + a[5] * b[7] - a[6] * b[4] + a[7] * b[5],
a[0] * b[3] + a[1] * b[2] - a[2] * b[1] + a[3] * b[0] - a[4] * b[7] + a[5] * b[6] - a[6] * b[5] - a[7] * b[4],
a[0] * b[4] - a[1] * b[5] - a[2] * b[6] - a[3] * b[7] + a[4] * b[0] + a[5] * b[1] + a[6] * b[2] - a[7] * b[3],
a[0] * b[5] + a[1] * b[4] + a[2] * b[7] - a[3] * b[6] - a[4] * b[1] + a[5] * b[0] + a[6] * b[3] + a[7] * b[2],
a[0] * b[6] - a[1] * b[7] + a[2] * b[4] + a[3] * b[5] - a[4] * b[2] - a[5] * b[3] + a[6] * b[0] - a[7] * b[1],
a[0] * b[7] + a[1] * b[6] - a[2] * b[5] + a[3] * b[4] + a[4] * b[3] - a[5] * b[2] + a[6] * b[1] + a[7] * b[0],
]
}
在此示例中,函数的实现将访问索引 a
和 b
的 0..8
。在一般情况下,它将访问其参数在索引 0..1 << D
,并返回类型为 [T; 1 << D]
的值。
示例
函数生成和使用简单。将一个(较小的)非负整数传递给宏,它就会生成乘积函数。(用 cargo expand
查看示例。)
use algebraic_gen::generate_geometric_product;
generate_geometric_product!(my_product, 3);
fn main() {
let a: [f64; 8] = [1., 2., 3., 4., 5., 6., 7., 8.];
let b: [f64; 8] = [8., 7., 6., 5., 4., 3., 2., 1.];
let c = my_product(&a, &b);
println!("The geometric product of {:?} and {:?} is {:?}", a, b, c);
assert_eq!(c, [-88.0, -18.0, 60.0, -18.0, 72.0, 102.0, -36.0, 114.0]);
}
几何代数
根据空间给定的维度 D
,定义了一种称为几何代数的数学结构。在这种代数中,存在从0到D
(包括)不同级别的对象。0级对象是标量,1级对象是向量,2级、3级等则是双矢量、三矢量等。这些高阶对象是通过向量的外积(wedge product)创建的。通过外积结合所有向量可以得到一个伪标量,其级别为D
。任何级别的对象都可以通过缩放和相加来形成多矢量。
对于本软件包而言,任何多矢量都可以唯一地表示为一个基元素的一组线性组合,该基元素有2^D
个不同的对象,这意味着我们可以用相应大小的浮点数组来表示多矢量。本软件包生成的函数的返回类型[T; 1]
、[T; 2]
、[T; 4]
、[T; 8]
等,正是空间几何代数的多矢量表示,其维度分别为0、1、2、3等。
宏将基元素选择的相关文档附加到生成的函数上。以3D为例,本软件包中的基元素选择包括:一个标量(S
)、三个向量(X
、Y
、Z
)、三个双矢量(X∧Y
、X∧Z
、Y∧X
)和一个伪标量(X∧Y∧Z
)。生成的乘积将8维系数数组解释为[S, X, Y, X∧Y, Z, X∧Z, Y∧Z, X∧Y∧Z]
。在附加到相应生成乘积函数的文档中,这表示为[[], [0], [1], [0,1], [2], [0,2], [1,2], [0,1,2]]
。
关于生成
可能存在一种更好的方法来获取乘积,而不使用'sledgehammer'宏方法。生成过程并不高效,但这是在讨论构建时间。
生成逻辑受到All Hail Geometric Algebra!的启发。
宏的工作简要描述
- 生成元素(基础)
- 这里的乘积是简单的连接
- 使用冒泡排序和一种重复消除进行规范化
- 生成乘积和
- 展开项
- 更多乘积和规范化
- 根据规范化返回的符号进行加/减
- 一些格式化
更多详细信息请参阅源代码:algebra_generation.rs
。
依赖项
约1.5MB
约35K SLoC