/* ======================================================================================================= This file contains the main routine to classify threefolds isogenous to a product in the index three case under the assumption that the G-action is absolutely faithful. The code is also used in the paper "Mixed Threefolds Isogenous to a Product" and in my PhD thesis. Any citations below e.g. Corollary 3.0.7 refer to my thesis. =========================================================================================================*/ /*To run the implementation we need to load the following files: */ load "Isogenous/SubIso/Types.magma"; load "Isogenous/SubIso/HodgeDiamond.magma"; load "Isogenous/SubIso/GenVectors.magma"; load "Isogenous/SubIso/FreenessCond.magma"; /*The script "AdNDindexThree" is used to determine the set of admissible numerical data for a given input value of chi (<=-1) (see the algorithm in Chapter 3). We briefly explain the strategy: 1) we determine the maximum value "GOrdMax" of GOrd according to Corollary 3.0.7. and the maximum value "g1max" of g1 in terms of "GOrdMax" using Remark 3.0.12. 2) we run through all admissible values of g1 in the range 2 <= g1 <=g1max, determine the corresponding group order GOrd:= -chi*(g1-1)^3 and check the following conditions: * GOrd is divisible by 9 (cf. Corollary 2.3.4) and * GOrd/3 are less or equal to the maximum order of the automorphism group of a curve of genus g1 (i.e. Conder(GOrd/3,g1) returns true). The pairs [GOrd,g1] which fulfill these conditions are stored in the list "ListPairs". 3) for each pair [GOrd,g1] in "ListPairs" we run through the admissible genera h1 of the quotient curve C1/G0. The genus h1 is bounded by 1-3*chi/(g1-1)^2 according to Proposition 3.0.10 vi). 4) for those combinations, where the inequality from Proposition 3.0.6 holds, we determine the admissible types T1 i.e. ListOfTypes(GOrd/3,g1,(g1-1)^2,h1) and form all possible pairs [GOrd,T1]. Those pairs where the groups of order GOrd/3 are not contained in the database of Small Groups are stored in the file "ExcepIndexThree(chi)". The remaining tuples are returned as the output of the function. */ AdNDindexThree:=function(chi) F:="ExcepIndexThree" cat IntegerToString(chi) cat ".txt"; fprintf F, "Index three case, chi=%o and absolutely faithful G-action.\n\n\n Exceptional numerical data:\n\n\n", chi; GOrdMax:=Floor(1512*Sqrt(-7*chi)); g1max:=Floor(Root(-chi*GOrdMax, 3)+1); ListAdIndex3:=[]; ListPairs:=[]; for g1 in [2..g1max] do GOrd:=-(g1-1)^3/chi; if GOrd/9 in IntegerRing() and Conder(GOrd/3,g1) then GOrd:=IntegerRing()!GOrd; Append(~ListPairs,[GOrd,g1]); end if; end for; for Pair in ListPairs do GOrd:=Pair[1]; G0_Ord:=IntegerRing()!(GOrd/3); g1:=Pair[2]; h1max:= Floor(1-3*chi/(g1-1)^2); for h1 in [0..h1max] do if GOrd^2 le -216*chi/(ThetaMin(h1)^3) then for T1 in ListOfTypes(G0_Ord,g1,(g1-1)^2,h1) do D:=[[GOrd],T1]; if IsInSmallGroupDatabase(G0_Ord) then Append(~ListAdIndex3,D); else fprintf F, "D=%o\n\n", D; end if; end for; end if; end for; end for; return ListAdIndex3; end function; /* The script "NDHIndexThree" is used to determine the set of triples of the form [GOrd,T1,H], where [GOrd,T1] is an admissible numerical datum and H is a candidate for G0 i.e. * H is of order GOrd/3 and * H admits three generating vectors U, V and W of type T1 with trivial intersection of the corresponding stabilizer sets. The triples [GOrd,T1,H], where the groups of order GOrd are not contained in the database of Small Groups are stored in the file "ExcepIndexThree(chi)". The remaining triples are returned as the output of the function. */ NDHIndexThree:=function(chi) AdNum:=AdNDindexThree(chi); F:="ExcepIndexThree" cat IntegerToString(chi) cat ".txt"; fprintf F,"Exceptional triples: \n\n\n "; Ord_T1_H:=[]; for Tup in AdNum do GOrd:=Tup[1][1]; T1:=Tup[2]; for H in SmallGroups(IntegerRing()!(GOrd/3): Warning:=false) do GV:=GenVecRep(H,T1); for U in GV do for V in GV do for W in GV do if #(StabSet(U,T1,H) meet StabSet(V,T1,H) meet StabSet(W,T1,H)) eq 1 then ID:=IdentifyGroup(H); DNew:=Tup cat [[ID[1],ID[2]]]; if IsInSmallGroupDatabase(GOrd) then Append(~Ord_T1_H,DNew); else fprintf F, "%o\n\n", DNew; end if; break U; end if; end for; end for; end for; end for; end for; return Ord_T1_H; end function; /* The function "NonSplitIndex3" returns "true" if the short exact sequence 1 --> G0 --> G --> A3 --> 1 is non-split (or equivalently no element in G\G0 is of order three). This condition is equivalent to the freeness condition of Proposition 2.3.2 c) ii) under the assumption that Proposition 2.3.2 c) i) holds (see Proposition 2.3.3). */ NonSplitIndex3:=function(G,G0) test:=true; L:=Set(G) diff Set(G0); if not IsEmpty(ElsOfOrd(L,3)) then test:=false; end if; return test; end function; /* The script "ClassifyIndexThree" is used to perform Step 2 of the algorithm in Chapter 3. It determines for a given negative integer "chi" (the input value) all threefolds isogenous to a product of mixed type with "chi(O_X)=chi" in the index three case. The strategy is the following: 1) we determine the list "PossOrders", which contains all integers GOrd belonging to some triple [GOrd,T1,H] in "NDHIndexThree(chi)". 2) for each GOrd in "PossOrders" and for each group G of order GOrd, we build the set "PG0" of normal subgroups G0 of Order GOrd/3 such that the short exact sequence 1 --> G0 --> G --> A3 --> 1 is non-split. 3) we run through the groups G0 in PG0, choose an element "tau" outside of G0 and run through the triples [GOrd,T1,H] in "NDHIndexThree(chi)". For those triples, where H is isomorphic to G0 we determine a set of representatives of generating vectors V1 of type T1 calling the function "GenVecRep(G,T1)". 4) we run through all V1 contained in GenVecRep(G,T1) and consider the tuples (G,G0,tau,V1). 5) those tuples (G,G0,tau,V1) which fulfill the freeness condition of Proposition 2.3.2 c) i), i.e. "SmoothIndex3i(G,G0,tau,V1,T1)" returns true, are algebraic data of (families) of threefolds X isogenous to a product. We compute the Hodge numbers of these threefolds X with the help of the function "HodgeDiamondIndex3". The groups G and G0, the type T1, the Hodge numbers and the dimension of the families (cf. Remark 2.3.7) are stored in the file "IndexThree(chi).txt". */ ClassifyIndexThree:=function(chi) F:="IndexThree" cat IntegerToString(chi) cat ".txt"; fprintf F, "Threefolds isogenous to a product of mixed type: \n index three case, chi=%o and absolutely faithful G-action:\n\n\n\n\n", chi; count:=1; Num_H:=NDHIndexThree(chi); Set:={}; for Tup in Num_H do Include(~Set,Tup[1][1]); end for; PossOrders:=OrderedSeq(Set); for GOrd in PossOrders do G0_Ord:=IntegerRing()!(GOrd/3); for G in SmallGroups(GOrd: Warning:=false) do invarset:={}; NG0:=NormalSubgroups(G); PG0:={NG0[i]`subgroup : i in [1..#NG0]| NG0[i]`order eq G0_Ord and NonSplitIndex3(G,NG0[i]`subgroup)}; for G0 in PG0 do IdG0:=IdentifyGroup(G0); tau:=Rep({x: x in G| x notin G0}); for D in Num_H do n:=D[1][1]; T1:=D[2]; identi:=D[3]; if n eq GOrd and [IdG0[1],IdG0[2]] eq identi then for V1 in GenVecRep(G0,T1) do if SmoothIndex3i(G,G0,tau,V1,T1) then invar:=HodgeDiamondIndex3(G,G0,tau,V1,T1) cat T1 cat [IdG0[1],IdG0[2]]; if invar notin invarset then Include(~invarset,invar); fprintf F, "%o) Groups: G= %o, G0= %o\n", count, IdentifyGroup(G), IdG0; fprintf F, "\n Type: T1=%o \n", T1; fprintf F, "\n Hodge numbers: h30=%o, h20=%o, h10=%o, h11= %o and h12=%o\n", invar[1],invar[2], invar[3], invar[4], invar[5]; fprintf F, "\n Number of parameters: %o \n", 3*T1[1] -4 + #T1; fprintf F, "\n\n\n\n\n"; count:=count+1; end if; end if; end for; end if; end for; end for; end for; end for; return "Classification_accomplished"; end function;