The E8 root polytope (2024)

The E8 root polytope, its vertices and its edges

The E8 root polytope, also known as the \(4_{21}\) polytope is a 8-dimensional polytope. The Cartesian coordinates of its vertices are described in the above linked Wikipedia page. It has 240 vertices, that can be separated in two sets. The first set is obtained from \((\pm 2, \pm 2, 0, 0, 0, 0, 0, 0)\) by taking an arbitrary combination of the signs and an arbitrary permutation of the coordinates. This gives \(2^2 \tbinom{8}{2} = 112\) vertices, that one can obtain as follows in R:

combs <- arrangements::combinations(8L, 2L)vertices1 <- NULLfor(i in 1L:nrow(combs)){ comb <- combs[i, ] for(x in c(-2, 2)){ for(y in c(-2, 2)){ zeros <- rep(0, 8L) zeros[comb[1L]] <- x zeros[comb[2L]] <- y vertices1 <- rbind(vertices1, zeros) } }}

Indeed we get \(112\) vertices, in a matrix with stupid row names:

str(vertices1)## num [1:112, 1:8] -2 -2 2 2 -2 -2 2 2 -2 -2 ...## - attr(*, "dimnames")=List of 2## ..$ : chr [1:112] "zeros" "zeros" "zeros" "zeros" ...## ..$ : NULLhead(vertices1)## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]## zeros -2 -2 0 0 0 0 0 0## zeros -2 2 0 0 0 0 0 0## zeros 2 -2 0 0 0 0 0 0## zeros 2 2 0 0 0 0 0 0## zeros -2 0 -2 0 0 0 0 0## zeros -2 0 2 0 0 0 0 0

The second set of vertices is obtained from \((\pm 1, \ldots, \pm 1)\) by taking an even number of minus signs. As noted in the Wikipedia article, this amounts to say that the sum of the coordinates is a multiple of \(4\).

vertices2 <- NULLgrd <- as.matrix(expand.grid(rep(list(c(-1, 1)), 8L)))for(i in 1L:nrow(grd)){ v <- grd[i, ] if(sum(v) %% 4 == 0){ vertices2 <- rbind(vertices2, v) }}

This gives \(128\) vertices, again in a matrix with stupid row names:

str(vertices2)## num [1:128, 1:8] -1 1 1 -1 1 -1 -1 1 1 -1 ...## - attr(*, "dimnames")=List of 2## ..$ : chr [1:128] "v" "v" "v" "v" ...## ..$ : chr [1:8] "Var1" "Var2" "Var3" "Var4" ...head(vertices2)## Var1 Var2 Var3 Var4 Var5 Var6 Var7 Var8## v -1 -1 -1 -1 -1 -1 -1 -1## v 1 1 -1 -1 -1 -1 -1 -1## v 1 -1 1 -1 -1 -1 -1 -1## v -1 1 1 -1 -1 -1 -1 -1## v 1 -1 -1 1 -1 -1 -1 -1## v -1 1 -1 1 -1 -1 -1 -1

So here is our matrix of \(240\) vertices:

Well. Now, how to get the edges of the polytope? An edge is a pair of connected (adjacent) vertices, and it is better to store them as pairs of vertex indices (the row indices of our vertices matrix).

My first attempt was to resort to my package cxhull. Indeed, the E8 root polytope is convex, therefore its convex hull is itself, and the cxhull function of the cxhull package provides the edges of the convex hull. Therefore, I ran:

library(cxhull)hull <- cxhull(vertices, triangulate = FALSE)

What a disaster! Do not run this code! It totally crashed my laptop. Perhaps that can work with more RAM, I don’t know (I have only 8 Gb). I searched and I searched on the web, with no luck, I didn’t find these edges. So I decided to search another computational geometry library, able to get these edges. I thought of the C library cddlib. I’m not a star in C but this library is wrapped in the Julia library CDDLib.jl. No luck: this wrapper is incomplete and the vertex adjacency was not available in this library. Then I opened an issue on the Github repo to request this feature, and I looked at the documentation of the Python wrapper of cddlib: the pycddlib library. Very nice: it provides the vertex adjacency feature. I didn’t have the courage to program the construction of the vertices in Python, so I used my old blog post, “A R matrix to a Haskell list”, since it is also usable for Python instead of Haskell. But now let’s show how to construct the vertices in Python:

