Goto Chapter: Top 1 2 3 4 5 Bib Ind

### 5 Tools

#### 5.1 Attributes

##### 5.1-1 BasisOverCoefficientsRing
 ‣ BasisOverCoefficientsRing( R ) ( attribute )

Returns: a homalg matrix

Computes a basis of the ring R, provided it is free of finite rank over its coefficients ring.

gap> LoadPackage( "PrimaryDecomposition" );
true
gap> Q := HomalgFieldOfRationalsInSingular( );
Q
gap> A := Q * "x,y,z";
Q[x,y,z]
gap> I := LeftSubmodule( "y*z-x, x*z-y, y^2-z^2, x*y-z, x^2-z^2, z^3-z", A );
<A torsion-free ideal given by 6 generators>
gap> R := A / I;
Q[x,y,z]/( y*z-x, x*z-y, y^2-z^2, x*y-z, x^2-z^2, z^3-z )
gap> bas := BasisOverCoefficientsRing( R );
<A 5 x 1 matrix over a residue class ring>
gap> Display( bas );
1,
z,
y,
x,
z^2

modulo [ y*z-x, x*z-y, y^2-z^2, x*y-z, x^2-z^2, z^3-z ]


##### 5.1-2 RepresentationOverCoefficientsRing
 ‣ RepresentationOverCoefficientsRing( r ) ( attribute )

Returns: a homalg matrix

Computes a representation matrix of the ring element r, with respect to the basis computed by BasisOverCoefficientsRing, provided the ring is free of finite rank over its coefficients ring.

gap> LoadPackage( "PrimaryDecomposition" );
true
gap> Q := HomalgFieldOfRationalsInSingular( );
Q
gap> A := Q * "x,y,z";
Q[x,y,z]
gap> I := LeftSubmodule( "y*z-x, x*z-y, y^2-z^2, x*y-z, x^2-z^2, z^3-z", A );
<A torsion-free ideal given by 6 generators>
gap> R := A / I;
Q[x,y,z]/( y*z-x, x*z-y, y^2-z^2, x*y-z, x^2-z^2, z^3-z )
gap> r := HomalgRingElement( "x^2 +xy +z", R );
|[ x^2+x*y+z ]|
gap> rep := RepresentationOverCoefficientsRing( r );
<A 5 x 5 matrix over an external ring>
gap> Display( rep );
0,2,0,0,1,
0,1,0,0,2,
0,0,1,2,0,
0,0,2,1,0,
0,2,0,0,1


##### 5.1-3 FGLMdata
 ‣ FGLMdata( R ) ( attribute )

Returns: a list

Computes the FGLM data of the ring R (see [Jam13]), provided it is free of finite rank over its coefficients ring. The FGLM data of such a ring consists of the representation matrices of all indeterminates of R computed by RepresentationOverCoefficientsRing.

gap> LoadPackage( "PrimaryDecomposition" );
true
gap> Q := HomalgFieldOfRationalsInSingular( );
Q
gap> A := Q * "x,y,z";
Q[x,y,z]
gap> I := LeftSubmodule( "y*z-x, x*z-y, y^2-z^2, x*y-z, x^2-z^2, z^3-z", A );
<A torsion-free ideal given by 6 generators>
gap> R := A / I;
Q[x,y,z]/( y*z-x, x*z-y, y^2-z^2, x*y-z, x^2-z^2, z^3-z )
gap> F:= FGLMdata(R);
[ <A 5 x 5 matrix over an external ring>,
<A 5 x 5 matrix over an external ring>,
<A 5 x 5 matrix over an external ring> ]
gap> Display(F[1]);
0,0,0,1,0,
0,0,1,0,0,
0,1,0,0,0,
0,0,0,0,1,
0,0,0,1,0
gap> Display(F[2]);
0,0,1,0,0,
0,0,0,1,0,
0,0,0,0,1,
0,1,0,0,0,
0,0,1,0,0
gap> Display(F[3]);
0,1,0,0,0,
0,0,0,0,1,
0,0,0,1,0,
0,0,1,0,0,
0,1,0,0,0


##### 5.1-4 MinimalPolynomial
 ‣ MinimalPolynomial( r ) ( attribute )
 ‣ MinimalPolynomial( r, str ) ( operation )
 ‣ MinimalPolynomial( r, t ) ( operation )

