############################################################################## ## #W nr.gi Near-ring Library J"urgen Ecker ## #Y Copyright (C) ## ## $Log: nr.gi,v $ ## Revision 1.10 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.9 2007-07-19 22:19:07 stein ## added a new method for One for TransformationNearRings ## ## Revision 1.8 2007/05/09 22:44:14 stein ## added functions Zero, Representative, IsNearRingUnit, NearRingUnits ## ## Revision 1.7 2003/04/04 10:25:30 juergen ## final revision 2.1: erhard and juergen ## ## Revision 1.6 2003/04/02 09:39:26 juergen ## eliminated InParent ## ## Revision 1.5 2002/01/17 18:25:52 juergen ## two versions of IsMultiplicationRespectingHomomorphism - both with errors ## code cleaned ## ## Revision 1.4 2002/01/03 14:12:33 juergen ## binder/mayr part 2 ## ## Revision 1.3 2001/07/16 10:05:36 stein ## documentation of IsWdNearRing and IsPlanarNearRing ## examples were updated ## ## 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 ##
############################################################################# ## #M IsAdditivelyCommutative For NRs
InstallMethod(
IsAdditivelyCommutative, "NRs",
true,
[IsNearRing], 0,
N -> IsAbelianNearRing( N )
);
### DIESE METHODE MUSS UNBEDINGT WIEDER ENTFERNT WERDEN! ### NOW NECESSARY SO THAT OUR METHODS FOR ZERO AND ONE ARE NOT USED FOR ### SOME GAP-RINGS OR FIELDS
InstallMethod(
IsLDistributive, "NRs",
true,
[IsNearRing], 0,
N -> false
);
############################################################################# ## #M \- For NR elements
InstallOtherMethod(
AdditiveInverseOp, "Nearring Elements",
true,
[IsNearRingElement], 0, function ( a )
local fam;
fam := FamilyObj(a);
return NearRingElementByGroupRep( fam, GroupElementRepOfNearRingElement(a)^(-1) ); end );
InstallOtherMethod(
\-, "2x IsNearAdditiveElementWithInverse",
IsIdenticalObj,
[IsNearAdditiveElementWithInverse,
IsNearAdditiveElementWithInverse], 0, function ( a , b )
return a + (-b); end );
############################################################################# ## #M Zero Return the Zero of the nearring ##
InstallMethod(
Zero, "generic method for nearrings",
true,
[IsNearRing], 0, function ( nr )
if IsAdditiveGroup( nr ) and IsLDistributive( nr ) then
TryNextMethod(); fi;
return NearRingElementByGroupRep( nr!.elementsInfo,
Identity(GroupReduct(nr)) ); end );
############################################################################# ## #M One Return the One of the nearring
# install as OtherMethod, the near ring need not have a 1
InstallOtherMethod(
One, "generic method for transformation nearrings given by generators",
true,
[IsTransformationNearRing], 0, function ( nr )
local nrgens, # near-ring generators of nr
G, # group where nr acts on
gens,
GN, # subgroup G*N of G
GNE,
one, found, xone,
xnrgens,
x, y;
#Print( "generic method for transformation nearrings given by generators \n" );
##JE eigentlich gehoert hier die Prioritaet fuer die entsprechenden Methoden ## bei Ringen und Koerpern erhoeht if IsAdditiveGroup( nr ) and IsLDistributive( nr ) then
TryNextMethod(); fi;
nrgens := GeneratorsOfNearRing( nr );
G := Gamma( nr ); if ForAny( nrgens, IsBijective ) then
return IdentityMapping( G ); fi;
gens := GeneratorsOfGroup( G );
## compute G*N
GN := Subgroup( G, Concatenation( List( nrgens, n ->
List( gens, x -> x^n ) ) ) );
GNE := Union( List( nrgens, n -> Image( n, GN ) ) ); while ForAny( GNE, x -> not x in GN ) do #Print( "closure again for GNE \n" );
GN := ClosureSubgroupNC( GN, GNE );
GNE := Union( List( nrgens, n -> Image( n, GN ) ) );
od;
xone := []; for x in AsSSortedList(G) do
xnrgens := List( nrgens, n -> x^n );
found := false; for y in Enumerator(GN) do if ForAll( [1..Length(nrgens)], k -> y^nrgens[k] = xnrgens[k] ) then if found then ## there is no one in nr #Print( "too many solutions for x,y = ", [x,y], "\n" );
return fail; else ## the value for one on x has been found #Print( " found y = ", y, "\n" );
found := true;
Add( xone, y ); fi; fi;
od;
if not found then ## there is no one in nr #Print( "no solution found for x =", x, "\n" );
return fail; fi;
od;
one := EndoMappingByTransformation( G, EndoMappingFamily( G ),
Transformation( List( xone, x -> Position( AsSSortedList(G), x ) ) ) );
## it still remains to check whether one is an element of nr
if not one in nr then #Print( "one is not contained \n" );
return fail; fi;
return one; end );
InstallOtherMethod(
One, "generic method for nearrings",
true,
[IsNearRing], 0, function ( nr ) #JE eigentlich gehoert hier die Prioritaet fuer die entsprechenden Methoden # bei Ringen und Koerpern erhoeht if IsAdditiveGroup( nr ) and IsLDistributive( nr ) then
TryNextMethod(); fi;
return First( Enumerator(nr), i ->
ForAll( GeneratorsOfNearRing(nr), g -> i*g = g ) and
ForAll( nr, e -> e*i = e )
); end );
############################################################################# ## #M Representative( <R> ) . . . . . . . . . . . . one element of a near-ring ##
InstallMethod( Representative, "for a near-ring with generators",
true,
[ IsNearRing and HasGeneratorsOfNearRing ], 0,
RepresentativeFromGenerators( GeneratorsOfNearRing ) );
############################################################################# ## #M IsUnit( <R>, <r> ) . . . . . . . . . . . . test if an element is a unit ## ## ACTUALLY THE GAP-FUNCTION IsUnit SHOULD BE DECLARED FOR NEAR-RINGS ## INSTEAD OF RINGS IN ring.gd AND IsNearRingUnit SHOULD BE RENAMED IsUnit ## SAME FOR NearRingUnits ##
InstallMethod( IsNearRingUnit, "for a near-ring with known units",
IsCollsElms,
[ IsNearRing and HasNearRingUnits, IsNearRingElement ], 0, function ( R, r )
return r in NearRingUnits( R ); end );
InstallMethod( IsNearRingUnit, "for a transformation near-ring with identity mapping",
IsCollsElms,
[ IsTransformationNearRingRep, IsNearRingElement ], 0, function ( R, r )
local one, G;
one:= One( R );
G := Gamma( R ); if one <> IdentityMapping( G ) or not IsFinite( G ) then
TryNextMethod(); else # units are bijective functions
return IsInjective( r ); fi; end );
InstallMethod( IsNearRingUnit, "default",
IsCollsElms,
[ IsNearRing, IsNearRingElement ], 0, function ( R, r )
local one;
one:= One( R ); if one = fail then
return false; else # simply try to find the inverse
return r <> Zero( R ) and First( Enumerator(R), i -> i*r = one ) <> fail; fi; end );
############################################################################# ## #M Units( <R> ) . . . . . . . . . . . . . . . . . . . units of a near-ring ##
InstallMethod( NearRingUnits, "for a transformation near-ring with identity mapping",
true,
[ IsTransformationNearRingRep ], 0, function ( R )
local one,
G,
units,
elm;
one := One( R );
G := Gamma( R ); if one <> IdentityMapping( G ) or not IsFinite( G ) then
TryNextMethod(); fi;
units:= GroupByGenerators( [], one ); for elm in Enumerator( R ) do if IsNearRingUnit( R, elm ) and not elm in units then
units:= ClosureGroupDefault( units, elm ); fi;
od;
return units; end );
InstallMethod( NearRingUnits, "for a (finite) near-ring",
true,
[ IsNearRing ], 0, function ( R )
local one,
units,
elm;
one := One( R );
if one = fail then
return []; else
return Filtered( R, n -> ForAny( R, m -> m * n = one ) ); fi;
end );
############################################################################# ## #M IsCommutative For nearrings
InstallMethod(
IsCommutative, "generic method for nearrings",
true,
[IsNearRing], 0, function ( nr )
local id;
return ForAll( nr, c -> ForAll( nr,e -> c * e = e * c ) ); end );
InstallMethod(
IsAbstractAffineNearRing, "generic",
true,
[IsNearRing], 0, function ( nr )
return IsAbelianNearRing( nr ) and
( ZeroSymmetricElements( nr ) = DistributiveElements( nr ) ); end );
InstallMethod(
IsDistributiveNearRing, "generic",
true,
[IsNearRing], 0, function ( nr )
return Length( DistributiveElements( nr ) ) = Size( nr ); end );
InstallMethod(
IsDistributiveNearRing, "test all elements",
true,
[IsNearRing], 1, # faster in the moment function ( nr )
return ForAll( nr, d -> ForAll( nr, a -> ForAll( nr, b ->
(a+b)*d = (a*d) + (b*d) ) ) ); end );
InstallMethod(
IsBooleanNearRing, "generic",
true,
[IsNearRing], 0, function ( nr )
return Length( IdempotentElements( nr ) ) = Size( nr ); end );
InstallMethod(
IsBooleanNearRing, "test all elements",
true,
[IsNearRing], 1, # faster in the moment function ( nr )
return ForAll( nr, i -> i^2 = i ); end );
InstallMethod(
IsDgNearRing, "generic",
true,
[IsNearRing], 0, function ( nr )
local distrelm;
distrelm := List( DistributiveElements( nr ), GroupElementRepOfNearRingElement );
return Size( Subgroup( GroupReduct( nr ), distrelm ) ) = Size( nr ); end );
InstallMethod(
IsNilNearRing, "generic",
true,
[IsNearRing], 0, function ( nr )
return Length( NilpotentElements( nr ) ) = Size( nr ); end );
InstallMethod(
IsNilNearRing, "test all elements",
true,
[IsNearRing], 1, # faster in the moment function ( nr )
local zero;
zero := 0 * Enumerator(nr)[1];
return ForAll( nr, n -> ForAny( [1..Size(nr)], k -> n^k = zero ) ); end );
InstallMethod(
IsNilpotentNearRing, "generic",
true,
[IsNearRing], 0, function ( nr )
local prod, elms, previous_prod, m, n, forever;
forever := false;
elms := AsList( nr );
previous_prod := ShallowCopy( elms );
repeat
prod := []; for m in previous_prod do for n in elms do
AddSet( prod, n*m );
od;
od; if prod = previous_prod then
return false; elif Size( prod ) = 1then
return true; else
previous_prod := ShallowCopy( prod ); fi;
InstallMethod(
IsQuasiregularNearRing, "generic",
true,
[IsNearRing], 0, function ( nr )
return Length( QuasiregularElements( nr ) ) = Size( nr ); end );
InstallMethod(
IsRegularNearRing, "generic",
true,
[IsNearRing], 0, function ( nr )
return Length( RegularElements( nr ) ) = Size( nr ); end );
InstallMethod(
IsRegularNearRing, "test all elements",
true,
[IsNearRing], 1, # faster in the moment function ( nr )
return ForAll( nr, x -> ForAny( nr, y -> ( x * y ) * x = x ) ); end );
InstallMethod(
IsNilpotentFreeNearRing, "generic",
true,
[IsNearRing], 0, function ( nr )
return Length( NilpotentElements( nr ) ) = 1; end );
InstallMethod(
IsNilpotentFreeNearRing, "test all elements",
true,
[IsNearRing], 1, # faster in the moment function ( nr )
local zero;
zero := 0 * Enumerator(nr)[1];
return ForAll( nr, n -> n = zero or
ForAll( [1..Size(nr)], k -> n^k <> zero ) ); end );
# find the possible automorphisms as columns in the multiplication table # of <N>
phi := Collected( List( elms, x -> x*elms ) );
# check that all columns (except the zero) occur the same number of times # and all possible automorphisms are fixedpointfree
k := Size( phi );
planar := ( k >= 3 ) and # the zero function:
Set( phi[1][1] ) = [elms[1]] and # all columns occur the same number of times
Size( Set( List( phi{[2..k]}, p -> p[2] ) ) ) = 1 and # automorphisms:
ForAll( phi{[2..k]}, p -> Size( Set( p[1] ) ) = size and # One mapping or fixedpointfree:
( p[1] = elms or
ForAll( [2..size], x -> p[1][x] <> elms[x] ) ) );
# return Size( phi ) >= 3 and # ForAll( phi, p -> p = 1 or p = Length( endos ) or # ( Size( Image(endos[p]) ) = size and # ForAll( addGroup, x -> x = () or Image( endos[p], x ) <> x ) ) );
InstallMethod(
Distributors, "generic",
true,
[IsNearRing], 0, function ( nr )
local dbs, a, b, c;
dbs := []; for a in nr do for b in nr do for c in nr do
AddSet( dbs, ((b+c)*a) - ((b*a)+(c*a)) );
od;
od;
od;
InstallMethod(
DistributiveElements, "generic",
true,
[IsNearRing], 0, function ( nr )
return Filtered( nr, d -> ForAll( nr, a -> ForAll( nr, b ->
(a+b)*d = (a*d) + (b*d) ) ) ); end );
############################################################################ ## #M ZeroSymmetricElements ## Note: this function works only for RIGHT nearrings, i.e. it computes ## all elements n s.t n0 = 0. (Note that in a RIGHT nearring ## 0n = 0 is always true).
InstallMethod(
ZeroSymmetricElements, "generic",
true,
[IsNearRing], 0, function ( nr )
local elms, zero;
zero := 0 * Enumerator(nr)[1];
return Filtered( nr, n -> zero * n = zero ); end );
InstallMethod(
NilpotentElements, "generic",
true,
[IsNearRing], 0, function ( nr )
local elm, size, zero, npelms, k, e, old_e;
size := Size( nr );
zero := 0 * Enumerator(nr)[1];
npelms := [ ];
for elm in nr do
k := 1; e := ShallowCopy( elm );
old_e := zero; while e <> zero and e <> old_e and k < size do
k := k + 1;
old_e := ShallowCopy( e );
e := elm * e;
od; if e = zero then Add( npelms, [ elm, k ] ); fi;
od;
InstallMethod(
RegularElements, "generic",
true,
[IsNearRing], 0, function ( nr )
return Filtered( nr, x -> ForAny( nr, y -> ( x * y ) * x = x ) ); end );
InstallMethod(
PrintTable2, "groups",
true,
[IsNearRing, IsString], 0, function ( N, mode )
local elms, # the elements of the nearring
n, # the size of the nearring
symbols, # a list of the symbols for the elements of the nearring
tw, # the width of a table
spc, # local function which prints the right number of spaces
bar, # local function for printing the right length of the bar
ind, # help variable, an index
print_addition, print_multiplication, # status variables
i,j, # loop variables
max; # length of the longest symbol string
n := Size( N );
symbols := Symbols( N );
max := Maximum( List( symbols, Length ) );
# compute the number of characters per line required for the table
tw := (max+1)*(n+1) + 2;
if SizeScreen()[1] - 3 < tw then
Print( "The table of a group of order ", n, " will not ", "look\ngood on a screen with ", SizeScreen()[1], " characters per ", "line.\nHowever, you may want to set your line length to a ", "greater\nvalue by using the GAP function 'SizeScreen'.\n" );
return; fi;
bar := function()
return String( Concatenation( List( [0..max+1], i -> "-" ) ) ); end;
elms := AsSSortedList( N );
if'e' in mode then # info about the elements
Print( "Let:\n" ); for i in [1..n] do Print( symbols[i], " := ", elms[i], "\n" ); od; fi;
if'a' in mode then # print the addition table
Print("\n"); for i in [1..max+1] do Print(" "); od;
Print( "+ | " ); for i in [1..n] do Print( symbols[i], spc(i) ); od;
Print( "\n ", bar() ); for i in [1..n] do Print( bar() ); od; for i in [1..n] do
Print( "\n ", symbols[i], spc(i), "| " ); for j in [1..n] do
ind := Position( elms, elms[i] + elms[j] );
Print( symbols[ ind ], spc(ind) );
od;
od;
Print("\n"); fi;
if'm' in mode then # print the multiplication table
Print("\n"); for i in [1..max+1] do Print(" "); od;
Print( "* | " ); for i in [1..n] do Print( symbols[i], spc(i) ); od;
Print( "\n ", bar() ); for i in [1..n] do Print( bar() ); od; for i in [1..n] do
Print( "\n ", symbols[i], spc(i), "| " ); for j in [1..n] do
ind := Position( elms, elms[i] * elms[j] );
Print( symbols[ ind ], spc(ind) );
od;
od;
Print("\n"); fi;
end );
############################################################################# ## #M IsMultiplicationRespectingHomomorphism( <hom>, <nr1>, <nr2> ) ## returns true if the group homomorphism <hom> from the additive ## group of <nr1> to the additive group of <nr2> respects ## nearring multiplication
InstallMethod(
IsMultiplicationRespectingHomomorphism, "generic",
true,
[IsGeneralMapping, IsNearRing, IsExplicitMultiplicationNearRing], 5, function ( hom, nr1, nr2 )
local group, elms, gens, mul, fam; if not( IsGroupHomomorphism( hom ) ) then
return false; fi;
group := GroupReduct( nr1 );
elms := Enumerator(group);
gens := GeneratorsOfGroup(group);
fam := nr1!.elementsInfo;
mul := NRMultiplication( nr2 );
return ForAll( elms, x -> ForAll( gens, y ->
Image( hom, GroupElementRepOfNearRingElement(
NearRingElementByGroupRep(fam,x) * NearRingElementByGroupRep(fam,y) ) )
= mul( Image( hom, x ), Image( hom, y ) )
) ); end );
InstallMethod(
IsMultiplicationRespectingHomomorphism, "generic",
true,
[IsGeneralMapping, IsNearRing, IsNearRing], 0, function ( hom, nr1, nr2 )
local group1, gens1, fam1, fam2; if not( IsGroupHomomorphism( hom ) ) then
return false; fi;
group1 := GroupReduct( nr1 );
gens1 := GeneratorsOfGroup(group1);
fam1 := nr1!.elementsInfo;
fam2 := nr2!.elementsInfo;
return ForAll( group1, x -> ForAll( gens1, y ->
NearRingElementByGroupRep( fam2, Image( hom, x ) ) *
NearRingElementByGroupRep( fam2, Image( hom, y ) )
=
NearRingElementByGroupRep( fam2,
Image( hom, GroupElementRepOfNearRingElement(
NearRingElementByGroupRep( fam1, x ) *
NearRingElementByGroupRep( fam1, y ) ) ) )
) );
end );
##################################################################### ## #M Endomorphisms for near rings ##
InstallMethod(
Endomorphisms, "near rings",
true,
[IsNearRing], 0, function( N )
local addGroup;
addGroup := GroupReduct(N);
return Filtered( Endomorphisms(addGroup),
e -> IsMultiplicationRespectingHomomorphism(e,N,N) ); end );
##################################################################### ## #M Automorphisms for near rings ##
InstallMethod(
Automorphisms, "near rings",
true,
[IsNearRing], 0, function( N )
local addGroup;
addGroup := GroupReduct(N);
return Filtered( Automorphisms(addGroup),
e -> IsMultiplicationRespectingHomomorphism(e,N,N) ); end );
InstallMethod(
IsZeroSymmetricNearRing, "default",
true,
[IsNearRing], 0, function(nr)
local gens, zero;
gens := GeneratorsOfNearRing(nr);
zero := 0 * gens[1];
return ForAll( gens, g -> zero * g = zero ); end );
InstallMethod(
InvariantSubNearRings, "default",
true,
[IsNearRing], 0, function( N )
local fam, sgps, g, m, invars, isinv, i;
fam := N!.elementsInfo;
sgps := Subgroups( GroupReduct(N) );
invars := []; for g in sgps do
isinv := true;
i := 0; while i < Size(g) and isinv do
i := i+1;
m := NearRingElementByGroupRep( fam, Enumerator(g)[i] ); if ForAny( N, n -> not ( GroupElementRepOfNearRingElement(m*n) in g )
or
not ( GroupElementRepOfNearRingElement(n*m) in g ) ) then
isinv := false; fi;
od; if isinv then Add( invars, g ); fi;
od;
return List( invars, inv -> SubNearRingBySubgroupNC( N, inv ) ); end );
InstallMethod(
SubNearRings, "default",
true,
[IsNearRing], 0, function( N )
local fam, sgps, g, m, subnrs, i, issub;
fam := N!.elementsInfo;
sgps := Subgroups( GroupReduct(N) );
subnrs := []; for g in sgps do
issub := true;
i := 0; while i < Size(g) and issub do
i := i+1;
m := NearRingElementByGroupRep( fam, Enumerator(g)[i] ); if ForAny( g, n -> not( GroupElementRepOfNearRingElement(NearRingElementByGroupRep(fam,n)*m) in g ) ) then
issub := false; fi;
od; if issub then Add( subnrs, g ); fi;
od;
return List( subnrs, sg -> SubNearRingBySubgroupNC( N, sg ) ); end );
############################################################################# ## #M IsNearRingWithOne ## ## AS OF NOW, 18.7.2007, NO NEAR-RING IN SONATA IS GENERATED AS IsNearRingWithOne ## WE SIMPLY IGNORE THIS CATEGORY ##
#InstallImmediateMethod( # IsNearRingWithOne, # HasOne, # One already computed # 0, # function ( nr ) # return ( One(nr) <> fail ); # end );
#InstallMethod( # IsNearRingWithOne, # "compute One", # true, # [IsNearRing], # 0, # function ( nr ) # local id; # id := One( nr ); # return ( id <> fail ); # end );
InstallMethod(
AsNearRingElement, "default",
true,
[IsNearRing, IsMultiplicativeElementWithInverse], 0, function ( nr, grpelm ) if not ( grpelm in GroupReduct(nr) ) then
Error("<grpelm> must lie in the additive group of <nr>"); fi;
return NearRingElementByGroupRep( nr!.elementsInfo, grpelm ); end );
InstallMethod(
IsSubset, "both have additive groups",
IsIdenticalObj,
[IsNearRingElementCollection and HasGroupReduct,
IsNearRingElementCollection and HasGroupReduct], 0, function ( N, S )
local addGroup;
addGroup := GroupReduct( N );
return ForAll( GeneratorsOfGroup( GroupReduct( S ) ),
gen -> gen in addGroup ); end );
InstallMethod(
IsSubset, "two nearrings, second has generators",
IsIdenticalObj,
[IsNearRing, IsNearRing and HasGeneratorsOfNearRing], 0, function ( N, S )
return ForAll( GeneratorsOfNearRing( S ), gen -> gen in N ); end );
############################################################################# ## #M Intersection2 ( <NR1>, <NR2> ) ## Returns the Intersection of <NR1> and <NR2>. ##
InstallMethod(
AdditiveGenerators, "from the additive group",
true,
[IsNearRing], 0, function( N )
return List( GeneratorsOfGroup( GroupReduct( N ) ),
g -> NearRingElementByGroupRep( N!.elementsInfo, g )); end );
############################################################################# ## #M \* integer * nearring element
#InstallMethod( # \*, # true, # [IsInt, IsNearRingElement], # 0, # function( n, e ) # local prod, i; # prod := e - e; # if n < 0 then # for i in [1..-n] do # prod := prod - e; # od; # else # for i in [1..n] do # prod := prod + e; # od; # fi; # # return prod; # end ); # ## Peter: The following methods for \* should eventually be included in GAP (see arith.gi) ## and removed from Sonata:
InstallOtherMethod( \*, "zero integer * additive element with zero",
[ IsInt and IsZeroCyc, IsNearAdditiveElementWithZero ], SUM_FLAGS,
PROD_INT_OBJ );
InstallOtherMethod( \*, "negative integer * additive element with inverse",
[ IsInt and IsNegRat, IsNearAdditiveElementWithInverse ],
PROD_INT_OBJ );
############################################################################# ## #F NRClosureOfSubgroup( <G>, <gens>, <fam> ) ## ## <G>: the subgroup ## <gens>: a set of generators of the nearring ## <fam>: the family of the elements of the ExpMulNearRing ## the group the mappings act on for a TfmNR
InstallGlobalFunction(
NRClosureOfSubgroup, function ( group, gens, fam )
local e, n, m;
Info( InfoNearRing, 2, "closure has ", Size( group ), " elements" ); for e in gens do for n in group do
m := GroupElementRepOfNearRingElement(
NearRingElementByGroupRep( fam, n ) *
NearRingElementByGroupRep( fam, e )
); if not m in group then
Info( InfoNearRing, 3, "new element: ", NearRingElementByGroupRep( fam, m ) );
return NRClosureOfSubgroup( ClosureGroup( group, m ), gens, fam ); fi;
od;
od;
return group; end );
Messung V0.5 in Prozent
¤ 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.0.5Bemerkung:
(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.