GAP code
Accompanying codes for Unramified Brauer groups of homogeneous spaces with finite stabilisers and the Grunwald problem, arXiv:2506.02600. The computations used in the paper are those of GAP code 3. GAP codes 1 and 2 give an independent computation of Ш2ab(G, Z/2) with the package HAP; they work in principle but are very expensive in memory for the groups considered here.
GAP code 1 — BogomolovMultiplierModP
Computes the subgroup of H2(G, Z/p) of classes vanishing on every abelian subgroup of G, i.e. the group Ш2ab(G, Z/p), and returns its abelian invariants (save it as BogomolovModP.g so that GAP code 2 can read it). I thank Graham J. Ellis for writing and sharing this code to me.
#####################################################
#####################################################
BogomolovMultiplierModP:=function(G,p)
local R, MaxAbelian, maxab, homs, HOMS, H, gensH, newh, Kers,
InducedHom, h, iso;
#####Some easy cases##################
if IsAbelian(G) then return []; fi;
if not IsPGroup(G) then
if GroupCohomology(G,2,2)=[] then return []; fi;
fi;
######################################
R:=ResolutionGenericGroup(G,3);
#####################################################
MaxAbelian:=function(G)
local AbSubs, A, x, g, bool;
##Probably a clumsy method for finding all maximal abelian subgroups
##
AbSubs:=ConjugacyClassesSubgroups(G);
AbSubs:=Filtered(AbSubs,x->IsAbelian(Representative(x)));
AbSubs:=List(AbSubs,a->Representative(a));
AbSubs:=List(AbSubs,b->ConjugateSubgroups(G,b));
AbSubs:=Concatenation(AbSubs);
AbSubs:=Filtered(AbSubs,x->Order(x)>1);
A:=[];
for g in AbSubs do
bool:=true;
for x in AbSubs do
if not g=x and IsSubgroup(x,g) then bool:=false; break;fi;
od;
if bool then Add(A,g); fi;
od;
return A;
end;
####################################################
maxab:=MaxAbelian(G);
####################################################
InducedHom:=function(R,A)
local G, S, f;
G:=R!.group;
S:=ResolutionFiniteGroup(A,3);
f:=GroupHomomorphismByFunction(A,G,x->x);
f:=EquivariantChainMap(S,R,f);
f:=HomToIntegersModP(f,p);
f:=Cohomology(f,2);
return f;
end;
####################################################
homs:=List(maxab,A->InducedHom(R,A));
HOMS:=[];
H:=Source(homs[1]);
#iso:=IsomorphismPcGroup(H);
iso:=NqEpimorphismNilpotentQuotient(H,1);
gensH:=List(GeneratorsOfGroup(H),x -> Image(iso,x));
H:=Range(iso);
for h in homs do
newh:=GroupHomomorphismByImagesNC(H,Range(h),gensH, h!.MappingGeneratorsImages[2]);
Add(HOMS,newh);
od;
Kers:=List(HOMS,Kernel);
return AbelianInvariants(Intersection(Kers));
end;
#####################################################
#####################################################
GAP code 2 — the 4-fold covers of PSL3(F4) with non-trivial Bogomolov multiplier
Constructs the 4-fold covers G of PSL3(F4) with non-trivial Bogomolov multiplier B0(G) and computes Ш2ab(G, Z/2) for them, using GAP code 1 (requires the file BogomolovModP.g in the current directory of GAP). Warning: this computation is very expensive in memory.
LoadPackage("hap");
P:=PSL(3,4);
epi:=EpimorphismSchurCover(P,[2]);
F:=Source(epi);
x:=PreImagesRepresentative(epi,First(GeneratorsOfGroup(SylowSubgroup(P,7)),y->Order(y)=7));
act:=FactorCosetAction(F,Subgroup(F,[x^8]));
Gt:=Image(act);
M:=Image(act,Kernel(epi));
#####################################################
## 4-fold covers G=Gt/U of PSL(3,4) with non-trivial B0(G):
## the generator of H^2(G,Z/2) (double cover Gt/U', kernel <e>)
## lies in B0(G) iff no commuting pair of G lifts to a pair with commutator e
InB0:=function(U)
local Up, hE, e, S2;
Up:=First(AllSubgroups(U),H->Size(H)=2);
hE:=NaturalHomomorphismByNormalSubgroup(Gt,Up);
e:=Image(hE,First(Elements(U),u->not u in Up));
S2:=Elements(SylowSubgroup(Image(hE),2));
return not ForAny(S2,a->ForAny(S2,b->Comm(a,b)=e));
end;
#####################################################
covers:=List(Filtered(AllSubgroups(M),U->Size(U)=4 and IsCyclic(M/U) and InB0(U)),
U->Image(SmallerDegreePermutationRepresentation(
Image(NaturalHomomorphismByNormalSubgroup(Gt,U)))));
Read("BogomolovModP.g");
Display(List(covers,G->BogomolovMultiplierModP(G,2)));
GAP code 3 — ramification over the field of real numbers for the 4-fold covers of PSL3(F4)
For each of the six 4-fold covers G of PSL3(F4), this code checks whether the generator of H2(G, Z/2) lies in B0(G) and in Ш2ab(G, Z/2), and that it violates the Galois condition (ii) of Theorem 4.4 for complex conjugation (hence ramifies over the real numbers). It also verifies the explicit pair (τ, γ) used in the proof.
S:=SL(3,4);
w:=Z(4);
hom:=ActionHomomorphism(S,NormedRowVectors(GF(4)^3),OnLines);
P:=Image(hom);
epi:=EpimorphismSchurCover(P,[2]);
F:=Source(epi);
x:=PreImagesRepresentative(epi,First(GeneratorsOfGroup(SylowSubgroup(P,7)),y->Order(y)=7));
act:=FactorCosetAction(F,Subgroup(F,[x^8]));
Gt:=Image(act);
pr:=GroupHomomorphismByImages(Gt,P,List(GeneratorsOfGroup(F),g->Image(act,g)),
List(GeneratorsOfGroup(F),g->Image(epi,g)));
M:=Kernel(pr);
#####################################################
#####################################################
## 4-fold cover G=Gt/U of PSL(3,4), double cover Et=Gt/U' of G representing
## the generator of H^2(G,Z/2), with kernel <e>.
## Returns [x in B0(G), x in Sha^2_ab(G,Z/2), x ramified over R,
## results for the explicit pair (tau,gamma), lambda=1,w,w^2]
RealCover:=function(U)
local Up, hE, Et, e, qG, pEP, K, S2, inB0, inSha, ram, UT, wit;
UT:=function(a,b,c) return [[1,a,b],[0,1,c],[0,0,1]]*One(GF(4)); end;
Up:=First(AllSubgroups(U),H->Size(H)=2);
hE:=NaturalHomomorphismByNormalSubgroup(Gt,Up);
Et:=Image(hE);
e:=Image(hE,First(Elements(U),u->not u in Up));
qG:=NaturalHomomorphismByNormalSubgroup(Et,Group(e));
pEP:=GroupHomomorphismByImages(Et,P,List(GeneratorsOfGroup(Gt),g->Image(hE,g)),
List(GeneratorsOfGroup(Gt),g->Image(pr,g)));
K:=Elements(Kernel(pEP));
#####Bogomolov multiplier and Sha^2_ab##################
S2:=Elements(SylowSubgroup(Et,2));
inB0:=not ForAny(S2,a->ForAny(S2,b->Comm(a,b)=e));
inSha:=inB0 and not ForAny(S2,a->a^2=e);
#####Galois condition for complex conjugation##########
ram:=ForAny(List(ConjugacyClasses(Et),Representative),d->IsConjugate(Et,d,e*d^-1));
#####Explicit pair (tau,gamma)##########################
wit:=List([w^0,w,w^2],function(l)
local t,g;
t:=PreImagesRepresentative(pEP,Image(hom,UT(w^0,0*w,l)));
g:=PreImagesRepresentative(pEP,Image(hom,UT(w,0*w,w^2*l)));
return Set(K,m->[Image(qG,g*(t*m)*g^-1)=Image(qG,(t*m)^-1),
g*(t*m)*g^-1=e*(t*m)^-1]);
end);
return [inB0,inSha,ram,wit];
end;
#####################################################
#####################################################
Display(List(Filtered(AllSubgroups(M),U->Size(U)=4 and IsCyclic(M/U)),RealCover));