Returns: a matrix

Computes the minimal polynomial of the element r of a ring $$R$$ of finite rank over its coefficients ring. The installed method computes the representation matrix $$M$$ of the ring element r and finds the first linear dependency among the vectors $$e, eM, eM^2, ...$$, where $$e$$ is the identity of the ring.

gap> LoadPackage( "PrimaryDecomposition" );
true
gap> Q := HomalgFieldOfRationalsInSingular( );
Q
gap> A := Q * "x,y,z";
Q[x,y,z]
gap> I := LeftSubmodule( "y*z-x, x*z-y, y^2-z^2, x*y-z, x^2-z^2, z^3-z", A );
<A torsion-free ideal given by 6 generators>
gap> R := A / I;
Q[x,y,z]/( y*z-x, x*z-y, y^2-z^2, x*y-z, x^2-z^2, z^3-z )
gap> r := "x^2+x*y+z" / R;
|[ x^2+x*y+z ]|
gap> s := "x*y+z"/ R;
|[ x*y+z ]|
gap> mu_r := MinimalPolynomial( r );
t^3-2*t^2-3*t
gap> mu_s := MinimalPolynomial( s );
t^3-4*t
gap> mu_r + mu_s;
2*t^3-2*t^2-7*t
gap> kt := HomalgRing( mu_r );
Q[t]
gap> t := Indeterminates( kt )[1];
t
gap> mu := MinimalPolynomial( r, t );
t^3-2*t^2-3*t
gap> mu = mu_r;
true
gap> mu := MinimalPolynomial( r, "t" );
t^3-2*t^2-3*t
gap> mu = mu_r;
true
gap> mu := MinimalPolynomial( r, "a" );
a^3-2*a^2-3*a


##### 5.1-5 SquareFreeFactors
 ‣ SquareFreeFactors( p ) ( attribute )

Returns: a list

Computes the irreducible factors of the square free part of the univariate polynomial p.

gap> LoadPackage( "PrimaryDecomposition" );
true
gap> A := HomalgFieldOfRationalsInSingular() * "t";
Q[t]
gap> p := "t^3-2*t^2-3*t" / A;
t^3-2*t^2-3*t
gap> s := SquareFreeFactors( p );
[ t, t+1, t-3 ]
gap> Product( s );
t^3-2*t^2-3*t


##### 5.1-6 SeparablePart
 ‣ SeparablePart( p ) ( attribute )

Returns: a ring element

Computes the separable part of a univariate polynomial p. For polynomials over nonperfect rings the method uses an algorithm of Kemper (see [Kem91]).

gap> LoadPackage( "PrimaryDecomposition" );
true
gap> A := HomalgFieldOfRationalsInSingular() * "t";
Q[t]
gap> r := "t^4-t^3-5*t^2-3*t" / A;
t^4-t^3-5*t^2-3*t
gap> SquareFreeFactors( r );
[ t, t+1, t-3 ]
gap> SeparablePart( r );
t^3-2*t^2-3*t
gap> A := HomalgRingOfIntegersInSingular( 3, "t,s")* "x";
GF(3)(t,s)[x]
gap> r := "( x^3 - s ) * ( x^3 + t )" / A;
x^6+(t-s)*x^3+(-t*s)
gap> SeparablePart( r );
x^2+(t-s)*x+(-t*s)


##### 5.1-7 BasisCoefficientsOfRingElement
 ‣ BasisCoefficientsOfRingElement( r ) ( attribute )

Returns: a matrix

Computes the coefficients of the basis representation of r, provided the ring is free of finite rank over its coefficients ring.

gap> LoadPackage( "PrimaryDecomposition" );
true
gap> A := HomalgFieldOfRationalsInSingular( ) * "x,y,z";
Q[x,y,z]
gap> I := LeftSubmodule( "y*z-x, x*z-y, y^2-z^2, x*y-z, x^2-z^2, z^3-z", A );
<A torsion-free ideal given by 6 generators>
gap> R := A / I;
Q[x,y,z]/( y*z-x, x*z-y, y^2-z^2, x*y-z, x^2-z^2, z^3-z )
gap> r := "x^4 * y^2 + z*x" / R;
|[ x^4*y^2+x*z ]|
gap> coeffs := BasisCoefficientsOfRingElement( r );
<A 1 x 5 matrix over an external ring>
gap> Display( coeffs );
0,0,1,0,1
gap> bas := BasisOverCoefficientsRing( R );
<A 5 x 1 matrix over a residue class ring>
gap> Display( bas );
1,
z,
y,
x,
z^2

