########################################################### ## ## nearring ideals and related functions ## (mainly for function nearrings) ## ## v0.01 4.12.1996 ## ## Author: Juergen Ecker ##
#**************************************************************************** # ideals.g # # computes the ideals of a near-ring. # # Author: Erhard Aichinger # # Date : 06 June 1995 # #****************************************************************************
############################################################################# ## #M ViewObj For NRIdeals
InstallMethod(
ViewObj, "ideal",
true,
[IsNearRingIdeal and HasSize], 1, # if it's 2-sided write it function ( i )
Print("< nearring ideal of size ", Size(i), " >" ); end );
InstallMethod(
ViewObj, "ideal",
true,
[IsNearRingIdeal], 1, # if it's 2-sided write it function ( i )
Print("< nearring ideal >"); end );
InstallMethod(
ViewObj, "ideal",
true,
[IsNearRingLeftIdeal and HasSize], 0, function ( i )
Print("< nearring left ideal of size ", Size(i), " >" ); end );
InstallMethod(
ViewObj, "ideal",
true,
[IsNearRingLeftIdeal], 0, function ( i )
Print("< nearring left ideal >" ); end );
InstallMethod(
ViewObj, "ideal",
true,
[IsNearRingRightIdeal and HasSize], 0, function ( i )
Print("< nearring right ideal of size ", Size(i), " >" ); end );
InstallMethod(
ViewObj, "ideal",
true,
[IsNearRingRightIdeal], 0, function ( i )
Print("< nearring right ideal >" ); end );
############################################################################# ## #M PrintObj For NRIdeals
InstallMethod(
PrintObj, "ideal",
true,
[IsNearRingIdeal and HasSize], 1, # if it's 2-sided write it function ( i )
Print("< nearring ideal of size ", Size(i), " >" ); end );
InstallMethod(
PrintObj, "ideal",
true,
[IsNearRingIdeal], 1, # if it's 2-sided write it function ( i )
Print("< nearring ideal >"); end );
InstallMethod(
PrintObj, "ideal",
true,
[IsNearRingLeftIdeal and HasSize], 0, function ( i )
Print("< nearring left ideal of size ", Size(i), " >" ); end );
InstallMethod(
PrintObj, "ideal",
true,
[IsNearRingLeftIdeal], 0, function ( i )
Print("< nearring left ideal >" ); end );
InstallMethod(
PrintObj, "ideal",
true,
[IsNearRingRightIdeal and HasSize], 0, function ( i )
Print("< nearring right ideal of size ", Size(i), " >" ); end );
InstallMethod(
PrintObj, "ideal",
true,
[IsNearRingRightIdeal], 0, function ( i )
Print("< nearring right ideal >" ); end );
############################################################################# ## #M \= For nearring ideals
InstallMethod(
\=, "different size",
IsIdenticalObj,
[IsNRI, IsNRI], 100, function ( i, j ) if Size(i) <> Size(j) then
return false; else
TryNextMethod(); fi; end );
#BindGlobal( "xor", function ( a, b ) # return ( ( a and ( not b ) ) or ( ( not a ) and b ) ); #end );
InstallMethod(
\=, "left <-> not left",
IsIdenticalObj,
[IsNRI and HasIsNearRingLeftIdeal,
IsNRI and HasIsNearRingLeftIdeal], 100, function ( i, j ) # if xor( IsNearRingLeftIdeal(i), IsNearRingLeftIdeal(j) ) if IsNearRingLeftIdeal(i) <> IsNearRingLeftIdeal(j) then
return false; else
TryNextMethod(); fi; end );
InstallMethod(
\=, "right <-> not right",
IsIdenticalObj,
[IsNRI and HasIsNearRingRightIdeal,
IsNRI and HasIsNearRingRightIdeal], 100, function ( i, j ) # if xor( IsNearRingRightIdeal(i), IsNearRingRightIdeal(j) ) if IsNearRingRightIdeal(i) <> IsNearRingRightIdeal(j) then
return false; else
TryNextMethod(); fi; end );
InstallMethod(
\=, "ideal <-> not ideal",
IsIdenticalObj,
[IsNRI and HasIsNearRingIdeal,
IsNRI and HasIsNearRingIdeal], 100, function ( i, j ) # if xor( IsNearRingIdeal(i), IsNearRingIdeal(j) ) if IsNearRingIdeal(i) <> IsNearRingIdeal(j) then
return false; else
TryNextMethod(); fi; end );
InstallMethod(
\=, "with known additive group",
IsIdenticalObj,
[IsNRI , IsNRI ], 0, function ( i , j )
return AsSSortedList(GroupReduct(i)) = AsSSortedList(GroupReduct(j)); end );
############################################################################# ## #M \< compare sizes of near-ring ideals (required for AsSSortedList)
InstallMethod(
\<, "compare group reducts",
IsIdenticalObj,
[IsNRI , IsNRI ], 0, function ( i , j )
return GroupReduct(i) < GroupReduct(j); end );
############################################################################# ## #M AsList For nearring ideals
InstallMethod(
AsList, "with known additive group",
true,
[IsNRI], 0, function ( i )
return List( GroupReduct(i), x -> NearRingElementByGroupRep( i!.elementsInfo, x ) ); end );
############################################################################# ## #M Size For nearring ideals
InstallMethod(
Size, "with known additive group",
true,
[IsNRI ], 0, function ( i )
return Size( GroupReduct(i) ); end );
############################################################################# ## #M \in For nearring ideals
InstallMethod(
\in, "with known additive group",
IsElmsColls,
[IsNearRingElement, IsNRI ], 0, function ( x , i )
return GroupElementRepOfNearRingElement(x) in GroupReduct(i); end );
############################################################################# ## #M Random For nearring ideals
InstallMethod(
Random, "with known additive group",
true,
[IsNRI ], 0, function ( i )
return NearRingElementByGroupRep( i!.elementsInfo, Random( GroupReduct(i) ) ); end );
NearRingLeftIdealClosureOfSubgroupDefault := function (
F,
S
) #********************************************************* # returns the smallest leftt ideal containing the elements # of the subgroup S of the nearring F as a normal subgroup # of the additive group of F #********************************************************* #
local G, L, fam, g, g_add, f, leftProd;
G := GroupReduct(F);
L := ShallowCopy(S);
fam := F!.elementsInfo;
L := NormalClosure( G, L ); if Size(L)=Size(G) then return G; fi;
for g_add in GeneratorsOfGroup(L) do
g := NearRingElementByGroupRep(fam,g_add); for f in G do
leftProd := GroupElementRepOfNearRingElement( NearRingElementByGroupRep(fam,f) * g ); if not leftProd in L then
L := NormalClosure( G, ClosureGroup( L, leftProd )); if Size(L) = Size(G) then return G; fi; fi;
od;
od;
TransformationNearRingIdealClosureOfSubgroup := function(
F,
S
) #********************************************************* # returns the smallest ideal containing the elements of the # subgroup S of the additive group of the nearring F again # as a subgroup of the additive group of F #********************************************************* #
local I, fam, a, f, i, generators, G, rightProd, pos, visited,
additivelyGeneratingTrafos, distributiveGeneratingTrafos,
distributiveGenerators, nonDistributiveGenerators,
newGens; #
fam := F!.elementsInfo;
I := NormalClosure( GroupReduct(F), S );
# subgroup is the whole additive group? if Size(I)=Size(F) then return GroupReduct(F); fi;
G := GroupReduct(F);
additivelyGeneratingTrafos :=
List( GeneratorsOfGroup( G ), gen -> NearRingElementByGroupRep( fam, gen ) );
visited := []; pos := 1; while pos <= Size(I) do
i := Enumerator(I)[pos];
pos := pos + 1;
newGens := []; if not i in visited then
AddSet( visited, i );
# case 1: distributive generators
for a in distributiveGenerators do # rightProd := i * a
rightProd := GroupElementRepOfNearRingElement( NearRingElementByGroupRep(fam,i) * NearRingElementByGroupRep(fam,a)); if not rightProd in I then
AddSet( newGens, rightProd ); fi;
od;
# case 2: nondistributive generators
for f in G do for a in nonDistributiveGenerators do # rightProd := ( f + i ) * a - f * a
rightProd := GroupElementRepOfNearRingElement( NearRingElementByGroupRep(fam,f*i) * a ) /
GroupElementRepOfNearRingElement( NearRingElementByGroupRep(fam,f) * a ); if not rightProd in I then
AddSet( newGens, rightProd ); fi;
od;
od;
# is there a new element ?
if newGens <> [] then
I := NearRingLeftIdealClosureOfSubgroup( F,
ClosureGroup( I, SubgroupNC( G, newGens ) ) );
pos := 1; # start anew # the ideal is the whole nearring ? if Size(I)=Size(G) then return G; fi; fi;
fi;
od;
return I; end;
ExpMultNearRingIdealClosureOfSubgroup := function(
F,
S
) #********************************************************* # returns the smallest ideal containing the elements of the # subgroup S of the additive group of the nearring F again # as a subgroup of the additive group of F #********************************************************* #
local I, a, f, i, generators, G, rightProd, pos, visited, mult, newGens;
mult := NRMultiplication(F);
I := NormalClosure( GroupReduct(F), S );
# subgroup is the whole additive group? if Size(I)=Size(F) then return GroupReduct(F); fi;
G := GroupReduct(F);
generators := GeneratorsOfGroup( G );
visited := []; pos := 1; while pos <= Size(I) do
i := Enumerator(I)[pos];
pos := pos + 1;
newGens := []; if not i in visited then
AddSet( visited, i ); for a in generators do for f in G do
rightProd := mult( f*i, a ) / mult( f, a ); if not rightProd in I then
AddSet( newGens, rightProd ); fi;
od;
od; if newGens <> [] then
I := NearRingLeftIdealClosureOfSubgroup( F,
ClosureGroup( I, SubgroupNC( G, newGens ) ) );
pos := 1; # the ideal is the whole nearring ? if Size(I)=Size(G) then return G; fi; fi; fi;
od;
# the following method replaces the 2 methods above and is much faster # probably the 2 methods above will die sooner or later
InstallMethod(
NearRingIdealClosureOfSubgroup, "for TfmNRs",
true,
[IsNearRing, IsGroup], 50, function ( nr, group ) # see Prop. 1.52 in Pilz, NearRings
return NearRingRightIdealClosureOfSubgroup( nr,
NearRingLeftIdealClosureOfSubgroup( nr, group ) ); end );
TransformationNearRingRightIdealClosureOfSubgroup := function(
F,
S
) #********************************************************* # returns the smallest right ideal containing the elements # of the subgroup S of the additive group of the nearring F # as a normal subgroup of the additive group of F #********************************************************* #
local I, fam, a, f, i, generators, G, rightProd, pos, visited,
additivelyGeneratingTrafos, distributiveGeneratingTrafos,
distributiveGenerators, nonDistributiveGenerators, idtfm,
newGens; #
fam := F!.elementsInfo;
I := NormalClosure( GroupReduct(F), S );
# subgroup is the whole additive group? if Size(I)=Size(F) then return GroupReduct(F); fi;
G := GroupReduct(F);
additivelyGeneratingTrafos :=
List( GeneratorsOfGroup( G ), gen -> NearRingElementByGroupRep( fam, gen ) );
visited := []; pos := 1; while pos <= Size(I) do
i := Enumerator(I)[pos];
pos := pos + 1;
newGens := []; if not i in visited then
AddSet( visited, i );
# case 1: distributive generators
for a in distributiveGenerators do # rightProd := i * a
rightProd := GroupElementRepOfNearRingElement( NearRingElementByGroupRep(fam,i) * NearRingElementByGroupRep(fam,a) ); if not rightProd in I then
AddSet( newGens, rightProd ); fi;
od;
# case 2: nondistributive generators
for f in G do for a in nonDistributiveGenerators do # rightProd := ( f + i ) * a - f * a
rightProd := GroupElementRepOfNearRingElement( NearRingElementByGroupRep(fam,f*i) * NearRingElementByGroupRep(fam,a) ) /
GroupElementRepOfNearRingElement( NearRingElementByGroupRep(fam,f) * NearRingElementByGroupRep(fam,a) ); if not rightProd in I then
AddSet( newGens, rightProd ); fi;
od;
od;
# is there a new element ?
if newGens <> [] then
I := NormalClosure( G, ClosureGroup( I, SubgroupNC( G, newGens ) ) );
pos := 1; # start anew # the ideal is the whole nearring ? if Size(I)=Size(G) then return G; fi; fi;
fi;
od;
return I; end;
ExpMultNearRingRightIdealClosureOfSubgroup := function(
F,
S
) #********************************************************* # returns the smallest right ideal containing the elements of the # subgroup S of the additive group of the nearring F again # as a subgroup of the additive group of F #********************************************************* #
local I, a, f, i, generators, G, rightProd, pos, visited, mult, newGens;
mult := NRMultiplication(F);
I := NormalClosure( GroupReduct(F), S );
# subgroup is the whole additive group? if Size(I)=Size(F) then return GroupReduct(F); fi;
G := GroupReduct(F);
generators := GeneratorsOfGroup( G );
visited := []; pos := 1; while pos <= Size(I) do
i := Enumerator(I)[pos];
pos := pos + 1;
newGens := []; if not i in visited then
AddSet( visited, i ); for a in generators do for f in G do
rightProd := mult( f*i, a ) / mult( f, a ); if not rightProd in I then
AddSet( newGens, rightProd ); fi;
od;
od; if newGens <> [] then
I := NormalClosure( G, ClosureGroup( I, SubgroupNC( G, newGens ) ) );
pos := 1; # the ideal is the whole nearring ? if Size(I)=Size(G) then return G; fi; fi; fi;
od;
############################################################################# ## #F NRI constructs an object that can be a one or two sided ideal of a ## nearring
InstallMethod(
NRI, "for EMNRs",
true,
[IsNearRing and IsExplicitMultiplicationNearRing], 0, function ( nr )
local fam, nri;
InstallMethod(
NRI, "for TfmNRs",
true,
[IsNearRing and IsTransformationNearRing], 0, function ( nr )
local nri;
nri := Objectify(
NewType(CollectionsFamily(EndoMappingFamily(Gamma(nr))),
IsNRIDefaultRep),
rec() );
nri!.elementsInfo := nr!.elementsInfo;
return nri; end );
############################################################################# ## #M NearRingIdealByGenerators two sided ideal
InstallMethod(
NearRingIdealByGenerators, "known ideals",
true,
[IsNearRing and HasNearRingIdeals, IsList], 0, function ( nr , gens )
local ideals;
ideals := Filtered( NearRingIdeals(nr), ideal ->
ForAll( gens, gen -> gen in ideal ) );
return Intersection( ideals ); end );
InstallMethod(
NearRingIdealByGenerators, "two-sided ideal by gens",
true, # bad style
[IsNearRing,IsList], 0, function ( nr , gens )
local groupgens, subgroup, ideal;
ideal := NRI( nr );
SetGeneratorsOfNearRingIdeal( ideal, gens );
SetParent( ideal, nr );
SetIsNearRingIdeal( ideal, true );
return ideal; end );
############################################################################# ## #M NearRingRightIdealByGenerators right ideal
InstallMethod(
NearRingRightIdealByGenerators, "known right ideals",
true,
[IsNearRing and HasNearRingRightIdeals, IsList], 0, function ( nr , gens )
local ideals;
ideals := Filtered( NearRingRightIdeals(nr), ideal ->
ForAll( gens, gen -> gen in ideal ) );
return Intersection( ideals ); end );
InstallMethod(
NearRingRightIdealByGenerators, "right ideal by gens",
true, # bad style
[IsNearRing,IsList], 0, function ( nr , gens )
local groupgens, subgroup, ideal;
ideal := NRI( nr );
SetGeneratorsOfNearRingRightIdeal( ideal, gens );
SetParent( ideal, nr );
SetIsNearRingRightIdeal( ideal, true );
return ideal; end );
############################################################################# ## #M NearRingLeftIdealByGenerators right ideal
InstallMethod(
NearRingLeftIdealByGenerators, "known left ideals",
true,
[IsNearRing and HasNearRingLeftIdeals, IsList], 0, function ( nr , gens )
local ideals;
ideals := Filtered( NearRingLeftIdeals(nr), ideal ->
ForAll( gens, gen -> gen in ideal ) );
return Intersection( ideals ); end );
InstallMethod(
NearRingLeftIdealByGenerators, "left ideal by gens",
true, # bad style
[IsNearRing,IsList], 0, function ( nr , gens )
local groupgens, subgroup, ideal;
ideal := NRI( nr );
SetGeneratorsOfNearRingLeftIdeal( ideal, gens );
SetParent( ideal, nr );
SetIsNearRingLeftIdeal( ideal, true );
return ideal; end );
########################################### ## ## testing subgroups of the additive group ##
IsSubgroupTransformationNearRingRightIdeal := function(
F,
R
) #********************************************************* # returns true iff the normal subgroup R of F is a right # ideal of F. #*********************************************************
local a, a_add, f, isIdeal, lengthAddGs, fam, actualGen, generators;
if not IsSubgroup(GroupReduct(F),R) then
Error("<R> has to be a subgroup of the additive group of <F>"); fi;
if not IsNormal(GroupReduct(F),R) then
return false; fi;
actualGen := 0; while isIdeal and (actualGen < lengthAddGs) do # at this place, the condition is ok # for all generators up to actualGen.
actualGen := actualGen + 1;
a_add := generators [actualGen];
a := NearRingElementByGroupRep(fam, a_add); if IsGroupHomomorphism (a) then if IsIdentityMapping (a) then # since R is a normal subgroup, # we do already know that (f + R - f) \subseteq R
isIdeal := true; else
isIdeal := ForAll (R,
r -> (GroupElementRepOfNearRingElement( NearRingElementByGroupRep(fam, r) * a ) in R)
); fi; elif IsConstantEndoMapping(a) then# a-a=0 is the always in R
isIdeal := true; else
isIdeal := ForAll (F, f -> ForAll (R, r ->
( GroupElementRepOfNearRingElement((f+NearRingElementByGroupRep(fam,r))*a)
/
(GroupElementRepOfNearRingElement(f*a)) ) in R
)); fi;
od;
return isIdeal; end;
IsSubgroupNearRingRightIdealDefault := function(
F,
R
) #********************************************************* # returns true iff the normal subgroup R of F is a right # ideal of F. #*********************************************************
local a, a_add, f, l, isIdeal, lengthAddGs, fam, actualGen, generators;
if not IsSubgroup(GroupReduct(F),R) then
Error("<R> has to be a subgroup of the additive group of <F>"); fi;
if not IsNormal(GroupReduct(F),R) then
return false; fi;
actualGen := 0; while isIdeal and (actualGen < lengthAddGs) do # at this place, the condition is ok # for all generators up to actualGen.
actualGen := actualGen + 1;
a_add := generators [actualGen];
a := NearRingElementByGroupRep(fam, a_add);
isIdeal := ForAll (F,
f -> ForAll (R,
r -> ( GroupElementRepOfNearRingElement((f+NearRingElementByGroupRep(fam,r))*a)
/
(GroupElementRepOfNearRingElement(f*a)) ) in R
));
od;
InstallMethod(
IsSubgroupNearRingRightIdeal, "ExpMulNR",
true,
[IsExplicitMultiplicationNearRing, IsGroup], 0, function ( N, S )
local addGroup, mul;
addGroup := GroupReduct(N);
if not IsNormal(addGroup,S) then
return false; fi;
mul := NRMultiplication(N);
return ForAll( GeneratorsOfGroup(addGroup), m ->
ForAll( addGroup, n ->
ForAll( S, s ->
( mul( n * s, m ) / mul( n, m ) ) in S ) ) );
IsSubgroupNearRingLeftIdealDefault := function (
F, # near-ring
L
) #************************************************** # true iff the subgroup L is a left ideal of F #*************************************************
local generatorsL, fam;
if not IsSubgroup(GroupReduct(F),L) then
Error("<L> has to be a subgroup of the additive group of <F>"); fi;
if not IsNormal(GroupReduct(F),L) then
return false; fi;
InstallMethod(
IsSubgroupNearRingLeftIdeal, "ExpMulNR",
true,
[IsExplicitMultiplicationNearRing, IsGroup], 0, function ( N, S )
local addGroup, mul;
addGroup := GroupReduct(N);
if not IsSubgroup(GroupReduct(N),S) then
Error("<S> has to be a subgroup of the additive group of <N>"); fi;
if not IsNormal(addGroup,S) then
return false; fi;
mul := NRMultiplication(N);
return ForAll( addGroup, n -> ForAll( S, s ->
mul( n, s ) in S ) ); end );
############################################################################# ## #M IsNearRingRightIdeal for NR left ideals
InstallMethod(
IsNearRingRightIdeal, "NR left ideals",
true,
[IsNRI and HasIsNearRingLeftIdeal], 0, function ( l )
local addGroup;
addGroup := GroupReduct(l);
return IsSubgroupNearRingRightIdeal( Parent(l), addGroup ); end );
############################################################################# ## #M IsNearRingLeftIdeal for NR right ideals
InstallMethod(
IsNearRingLeftIdeal, "NR right ideals",
true,
[IsNRI and HasIsNearRingRightIdeal], 0, function ( r )
local addGroup;
addGroup := GroupReduct(r);
return IsSubgroupNearRingLeftIdeal( Parent(r), addGroup ); end );
############################################################################# ## #M IsNearRingIdeal for NR left and right ideals
InstallMethod(
IsNearRingIdeal, "NR right ideals",
true,
[IsNRI and HasIsNearRingRightIdeal and
IsNearRingRightIdeal], 0, function ( r )
return IsNearRingLeftIdeal( r ); end );
InstallMethod(
IsNearRingIdeal, "NR left ideals",
true,
[IsNRI and HasIsNearRingLeftIdeal and
IsNearRingLeftIdeal], 0, function ( l )
return IsNearRingRightIdeal( l ); end );
############################################################################# ## #M GroupReduct For left near ring ideals
InstallMethod(
GroupReduct, "for left near ring ideals",
true,
[IsNRI and HasGeneratorsOfNearRingLeftIdeal], 2, function ( I )
local subgroup, parent;
parent := Parent(I);
subgroup := SubgroupNC( GroupReduct(parent),
List(GeneratorsOfNearRingLeftIdeal(I),GroupElementRepOfNearRingElement) );
subgroup := NearRingLeftIdealClosureOfSubgroup( parent, subgroup );
return subgroup;
end );
############################################################################# ## #M GroupReduct For right near ring ideals
InstallMethod(
GroupReduct, "for right near ring ideals",
true,
[IsNRI and HasGeneratorsOfNearRingRightIdeal], 1, function ( I )
local subgroup, parent;
parent := Parent(I);
subgroup := SubgroupNC( GroupReduct(parent),
List(GeneratorsOfNearRingRightIdeal(I),GroupElementRepOfNearRingElement) );
subgroup := NearRingRightIdealClosureOfSubgroup( parent, subgroup );
return subgroup;
end );
############################################################################# ## #M GroupReduct For near ring ideals
InstallMethod(
GroupReduct, "for near ring ideals",
true,
[IsNRI and HasGeneratorsOfNearRingIdeal], 0, function ( I )
local subgroup, parent;
parent := Parent(I);
subgroup := SubgroupNC( GroupReduct(parent),
List(GeneratorsOfNearRingIdeal(I),GroupElementRepOfNearRingElement) );
subgroup := NearRingIdealClosureOfSubgroup( parent, subgroup );
return subgroup;
end );
########### # subnearrings
############################################################################# ## #M SubNearRing by generators
InstallMethod(
SubNearRing, "TfmNRs",
true,
[IsTransformationNearRing, IsCollection], 0, function ( nr , gens )
local SubNR; if not ForAll(gens, g -> g in nr) then
Error("generators have to be from the near ring"); fi;
SubNR := TransformationNearRingByGenerators(Gamma(nr),gens);
SetParent( SubNR, nr );
return SubNR; end );
InstallMethod(
SubNearRing, "ExplicitMultiplicationNearRings",
true,
[IsExplicitMultiplicationNearRing, IsCollection], 0, function ( nr , gens )
local SubNR;
Error("not yet implemented"); end );
InstallMethod(
AsSubNearRing, "for ideals",
true,
[IsNearRing, IsNRI], 0, function ( nr, i )
local subNR, parent, addGroup, fam;
addGroup := GroupReduct(i);
fam := i!.elementsInfo;
subNR := SubNearRing( nr,
List(GeneratorsOfGroup(addGroup), g -> NearRingElementByGroupRep(fam, g) ) );
SetGroupReduct( subNR, addGroup );
return subNR; end );
############################################################################# ## #F NearRingIdealBySubgroupNC( <nr>, <group> ) constructs an ideal of the ## nearring <nr> the additive ## group of which is <group> ## ## No Check!
NearRingIdealBySubgroupNC := function ( nr, group )
local fam, gens, ideal;
fam := nr!.elementsInfo;
gens := List( GeneratorsOfGroup(group), gen -> NearRingElementByGroupRep(fam, gen) );
ideal := NRI( nr );
SetGeneratorsOfNearRingIdeal( ideal, gens );
SetParent( ideal, nr );
SetIsNearRingIdeal( ideal, true );
SetGroupReduct( ideal, group );
return ideal; end;
############################################################################# ## #F NearRingLeftIdealBySubgroupNC( <nr>, <group> ) constructs a left ## ideal of the nearring <nr> ## the additive group of which is ## <group> ## No Check!
NearRingLeftIdealBySubgroupNC := function ( nr, group )
local fam, gens, ideal;
fam := nr!.elementsInfo;
gens := List( GeneratorsOfGroup(group), gen -> NearRingElementByGroupRep(fam, gen) );
ideal := NRI( nr );
SetGeneratorsOfNearRingLeftIdeal( ideal, gens );
SetParent( ideal, nr );
SetIsNearRingLeftIdeal( ideal, true );
SetGroupReduct( ideal, group );
return ideal; end;
############################################################################# ## #F NearRingRightIdealBySubgroupNC( <nr>, <group> ) constructs a right ## ideal of the nearring <nr> ## the additive group of which is ## <group> ## No Check!
NearRingRightIdealBySubgroupNC := function ( nr, group )
local fam, gens, ideal;
fam := nr!.elementsInfo;
gens := List( GeneratorsOfGroup(group), gen -> NearRingElementByGroupRep(fam, gen) );
ideal := NRI( nr );
SetGeneratorsOfNearRingRightIdeal( ideal, gens );
SetParent( ideal, nr );
SetIsNearRingRightIdeal( ideal, true );
SetGroupReduct( ideal, group );
return ideal; end;
############################################################################# ## #M NearRingLeftIdeals( <nr> ) computes a list of all left ideals of <nr> ##
InstallMethod(
NearRingLeftIdeals, "filter normal subgroups",
true,
[IsNearRing], 5, function ( nr )
return List(
Filtered( NormalSubgroups( GroupReduct(nr) ),
s -> IsSubgroupNearRingLeftIdeal( nr,s ) ),
sg -> NearRingLeftIdealBySubgroupNC( nr, sg )
); end );
############################################################################# ## #M NearRingRightIdeals( <nr> ) computes a list of all right ideals of <nr> ##
InstallMethod(
NearRingRightIdeals, "filter normal subgroups",
true,
[IsNearRing], 5, function ( nr )
return List(
Filtered( NormalSubgroups( GroupReduct(nr) ),
s -> IsSubgroupNearRingRightIdeal( nr,s ) ),
sg -> NearRingRightIdealBySubgroupNC( nr, sg )
); end );
############################################################################# ## #M NearRingIdeals( <nr> ) computes a list of all ideals of <nr> ##
InstallImmediateMethod(
NearRingIdeals,
IsSimpleNearRing, 0, function ( nr )
local addGroup, ideals;
addGroup := GroupReduct( nr );
ideals := [ TrivialSubgroup( addGroup ), addGroup ];
return List( ideals, id -> NearRingIdealBySubgroupNC( nr, id ) ); end );
InstallMethod(
NearRingIdeals, "known left ideals",
true,
[IsNearRing and HasNearRingLeftIdeals], 100, function ( nr )
return Filtered( NearRingLeftIdeals(nr),
l -> IsNearRingIdeal(l) ); end );
InstallMethod(
NearRingIdeals, "known right ideals",
true,
[IsNearRing and HasNearRingRightIdeals], 100, function ( nr )
return Filtered( NearRingRightIdeals(nr),
l -> IsNearRingIdeal(l) ); end );
InstallMethod(
NearRingIdeals, "filter normal subgroups",
true,
[IsNearRing], 5, function ( nr )
return List(
Filtered( NormalSubgroups( GroupReduct(nr) ),
s -> IsSubgroupNearRingLeftIdeal( nr,s ) and
IsSubgroupNearRingRightIdeal( nr,s ) ),
sg -> NearRingIdealBySubgroupNC( nr, sg )
); end );
##### faster ######
################################################################# ## #F NearRingLeftIdeals ( <R> ) ... compute a list of all left ideals ##
InstallMethod(
NearRingLeftIdeals, "from the subgroup lattice",
true,
[IsNearRing], 2, # slightly better than the original one function ( NR )
local addGroup, lattice, upInclusions, downInclusions, CantorList,
cl, sum, NumberOfSubgroups, idealLattice,
vertex, idealInclusions, candidate,
maxsubgrlist, vertexset, LCCS, ideals;
idealLattice[CantorList[vertex[1]]+vertex[2]] :=
IsSubgroupNearRingLeftIdeal( NR, candidate ); if idealLattice[CantorList[vertex[1]]+vertex[2]] then
Add( ideals, candidate ); fi;
fi; fi;
od;
od;
# transform subgroups into ideals
ideals := List( ideals, I -> NearRingLeftIdealBySubgroupNC( NR, I ) );
return ideals; end );
################################################################# ## #F NearRingRightIdeals ( <R> ) ... compute a list of all right ideals ##
InstallMethod(
NearRingRightIdeals, "from the subgroup lattice",
true,
[IsNearRing], 2, # slightly better than the original one function ( NR )
local addGroup, lattice, upInclusions, downInclusions, CantorList,
cl, sum, NumberOfSubgroups, idealLattice,
vertex, idealInclusions, candidate,
maxsubgrlist, vertexset, LCCS, ideals;
idealLattice[CantorList[vertex[1]]+vertex[2]] :=
IsSubgroupNearRingRightIdeal( NR, candidate ); if idealLattice[CantorList[vertex[1]]+vertex[2]] then
Add( ideals, candidate ); fi;
fi; fi;
od;
od;
# transform subgroups into right ideals
ideals := List( ideals, I -> NearRingRightIdealBySubgroupNC( NR, I ) );
# lattice info in idealLattice
return ideals; end );
################################################################# ## #F NearRingIdeals ( <R> ) ... compute a list of all ideals ##
InstallMethod(
NearRingIdeals, "from the subgroup lattice",
true,
[IsNearRing], 2, # slightly better than the original one function ( NR )
local addGroup, lattice, upInclusions, downInclusions, CantorList,
cl, sum, NumberOfSubgroups, idealLattice,
vertex, idealInclusions, candidate,
maxsubgrlist, vertexset, LCCS, ideals;
InstallMethod(
Length,
true,
[ IsList and IsNearRingIdealEnumerator ], 1,
e -> Size( e!.additiveGroup ) );
InstallMethod(
\[\],
true,
[ IsList and IsNearRingIdealEnumerator, IsPosInt ], 1, function( e, pos )
local groupElement, group, mult, fam;
group := e!.additiveGroup;
fam := e!.elementsInfo;
groupElement := Enumerator(group)[pos];
return NearRingElementByGroupRep( fam, groupElement ); end );
InstallMethod(
Position,
true,
[ IsList and IsNearRingIdealEnumerator,
IsNearRingElement, IsZeroCyc ], 1, function( e, emnrelm, zero )
return Position(Enumerator(e!.additiveGroup),emnrelm![1],zero); end );
InstallMethod(
ViewObj,
true,
[ IsNearRingIdealEnumerator ], 1, function( G )
Print( "<enumerator of near-ring ideal>" ); end );
InstallMethod(
PrintObj,
true,
[ IsNearRingIdealEnumerator ], 1, function( G )
Print( "<enumerator of near-ring ideal>" ); end );
############################################################################# ## #M IsPrimeNearRingIdeal For NearRing ideals
InstallMethod(
IsPrimeNearRingIdeal, "brute force method",
true,
[IsNRI and IsNearRingIdeal ], 0, function ( ideal )
local ideal_list, size, N;
size := Size( ideal );
N := Parent( ideal );
ideal_list := Filtered( AsSSortedList( NearRingIdeals( N ) ),
id -> Size( id ) >= size and id <> ideal );
############################################################################# ## #M IsMaximalNearRingIdeal For nearring ideals
InstallMethod(
IsMaximalNearRingIdeal, "simple factor?",
true,
[IsNRI and IsNearRingIdeal ], 20, function ( ideal ) if Size(ideal)=0 or Size(ideal)=Size(Parent(ideal)) then
return false; else
TryNextMethod(); fi; end );
InstallMethod(
IsMaximalNearRingIdeal, "simple factor?",
true,
[IsNRI and IsNearRingIdeal ], 10, function ( ideal )
return IsSimpleNearRing ( FactorNearRing( Parent( ideal ), ideal ) ); end );
InstallMethod(
IsMaximalNearRingIdeal, "brute force method",
true,
[IsNRI and IsNearRingIdeal ], 0, function ( ideal )
local ideal_list, size, N;
size := Size( ideal );
N := Parent( ideal );
ideal_list := AsSSortedList( NearRingIdeals( N ) );
return
not ForAny( ideal_list, id -> Size( id ) > size and Size( id ) < Size( N ) and
ForAll( ideal, e -> e in id ) );
end );
############################################################################# ## #M NoetherianQuotient2( <NR>, <L>, <SubNR> ) ## # #InstallMethod( # NoetherianQuotient2, # "left ideals", # true, # [IsNearRing, IsNRI and IsNearRingLeftIdeal, IsNearRing], # 0, # function ( NR, L, SubNR ) # local nq; # nq := Filtered( NR, n -> ForAll( SubNR, s -> n*s in L ) ); # nq := Subgroup( GroupReduct(NR), List( nq, GroupElementRepOfNearRingElement ) ); # # return NearRingIdealBySubgroupNC( NR, nq ); # end );
InstallMethod(
IsSubset, "two NRIs second has right generators",
IsIdenticalObj,
[IsNRI and IsNearRingIdeal,
IsNRI and HasGeneratorsOfNearRingRightIdeal], 0, function ( I, S )
return ForAll( GeneratorsOfNearRingLeftIdeal( S ), gen -> gen in I ); end );
InstallMethod(
IsSubset, "two NRIs second has right generators",
IsIdenticalObj,
[IsNRI and IsNearRingRightIdeal,
IsNRI and HasGeneratorsOfNearRingRightIdeal], 0, function ( I, S )
return ForAll( GeneratorsOfNearRingRightIdeal( S ), gen -> gen in I ); end );
InstallMethod(
IsSubset, "two NRIs second has left generators",
IsIdenticalObj,
[IsNRI and IsNearRingIdeal,
IsNRI and HasGeneratorsOfNearRingLeftIdeal], 0, function ( I, S )
return ForAll( GeneratorsOfNearRingLeftIdeal( S ), gen -> gen in I ); end );
InstallMethod(
IsSubset, "two NRIs second has left generators",
IsIdenticalObj,
[IsNRI and IsNearRingLeftIdeal,
IsNRI and HasGeneratorsOfNearRingLeftIdeal], 0, function ( I, S )
return ForAll( GeneratorsOfNearRingLeftIdeal( S ), gen -> gen in I ); end );
InstallMethod(
IsSubset, "two NRIs second has ideal generators",
IsIdenticalObj,
[IsNRI and IsNearRingIdeal,
IsNRI and HasGeneratorsOfNearRingIdeal], 0, function ( I, S )
return ForAll( GeneratorsOfNearRingIdeal( S ), gen -> gen in I ); end );
InstallMethod(
GeneratorsOfNearRingIdeal, "default",
true,
[IsNRI and IsNearRingIdeal], 0, function( I )
return List( GeneratorsOfGroup( GroupReduct( I ) ),
g -> AsNearRingElement( Parent(I), g ) ); end );
InstallMethod(
GeneratorsOfNearRingLeftIdeal, "default",
true,
[IsNRI and IsNearRingLeftIdeal], 0, function( I )
return List( GeneratorsOfGroup( GroupReduct( I ) ),
g -> AsNearRingElement( Parent(I), g ) ); end );
InstallMethod(
GeneratorsOfNearRingRightIdeal, "default",
true,
[IsNRI and IsNearRingRightIdeal], 0, function( I )
return List( GeneratorsOfGroup( GroupReduct( I ) ),
g -> AsNearRingElement( Parent(I), g ) ); end );
############################################################################# ## #M AdditiveGenerators for NRI's
InstallMethod(
AdditiveGenerators, "NRI",
true,
[IsNRI], 0, function( I )
local fam;
fam := Parent( I )!.elementsInfo;
return List( GeneratorsOfGroup( GroupReduct( I ) ),
g -> NearRingElementByGroupRep( fam, g ) ); end );
Messung V0.5 in Prozent
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.94Angebot
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 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.