// This is the MAGMA implementation of our algorithm to determine phi-twisted representation groups // (cf. Section 4) /* For a given finite group G and action phi: G -> Aut(C), we want to determine all phi-twisted representation groups Gamma of G, i.e. we have to determine all extensions 0 -> A -> Gamma -> G -> 1, where A=H^2(G,C^*), such that (1) |H^1(G,C^*)| = |H^1(Gamma,C^*)| and (2) Hom_G(A,C^*)=Hom(A,C^*). for this, we identify H^j(G,C^*)=H^{j+1}(G,Z), for j=1,2, where G acts on Z via phi and sending conj to [-1], which gives a character X of G with values in {1,-1}. Notice that Gamma is a C^*-module via phi°pi, where pi: Ga -> G is the quotient map. The main function will therefore has as input the group G and the character X. We start with two help functions. */ /* The function "Phi" has as input "x=X(g)", for an element g in G, and an element "v" in C, and determines the value phi(g)(v), which is v, if x=[1], ComplexConjugate(v), if x=[-1]. */ function Phi(x,v) Id1:=DiagonalMatrix([1]); if x eq Id1 then return v; else return ComplexConjugate(v); end if; end function; /* The function "TestInvariance" has as input the group "A" with "a" generators and the group "Ga" with "m" generators. The group A is embedded in Ga such that the generators of A equal the last a generators of Ga. The action of Ga on Z is encoded in "actGa", which is a list where the i-th entry is the action (as 1x1-matrix) of the i-th generator of Ga on Z. The function checks condition (2). For this, we use that Hom(A,C^*) equals the set of irreducible characters of A. We need to check, whether all of them are G-invariant, where G acts on A via g*a:=s(g)as(g^-1), where s:G -> Ga is a section. We use that the first m-a generators of Ga define preimages of the generators of G under pi: Ga -> G. The function returns "true" if condition (2) is fulfilled, "false" otherwise. */ function TestInvariance(A,Ga,actGa,m,a) CT:=CharacterTable(A); for x in CT do for i in [1..m-a] do for j in [m-a+1..m] do if not x(Ga.i*Ga.j*Ga.i^-1) eq Phi(actGa[i],x(Ga.j)) then return false; end if; end for; end for; end for; return true; end function; /* The function "KernelCokernelExtension" has as input an extension "Ga" (of G by A), its image "GaRef" under the Cayley-embedding "f", the number "m" of generators of G and "a"=#A. It returns the kernel "APer" as subgroup of GaRef and the quotient "Quot"=Ga/APer and the quotient map "pi":Ga -> Quot. Note that the kernel A is generated by the last generators of GaRef, the problem is that we don't know how many generators we have to take (the number can differ from #Generators(A). Therefore, the last output "i" gives this number of generators of APer. */ function KernelCokernelExtension(Ga,GaRef,f,m,a) for i in [1..m] do APer:=sub; if #APer eq a then Quot, pi:= quo; return APer, Quot, pi, i; end if; end for; end function; /*************** MAIN FUNCTION ****************************************************************/ /* INPUT: finite, solvable Group G of type GrpPerm, character X of G of degree 1 with values in {1,-1} representing an action phi of G on C OUPUT: A=H^2(G,C^*)(in terms of invariants) and a list of all phi-twisted representation groups of G Explanation: the invariants [n_1,...n_k] correspond to the abelian group Z_{n_1} x ... x Z_{n_k} */ function RepGroups(G,X) g:=#Generators(G); Id1:=DiagonalMatrix([1]); act:=[X(G.i)*Id1: i in [1..g]]; // The i-th element of act gives the action of the i-th generator of G on Z as a 1x1-matrix. CMG:= CohomologyModule(G,[0],act); TwistedSchurG:=CohomologyGroup(CMG,3); // TwistedSchurG=H^3(G,Z)=H^2(G,C^*) invarA:=Moduli(TwistedSchurG); // #invariants of the abelian Group A = #generators of A if invarA eq [] then // in this case, the twisted Schur multiplier is trivial. return invarA, G; end if; A:=AbelianGroup(GrpPerm,invarA); // A = H^2(G,C^*), of type GrpPerm a:=#A; E:=ExtensionsOfSolubleGroup(A,G); // all candidates for the phi-twisted representation groups, each group in the list is given as GrpFP, the last generators correspond to A ListRepGroups:=[]; h1G:=#CohomologyGroup(CMG,2); for k in [1..#E] do GaRef:=E[k]; f,Ga:= CosetAction(GaRef,sub); //Transform the extension GaRef into GrpPerm using the Cayley-embedding f m:=#Generators(GaRef); APer, Quot, pi, genA:=KernelCokernelExtension(Ga,GaRef,f,m,a); test, psi:=IsIsomorphic(Quot,G); // psi: Quot -> G defines an isomorphism actGa:=[X(psi(pi(Ga.i)))*Id1 : i in [1..m]]; // the action of Ga is given by composing the action of G with psi and pi. CMGa:=CohomologyModule(Ga,[0],actGa); if h1G eq #CohomologyGroup(CMGa,2) and TestInvariance(APer,Ga,actGa,m,genA) then Append(~ListRepGroups,Ga); end if; end for; return invarA, ListRepGroups; end function; // Here we compute the representation groups in Example 4.2 G:=DihedralGroup(4); CT:=CharacterTable(G); X:=CT[1]; RepGroups(G,X); // ************************************************************************************************** // With the MAGMA code from below, we show that the group "N" in Example 4.10 is not a covering group // for the given action. F:=CyclotomicField(12); ze:=F.1^4; i:=F.1^3; t:=(1+2*ze)/3; // The function RI returns real and imaginary part of a complex number "c". */ RI:=function(c) re:=(c+ComplexConjugate(c))/2; im:=-i*(c-re); return [re, im]; end function; // The function "RealMat" turns a complex 3x3 matrix "D" into a real 6x6 matrix under the canonical embedding RealMat:=function(D) return Matrix(F, 6, 6, [RI(D[1][1])[1],-RI(D[1][1])[2],RI(D[1][2])[1],-RI(D[1][2])[2],RI(D[1][3])[1],-RI(D[1][3])[2], RI(D[1][1])[2],RI(D[1][1])[1],RI(D[1][2])[2],RI(D[1][2])[1],RI(D[1][3])[2],RI(D[1][3])[1], RI(D[2][1])[1],-RI(D[2][1])[2],RI(D[2][2])[1],-RI(D[2][2])[2],RI(D[2][3])[1],-RI(D[2][3])[2], RI(D[2][1])[2],RI(D[2][1])[1],RI(D[2][2])[2],RI(D[2][2])[1],RI(D[2][3])[2],RI(D[2][3])[1], RI(D[3][1])[1],-RI(D[3][1])[2],RI(D[3][2])[1],-RI(D[3][2])[2],RI(D[3][3])[1],-RI(D[3][3])[2], RI(D[3][1])[2],RI(D[3][1])[1],RI(D[3][2])[2],RI(D[3][2])[1],RI(D[3][3])[2],RI(D[3][3])[1]]); end function; // These are the three C-linear matrices C1,..,C3, which generate N. C1:=DiagonalMatrix([ze,ze^2,1]); C2:=-t*Matrix([[1,ze^2,ze^2],[ze^2,1,ze^2],[ze^2,ze^2,1]]); C3:=t*Matrix([[1,1,1],[1,ze^2,ze],[1,ze,ze^2]]); C4:=Matrix(F, 6, 6,[1,0,0,0,0,0,0,-1,0,0,0,0,0,0,1,0,0,0,0,0,0,-1,0,0,0,0,0,0,1,0,0,0,0,0,0,-1]); // The group of semilinearities SR= as a subgroup of GL(6,F). N:=sub; a:=DiagonalMatrix([-ze,-ze,-ze]); A:=sub; S, pi:=N/A; I1:=DiagonalMatrix([1]); CM_N := CohomologyModule(N,[0],[I1,I1,I1,-I1]); CM_S := CohomologyModule(S,[0],[I1,I1,I1,-I1]); // These are the cohomology groups H^1(S,C^*) and H^1(N,C^*). They have different order, violating the third // condition of Proposition 3.11 CohomologyGroup(CM_S,2); CohomologyGroup(CM_N,2);