|
################################################################################
##
#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 \+
##
InstallOtherMethod(\+, "for IsTransformationRepOfEndo", IsIdenticalObj,
[IsTransformationRepOfEndo and IsEndoGeneralMapping,
IsTransformationRepOfEndo and IsEndoGeneralMapping], 0,
function(m, n)
local mntrans, en;
if Source(n) <> Source(m) then
TryNextMethod();
fi;
en := EnumeratorSorted(Source(m));
mntrans := Transformation(List([1 .. Length(en)],
i->Position(en, en[i^m!.transformation] * en[i^n!.transformation])));
return EndoMappingByTransformation(Source(m),FamilyObj(m), mntrans);
end);
InstallOtherMethod(\+, "for IsEndoGeneralMapping", IsIdenticalObj,
[IsGeneralMapping, IsGeneralMapping], 0,
function(m, n)
if Source(n) <> Source(m) then
TryNextMethod();
fi;
return MappingByFunction(Source(m),Source(m), g->(g^m)*(g^n));
end);
#############################################################################
##
#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 );
###############################################################################
##
#M AdditiveInverse
##
InstallOtherMethod(
AdditiveInverseOp,
"for IsTransformationRepOfEndo",
true,
[IsTransformationRepOfEndo and IsEndoGeneralMapping],
0,
function(m)
local en, mntrans;
en := EnumeratorSorted(Source(m));
mntrans := Transformation(List([1 .. Length(en)],
i->Position(en, en[i^m!.transformation]^(-1))));
return EndoMappingByTransformation(Source(m),FamilyObj(m), mntrans);
end);
InstallOtherMethod(
AdditiveInverseOp,
"for IsEndoGeneralMapping",
true,
[IsGeneralMapping], 0,
function(m)
return MappingByFunction(Source(m),Source(m), g->(g^m)^(-1));
end );
#############################################################################
##
#M NearRingElementByGroupRep
InstallMethod(
NearRingElementByGroupRep,
"Group element -> vector",
true,
[IsGroup,IsMultiplicativeElementWithInverse],
0,
function ( G , dpElement )
return GroupGeneralMappingByGroupElement( G, dpElement );
end );
InstallMethod(
EndoMappingFamily,
"stupid",
true,
[IsGroup],
0,
G -> FamilyObj( TransformationRepresentation( IdentityMapping( G ) ) )
);
InstallMethod(
GroupGeneralMappingByGroupElement,
"Group element -> mapping",
true,
[IsGroup,IsMultiplicativeElementWithInverse],
0,
function( G, g )
local DP, elms, trafo, m, fam;
DP := SizeFoldDirectProduct( G );
fam := EndoMappingFamily( G );
elms := EnumeratorSorted(G);
trafo := TransformationNC(
List( [1..Length (DirectProductInfo(DP).groups)],
i -> Position( elms, FastImageOfProjection( DP, g, i ) )
) );
m := EndoMappingByTransformation( G, fam, trafo );
SetGroupElementRepOfNearRingElement( m, g );
return m;
end );
#############################################################################
##
#M GroupElementRepOfNearRingElement
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 ) ) );
dpElement := Product( [1..Length(vec)],
i -> Image (Embedding (DP, i), elms[ vec[i] ])
);
return dpElement;
end );
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
DP := SizeFoldDirectProduct( Source( t ) );
elms := AsSSortedList( Source( t ) );
dpElement := Identity( DP );
vec := ImageListOfTransformation( t!.transformation );
dpElement := Product( [1..Length(vec)],
i -> Image (Embedding (DP, i), elms[ vec[i] ])
);
return dpElement;
end );
#############################################################################
##
#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 );
TfmNR := Objectify(
NewType(CollectionsFamily(fam),
IsTransformationNearRingRep),
rec() );
TfmNR!.elementsInfo := 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;
TfmNR := Objectify(
NewType(CollectionsFamily(fam),
IsTransformationNearRingRep),
rec() );
TfmNR!.elementsInfo := group;
SetGamma( TfmNR, group);
SetGeneratorsOfNearRing( TfmNR, gens );
return TfmNR;
end );
#############################################################################
##
#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
InstallMethod(
TransformationNearRingByAdditiveGenerators,
"generic",
true,
[IsGroup, IsList],
0,
function ( group, gens )
local fam, TfmNR;
TfmNR := TransformationNearRingByGenerators( group, gens );
SetGroupReduct( TfmNR,
SubgroupNC( SizeFoldDirectProduct(group),
List(gens,GroupElementRepOfNearRingElement) ) );
return TfmNR;
end );
#############################################################################
##
#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) ) > 2 then
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;
# perform a simple closure algorithm
tfs := Flat( [ mappings ] );
gens := Set( List( tfs, t ->
ImageListOfTransformation(
TransformationRepresentation(t)!.transformation) ) );
closure := ShallowCopy( gens );
group := Source(tfs[1]);
fam := EndoMappingFamily( group );
elms := AsSSortedList(group);
l := Length( elms );
firstrun := true;
# Print( closure, "\n" );
repeat
# step 1: add all sums
Info( InfoNearRing,1,"Step 1: Building sums of full mappings" );
elmset := closure;
changed_elmset := true;
done := true;
while changed_elmset do
closure := ShallowCopy( elmset );
changed_elmset := false;
for tfl1 in closure do
for tfl2 in gens do
tfl := List( [1..l], i ->
Position( elms, elms[ tfl1[i] ] * elms[ tfl2[i] ] ) );
if not tfl in elmset then
AddSet( elmset, tfl );
Info( InfoNearRing, 3, "Adding", tfl );
changed_elmset := true;
done := false;
fi;
od;
od;
od;
if not done or firstrun then
# step 2 build the multiplicative closure
Info( InfoNearRing, 1, "Step 2: Multiplying full mappings" );
firstrun := false;
elmset := closure;
changed_elmset := true;
done := true;
while changed_elmset do
closure := ShallowCopy( elmset );
changed_elmset := false;
for tfl1 in gens do
for tfl2 in closure do
tfl := tfl1{ tfl2 };
if not tfl in elmset then
AddSet( elmset, tfl );
Info( InfoNearRing, 3, "Adding", tfl );
changed_elmset := true;
done := false;
fi;
od;
od;
Info( InfoNearRing, 2, "size:", Length( elmset ) );
od;
fi;
until done;
Closure := [];
for tfl in closure do
AddSet( Closure,
EndoMappingByTransformation( group, fam, Transformation( tfl ) ) );
od;
return Closure;
end;
#############################################################################
##
#M ConstantEndoMapping ( <G>, <g> )
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 );
#############################################################################
##
#M GroupReduct( <transformation nearring> )
##
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 );
return subnr;
end );
InstallMethod(
SubNearRingBySubgroupNC,
"TfmNRs",
true,
[IsTransformationNearRing, IsGroup],
2,
function ( nr, sg )
local addGens, subnr;
subnr := Objectify(
NewType( FamilyObj(nr), IsTransformationNearRingRep), rec() );
subnr!.elementsInfo := nr!.elementsInfo;
SetGamma( subnr, Gamma( nr ) );
SetGroupReduct( subnr, sg );
SetParent( subnr, nr );
return subnr;
end );
#############################################################################
##
#M InvariantSubNearRings for M(G)
##
InstallMethod(
InvariantSubNearRings,
"M(G)",
true,
[IsTransformationNearRing and IsFullTransformationNearRing],
0,
function ( nr )
local gamma, gens, invsnr;
gamma := Gamma( nr );
gens := List( GeneratorsOfGroup(gamma),
gen -> ConstantEndoMapping( gamma, gen ) );
gens := List( gens, GroupElementRepOfNearRingElement );
invsnr := SubgroupNC( GroupReduct(nr), gens );
return [ nr, SubNearRingBySubgroupNC( nr, invsnr ),
SubNearRingBySubgroupNC( nr, TrivialSubgroup( GroupReduct( nr) ) ) ];
end );
#############################################################################
##
#M IsConstantEndoMapping generic method
InstallMethod(
IsConstantEndoMapping,
"generic",
true,
[IsMapping],
0,
m -> Size( Image( m ) ) = 1
);
#############################################################################
##
#M AsExplicitMultiplicationNearRing
##
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 );
############################################################################
## MATRIX NEARRINGS #
############################################################################
#############################################################################
##
#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 );
#############################################################################
##
#F Ntimesg( <nr>, <g> )
#F IsDistributiveNearRingElement( <nr>, <n> )
##
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;
return distr;
end );
#########################################################################
##
#M IsDistributiveNearRing
##
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);
#########################################################################
##
#M SomeInvariantSubgroupsOfGamma
##
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;
Info( InfoNearRing, 1, "computing multiplicative semigroup" );
gens := List( gens, TransformationRepresentation );
gens := AsList( Semigroup( gens ) );
return Group( List( gens, GroupElementRepOfNearRingElement ) );
end );
#########################################################################
##
#M IsIdentityMapping
##
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 );
#########################################################################
##
#M EndoMappingByPositionList
##
InstallMethod(
EndoMappingByPositionList,
"list -> endomapping",
true,
[IsGroup,IsList],
0,
function( G, list )
return EndoMappingByTransformation( G,
EndoMappingFamily( G ),
Transformation( list) );
end );
#########################################################################
##
#M EndoMappingByFunction
##
InstallMethod(
EndoMappingByFunction,
"function -> endomapping",
true,
[IsGroup, IsFunction],
0,
function( G, fun )
#
local elementsOfG;
#
elementsOfG := AsSSortedList (G);
return EndoMappingByPositionList (G,
List ([1..Size (G)],
i -> Position (
elementsOfG,
fun (elementsOfG [i])
)
)
);
end );
#########################################################################
##
#M AsEndoMapping
##
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);
#########################################################################
##
#M IdentityEndoMapping
##
InstallMethod(
IdentityEndoMapping,
"identity on G",
true,
[IsGroup],
0,
function( G )
return EndoMappingByFunction ( G, x -> x );
end);
#########################################################################
##
#M IsIdentityEndoMapping
##
InstallMethod(
IsIdentityEndoMapping,
"is identity on G",
true,
[IsEndoMapping],
0,
function( endomap )
return IsIdentityMapping ( endomap );
end);
#########################################################################
##
#M IsDistributiveEndoMapping
##
InstallMethod(
IsDistributiveEndoMapping,
"is a group homomorphism",
true,
[IsEndoMapping],
0,
function( endomap )
return IsGroupHomomorphism ( endomap );
end);
[ Verzeichnis aufwärts0.57unsichere Verbindung
Übersetzung europäischer Sprachen durch Browser
]
|