from itertools import product, combinationsimport numpy as npvertices = []# our `vertices1` in R:for i, j in combinations(range(8), 2): for x, y in product([-2, 2], repeat = 2): v = np.zeros(8) v[i] = x v[j] = y vertices.append(v)# our `vertices2` in R:for v in product([-1, 1], repeat = 8): if sum(v) % 4 == 0: vertices.append(v)

Actually I’m not the author of this code (I will come back to this point later). I have a long experience with R and a short experience with Python, so for me the construction of the vertices is easier in R. But I have to be honest: the Python code is more elegant.

Now, the edges. In fact pycddlib is simply called cdd in Python:

import cdd as pcdd

We want to do the so-called V-representation of the polytope (representation by the vertices), and then (I refer you to the documentation for this point), we have to prepend a \(1\) to each vertex coordinates:

vertices = np.hstack((np.ones((240, 1)), vertices))

Now we’re ready for using pycddlib. Here is how I proceeded. I used the get_input_adjacency method to get the list of adjacent vertices for each vertex and from this list I constructed a two-columns matrix Edges to store the edges as pairs of vertex indices:

# make the polytopemat = pcdd.Matrix(vertices, linear = False, number_type = "fraction") mat.rep_type = pcdd.RepType.GENERATORpoly = pcdd.Polyhedron(mat)# get the list of adjacenciesadjacencies = [list(x) for x in poly.get_input_adjacency()]# construct the matrix of edgesedges = [None]*240for i, indices in enumerate(adjacencies): indices = list(filter(lambda x: x>i, indices)) l = len(indices) col1 = np.full((l, 1), i) indices = np.reshape(indices, (l, 1)) edges[i] = np.hstack((col1, indices))Edges = np.vstack(tuple(edges))np.savetxt("E8_edges.csv", Edges, fmt = "%d", delimiter = ",")

I saved the edges matrix in a csv file to import it in R (don’t forget to add \(1\) to the indices if you do that).

In the meantime, the author of the Julia library CDDLib.jl kindly replied to my feature request, and now the vertex adjacencies are available in this library.

Projection on the Coxeter plane

That’s fine to have the vertices and the edges of a 8-dimensional polytope but it remains to project it in 2D or 3D if we want to visualize something. The most known figure of a projection of the E8 root polytope is the one of its projection to the so-called Coxeter plane. No luck, I didn’t find on the web how to do this projection. I found another one, here. The author of this article provides an orthonormal basis of a plane in the 8D space, and when one takes the two coordinates of the projections of the vertices on this plane, one gets this figure:

The E8 root polytope (1)

Not bad. Of course I did a GIF:

The E8 root polytope (2)

Finally, I found the orthonormal basis of the Coxeter plane in a Python script on Github.

Do you recognize the beginning of the code? The author of this script is also the author of the Python code I provided earlier. I was astonished: he doesn’t use any computational geometry library to get the edges! I don’t know why, but two vertices are connected by an edge if and only if the squared distance between these vertices is \(8\). So you get the edges like this in R:

edges <- NULLfor(i in 1L:(nrow(vertices)-1L)){ v1 <- vertices[i, ] for(j in (i+1L):nrow(vertices)){ v2 <- vertices[j, ] if(c(crossprod(v1-v2)) == 8){ edges <- rbind(edges, c(i, j)) } }}

Also, I don’t understand the derivation of the basis of the Coxeter plane that is provided by this Python script. But it is easy to translate it in R. Here is the code, where I kept the comments of the Python script:

