############################################################################# ## ## This file is part of GAP, a system for computational discrete algebra. ## This file's authors include Frank Celler. ## ## Copyright of GAP belongs to its developers, whose names are too numerous ## to list here. Please refer to the COPYRIGHT file for details. ## ## SPDX-License-Identifier: GPL-2.0-or-later ## ## This file contains generic methods for groups handled by nice ## monomorphisms.. ##
############################################################################# ## #A NiceMonomorphism( <obj> ) ## ## <#GAPDoc Label="NiceMonomorphism"> ## <ManSection> ## <Attr Name="NiceMonomorphism" Arg='obj'/> ## ## <Description> ## is a homomorphism that is defined (at least) on the whole of <A>obj</A> ## and whose restriction to <A>obj</A> is injective. ## The concrete morphism (and also the image group) will depend on the ## representation of <A>obj</A>. ## <P/> ## WARNING: The domain of the homomorphism may be larger than <A>obj</A>. ## To obtain the image of <A>obj</A> under the homomorphism, use ## <Ref Attr="NiceObject"/>; see there for an example where it matters. ## </Description> ## </ManSection> ## <#/GAPDoc> ##
DeclareAttribute( "NiceMonomorphism",
IsObject );
InstallSubsetMaintenance( NiceMonomorphism,
IsGroup and HasNiceMonomorphism, IsGroup );
############################################################################# ## #F IsNiceMonomorphism( <nhom> ) ## ## <ManSection> ## <Func Name="IsNiceMonomorphism" Arg='nhom'/> ## ## <Description> ## This filter indicates that a mapping has been installed as the ## <Ref Func="NiceMonomorphism"/> value of an object. ## (Such mappings may need to be handled specially ## because they should not refer to the <Ref Attr="NiceMonomorphism"/> value ## of the source again.) ## </Description> ## </ManSection> ##
DeclareFilter("IsNiceMonomorphism");
############################################################################# ## #O RestrictedNiceMonomorphism(<hom>,<G>) ## ## <ManSection> ## <Oper Name="RestrictedNiceMonomorphism" Arg='hom, G'/> ## ## <Description> ## returns the restriction of the nice monomorphism <A>hom</A> onto ## <A>G</A>. ## In contrast to <Ref Func="RestrictedMapping"/>, ## this operation returns an object which has the filter ## <Ref Func="IsNiceMonomorphism"/> set. ## (This is important for some operations like ## <Ref Func="CompositionMapping"/>: ## We do not want to compute the <Ref Func="AsGroupGeneralMappingByImages"/> ## value of a nice monomorphism ## –this would counteract the intention of a nice monomorphism. ## Therefore some methods explicitly test whether a mapping is a nice ## monomorphism. ## <P/> ## However for example in ## <Ref Func="NaturalHomomorphismByNormalSubgroupOp"/>, ## a restriction of the nice monomorphism has to be taken ## because the nice monomorphism might be defined on too large a source, ## in this case <Ref Func="RestrictedNiceMonomorphism"/> must be used!) ## </Description> ## </ManSection> ##
DeclareGlobalFunction("RestrictedNiceMonomorphism");
############################################################################# ## #P IsCanonicalNiceMonomorphism( <nhom> ) ## ## <#GAPDoc Label="IsCanonicalNiceMonomorphism"> ## <ManSection> ## <Prop Name="IsCanonicalNiceMonomorphism" Arg='nhom'/> ## ## <Description> ## A nice monomorphism (see <Ref Attr="NiceMonomorphism"/> <A>nhom</A> is ## canonical if the image set will only depend on the set of group elements ## but not on the generating set and <Ref Oper="\<"/> comparison ## of group elements translates through the nice monomorphism. ## This implies that equal objects will always have equal ## <Ref Attr="NiceObject"/> values. ## In some situations however this condition would be expensive to ## achieve, therefore it is not guaranteed for every nice monomorphism. ## </Description> ## </ManSection> ## <#/GAPDoc> ##
DeclareProperty("IsCanonicalNiceMonomorphism",IsGroupGeneralMapping);
############################################################################# ## #A CanonicalNiceMonomorphism( <obj> ) ## ## <ManSection> ## <Attr Name="CanonicalNiceMonomorphism" Arg='obj'/> ## ## <Description> ## returns a <C>NiceMonomorphism</C> which is canonical (see ## <C>IsCanonicalNiceMonomorphism</C>). ## </Description> ## </ManSection> ##
DeclareAttribute( "CanonicalNiceMonomorphism", IsObject );
############################################################################# ## #A NiceObject( <obj> ) ## ## <#GAPDoc Label="NiceObject"> ## <ManSection> ## <Attr Name="NiceObject" Arg='obj'/> ## ## <Description> ## The <Ref Attr="NiceObject"/> value of <A>obj</A> is the image of ## <A>obj</A> under the mapping stored as the value of ## <Ref Attr="NiceMonomorphism"/> for <A>obj</A>. ## <P/> ## A typical example are finite matrix groups, which use a faithful action ## on vectors to translate all calculations in a permutation group. ## <P/> ## <Example><![CDATA[ ## gap> gl:=GL(3,2); ## SL(3,2) ## gap> IsHandledByNiceMonomorphism(gl); ## true ## gap> NiceObject(gl); ## Group([ (5,7)(6,8), (2,3,5)(4,7,6) ]) ## gap> Image(NiceMonomorphism(gl),Z(2)*[[1,0,0],[0,1,1],[1,0,1]]); ## (2,6)(3,4,7,8) ## ]]></Example> ## </Description> ## </ManSection> ## <#/GAPDoc> ##
DeclareAttribute( "NiceObject",
IsObject );
############################################################################# ## #P IsHandledByNiceMonomorphism( <obj> ) ## ## <#GAPDoc Label="IsHandledByNiceMonomorphism"> ## <ManSection> ## <Prop Name="IsHandledByNiceMonomorphism" Arg='obj'/> ## ## <Description> ## If this property is <K>true</K>, high-valued methods that translate all ## calculations in <A>obj</A> in the image under the ## <Ref Attr="NiceMonomorphism"/> value of <A>obj</A> ## become available for <A>obj</A>. ## </Description> ## </ManSection> ## <#/GAPDoc> ##
DeclareProperty( "IsHandledByNiceMonomorphism",
IsObject,NICE_FLAGS );
InstallSubsetMaintenance( IsHandledByNiceMonomorphism,
IsHandledByNiceMonomorphism and IsGroup,
IsGroup);
RUN_IN_GGMBI:=false; # If somebody would call `GHBI' to make a # NiceMonomorphism, we would get an infinite recursion. # This flag can be set to avoid GHBIs to be translated # via the niceo. If it is set, the method which does # this is passed over. It will be set by methods that # create some niceos (or similar homomorphisms).
############################################################################# ## #F MayBeHandledByNiceMonomorphism( <G> ) ## ## This filter is intended to deal with the following situation. ## We have a group <A>G</A> that can be handled via a nice monomorphism ## if it satisfies certain conditions, but we do not want to check these ## conditions until we can take advantage of the nice monomorphism, ## i.e., until the call of an operation for which a method is installed ## that has <Ref Prop="IsHandledByNiceMonomorphism"/> as a requirement for ## one of its arguments. ## ## More precisely: ## Only those operations are supported for which these methods get installed ## via the functions <Q><C>SomethingMethodByNiceMonomorphismSomething</C></Q> ## in <F>lib/grpnice.gi</F>. ## If <Ref Filt="MayBeHandledByNiceMonomorphism"/> is set for <A>G</A> ## then all these operations have also a method that gets installed with ## requirements where <Ref Prop="IsHandledByNiceMonomorphism"/> is replaced ## by <Ref Filt="MayBeHandledByNiceMonomorphism"/>. ## These methods call <Ref Prop="IsHandledByNiceMonomorphism"/>; ## if the result is <K>false</K> then <Ref Func="TryNextMethod"/> gets ## called, if the result is <K>true</K> then the corresponding method gets ## called that is installed for the situation that ## <Ref Prop="IsHandledByNiceMonomorphism"/> is already stored. ## Additionally, the filter <Ref Filt="MayBeHandledByNiceMonomorphism"/> ## gets reset in both cases since it is not useful anymore. ## ## The <Ref Filt="MayBeHandledByNiceMonomorphism"/> mechanism can be used ## for example if <A>G</A> is a matrix group for which finiteness can be ## decided but is not a priori known, ## such as groups of matrices with entries in some cyclotomic field. ## These groups can be handled by a nice monomorphism if they are finite, ## hence a <Ref Prop="IsHandledByNiceMonomorphism"/> method can be installed ## that checks finiteness. ## ## The mechanism is <E>not</E> intended for situations where ## <Ref Prop="IsHandledByNiceMonomorphism"/> cannot be decided. ## For example, it is not suitable for arbitrary finitely presented groups. ## ## The filter <Ref Prop="IsHandledByNiceMonomorphism"/> must not have ## implications because it will be reset for a group as soon as we find out ## the <Ref Prop="IsHandledByNiceMonomorphism"/> value for it. ##
DeclareFilter( "MayBeHandledByNiceMonomorphism" );
############################################################################# ## ## The following functions are used as methods for operations that require ## <Ref Filt="MayBeHandledByNiceMonomorphism"/> and call ## <Ref Prop="IsHandledByNiceMonomorphism"/>. ##
BindGlobal( "MethodForMayBeHandledByNiceMonomorphism", function( meth, check )
return function( obj... )
local i, flag;
for i in check do
flag:= IsHandledByNiceMonomorphism( obj[i] );
ResetFilterObj( obj[i], MayBeHandledByNiceMonomorphism ); if not flag then
TryNextMethod(); fi;
od;
return CallFuncList( meth, obj ); end; end );
############################################################################# ## #F InstallNiceMonomorphismMethod( <oper>, <par>, <methtext>, <fampred>, #F <check>, <meth> ) ## ## Install the method <A>meth</A> for the operation <A>oper</A>, ## for the case that the arguments satisfy the requirements in <A>par</A> ## and such that for each position <M>i</M> in the list <A>check</A>, ## also <Ref Prop="IsHandledByNiceMonomorphism"/> is required for the ## <M>i</M>-th argument. ## The family relation between the arguments is given by <A>fampred</A>, ## and the comment for the method installation is <A>methtext</A>. ## ## Additionally, install a method for the situation where ## <Ref Prop="IsHandledByNiceMonomorphism"/> is replaced by ## <Ref Filt="MayBeHandledByNiceMonomorphism"/>, such that this method ## delegates to <A>meth</A> if the relevant arguments are in ## <Ref Prop="IsHandledByNiceMonomorphism"/>. ##
BindGlobal( "InstallNiceMonomorphismMethod", function( oper, par, methtext, fampred, check, meth )
local nargs, req1, req2, i;
# Check the argument length.
nargs:= NumberArgumentsFunction( meth ); if nargs <> Length( par ) then
Error( "need ", Pluralize( nargs, "argument" ), " for ",
NameFunction( oper ) ); fi;
req1:= ShallowCopy( par );
req2:= ShallowCopy( par ); for i in check do
req1[i]:= req1[i] and IsHandledByNiceMonomorphism;
req2[i]:= req2[i] and MayBeHandledByNiceMonomorphism;
od;
# Install the methods.
InstallOtherMethod( oper,
Concatenation( "handled by nice monomorphism: ", methtext ),
fampred,
req1, 0,
meth );
############################################################################# ## #F GroupSeriesMethodByNiceMonomorphism( <oper>, <par> ) ##
BindGlobal( "GroupSeriesMethodByNiceMonomorphism", function( oper, par )
InstallNiceMonomorphismMethod( oper, par, "GroupSeries",
true, [ 1 ], function( obj )
local nice, list, i;
nice := NiceMonomorphism( obj );
list := oper( NiceObject( obj ) ); if not IsList( list ) then # The result may be 'fail'.
return list; fi;
list:= ShallowCopy( list ); for i in [ 1 .. Length( list ) ] do
list[i] := GroupByNiceMonomorphism( nice, list[i] );
SetParent( list[i], obj );
od;
return list; end ); end );
############################################################################# ## #F GroupSeriesMethodByNiceMonomorphismCollOther( <oper>, <par> ) ##
BindGlobal( "GroupSeriesMethodByNiceMonomorphismCollOther", function( oper, par )
InstallNiceMonomorphismMethod( oper, par, "GroupSeries CollOther",
true, [ 1 ], function( obj, other )
local nice, list, i;
nice := NiceMonomorphism( obj );
list := ShallowCopy( oper( NiceObject( obj ), other ) ); for i in [ 1 .. Length( list ) ] do
list[i] := GroupByNiceMonomorphism( nice, list[i] );
SetParent( list[i], obj );
od;
return list; end ); end );
############################################################################# ## #F GroupSeriesMethodByNiceMonomorphismCollColl( <oper>, <par> ) ##
BindGlobal( "GroupSeriesMethodByNiceMonomorphismCollColl", function( oper, par )
InstallNiceMonomorphismMethod( oper, par, "GroupSeries CollColl",
IsIdenticalObj, [ 1, 2 ], function( obj1, obj2 )
local nice, list, i;
nice := NiceMonomorphism( obj1 ); if not IsIdenticalObj( nice, NiceMonomorphism( obj2 ) ) then
TryNextMethod(); fi;
list := ShallowCopy( oper( NiceObject( obj1 ), NiceObject( obj2 ) ) ); for i in [ 1 .. Length( list ) ] do
list[i] := GroupByNiceMonomorphism( nice, list[i] );
SetParent( list[i], obj1 );
od;
return list; end ); end );
############################################################################# ## #F GroupSeriesMethodByNiceMonomorphismCollElm( <oper>, <par> ) ##
BindGlobal( "GroupSeriesMethodByNiceMonomorphismCollElm", function( oper, par )
InstallNiceMonomorphismMethod( oper, par, "GroupSeries CollElm",
IsCollsElms, [ 1 ], function( obj1, obj2 )
local nice, img, list, i;
nice := NiceMonomorphism( obj1 );
img := ImagesRepresentative( nice, obj2 : actioncanfail:= true ); if img = fail or
not ( img in ImagesSource( nice ) and
PreImagesRepresentative( nice, img ) = obj2 ) then
TryNextMethod(); fi;
list := ShallowCopy( oper( NiceObject( obj1 ), img ) ); for i in [ 1 .. Length( list ) ] do
list[i] := GroupByNiceMonomorphism( nice, list[i] );
SetParent( list[i], obj1 );
od;
return list; end ); end );
############################################################################# ## #A SeedFaithfulAction( <grp> ) ## ## <#GAPDoc Label="SeedFaithfulAction"> ## <ManSection> ## <Attr Name="SeedFaithfulAction" Arg='grp'/> ## ## <Description> ## If this attribute does not hold the (default) value of <A>fail</A>, it ## is a record with components <A>points</A> (a list of orbit seeds ## and <A>ops</A> a list of action functions, such that the action of the ## group <A>grp</A> on the orbits specified this way is faithful and of ## minimal degree. In this case, a nice monomorphism for <A>grp</A> will be ## determined using this action, and no degree reduction attempt is made. ## </Description> ## </ManSection> ## <#/GAPDoc> ##
DeclareAttribute( "SeedFaithfulAction",
IsGroup );
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.24 Sekunden
(vorverarbeitet am 2026-10-12)
¤
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.