The hardware and bandwidth for this mirror is donated by METANET, the Webhosting and Full Service-Cloud Provider.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]metanet.ch.

Jordan algebras in R

Robin K. S. Hankin

To cite the jordan package in publications please use Hankin (2023). Jordan algebras were originally introduced by Pascual Jordan in 1933 as an attempt to axiomatize observables in quantum mechanics. Formally, a Jordan algebra is a non-associative algebra over the reals with a bilinear multiplication that satisfies the following identities:

\[xy=yx\]

\[(xy)(xx)=x(y(xx))\]

(the second identity is known as the Jordan identity). In literature, multiplication is usually indicated by juxtaposition but one sometimes sees \(x\bullet y\). Package idiom is to use an asterisk, as in x*y. Following McCrimmon (1978), there are five types of Jordan algebras:

(of course, the first two are special cases of the next). The jordan package provides functionality to manipulate jordan objects using natural R idiom. Objects of all these classes are stored in matrix form with columns being elements of the jordan algebra. The first four classes are matrix-based in the sense that the algebraic objects are symmetric or Hermitian matrices (the S4 class is jordan_matrix). The fifth class, spin factors, is not matrix based.

Matrix-based Jordan algebras, types 1,2,3

The four matrix-based Jordan algebras have elements which are square matrices. The first three classes are real (symmetric) matrices, complex (Hermitian) matrices, and quaternionic (Hermitian); type 4 is considered separately at the end. Types 1,2, and 3 all behave in the same way from a package idiom perspective. Consider:

x <- rrsm()  # "Random Real Symmetric Matrix"
y <- rrsm()  
z <- rrsm()  
x
## Vector of real symmetric matrices with entries
##         [1]   [2]   [3] 
##  [1,]  1.26 -0.41 -0.24 
##  [2,] -0.33  0.25 -0.54 
##  [3,]  1.33 -0.89 -0.43 
##  [4,]  1.27  0.44 -0.65 
##  [5,]  0.41 -1.24  0.73 
## ....................... 
## [11,]  0.76  0.50  1.76 
## [12,] -0.80  1.09  0.56 
## [13,] -1.15 -0.69 -0.45 
## [14,] -0.29 -1.28 -0.83 
## [15,] -0.30  0.05 -1.17

Object x is a three-element vector, with each element being a column. Each element corresponds to a \(5\times 5\) symmetric matrix (because rrsm() has d=5 by default, specifying the size of the matrix). Thus each element has \(5*(5+1)/2=15\) degrees of freedom, as indicated by the row labelling. Addition and multiplication of a Jordan object with a scalar are defined:

x*100
## Vector of real symmetric matrices with entries
##        [1]  [2]  [3] 
##  [1,]  126  -41  -24 
##  [2,]  -33   25  -54 
##  [3,]  133  -89  -43 
##  [4,]  127   44  -65 
##  [5,]   41 -124   73 
## .................... 
## [11,]   76   50  176 
## [12,]  -80  109   56 
## [13,] -115  -69  -45 
## [14,]  -29 -128  -83 
## [15,]  -30    5 -117
x + y*3
## Vector of real symmetric matrices with entries
##         [1]   [2]   [3] 
##  [1,] -1.95  0.67  3.06 
##  [2,] -5.01  0.22 -0.12 
##  [3,]  4.81 -3.71 -0.79 
##  [4,]  3.76  0.08 -3.38 
##  [5,] -0.28 -3.67 -3.59 
## ....................... 
## [11,]  1.51  0.56  0.50 
## [12,]  1.06  1.87  3.56 
## [13,] -1.66 -2.64 -1.29 
## [14,] -6.95 -1.64  2.95 
## [15,] -4.08  2.03  0.78
x + 100
## Vector of real symmetric matrices with entries
##          [1]    [2]    [3] 
##  [1,] 101.26  99.59  99.76 
##  [2,]  99.67 100.25  99.46 
##  [3,] 101.33  99.11  99.57 
##  [4,] 101.27 100.44  99.35 
##  [5,] 100.41  98.76 100.73 
## .......................... 
## [11,] 100.76 100.50 101.76 
## [12,]  99.20 101.09 100.56 
## [13,]  98.85  99.31  99.55 
## [14,]  99.71  98.72  99.17 
## [15,]  99.70 100.05  98.83

