As For the Other Shapes…

Shape \(A_n\) as described on the previous page is just one of many root polytopes! For our research purposes, we will only be considering the shapes \(A_n, B_n, C_n,\) \(and\) \(D_n\), since these shapes can take on any number of n dimensions.

Root Polytopes \(B_n, C_n\) and \(D_n\)

The root polytopes for these other three polytope families are defined as follows:




\(\color{blue}{\text{Proposition:}}\) The root polytope \(B_n, C_n\) and \(D_n\) are balanced. (The following polytopes are what \(B_3\), \(C_3\) and \(D_3\) look like).

Spectra of \(B_n\), \(C_n\) and \(D_n\) and Future Work to Come…

We are only just starting to develop an understanding of the patterns of these root polytopes. The following patterns listed for the eigenvalues of polytopes \(B_n\), \(C_n\) and \(D_n\) are based off of our computations, and plans to complete proofs for each of these shapes is in the works!

The \(\color{green}{\text{spectrum}}\) of \(TL(B_n)\) is: \[ \frac{3\pm \sqrt{16n^2-40n+33}}{2}, \underbrace{0}_n, \underbrace{ \frac{2n+3\pm\sqrt{4n^2-20n+33}}{2}}_{n-1},\underbrace{2n-3}_{\frac{n(n-1)}{2}}, \underbrace{2n-1}_{n(n-1)}, \underbrace{2n+1}_{\frac{n(n-3)}{2}}\]

The \(\color{green}{\text{spectrum}}\) of \(TL(C_n)\) is \[\frac{(5-n)\pm \sqrt{9n^2-26n+33}}{2}, \underbrace{0}_n,\underbrace{ \frac{(5+n)\pm\sqrt{n^2-6n+33}}{2}}_{n-1}, \]\[\underbrace{n+1}_{n-1}, \underbrace{2(n-1)}_{\frac{n(n-1)}{2}}, \underbrace{2n}_{n(n-2)} ,\underbrace{2(n+1)}_{\frac{n(n-3)}{2}}\]

The \(\color{green}{\text{spectrum}}\) of \(TL(D_n)\) is \[2(2-n), \underbrace{4}_{n-1},\underbrace{0}_{n},\underbrace{2n}_{\frac{n(n-3)}{2}}, \underbrace{2(n-2)}_{\frac{n(n-1)}{2}},\underbrace{2(n-1)}_{n(n-2)}\]

Constructing \(B_n\) Starting With \(D_n\) Vertices

The code below is an example of how we have constructed tropical surfaces that stem from \(B_n\) root polytopes. As you can see from the defining set of rules listed above, \(B_n\) tropical surfaces share all of the values of \(D_n\). Thus, we will start by constructing first \(D_n\) vertices.

import itertools as it
import numpy as np
np.set_printoptions(threshold=np.inf)
np.set_printoptions(linewidth=2000)    # default = 75

import math
from fractions import Fraction

from numpy.linalg import matrix_rank

n = 4
n = int(n)

D = [j for j in it.chain(*[[i, (-i[0], i[1]), (i[0], -i[1]), (-i[0], -i[1])] for i in it.combinations(range(1, n+1), 2)])]

print(D)
## [(1, 2), (-1, 2), (1, -2), (-1, -2), (1, 3), (-1, 3), (1, -3), (-1, -3), (1, 4), (-1, 4), (1, -4), (-1, -4), (2, 3), (-2, 3), (2, -3), (-2, -3), (2, 4), (-2, 4), (2, -4), (-2, -4), (3, 4), (-3, 4), (3, -4), (-3, -4)]

Adding the ‘Singletons’ to the Polytope

