/* ======================================================================================= With this part of the program we check the freeness conditions from Proposition 2.3.2 of my thesis. Recall that the freeness conditions differ, according to the index of G0 in G. We also use the code in the paper "Mixed Threefolds Isogenous to a Product". Any citations below e.g. Proposition 2.3.2 refer to my thesis. ======================================================================================== */ /* The script "StabSet" determines the stabilizer set of a generating vector V of type T for the group G (cf. Definition 2.3.1). */ StabSet:= function(V,T,G) h:=T[1]; Set:={Id(G)}; for i in [1..#T-1] do g:=V[i]; for n in [1..Order(g)] do Set := Set join Conjugates(G,g^n) ; end for; end for; return Set; end function; /* The script "SmoothUnmixed" decides if the freeness condition from Proposition 2.3.2 a) holds (unmixed case). True or false is returned accordingly. */ SmoothUnmixed:=function(G,V1,V2,V3,T1,T2,T3) test:=true; stab1:=StabSet(V1,T1,G); stab2:=StabSet(V2,T2,G); stab3:=StabSet(V3,T3,G); if #(stab1 meet stab2 meet stab3) gt 1 then test:=false; end if; return test; end function; /* The script "SmoothIndex2" decides if the conditions i) and ii) from Proposition 2.3.2 b) are fulfilled. True is returned if both of them hold and otherwise false. Condition ii) is checked by the subscript "SmoothCondii". */ SmoothCondii:=function(Stabset1,Stabset2,G0,delta) test:=true; for g in G0 do if delta*g in Stabset1 and (delta*g)^2 in Stabset2 then test:=false; break g; end if; end for; return test; end function; SmoothIndex2:=function(G,G0,V1,V2,T1,T2) test:=false; delta:=Rep({x: x in G| x notin G0}); Stabset1:=StabSet(V1,T1,G); Stabset2:=StabSet(V2,T2,G0); Stabset3:={delta*x*delta^(-1): x in Stabset2}; Intersect:=Stabset1 meet Stabset2 meet Stabset3; if #Intersect eq 1 and SmoothCondii(Stabset1,Stabset2,G0,delta) then test:= true; end if; return test; end function; /* The script "SmoothIndex3i" returns true if condition i) from Proposition 2.3.2 c) holds and otherwise false. Note that we don't implement the second condition, since it is (under the assumption that i) holds) equivalent to the condition that the short exact sequence 1 --> G0 --> G --> A3 --> 1 is non-split. The latter is verified in the main part of the algorithm before we even start to search for generating vectors. */ SmoothIndex3i:=function(G,G0,tau,V1,T1) test:=false; stab1:=StabSet(V1,T1,G0); stab2:={tau^2*x*tau^(-2): x in stab1}; stab3:={tau*x*tau^(-1): x in stab1}; if #(stab1 meet stab2 meet stab3) eq 1 then test:=true; end if; return test; end function; /* The script "SmoothIndex6" decides if the conditions i), ii) and iii) from Proposition 2.3.2 d) are fulfilled. True is returned if all of them hold and otherwise false. Condition iii) is checked by the subscript "SmoothCondiii". */ SmoothCondiii:=function(stab1,G1,G0,tau) test:=true; for f in (Set(G1) diff Set(G0)) meet stab1 do if tau*(f^2)*tau^(-1) in stab1 then test:=false; break f; end if; end for; return test; end function; SmoothIndex6:=function(G,G0,tau,h,V1,T1) G1:=sub; test:=false; stab1:=StabSet(V1,T1,G1); stab2:={tau^2*x*tau^(-2): x in stab1}; stab3:={tau*x*tau^(-1): x in stab1}; Intersect:=stab1 meet stab2 meet stab3; S1:={(tau*x)^3: x in G0}; if #Intersect eq 1 and IsEmpty(S1 meet stab1) and SmoothCondiii(stab1,G1,G0,tau) then test:=true; end if; return test; end function;