#
# actions.g
#
# Collection of GAP functions that appear in appendix C of
# my dissertation
# "Centre-by-metabelian Group Algebras" (1997)
#
# Richard Rossmanith
#
GroupNames:=function(g)
local n;
# Returns a list of commonly used names of the group 'g', if GAP can find
# any, and the empty list otherwise.
n:=GroupId(g).names; # See description of GroupId for list of names.
if Length(n)=1 then # if g has only one name,
g.name:=n[1]; # remember that name.
fi;
return n;
end;;
Fixpoints:=function(a, d, op)
# 'a' is a group that acts on the domain 'd' via the operation 'op'.
# The function returns the fixpoints of this operation as a subset of 'd'.
return Union(Filtered(Orbits(a,d,op), o -> Length(o)=1));
end;;
Fixgroup:=function(a,h)
# 'a' is a permutation group that acts on the list Elements(h) like some
# group of automorphisms of the group 'h'. The function returns the
# centralizer of 'a' in 'h', which is not defined in standard GAP since
# 'a' and 'h' do not have a common parent group.
return Subgroup(h, Elements(h){Fixpoints(a,[1..Size(h)],OnPoints)});
end;;
CommSubgroup:=function(a,h)
# 'a' and 'h' as above. Returns the commutator subgroup of 'a' with 'h' (as a
# subgroup of 'h'). Function is not implemented into standard GAP.
local comm,i,p,e;
e:=Elements(h);
comm:=[];
for i in [1..Size(h)] do
for p in Elements(a) do
Add(comm, e[i]^(-1)*e[i^p]);
od;
od;
return Subgroup(h, comm);
end;;
IsInvariantSubgroup:=function(a,h,s)
local el,pos;
# 'a' and 'h' as above, 's' a subgroup of 'h'. Tests if 's' is invariant
# under the action of 'a'.
el:=Elements(h);
pos:=List(s.generators, x -> Position(el,x));
return ForAll(pos,
i -> ForAll(a.generators,
perm -> (el[i^perm] in s)
)
);
end;;
FactorGroupOperation:=function(a,h,n)
# 'a' and 'h' as above, 'n' an 'a'-invariant normal subgroup of 'h'. Returns
# a permutation group whose action on Elements(h/n) is induced by the
# action of 'a' on Elements(h).
local f,t,el,op;
if not IsInvariantSubgroup(a,h,n) then
Error(" must be an a-invariant normal subgroup of ");
else
f:=FactorGroup(h,n);
t:=NaturalHomomorphism(h,f);
el:=Elements(h);
op:=function(x,perm)
local i;
i:=Position(el,PreImagesRepresentative(t,x));
return Image(t,el[i^perm]);
end;
return Operation(a,Elements(f),op);
fi;
end;;
IsDihedralAction:=function(a,h)
# 'a' and 'h' as above. Cecks if action is dihedral, i.e. Size(a)=2 and
# 'a' acts on 'h' by element inversion.
local el,perm;
if Size(a)=2 then
el:=Elements(h);
perm:=Filtered(Elements(a), x -> (Order(a,x)=2) )[1];
return ForAll([1..Size(h)], i -> (el[i^perm]=el[i]^-1) );
else
return false;
fi;
end;;
MayBeCounterexample16:=function(a,h)
# 'a' and 'h' as above, with Size(h)=16.
# We think of 'h' as the commutator subgroup of some (finite or infinite)
# group 'g', and of 'a' as the (finite) factor group g/Centralizer(g,h).
# (Note that the function trusts that 'a' contains the inner automorphisms
# of 'h'. Otherwise the call to 'FactorGroup' in the function body might
# produce an error.)
# If the function returns "false", then 'g' cannot be a counterexample
# to the classification of centre-by-metabelian group algebras in
# characteristic 2. No information is gained if the function returns
# "true".
# The function works by reduction to the case Size(h)=8, which is assumed to
# be already handled:
# Let 'x' be the list of all elements of order 2 of 'h' which are fixed by
# 'a', and let 'z' run through 'x' (we think of 'z' as being central in 'g').
# Then k:=h/ has order 8.
# Now if 'g' is a counterexample, then 'k' must be isomorphic to 2x2x2 or 2x4.
# In the case 2x2x2, 'a' must act trivially on 'k', and in the case 2x4,
# 'a' must act dihedrally on 'k'.
# The function tests just that.
local x,z,k,n,i,b;
if (Size(h)<>16) then
Error(" must be a group of order 16");
else
x:=Filtered(Elements(Fixgroup(a,h)), x -> (Order(h,x)=2) );
for z in x do
n:=Subgroup(h,[z]);
k:=FactorGroup(h,n);
i:=GroupNames(k);
if i=["2x2x2"] then
if not IsSubgroup(n,CommSubgroup(a,h)) then
return false;
fi;
elif i=["2x4"] then
b:=FactorGroupOperation(a,h,n);
if not IsDihedralAction(b,k) then
return false;
fi;
elif Length(i)<>1 then
Error("Obscure Error: has more or less than one Name");
else
return false;
fi;
od;
fi;
return true;
end;;
PossibleActionsNonabelianCase:=function(h)
# If we adopt the notation of above, this function computes all
# possibilities for the group 'a' acting on 'h', where 'h' must be nonabelian
# group of order any power of 2.
# All groups 'a', that already here lead to a situation where it is known
# that (the undefined --see above-- group) 'g' cannot be a counterexample
# to our classification theorem, are thrown away.
# In particular, 'a' must be a 2-group and its commutator subgroup must
# correspond to the inner automorphisms of 'h'.
local aut,u,subs;
if IsAbelian(h) or (not Set(Factors(Size(h)))=[2]) then
Error(" must be a nonabelian 2-group");
fi;
aut:=Operation(AutomorphismGroup(h),Elements(h));
# permutation representation of action of Aut(h) on Elements(h)
u:=AsSubgroup(aut,Operation(h,Elements(h)));
# u corresponds to the inner automorphisms
subs:=List(ConjugacyClassesSubgroups(aut), Representative);
# take representatives of conjugacy classes of subgroups of aut
subs:=Filtered(subs, a -> (
Set(Factors(Size(a)))=[2]
and (DerivedSubgroup(a)=u)
)
);
# We only need representatives a which are 2-groups, and whose
# commutator subgroup is the inner automorphism group u of h.
return subs;
end;;
IsLegal3Action:=function(a,h)
# Under the situation described above, if 'h' is an abelian 2-group,
# then the order of 'a' may be divided by 3, but not by 9.
# In this case, let 's' be the Sylow-3-subgroup of 'a' of order 3, then
# the commutator subgroup of 's' with 'h' must be 2x2 -- otherwise the
# imaginary group 'g' (see above) cannot be a counterexample to our
# classification theorem.
local s;
s:=SylowSubgroup(a,3);
if Size(s)=1 then
return true;
elif Size(s)>3 then
return false;
else
return GroupNames(CommSubgroup(s,h))=["2x2"];
fi;
end;
PossibleActionsAbelianCase:=function(h)
# Similar to nonabelian case. Differences: 'a' and 'h' must be abelian,
# 'h' must be a 2-group, and 'a' must be a 2,3-group whose order is not
# divided by 9. If its order is divided by 3, a special condition applies,
# see the function 'IsLegal3Action'.
# Since 'g' cannot be a counterexample if its nilpotence class
# is at most 2, we only need to consider nontrivial 'a'. Similarly if 'h'
# is elementary abelian of size greater than 4.
local aut,subs;
if not (IsAbelian(h) and Set(Factors(Size(h)))=[2]) then
Error(" must be an abelian 2-group");
elif IsElementaryAbelian(h) and (Size(h)>4) then
# nothing can act on h in this case
return [];
fi;
aut:=Operation(AutomorphismGroup(h),Elements(h));
# permutation representation of action of Aut(h) on Elements(h)
subs:=List(ConjugacyClassesSubgroups(aut), Representative);
# take representatives of conjugacy classes of subgroups of aut
subs:=Filtered(subs, a-> IsAbelian(a)
and Size(a)>1
and IsSubset( [2,3], Set(Factors(Size(a))) )
and IsLegal3Action(a,h));
# We only need nontrivial abelian reps which are 2,3-groups.
# The 3-part of a has to pass an additional test.
return subs;
# return the found groups.
end;;
PossibleActions:=function(h)
# Checks whether 'h' is abelian or not and sends 'h' to the appropriate
# subroutine. In the case Size(h)=16, an additional test is performed.
local subs;
if (Size(h)=1) or (Set(Factors(Size(h)))<>[2]) then
Error(" must be a nontrivial 2-group");
elif IsAbelian(h) then
subs:=PossibleActionsAbelianCase(h);
else
subs:=PossibleActionsNonabelianCase(h);
fi;
if Size(h)=16 then
subs:=Filtered(subs, a -> MayBeCounterexample16(a,h));
fi;
return subs;
end;;