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.
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).
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)}\]
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)]
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]
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)
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.]]
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
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.