Now that we have the points defined by \(D_n = \{\pm e_i \pm e_j: 1 \leq i \neq j \leq n\}\), let’s add the additional \(\{\pm e_i: 1 \leq i \neq j \leq n\}\) points. Since these points are standard bases vectors by themselves in \(\mathbb{R}_n\), we have sometimes call them ‘Singletons.’ Note that in the set B of points, there are either single integers by themselves (which represent \(e_i\) standard basis vector for every ‘Singleton’ i value), or tuples/pairs of values, which represent \(\pm e_i\pm e_j\) combinations of standard bases vectors.

B = D
for i in range(n):
    B.append(i+1)
    neg = -i-1
    B.append(neg)
    
print(B)
## [(1, 2), (-1, 2), (1, -2), (-1, -2), (1, 3), (-1, 3), (1, -3), (-1, -3), (1, 4), (-1, 4), (1, -4), (-1, -4), (2, 3), (-2, 3), (2, -3), (-2, -3), (2, 4), (-2, 4), (2, -4), (-2, -4), (3, 4), (-3, 4), (3, -4), (-3, -4), 1, -1, 2, -2, 3, -3, 4, -4]

Laying the Edges

Now that we have all of the points in the \(B_n\) shape, we can now define the edges of the polytope using Python’s dictionary data structure. We will first start by defining the vertices connected to all of the ‘Singleton’ vertices. Then we will move on to define the vertices connected to the non-‘Singleton’ vertices.

Note: In addition to the dictionary entries for the edges, there is also a weight dictionary that updates whenever an edge is created. Here we can calculate the weight by taking the length (using the len Python function) of the dictionary over the ‘Singleton’ elements, and then by adding the number of non-‘Singleton’ elements in B and dividing by two.

dict = {}
weight = {}

for i in B:
    #below calculates weight for standard vectors
    if type(i) == int:
        dict[i] = []
        for j in range(1,n+1):
            if j != i and -j != i:
                coordinate = (i,j)
                coordinate2 = (i, -j)
                dict[i].append(coordinate)
                dict[i].append(coordinate2)
                
        weight.update({i:len(dict[i])})        
        #weight for e's is (n-1)*2
    
    #this branch calculates weights for D_n        
    else:
        dict[i] = []
        dict[i].append(i[0])
        dict[i].append(i[1])
        for j in range(1,n+1):
            if j != i[0] and j!= i[1] and -j !=i[0] and -j != i[1]:
                coordinate = (i[0],j)
                coordinate2 = (i[0], -j)  
                dict[i].append(coordinate)
                dict[i].append(coordinate2)
                
                coordinate = (i[1],j)
                coordinate2 = (i[1], -j)
                dict[i].append(coordinate)
                dict[i].append(coordinate2)
        weight.update({i:len(dict[i])/2})  
        
# Print Dictionary of Edges
for key,value in dict.items():
    print(key,":",value)
    