(the last line is motivated by analogy with M + x, for M a matrix and x a scalar). Jordan objects may be multiplied using the rule \(x\bullet y=(xy+yx)/2\):

x*y
## Vector of real symmetric matrices with entries
##            [1]      [2]      [3] 
##  [1,]  0.76410 -0.73630  0.75020 
##  [2,] -2.95485 -0.11655  0.69915 
##  [3,]  0.75970  2.17000 -0.84630 
##  [4,] -0.74050 -0.61915  0.44255 
##  [5,] -0.99495  0.58665 -0.43270 
## ................................ 
## [11,]  0.25850  1.06925  2.00600 
## [12,] -0.20925  0.17605 -0.78365 
## [13,]  1.54600 -1.09150  0.20655 
## [14,] -3.00675 -0.94800 -0.24035 
## [15,]  0.91130  0.92850 -1.85950

We may verify that the distributive law is obeyed:

x*(y+z) - (x*y + x*z)
## Vector of real symmetric matrices with entries
##                 [1]           [2]           [3] 
##  [1,]  0.000000e+00  0.000000e+00  0.000000e+00 
##  [2,]  0.000000e+00 -2.220446e-16  3.330669e-16 
##  [3,]  2.220446e-16  4.440892e-16  0.000000e+00 
##  [4,] -2.220446e-16  0.000000e+00  0.000000e+00 
##  [5,]  0.000000e+00 -1.110223e-16 -5.551115e-17 
## ............................................... 
## [11,]  2.220446e-16  0.000000e+00 -1.110223e-16 
## [12,] -6.661338e-16  2.220446e-16 -6.938894e-17 
## [13,] -4.440892e-16 -2.220446e-16  4.440892e-16 
## [14,]  0.000000e+00 -1.110223e-16  4.440892e-16 
## [15,]  4.440892e-16  3.330669e-16 -1.110223e-16

(that is, zero to numerical precision). Further, we may observe that the resulting algebra is not associative:

LHS <- x*(y*z)
RHS <- (x*y)*z
LHS-RHS
## Vector of real symmetric matrices with entries
##              [1]         [2]        [3] 
##  [1,] -2.1017565 -1.19444550  0.7294260 
##  [2,]  0.9831145  1.50253975 -0.9596110 
##  [3,] -3.2116185 -0.89286100 -4.1190580 
##  [4,]  0.2891320  1.10998775 -1.5859828 
##  [5,] -1.8515115 -0.09683025 -0.8515705 
## ....................................... 
## [11,] -0.2235020 -0.74325575  1.3072258 
## [12,] -1.2445235  0.49372175 -0.2215460 
## [13,]  0.1555398  0.27185050 -1.4434697 
## [14,] -0.2530977 -0.70312400 -0.8658505 
## [15,]  2.5612200 -0.15260950  1.8237820

showing numerically that \(x(yz)\neq(xy)z\). However, the Jordan identity \((xy)(xx) = x(y(xx))\) is satisfied:

LHS <- (x*y)*(x*x)
RHS <- x*(y*(x*x))
LHS-RHS
## Vector of real symmetric matrices with entries
##                 [1]           [2]           [3] 
##  [1,]  5.329071e-15 -2.220446e-16  0.000000e+00 
##  [2,]  0.000000e+00  0.000000e+00  0.000000e+00 
##  [3,] -8.881784e-16  0.000000e+00  4.718448e-16 
##  [4,]  2.664535e-15 -4.440892e-16 -1.110223e-15 
##  [5,]  3.552714e-15 -4.440892e-16  8.881784e-16 
## ............................................... 
## [11,]  0.000000e+00  0.000000e+00  0.000000e+00 
## [12,]  2.664535e-15  6.661338e-16 -8.881784e-16 
## [13,] -1.776357e-15  0.000000e+00  1.332268e-15 
## [14,]  3.552714e-15 -4.440892e-16  0.000000e+00 
## [15,]  0.000000e+00 -8.881784e-16 -3.552714e-15

(the entries are zero to numerical precision). If we wish to work with the matrix itself, a single element may be coerced with as.1matrix():

M1 <- as.1matrix(x[1])
(M2 <- as.1matrix(x[2]))
##       [,1]  [,2]  [,3]  [,4]  [,5]
## [1,] -0.41  0.25  0.44  0.38  0.50
## [2,]  0.25 -0.89 -1.24  0.13  1.09
## [3,]  0.44 -1.24 -0.22  0.80 -0.69
## [4,]  0.38  0.13  0.80 -0.06 -1.28
## [5,]  0.50  1.09 -0.69 -1.28  0.05

