############################################################################# ## #M IsMemberOp(<grp>, <form>) ##
InstallMethod(IsMemberOp, "if residual function is known", true,
[IsGroup, IsOrdinaryFormation and HasResidualFunction], 10, # residual function is usually faster # than computation of radical or injector function(G, C) if HasMemberFunction(C) then
TryNextMethod(); else
return IsTrivial(ResidualFunction(C)(G)); fi; end);
############################################################################# ## #M SaturatedFormation(<rec>) ##
InstallMethod(SaturatedFormation, true, [IsRecord], 0, function(record)
local F, r;
r := ShallowCopy(record);
F := NewClass("saturated Formation", IsGroupClass and IsClassByPropertyRep,
rec(definingAttributes :=
[ ["in", MemberFunction],
["res", ResidualFunction],
["proj", ProjectorFunction],
["locdef", LocalDefinitionFunction],
["bound", BoundaryFunction]])); if IsBound(r.char) then
SetCharacteristic(F, r.char);
Unbind(r.char); fi;
SetIsSaturatedFormation(F, true);
InstallDefiningAttributes(F, r);
return F; end);
############################################################################# ## #M ViewObj(<form>) ##
InstallMethod(ViewObj, "for a saturated formation", true,
[IsSaturatedFormation and IsClassByPropertyRep], 0, function(C)
Print("SaturatedFormation(");
ViewDefiningAttributes(C);
Print(")"); end);
############################################################################# ## #M PrintObj(<form>) ##
InstallMethod(PrintObj, "for a saturated formation", true,
[IsSaturatedFormation and IsClassByPropertyRep], 0, function(C)
Print("SaturatedFormation(");
PrintDefiningAttributes(C);
Print(")"); end);
############################################################################# ## #M FittingFormation(<rec>) ##
InstallMethod(FittingFormation, true, [IsRecord], 0, function(record)
local F, r;
r := ShallowCopy(record);
F := NewClass("FittingFormation", IsGroupClass and IsClassByPropertyRep, rec(
definingAttributes :=
[ ["in", MemberFunction],
["rad", RadicalFunction],
["inj", InjectorFunction],
["res", ResidualFunction] ]));
SetIsFittingFormation(F, true); if IsBound(r.char) then
SetCharacteristic(F, r.char);
Unbind(r.char); fi;
InstallDefiningAttributes(F, r);
return F; end);
############################################################################# ## #R IsFormationProductRep(<cl>) ## ## classes which are defined as formation product ##
DeclareRepresentation("IsFormationProductRep",
IsClass and IsGroupClass and IsOrdinaryFormation
and IsComponentObjectRep and IsAttributeStoringRep,
["classId", "bot", "top"]);
############################################################################# ## #M IsSaturated(<grpclass>) ##
InstallImmediateMethod(IsSaturated, IsFormationProductRep, 0, function(C) if HasIsSaturated(C!.bot) and HasIsSaturated(C!.top)
and IsSaturated(C!.bot) and IsSaturated(C!.top) then
return true; else
TryNextMethod(); fi; end);
############################################################################# ## #M LocalDefinitionFunction(<prod>) ##
InstallImmediateMethod(LocalDefinitionFunction,
IsFormationProductRep and IsSaturated, 0, function(C) if HasLocalDefinitionFunction(C!.bot)
and HasLocalDefinitionFunction(C!.top) then
return function(G, p)
local gens;
gens := LocalDefinitionFunction(C!.bot)(Residual(G, C!.top), p); if gens = fail then# p is not in the characteristic of C!.bot
return LocalDefinitionFunction(C!.top)(G, p); else
return gens; fi; end; else
TryNextMethod(); fi; end);
############################################################################# ## #M IsSaturated(<grpclass>) ##
InstallImmediateMethod(IsSaturated, IsFormationProductRep, 0, function(C)
local char; if HasIsSaturated(C!.bot) and IsSaturated(C!.bot)
and HasCharacteristic(C!.bot)
and Characteristic(C!.bot) = AllPrimes then
return true; else
TryNextMethod(); fi; end);
############################################################################# ## #M LocalDefinitionFunction(<prod>) ##
InstallImmediateMethod(LocalDefinitionFunction,
IsFormationProductRep and IsSaturated, 0, function(C) if HasCharacteristic(C!.bot) and Characteristic(C!.bot) = AllPrimes
and HasLocalDefinitionFunction(C!.bot) then
SetCharacteristic(C, AllPrimes);
return function(G, p)
return LocalDefinitionFunction(C!.bot)(Residual(G, C!.top), p); end; else
TryNextMethod(); fi; end);
############################################################################# ## #M IsSaturated(<grpclass>) ## ## (this can be expensive in some cases, so it is not an immediate method) ##
InstallMethod(IsSaturated, "test if char of top class is subset of char of bot class",
true, [IsFormationProductRep], 0, function(C)
local char;
char := Characteristic(C!.top); if IsSaturated(C!.bot) and IsList(char) and ForAll(char, p -> p in Characteristic(C!.bot)) then
return true; else
TryNextMethod(); fi; end);
############################################################################# ## #M LocalDefinitionFunction(<prod>) ## ## (this can be expensive in some cases, so it is not an immediate method) ##
InstallMethod(LocalDefinitionFunction, "test if char of top class is subset of char of bot class",
true, [IsFormationProductRep], 0, function(C)
local char;
char := Characteristic(C!.top); if IsList(char) and ForAll(char, p -> p in Characteristic(C!.bot)) then
SetIsSaturated(C, true);
SetCharacteristic(C, Characteristic(C!.bot));
return function(G, p)
return LocalDefinitionFunction(C!.bot)(Residual(G, C!.top), p); end;; else
TryNextMethod(); fi; end);
############################################################################# ## #M FormationProduct(<bot>, <top>) ##
InstallMethod(FormationProduct, "of two Fitting formations", true,
[IsOrdinaryFormation and IsFittingClass,
IsOrdinaryFormation and IsFittingClass], 0, function(B, T)
return NewClass("formation/Fitting product fam",
IsFormationProductRep and IsFittingProductRep,
rec(bot := B, top := T)); end);
############################################################################# ## #M FittingFormationProduct(<bot>, <top>) ##
InstallMethod(FittingFormationProduct, "of two Fitting formations", true,
[IsOrdinaryFormation and IsFittingClass, IsOrdinaryFormation and IsFittingClass], 0,
FormationProduct);
############################################################################# ## #M IsMemberOp(<prod>) ##
InstallMethod(IsMemberOp, "for Fitting/formation product", true,
[IsGroup, IsFormationProductRep and IsFittingProductRep], 0, function(G, C)
return Residual(G, C!.top) in C!.bot; end);
############################################################################# ## #M IsSubgroupClosed(<prod>) ##
InstallImmediateMethod(IsSubgroupClosed, IsFittingProductRep, 0, function(C) if HasIsSubgroupClosed(C!.bot) and IsSubgroupClosed(C!.bot) and
HasIsSubgroupClosed(C!.top) and IsSubgroupClosed(C!.top) then
return true; 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.