modulo [ y*z-x, x*z-y, y^2-z^2, x*y-z, x^2-z^2, z^3-z ]
gap> s := R * coeffs * bas ;
<An unevaluated 1 x 1 matrix over a residue class ring>
gap> Display( s );
z^2+y

modulo [ y*z-x, x*z-y, y^2-z^2, x*y-z, x^2-z^2, z^3-z ]


##### 5.1-8 IdealBasisOverCoefficientRing
 ‣ IdealBasisOverCoefficientRing( G ) ( operation )

Returns: a matrix

Computes a $$K$$-basis of an ideal generated by the entries of the matrix G over $$R$$, where $$K$$ is the coefficient ring of $$R$$, using an algorithm of Sebastian Jambor (see [Jam13]).

gap> LoadPackage( "PrimaryDecomposition" );
true
gap> Q := HomalgFieldOfRationalsInSingular( );
Q
gap> A := Q * "x,y,z";
Q[x,y,z]
gap> I := LeftSubmodule( "y*z-x, x*z-y, y^2-z^2, x*y-z, x^2-z^2, z^3-z", A );
<A torsion-free ideal given by 6 generators>
gap> R := A / I;
Q[x,y,z]/( y*z-x, x*z-y, y^2-z^2, x*y-z, x^2-z^2, z^3-z )
gap> G := HomalgMatrix( "[ z + 1, y - 1 ]", 1, 1, R );
<A 1 x 1 matrix over a residue class ring>
gap> B := IdealBasisOverCoefficientRing( G );
<An unevaluated 3 x 1 matrix over a residue class ring>
gap> Display( B );
z+1,
x+y,
z^2+z

modulo [ y*z-x, x*z-y, y^2-z^2, x*y-z, x^2-z^2, z^3-z ]


##### 5.1-9 GapInternalIsomorphicField
 ‣ GapInternalIsomorphicField( K ) ( attribute )

Returns: a ring

Computes an isomorphic, GAP internal field, provided the field is perfect.

##### 5.1-10 IdealBasisToGroebner
 ‣ IdealBasisToGroebner( M ) ( attribute )

Returns: a list

Computes a Groebner basis of an ideal $$I \unlhd R$$ defined by a $$K$$-basis of an ideal $$J \unlhd R/\tilde{I}$$, where $$K$$ is the coefficients ring and $$\tilde{I}$$ a zero dimensional ideal. The basis elements are given in the rows of the matrix M in form of coefficient vectors with respect to the basis of the ring, which is computed by BasisOverCoefficientsRing and the matrix is defined over $$R/\tilde{I}$$. This method works only for perfect coefficients rings $$K$$, since the reduced echelon form only accepts GAP internal rings. The method is based on an algorithm of Sebastian Jambor (see [Jam13]).

##### 5.1-11 AppendToGroebnerBasisOfZeroDimensionalIdeal
 ‣ AppendToGroebnerBasisOfZeroDimensionalIdeal( G ) ( attribute )

Returns: a matrix

Computes a Groebner Basis of the ideal generated by the entries of the matrix G and the generators of the defining zero dimensional ideal of the residue class ring over which G is defined. If the coefficients ring $$K$$ is perfect, the method uses the IdealBasisOverCoefficientsRing and IdealBasisToGroebner. If not, the method uses the usual Groebner basis algorithms, since IdealBasisToGroebner only works for perfect coefficient rings.

gap> LoadPackage( "PrimaryDecomposition" );
true
gap> A := HomalgFieldOfRationalsInSingular( ) * "x,y,z";
Q[x,y,z]
gap> I := LeftSubmodule( "y*z-x, x*z-y, y^2-z^2, x*y-z, x^2-z^2, z^3-z", A );
<A torsion-free ideal given by 6 generators>
gap> R := A/I;
Q[x,y,z]/( y*z-x, x*z-y, y^2-z^2, x*y-z, x^2-z^2, z^3-z )
gap> J := HomalgMatrix( "[z]", 1, 1, R );
<A 1 x 1 matrix over a residue class ring>
gap> mat := AppendToGroebnerBasisOfZeroDimensionalIdeal( J );
<An unevaluated 3 x 1 matrix over an external ring>
gap> Display( mat );
z,
y,
x


