############################################################################# ## #M \in ## ## We install a method for "in" because we need not store the result ## (via IsMember) if the object is not a group ##
InstallMethod(\in, "for group class", true,
[IsObject, IsGroupClass], 0, function(x, C) if IsGroup(x) then if IsMember(x, C) then
SetIsEmpty(C, false);
return true; fi; fi;
return false; end);
############################################################################# ## #M ViewObj(<class>) ##
InstallMethod(ViewObj, "for IsGroupClass and IsClassByPropertyRep", true,
[IsGroupClass and IsClassByPropertyRep], 0, function(C)
Print("GroupClass(");
ViewDefiningAttributes(C);
Print(")"); end);
############################################################################# ## #M PrintObj(<class>) ##
InstallMethod(PrintObj, "for IsGroupClass and IsClassByPropertyRep", true,
[IsGroupClass and IsClassByPropertyRep], 0, function(C)
Print("GroupClass(");
PrintDefiningAttributes(C);
Print(")"); end);
############################################################################# ## #M IsGroupClass(<cl>) ##
InstallImmediateMethod(IsGroupClass, IsClassByComplementRep, 0, function(cl) if HasIsGroupClass(cl!.complement) then
return IsGroupClass(cl!.complement); else
TryNextMethod(); fi; end);
############################################################################# ## #M IsGroupClass(<class>) ##
InstallImmediateMethod(IsGroupClass, IsClassByIntersectionRep, 0, function(cl) if ForAll(cl!.intersected,
C -> HasIsGroupClass(C) and IsGroupClass(C)) then
return true; else
TryNextMethod(); fi; end);
############################################################################# ## #M ContainsTrivialGroup(<group class>) ##
InstallImmediateMethod(ContainsTrivialGroup,
IsClassByIntersectionRep and IsGroupClass, 0, function(cl)
local C; for C in cl!.intersected do if HasContainsTrivialGroup(C) then if not ContainsTrivialGroup(C) then
return false; fi; else
TryNextMethod(); fi;
od;
return true; end);
############################################################################# ## #M ContainsTrivialGroup(<group class>) ##
InstallImmediateMethod(ContainsTrivialGroup,
IsClassByUnionRep and IsGroupClass, 0, function(cl) if ForAny(cl!.united,
C -> HasContainsTrivialGroup(C)
and ContainsTrivialGroup(C)) then
return true; else
TryNextMethod(); fi; end);
############################################################################# ## #M ContainsTrivialGroup(<group class>) ##
InstallImmediateMethod(ContainsTrivialGroup,
IsGroupClass and HasIsEmpty and IsNormalSubgroupClosed, 0, function(C) if not IsEmpty(C) then
return true; else
TryNextMethod(); fi; end);
############################################################################# ## #M ContainsTrivialGroup(<group class>) ##
InstallImmediateMethod(ContainsTrivialGroup,
IsGroupClass and HasIsEmpty and IsQuotientClosed, 0, function(C) if not IsEmpty(C) then
return true; else
TryNextMethod(); fi; end);
############################################################################# ## #M IsEmpty(<group class>) ##
InstallImmediateMethod(IsEmpty,
IsGroupClass and HasContainsTrivialGroup, 0, function(C) if ContainsTrivialGroup(C) then
return false; else
TryNextMethod(); fi; end);
############################################################################# ## #M IsSubgroupClosed(<group class>) ##
InstallImmediateMethod(IsSubgroupClosed,
IsClassByIntersectionRep and IsGroupClass and IsNormalSubgroupClosed, 0, function(cl) if ForAll(cl!.intersected,
C -> HasIsSubgroupClosed(C) and IsSubgroupClosed(C)) then
return true; else
TryNextMethod(); fi; end);
############################################################################# ## #M IsNormalSubgroupClosed(<group class>) ##
InstallImmediateMethod(IsNormalSubgroupClosed,
IsClassByIntersectionRep and IsGroupClass, 0, function(cl) if ForAll(cl!.intersected,
C -> HasIsNormalSubgroupClosed(C) and IsNormalSubgroupClosed(C)) then
return true; else
TryNextMethod(); fi; end);
############################################################################# ## #M IsQuotientClosed(<group class>) ##
InstallImmediateMethod(IsQuotientClosed,
IsClassByIntersectionRep and IsGroupClass, 0, function(cl) if ForAll(cl!.intersected,
C -> HasIsQuotientClosed(C) and IsQuotientClosed(C)) then
return true; else
TryNextMethod(); fi; end);
############################################################################# ## #M IsResiduallyClosed(<group class>) ##
InstallImmediateMethod(IsResiduallyClosed,
IsClassByIntersectionRep and IsGroupClass and IsDirectProductClosed, 0, function(cl) if ForAll(cl!.intersected,
C -> HasIsResiduallyClosed(C) and IsResiduallyClosed(C)) then
return true; else
TryNextMethod(); fi; end);
############################################################################# ## #M IsNormalProductClosed(<group class>) ##
InstallImmediateMethod(IsNormalProductClosed,
IsClassByIntersectionRep and IsGroupClass and IsDirectProductClosed, 0, function(cl) if ForAll(cl!.intersected,
C -> HasIsNormalProductClosed(C) and IsNormalProductClosed(C)) then
return true; else
TryNextMethod(); fi; end);
############################################################################# ## #M IsDirectProductClosed(<group class>) ##
InstallImmediateMethod(IsDirectProductClosed,
IsClassByIntersectionRep and IsGroupClass, 0, function(cl) if ForAll(cl!.intersected,
C -> HasIsDirectProductClosed(C)
and IsDirectProductClosed(C)) then
return true; else
TryNextMethod(); fi; end);
############################################################################# ## #M IsSchunckClass(<group class>) ##
InstallImmediateMethod(IsSchunckClass,
IsClassByIntersectionRep and IsGroupClass
and IsSaturated and IsQuotientClosed and IsDirectProductClosed, 0, function(cl) if ForAll(cl!.intersected,
C -> HasIsSchunckClass(C) and IsSchunckClass(C)) then
return true; else
TryNextMethod(); fi; end);
############################################################################# ## #M IsSaturated(<group class>) ##
InstallImmediateMethod(IsSaturated,
IsClassByIntersectionRep and IsGroupClass, 0, function(cl) if ForAll(cl!.intersected,
C -> HasIsSaturated(C) and IsSaturated(C)) then
return true; else
TryNextMethod(); fi; end);
############################################################################# ## #M IsGroupClass(<class>) ##
InstallImmediateMethod(IsGroupClass,
IsClassByUnionRep, 0, function(cl) if ForAll(cl!.united,
C -> HasIsGroupClass(C) and IsGroupClass(C)) then
return true; else
TryNextMethod(); fi; end);
############################################################################# ## #M ContainsTrivialGroup(<group class>) ##
InstallMethod(ContainsTrivialGroup, "for generic group class - test membership",
ReturnTrue,
[IsGroupClass], 0,
cl -> TrivialGroup() in cl);
############################################################################# ## #M ContainsTrivialGroup(<group class>) ##
InstallImmediateMethod(ContainsTrivialGroup,
IsClassByUnionRep and IsGroupClass, 0, function(cl) if ForAny(cl!.united,
C -> HasContainsTrivialGroup(C) and ContainsTrivialGroup(C)) then
return true; else
TryNextMethod(); fi; end);
############################################################################# ## #M IsSubgroupClosed(<group class>) ##
InstallImmediateMethod(IsSubgroupClosed,
IsClassByUnionRep and IsGroupClass and IsNormalSubgroupClosed, 0, function(cl) if ForAll(cl!.united,
C -> HasIsSubgroupClosed(C) and IsSubgroupClosed(C)) then
return true; else
TryNextMethod(); fi; end);
############################################################################# ## #M IsNormalSubgroupClosed(<group class>) ##
InstallImmediateMethod(IsNormalSubgroupClosed,
IsClassByUnionRep and IsGroupClass, 0, function(cl) if ForAll(cl!.united,
C -> HasIsNormalSubgroupClosed(C) and IsNormalSubgroupClosed(C)) then
return true; else
TryNextMethod(); fi; end);
############################################################################# ## #M IsQuotientClosed(<group class>) ##
InstallImmediateMethod(IsQuotientClosed,
IsClassByUnionRep and IsGroupClass, 0, function(cl) if ForAll(cl!.united,
C -> HasIsQuotientClosed(C) and IsQuotientClosed(C)) then
return true; else
TryNextMethod(); fi; end);
############################################################################# ## #M IsSaturated(<group class>) ##
InstallImmediateMethod(IsSaturated,
IsClassByUnionRep and IsGroupClass, 0, function(cl) if ForAll(cl!.united,
C -> HasIsSaturated(C) and IsSaturated(C)) then
return true; else
TryNextMethod(); fi; end);
############################################################################# ## #R IsGroupClassByListRep ##
DeclareRepresentation("IsGroupClassByListRep",
IsClass and IsGroupClass and IsComponentObjectRep and IsAttributeStoringRep,
["classId", "list", "isofunc"]);
############################################################################# ## #M GroupClass(<list>) ##
InstallOtherMethod(GroupClass, "for group defined by list", true,
[IsList], 0, function(l)
return GroupClass(l, DEFAULT_ISO_FUNC); end);
############################################################################# ## #M GroupClass(<list>, <func>) ##
InstallOtherMethod(GroupClass, " for list and function", true,
[IsList, IsFunction], 0, function(l, iso)
local class;
class := NewClass("group class fam", IsGroupClassByListRep,
rec(list := l,
isofunc := iso));
SetIsGroupClass(class, true);
return class; end);
############################################################################# ## #M IsMemberOp <grp>,(<class>) ##
InstallMethod(IsMemberOp, " for group class by list", true,
[IsGroup, IsGroupClassByListRep], 0, function(x, C) if IsGroup(x) then
return ForAny(C!.list, y -> C!.isofunc(y, x)); else
return false; fi; end);
############################################################################# ## #M ViewObj(<class>) ##
InstallMethod(ViewObj, " for IsGroupClassByListRep", true,
[IsGroupClassByListRep], 0, function(C)
Print("GroupClass(");
View(C!.list); if C!.isofunc <> DEFAULT_ISO_FUNC then
Print(", ");
View(C!.isofunc); fi;
Print(")"); end);
############################################################################# ## #M PrintObj(<class>) ##
InstallMethod(PrintObj, " for IsGroupClassByListRep", true,
[IsGroupClassByListRep], 0, function(C)
Print("GroupClass(");
Print(C!.list);
Print(", "); if C!.isofunc = DEFAULT_ISO_FUNC then
Print("<default isomorphism test>"); else
Print(C!.isofunc); fi;
Print(")"); end);
############################################################################# ## #M Intersection2(<class1>, <class2>) ##
InstallMethod(Intersection2, "for two group classes by list",
true, [IsGroupClassByListRep, IsGroupClassByListRep], 0, function(C, D)
local iso;
iso := C!.isofunc; if iso = DEFAULT_ISO_FUNC then
iso := D!.isofunc; elif D!.isofunc <> iso and D!.isofunc <> DEFAULT_ISO_FUNC then
Info(InfoWarning ,1, "Don't know which isomorphism function to choose"); fi;
return GroupClass(Filtered(C!.list, x -> x in D), iso); end);
############################################################################# ## #M Intersection2(<class1>, <class2>) ##
InstallMethod(Intersection2, "for group class by list and group class",
true, [IsGroupClassByListRep, IsGroupClass], 0, function(C, D)
return GroupClass(Filtered(C!.list, x -> x in D), C!.isofunc); end);
############################################################################# ## #M Intersection2(<class1>, <class2>) ##
InstallMethod(Intersection2, "for grp class and group class by list",
true, [IsGroupClass, IsGroupClassByListRep], 0, function(C, D)
return GroupClass(Filtered(D!.list, x -> x in C), D!.isofunc); end);
############################################################################# ## #M Difference(<class1>, <class2>) ##
InstallMethod(Difference, "for group class by list and group class", true,
[IsGroupClassByListRep, IsGroupClass], 0, function(C, D)
return GroupClass(Filtered(C!.list, x -> not x in D), C!.isofunc); end);
############################################################################# ## #M IsSubgroupClosed(<group class>) ##
InstallMethod(IsSubgroupClosed, "for generic group class",
true, [IsGroupClass], 0, function(C)
Error("Sorry, cannot decide if the group class <C> \
is subgroup closed."); end);
############################################################################# ## #M IsNormalSubgroupClosed(<group class>) ##
InstallMethod(IsNormalSubgroupClosed, "for generic group class",
true, [IsGroupClass], 0, function(C)
Error("Sorry, cannot decide if the group class <C> \
is normal subgroup closed."); end);
############################################################################# ## #M IsQuotientClosed(<group class>) ##
InstallMethod(IsQuotientClosed, "for generic group class",
true, [IsGroupClass], 0, function(C)
Error("Sorry, cannot decide if the group class <C> \
is quotient closed."); end);
############################################################################# ## #M IsResiduallyClosed(<group class>) ##
InstallMethod(IsResiduallyClosed, "for generic group class",
true, [IsGroupClass], 0, function(C)
Error("Sorry, cannot decide if the group class <C> \
is residually closed."); end);
############################################################################# ## #M IsNormalProductClosed(<group class>) ##
InstallMethod(IsNormalProductClosed, "for generic group class",
true, [IsGroupClass], 0, function(C)
Error("Sorry, cannot decide if the group class <C> \
is closed under products of normal subgroups."); end);
############################################################################# ## #M IsDirectProductClosed(<group class>) ##
InstallMethod(IsDirectProductClosed, "for generic group class",
true, [IsGroupClass], 0, function(C)
Error("Sorry, cannot decide if the group class <C> \
is closed under direct products."); end);
############################################################################# ## #M IsSchunckClass(<group class>) ##
InstallMethod(IsSchunckClass, "for generic group class",
true, [IsGroupClass], 0, function(C)
Error("Sorry, cannot decide if the group class <C> \
is a Schunck class."); end);
############################################################################# ## #P IsSaturated(<group class>) ##
InstallMethod(IsSaturated, "for generic group class",
true, [IsGroupClass], 0, function(C)
Error("Sorry, cannot decide if the group class <C> \
is saturated."); end);
############################################################################# ## #F SetIsOrdinaryFormation(<group class>) ## ## fake setter function ##
InstallGlobalFunction("SetIsOrdinaryFormation", function(C, b) if not IsGroupClass(C) or b <> true then
Error("<C> must be a group class and <b> must be true"); fi;
SetContainsTrivialGroup(C, b);
SetIsQuotientClosed(C, b);
SetIsResiduallyClosed(C, b); end);
############################################################################# ## #F SetIsFittingClass(<group class>) ## ## fake setter function ##
InstallGlobalFunction("SetIsFittingClass", function(C, b) if not IsGroupClass(C) or b <> true then
Error("<C> must be a group class and <b> must be true"); fi;
SetContainsTrivialGroup(C, b);
SetIsNormalSubgroupClosed(C, b);
SetIsNormalProductClosed(C, b); end);
############################################################################# ## #F SetIsFittingFormation(<group class>) ## ## fake setter function ##
InstallGlobalFunction("SetIsFittingFormation", function(C, b) if not IsGroupClass(C) or b <> true then
Error("<C> must be a group class and <b> must be true"); fi;
SetIsFittingClass(C, b);
SetIsOrdinaryFormation(C, b); end);
############################################################################# ## #F SetIsSaturatedFormation(<group class>) ## ## fake setter function ##
InstallGlobalFunction("SetIsSaturatedFormation", function(C, b) if not IsGroupClass(C) or b <> true then
Error("<C> must be a group class and <b> must be true"); fi;
SetIsOrdinaryFormation(C, b);
SetIsSaturated(C, b); end);
############################################################################# ## #F SetIsSaturatedFittingFormation(<group class>) ## ## fake setter function ##
InstallGlobalFunction("SetIsSaturatedFittingFormation", function(C, b) if not IsGroupClass(C) or b <> true then
Error("<C> must be a group class and <b> must be true"); fi;
SetIsFittingFormation(C, b);
SetIsSaturated(C, b); end);
############################################################################# ## #M Basis(<class>) ## ## the basis of a group class <class> consists of the primitive soluble ## groups in <class> ##
InstallMethod(Basis, "for group class", true,
[IsGroupClass], 0, function(H)
return GroupClass(G -> IsPrimitiveSolubleGroup(G) and G in H); end);
############################################################################# ## #M Characteristic(<class>) ##
InstallMethod(Characteristic, "for generic grp class", true,
[IsGroupClass], 0, function(H)
return Class(p -> IsPosInt(p) and IsPrime(Integers, p)
and CyclicGroup(p) in H); end);
############################################################################# ## #M Characteristic(<class>) ##
InstallMethod(Characteristic, "for intersection of group classes", true,
[IsGroupClass and IsClassByIntersectionRep], 0, function(H) if ForAll(H!.intersected, IsGroupClass) then
return Intersection(List(H!.intersected, Characteristic)); else
TryNextMethod(); fi; end);
############################################################################# ## #M Characteristic(<class>) ##
InstallMethod(Characteristic, "for union of group classes", true,
[IsGroupClass and IsClassByUnionRep], 0, function(H) if ForAll(H!.united, C -> IsGroupClass(C)) then
return Union(List(H!.united, Characteristic)); else
TryNextMethod(); fi; end);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.