# A set of simple roots, listed by the rows of 'delta'delta <- rbind( c(1, -1, 0, 0, 0, 0, 0, 0), c(0, 1, -1, 0, 0, 0, 0, 0), c(0, 0, 1, -1, 0, 0, 0, 0), c(0, 0, 0, 1, -1, 0, 0, 0), c(0, 0, 0, 0, 1, -1, 0, 0), c(0, 0, 0, 0, 0, 1, 1, 0), c(-.5, -.5, -.5, -.5, -.5, -.5, -.5, -.5), c(0, 0, 0, 0, 0, 1, -1, 0))# Dynkin diagram of E8:# 1---2---3---4---5---6---7# |# 8# where vertex i is the i-th simple root.# The Cartan matrix:Cartan <- tcrossprod(delta)# Now we split the simple roots into two disjoint sets I and J# such that the simple roots in each set are pairwise orthogonal.# It's obvious to see how to find such a partition given the# Dynkin graph above: I = [1, 3, 5, 7] and J = [2, 4, 6, 8],# since roots are not connected by an edge if and only if they are orthogonal.# Then a basis of the Coxeter plane is given by# u1 = sum (c[i] * delta[i]) for i in I,# u2 = sum (c[j] * delta[j]) for j in J,# where c is an eigenvector for the minimal# eigenvalue of the Cartan matrix.eig <- eigen(Cartan)# The eigenvalues returned by eigen() are in descending order# and the eigenvectors are listed by columns.ev <- eig$vectors[, 8L]u1 <- rowSums(vapply(c(1L, 3L, 5L, 7L), function(i){ ev[i] * delta[i, ]}, numeric(8L)))u2 <- rowSums(vapply(c(2L, 4L, 6L, 8L), function(i){ ev[i] * delta[i, ]}, numeric(8L)))# Gram-Schmidt u1, u2 u1 <- u1 / sqrt(c(crossprod(u1)))u2 <- u2 - c(crossprod(u1, u2)) * u1u2 <- u2 / sqrt(c(crossprod(u2)))

I understand nothing, except the Gram-Schmidt step.

But this works. Let’s project the vertices to the Coxeter plane, i.e.the plane with the orthonormal basis \((u_1, u_2)\):

# projections on the Coxeter planeproj <- function(v){ c(c(crossprod(v, u1)), c(crossprod(v, u2)))}points <- t(apply(vertices/2, 1L, proj))

Now you can represent these 2D points and connect them with the edges. But if you do that with an ordinary base R plot, you will not get a pretty figure, because there are too many edges. So I do a SVG plot:

# save plot as SVGsvg(filename = "E8_Coxeter.svg", onefile = TRUE)opar <- par(mar = c(0, 0, 0, 0))plot( points[!duplicated(points), ], pch = 19, cex = 0.3, asp = 1, axes = FALSE, xlab = NA, ylab = NA)for(i in 1L:nrow(edges)){ lines(points[edges[i, ], ], lwd = 0.1)}par(opar)dev.off()

And then I convert it to a PNG image with the help of the rsvg package:

rsvg::rsvg_png("E8_Coxeter.svg", file = "E8_Coxeter.png")

This gives this image:

The E8 root polytope (3)

Rather pretty. But this lacks of colors. And of motion. Well, you see what I mean: I did a GIF.

The E8 root polytope (4)

If you want to know how I did this GIF, visit my gist.

The E8 root polytope (2024)

FAQs

The E8 root polytope? ›

The E8 root system consists of 240 vectors in an eight-dimensional space. See what is E8? Those vectors are the vertices (corners) of an eight-dimensional object called the Gosset polytope 421. In the 1960s, Peter McMullen drew (by hand) a 2-dimensional representation of the Gosset polytope 421.

What is the root lattice of E8? ›

The E8 lattice is the root lattice of the semisimple exceptional Lie algebra E8. The quo- tient of Λ8 by a suitable sublattice is isomorphic to the Hamming binary code of dimension 8 and minimum distance 4, which in its turn is an optimal error-correcting binary code with these para- meters.

What is the E8 structure in math? ›

In the so-called even coordinate system, E8 is given as the set of all vectors in R8 with length squared equal to 2 such that coordinates are either all integers or all half-integers and the sum of the coordinates is even.

What is E8 symmetry? ›