## (1, ':', [(1, 2), (1, -2), (1, 3), (1, -3), (1, 4), (1, -4)])
## (2, ':', [(2, 1), (2, -1), (2, 3), (2, -3), (2, 4), (2, -4)])
## ((1, 3), ':', [1, 3, (1, 2), (1, -2), (3, 2), (3, -2), (1, 4), (1, -4), (3, 4), (3, -4)])
## (4, ':', [(4, 1), (4, -1), (4, 2), (4, -2), (4, 3), (4, -3)])
## ((2, -4), ':', [2, -4, (2, 1), (2, -1), (-4, 1), (-4, -1), (2, 3), (2, -3), (-4, 3), (-4, -3)])
## ((-1, -3), ':', [-1, -3, (-1, 2), (-1, -2), (-3, 2), (-3, -2), (-1, 4), (-1, -4), (-3, 4), (-3, -4)])
## (3, ':', [(3, 1), (3, -1), (3, 2), (3, -2), (3, 4), (3, -4)])
## ((1, -2), ':', [1, -2, (1, 3), (1, -3), (-2, 3), (-2, -3), (1, 4), (1, -4), (-2, 4), (-2, -4)])
## ((1, 2), ':', [1, 2, (1, 3), (1, -3), (2, 3), (2, -3), (1, 4), (1, -4), (2, 4), (2, -4)])
## ((-1, 3), ':', [-1, 3, (-1, 2), (-1, -2), (3, 2), (3, -2), (-1, 4), (-1, -4), (3, 4), (3, -4)])
## ((2, -3), ':', [2, -3, (2, 1), (2, -1), (-3, 1), (-3, -1), (2, 4), (2, -4), (-3, 4), (-3, -4)])
## ((-1, -4), ':', [-1, -4, (-1, 2), (-1, -2), (-4, 2), (-4, -2), (-1, 3), (-1, -3), (-4, 3), (-4, -3)])
## ((3, -4), ':', [3, -4, (3, 1), (3, -1), (-4, 1), (-4, -1), (3, 2), (3, -2), (-4, 2), (-4, -2)])
## ((-1, -2), ':', [-1, -2, (-1, 3), (-1, -3), (-2, 3), (-2, -3), (-1, 4), (-1, -4), (-2, 4), (-2, -4)])
## ((1, -3), ':', [1, -3, (1, 2), (1, -2), (-3, 2), (-3, -2), (1, 4), (1, -4), (-3, 4), (-3, -4)])
## ((-3, -4), ':', [-3, -4, (-3, 1), (-3, -1), (-4, 1), (-4, -1), (-3, 2), (-3, -2), (-4, 2), (-4, -2)])
## ((-1, 2), ':', [-1, 2, (-1, 3), (-1, -3), (2, 3), (2, -3), (-1, 4), (-1, -4), (2, 4), (2, -4)])
## ((1, 4), ':', [1, 4, (1, 2), (1, -2), (4, 2), (4, -2), (1, 3), (1, -3), (4, 3), (4, -3)])
## ((2, 3), ':', [2, 3, (2, 1), (2, -1), (3, 1), (3, -1), (2, 4), (2, -4), (3, 4), (3, -4)])
## ((-2, -3), ':', [-2, -3, (-2, 1), (-2, -1), (-3, 1), (-3, -1), (-2, 4), (-2, -4), (-3, 4), (-3, -4)])
## ((1, -4), ':', [1, -4, (1, 2), (1, -2), (-4, 2), (-4, -2), (1, 3), (1, -3), (-4, 3), (-4, -3)])
## ((-2, 4), ':', [-2, 4, (-2, 1), (-2, -1), (4, 1), (4, -1), (-2, 3), (-2, -3), (4, 3), (4, -3)])
## ((-2, 3), ':', [-2, 3, (-2, 1), (-2, -1), (3, 1), (3, -1), (-2, 4), (-2, -4), (3, 4), (3, -4)])
## (-4, ':', [(-4, 1), (-4, -1), (-4, 2), (-4, -2), (-4, 3), (-4, -3)])
## (-3, ':', [(-3, 1), (-3, -1), (-3, 2), (-3, -2), (-3, 4), (-3, -4)])
## ((-2, -4), ':', [-2, -4, (-2, 1), (-2, -1), (-4, 1), (-4, -1), (-2, 3), (-2, -3), (-4, 3), (-4, -3)])
## (-2, ':', [(-2, 1), (-2, -1), (-2, 3), (-2, -3), (-2, 4), (-2, -4)])
## ((-1, 4), ':', [-1, 4, (-1, 2), (-1, -2), (4, 2), (4, -2), (-1, 3), (-1, -3), (4, 3), (4, -3)])
## ((-3, 4), ':', [-3, 4, (-3, 1), (-3, -1), (4, 1), (4, -1), (-3, 2), (-3, -2), (4, 2), (4, -2)])
## ((3, 4), ':', [3, 4, (3, 1), (3, -1), (4, 1), (4, -1), (3, 2), (3, -2), (4, 2), (4, -2)])
## ((2, 4), ':', [2, 4, (2, 1), (2, -1), (4, 1), (4, -1), (2, 3), (2, -3), (4, 3), (4, -3)])
## (-1, ':', [(-1, 2), (-1, -2), (-1, 3), (-1, -3), (-1, 4), (-1, -4)])
for key,value in weight.items():
    print(key,":",value)
