Jordan algebras in R

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 • y. Package idiom is to use an asterisk, as in x*y. Following McCrimmon (1978), there are five types of Jordan algebras:

  • type 1: Real symmetric matrices, class real_symmetric_matrix, abbreviated in the package to rsm
  • type 2: Complex Hermitian matrices, class complex_herm_matrix, abbreviated to chm
  • type 3: Quaternionic Hermitian matrices, class quaternion_herm_matrix, abbreviated to qhm
  • type 4: Albert algebras, the space of 3 × 3 Hermitian octonionic matrices, class albert
  • type 5: Spin factors, class spin

(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 × 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 • 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) ≠ (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 ℝ ⊕ ℝn, with addition and multiplication defined by

α(a, a) = (αa, αa)

(a, a) + (b, b) = (a + b, a + b)

(a, a) × (b, b) = (ab + ⟨a, b⟩, ab + ba)

where a, b, α ∈ ℝ, and a, b ∈ ℝn. Here ⟨⋅, ⋅⟩ is an inner product defined on n (by default we have ⟨(x1, …, xn), (y1, …, yn)⟩ = ∑xiyi but this is configurable in the package).

So if we have ℐ, 𝒥, 𝒦 spin factor elements it is clear that ℐ𝒥 = 𝒥ℐ and ℐ(𝒥 + 𝒦) = ℐ𝒥 + ℐ𝒦. 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 × 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 × 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

Ux(y) = 2x(xy) − (xx)y

{x, y, z} = 2(x(yz) + (xy)z − (xz)y)

(it can be shown that Jacobson’s identity UUx(y) = UxUyUx holds), Glennie’s identities are

H8(x, y, z) = H8(y, x, z)   H9(x, y, z) = H9(y, x, z)

(see McCrimmon 2004 for details), where

H8(x, y, z) = {UxUy(z), z, xy} − UxUyUz(xy)

and H9(x, y, z) = 2Ux(z)Uy, xUz(yy) − UxUzUx, yUy(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 G8 and G9 identities.

Numerical verification of G8

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 G9

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).