The clifford
package provides R-centric functionality
for working with Clifford algebras of arbitrary dimension and signature.
A detailed vignette is provided in the package.
You can install the released version of the clifford package from CRAN with:
# install.packages("clifford") # uncomment this to install the package
library("clifford")
set.seed(0)
clifford
package
in useThe basic creation function is clifford()
, which takes a
list of basis blades and a vector of coefficients:
<- clifford(list(1,2,1:4,2:3),1:4))
(a #> Element of a Clifford algebra, equal to
#> + 1e_1 + 2e_2 + 4e_23 + 3e_1234
<- clifford(list(2,2:3,1:2),c(-2,3,-3)))
(b #> Element of a Clifford algebra, equal to
#> - 2e_2 - 3e_12 + 3e_23
So a
and b
are multivectors. Clifford
objects are a vector space and we can add them using +
:
+b
a#> Element of a Clifford algebra, equal to
#> + 1e_1 - 3e_12 + 7e_23 + 3e_1234
See how the e2
term vanishes and the e_23
term is summed. The package includes a large number of products:
*b # geometric product (also "a % % b")
a#> Element of a Clifford algebra, equal to
#> - 16 + 6e_1 - 3e_2 - 2e_12 + 14e_3 + 12e_13 + 3e_123 - 9e_14 + 9e_34 - 6e_134
%^% b # outer product
a #> Element of a Clifford algebra, equal to
#> - 2e_12 + 3e_123
%.% b # inner product
a #> Element of a Clifford algebra, equal to
#> - 16 + 6e_1 - 3e_2 + 14e_3 - 9e_14 + 9e_34 - 6e_134
%star% b # scalar product
a #> [1] -16
%euc% b # Euclidean product
a #> [1] 8
The package can deal with non positive-definite inner products. Suppose we wish to deal with an inner product of
[ \begin{pmatrix} +1 & 0 & 0 & 0 & 0\\ 0 &+1 & 0 & 0 & 0\\ 0 & 0 &+1 & 0 & 0\\ 0 & 0 & 0 &-1 & 0\\ 0 & 0 & 0 & 0 &-1 \end{pmatrix}](https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Bpmatrix%7D%0A%2B1%20%26%200%20%26%200%20%26%200%20%26%200%5C%5C%0A%200%20%26%2B1%20%26%200%20%26%200%20%26%200%5C%5C%0A%200%20%26%200%20%26%2B1%20%26%200%20%26%200%5C%5C%0A%200%20%26%200%20%26%200%20%26-1%20%26%200%5C%5C%0A%200%20%26%200%20%26%200%20%26%200%20%26-1%0A%5Cend%7Bpmatrix%7D%0A ” \[\begin{pmatrix} +1 & 0 & 0 & 0 & 0\\ 0 &+1 & 0 & 0 & 0\\ 0 & 0 &+1 & 0 & 0\\ 0 & 0 & 0 &-1 & 0\\ 0 & 0 & 0 & 0 &-1 \end{pmatrix}\]“)
where the diagonal is a number of terms
followed by a number of terms. The
package idiom for this would be to use signature()
:
signature(3)
Function signature()
is based on
lorentz::sol()
and its argument specifes the number of
basis blades that square to , the
others squaring to . Thus and :
basis(1)
#> Element of a Clifford algebra, equal to
#> + 1e_1
basis(1)^2
#> Element of a Clifford algebra, equal to
#> scalar ( 1 )
basis(4)
#> Element of a Clifford algebra, equal to
#> + 1e_4
basis(4)^2
#> Element of a Clifford algebra, equal to
#> the zero clifford element (0)
The package uses the STL map class with dynamic bitset keys for efficiency and speed and can deal with objects of arbitrary dimensions. Thus:
options("basissep" = ",")
<- rcliff(d=20))
(x #> Element of a Clifford algebra, equal to
#> + 4 + 5e_2 + 1e_5 - 2e_4,7 + 2e_11 + 4e_14 - 1e_10,14 + 3e_5,9,15 - 3e_18,19
summary(x^3)
#> Element of a Clifford algebra
#> Typical terms: 364 ... + 54e_5,9,10,14,15,18,19
#> Number of terms: 40
#> Magnitude: 265721
For more detail, see the package vignette
vignette("clifford")