## (1, ':', 6)
## ((-3, -4), ':', 5)
## ((1, 3), ':', 5)
## (4, ':', 6)
## ((2, -4), ':', 5)
## ((-1, 2), ':', 5)
## (2, ':', 6)
## ((1, 4), ':', 5)
## ((-1, -3), ':', 5)
## (3, ':', 6)
## ((2, 3), ':', 5)
## ((-2, -3), ':', 5)
## ((1, -4), ':', 5)
## ((-2, 4), ':', 5)
## ((1, -2), ':', 5)
## ((1, 2), ':', 5)
## ((-1, 3), ':', 5)
## ((2, -3), ':', 5)
## ((-1, -4), ':', 5)
## ((-2, 3), ':', 5)
## (-4, ':', 6)
## ((3, -4), ':', 5)
## (-3, ':', 6)
## ((-2, -4), ':', 5)
## ((1, -3), ':', 5)
## (-2, ':', 6)
## ((-1, -2), ':', 5)
## ((-1, 4), ':', 5)
## ((-3, 4), ':', 5)
## ((3, 4), ':', 5)
## ((2, 4), ':', 5)
## (-1, ':', 6)

Creating the Tropical Laplacian Matrix from the Dictionary of Edges

The code below shows how to create a for loop that iterates over every element within our edge dictionary (called dict).

Trop = np.zeros((len(B),len(B)))
for i,item in enumerate(dict):
    plug = weight[item]
    Trop[i][i] = plug
    
    for j,item2 in enumerate(B):
        if item2 in dict[item]:
            Trop[i,j] = -1
            Trop[j,i] = -1

        if type(item2) == tuple:
            newtuple = (item2[1],item2[0])
            if newtuple in dict[item]:
                Trop[i,j] = -1
                Trop[j,i] = -1
                
