#几何代数 #代数 #克利福德 #过程宏 #超复数

无std algebraic-gen

任意维度几何积的进程宏

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],
    ]
}

在此示例中,函数的实现将访问索引 ab0..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)、三个向量(XYZ)、三个双矢量(X∧YX∧ZY∧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