Table of symbols
These tables list all the functions, operators and constants that are recognized as geometric operations, e.g. in code evaluated as part of a @ga block.
Built-in functions
These functions are always accessible in any context, and cannot be overriden:
+(a, b, ...)-(a)-(a, b)reverse(a)antireverse(a)left_complement(a)right_complement(a)geometric_product(a, b, ...)exterior_product(a, b, ...)interior_product(a, b)commutator_product(a, b)inverse(a)exp(a)
Default symbols
Although any operation in geometric algebra may be performed using the built-in functions above, it is useful to have access to shorthands and other operators which build on these primitives. Therefore, default functions and operators are provided, as well as a few aliases and constants.
These are obtained with default_bindings, and may be tweaked or removed if you choose to reimplement your own macro over @ga using Expression generation utilities.
Functions
These functions define secondary operators that are more or less standard in geometric algebra. Many of these operators were extracted from E. Lengyel's PGA poster.
| Function | Definition |
|---|---|
antidivision | inverse_dual(division(dual(a), dual(b))) |
antiinverse | inverse_dual(inverse(dual(a))) |
antiscalar_product | geometric_antiproduct(a, antireverse(a))::e̅ |
bulk_left_complement | geometric_product(antireverse(a), 𝟙) |
bulk_norm | sqrt(interior_product(a, reverse(a)))::e |
bulk_right_complement | geometric_product(reverse(a), 𝟙) |
bulk | weight_left_complement(bulk_right_complement(a)) |
division | geometric_product(a, inverse(b)) |
exterior_antiproduct | inverse_dual(exterior_product(dual(a), dual(b))) |
geometric_antiproduct | inverse_dual(geometric_product(dual(a), dual(b))) |
geometric_norm | bulk_norm(a) + weight_norm(a) |
interior_antiproduct | inverse_dual(interior_product(dual(a), dual(b))) |
left_interior_antiproduct | exterior_product(a, right_complement(b)) |
left_interior_product | exterior_antiproduct(left_complement(a), b) |
projected_geometric_norm | antidivision(bulk_norm(a), weight_norm(a)) |
right_interior_antiproduct | exterior_product(left_complement(a), b) |
right_interior_product | exterior_antiproduct(a, right_complement(b)) |
scalar_product | geometric_product(a, reverse(a))::Scalar |
unitize | antidivision(a, weight_norm(a)) |
versor_product | geometric_product(b, a, inverse(b)) |
weight_left_complement | geometric_antiproduct(𝟏, antireverse(a)) |
weight_norm | sqrt(interior_antiproduct(a, antireverse(a)))::e̅ |
weight_right_complement | geometric_antiproduct(𝟏, reverse(a)) |
weight | bulk_left_complement(weight_right_complement(a)) |
Operators
Convenient binary operators are defined by default to allow a more compact language to perform geometric operations. Note that there is no agreed-upon convention for these, and that is why we prefer to allow more advanced users to tweak them at will:
| Function | Unicode input | Expression |
|---|---|---|
a ⟑ b | \wedgedot | geometric_product(a, b) |
a ⟇ b (Julia 1.10 or higher) | \veedot | geometric_antiproduct(a, b) |
a ⩒ b | \veeodot | geometric_antiproduct(a, b) |
a ⋅ b | \cdot | interior_product(a, b) |
a ● b | \mdlgblkcircle | interior_product(a, b) |
a ○ b | \bigcirc | interior_antiproduct(a, b) |
a ⦿ b | \circledbullet | scalar_product(a, b) |
a ∧ b | \wedge | exterior_product(a, b) |
a ∨ b | \vee | exterior_antiproduct(a, b) |
a ⊣ b | \dashv | left_interior_product(a, b) |
a ⊢ b | \vdash | right_interior_product(a, b) |
a ⨼ b | \intprod | left_interior_antiproduct(a, b) |
a ⨽ b | \intprodr | right_interior_antiproduct(a, b) |
a << b | versor_product(a, b) | |
a / b | division(a, b) | |
a' | reverse(a) |
In many materials about geometric algebra, the geometric product uses the same notation as the standard multiplication operator, * (or even juxtaposition). However, we prefer to use the \wedgedot symbol ⟑ proposed by E. Lengyel to visually show its relationship with the inner and outer products, ⋅ and ∧, and because it allows the use of an "anti-" operator to express the dual operator to the geometric product, the geometric antiproduct ⟇ (\veedot, available from Julia 1.10). There are also programming-related motivations, as 2x destructures to 2 * x which would rarely want to be considered as "the geometric product of 2 and x".
Aliases
A few aliases are defined, with a short-hand for the inverse and a specific choice of a dual and dual inverse, along with common names for operators we named differently:
| Symbol | Alias |
|---|---|
inv | inverse |
dual | right_complement |
inverse_dual | left_complement |
regressive_product | exterior_antiproduct |
left_contraction | left_interior_product |
right_contraction | right_interior_product |
Constants
These constants allow you to complactly express scalar and antiscalar units.
| Symbol | Input | Expression |
|---|---|---|
𝟏 | \bfone | 1::e |
𝟙 | \bbone | 1::e̅ |
Type annotations
Considering an $n$-dimensional space, the various ways to annotate a value are as follows:
| Annotation | Alias | Grade or basis blade |
|---|---|---|
::e1 | Basis vector $e_1$ (grade 1) | |
::e12 | ::e_1_2 | Basis blade $e_1 \wedge e_2$ (grade 2) |
::e_11_12 | Basis blade $e_{11} \wedge e_{12}$ (grade 2, more than one digit per index) | |
::Scalar | ::0, ::e | $0$ |
::Vector | ::1 | $1$ |
::Bivector | ::2 | $2$ |
::Trivector | ::3 | $3$ |
::Quadvector | ::4 | $4$ |
::Antiscalar | ::ē | $n$ |
::(k, l, ...) | Tuple of multiple elements of grade $k$, $l$, ... | |
::(k + l + ...) | Concatenation of multiple elements of grade $k$, $l$, ... | |
::Multivector | Concatenation of all elements with grade $0$ to $n$ |