# Print the Tropical Laplacian matrix
print(Trop)
## [[-1. -1. -1.  0. -1.  0. -1.  0. -1.  0. -1.  0.  0.  0. -1.  0.  0. -1. -1.  0. -1.  0.  0.  0.  0.  0.  0.  0.  0.  0. -1.  0.]
##  [-1. -1.  0.  0. -1. -1.  0.  0.  0. -1. -1. -1. -1.  0. -1.  0. -1.  0. -1.  0.  0.  0.  0.  0.  0.  0.  0. -1.  0.  0. -1. -1.]
##  [-1.  0. -1.  0.  0.  0.  0.  0. -1.  0. -1.  0. -1. -1. -1.  0.  0. -1.  0. -1. -1. -1. -1.  0. -1. -1. -1.  0. -1.  0.  0.  0.]
##  [ 0.  0.  0.  6.  0. -1.  0.  0. -1. -1.  0. -1.  0.  0.  0.  0. -1. -1.  0. -1. -1. -1. -1.  0.  0. -1. -1. -1.  0.  0.  0. -1.]
##  [-1. -1.  0.  0.  5.  0. -1. -1. -1.  0. -1. -1. -1.  0. -1.  0.  0. -1. -1.  0. -1.  0. -1. -1.  0.  0. -1.  0.  0. -1.  0. -1.]
##  [ 0. -1.  0. -1.  0.  5. -1.  0.  0. -1.  0. -1. -1. -1. -1. -1. -1.  0. -1.  0.  0. -1. -1. -1.  0. -1.  0. -1.  0. -1.  0. -1.]
##  [-1.  0.  0.  0. -1. -1.  6. -1. -1.  0. -1.  0. -1. -1.  0. -1.  0. -1.  0. -1. -1.  0. -1.  0. -1.  0.  0.  0. -1.  0.  0.  0.]
##  [ 0.  0.  0.  0. -1.  0. -1.  5. -1.  0. -1. -1.  0. -1.  0. -1. -1. -1.  0. -1.  0.  0.  0.  0. -1.  0.  0. -1. -1.  0.  0. -1.]
##  [-1.  0. -1. -1. -1.  0. -1. -1. -1.  0. -1.  0. -1.  0. -1.  0. -1.  0. -1.  0.  0. -1.  0.  0. -1.  0. -1.  0. -1. -1. -1.  0.]
##  [ 0. -1.  0. -1.  0. -1.  0.  0.  0. -1.  0. -1. -1. -1.  0.  0. -1.  0.  0.  0. -1. -1. -1.  0.  0. -1.  0.  0. -1. -1. -1. -1.]
##  [-1. -1. -1.  0. -1.  0. -1. -1. -1.  0.  5.  0. -1.  0. -1. -1. -1.  0. -1.  0.  0. -1.  0. -1.  0. -1. -1.  0.  0. -1.  0.  0.]
##  [ 0. -1.  0. -1. -1. -1.  0. -1.  0. -1.  0.  5. -1. -1.  0. -1. -1.  0. -1. -1.  0.  0. -1. -1.  0. -1.  0.  0.  0.  0.  0. -1.]
##  [ 0. -1. -1.  0. -1. -1. -1.  0. -1. -1. -1. -1. -1. -1.  0.  0. -1.  0. -1. -1.  0.  0.  0.  0.  0.  0.  0.  0. -1. -1. -1. -1.]
##  [ 0.  0. -1.  0.  0. -1. -1. -1.  0. -1.  0. -1. -1. -1.  0. -1.  0. -1.  0. -1.  0. -1.  0.  0.  0. -1. -1. -1.  0. -1.  0.  0.]
##  [-1. -1. -1.  0. -1. -1.  0.  0. -1.  0. -1.  0.  0.  0. -1. -1. -1.  0.  0.  0.  0. -1.  0. -1. -1.  0.  0.  0. -1. -1. -1.  0.]
##  [ 0.  0.  0.  0.  0. -1. -1. -1.  0.  0. -1. -1.  0. -1. -1. -1.  0.  0. -1. -1.  0. -1.  0.  0. -1. -1. -1.  0. -1. -1.  0. -1.]
##  [ 0. -1.  0. -1.  0. -1.  0. -1. -1. -1. -1. -1. -1.  0. -1.  0. -1. -1. -1.  0.  0.  0.  0.  0.  0. -1. -1. -1. -1. -1.  0.  0.]
##  [-1.  0. -1. -1. -1.  0. -1. -1.  0.  0.  0.  0.  0. -1.  0.  0. -1. -1.  0. -1. -1. -1. -1.  0. -1.  0. -1. -1. -1. -1. -1.  0.]
##  [-1. -1.  0.  0. -1. -1.  0.  0. -1.  0. -1. -1. -1.  0.  0. -1. -1.  0. -1.  0. -1.  0. -1. -1.  0.  0. -1.  0. -1.  0.  0.  0.]
##  [ 0.  0. -1. -1.  0.  0. -1. -1.  0.  0.  0. -1. -1. -1.  0. -1.  0. -1.  0. -1. -1. -1. -1. -1.  0.  0. -1. -1.  0. -1.  0.  0.]
##  [-1.  0. -1. -1. -1.  0. -1.  0.  0. -1.  0.  0.  0.  0.  0.  0.  0. -1. -1. -1.  5. -1. -1. -1. -1.  0.  0. -1.  0.  0. -1. -1.]
##  [ 0.  0. -1. -1.  0. -1.  0.  0. -1. -1. -1.  0.  0. -1. -1. -1.  0. -1.  0. -1. -1. -1.  0.  0. -1.  0.  0. -1.  0.  0. -1.  0.]
##  [ 0.  0. -1. -1. -1. -1. -1.  0.  0. -1.  0. -1.  0.  0.  0.  0.  0. -1. -1. -1. -1.  0. -1. -1.  0. -1.  0. -1. -1.  0.  0.  0.]
##  [ 0.  0.  0.  0. -1. -1.  0.  0.  0.  0. -1. -1.  0.  0. -1.  0.  0.  0. -1. -1. -1.  0. -1. -1. -1. -1.  0.  0.  0.  0.  0.  0.]
##  [ 0.  0. -1.  0.  0.  0. -1. -1. -1.  0.  0.  0.  0.  0. -1. -1.  0. -1.  0.  0. -1. -1.  0. -1.  6.  0.  0.  0.  0.  0.  0.  0.]
##  [ 0.  0. -1. -1.  0. -1.  0.  0.  0. -1. -1. -1.  0. -1.  0. -1. -1.  0.  0.  0.  0.  0. -1. -1.  0.  5.  0. -1.  0.  0.  0. -1.]
##  [ 0.  0. -1. -1. -1.  0.  0.  0. -1.  0. -1.  0.  0. -1.  0. -1. -1. -1. -1. -1.  0.  0.  0.  0.  0.  0.  6.  0.  0.  0. -1.  0.]
##  [ 0. -1.  0. -1.  0. -1.  0. -1.  0.  0.  0.  0.  0. -1.  0.  0. -1. -1.  0. -1. -1. -1. -1.  0.  0. -1.  0.  5.  0.  0. -1.  0.]
##  [ 0.  0. -1.  0.  0.  0. -1. -1. -1. -1.  0.  0. -1.  0. -1. -1. -1. -1. -1.  0.  0.  0. -1.  0.  0.  0.  0.  0.  5. -1. -1.  0.]
##  [ 0.  0.  0.  0. -1. -1.  0.  0. -1. -1. -1.  0. -1. -1. -1. -1. -1. -1.  0. -1.  0.  0.  0.  0.  0.  0.  0.  0. -1.  5. -1.  0.]
##  [-1. -1.  0.  0.  0.  0.  0.  0. -1. -1.  0.  0. -1.  0. -1.  0.  0. -1.  0.  0. -1. -1.  0.  0.  0.  0. -1. -1. -1. -1. -1.  0.]
##  [ 0. -1.  0. -1. -1. -1.  0. -1.  0. -1.  0. -1. -1.  0.  0. -1.  0.  0.  0.  0. -1.  0.  0.  0.  0. -1.  0.  0.  0.  0.  0.  6.]]

Computing the Spectra

eigVal, eigVect = np.linalg.eig(Trop)
eigVal.sort()

print("Tropical Laplacian Eigenvalues of B", n, ":")
## ('Tropical Laplacian Eigenvalues of B', 4, ':')
for i,eig in enumerate(eigVal):
    eigVal[i] = round(eig,4)
    print(eigVal[i])
## -13.643
## -4.86
## -4.254
## -3.5599
## -3.0167
## -2.3603
## -1.7021
## -1.5558
## -1.0381
## -0.9227
## -0.295
## -0.0771
## 0.4104
## 0.8157
## 1.0566
## 1.3651
## 1.9251
## 3.558
## 3.9405
## 4.1821
## 4.8917
## 5.0624
## 5.4685
## 6.0681
## 6.2484
## 6.4864
## 7.1071
## 7.2001
## 7.5239
## 8.6361
## 8.8687
## 9.4698

References

Farhad Babaee and June Huh, A Tropical Approach to a Generalized Hodge Conjecture for Positive Currents, Duke Math. J. 166 (2017), no. 14, 2749–2813. MR 3707289

Anna Schindler, Algebraic and Combinatorial Aspects of Two Symmetric Polytopes, Master’s thesis, San Francisco State University, 2017.

Main Projects Page