##### 5.1-12 Derivative
 ‣ Derivative( f ) ( attribute )

Returns: a ring element

Computes the derivative of the univariate polynomial f.

gap> LoadPackage( "PrimaryDecomposition" );
true
gap> R := HomalgFieldOfRationalsInSingular() * "t";
Q[t]
gap> r := "t^4-t^3-5*t^2-3*t" / R;
t^4-t^3-5*t^2-3*t
gap> Derivative( r );
4*t^3-3*t^2-10*t-3
gap> S := HomalgRingOfIntegersInSingular( 3 ) * "t";
GF(3)[t]
gap> r := "t^5 + 3*t^4 - t^3 + 2*t" / S;
t^5-t^3-t
gap> Derivative( r );
-t^4-1


##### 5.1-13 PolysOverTheSameRing
 ‣ PolysOverTheSameRing( L ) ( attribute )

Returns: a list

Accepts a list L of polynomials which are defined over function fields, whose coefficients rings are a root of the same function field. The method computes a polynomial ring over a function field and the representations of the polynomials in L over this ring. For each polynomial ring $$R_j$$ containing L_j the number $$e_j = R_j$$!.RootOfBaseField defines the embedding map $$R \hookrightarrow R_j: a \mapsto a; t_i \mapsto t_i^{p^{e_j}}$$ where $$p$$ is the characteristic of the base field, $$a$$ a field element and $$t_i$$ are the rational parameters and $$R$$ the common base function field. The rings $$R_j$$ and $$R$$ have to be technically identical, such that even the variable names coincide. The common ring $$S$$ the method defines is in turn a copy of $$R$$ with $$e_S = S$$!.RootOfBaseField is the least common multiply of the $$e_j$$, excluding zero. The polynomials L_j will be represented over $$S$$ by taking the $$t_i$$ to the power of $$p^{e_S-e_j}$$.

gap> LoadPackage( "PrimaryDecomposition" );
true
gap> R1 := HomalgRingOfIntegersInSingular( 3, "t,s" ) * "x";
GF(3)(t,s)[x]
gap> R1!.RootOfBaseField := 3;
3
gap> R2 := HomalgRingOfIntegersInSingular( 3, "t,s" ) * "x";
GF(3)(t,s)[x]
gap> R2!.RootOfBaseField := 2;
2
gap> r1 := "(t*s)*x^3+(s^2)*x+(t)" / R1;
(t*s)*x^3+(s^2)*x+(t)
gap> r2 := "(t)*x^2+(s)" / R2;
(t)*x^2+(s)
gap> PolysOverTheSameRing( [ r1, r2 ] );
[ (t^27*s^27)*x^3+(s^54)*x+(t^27), (t^81)*x^2+(s^81) ]
gap> R3 := HomalgRingOfIntegersInSingular( 3, "t,s" ) * "x";
GF(3)(t,s)[x]
gap> R3!.RootOfBaseField := 0;
0
gap> r3 := "(t)*x^2+(-s)*x"/ R3;
(t)*x^2+(-s)*x
gap> PolysOverTheSameRing( [ r1, r2, r3 ] );
[ (t^27*s^27)*x^3+(s^54)*x+(t^27), (t^81)*x^2+(s^81), (t^729)*x^2+(-s^729)*x ]


#### 5.2 Operations

##### 5.2-1 IsNotContainedInAnyHyperplane
 ‣ IsNotContainedInAnyHyperplane( lambda, L ) ( operation )

Returns: a matrix

Determines whether lambda is contained in any $$n - 1$$ dimensional subspace spanned by the rows of L.

gap> LoadPackage( "PrimaryDecomposition" );
true
gap> Q := HomalgFieldOfRationalsInSingular( );
Q
gap> L := HomalgIdentityMatrix( 5, Q );
<An unevaluated 5 x 5 identity matrix over an external ring>
gap> Display( L );
1,0,0,0,0,
0,1,0,0,0,
0,0,1,0,0,
0,0,0,1,0,
0,0,0,0,1
gap> lambda := HomalgMatrix( "[ 2,0,2,1,1]", 1, 5, Q );
<A 1 x 5 matrix over an external ring>
gap> Display( lambda );
2,0,2,1,1
gap> IsNotContainedInAnyHyperplane( lambda, L );
false
gap> lambda2 := GeneratorOfAnElementNotContainedInAnyHyperplane( L );;
gap> IsNotContainedInAnyHyperplane( lambda2, L );
true


