################################################################################ ## #W grptfms.gi Near-ring Library Christof N"obauer ## #Y Copyright (C) ## ## $Log: grptfms.gi,v $ ## Revision 1.15 2015/04/09 13:43:54 stein ## Added condition to make the method "abelian near ring (Binder e.a.)" for IsDistributiveNearring only applicable to abelian nearrings. ## ## Revision 1.14 2012-11-07 13:22:59 stein ## Adapted filters in method for \in. ## ## Revision 1.13 2011-11-23 20:01:17 stein ## New methods for Zero for elements of a nearring. ## New methods for multiplying a nearring element with an integer (These should ## be integrated into GAP in a future release and then removed from nr.gi). ## ## Revision 1.12 2011-06-17 08:48:13 stein ## changed order of methods for GroupElementRepOfNearRingElement ## ## Revision 1.11 2008-11-13 14:17:16 stein ## Restricted the Enumerator - Method to IsTransformationNearRing ## Replaced IsNearRingEnumerator by IsTransformationNearRingEnumerator ## ## Revision 1.10 2007/07/19 22:40:33 stein ## removed reference to IsNearRingWithOne ## ## Revision 1.9 2007/05/09 21:26:16 stein ## put the full TransformationNearRing into IsNearRingWithOne ## ## Revision 1.8 2004/02/26 16:22:43 juergen ## new filter for Random method ## ## Revision 1.7 2003/03/07 13:48:20 juergen ## new method for IsDistributiveNearRing ## ## Revision 1.6 2002/01/18 07:20:30 erhard ## I have added the function GraphOfMapping. ## ## Revision 1.5 2001/06/28 18:57:08 erhard ## I have added the functions EndoMappingByFunction, AsEndoMapping, ## IdentityEndoMapping, IsIdentityEndoMapping, IsDistributiveEndoMapping. ## ## Revision 1.4 2001/03/21 16:22:09 juergen ## noch ein paar filter angepasst ## ## Revision 1.2 2001/03/21 14:41:07 juergen ## erste korrekturen nach dem studium des tutorials ## ## Revision 1.1.1.1 2000/02/21 15:59:03 hetzi ## Sonata Project Start ##
############################################################################# ## #F SizeFoldDirectProduct ( <G> ) ... returns the direct ## product G^|G| for the group G. ##
InstallMethod(
SizeFoldDirectProduct, "of a group",
true,
[IsGroup], 0,
G -> DirectProduct( List ([1..Size (G)], i -> G) )
);
############################################################################# ## #M Zero For NR elements ##
InstallOtherMethod(
ZeroMutable, "for IsTransformationRepOfEndo",
true,
[IsTransformationRepOfEndo and IsEndoGeneralMapping], 0, function ( m )
local en, o, mntrans;
en := EnumeratorSorted(Source(m));
o := Position( en, en[1]^0 );
mntrans := Transformation(List([1 .. Length(en)], i-> o) );
return EndoMappingByTransformation(Source(m),FamilyObj(m), mntrans); end );
## the following conflicts with GAP's method Zero for homomorphisms #InstallOtherMethod( # ZeroMutable, # "for IsEndoGeneralMapping", # true, # [IsGeneralMapping], 0, # function(m) # local en, o; # # en := Source(m); # o := Identity( en ); # # return MappingByFunction(Source(m),Source(m), g-> o ); # end );
InstallMethod(
GroupElementRepOfNearRingElement, "mapping -> group element",
true,
[IsMapping], 0, function ( t )
local dpElement, # the element of the direct product to be returned
DP, # a direct product of groups
elms, # elements of the group the transformation acts on
vec; # the transformation as a vector
DP := SizeFoldDirectProduct( Source( t ) );
elms := AsSSortedList( Source( t ) );
dpElement := Identity( DP );
vec := List( elms, x -> Position( elms, ImageElm( t, x ) ) );
InstallMethod(
GroupElementRepOfNearRingElement, "GroupGeneralMappingTrafoRep -> group element",
true,
[IsGroupGeneralMapping and IsTransformationRepOfEndo], 0, function ( t )
local fam, # family of the transformation
dpElement, # the element of the direct product to be returned
i, # counter through all elements of the vector
DP, # a direct product of groups
elms, # elements of the group the transformation acts on
vec; # the transformation as a vector
############################################################################# ## #M TransformationNearRing The Complete M(G) ## ## secret components: ## GtoG: G^|G| ## elementsInfo: the group the mappings act on
InstallMethod(
TransformationNearRing, "generic",
true,
[IsGroup], 0, function ( group )
local fam, TfmNR;
fam := EndoMappingFamily( group );
SetGamma( TfmNR, group );
SetOne( TfmNR, IdentityMapping( group ) );
SetGroupReduct( TfmNR, SizeFoldDirectProduct( group ) );
SetIsFullTransformationNearRing( TfmNR, true );
return TfmNR; end );
############################################################################# ## #M TransformationNearRingByGenerators From a list of ## GroupTransformations ## ## secret components: ## elmentsFam: family of its elements ## GtoG: G^|G|, where G is the group the tfms act on
InstallMethod(
TransformationNearRingByGenerators, "generic",
true,
[IsGroup, IsList], 0, function ( group, gens )
local fam, TfmNR; # if not ForAll(gens,IsMapping) then # Error("Generators have to be mappings\n"); # fi;
# in the case that no generators are given create the trivial near ring if gens = [] then
gens := [EndoMappingByTransformation(group,EndoMappingFamily(group),
TransformationNC(List([1..Size(group)],i->1)))]; fi;
fam := FamilyObj(gens[1]);
if not ForAll( gens, g -> Source(g) = group ) then
Error("generating transformations have to act on the same group\n"); fi;
############################################################################# ## #M TransformationNearRingByAdditiveGenerators From a list of ## GroupTransformations ## ## secret components: ## elmentsFam: family of its elements
# constructs the nearring with the help of TransformationNearRingByGenerators # and sets the attribute GroupReduct
############################################################################# ## #M \in For nearrings with known additive group
InstallMethod(
\in, "nearrings with known additive group",
IsElmsColls,
[IsNearRingElement and HasGroupElementRepOfNearRingElement, IsNearRing], 0, function ( e , nr )
return GroupElementRepOfNearRingElement(e) in GroupReduct(nr); end );
InstallMethod(
\in, "nearrings with known additive group",
IsElmsColls,
[IsExplicitMultiplicationNearRingElement, IsNearRing], 0, function ( e , nr )
return GroupElementRepOfNearRingElement(e) in GroupReduct(nr); end );
InstallMethod(
\in, "one of the generators",
IsElmsColls,
[IsNearRingElement, IsNearRing and HasGeneratorsOfNearRing], 0, function ( e, nr ) if e in GeneratorsOfNearRing(nr) then
return true; else
TryNextMethod(); fi; end );
############################################################################# ## #M Enumerator For transformation nearrings
InstallMethod(
Enumerator,
true,
[ IsTransformationNearRing ], 0, function( nr )
return Objectify( NewType( FamilyObj( nr ),
IsList and IsTransformationNearRingEnumerator ),
rec( groupReduct := GroupReduct(nr),
elementsInfo := nr!.elementsInfo )
); end );
##################################################################### ## #M Length for nearring enumerators
InstallMethod(
Length,
true,
[ IsList and IsTransformationNearRingEnumerator ], 0,
e -> Size( e!.groupReduct ) );
##################################################################### ## #M \[\] for nearring enumerators
InstallMethod(
\[\],
true,
[ IsList and IsTransformationNearRingEnumerator, IsPosInt ], 0, function( e, pos )
local groupElement, group;
group := e!.groupReduct;
groupElement := Enumerator(group)[pos];
return NearRingElementByGroupRep( e!.elementsInfo, groupElement ); end );
##################################################################### ## #M Position for nearring enumerators
InstallMethod(
Position,
true,
[ IsList and IsTransformationNearRingEnumerator, IsGroupGeneralMapping, IsZeroCyc ], 0, function( e, nrelm, zero )
local groupElement;
groupElement := GroupElementRepOfNearRingElement(nrelm);
return Position( e!.groupReduct, groupElement, zero ); end );
##################################################################### ## #M ViewObj for nearring enumerators #
InstallMethod(
ViewObj,
true,
[ IsTransformationNearRingEnumerator ], 0, function( G )
Print( "<enumerator of near ring>" ); end );
############################################################################# ## #M Random For nearrings with known additive group
InstallMethod(
Random, "Random for nearrings with known additive group",
true,
[IsNearRing and IsExplicitMultiplicationNearRing], 0, function ( nr )
return NearRingElementByGroupRep( nr!.elementsInfo, Random( GroupReduct(nr) ) ); end );
InstallMethod(
Random, "Random for nearrings with known additive group",
true,
[IsNearRing and IsTransformationNearRing], 0, function ( nr )
return GroupGeneralMappingByGroupElement( Gamma(nr), Random( GroupReduct(nr) ) ); end );
############################################################################# ## #M IsFullTransformationNearRing For TfmNRs
InstallMethod(
IsFullTransformationNearRing, "TfmNRs",
true,
[IsTransformationNearRing], 0, function ( TfmNR )
return Size(TfmNR) = Size( Gamma(TfmNR) )^Size( Gamma(TfmNR) ); end );
############################################################################# ## #M ViewObj For transformation nearrings
InstallMethod(
ViewObj, "for TfmNRs",
true,
[IsTransformationNearRing and HasGroupReduct], 2, function ( TfmNR )
Print("TransformationNearRingBySubgroup(");
View( GroupReduct( TfmNR ) );
Print(", ... )"); end );
InstallMethod(
PrintObj, "for TfmNRs",
true,
[IsTransformationNearRing and HasGroupReduct], 2, function ( TfmNR )
Print("TransformationNearRingBySubgroup(");
Print( GroupReduct( TfmNR ) );
Print(", ... )"); end );
InstallMethod(
ViewObj, "for TfmNRsByGenerators",
true,
[IsTransformationNearRing and HasGeneratorsOfNearRing], 4, function ( TfmNR ) if Length( GeneratorsOfNearRing(TfmNR) ) > 2then
Print("< transformation nearring with ",
Length( GeneratorsOfNearRing(TfmNR) ), " generators >" ); else
TryNextMethod(); fi; end );
InstallMethod(
ViewObj, "for TfmNRsByGenerators",
true,
[IsTransformationNearRing and HasGeneratorsOfNearRing], 3, function ( TfmNR )
Print("TransformationNearRingByGenerators(");
View( GeneratorsOfNearRing(TfmNR) );
Print(")"); end );
InstallMethod(
PrintObj, "for TfmNRsByGenerators",
true,
[IsTransformationNearRing and HasGeneratorsOfNearRing], 3, function ( TfmNR )
Print("TransformationNearRingByGenerators(");
Print( GeneratorsOfNearRing(TfmNR) );
Print(")"); end );
InstallMethod(
ViewObj, "for full transformation NearRings",
true,
[IsTransformationNearRing and HasIsFullTransformationNearRing
and IsFullTransformationNearRing], 2, function ( TfmNR )
Print( "TransformationNearRing(" );
View( Gamma(TfmNR) );
Print( ")" ); end );
InstallMethod(
PrintObj, "for full transformation nearrings",
true,
[IsTransformationNearRing and HasIsFullTransformationNearRing
and IsFullTransformationNearRing], 2, function ( TfmNR )
Print("TransformationNearRing(",Gamma(TfmNR),")"); end );
############################################################################# ## #F ClosureNearRing( <transformations> ) ## ## compute the closure of the <transformations> under addition and ## composition.
ClosureNearRing := function( mappings )
#JE diese Funktion sollte lieber mit Transformationen arbeiten!
local closure, Closure, # the constructed closure
group, # the group on which the tf's operate
elms, # the elements of group
l, # the number of the elements
firstrun, # help var: indicates if first loop run
tfl,tfl1,tfl2, # help vars: transformation lists
elmset, # help var: contains the elms curr. in the closure
changed_elmset, # help var: indicates if elmset has changed done, # help var: indicates, when it is time to stop
tfs, gens, fam;
InstallMethod(
ConstantEndoMapping, "default",
IsCollsElms,
[IsGroup, IsMultiplicativeElementWithInverse], 0, function ( G , g )
return MappingByFunction( G, G, x -> g ); end );
############################################################################# ## #M GraphOfMapping ( <m> ) ##
InstallMethod(
GraphOfMapping, "default",
true,
[IsMapping], 0, function ( m )
return List (Source (m), x -> [x, Image (m, x)]); end );
InstallMethod(
GroupReduct, "TfmNRs",
true,
[IsTransformationNearRing and HasGeneratorsOfNearRing], 0, function ( nr )
local gensAsGroupElms, id;
gensAsGroupElms :=
List( GeneratorsOfNearRing( nr ), GroupElementRepOfNearRingElement );
id := gensAsGroupElms[1]^0;
return NRClosureOfSubgroup( Group( gensAsGroupElms, id ),
gensAsGroupElms,
Gamma(nr) ); end );
############################################################################# ## #M SubNearRingBySubgroupNC ## ## No Check!
InstallMethod(
SubNearRingBySubgroupNC, "TfmNRs",
true,
[IsTransformationNearRing, IsGroup], 0, function ( nr, sg )
local addGens, subnr;
addGens := List( GeneratorsOfGroup(sg),
gen -> NearRingElementByGroupRep( Gamma(nr), gen ) );
subnr := TransformationNearRingByAdditiveGenerators( Gamma(nr), addGens );
SetParent( subnr, nr );
InstallMethod(
AsExplicitMultiplicationNearRing, "transformation nearrings",
true,
[IsTransformationNearRing], 0, function ( nr )
local gamma, mul;
gamma := Gamma(nr);
mul := function ( a, b )
return GroupElementRepOfNearRingElement( NearRingElementByGroupRep( gamma, a ) * NearRingElementByGroupRep( gamma, b ) ); end;
return ExplicitMultiplicationNearRingNC( GroupReduct( nr ), mul ); end );
############################################################################# ## #M MatrixNearRing a la K. Smith
InstallMethod(
MatrixNearRing, "a la K. Smith",
true,
[IsGroup and IsNGroup, IsInt and IsPosRat], 0, function( ng, n )
local cr_i, fr_ij, r, i, j, nr, mat, gamma, action, i_i, pi_j, MvdWFct;
nr := NearRingActingOnNGroup( ng );
action := ActionOfNearRingOnNGroup( ng );
gamma := DirectProduct( List( [1..n], i -> ng ) );
fr_ij := []; for r in GeneratorsOfNearRing( nr ) do for i in [1..n] do
i_i := Embedding( gamma, i ); for j in [1..n] do
pi_j := Projection( gamma, j );
MvdWFct := dpElm -> Image( i_i, action( r, dpElm^pi_j ) );
Add( fr_ij, MappingByFunction( gamma, gamma, MvdWFct ) );
od;
od;
od;
mat := TransformationNearRingByGenerators( gamma, fr_ij );
SetMatrixNearRingFlag( mat, true );
SetDimensionOfMatrixNearRing( mat, n );
SetCoefficientRange( mat, nr );
return mat; end );
############################################################################# ## #M MatrixNearRing for d.g. nearrings
InstallMethod(
MatrixNearRing, "d.g. case",
true,
[IsGroup and IsNGroup, IsInt and IsPosRat], 2, function( ng, n )
local fr_ij, r, i, j, nr, mat, gamma, action, i_i, pi_j, MvdWFct;
nr := NearRingActingOnNGroup( ng ); if not( HasIsDgNearRing( nr ) and IsDgNearRing( nr ) ) then
TryNextMethod(); fi;
action := ActionOfNearRingOnNGroup( ng );
gamma := DirectProduct( List( [1..n], i -> ng ) );
fr_ij := []; for r in DistributiveElements( nr ) do for i in [1..n] do
i_i := Embedding( gamma, i ); for j in [1..n] do
pi_j := Projection( gamma, j );
MvdWFct := dpElm -> Image( i_i, action( r, dpElm^pi_j ) );
Add( fr_ij, MappingByFunction( gamma, gamma, MvdWFct ) );
od;
od;
od;
mat := TransformationNearRingByAdditiveGenerators( gamma, fr_ij );
SetMatrixNearRingFlag( mat, true );
SetDimensionOfMatrixNearRing( mat, n );
SetCoefficientRange( mat, nr );
return mat; end );
############################################################################# ## #M ViewObj for matrix nearrings
InstallMethod(
ViewObj, "matrix nearrings",
true,
[IsNearRing and IsMatrixNearRing], 5, function( nr )
Print( "MatrixNearRing( ",CoefficientRange(nr),", ",
DimensionOfMatrixNearRing(nr)," )" ); end );
############################################################################# ## #M IsAbelianNearRing for matrix nearrings
InstallMethod(
IsAbelianNearRing, "matrix nearrings",
true,
[IsNearRing and IsMatrixNearRing], 0, function( m )
return IsAbelianNearRing( CoefficientRange( m ) ); end );
############################################################################# ## #M IsZeroSymmetricNearRing for matrix nearrings
InstallMethod(
IsZeroSymmetricNearRing, "matrix nearrings",
true,
[IsNearRing and IsMatrixNearRing], 0, function( m )
return IsZeroSymmetricNearRing( CoefficientRange( m ) ); end );
############################################################################# ## #M IsAbstractAffineNearRing for matrix nearrings
InstallMethod(
IsAbstractAffineNearRing, "matrix nearrings",
true,
[IsNearRing and IsMatrixNearRing], 2, function( m ) if IsAbstractAffineNearRing( CoefficientRange( m ) ) then
return true; else
TryNextMethod(); fi; end );
Ntimesg := function( N, g )
local E, Ng, e, i, G, fine_so_far;
E := GeneratorsOfNearRing( N );
Ng := Group( Set( List( E, n -> ImageElm( n, g ) ) ), g^0 );
e := 0; while e < Length(E) do
e := e + 1;
i := 0;
G := Enumerator(Ng);
fine_so_far := true; while fine_so_far and i < Size(Ng) do
i := i + 1; if not ( ImageElm( E[e], G[i] ) in Ng ) then
fine_so_far := false; fi;
od; if not fine_so_far then
Ng := ClosureGroup( Ng, ImageElm( E[e], G[i] ) );
e := 0; fi;
od;
return Ng; end;
#IsDistributiveNearRingElement := function ( nr, n ) #local gamma, Ng, Ngs, CheckedNgs, i, h; # # gamma := Gamma( nr ); # Ngs := List( gamma, g -> Ntimesg( nr, g ) ); # CheckedNgs := []; # i := 0; # # while i < Length(Ngs) do # i := i + 1; # Ng := Ngs[i]; # if ForAll( CheckedNgs, BigOne -> not ( IsSubset( BigOne, Ng ) ) ) then # h := MappingByFunction( Ng, Ng, x -> Image( n, x ) ); # if not IsGroupHomomorphism( h ) then # return false; # fi; # fi; # od; # # return true; #end;
############################################################################# ## #M DistributiveElements for TfmNrs ##
InstallMethod(
DistributiveElements, "TfmNrs",
true,
[IsNearRing and IsTransformationNearRing], 0, function ( nr )
local gamma, Ng, Ngs, CheckedNgs, i, j, h, distr, all_endos, n;
gamma := Gamma( nr );
Ngs := List( gamma, g -> Ntimesg( nr, g ) );
for i in [1..Length(Ngs)] do if ForAny( [1..Length(Ngs)], j -> i<>j and
IsBound(Ngs[j]) and
IsSubset( Ngs[j], Ngs[i] )
) then
Unbind( Ngs[i] ); fi;
od;
Ngs := Flat(Ngs);
distr := [];
for n in nr do
CheckedNgs := [];
i := 0;
all_endos := true; while all_endos and i < Length(Ngs) do
i := i + 1;
Ng := Ngs[i];
h := MappingByFunction( Ng, Ng, x -> ImageElm( n, x ) ); if not IsGroupHomomorphism( h ) then
all_endos := false; fi;
od; if all_endos then
Add( distr, n ); fi;
od;
InstallMethod(
IsDistributiveNearRing, "abelian near ring (Binder e.a.)",
true,
[IsNearRing and IsTransformationNearRing], 50, function( nr )
local F, G, E, gamma;
gamma := Gamma( nr ); if not IsAbelian(gamma) then
TryNextMethod(); fi;
F := AdditiveGenerators( nr ); for gamma in Gamma( nr ) do
G := Ntimesg( nr, gamma );
E := GeneratorsOfGroup( G ); if ForAny( F, f -> ForAny( G, g -> ForAny( E, e ->
Image( f, g*e ) <> Image( f, g ) * Image( f, e ) ) ) ) then
return false; fi;
od;
return true; end);
InstallMethod(
SomeInvariantSubgroupsOfGamma, "default",
true,
[IsNearRing and IsTransformationNearRing], 0, function( nr )
local E, gamma, g, new, invsg;
E := GeneratorsOfNearRing( nr );
gamma := Gamma( nr );
invsg := []; for g in gamma do if ForAll( invsg, I -> not (g in I) ) then
new := Ntimesg( nr, g );
invsg := Filtered( invsg, I -> not( IsSubgroup( new, I ) ) );
Add( invsg, new ); fi;
od;
return invsg; end );
######################################################################### ## #M IsDistributiveNearRingElement( <nr>, <elm> ) ## ## returns true if <elm> distributes over all elements of <nr> ##
InstallMethod(
IsDistributiveNearRingElement, "TfmNRs",
IsCollsElms,
[IsNearRing and IsTransformationNearRing, IsNearRingElement], 0, function ( nr, n )
local Ngs, i, h, Ng, NgGens, g, e;
Ngs := SomeInvariantSubgroupsOfGamma( nr );
i := 0;
while i < Length(Ngs) do
i := i + 1;
Ng := Ngs[i];
NgGens := GeneratorsOfGroup( Ng ); for g in Ng do for e in NgGens do if ImageElm( n, g * e ) <> ImageElm( n, g ) * ImageElm( n, e ) then
return false; fi;
od;
od;
od;
return true; end );
######################################################################### ## #M DistributiveElements for transformation nearrings ##
InstallMethod(
DistributiveElements, "TfmNrs",
true,
[IsNearRing and IsTransformationNearRing], 10, function ( nr )
local gamma, Ng, NgGens, Ngs, i, h, distGens, distr, all_endos, n, g, e;
gamma := Gamma( nr );
Ngs := SomeInvariantSubgroupsOfGamma( nr );
distr := [];
for n in ZeroSymmetricPart(nr) do if not n in distr then
i := 0;
all_endos := true; while all_endos and i < Length(Ngs) do
i := i + 1;
Ng := Ngs[i];
NgGens := GeneratorsOfGroup( Ng ); for g in Ng do for e in NgGens do if ImageElm( n, g * e ) <> ImageElm( n, g ) * ImageElm( n, e ) then
all_endos := false; fi;
od;
od;
od; if all_endos then
UniteSet( distr,
AsSSortedList( Semigroup(TransformationRepresentation(n) ) ) ); fi; fi;
od;
return distr; end );
######################################################################### ## #M GroupReduct TfmNRs generated by distributive elements ##
InstallMethod(
GroupReduct, "distributive generators",
true,
[IsNearRing and IsTransformationNearRing], 50, function ( tfmnr )
local gens;
gens := GeneratorsOfNearRing( tfmnr ); # distributivity can be checked without knowing all elements of the nr if not ForAll( gens, g -> IsDistributiveNearRingElement( tfmnr, g ) ) then
TryNextMethod(); # the default closure algorithm fi;
InstallMethod(
IsIdentityMapping, "compare with identity mapping",
true,
[IsGroupGeneralMapping], 0,
m -> m = IdentityMapping( Source(m) )
);
######################################################################### ## #M AsList for TfmNRs ##
InstallMethod(
AsList, "for TfmNRs",
true,
[IsNearRing and IsTransformationNearRing], 0, function( nr )
local G;
G := Gamma( nr );
return List( AsList( GroupReduct(nr) ),
t -> GroupGeneralMappingByGroupElement( G, t ) ); end );
InstallMethod(
AsEndoMapping, "mapping -> endomapping",
true,
[IsMapping], 0, function( map ) #
local G; # if not (IsGroup (Source (map)) and
IsGroup (Range (map)) and
IsIdenticalObj (Source (map), Range (map))) then
TryNextMethod (); fi; #
G := Source (map);
return EndoMappingByFunction (G, x -> Image ( map, x )); 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.