Clifford involutions following Hitzer and Sangwine

knitr::opts_chunk$set(echo = TRUE)

Clifford inverses

Hitzer and Sangwine set up a number of involutions which I reproduce for convenience below. Given $M\in Cl(p,q)$ and

\newcommand{\abr}[1]{\left\langle #1\right\rangle}

$$M= \abr{M}_0+ \abr{M}_1+ \abr{M}_2+\cdots+\abr{M}_0 $$

we have a number of involutions, documented at involutions.Rd:

H\&S assert that

$$\overline{M} = \widehat{\widetilde{M}} = \widetilde{\widehat{M}}

\sum_{k=0}^n(-1)^{k(k+1)/2}\abr{M}_k $$

which we may verify numerically:

library(clifford)
(M <- rcliff())
a1 <- cliffconj(M)
a2 <- gradeinv(rev(M))
a3 <- rev(gradeinv(M))
is.zero(a2-a1) & is.zero(a3-a1)

$p+q=3$, three-dimensional vector spaces.

We now consider the case $p+q=3$. If $x\in Cl(p,q)$ with $p+q=3$ then equation 6.2 asserts that $x\overline{x}=r_0 +r_3 e_1e_2e_3$ for some $r_0,r_3\in\mathbb{R}$:

(x <- rcliff(d=3,g=3))
x*cliffconj(x)

and equation 6.3 asserts that $x\overline{x}(x\overline{x})^\sim\in\mathbb{R}$:

f <- function(x){
    jj <- x*cliffconj(x)
    is.real(jj*rev(jj))
}
signature(0,3)
f(rcliff(d=3,g=3))
signature(1,2)
f(rcliff(d=3,g=3))
signature(2,1)
f(rcliff(d=3,g=3))
signature(3,0)
f(rcliff(d=3,g=3))

Thus equation 6.5, which asserts that the right inverse $x_r^{-1}$ is

[ x_r^{-1}=\frac{ \overline{x}\hat{x}\tilde{x} }{ x\overline{x}\hat{x}\tilde{x} },\qquad xx_r^{-1}=1 ]

RI3 <- function(x){ # right inverse
    jj <- cliffconj(x)*gradeinv(x)*rev(x)
    return(jj/drop(x*jj))
}

```r
a <- 5+rcliff(d=3,g=3)
a
RI3(a)
zap(a*RI3(a))
zap(RI3(a)*a)

Now equations 7.7 and 7.8, which assert that if $x\overline{x}m_{\overline{3},\overline{4}}(x\overline{x})$ is nonzero, we have

[ x_r^{-1} = \frac{ \overline{x}m_{\overline{3},\overline{4}}(x\overline{x}) }{ x\overline{x}m_{\overline{3},\overline{4}}(x\overline{x}) },\qquad xx_r^{-1}=1 ]

and

[ x_l^{-1} = \frac{ \overline{x}m_{\overline{3},\overline{4}}(x\overline{x}) }{ \overline{x}m_{\overline{3},\overline{4}}(x\overline{x})x },\qquad x_l^{-1}x=1 ]

Numerical verification:

f77 <- function(x){
    jj <- cliffconj(x)*neg(x*cliffconj(x),3:4)
    return(jj/drop(x*jj))
}

f78 <- function(x){
    jj <- neg(cliffconj(x)*x,3:4)*cliffconj(x)
    return(jj/drop(jj*x))
}

a <- 3 + rcliff(d=4)
a
f77(a)
zap(a*f77(a))
zap(f77(a)*a)

Try the different signatures:

set.seed(0)
sigs <- 0:4
left <- rep(NA,5)
right <- rep(NA,5)
diff <- rep(NA,5)
for(i in seq_along(sigs)){
    signature(sigs[i])
    a <- sample(1:9,1) + rcliff(d=4)
    left[i]  <- Mod(a*f77(a) -1)
    right[i] <- Mod(f77(a)*a -1)
    diff[i] <- Mod(f77(a)-f78(a))
}
left
right
diff

Just to be explicit, the following DOES NOT WORK:

a <- rcliff()
a*f77(a)   # (denominator not real)

The case $p+q\leq 5$

Right inverse

Equation 8.21 asserts that, if $p+q\leq 5$ then $z=x\overline{x}\hat{x}\tilde{x}m_{\overline{1},\overline{4}}(x\overline{x}\hat{x}\tilde{x})\in\mathbb{R}$.
Equation 8.22 asserts that, if $z$ is nonzero, then

[ x_r^{-1}=\frac{ \overline{x}\hat{x}\tilde{x}m_{\overline{1},\overline{4}}(x\overline{x}\hat{x}\tilde{x})}{ x\overline{x}\hat{x}\tilde{x}m_{\overline{1},\overline{4}}(x\overline{x}\hat{x}\tilde{x}) },xx_r^{-1}=1. ]

f822 <- function(x){
    jj <- cliffconj(x)*gradeinv(x)*rev(x)
    jj <- jj*neg(x*jj,c(1L,4L))
    jj/drop(zap(x*jj))
}
a <- 7+clifford(list(1,3,5,1:2,c(1,5),c(3,4),1:3,2:4,c(2,3,5),1:4,2:5,c(1,2,3,5),1:5),1:13)
a
f822(a)
zap(a*f822(a))
zap(f822(a)*a)

And a similar set of verifications:

sigs <- 0:6
diffl <- rep(NA,5)
diffr <- rep(NA,5)
for(i in seq_along(sigs)){
    signature(sigs[i])
    a <- sample(1:9,1) + rcliff(d=5)
    diffl[i] <- Mod(a*f822(a)-1)
    diffr[i] <- Mod(f822(a)*a-1)
}
diffl
diffr

Left inverse

Similarly, equation 8.23 asserts that, if $p+q\leq 5$ then $z'= m_{\overline{1},\overline{4}}(\tilde{x}\hat{x}\overline{x}x) \tilde{x}\hat{x}\overline{x}x\in\mathbb{R}$. And if $z'\neq 0$ equation 8.24 asserts that

[ x_l^{-1} = \frac{ m_{\overline{1},\overline{4}}(\tilde{x}\hat{x}\overline{x}x)\tilde{x}\hat{x}\overline{x} }{ m_{\overline{1},\overline{4}}(\tilde{x}\hat{x}\overline{x}x)\tilde{x}\hat{x}\overline{x}x},\qquad x_l^{-1}x = 1. ]

The R idiom would be

f824 <- function(x){  # left inverse
    jj <- rev(x)*gradeinv(x)*cliffconj(x)
    jj <- neg(jj*x,c(1L,4L))*jj
    jj/drop(zap(jj*x))
}

Check:

zap(f824(x)*x)
zap(f822(x)*x)

It turns out that the left and right inverses coincide:

signature(0,5)
Mod(f822(x) - f824(x))
signature(1,4)
Mod(f822(x) - f824(x))
signature(2,3)
Mod(f822(x) - f824(x))
signature(3,2)
Mod(f822(x) - f824(x))
signature(4,1)
Mod(f822(x) - f824(x))

Cartan isomorphism

We will carry out Cartan's isomorphism from $Cl(p,q)$ to $Cl(p-4,q+4)$ numerically. Here we specify $p+q=7$ by calling rcliff() with argument d=7, and force $p=4$ by executing signature(4):

a <- rcliff(d=7)   # Cl(4,3)
b <- rcliff(d=7)   # Cl(4,3)
signature(4,3)     # e1^2 = e2^2 = e3^2 = e4^2 = +1; e5^2 = ... = -1
ab <- a*b          # multiplication in Cl(4,3)

signature(0,7)   # e1^2 = ... = -1
cartan(a)*cartan(b) == cartan(ab) # multiplication in Cl(0,7)

and again using cartan_inverse():

cartan_inverse(cartan(a) * cartan(b)) == ab  # precalculated product!

Now try mapping $Cl(5,2)\longrightarrow Cl(1,7)$:

signature(5,2); ab_sig5 <- a*b

signature(1,7)
cartan(a,2) * cartan(b,2)  == cartan(ab_sig5,2)
cartan_inverse(cartan(a,2) * cartan(b,2),2)  == ab_sig5


Try the clifford package in your browser

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

clifford documentation built on Aug. 14, 2022, 1:05 a.m.