##### 5.2-2 GeneratorOfAnElementNotContainedInAnyHyperplane
 ‣ GeneratorOfAnElementNotContainedInAnyHyperplane( L ) ( operation )
 ‣ GeneratorOfAnElementNotContainedInAnyHyperplane( L, C ) ( operation )

Returns: a value

Generates an element of $$K^n$$, which is not contained in any $$n - 1$$ dimensional subspace of the vector field $$K^n$$, respectively $$C^n$$, spanned by the rows of L. The method repeats generating a random vector $$\lambda \in K^n$$ until the method IsNotContainedInAnyHyperplan of $$\lambda$$ and L returns true.

gap> LoadPackage( "PrimaryDecomposition" );
true
gap> Q := HomalgFieldOfRationalsInSingular( );
Q
gap> e := CertainRows( HomalgIdentityMatrix( 5, Q ), [ 1 .. 3 ] );
<An unevaluated diagonal right invertible sub-identity 3 x 5 matrix
over an external ring>
gap> lambda := GeneratorOfAnElementNotContainedInAnyHyperplane( e );
<A non-zero left regular 1 x 5 matrix over an external ring>
gap> l := UnionOfRows( e, lambda );
<An unevaluated non-zero 4 x 5 matrix over an external ring>
gap> lambda := GeneratorOfAnElementNotContainedInAnyHyperplane( l );
<A non-zero left regular 1 x 5 matrix over an external ring>
gap> A := HomalgRingOfIntegersInSingular( 3, "t" );
GF(3)(t)
gap> S := HomalgRingOfIntegersInSingular( 3, "t" );
GF(3)(t)
gap> S!.RootOfBaseField:= 1;
1
gap> L := HomalgMatrix( "[ 2, t, 0, t, 0, 1 ]", 2, 3, A );
<A 2 x 3 matrix over an external ring>
gap> GeneratorOfAnElementNotContainedInAnyHyperplane( L, S );
<A 1 x 3 matrix over an external ring>


##### 5.2-3 FGLMToGroebner
 ‣ FGLMToGroebner( M, e ) ( operation )
 ‣ FGLMToGroebner( M, e, l ) ( operation )

Returns: two lists

Computes a basis of the residue class ring and a Groebner Basis of the defining ideal, both defined by the FGLM data M and the identity element e. The method uses an algorithm of Sebastian Jambor (see [Jam13]).

gap> LoadPackage( "PrimaryDecomposition" );
true
gap> A := HomalgFieldOfRationalsInSingular( ) * "x1,x2,x3";
Q[x1,x2,x3]
gap> I := LeftSubmodule( "x2*x3-x1, x1*x3-x2, x2^2-x3^2, x1*x2-x3, \
>                      x1^2-x3^2, x3^3-x3", A );
<A torsion-free ideal given by 6 generators>
gap> R := A / I;
Q[x1,x2,x3]/( x2*x3-x1, x1*x3-x2, x2^2-x3^2, x1*x2-x3, x1^2-x3^2, x3^3-x3 )
gap> M := FGLMdata( R );
[ <A 5 x 5 matrix over an external ring>,
<A 5 x 5 matrix over an external ring>,
<A 5 x 5 matrix over an external ring> ]
gap> e := CertainRows(
>      HomalgIdentityMatrix( NrRows( M[1] ), HomalgRing( M[1] ) ), [1] );
<An unevaluated diagonal right invertible sub-identity 1 x 5 matrix
over an external ring>
gap> FGLMToGroebner( M, e );
[ [ 1, x3, x2, x1, x3^2 ],
[ -x2*x3+x1, -x2^2+x3^2, -x1*x3+x2, -x1*x2+x3, -x1^2+x3^2, -x3^3+x3 ] ]
gap> bas := BasisOverCoefficientsRing( R );
<A 5 x 1 matrix over a residue class ring>
gap> Display( bas );
1,
x3,
x2,
x1,
x3^2

modulo [ x2*x3-x1, x1*x3-x2, x2^2-x3^2, x1*x2-x3, x1^2-x3^2, x3^3-x3 ]


