################################################# # Groebner cone, and subdivision computations C # ################################################# # In order to certify the calculations in "Qrefinementwithx34Noa4BadPrimes.sage" does not depend on the chosen weight vector, we need to check the Dumbbell Cone and its faces are not subdivided by the Grobner complex of C. This script computes the Grobner Cones for this polynomial and checks for potential subdivisions. # Our calculations are valid when the residue field has characteristic 0. Based on the results, we later refine the calculation to include positive characteristic, based on the initial forms we obtain. # The initial forms are computed in the script "initialFormsABCDQ4.sage" # The necessary data (including the polynomials) and macros are obtained by loading the following file: load("macroslocalJInvariantComputationsAndPrimesWithBadReduction.sage") load("Qrefinementwithx34Noa4.sage") # We create the fraction field of the ambient polynomial rings K = FractionField(S); KK = FractionField(SS); # The computation of the Grobner fan halts for C, so we use an alternative polynomial with the same extremal monomials to compute the Grobner fan. ################## # Exponents of C # ################## # Recall: the variables of S are ordered a6,a5,a4,a3,a2,a1 # We use the variable Q to refer to the polynomial Q = C # We record the monomials and coefficients of C, as well about the exponent vectors. monQ = Q.monomials() coeffQ = Q.coefficients() exponentVectorsQ = [x.exponents() for x in monQ] # We convert each the tuple of each entry (a list) into a list of integers. exponentVectorsQInZZ = [] m = len(exponentVectorsQ[0][0]) for x in exponentVectorsQ: v = [ZZ(x[0][j]) for j in range(0,m)] exponentVectorsQInZZ.append(v) # len(exponentVectorsQInZZ) # 8531 ###################################### # Construct the Newton Polytope of C # ###################################### # The calculations of Grobner fans only require the vertices of the Newton polytope of Q. The number of vertices of this polytope is 180 compared to the 8531 monomials in Q. The computation of the Grobner fan of the full Q does not terminate, as opposed to that of the alternative polynomial AltQ. NPQ = Polyhedron(vertices= exponentVectorsQInZZ) # NPQ # A 5-dimensional polyhedron in ZZ^6 defined as the convex hull of 180 vertices # we record the extremal monomials of Q. extremalExponents = [tuple(list(x)) for x in NPQ.vertices()] # print len(extremalExponents) # 180 # We construct AltQ, a polynomial obtained as the sum of the terms of Q involving extremal monomials. AltQMonomials = [exponentVectorsQInZZ.index(list(x)) for x in extremalExponents] # len(AltQMonomials) # 180 AltQ = S(0) for j in AltQMonomials: AltQ = AltQ + S(coeffQ[j]*monQ[j]) # AltQ # 8*a6^6*a5^6*a4^4*a3^2 + 8*a6^6*a5^4*a4^6*a3^2 + 8*a6^4*a5^6*a4^6*a3^2 + 8*a6^6*a5^6*a4^2*a3^4 + 8*a6^6*a5^2*a4^6*a3^4 + 8*a6^2*a5^6*a4^6*a3^4 + 8*a6^6*a5^4*a4^2*a3^6 + 8*a6^4*a5^6*a4^2*a3^6 + 8*a6^6*a5^2*a4^4*a3^6 + 8*a6^2*a5^6*a4^4*a3^6 + 8*a6^4*a5^2*a4^6*a3^6 + 8*a6^2*a5^4*a4^6*a3^6 + 8*a6^6*a5^6*a4^4*a2^2 + 8*a6^6*a5^4*a4^6*a2^2 + 8*a6^4*a5^6*a4^6*a2^2 + 8*a6^6*a5^6*a3^4*a2^2 + 8*a6^6*a4^6*a3^4*a2^2 + 8*a5^6*a4^6*a3^4*a2^2 + 8*a6^6*a5^4*a3^6*a2^2 + 8*a6^4*a5^6*a3^6*a2^2 + 8*a6^6*a4^4*a3^6*a2^2 + 8*a5^6*a4^4*a3^6*a2^2 + 8*a6^4*a4^6*a3^6*a2^2 + 8*a5^4*a4^6*a3^6*a2^2 + 8*a6^6*a5^6*a4^2*a2^4 + 8*a6^6*a5^2*a4^6*a2^4 + 8*a6^2*a5^6*a4^6*a2^4 + 8*a6^6*a5^6*a3^2*a2^4 + 8*a6^6*a4^6*a3^2*a2^4 + 8*a5^6*a4^6*a3^2*a2^4 + 8*a6^6*a5^2*a3^6*a2^4 + 8*a6^2*a5^6*a3^6*a2^4 + 8*a6^6*a4^2*a3^6*a2^4 + 8*a5^6*a4^2*a3^6*a2^4 + 8*a6^2*a4^6*a3^6*a2^4 + 8*a5^2*a4^6*a3^6*a2^4 + 8*a6^6*a5^4*a4^2*a2^6 + 8*a6^4*a5^6*a4^2*a2^6 + 8*a6^6*a5^2*a4^4*a2^6 + 8*a6^2*a5^6*a4^4*a2^6 + 8*a6^4*a5^2*a4^6*a2^6 + 8*a6^2*a5^4*a4^6*a2^6 + 8*a6^6*a5^4*a3^2*a2^6 + 8*a6^4*a5^6*a3^2*a2^6 + 8*a6^6*a4^4*a3^2*a2^6 + 8*a5^6*a4^4*a3^2*a2^6 + 8*a6^4*a4^6*a3^2*a2^6 + 8*a5^4*a4^6*a3^2*a2^6 + 8*a6^6*a5^2*a3^4*a2^6 + 8*a6^2*a5^6*a3^4*a2^6 + 8*a6^6*a4^2*a3^4*a2^6 + 8*a5^6*a4^2*a3^4*a2^6 + 8*a6^2*a4^6*a3^4*a2^6 + 8*a5^2*a4^6*a3^4*a2^6 + 8*a6^4*a5^2*a3^6*a2^6 + 8*a6^2*a5^4*a3^6*a2^6 + 8*a6^4*a4^2*a3^6*a2^6 + 8*a5^4*a4^2*a3^6*a2^6 + 8*a6^2*a4^4*a3^6*a2^6 + 8*a5^2*a4^4*a3^6*a2^6 + 8*a6^6*a5^6*a4^4*a1^2 + 8*a6^6*a5^4*a4^6*a1^2 + 8*a6^4*a5^6*a4^6*a1^2 + 8*a6^6*a5^6*a3^4*a1^2 + 8*a6^6*a4^6*a3^4*a1^2 + 8*a5^6*a4^6*a3^4*a1^2 + 8*a6^6*a5^4*a3^6*a1^2 + 8*a6^4*a5^6*a3^6*a1^2 + 8*a6^6*a4^4*a3^6*a1^2 + 8*a5^6*a4^4*a3^6*a1^2 + 8*a6^4*a4^6*a3^6*a1^2 + 8*a5^4*a4^6*a3^6*a1^2 + 8*a6^6*a5^6*a2^4*a1^2 + 8*a6^6*a4^6*a2^4*a1^2 + 8*a5^6*a4^6*a2^4*a1^2 + 8*a6^6*a3^6*a2^4*a1^2 + 8*a5^6*a3^6*a2^4*a1^2 + 8*a4^6*a3^6*a2^4*a1^2 + 8*a6^6*a5^4*a2^6*a1^2 + 8*a6^4*a5^6*a2^6*a1^2 + 8*a6^6*a4^4*a2^6*a1^2 + 8*a5^6*a4^4*a2^6*a1^2 + 8*a6^4*a4^6*a2^6*a1^2 + 8*a5^4*a4^6*a2^6*a1^2 + 8*a6^6*a3^4*a2^6*a1^2 + 8*a5^6*a3^4*a2^6*a1^2 + 8*a4^6*a3^4*a2^6*a1^2 + 8*a6^4*a3^6*a2^6*a1^2 + 8*a5^4*a3^6*a2^6*a1^2 + 8*a4^4*a3^6*a2^6*a1^2 + 8*a6^6*a5^6*a4^2*a1^4 + 8*a6^6*a5^2*a4^6*a1^4 + 8*a6^2*a5^6*a4^6*a1^4 + 8*a6^6*a5^6*a3^2*a1^4 + 8*a6^6*a4^6*a3^2*a1^4 + 8*a5^6*a4^6*a3^2*a1^4 + 8*a6^6*a5^2*a3^6*a1^4 + 8*a6^2*a5^6*a3^6*a1^4 + 8*a6^6*a4^2*a3^6*a1^4 + 8*a5^6*a4^2*a3^6*a1^4 + 8*a6^2*a4^6*a3^6*a1^4 + 8*a5^2*a4^6*a3^6*a1^4 + 8*a6^6*a5^6*a2^2*a1^4 + 8*a6^6*a4^6*a2^2*a1^4 + 8*a5^6*a4^6*a2^2*a1^4 + 8*a6^6*a3^6*a2^2*a1^4 + 8*a5^6*a3^6*a2^2*a1^4 + 8*a4^6*a3^6*a2^2*a1^4 + 8*a6^6*a5^2*a2^6*a1^4 + 8*a6^2*a5^6*a2^6*a1^4 + 8*a6^6*a4^2*a2^6*a1^4 + 8*a5^6*a4^2*a2^6*a1^4 + 8*a6^2*a4^6*a2^6*a1^4 + 8*a5^2*a4^6*a2^6*a1^4 + 8*a6^6*a3^2*a2^6*a1^4 + 8*a5^6*a3^2*a2^6*a1^4 + 8*a4^6*a3^2*a2^6*a1^4 + 8*a6^2*a3^6*a2^6*a1^4 + 8*a5^2*a3^6*a2^6*a1^4 + 8*a4^2*a3^6*a2^6*a1^4 + 8*a6^6*a5^4*a4^2*a1^6 + 8*a6^4*a5^6*a4^2*a1^6 + 8*a6^6*a5^2*a4^4*a1^6 + 8*a6^2*a5^6*a4^4*a1^6 + 8*a6^4*a5^2*a4^6*a1^6 + 8*a6^2*a5^4*a4^6*a1^6 + 8*a6^6*a5^4*a3^2*a1^6 + 8*a6^4*a5^6*a3^2*a1^6 + 8*a6^6*a4^4*a3^2*a1^6 + 8*a5^6*a4^4*a3^2*a1^6 + 8*a6^4*a4^6*a3^2*a1^6 + 8*a5^4*a4^6*a3^2*a1^6 + 8*a6^6*a5^2*a3^4*a1^6 + 8*a6^2*a5^6*a3^4*a1^6 + 8*a6^6*a4^2*a3^4*a1^6 + 8*a5^6*a4^2*a3^4*a1^6 + 8*a6^2*a4^6*a3^4*a1^6 + 8*a5^2*a4^6*a3^4*a1^6 + 8*a6^4*a5^2*a3^6*a1^6 + 8*a6^2*a5^4*a3^6*a1^6 + 8*a6^4*a4^2*a3^6*a1^6 + 8*a5^4*a4^2*a3^6*a1^6 + 8*a6^2*a4^4*a3^6*a1^6 + 8*a5^2*a4^4*a3^6*a1^6 + 8*a6^6*a5^4*a2^2*a1^6 + 8*a6^4*a5^6*a2^2*a1^6 + 8*a6^6*a4^4*a2^2*a1^6 + 8*a5^6*a4^4*a2^2*a1^6 + 8*a6^4*a4^6*a2^2*a1^6 + 8*a5^4*a4^6*a2^2*a1^6 + 8*a6^6*a3^4*a2^2*a1^6 + 8*a5^6*a3^4*a2^2*a1^6 + 8*a4^6*a3^4*a2^2*a1^6 + 8*a6^4*a3^6*a2^2*a1^6 + 8*a5^4*a3^6*a2^2*a1^6 + 8*a4^4*a3^6*a2^2*a1^6 + 8*a6^6*a5^2*a2^4*a1^6 + 8*a6^2*a5^6*a2^4*a1^6 + 8*a6^6*a4^2*a2^4*a1^6 + 8*a5^6*a4^2*a2^4*a1^6 + 8*a6^2*a4^6*a2^4*a1^6 + 8*a5^2*a4^6*a2^4*a1^6 + 8*a6^6*a3^2*a2^4*a1^6 + 8*a5^6*a3^2*a2^4*a1^6 + 8*a4^6*a3^2*a2^4*a1^6 + 8*a6^2*a3^6*a2^4*a1^6 + 8*a5^2*a3^6*a2^4*a1^6 + 8*a4^2*a3^6*a2^4*a1^6 + 8*a6^4*a5^2*a2^6*a1^6 + 8*a6^2*a5^4*a2^6*a1^6 + 8*a6^4*a4^2*a2^6*a1^6 + 8*a5^4*a4^2*a2^6*a1^6 + 8*a6^2*a4^4*a2^6*a1^6 + 8*a5^2*a4^4*a2^6*a1^6 + 8*a6^4*a3^2*a2^6*a1^6 + 8*a5^4*a3^2*a2^6*a1^6 + 8*a4^4*a3^2*a2^6*a1^6 + 8*a6^2*a3^4*a2^6*a1^6 + 8*a5^2*a3^4*a2^6*a1^6 + 8*a4^2*a3^4*a2^6*a1^6 ######################################## # Calculation of the Groebner fan of C # ######################################## # We use AltC to compute the Grobner fan of C: # Iq = ideal(AltQ) # GFq = Iq.groebner_fan() # We pre-compute the Grobner fan: # GFqFan = GFq.polyhedralfan() # save(GFqFan,"GrobnerFanC.sobj") # We convert the data to Rational Polyhedral fan: # newGF = GFqFan.to_RationalPolyhedralFan() # save(newGF, "GFAFan_as_RationalPolyhedra.sobj") # newGF=load("GFAFan_as_RationalPolyhedra.sobj") # We load the pre-computed the Grober fan. GFqFan = load("GrobnerFanC.sobj") # We record the f-vector: # print GFqFan.f_vector() # [1, 32, 180, 420, 450, 180] # We confirm the dimension of the fan is the expected one: # print GFqFan.dim() # 6 # We record the coordinates of the rays of the Grobner fan: RaysGFqfan = GFqFan.rays() # print RaysGFqfan # [[-5, 1, 1, 1, 1, 1], [-1, -1, -1, -1, -1, 5], [-1, -1, -1, -1, 5, -1], [-1, -1, -1, 1, 1, 1], [-1, -1, -1, 5, -1, -1], [-1, -1, 1, -1, 1, 1], [-1, -1, 1, 1, -1, 1], [-1, -1, 1, 1, 1, -1], [-1, -1, 5, -1, -1, -1], [-1, 1, -1, -1, 1, 1], [-1, 1, -1, 1, -1, 1], [-1, 1, -1, 1, 1, -1], [-1, 1, 1, -1, -1, 1], [-1, 1, 1, -1, 1, -1], [-1, 1, 1, 1, -1, -1], [-1, 5, -1, -1, -1, -1], [1, -5, 1, 1, 1, 1], [1, -1, -1, -1, 1, 1], [1, -1, -1, 1, -1, 1], [1, -1, -1, 1, 1, -1], [1, -1, 1, -1, -1, 1], [1, -1, 1, -1, 1, -1], [1, -1, 1, 1, -1, -1], [1, 1, -5, 1, 1, 1], [1, 1, -1, -1, -1, 1], [1, 1, -1, -1, 1, -1], [1, 1, -1, 1, -1, -1], [1, 1, 1, -5, 1, 1], [1, 1, 1, -1, -1, -1], [1, 1, 1, 1, -5, 1], [1, 1, 1, 1, 1, -5], [5, -1, -1, -1, -1, -1]] # We record the maximal cones of the fan. Each cone is described by the indices of the extremal rays spanning these cones. Such indices refer to the list of 32 rays: MaximalConesQ = GFqFan.maximal_cones().values()[0] # print MaximalConesQ # [[0, 1, 2, 3, 16], [0, 1, 3, 4, 16], [0, 2, 3, 4, 16], [0, 1, 2, 5, 16], [0, 1, 4, 6, 16], [0, 2, 4, 7, 16], [0, 1, 5, 8, 16], [0, 2, 5, 8, 16], [0, 1, 6, 8, 16], [0, 2, 7, 8, 16], [0, 4, 6, 8, 16], [0, 4, 7, 8, 16], [0, 1, 2, 3, 23], [0, 1, 3, 4, 23], [0, 2, 3, 4, 23], [0, 1, 2, 5, 27], [0, 1, 4, 6, 29], [0, 2, 4, 7, 30], [0, 1, 5, 8, 27], [0, 2, 5, 8, 27], [0, 1, 6, 8, 29], [0, 2, 7, 8, 30], [0, 4, 6, 8, 29], [0, 4, 7, 8, 30], [0, 1, 2, 9, 23], [0, 1, 4, 10, 23], [0, 2, 4, 11, 23], [0, 1, 2, 9, 27], [0, 1, 4, 10, 29], [0, 2, 4, 11, 30], [0, 1, 8, 12, 27], [0, 2, 8, 13, 27], [0, 1, 8, 12, 29], [0, 2, 8, 13, 30], [0, 4, 8, 14, 29], [0, 4, 8, 14, 30], [0, 1, 9, 15, 23], [0, 2, 9, 15, 23], [0, 1, 10, 15, 23], [0, 2, 11, 15, 23], [0, 4, 10, 15, 23], [0, 4, 11, 15, 23], [0, 1, 9, 15, 27], [0, 2, 9, 15, 27], [0, 1, 10, 15, 29], [0, 2, 11, 15, 30], [0, 4, 10, 15, 29], [0, 4, 11, 15, 30], [0, 1, 12, 15, 27], [0, 2, 13, 15, 27], [0, 1, 12, 15, 29], [0, 2, 13, 15, 30], [0, 4, 14, 15, 29], [0, 4, 14, 15, 30], [0, 8, 12, 15, 27], [0, 8, 13, 15, 27], [0, 8, 12, 15, 29], [0, 8, 13, 15, 30], [0, 8, 14, 15, 29], [0, 8, 14, 15, 30], [1, 2, 3, 16, 23], [1, 3, 4, 16, 23], [2, 3, 4, 16, 23], [1, 2, 5, 16, 27], [1, 4, 6, 16, 29], [2, 4, 7, 16, 30], [1, 5, 8, 16, 27], [2, 5, 8, 16, 27], [1, 6, 8, 16, 29], [2, 7, 8, 16, 30], [4, 6, 8, 16, 29], [4, 7, 8, 16, 30], [1, 2, 9, 23, 27], [1, 4, 10, 23, 29], [2, 4, 11, 23, 30], [1, 8, 12, 27, 29], [2, 8, 13, 27, 30], [4, 8, 14, 29, 30], [1, 9, 15, 23, 27], [2, 9, 15, 23, 27], [1, 10, 15, 23, 29], [2, 11, 15, 23, 30], [4, 10, 15, 23, 29], [4, 11, 15, 23, 30], [1, 12, 15, 27, 29], [2, 13, 15, 27, 30], [4, 14, 15, 29, 30], [8, 12, 15, 27, 29], [8, 13, 15, 27, 30], [8, 14, 15, 29, 30], [1, 2, 16, 17, 23], [1, 4, 16, 18, 23], [2, 4, 16, 19, 23], [1, 2, 16, 17, 27], [1, 4, 16, 18, 29], [2, 4, 16, 19, 30], [1, 8, 16, 20, 27], [2, 8, 16, 21, 27], [1, 8, 16, 20, 29], [2, 8, 16, 21, 30], [4, 8, 16, 22, 29], [4, 8, 16, 22, 30], [1, 2, 17, 23, 27], [1, 4, 18, 23, 29], [2, 4, 19, 23, 30], [1, 8, 20, 27, 29], [2, 8, 21, 27, 30], [4, 8, 22, 29, 30], [1, 15, 23, 24, 27], [2, 15, 23, 25, 27], [1, 15, 23, 24, 29], [2, 15, 23, 25, 30], [4, 15, 23, 26, 29], [4, 15, 23, 26, 30], [1, 15, 24, 27, 29], [2, 15, 25, 27, 30], [4, 15, 26, 29, 30], [8, 15, 27, 28, 29], [8, 15, 27, 28, 30], [8, 15, 28, 29, 30], [1, 16, 17, 23, 31], [2, 16, 17, 23, 31], [1, 16, 18, 23, 31], [2, 16, 19, 23, 31], [4, 16, 18, 23, 31], [4, 16, 19, 23, 31], [1, 16, 17, 27, 31], [2, 16, 17, 27, 31], [1, 16, 18, 29, 31], [2, 16, 19, 30, 31], [4, 16, 18, 29, 31], [4, 16, 19, 30, 31], [1, 16, 20, 27, 31], [2, 16, 21, 27, 31], [1, 16, 20, 29, 31], [2, 16, 21, 30, 31], [4, 16, 22, 29, 31], [4, 16, 22, 30, 31], [8, 16, 20, 27, 31], [8, 16, 21, 27, 31], [8, 16, 20, 29, 31], [8, 16, 21, 30, 31], [8, 16, 22, 29, 31], [8, 16, 22, 30, 31], [1, 17, 23, 27, 31], [2, 17, 23, 27, 31], [1, 18, 23, 29, 31], [2, 19, 23, 30, 31], [4, 18, 23, 29, 31], [4, 19, 23, 30, 31], [1, 20, 27, 29, 31], [2, 21, 27, 30, 31], [4, 22, 29, 30, 31], [8, 20, 27, 29, 31], [8, 21, 27, 30, 31], [8, 22, 29, 30, 31], [1, 23, 24, 27, 31], [2, 23, 25, 27, 31], [1, 23, 24, 29, 31], [2, 23, 25, 30, 31], [4, 23, 26, 29, 31], [4, 23, 26, 30, 31], [1, 24, 27, 29, 31], [2, 25, 27, 30, 31], [4, 26, 29, 30, 31], [8, 27, 28, 29, 31], [8, 27, 28, 30, 31], [8, 28, 29, 30, 31], [15, 23, 24, 27, 31], [15, 23, 25, 27, 31], [15, 23, 24, 29, 31], [15, 23, 25, 30, 31], [15, 23, 26, 29, 31], [15, 23, 26, 30, 31], [15, 24, 27, 29, 31], [15, 25, 27, 30, 31], [15, 26, 29, 30, 31], [15, 27, 28, 29, 31], [15, 27, 28, 30, 31], [15, 28, 29, 30, 31]] # We record the maximal cones in the Grobner Fan of C as a dictionary of polyhedral objects. The keys coincide with the indices of the maximal cones in the output of the Gfan computation. PolyMaximalCones = MaximalCones(GFqFan) # We check that they have the expected dimension: # set([dim(x) for x in PolyMaximalCones.values()]) # {6} ################### # Exponents of CT # ################### # Recall: the variables of SS are ordered a6,a5,x34,a3,a2,a1 # We use the variable Q to refer to the polynomial Q = CT # We record the monomials and coefficients of B, as well about the exponent vectors. monQ = Q.monomials() coeffQ = Q.coefficients() exponentVectorsQ = [x.exponents() for x in monQ] # We convert each the tuple of each entry (a list) into a list of integers. exponentVectorsQInZZ = [] m = len(exponentVectorsQ[0][0]) for x in exponentVectorsQ: v = [ZZ(x[0][j]) for j in range(0,m)] exponentVectorsQInZZ.append(v) # len(exponentVectorsQInZZ) # 11745 ####################################### # Construct the Newton Polytope of CT # ####################################### # The calculations of Grobner fans only require the vertices of the Newton polytope of Q. The number of vertices of this polytope is 144 compared to the 11745 monomials in Q. The computation of the Grobner fan of the full Q does not terminate, as opposed to that of the alternative polynomial AltQ. NPQ = Polyhedron(vertices= exponentVectorsQInZZ) # NPQ # A 5-dimensional polyhedron in ZZ^6 defined as the convex hull of 144 vertices # we record the extremal monomials of Q. extremalExponents = [tuple(list(x)) for x in NPQ.vertices()] # print len(extremalExponents) # 144 # We construct AltQ, a polynomial obtained as the sum of the terms of Q involving extremal monomials. AltQMonomials = [exponentVectorsQInZZ.index(list(x)) for x in extremalExponents] # len(AltQMonomials) # 144 AltQ = SS(0) for j in AltQMonomials: AltQ = AltQ + SS(coeffQ[j]*monQ[j]) # AltQ # 8*a6^6*a5^6*x34^4*a3^2 + 8*a6^6*a5^4*x34^6*a3^2 + 8*a6^4*a5^6*x34^6*a3^2 + 8*a6^6*a5^2*x34^6*a3^4 + 8*a6^2*a5^6*x34^6*a3^4 + 8*a6^6*a5^6*a3^6 + 8*a6^4*a5^2*x34^6*a3^6 + 8*a6^2*a5^4*x34^6*a3^6 + 8*a6^6*a5^2*a3^10 + 8*a6^2*a5^6*a3^10 + 8*a6^4*a5^2*a3^12 + 8*a6^2*a5^4*a3^12 + 8*a6^6*a5^6*x34^4*a2^2 + 8*a6^6*a5^4*x34^6*a2^2 + 8*a6^4*a5^6*x34^6*a2^2 + 8*a6^6*x34^6*a3^4*a2^2 + 8*a5^6*x34^6*a3^4*a2^2 + 8*a6^4*x34^6*a3^6*a2^2 + 8*a5^4*x34^6*a3^6*a2^2 + 8*a6^6*a3^10*a2^2 + 8*a5^6*a3^10*a2^2 + 8*a6^4*a3^12*a2^2 + 8*a5^4*a3^12*a2^2 + 8*a6^6*a5^6*x34^2*a2^4 + 8*a6^6*a5^2*x34^6*a2^4 + 8*a6^2*a5^6*x34^6*a2^4 + 8*a6^6*a5^6*a3^2*a2^4 + 8*a6^6*x34^6*a3^2*a2^4 + 8*a5^6*x34^6*a3^2*a2^4 + 8*a6^2*x34^6*a3^6*a2^4 + 8*a5^2*x34^6*a3^6*a2^4 + 8*a6^2*a3^12*a2^4 + 8*a5^2*a3^12*a2^4 + 8*a6^6*a5^4*x34^2*a2^6 + 8*a6^4*a5^6*x34^2*a2^6 + 8*a6^6*a5^2*x34^4*a2^6 + 8*a6^2*a5^6*x34^4*a2^6 + 8*a6^4*a5^2*x34^6*a2^6 + 8*a6^2*a5^4*x34^6*a2^6 + 8*a6^6*a5^4*a3^2*a2^6 + 8*a6^4*a5^6*a3^2*a2^6 + 8*a6^6*x34^4*a3^2*a2^6 + 8*a5^6*x34^4*a3^2*a2^6 + 8*a6^4*x34^6*a3^2*a2^6 + 8*a5^4*x34^6*a3^2*a2^6 + 8*a6^2*x34^6*a3^4*a2^6 + 8*a5^2*x34^6*a3^4*a2^6 + 8*a6^6*a3^6*a2^6 + 8*a5^6*a3^6*a2^6 + 8*a6^2*a3^10*a2^6 + 8*a5^2*a3^10*a2^6 + 8*a6^6*a5^6*x34^4*a1^2 + 8*a6^6*a5^4*x34^6*a1^2 + 8*a6^4*a5^6*x34^6*a1^2 + 8*a6^6*x34^6*a3^4*a1^2 + 8*a5^6*x34^6*a3^4*a1^2 + 8*a6^4*x34^6*a3^6*a1^2 + 8*a5^4*x34^6*a3^6*a1^2 + 8*a6^6*a3^10*a1^2 + 8*a5^6*a3^10*a1^2 + 8*a6^4*a3^12*a1^2 + 8*a5^4*a3^12*a1^2 + 8*a6^6*a5^6*a2^4*a1^2 + 8*a6^6*x34^6*a2^4*a1^2 + 8*a5^6*x34^6*a2^4*a1^2 + 8*x34^6*a3^6*a2^4*a1^2 + 8*a3^12*a2^4*a1^2 + 8*a6^6*a5^4*a2^6*a1^2 + 8*a6^4*a5^6*a2^6*a1^2 + 8*a6^6*x34^4*a2^6*a1^2 + 8*a5^6*x34^4*a2^6*a1^2 + 8*a6^4*x34^6*a2^6*a1^2 + 8*a5^4*x34^6*a2^6*a1^2 + 8*x34^6*a3^4*a2^6*a1^2 + 8*a3^10*a2^6*a1^2 + 8*a6^6*a5^6*x34^2*a1^4 + 8*a6^6*a5^2*x34^6*a1^4 + 8*a6^2*a5^6*x34^6*a1^4 + 8*a6^6*a5^6*a3^2*a1^4 + 8*a6^6*x34^6*a3^2*a1^4 + 8*a5^6*x34^6*a3^2*a1^4 + 8*a6^2*x34^6*a3^6*a1^4 + 8*a5^2*x34^6*a3^6*a1^4 + 8*a6^2*a3^12*a1^4 + 8*a5^2*a3^12*a1^4 + 8*a6^6*a5^6*a2^2*a1^4 + 8*a6^6*x34^6*a2^2*a1^4 + 8*a5^6*x34^6*a2^2*a1^4 + 8*x34^6*a3^6*a2^2*a1^4 + 8*a3^12*a2^2*a1^4 + 8*a6^6*a5^2*a2^6*a1^4 + 8*a6^2*a5^6*a2^6*a1^4 + 8*a6^6*x34^2*a2^6*a1^4 + 8*a5^6*x34^2*a2^6*a1^4 + 8*a6^2*x34^6*a2^6*a1^4 + 8*a5^2*x34^6*a2^6*a1^4 + 8*a6^6*a3^2*a2^6*a1^4 + 8*a5^6*a3^2*a2^6*a1^4 + 8*x34^6*a3^2*a2^6*a1^4 + 8*a6^6*a5^4*x34^2*a1^6 + 8*a6^4*a5^6*x34^2*a1^6 + 8*a6^6*a5^2*x34^4*a1^6 + 8*a6^2*a5^6*x34^4*a1^6 + 8*a6^4*a5^2*x34^6*a1^6 + 8*a6^2*a5^4*x34^6*a1^6 + 8*a6^6*a5^4*a3^2*a1^6 + 8*a6^4*a5^6*a3^2*a1^6 + 8*a6^6*x34^4*a3^2*a1^6 + 8*a5^6*x34^4*a3^2*a1^6 + 8*a6^4*x34^6*a3^2*a1^6 + 8*a5^4*x34^6*a3^2*a1^6 + 8*a6^2*x34^6*a3^4*a1^6 + 8*a5^2*x34^6*a3^4*a1^6 + 8*a6^6*a3^6*a1^6 + 8*a5^6*a3^6*a1^6 + 8*a6^2*a3^10*a1^6 + 8*a5^2*a3^10*a1^6 + 8*a6^6*a5^4*a2^2*a1^6 + 8*a6^4*a5^6*a2^2*a1^6 + 8*a6^6*x34^4*a2^2*a1^6 + 8*a5^6*x34^4*a2^2*a1^6 + 8*a6^4*x34^6*a2^2*a1^6 + 8*a5^4*x34^6*a2^2*a1^6 + 8*x34^6*a3^4*a2^2*a1^6 + 8*a3^10*a2^2*a1^6 + 8*a6^6*a5^2*a2^4*a1^6 + 8*a6^2*a5^6*a2^4*a1^6 + 8*a6^6*x34^2*a2^4*a1^6 + 8*a5^6*x34^2*a2^4*a1^6 + 8*a6^2*x34^6*a2^4*a1^6 + 8*a5^2*x34^6*a2^4*a1^6 + 8*a6^6*a3^2*a2^4*a1^6 + 8*a5^6*a3^2*a2^4*a1^6 + 8*x34^6*a3^2*a2^4*a1^6 + 8*a6^4*a5^2*a2^6*a1^6 + 8*a6^2*a5^4*a2^6*a1^6 + 8*a6^4*x34^2*a2^6*a1^6 + 8*a5^4*x34^2*a2^6*a1^6 + 8*a6^2*x34^4*a2^6*a1^6 + 8*a5^2*x34^4*a2^6*a1^6 + 8*a6^4*a3^2*a2^6*a1^6 + 8*a5^4*a3^2*a2^6*a1^6 + 8*x34^4*a3^2*a2^6*a1^6 + 8*a3^6*a2^6*a1^6 ######################################### # Calculation of the Groebner fan of CT # ######################################### # We use AltQ to compute the Grobner fan of CT: # Iq = ideal(AltQ) # GFq = Iq.groebner_fan() # We pre-compute the Grobner fan: # GFqFan = GFq.polyhedralfan() # save(GFqFan,"GrobnerFanCNoa4.sobj") # We convert the data to Rational Polyhedral fan: # newGF = GFqFan.to_RationalPolyhedralFan() # save(newGF, "GFAFan_as_RationalPolyhedra.sobj") # newGF=load("GFAFan_as_RationalPolyhedra.sobj") # We load the pre-computed the Grober fan. GFqFan = load("GrobnerFanCNoa4.sobj") # We record the f-vector: # print GFqFan.f_vector() # [1, 26, 144, 336, 360, 144] # We confirm the dimension of the fan is the expected one: # print GFqFan.dim() # 6 # We record the coordinates of the rays of the Grobner fan: RaysGFqfan = GFqFan.rays() # print RaysGFqfan # [[-5, 1, 1, 1, 1, 1], [-1, -1, -1, -1, -1, 5], [-1, -1, -1, -1, 5, -1], [-1, -1, 1, -1, 1, 1], [-1, -1, 1, 1, -1, 1], [-1, -1, 1, 1, 1, -1], [-1, -1, 2, 2, -1, -1], [-1, -1, 5, -1, -1, -1], [-1, 1, -1, -1, 1, 1], [-1, 1, 1, -1, -1, 1], [-1, 1, 1, -1, 1, -1], [-1, 1, 1, 1, -1, -1], [-1, 5, -1, -1, -1, -1], [1, -5, 1, 1, 1, 1], [1, -1, -1, -1, 1, 1], [1, -1, 1, -1, -1, 1], [1, -1, 1, -1, 1, -1], [1, -1, 1, 1, -1, -1], [1, 1, -5, 1, 1, 1], [1, 1, -1, -1, -1, 1], [1, 1, -1, -1, 1, -1], [1, 1, 1, -5, 1, 1], [1, 1, 1, -1, -1, -1], [1, 1, 1, 1, -5, 1], [1, 1, 1, 1, 1, -5], [5, -1, -1, -1, -1, -1]] # We record the maximal cones of the fan. Each cone is described by the indices of the extremal rays spanning these cones. Such indices refer to the list of 26 rays: MaximalConesQ = GFqFan.maximal_cones().values()[0] # print MaximalConesQ # [[0, 1, 2, 3, 13], [0, 1, 3, 7, 13], [0, 2, 3, 7, 13], [0, 1, 4, 7, 13], [0, 2, 5, 7, 13], [0, 4, 6, 7, 13], [0, 5, 6, 7, 13], [0, 1, 2, 3, 21], [0, 1, 3, 7, 21], [0, 2, 3, 7, 21], [0, 1, 4, 7, 23], [0, 2, 5, 7, 24], [0, 4, 6, 7, 23], [0, 5, 6, 7, 24], [0, 1, 2, 8, 18], [0, 1, 2, 8, 21], [0, 1, 7, 9, 21], [0, 2, 7, 10, 21], [0, 1, 7, 9, 23], [0, 2, 7, 10, 24], [0, 6, 7, 11, 23], [0, 6, 7, 11, 24], [0, 1, 8, 12, 18], [0, 2, 8, 12, 18], [0, 1, 8, 12, 21], [0, 2, 8, 12, 21], [0, 1, 9, 12, 21], [0, 2, 10, 12, 21], [0, 1, 9, 12, 23], [0, 2, 10, 12, 24], [0, 7, 9, 12, 21], [0, 7, 10, 12, 21], [0, 7, 9, 12, 23], [0, 7, 10, 12, 24], [0, 7, 11, 12, 23], [0, 7, 11, 12, 24], [0, 1, 2, 13, 18], [0, 1, 4, 13, 18], [0, 2, 5, 13, 18], [0, 4, 6, 13, 18], [0, 5, 6, 13, 18], [0, 1, 4, 18, 23], [0, 2, 5, 18, 24], [0, 4, 6, 18, 23], [0, 5, 6, 18, 24], [0, 6, 11, 18, 23], [0, 6, 11, 18, 24], [0, 1, 12, 18, 23], [0, 2, 12, 18, 24], [0, 11, 12, 18, 23], [0, 11, 12, 18, 24], [1, 2, 3, 13, 21], [1, 3, 7, 13, 21], [2, 3, 7, 13, 21], [1, 4, 7, 13, 23], [2, 5, 7, 13, 24], [4, 6, 7, 13, 23], [5, 6, 7, 13, 24], [1, 2, 8, 18, 21], [1, 7, 9, 21, 23], [2, 7, 10, 21, 24], [6, 7, 11, 23, 24], [1, 8, 12, 18, 21], [2, 8, 12, 18, 21], [1, 9, 12, 21, 23], [2, 10, 12, 21, 24], [7, 9, 12, 21, 23], [7, 10, 12, 21, 24], [7, 11, 12, 23, 24], [1, 2, 13, 14, 18], [1, 2, 13, 14, 21], [1, 7, 13, 15, 21], [2, 7, 13, 16, 21], [1, 7, 13, 15, 23], [2, 7, 13, 16, 24], [6, 7, 13, 17, 23], [6, 7, 13, 17, 24], [1, 4, 13, 18, 23], [2, 5, 13, 18, 24], [4, 6, 13, 18, 23], [5, 6, 13, 18, 24], [1, 2, 14, 18, 21], [1, 7, 15, 21, 23], [2, 7, 16, 21, 24], [6, 7, 17, 23, 24], [6, 11, 18, 23, 24], [1, 12, 18, 19, 21], [2, 12, 18, 20, 21], [1, 12, 18, 19, 23], [2, 12, 18, 20, 24], [1, 12, 19, 21, 23], [2, 12, 20, 21, 24], [7, 12, 21, 22, 23], [7, 12, 21, 22, 24], [7, 12, 22, 23, 24], [11, 12, 18, 23, 24], [6, 13, 17, 18, 23], [6, 13, 17, 18, 24], [6, 17, 18, 23, 24], [1, 13, 14, 18, 25], [2, 13, 14, 18, 25], [1, 13, 14, 21, 25], [2, 13, 14, 21, 25], [1, 13, 15, 21, 25], [2, 13, 16, 21, 25], [1, 13, 15, 23, 25], [2, 13, 16, 24, 25], [7, 13, 15, 21, 25], [7, 13, 16, 21, 25], [7, 13, 15, 23, 25], [7, 13, 16, 24, 25], [7, 13, 17, 23, 25], [7, 13, 17, 24, 25], [1, 13, 18, 23, 25], [2, 13, 18, 24, 25], [1, 14, 18, 21, 25], [2, 14, 18, 21, 25], [1, 15, 21, 23, 25], [2, 16, 21, 24, 25], [7, 15, 21, 23, 25], [7, 16, 21, 24, 25], [7, 17, 23, 24, 25], [1, 18, 19, 21, 25], [2, 18, 20, 21, 25], [1, 18, 19, 23, 25], [2, 18, 20, 24, 25], [1, 19, 21, 23, 25], [2, 20, 21, 24, 25], [7, 21, 22, 23, 25], [7, 21, 22, 24, 25], [7, 22, 23, 24, 25], [12, 18, 19, 21, 25], [12, 18, 20, 21, 25], [12, 18, 19, 23, 25], [12, 18, 20, 24, 25], [12, 18, 23, 24, 25], [12, 19, 21, 23, 25], [12, 20, 21, 24, 25], [12, 21, 22, 23, 25], [12, 21, 22, 24, 25], [12, 22, 23, 24, 25], [13, 17, 18, 23, 25], [13, 17, 18, 24, 25], [17, 18, 23, 24, 25]] # We record the maximal cones in the Grobner Fan of C as a dictionary of polyhedral objects. The keys coincide with the indices of the maximal cones in the output of the Gfan computation. PolyMaximalConesCT = MaximalCones(GFqFan) # We check that they have the expected dimension: # set([dim(x) for x in PolyMaximalCones.values()]) # {6} ##################################### # Subdivisions induced on each cone # ##################################### # We start by loading the cones: load("allConesGenus2.sage") ########################################################### # Subdivision of Dumbbell induced by the Grobner fan of C # ########################################################### # The following script computes the intersection of the Dumbbell cone with all maximal cells in the Grobner fan of Q. IntersectionsQDumbbellCone = {} for i in range(0,len(PolyMaximalCones.keys())): # print str(i) polyCone =PolyMaximalCones[i] IntersectionQPolyCone = DumbbellCone.intersection(polyCone) IntersectionsQDumbbellCone[i] = IntersectionQPolyCone set([dim(x) for x in IntersectionsQDumbbellCone.values()]) # {1, 2, 3, 4, 5, 6} # We record those intersection of maximal dimension, i.e. the dimension of the Theta Cone. maxIntersections = [i for i in IntersectionsQDumbbellCone.keys() if dim(IntersectionsQDumbbellCone[i])==6] # print maxIntersections # [179] SubdivisionsOfDumbbellByQ = [IntersectionsQDumbbellCone[i] for i in maxIntersections] # print [len(SubdivisionsOfDumbbellByQ[i].rays()) for i in range(0,len(SubdivisionsOfDumbbellByQ))] # [5] # print [dim(SubdivisionsOfDumbbellByQ[i]) for i in range(0,len(SubdivisionsOfDumbbellByQ))] # [6] # No subdivision is produced. ######################################################### # Subdivision of Theta induced by the Grobner fan of CT # ######################################################### # The following script computes the intersection of the Theta cone with all maximal cells in the Grobner fan of Q. IntersectionsQThetaCone = {} for i in range(0,len(PolyMaximalConesCT.keys())): # print str(i) polyCone =PolyMaximalConesCT[i] IntersectionQPolyCone = ThetaCone.intersection(polyCone) IntersectionsQThetaCone[i] = IntersectionQPolyCone set([dim(x) for x in IntersectionsQThetaCone.values()]) # {1, 2, 3, 4, 5, 6} # We record those intersection of maximal dimension, i.e. the dimension of the Theta Cone. maxIntersections = [i for i in IntersectionsQThetaCone.keys() if dim(IntersectionsQThetaCone[i])==6] # print maxIntersections # [135] SubdivisionsOfThetaByQ = [IntersectionsQThetaCone[i] for i in maxIntersections] # print [len(SubdivisionsOfThetaByQ[i].rays()) for i in range(0,len(SubdivisionsOfThetaByQ))] # [5] # print [dim(SubdivisionsOfThetaByQ[i]) for i in range(0,len(SubdivisionsOfThetaByQ))] # [6] # No subdivision is produced. ############################################################### # Subdivision of Figure Eight induced by the Grobner fan of C # ############################################################### # The following script computes the intersection of the Figure Eight cone with all maximal cells in the Grobner fan of Q. IntersectionsQFigEightCone = {} for i in range(0,len(PolyMaximalCones.keys())): # print str(i) polyCone =PolyMaximalCones[i] IntersectionQPolyCone = FigEightCone.intersection(polyCone) IntersectionsQFigEightCone[i] = IntersectionQPolyCone set([dim(x) for x in IntersectionsQFigEightCone.values()]) # {1, 2, 3, 4, 5} # We record those intersection of maximal dimension, i.e. the dimension of the Theta Cone. maxIntersections = [i for i in IntersectionsQFigEightCone.keys() if dim(IntersectionsQFigEightCone[i])==5] # print maxIntersections # [176, 179] SubdivisionsOfFigEightByQ = [IntersectionsQFigEightCone[i] for i in maxIntersections] # print [len(SubdivisionsOfFigEightByQ[i].rays()) for i in range(0,len(SubdivisionsOfFigEightByQ))] # [4, 4] # print [dim(SubdivisionsOfFigEightByQ[i]) for i in range(0,len(SubdivisionsOfFigEightByQ))] # [5, 5] # We check the two cells agree: # SubdivisionsOfFigEightByQ[0] == SubdivisionsOfFigEightByQ[1] # True # No subdivision is produced. ########################################################## # Subdivision of Type IV induced by the Grobner fan of C # ########################################################## # The following script computes the intersection of the Type IV cone with all maximal cells in the Grobner fan of Q. IntersectionsQTypeIVCone = {} for i in range(0,len(PolyMaximalCones.keys())): # print str(i) polyCone =PolyMaximalCones[i] IntersectionQPolyCone = TypeIVCone.intersection(polyCone) IntersectionsQTypeIVCone[i] = IntersectionQPolyCone set([dim(x) for x in IntersectionsQTypeIVCone.values()]) # {1, 2, 3, 4, 5} # We record those intersection of maximal dimension, i.e. the dimension of the Theta Cone. maxIntersections = [i for i in IntersectionsQTypeIVCone.keys() if dim(IntersectionsQTypeIVCone[i])==5] # print maxIntersections # [83, 89] SubdivisionsOfTypeIVByQ = [IntersectionsQTypeIVCone[i] for i in maxIntersections] # print [len(SubdivisionsOfTypeIVByQ[i].rays()) for i in range(0,len(SubdivisionsOfTypeIVByQ))] # [4, 4] # print [dim(SubdivisionsOfTypeIVByQ[i]) for i in range(0,len(SubdivisionsOfTypeIVByQ))] # [5, 5] # We check that these intersections are the same. We conclude there is no subdivision. # print [(i,j) for i in range(0,len(maxIntersections)-1) for j in range(i+1,len(maxIntersections)) if SubdivisionsOfTypeIVByQ[i] == SubdivisionsOfTypeIVByQ[j]] # [(0,1)] # No subdivision is produced. ######################################################### # Subdivision of Type V induced by the Grobner fan of C # ######################################################### # The following script computes the intersection of the Type V cone with all maximal cells in the Grobner fan of Q. IntersectionsQTypeVCone = {} for i in range(0,len(PolyMaximalCones.keys())): # print str(i) polyCone =PolyMaximalCones[i] IntersectionQPolyCone = TypeVCone.intersection(polyCone) IntersectionsQTypeVCone[i] = IntersectionQPolyCone set([dim(x) for x in IntersectionsQTypeVCone.values()]) # {1, 2, 3, 4} # We record those intersection of maximal dimension, i.e. the dimension of the Theta Cone. maxIntersections = [i for i in IntersectionsQTypeVCone.keys() if dim(IntersectionsQTypeVCone[i])==4] # print maxIntersections # [166, 167, 178, 179] SubdivisionsOfTypeVByQ = [IntersectionsQTypeVCone[i] for i in maxIntersections] # print [len(SubdivisionsOfTypeVByQ[i].rays()) for i in range(0,len(SubdivisionsOfTypeVByQ))] # [3, 3, 3, 3] # print [dim(SubdivisionsOfTypeVByQ[i]) for i in range(0,len(SubdivisionsOfTypeVByQ))] # [4, 4, 4, 4] # We check that these intersections are the same. We conclude there is no subdivision. # print [(i,j) for i in range(0,len(maxIntersections)-1) for j in range(i+1,len(maxIntersections)) if SubdivisionsOfTypeVByQ[i] == SubdivisionsOfTypeVByQ[j]] # [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)] # No subdivision is produced. ########################################################## # Subdivision of Type VI induced by the Grobner fan of C # ########################################################## # The following script computes the intersection of the Type VI cone with all maximal cells in the Grobner fan of Q. IntersectionsQTypeVICone = {} for i in range(0,len(PolyMaximalCones.keys())): # print str(i) polyCone =PolyMaximalCones[i] IntersectionQPolyCone = TypeVICone.intersection(polyCone) IntersectionsQTypeVICone[i] = IntersectionQPolyCone set([dim(x) for x in IntersectionsQTypeVICone.values()]) # {1, 2, 3, 4} # We record those intersection of maximal dimension, i.e. the dimension of the Theta Cone. maxIntersections = [i for i in IntersectionsQTypeVICone.keys() if dim(IntersectionsQTypeVICone[i])==4] # print maxIntersections # [152, 155, 164, 167, 176, 179] SubdivisionsOfTypeVIByQ = [IntersectionsQTypeVICone[i] for i in maxIntersections] # print [len(SubdivisionsOfTypeVIByQ[i].rays()) for i in range(0,len(SubdivisionsOfTypeVIByQ))] # [3, 3, 3, 3, 3, 3] # print [dim(SubdivisionsOfTypeVIByQ[i]) for i in range(0,len(SubdivisionsOfTypeVIByQ))] # [4, 4, 4, 4, 4, 4] # We check that these intersections are the same. We conclude there is no subdivision. # all( [SubdivisionsOfTypeVIByQ[i] == SubdivisionsOfTypeVIByQ[j] for i in range(0,len(maxIntersections)-1) for j in range(i+1,len(maxIntersections))]) # True # No subdivision is produced. ########################################################### # Subdivision of Type VII induced by the Grobner fan of C # ########################################################### # The following script computes the intersection of the Type VII cone with all maximal cells in the Grobner fan of Q. IntersectionsQTypeVIICone = {} for i in range(0,len(PolyMaximalCones.keys())): # print str(i) polyCone =PolyMaximalCones[i] IntersectionQPolyCone = TypeVIICone.intersection(polyCone) IntersectionsQTypeVIICone[i] = IntersectionQPolyCone set([dim(x) for x in IntersectionsQTypeVIICone.values()]) # {1, 2, 3} # We record those intersection of maximal dimension, i.e. the dimension of the Theta Cone. maxIntersections = [i for i in IntersectionsQTypeVIICone.keys() if dim(IntersectionsQTypeVIICone[i])==3] # print maxIntersections # [129, 131, 135, 137, 141, 143, 147, 149, 151, 152, 154, 155, 159, 161, 163, 164, 166, 167, 171, 173, 175, 176, 178, 179] SubdivisionsOfTypeVIIByQ = [IntersectionsQTypeVIICone[i] for i in maxIntersections] # print [len(SubdivisionsOfTypeVIIByQ[i].rays()) for i in range(0,len(SubdivisionsOfTypeVIIByQ))] # [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] # print [dim(SubdivisionsOfTypeVIIByQ[i]) for i in range(0,len(SubdivisionsOfTypeVIIByQ))] # [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] # We check that these intersections are the same. We conclude there is no subdivision. # all( [SubdivisionsOfTypeVIIByQ[i] == SubdivisionsOfTypeVIIByQ[j] for i in range(0,len(maxIntersections)-1) for j in range(i+1,len(maxIntersections))]) # True # No subdivision is produced. ############################################################################# # CONCLUSION: No subdivisions are produced and we can use any sample point to compute initial forms. ##############################################################################