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.

FunctionDefinition
antidivisioninverse_dual(division(dual(a), dual(b)))
antiinverseinverse_dual(inverse(dual(a)))
antiscalar_productgeometric_antiproduct(a, antireverse(a))::e̅
bulk_left_complementgeometric_product(antireverse(a), 𝟙)
bulk_normsqrt(interior_product(a, reverse(a)))::e
bulk_right_complementgeometric_product(reverse(a), 𝟙)
bulkweight_left_complement(bulk_right_complement(a))
divisiongeometric_product(a, inverse(b))
exterior_antiproductinverse_dual(exterior_product(dual(a), dual(b)))
geometric_antiproductinverse_dual(geometric_product(dual(a), dual(b)))
geometric_normbulk_norm(a) + weight_norm(a)
interior_antiproductinverse_dual(interior_product(dual(a), dual(b)))
left_interior_antiproductexterior_product(a, right_complement(b))
left_interior_productexterior_antiproduct(left_complement(a), b)
projected_geometric_normantidivision(bulk_norm(a), weight_norm(a))
right_interior_antiproductexterior_product(left_complement(a), b)
right_interior_productexterior_antiproduct(a, right_complement(b))
scalar_productgeometric_product(a, reverse(a))::Scalar
unitizeantidivision(a, weight_norm(a))
versor_productgeometric_product(b, a, inverse(b))
weight_left_complementgeometric_antiproduct(𝟏, antireverse(a))
weight_normsqrt(interior_antiproduct(a, antireverse(a)))::e̅
weight_right_complementgeometric_antiproduct(𝟏, reverse(a))
weightbulk_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:

FunctionUnicode inputExpression
a ⟑ b\wedgedotgeometric_product(a, b)
a ⟇ b (Julia 1.10 or higher)\veedotgeometric_antiproduct(a, b)
a ⩒ b\veeodotgeometric_antiproduct(a, b)
a ⋅ b\cdotinterior_product(a, b)
a ● b\mdlgblkcircleinterior_product(a, b)
a ○ b\bigcircinterior_antiproduct(a, b)
a ⦿ b\circledbulletscalar_product(a, b)
a ∧ b\wedgeexterior_product(a, b)
a ∨ b\veeexterior_antiproduct(a, b)
a ⊣ b\dashvleft_interior_product(a, b)
a ⊢ b\vdashright_interior_product(a, b)
a ⨼ b\intprodleft_interior_antiproduct(a, b)
a ⨽ b\intprodrright_interior_antiproduct(a, b)
a << bversor_product(a, b)
a / bdivision(a, b)
a'reverse(a)
Note

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:

SymbolAlias
invinverse
dualright_complement
inverse_dualleft_complement
regressive_productexterior_antiproduct
left_contractionleft_interior_product
right_contractionright_interior_product

Constants

These constants allow you to complactly express scalar and antiscalar units.

SymbolInputExpression
𝟏\bfone1::e
𝟙\bbone1::e̅

Type annotations

Considering an $n$-dimensional space, the various ways to annotate a value are as follows:

AnnotationAliasGrade or basis blade
::e1Basis vector $e_1$ (grade 1)
::e12::e_1_2Basis blade $e_1 \wedge e_2$ (grade 2)
::e_11_12Basis 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$, ...
::MultivectorConcatenation of all elements with grade $0$ to $n$