(in the above, observe how the matrix is indeed symmetric). We may verify that the multiplication rule is indeed being correctly applied:

(M1 %*% M2 + M2 %*% M1)/2 - as.1matrix(x[1]*x[2])
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    0    0    0    0    0
## [2,]    0    0    0    0    0
## [3,]    0    0    0    0    0
## [4,]    0    0    0    0    0
## [5,]    0    0    0    0    0

It is also possible to verify that symmetry is closed under the Jordan operation:

jj <- as.1matrix(x[1]*x[2])
jj-t(jj)
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    0    0    0    0    0
## [2,]    0    0    0    0    0
## [3,]    0    0    0    0    0
## [4,]    0    0    0    0    0
## [5,]    0    0    0    0    0

The other matrix-based Jordan algebras are similar but differ in the details of the coercion. Taking quaternionic matrices:

as.1matrix(rqhm(n=1,d=2))
##    [1,1] [2,1] [1,2] [2,2]
## Re -0.96 -0.96 -0.96 -1.23
## i   0.00  0.87 -0.87  0.00
## j   0.00  0.91 -0.91  0.00
## k   0.00 -0.74  0.74  0.00
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4

above we see the matrix functionality of the onion package being used. See how the matrix is Hermitian (elements [1,2] and [2,1] are conjugate; elements [1,1] and [2,2] are pure real). Verifying the Jordan identity would be almost the same as above:

x <- rqhm()
y <- rqhm()
(x*y)*(x*x) - x*(y*(x*x))
## Vector of quaternionic Hermitian matrices with entries
##                 [1]           [2]           [3] 
##  [1,]  3.552714e-15  1.421085e-14  0.000000e+00 
##  [2,] -2.131628e-14  1.421085e-14  3.552714e-15 
##  [3,]  0.000000e+00  0.000000e+00  0.000000e+00 
##  [4,]  5.329071e-15 -2.664535e-15 -7.105427e-15 
##  [5,]  0.000000e+00  0.000000e+00  2.842171e-14 
## ............................................... 
## [41,]  8.437695e-15  8.881784e-15  0.000000e+00 
## [42,] -1.421085e-14  0.000000e+00  5.329071e-15 
## [43,] -7.105427e-15  1.421085e-14  8.881784e-15 
## [44,] -3.552714e-15 -7.105427e-15  0.000000e+00 
## [45,] -1.421085e-14  0.000000e+00  7.105427e-15

Above, we see that the difference is very small.

Spin factors, type 5

The first four types of Jordan algebras are all matrix-based with either real, complex, quaternionic, or octonionic entries.

The fifth type, spin factors, are slightly different from a package idiom perspective. Mathematically, elements are of the form \(\mathbb{R}\oplus\mathbb{R}^n\), with addition and multiplication defined by

\[\alpha(a,\mathbf{a}) = (\alpha a,\alpha\mathbf{a})\]

\[(a,\mathbf{a}) + (b,\mathbf{b}) = (a+b,\mathbf{a} + \mathbf{b})\]

\[(a,\mathbf{a}) \times (b,\mathbf{b}) = (ab+\left\langle\mathbf{a},\mathbf{b}\right\rangle,a\mathbf{b} + b\mathbf{a})\]

where \(a,b,\alpha\in\mathbb{R}\), and \(\mathbf{a},\mathbf{b}\in\mathbb{R}^n\). Here \(\left\langle\cdot,\cdot\right\rangle\) is an inner product defined on \(\mathbb{R}^n\) (by default we have \(\left\langle(x_1,\ldots, x_n),(y_1,\ldots, y_n)\right\rangle=\sum x_iy_i\) but this is configurable in the package).

So if we have \(\mathcal{I},\mathcal{J},\mathcal{K}\) spin factor elements it is clear that \(\mathcal{I}\mathcal{J}=\mathcal{J}\mathcal{I}\) and \(\mathcal{I}(\mathcal{J}+\mathcal{K}) = \mathcal{I}\mathcal{J} + \mathcal{I}\mathcal{K}\). The Jordan identity is not as easy to see but we may verify all the identities numerically:

I <- rspin()
J <- rspin()
K <- rspin()
I
## Vector of spin objects with entries
##       [1]   [2]   [3] 
##  r   0.14  0.91 -1.80 
## [1] -0.34  1.14  0.37 
## [2]  0.61  0.01 -0.38 
## [3]  1.34 -1.11  0.65 
## [4]  0.77 -0.03  2.06 
## [5]  0.19 -0.16 -1.80
I*J - J*I   # commutative:
## Vector of spin objects with entries
##     [1] [2] [3] 
##  r    0   0   0 
## [1]   0   0   0 
## [2]   0   0   0 
## [3]   0   0   0 
## [4]   0   0   0 
## [5]   0   0   0
I*(J+K) - (I*J + I*K)  # distributive:
## Vector of spin objects with entries
##              [1]           [2]          [3] 
##  r  4.440892e-16  0.000000e+00 1.776357e-15 
## [1] 5.551115e-17 -8.881784e-16 0.000000e+00 
## [2] 1.110223e-16  0.000000e+00 0.000000e+00 
## [3] 4.440892e-16 -2.220446e-16 0.000000e+00 
## [4] 2.220446e-16  4.440892e-16 0.000000e+00 
## [5] 2.775558e-17  4.440892e-16 0.000000e+00
I*(J*K) - (I*J)*K  # not associative:
## Vector of spin objects with entries
##               [1]           [2]       [3] 
##  r  -2.220446e-16 -4.440892e-16  0.000000 
## [1] -3.900790e-01 -1.625974e+00 -1.756489 
## [2]  8.775930e-01  8.771170e-01 -5.327674 
## [3]  2.349792e+00 -1.888707e+00  5.749035 
## [4]  1.525986e+00 -1.707510e-01  3.378938 
## [5]  4.767830e-01  5.984960e-01 -3.509500
(I*J)*(I*I) - I*(J*(I*I))  # Obeys the Jordan identity
## Vector of spin objects with entries
##               [1]           [2]           [3] 
##  r   6.661338e-16  0.000000e+00  0.000000e+00 
## [1] -2.220446e-16  0.000000e+00  0.000000e+00 
## [2]  0.000000e+00  8.881784e-16 -1.776357e-15 
## [3]  4.440892e-16  0.000000e+00  0.000000e+00 
## [4]  2.220446e-16 -8.881784e-16  0.000000e+00 
## [5]  0.000000e+00  0.000000e+00  1.421085e-14

Albert algebras, type 4

Type 4 Jordan algebra corresponds to \(3\times 3\) Hermitian matrices with octonions for entries. This is class albert in the package. Note that octonionic Hermitian matrices of order 4 or above do not satisfy the Jordan identity and are therefore not Jordan algebras: there is a numerical illustration of this fact in the onion package vignette. We may verify the Jordan identity for \(3\times 3\) octonionic Hermitian matrices using package class albert:

x <- ralbert()
y <- ralbert()
x
## Vector of Albert matrices with entries
##          [1]   [2]   [3]
##     d1 -0.18 -0.26  0.03
##     d2  1.45 -0.06 -1.03
##     d3 -0.61 -0.45 -0.98
## Re(o1)  0.68  0.07  0.00
##  i(o1) -0.09 -0.15 -0.23
##  j(o1) -0.49 -0.83 -0.50
##  k(o1)  1.41  0.76  1.55
##  l(o1) -0.22 -0.58  0.09
## il(o1) -0.21 -0.63  1.32
## jl(o1)  0.70  0.48 -0.98
## kl(o1)  0.92  1.70 -0.25
## Re(o2) -0.92 -1.76 -1.40
##  i(o2)  1.15  0.20  1.44
##  j(o2) -0.64  0.40 -0.98
##  k(o2) -0.89  0.03  1.47
##  l(o2) -2.33  2.56 -0.99
## il(o2) -0.15  1.26 -0.09
## jl(o2)  0.32 -0.53 -2.88
## kl(o2) -0.71 -0.63 -0.25
## Re(o3)  1.24  0.91  0.01
##  i(o3)  0.62  1.01 -1.92
##  j(o3)  0.10  0.72 -0.29
##  k(o3)  1.81 -0.60 -0.35
##  l(o3) -1.50  0.54 -1.84
## il(o3)  0.29 -0.08  0.90
## jl(o3)  0.85  1.85 -1.21
## kl(o3) -1.00 -0.85 -0.22
(x*y)*(x*x)-x*(y*(x*x)) # Jordan identity:
## Vector of Albert matrices with entries
##                  [1]           [2]           [3]
##     d1  1.421085e-14 -7.105427e-15  0.000000e+00
##     d2  1.421085e-14 -1.421085e-14  0.000000e+00
##     d3  2.842171e-14  1.421085e-14  0.000000e+00
## Re(o1) -1.776357e-15  8.881784e-16  2.131628e-14
##  i(o1) -7.105427e-15 -1.065814e-14  1.421085e-14
##  j(o1)  7.105427e-15  3.552714e-15  7.105427e-15
##  k(o1)  0.000000e+00  0.000000e+00 -7.105427e-15
##  l(o1)  7.105427e-15  0.000000e+00  5.329071e-15
## il(o1)  7.105427e-15 -3.552714e-15 -1.421085e-14
## jl(o1)  0.000000e+00 -7.105427e-15 -7.105427e-15
## kl(o1) -7.105427e-15 -1.421085e-14 -1.421085e-14
## Re(o2)  1.065814e-14 -1.421085e-14  0.000000e+00
##  i(o2)  0.000000e+00 -7.105427e-15 -7.105427e-15
##  j(o2)  0.000000e+00  0.000000e+00  1.421085e-14
##  k(o2)  1.421085e-14 -8.881784e-16 -2.842171e-14
##  l(o2) -7.105427e-15  0.000000e+00 -7.105427e-15
## il(o2) -7.105427e-15  0.000000e+00  0.000000e+00
## jl(o2) -3.552714e-15 -3.552714e-15 -1.421085e-14
## kl(o2)  3.552714e-15  1.776357e-15  9.769963e-15
## Re(o3)  3.552714e-15  0.000000e+00 -1.421085e-14
##  i(o3) -1.065814e-14  1.065814e-14  2.842171e-14
##  j(o3) -3.552714e-15  0.000000e+00 -7.105427e-15
##  k(o3) -5.107026e-15 -3.552714e-15 -7.105427e-15
##  l(o3)  8.881784e-15  1.421085e-14 -7.105427e-15
## il(o3)  1.776357e-14 -7.105427e-15 -1.421085e-14
## jl(o3)  0.000000e+00  0.000000e+00  1.421085e-14
## kl(o3)  7.105427e-15  0.000000e+00 -1.065814e-14

Special identities

In 1963, C. M. Glennie discovered a pair of identities satisfied by special Jordan algebras but not the Albert algebra. Defining

\[ U_x(y) = 2x(xy)-(xx)y \]

\[ \left\lbrace x,y,z\right\rbrace= 2(x(yz)+(xy)z - (xz)y) \]

(it can be shown that Jacobson’s identity \(U_{U_x(y)}=U_xU_yU_x\) holds), Glennie’s identities are

\[ H_8(x,y,z)=H_8(y,x,z)\qquad H_9(x,y,z)=H_9(y,x,z) \]

(see McCrimmon 2004 for details), where

\[ H_8(x,y,z)= \left\lbrace U_x U_y(z),z, xy\right\rbrace-U_xU_yU_z(xy) \]

and \[ H_9(x,y,z)= 2U_x(z) U_{y,x}U_z(yy)-U_x U_z U_{x,y} U_y(z) \]

Numerical verification of Jacobson

We may verify Jacobson’s identity:

U <- function(x){function(y){2*x*(x*y)-(x*x)*y}}
diff <- function(x,y,z){
     LHS <- U(x)(U(y)(U(x)(z)))
     RHS <- U(U(x)(y))(z)
     return(LHS-RHS)  # zero if Jacobson holds
}

Then we may numerically verify Jacobson for type 3-5 Jordan algebras:

diff(ralbert(),ralbert(),ralbert())  # Albert algebra obeys Jacobson:
## Vector of Albert matrices with entries
##                  [1]           [2]           [3]
##     d1  4.547474e-13  2.273737e-13  1.818989e-12
##     d2  7.958079e-13  1.591616e-12  0.000000e+00
##     d3  1.250555e-12 -4.547474e-13  3.637979e-12
## Re(o1) -1.136868e-13 -1.364242e-12  4.547474e-13
##  i(o1) -4.547474e-13 -2.273737e-13 -1.818989e-12
##  j(o1) -3.410605e-13  2.273737e-13  1.591616e-12
##  k(o1) -5.115908e-13  0.000000e+00 -1.364242e-12
##  l(o1)  2.273737e-13 -1.136868e-13  0.000000e+00
## il(o1)  5.684342e-13 -4.547474e-13  9.094947e-13
## jl(o1) -9.094947e-13  7.105427e-13 -1.364242e-12
## kl(o1) -6.821210e-13 -6.252776e-13 -1.818989e-12
## Re(o2)  1.136868e-13  0.000000e+00 -9.094947e-13
##  i(o2)  4.547474e-13  7.958079e-13  0.000000e+00
##  j(o2)  2.273737e-13 -1.136868e-13 -1.818989e-12
##  k(o2)  1.136868e-13  3.410605e-13  4.092726e-12
##  l(o2)  1.136868e-13  2.273737e-13  4.547474e-12
## il(o2)  2.273737e-13 -2.273737e-13  1.932676e-12
## jl(o2)  1.136868e-13  6.821210e-13 -4.547474e-13
## kl(o2)  2.273737e-13  2.273737e-13 -6.821210e-13
## Re(o3) -2.273737e-13  2.273737e-13  9.094947e-13
##  i(o3) -7.105427e-15 -9.094947e-13 -1.818989e-12
##  j(o3) -1.136868e-12  0.000000e+00  4.547474e-13
##  k(o3) -4.547474e-13 -4.547474e-13  4.547474e-13
##  l(o3)  1.364242e-12 -1.136868e-13  4.547474e-13
## il(o3)  5.684342e-13 -3.410605e-13 -9.094947e-13
## jl(o3)  0.000000e+00 -5.684342e-13 -1.136868e-12
## kl(o3)  1.136868e-13 -1.136868e-13  0.000000e+00
diff(rqhm(),rqhm(),rqhm()) # Quaternion Jordan algebra obeys Jacobson:
## Vector of quaternionic Hermitian matrices with entries
##                 [1]           [2]           [3] 
##  [1,]  2.728484e-12 -3.183231e-12 -4.547474e-12 
##  [2,]  4.774847e-12  2.728484e-12 -4.547474e-12 
##  [3,]  0.000000e+00 -5.911716e-12 -5.911716e-12 
##  [4,]  1.818989e-12 -2.728484e-12 -7.275958e-12 
##  [5,] -3.637979e-12 -5.456968e-12 -9.094947e-13 
## ............................................... 
## [41,]  1.364242e-12  4.092726e-12 -9.094947e-13 
## [42,]  3.637979e-12  1.818989e-12  0.000000e+00 
## [43,] -1.818989e-12  1.818989e-12 -9.094947e-13 
## [44,]  2.273737e-13 -1.364242e-12  3.183231e-12 
## [45,] -1.818989e-12  1.818989e-12  4.547474e-12
diff(rspin(),rspin(),rspin()) # spin factors obey Jacobson:
## Vector of spin objects with entries
##               [1]           [2]           [3] 
##  r   1.421085e-14 -5.151435e-14  0.000000e+00 
## [1] -7.105427e-15  2.131628e-14  2.273737e-13 
## [2]  0.000000e+00 -3.552714e-15 -1.136868e-13 
## [3]  7.105427e-15  1.998401e-14  1.136868e-13 
## [4]  0.000000e+00  5.329071e-15  2.131628e-13 
## [5]  0.000000e+00 -7.105427e-15 -5.684342e-14

showing agreement to numerical accuracy (the output is close to zero). We can now verify Glennie’s \(G_8\) and \(G_9\) identities.

Numerical verification of \(G_8\)

B <- function(x,y,z){2*(x*(y*z) + (x*y)*z - (x*z)*y)}  # bracket function
H8 <- function(x,y,z){B(U(x)(U(y)(z)),z,x*y) - U(x)(U(y)(U(z)(x*y)))}
G8 <- function(x,y,z){H8(x,y,z)-H8(y,x,z)}

and so we verify for type 3 and type 5 Jordans:

