Function signature() in the clifford package

Robin K. S. Hankin

signature
## function (p, q = 0) 
## {
##     if (missing(p)) {
##         s <- getOption("signature")
##         if (is.null(s)) {
##             s <- c(.Machine$integer.max, 0)
##         }
##         showsig(s)
##         class(s) <- "sigobj"
##         return(s)
##     }
##     else {
##         s <- c(p, q)
##         m <- getOption("maxdim")
##         if (!is.null(m)) {
##             if (p + q > m) {
##                 stop("signature requires p+q <= maxdim")
##             }
##         }
##         p <- min(s[1], .Machine$integer.max)
##         q <- min(s[2], .Machine$integer.max)
##         stopifnot(is_ok_sig(s))
##         options(signature = c(p, q))
##         showsig(s)
##         return(invisible(s))
##     }
## }

To cite the clifford package in publications please use Hankin (2025a). This short document discusses signature() in the clifford R package. As an example we might wish to work in \(\operatorname{Cl}(1,2)\):

signature(1,2)

Thus \(e_1^2=+1\), and \(e_2^2=e_3^2=-1\):

c(drop(e(1)^2),drop(e(2)^2),drop(e(3)^2))
## [1]  1 -1 -1

We might ask what \(e_4^2\) would evaluate to, and this is assumed to be zero as is \(e_i^2\) for \(i\geqslant 4\):

c(drop(e(4)^2),drop(e(100)^2))
## [1] 0 0

If we wish to set paranoid-level safety measures, we would set option maxdim to prevent accidentally working with too-large values of \(i\):

options(maxdim = 4)

Now we work with a four-dimensional vector space in which \(e_1^2=+1,e_2^2=e_3^2=-1,e_4^2=0\), but now \(e_5\) is undefined:

c(drop(e(1)^2),drop(e(2)^2),drop(e(3)^2),drop(e(4)^2))
## [1]  1 -1 -1  0
e(5)
## Error in is_ok_clifford(terms, coeffs): option maxdim exceeded

The operation of signature() is modelled on the sol() function in the lorentz package (Hankin 2025b). Thus, if given no arguments we return the signature:

signature()
## [1] 1 2

However, the default value is to use an infinite signature which corresponds to \(e_i^2=1\) for all i$:

options(maxdim=NULL)
signature(Inf)
signature()
## [1] Inf   0

Function signature() returns an object of (trivial) class sigobj which has a bespoke print method, print.sigobj(). For technical reasons an infinite signature is not allowed but is represented internally by a near-infinite integer, specifically .Machine$integer.max:

dput(signature())
## structure(c(2147483647, 0), class = "sigobj")

References

Hankin, R. K. S. 2025a. “Clifford Algebra in R: Introducing the clifford Package.” Advances in Applied Clifford Algebra. https://doi.org/https://doi.org/10.1007/s00006-025-01403-9.
———. 2025b. “Special Relativity in R: The Lorentz Package.” Journal of Open Source Education 8 (88): 196. https://doi.org/10.21105/jose.00196.