############################################################################### # This script computes the combinatorics of the monomial map from del Pezzos in P^26 (where the coordinates are the 27 (-1)-curves) to P^44 (where the coordinates are the 45 anticanonical triangles). ############################################################################### # We first show by a rank computation that the map is injective on the corresponding tori after taking the quotient by the action of a 6-dimensional torus. # Then, we check the boundary cells. Notice that in the tropical del Pezzos in TP^26, we have points with at most two infinity coordinates, and they come from intersecting the two (-1) curves corresponding to each infinity coordinate. This will be key when proving injectiving on del Pezzos. # CONCLUSION: The monomial map is not injective on P^26, but it will be when restricting to compact del Pezzos. ###################################################### # Construction of the matrix giving the monomial map # ###################################################### # Coordinates of the markings of extremal curves and anticanonical triangles Es = [var("E%s"%i) for i in range(1,7)] Fs = [var("F%s%s"%(i,j)) for i in range(1,7) for j in range(1,7) if i < j] Gs = [var("G%s"%i) for i in range(1,7)] EFG = Es+Fs+Gs Xs = [var("X%s%s"%(i,j)) for i in range(1,7) for j in range(1,7) if i != j] Ys = [var("Y%s%s%s%s%s%s"%(i,j,k,l,m,n)) for i in range(1,7) for j in range(1,7) for k in range(1,7) for l in range(1,7) for m in range(1,7) for n in range(1,7) if i ti # Fij = H - Ei - Ej -> t0 * (ti)^(-1) * (tj)^(-1) # Gj = 2H - E + Ej -> t0^2 * (t1...t6)^(-1) * tj # So the 7 generators of the lineality space in Z^(27) are given by a 27x7 matris which we call L. # The following steps compute this matrix L: L = matrix(ZZ, 27,7) # Column i corresponds to ti # Row j corresponds to EFG[j] # Eis for i in range(0,6): L[i,i+1] = 1 # Fijs for i in range(6,21): f = EFG[i] sf = str(f)[1:] L[i, eval(sf[0])] = -1 L[i, eval(sf[1])] = -1 L[i, 0] = 1 # Gjs for i in range(21,27): g = EFG[i] sg = str(g)[1:] for k in range(1,7): if k != eval(sg): L[i, k] = -1 L[i, 0] = 2 rank(L) # The result is 7. # # We save the output as a sage object: # save(L, "Input/Z7Action_matrix.sobj") # # We save the resulting matrix as a text file: # f=file("../Output/Z7Action_matrix.txt", 'w') # f.write(L.str()) # f.close() L = load("Input/Z7Action_matrix.sobj") # We compute the index of L inside Z^27. For this we must compute the gcd of all its maximal minors: minorsL = set(L.minors(7)) print(minorsL) {-3, -2, -1, 0, 1, 2, 3} # There is a minor equal to 1, hence the lattice is saturated. # In this case, a simple inspection shows that the determinant of the first 7x7 submatrix is 1, hence the lattice is saturated. # We record the matrix: # print L.str() # [ 0 1 0 0 0 0 0] # [ 0 0 1 0 0 0 0] # [ 0 0 0 1 0 0 0] # [ 0 0 0 0 1 0 0] # [ 0 0 0 0 0 1 0] # [ 0 0 0 0 0 0 1] # [ 1 -1 -1 0 0 0 0] # [ 1 -1 0 -1 0 0 0] # [ 1 -1 0 0 -1 0 0] # [ 1 -1 0 0 0 -1 0] # [ 1 -1 0 0 0 0 -1] # [ 1 0 -1 -1 0 0 0] # [ 1 0 -1 0 -1 0 0] # [ 1 0 -1 0 0 -1 0] # [ 1 0 -1 0 0 0 -1] # [ 1 0 0 -1 -1 0 0] # [ 1 0 0 -1 0 -1 0] # [ 1 0 0 -1 0 0 -1] # [ 1 0 0 0 -1 -1 0] # [ 1 0 0 0 -1 0 -1] # [ 1 0 0 0 0 -1 -1] # [ 2 0 -1 -1 -1 -1 -1] # [ 2 -1 0 -1 -1 -1 -1] # [ 2 -1 -1 0 -1 -1 -1] # [ 2 -1 -1 -1 0 -1 -1] # [ 2 -1 -1 -1 -1 0 -1] # [ 2 -1 -1 -1 -1 -1 0] # We check that the all-ones vector lies in the column-span of L v = vector([1 for i in range(0,27)]) v in transpose(L).image() # True # A precise expression of the all-ones vector in terms of the column-span of L is: # L \ vector([1 for i in range(0,27)]) # (3, 1, 1, 1, 1, 1, 1) # So on the torus (K^*)^27/K^* the torus acting is 6-dimensional: (K^*)^7/K^* # We compute a basis of the image of transpose(L) to find a basis of the rank 7 lattice spanned by the columns of L: BB = transpose(L).image().basis() print BB [ (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1), (0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1), (0, 0, 1, 0, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, -1, -1, -1, 0, 0, 0, -1, -1, 0, -1, -1, -1), (0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, -1, 0, 0, -1, -1, 0, -1, -1, -1, 0, -1, -1), (0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, -1, 0, -1, 0, -1, -1, -1, -1, -1, 0, -1), (0, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, -1, 0, -1, -1, -1, -1, -1, -1, -1, 0), (0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2) ] # We check BB is a Z-basis by solving the system: # L \vector(BB[0]) # (1, 1, 0, 0, 0, 0, 0) # L \vector(BB[1]) # (1, 0, 1, 0, 0, 0, 0) # L \vector(BB[2]) # (0, 0, 0, 1, 0, 0, 0) # L \vector(BB[3]) # (0, 0, 0, 0, 1, 0, 0) # L \vector(BB[4]) # (0, 0, 0, 0, 0, 1, 0) # L \vector(BB[5]) # (0, 0, 0, 0, 0, 0, 1) # L \vector(BB[6]) # (1, 0, 0, 0, 0, 0, 0) ################################################################################ ## # Checking injectivity of linear tropical map on the compact tropical del Pezzos # ################################################################################ b## # Injectivity is check on each torus orbit independently. There are 2 types of boundary orbits (up to the action of W(E6)) and it is clear that injectivity only needs to be checked on each orbit independently. It is also clear that injectivity on the big open cell also needs to be checked separately. # Checking that the lattices involved are saturated ensures that the monomial map is invertible on the image (i.e. there is no need to use radicals). ################# # BIG Open Cell # ################# # Let us check that the kernel of M is actually the lineality space =ZZ^7 coming from the torus action. This will garantee that we have injectivity at the level of the big open cell RR^27 / im L # Check that ker(M) contains image(transpose(L)): [b in transpose(L).image() for b in M.right_kernel().basis()] # [True, True, True, True, True, True] # This, together with the rank conditions shows that the map factors through the quotient. # Check that the lattices are saturated, so the matrices have the expected rank over the integers. print M.elementary_divisors() # [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] print L.elementary_divisors() [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # Since L has rank 7 but 6 after moding out by the all-ones vector, the map M is automatically injective modulo image of L. ################## # Boundary Cells # ################## # In the tropical del Pezzos in TP^26, we have points with at most two infinity coordinates, and they come from intersecting the two (-1) curves corresponding to each infinity coordinate. # We checked that two distinct infinity pattern do not map to the same point. ######################################### # Injectivity on (inf, *, ...) pattern. # ######################################### # The following calculation shows that the map is injective when restricted to the strata of R(bar)^{27} / R^7 with at most one infinity coordinate. # By the W(E6)-action, it suffices to check injectivity when E1-coordinate is infinity. # CALCULATION FOR E1: # We have to project away from E1 and also away from the 5 anticanonical triangles containing E1. This corresponds to droping 5 rows and 1 column from the matrix M and droping 1 row from L. # Drop rows 0,1,2,3,4 # Drop column 0 dropRow = [0,1,2,3,4] dropCol = [0] # Drop rows and colums from M: M1 = M.matrix_from_rows_and_columns([i for i in range(0,45) if i not in dropRow], [j for j in range(0,27) if j not in dropCol]) # Drop row 0 from L: L1 = L.matrix_from_rows(range(1,27)) # We check that M1 is injective modulo the image of L1. We need to check two things. First, that the kernel(M2) contains the image(L1); and equation will then follow by a rank condition. The saturation of all lattices involved will ensure that the monomial maps are invertible on the corresponding torus orbits. # Check kernel(M1) contains image(transpose(L1)): [b in transpose(L1).image() for b in M1.right_kernel().basis()] #[True, True, True, True, True, True] # Check that the lattices are saturated: print M1.elementary_divisors() # [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] print L1.elementary_divisors() # [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # Rank conditions: rank(M1) # 20 = 26 - 6 rank(L1) # 7 v = vector([1 for i in range(0,26)]) v in transpose(L1).image() # True #The image of L1 has rank 6 after moding out by the all-ones vector in ZZ^26. The kernel of M1 has rank 6 as well. ############################################## # Injectivity on (inf, inf, *, ...) pattern. # ############################################## # The following calculation shows that the map is injective when restricted to the strata of R(bar)^{27} / R^7 with two infinity coordinate coming from two intersecting (-1)-curves. # By the W(E6)-action, it suffices to check injectivity when E1-coordinate is infinity. # In this case, the stata consists of a single point, so there is nothing to check if we only case about X. Nonetheless, the following code shows that injectivity on the strata in $TP^{26}/ R^6$ also holds. # CALCULATION FOR E1 F12: # We have to project away from E1 and F12 and also away from the 9 anticanonical triangles containing E1 and F12. This corresponds to droping 9 rows and 2 columns from the matrix M and droping 2 rows from L. # Drop rows 0,1,2,3,4,5,30,31,32 # Drop columns 0,6 dropRow = [0,1,2,3,4,5,30,31,32] dropCol = [0,6] # Drop rows and colums from M: M2 = M.matrix_from_rows_and_columns([i for i in range(0,45) if i not in dropRow], [j for j in range(0,27) if j not in dropCol]) # Drop rows 0 and 6 from L: L2 = L.matrix_from_rows([j for j in range(0,27) if j not in dropCol]) # Again we check kernel(M2) contains image(transpose(L2)): [b in transpose(L2).image() for b in M2.right_kernel().basis()] #[True, True, True, True, True, True] # Check that the lattices are saturated: print M2.elementary_divisors() # [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] print L2.elementary_divisors() # [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # Rank conditions: # rank(M2) # 19 = 25 - 6 # rank(L2) # 7 v = vector([1 for i in range(0,25)]) v in transpose(L2).image() # True #The image of L2 has rank 6 after moding out by the all-ones vector in ZZ^25. The kernel of M2 has rank 6 as well.