G8(rqhm(1),rqhm(1),rqhm(1))   # Quaternion Jordan algebra obeys G8:
## Vector of quaternionic Hermitian matrices with entries
##                 [1] 
##  [1,]  0.000000e+00 
##  [2,]  4.547474e-13 
##  [3,] -5.456968e-12 
##  [4,] -9.094947e-13 
##  [5,]  2.182787e-11 
## ................... 
## [41,] -1.818989e-11 
## [42,] -5.456968e-12 
## [43,]  4.547474e-12 
## [44,] -1.818989e-12 
## [45,] -1.455192e-11
G8(rspin(1),rspin(1),rspin(1)) # Spin factors obey G8:
## Vector of spin objects with entries
##                 a 
##  r  -7.105427e-15 
## [1]  0.000000e+00 
## [2] -7.105427e-15 
## [3] -7.105427e-15 
## [4] -1.421085e-14 
## [5]  2.842171e-14

again showing acceptable accuracy. The identity is not true for Albert algebras:

G8(ralbert(1),ralbert(1),ralbert(1)) # Albert algebra does not obey G8:
## Vector of Albert matrices with entries
##               [1]
##     d1  -3548.756
##     d2   4725.027
##     d3  -1176.271
## Re(o1)  -9656.596
##  i(o1)   2084.501
##  j(o1)  -3042.062
##  k(o1) -11955.928
##  l(o1)   9874.819
## il(o1)  13939.995
## jl(o1)   2402.327
## kl(o1)  10258.985
## Re(o2)  -1897.960
##  i(o2) -18147.457
##  j(o2)  -9749.166
##  k(o2)  -5105.221
##  l(o2)   9852.301
## il(o2) -19952.518
## jl(o2)  -8786.434
## kl(o2)  -5976.901
## Re(o3)  12797.129
##  i(o3)  -5849.865
##  j(o3) -11008.285
##  k(o3)  -6832.751
##  l(o3)  12261.710
## il(o3)   5024.401
## jl(o3) -12186.564
## kl(o3)   -637.169

Numerical verification of \(G_9\)

L <- function(x){function(y){x*y}}
U <- function(x){function(y){2*x*(x*y)-(x*x)*y}}
U2 <- function(x,y){function(z){L(x)(L(y)(z)) + L(y)(L(x)(z)) - L(x*y)(z)}}
H9 <- function(x,y,z){2*U(x)(z)*U2(y,x)(U(z)(y*y)) - U(x)(U(z)(U2(x,y)(U(y)(z))))}
G9 <- function(x,y,z){H9(x,y,z)-H9(y,x,z)}

Then we may verify the G9() identity for type 3 Jordans:

G9(rqhm(1),rqhm(1),rqhm(1))  # Quaternion Jordan algebra obeys G9:
## Vector of quaternionic Hermitian matrices with entries
##                 [1] 
##  [1,]  1.164153e-10 
##  [2,]  2.037268e-10 
##  [3,] -1.455192e-10 
##  [4,]  2.619345e-10 
##  [5,]  2.328306e-10 
## ................... 
## [41,] -5.820766e-11 
## [42,]  0.000000e+00 
## [43,]  8.731149e-11 
## [44,] -4.365575e-11 
## [45,] -1.455192e-10

However, the Albert algebra does not satisfy the identity:

G9(ralbert(1),ralbert(1),ralbert(1)) # Albert algebra does not obey G9:
## Vector of Albert matrices with entries
##                  [1]
##     d1   -7266.86356
##     d2   -8376.22006
##     d3 -176129.29514
## Re(o1)   63698.82453
##  i(o1) -113610.70700
##  j(o1)   18397.47508
##  k(o1)  -18360.14034
##  l(o1)  -53650.05517
## il(o1)    1693.22231
## jl(o1)   39312.82572
## kl(o1)   17003.00532
## Re(o2)  -43832.17576
##  i(o2)   15565.01374
##  j(o2)  -15984.80486
##  k(o2)   -5800.22870
##  l(o2)  -39014.58190
## il(o2)  -53929.49807
## jl(o2)  -47641.08428
## kl(o2)    7133.31837
## Re(o3)   12983.12738
##  i(o3)  -32369.08213
##  j(o3)     -85.85214
##  k(o3)     997.06029
##  l(o3)   44319.51887
## il(o3)  -32342.86674
## jl(o3)   46682.35665
## kl(o3)   40460.20737

References

Hankin, Robin K. S. 2023. “Jordan Algebra in R.” arXiv. https://doi.org/10.48550/arXiv.2303.06062.
McCrimmon, K. 1978. “Jordan Algebras and Their Applications.” Bulletin of the American Mathematical Society 84 (4).

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.