Function `pseudoscalar()` in the `clifford` package

set.seed(0)
library("clifford")
library("permutations")
options(rmarkdown.html_vignette.check_title = FALSE)
knitr::opts_chunk$set(echo = TRUE)
knit_print.function <- function(x, ...){dput(x)}
registerS3method(
  "knit_print", "function", knit_print.function,
  envir = asNamespace("knitr")
)
knitr::include_graphics(system.file("help/figures/clifford.png", package = "clifford"))
knitr::include_graphics(system.file("help/figures/permutations.png", package = "permutations"))
pseudoscalar

To cite the clifford package in publications please use @hankin2025_clifford_rmd. This short document discusses the pseudoscalar $I$ in the clifford R package. The behaviour of $I$ depends on the dimension $n$ and the signature of the space considered, and as such function pseudoscalar() fails if maxdim is not set:

pseudoscalar()

Function pseudoscalar() needs option maxdim to ascertain what object to return. Let us set maxdim to 7:

options(maxdim=7)
pseudoscalar()

The example above makes it clear that pseudoscalar() returns the unit pseudoscalar, in whatever dimension we are working in. The usual workflow would be to define maxdim and a signature at the start of a session, then define an R object (conventionally I), as the pseudoscalar. However, in this vignette we will repeatedly redefine the signature and the maximum dimension to illustrate different aspects of pseudoscalar(). The first feature of $I$ is that $\left|I\right|^2=1$. For standard $\mathbb{R}^2$ and $\mathbb{R}^3$, and Minkowski space $\operatorname{Cl}(3,1)$ we have $I^2=-1$:

options(maxdim=3)
signature(3)       # Cl(3,0)
(I <- pseudoscalar())
drop(I^2)

And for Minkowski space:

options(maxdim=4)
signature(3,1)       # Cl(3,1)
I <- pseudoscalar()
drop(I^2)

However, we can easily define other signatures in which $I^2=+1$:

options(maxdim=4)
signature(2,2)       # Cl(2,2)
(I <- pseudoscalar())
drop(I^2)

The pseudoscalar I defines an orientation in the sense that, for any ordered set of $n$ linearly independent vectors $a_1,\ldots, a_n$ their outer product will have either the same or opposite sign as $I$. Because the orientation is negated by interchanging a pair of vectors, we see that the orientation is preserved by even permutations of $1,2,\ldots,n$. Working in $\operatorname{Cl}(5,0)$:

options(maxdim=5)
signature(5)
I <- pseudoscalar()
ai <- list(); for(i in 1:5){ai[[i]] <- as.1vector(rnorm(5))}
ai[[1]] # the other 5 look very similar
Reduce(`^`,ai)

Above we see, from the last line, that the vectors $a_1$ to $a_5$ are independent (the result is nonzero). Further, we see that the vectors are a right-handed set, for the wedge product is positive. We can permute the vectors using the permutations package

(p <- permutation("(12)(345)"))
is.even(p)

Above, we see that p is an odd permutation, being a product of a transposition and a three-cycle.

c(drop(Reduce(`^`,ai)),drop(Reduce(`^`,ai[as.word(p)])))

Above, we see that the sign of the wedge product of the permuted list has changed, consistent with the permutation's being odd. We know various things about the pseudoscalar; below we will verify that $a\cdot\left(AI\right)=a\wedge AI$ for vector $a$ and multivector $A$:

options(maxdim=7)   
signature(7)
(I <- pseudoscalar())
(a <- as.1vector(sample(1:10,5)))
(A <- rcliff())

Above we choose randomish values for $a$ and $A$. Observe that $A$ has terms of different grades; it is not homogeneous. Numerical verification is straightforward [NB: "%.%" breaks markdown documents]:

LHS <- cliffdotprod(a, A*I) # Usual idiom would be "a %.% (A*I)"
RHS <- (a^A)*I
LHS - RHS
options(maxdim=NULL) # restore defaults

References



Try the clifford package in your browser

Any scripts or data that you put into this service are public.

clifford documentation built on July 5, 2026, 5:07 p.m.