Mathematicians discovered a complex 248-dimensional symmetry called E8 in the late 1800s. The dimensions in the structure are not necessarily spatial, like the three dimensions we live in, but they correspond to mathematical degrees of freedom, where each dimension represents a different variable.

What is the E8 lattice matrix? ›

In mathematics, the E8 lattice is a special lattice in R8. It can be characterized as the unique positive-definite, even, unimodular lattice of rank 8. The name derives from the fact that it is the root lattice of the E8 root system.

What is the E8 root system? ›

The E8 root system consists of 240 vectors in an eight-dimensional space. See what is E8? Those vectors are the vertices (corners) of an eight-dimensional object called the Gosset polytope 421. In the 1960s, Peter McMullen drew (by hand) a 2-dimensional representation of the Gosset polytope 421.

What is the basis of the E8 lattice? ›

Definition

The E 8 -lattice may be presented as the linear span with integer coefficients of the following basis vectors in the real vector space ℝ 8 : ( 1 , − 1 , 0 , 0 , 0 , 0 , 0 , 0 ) ( 0 , 1 , − 1 , 0 , 0 , 0 , 0 , 0 )

What is the E8 pattern in math? ›

E8 is a "Lie group", that is an abstract concept of symmetry, that is found in a "ball" of 240 points in 8 dimensional space. (there are 254 other "balls" but this is the better know one). A Lie group is a "group" that is at the same time also a "Differentiable Manifold".

What is the E8 theory of math? ›

Overview. The goal of E8 Theory is to describe all elementary particles and their interactions, including gravitation, as quantum excitations of a single Lie group geometry—specifically, excitations of the noncompact quaternionic real form of the largest simple exceptional Lie group, E8.

What is E8 classification? ›

Enlisted
paygrade
SergeantSgtE-5
Staff SergeantSSgtE-6
Gunnery SergeantGySgtE-7
Master SergeantMSgtE-8
8 more rows

What is E8? ›

E8 is a 248-dimensional Lie algebra. Start with the 8 coordinates above, and add a coordinate for each of the 240 roots of the E8 root system. This vector space has an operation on it, called the Lie bracket: if X,Y are in the Lie algebra so is the Lie bracket [X,Y].

What is the theta function of the E8 lattice? ›

The theta function for the E8 root lattice isθE8(τ)=∑τ∈Γ8q|λ|2/2,q=e2πiτ.

What is the automorphism group of E8 lattice? ›

As the notation suggests, it is also the root lattice of the E8 root system (which is the largest exceptional root system). The Weyl group of E8, denoted W(E8), is the group of automorphisms of the E8 lattice; it is a finite group of order 696,729,600.

What is the E8 root polytope? ›

The 421 polytope has 17,280 7-simplex and 2,160 7-orthoplex facets, and 240 vertices. Its vertex figure is the 321 polytope. As its vertices represent the root vectors of the simple Lie group E8, this polytope is sometimes referred to as the E8 root polytope.

What does E8 mean in math? ›

The power of 10: The "E8" part indicates the power of 10. The "E" stands for exponent, and the number after it (8 in this case) represents the power to which 10 is raised. So, when we put it all together, 1.5E8 means 1.5 multiplied by 10 raised to the power of 8.

What is the E8 crystal? ›

We begin with an 8-dimensional crystal called the E8 lattice. The E8 lattice is an 8D point set representing the densest packing of spheres in 8D.

Top Articles
Latest Posts
Article information

Author: Arielle Torp

Last Updated:

Views: 5295

Rating: 4 / 5 (41 voted)

Reviews: 80% of readers found this page helpful

Author information

Name: Arielle Torp

Birthday: 1997-09-20

Address: 87313 Erdman Vista, North Dustinborough, WA 37563

Phone: +97216742823598

Job: Central Technology Officer

Hobby: Taekwondo, Macrame, Foreign language learning, Kite flying, Cooking, Skiing, Computer programming

Introduction: My name is Arielle Torp, I am a comfortable, kind, zealous, lovely, jolly, colorful, adventurous person who loves writing and wants to share my knowledge and understanding with you.