/usr/share/gap/pkg/Polycyclic/gap/cover/const/cov.gi is in gap-polycyclic 2.11-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | ##
## Covers
##
# FIXME: This function is documented and should be turned into a GlobalFunction
SchurCovers := function(G)
local p, GG, K, R, M, D, Z, k, H, C, T, P, e, O, bij, f, t, m, A, c,
l, n, i;
if not IsPGroup(G) then return fail; fi;
# set up
p := Factors(Size(G))[1];
# move to Pcp groups if necessary
if IsPcGroup(G) then
GG := PcGroupToPcpGroup(G);
else
GG := G;
fi;
# cover and subgroups
AddSExtension(GG);
K := GG!.scov;
R := GG!.modu;
M := GG!.mult;
# info
Print(" Schur Mult has type ",AbelianInvariants(M),"\n");
# catch a trival case
if GG!.mord = 1 then return G; fi;
# determine Z = Z(K) cap RK'
D := ProductPcpGroups(K, R, DerivedSubgroup(K));
Z := Intersection(Centre(K), D);
# determine phi(G) in K
P := Subgroup(K, Concatenation(Igs(D), List(Pcp(K,D), x -> x^p)));
# get small cover of K/Z
H := Subgroup(K, GeneratorsOfPcp(Pcp(K,P)));
# reduce into H and obtain H > C > T > M > 1
C := Intersection( Z, H );
T := TorsionSubgroup(C);
# add in powers
e := ExponentAbelianPcpGroup(T);
O := OmegaAbelianPcpGroup(C, e);
T := ProductPcpGroups(H, T, O);
M := ProductPcpGroups(H, M, O);
# change presentation
k := Pcp(H,C);
c := Pcp(C,T,"snf");
t := Pcp(T,M,"snf");
m := Pcp(M,O,"snf");
H := PcpFactorByPcps(H, [k,c,t,m]);
# move
n := Length(Cgs(H));
C := SubgroupByIgs(H, Cgs(H){[Length(k)+1..n]});
T := SubgroupByIgs(H, Cgs(H){[Length(k)+Length(c)+1..n]});
M := SubgroupByIgs(H, Cgs(H){[Length(k)+Length(c)+Length(t)+1..n]});
f := Pcp(C,T); t := Pcp(T); m := Pcp(M);
# info
Print(" Schur Mult new type ",AbelianInvariants(T),"\n");
# the acting automorphisms
A := AutomorphismActionCover( H, C );
# induce to desired action
A.agAutos := List( A.agAutos, x -> InducedAutCover(x, f,t,e) );
A.glAutos := List( A.glAutos, x -> InducedAutCover(x, f,t,e) );
# determine complement classes under action of A
c := FactorsComplementClasses( A, H, f, t, m );
# adjust if necessary
if IsPcGroup(G) and not CODEONLY@ then
for i in [1..Length(c)] do
c[i] := PcpGroupToPcGroup(RefinedPcpGroup(c[i]));
od;
fi;
return c;
end;
|