##### 5.2-4 MatrixEmbedding
 ‣ MatrixEmbedding( M, f ) ( operation )

Returns: a matrix

Computes the image of the matrix $$\textit{M}\in K(\alpha)^{r \times c})$$ where $$K(\alpha)$$ with minimal polynomial f, under the extension field $$K(\alpha)$$ with minimal polynomial f embedding $$K(\alpha)^{r \times c } \hookrightarrow K^{r deg(\textit{f}) \times c deg(\textit{f})}$$ which is a the natural extension of $$K(\alpha )\hookrightarrow K^{deg(\textit{f})\times deg(\textit{f})}: \alpha \mapsto \texttt{CompanionMatrix}(\alpha)$$. The method provides that the generator of the field extension $$\alpha$$ coincides withe the negativ of the constant coefficients of the minimal polynomial.

gap> LoadPackage( "PrimaryDecomposition" );
true
gap> R := HomalgRingOfIntegersInSingular( 3, "t,s" ) * "x";
GF(3)(t,s)[x]
gap> R!.RootOfBaseField:=1;
1
gap> f := "x^3 - t" / R;
x^3+(-t)
gap> p := "x^3 - s" / R;
x^3+(-s)
gap> A := CoefficientsRing( R );
GF(3)(t,s)
gap> M := HomalgMatrix( "[t*s - s, 1, 0, s]", 2, 2, A );
<A 2 x 2 matrix over an external ring>
gap> Display( M );
(t*s-s),1,
0,      (s)
gap> N := MatrixEmbedding( M, f );
<An unevaluated non-zero 6 x 6 matrix over an external ring>
gap> Display( N );
(-s),0,   (t*s),1,  0,  0,
(s), (-s),0,    0,  1,  0,
0,   (s), (-s), 0,  0,  1,
0,   0,   0,    (s),0,  0,
0,   0,   0,    0,  (s),0,
0,   0,   0,    0,  0,  (s)
gap> S := HomalgRingOfIntegersInSingular( 3, "t" ) * "x";
GF(3)(t)[x]
gap> S!.RootOfBaseRing := 3;
3
gap> I := LeftSubmodule( "x^2 - t^3", S );
<A principal torsion-free ideal given by a cyclic generator>
gap> L := S / I;
GF(3)(t)[x]/( x^2+(-t^3) )
gap> FGLM := FGLMdata( L );
[ <A 2 x 2 matrix over an external ring> ]
gap> Display( FGLM[1] );
0,    1,
(t^3),0
gap> f := "x^3 - t" / S;
x^3+(-t)
gap> M := MatrixEmbedding( FGLM[1] , f );
<An unevaluated non-zero 6 x 6 matrix over an external ring>
gap> Display( M );
0,  0,  0,  1,0,0,
0,  0,  0,  0,1,0,
0,  0,  0,  0,0,1,
(t),0,  0,  0,0,0,
0,  (t),0,  0,0,0,
0,  0,  (t),0,0,0
gap> T := HomalgRing( M );
GF(3)(t)
gap> e := CertainRows( HomalgIdentityMatrix( NrRows( M ), T ), [1] );
<An unevaluated diagonal right invertible sub-identity 1 x 6 matrix
over an external ring>
gap> FGLMToGroebner( [ M ], e );
[ [ 1, x ], [ -x^2+(t) ] ]


##### 5.2-5 CoefficientsTransformation
 ‣ CoefficientsTransformation( M, deg ) ( operation )

Returns: a matrix

Raises the rational parameters to the power $$p$$^deg in the entries of the matrix M, where p is the characteristic of the base field.

gap> LoadPackage( "PrimaryDecomposition" );
true
gap> C := HomalgRingOfIntegersInSingular( 3, "t,s" );
GF(3)(t,s)
gap> deg := 2;
2
gap> M := HomalgMatrix( "[ t, s*t, s^2, 1 ]", 4, 1, C );
<A 4 x 1 matrix over an external ring>
gap> Display( M );
(t),
(t*s),
(s^2),
1
gap> coeffs := CoefficientsTransformation( M, deg );
<A 4 x 1 matrix over an external ring>
gap> Display( coeffs );
(t^9),
(t^9*s^9),
(s^18),
1

Goto Chapter: Top 1 2 3 4 5 Bib Ind

generated by GAPDoc2HTML