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 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
#The method HAP_EquivalenceClasses is taken from the ResClasses package by Stefann Kohl
###########################################################
###########################################################
InstallOtherMethod( HAP_EquivalenceClasses,
"for a list and a relation or a class invariant (RCWA)",
ReturnTrue, [ IsList, IsFunction ], 0,
function ( list, relation )
local classes, invs, longestfirst, byinvs, elm, pos, inserted, count;
if IsEmpty(list) then return []; fi;
longestfirst := function(c1,c2) return Length(c1) > Length(c2); end;
byinvs := function(c1,c2) return relation(c1[1]) < relation(c2[1]); end;
classes := [[list[1]]]; count := 0;
for elm in list{[2..Length(list)]} do
inserted := false; count := count + 1;
for pos in [1..Length(classes)] do
if relation(elm,classes[pos][1]) then
Add(classes[pos],elm);
inserted := true;
break;
fi;
od;
if not inserted
then classes := Concatenation(classes,[[elm]]); fi;
if count mod 100 = 0 # rough performance heuristics ...
then Sort(classes,longestfirst); fi;
od;
Sort(classes,longestfirst);
return classes;
end );
###########################################################
###########################################################
#############################################
#############################################
GroupIsomorphismRepresentatives:=function(arg)
local L,C,D,inv,G,d,x,AreIsomorphic,bool;
L:=arg[1];
if Length(arg)>1 then bool:=true; else bool:=false; fi;
# Here L is a list of groups. The function returns a set of isomorphism
# class representatives for L. If bool=true then a possibly redundant list
# will be returned.
###########
inv:=function(G)
if Order(G)<1024 and not Order(G)=512 then return IdGroup(G); fi;
return G;
end;
###########
D:=Classify(L,inv);
if bool then return List(D,c->c[1]);; fi; #A possibly redundant
#list will be returned.
#############
AreIsomorphic:=function(H)
if IsomorphismGroups(G,H)=fail then return false;
else return true; fi;
end;
#############
C:=[];
for d in D do
x:=HAP_EquivalenceClasses(d,AreIsomorphic);
Append(C,x);
od;
return C;
end;
#############################################
#############################################
#############################################
#############################################
StemGroups:=function(G)
# Inputs a group G and returns a list of stem groups,
# one in each isoclinism class.
local S, ZS, DS, M, L, stems, lems, stems1, pos, pos1, K, SS, Aut,
Inn,fn, x,n,m;
if Order(Epicentre(G))>1 then
Print("This function can only be applied to central factor groups.\n");
return fail; fi;
S:=SchurCover(G);
ZS:=Center(S);
DS:=DerivedSubgroup(S);
M:=Intersection(ZS,DS);
L:=SubgroupsSolvableGroup(M);
lems:=[];
stems:=[];
for K in L do
SS:=S/K;
if IdGroup(SS/Center(SS))=IdGroup(G) then
Add(stems,SS); Add(lems,K); fi;
od;
stems:=GroupIsomorphismRepresentatives(stems,"with possible redundancies");
stems:=IsoclinismClasses(stems);
fn:=function(x,y) return Order(x)<Order(y); end;
for x in stems do Sort(x,fn); od;
stems:=List(stems,x->x[1]);
return stems;
end;
#############################################
#############################################
|