|
A general curve C (type Crv) is defined by the vanishing of a
finite number of polynomials f1, ..., fn or a polynomial ideal I
in a general ambient space. As a scheme, this must have dimension 1.
A plane curve C (type CrvPln) is defined by the vanishing of a single
polynomial f in one of the available ambient planes:
C: (f1 = f2 = ... = fn = 0) ⊂A.
The polynomials or ideal must lie in the coordinate ring of A.
The notation C for a curve and f or f1, ..., fn for its defining
equation(s) will be maintained.
The coefficient ring of the parent of polynomials will be denoted k.
Irrespective of type, the ambient space will be denoted A.
In this section the most basic methods of creating a curve are presented.
For specialised types --- conics, elliptic curves, hyperelliptic curves ---
there are additional functions documented in the corresponding chapters.
Curves may also be created implicitly, such as when they arise as the images
of maps.
Nonsingular: BoolElt Default: false
Reduced: BoolElt Default: false
Irreducible: BoolElt Default: false
GeometricallyIrreducible: BoolElt Default: false
Saturated: BoolElt Default: false
Create the plane curve f=0 in the ambient plane A where f is a
polynomial in the coordinate ring of A.
Nonsingular: BoolElt Default: false
Reduced: BoolElt Default: false
Irreducible: BoolElt Default: false
GeometricallyIrreducible: BoolElt Default: false
Saturated: BoolElt Default: false
Create the curve in the ambient space A determined by the ideal
I of the coordinate ring of A. An error results if the result
Nonsingular: BoolElt Default: false
Reduced: BoolElt Default: false
Irreducible: BoolElt Default: false
GeometricallyIrreducible: BoolElt Default: false
Saturated: BoolElt Default: false
Create the curve defined by the sequence S in the ambient space of X,
where S is a sequence of polynomials in the coordinate ring. Here X
can be any scheme, not necessarily an ambient space itelf. An error results if
the result is not actually a 1-dimensional scheme.
{Note:} An important special case is when A is an affine or a projective
space of dimension 1 and S is empty. This gives the affine or projective
line as a curve - as a scheme it is just the ambient space A. Alternatively,
the constructor Curve(A) described below may be used. Note that the
initial construction of A never returns it as a Crv type, even though
it is 1-dimensional. This is for internal technical reasons -- a Crv
cannot be considered as an ambient space by Magma.
is not a 1-dimensional scheme.
Returns true if and only if X is a one-dimensional scheme.
The smallest scheme in the inclusion chain above the scheme X which is a curve.
If X is a curve (ie 1-dimensional) then X will be returned
as a Crv type. If X
has been
created as a subscheme of a curve then this curve will be returned.
Line(P,S) : Prj, {Pt} -> Sch
The line through the distinct points p, q on the curve C,
or the points of S as a subscheme of the projective space P if they
are collinear. If the points are points of a curve rather than the ambient
space, the line will be interpreted as the tangent line in the case
that the points are equal.
Given a projective plane P and a set S of points in P, this function
returns the conic P through the points of the set S if such a conic
exists and is unique. The traditional setup corresponds to the case
where S is a set of 5 points in general position, that is, no three of
them are collinear.
If the resulting conic curve is nonsingular, then it will be returned
as a special type. See Chapter RATIONAL CURVES AND CONICS
for details of the special functions that apply in that case.
Create the union of the curves C and D.
The result will usually be non-irreducible, so although it will be interpreted
as a curve, most of the advanced functions below will not apply to it.
Let A be some ambient space in Magma. For example, think of A as
being the affine plane. Let k be its base ring and RA its coordinate ring.
If m: k -> L is a map of rings (a coercion map, for instance)
then there is a new ambient space denoted AL and called the
base change of A to L which has coordinate ring
RA but with coefficients L instead of k.
(Mathematically, one simply tensors RA with L over k.
In Magma the equivalent function at the level of polynomial
rings is ChangeRing.)
There is a base change function described below which takes A and L
(or the map k -> L) as arguments and creates this new space AL.
Note that there is a map from the coordinate ring of A to that of
AL determined by the map m.
This operation is called base extension since one often thinks
of the map m as being an extension of fields.
Of course, the map m could be many other things. One key example where
the name extension is a little unusual would be when m is
the map from the integers to some finite field.
Now let X be a scheme in Magma. Thus X is defined by some polynomials
f1, ..., fr on some ambient space A.
Given a ring map k -> L there is a
base change operation for X which returns the base change of X to L,
denoted XL. This is done by first making the base change of A to L
and then using the map from the coordinate ring of A to that of AL
to translate the polynomials fi into polynomials defined on AL.
These polynomials can then be used to define a scheme in AL.
It is this resulting scheme which is the base change of X to L.
If one has a number of curves
in the same ambient space and wants to base change them all at the same
time, a little care is required. The function which takes a curve and a
map of rings as argument will create a new ambient space each time so
should be avoided. A better approach is to apply base change to the
ambient space and then invoke the base change function which takes the
curve and the desired new ambient space as argument. (This latter base
change function appears to be different to the other. In fact it is not.
We described base change above as a function
of maps of rings. Of course, there is a natural extension to maps of schemes.
With that extension, this final base change intrinsic really is base change
with respect to map of ambient spaces.)
The base change of the curve C to the new base ring K.
This is only possible if elements of the current base ring of C
can be coerced automatically into K.
The resulting curve will lie in a newly created plane (see the example below).
The base change of the curve C by the map of base rings m.
The resulting curve will lie in a newly created plane.
BaseChange(C, A, m) : Sch,Sch,Map -> Sch
The base change of the curve C to a curve in the new ambient space A.
The space A must be of the same type as the ambient of C and its
base ring must either admit coercion from the base ring of C or have
the map m between the two explicitly given.
The base change of C, where the base ring of C is a finite field to
the finite field which is a degree n extension of the base field of C.
We give an example of a singular curve, over the rationals, whose
singular points are only defined over the field extension given by
adjoining a square root of -1.
> A<x,y> := AffineSpace(Rationals(),2);
> C := Curve(A,y^2 - (x^2+1)^3);
> SingularPoints(C);
> HasSingularPointsOverExtension(C);
true
Here we assume that the user knows which extension to move to.
The first method of finding the points is to search in the particular
point set as follows.
> Qi<i> := QuadraticField(-1);
> SingularPoints(C,Qi);
{ (i, 0), (-i, 0) }
The second method is to create a new curve by base change and to search
the base ring point set for that curve. For a single calculation this
method is rather clumsy, but if further computation were to take place
at these points it might be preferable.
> B<u,v> := BaseChange(A,Qi);
> Ci := BaseChange(C,B);
> SingularPoints(Ci);
{ (i, 0), (-i, 0) }
The first few functions below recover data from the ambient space of
the curve (and could equally well be applied to the ambient space).
Any curves lying in the same ambient space will return identical
results when evaluated in these functions.
The remaining functions recover data about the equation defining the curve.
The coordinate ring of a curve is described here, but its function field
is discussed much later in Section Function Fields.
The ambient space containing the curve C.
CoefficientRing(C) : Sch -> Rng
BaseField(C) : Sch -> Fld
The base ring of the curve C.
This is recovered as the base ring of the ambient plane.
The third function will report an error if the base ring is not a field.
The defining polynomial of the plane curve C.
The defining ideal of the curve C, as an ideal in the
coordinate ring of its ambient space.
The coordinate ring of the curve C.
Even creating this requires the use of Gröbner basis techniques.
The degree of the of the curve C which must be defined in an ordinary
projective ambient space.
The ideal of partial derivatives of the defining polynomials of the curve C.
The matrix of partial derivatives of the defining polynomials of the curve C.
The symmetric matrix of second partial derivatives of the defining polynomial
of the plane curve C.
In this example we start by creating a plane curve C and check that its ideal
really is principal. We have chosen an example which is in Weierstrass form.
> A<x,y,z> := ProjectiveSpace(Rationals(),2);
> C := Curve(A,z*y^2 - x^3 - x*z^2 - z^3);
> IsNonsingular(C);
true
> DefiningIdeal(C);
Ideal of Polynomial ring of rank 3 over Rational Field
Lexicographical Order
Variables: x, y, z
Basis:
[
-x^3 - x*z^2 + y^2*z - z^3
]
> IsPrincipal($1);
true x^3 + x*z^2 - y^2*z + z^3
Next we compute the determinant of the Hessian matrix of C.
That is a polynomial which we use to create another curve D.
The intersection of C and D are the points of inflection, or flexes,
of C.
Over an algebraic closure there will be nine of these, but we only
see one --- the family "flex at infinity" --- over the rationals.
> M := HessianMatrix(C);
> Determinant(M);
24*x^2*z + 24*x*y^2 + 72*x*z^2 - 8*z^3
> D := Curve(A,Determinant(M));
> IntersectionPoints(C,D);
{ (0 : 1 : 0) }
Returns true if and only if the ideal defining the curve
C is reduced.
Returns true if and only if the curve C is irreducible (as a
scheme).
Returns true if and only if the curve C contains at least one singularity over an algebraic
closure of its base field.
Returns true if and only if the curve C has no singularities over an algebraic closure of its
base field.
This section described several functions for the generation of random curves
of given degree and/or genus over finite fields and the rationals. The
implementations follow [ST02].
RandomBound: RngIntElt Default: 9
Generates a random plane curve in the projective plane P of degree
d and genus g with only nodes as singularities. The genus g
must satisfy g ≤(d - 1)(d - 2)/2 and then the number of nodes will
be (d - 1)(d - 2)/2 - g. These nodes are chosen as a random set of points
in P.
At the same time g must be ≥1 + (d(d - 6)/3) to guarantee a non-empty
linear system for a general set of nodes.
For 0 ≤g ≤10, a good choice to obtain a general curve of genus g
is to take d = g + 2 - [g/3] (see [ST02]).
The base field may be a finite field or Q. Over Q, the construction
uses polynomials which will have integer coefficients randomly chosen in
the range [ - r ... r], where r is the value of RandomBound.
Over a finite field, RandomBound is ignored.
Given a plane curve C, this function returns true if either
C is non-singular or C only has nodes as singularities.
Adjoint: BoolElt Default: true
Proof: BoolElt Default: true
RandomBound: RngIntElt Default: 9
Generates a random plane curve in the projective plane P of degree
d and with ordinary singularities specified by the sequence sings
as follows: If S = [s2, s3, s4, ... ] then the curve will have
s2 nodes, s3 triple points, s4 ordinary singularities of
multiplicity 4, etc. For example [2, 0, 1] specifies 2 nodes and
one ordinary quadruple point.
For such a curve to exist we require (d - 1 choose 2) ≥∑i si (i + 1 choose 2).
If Proof is false then the full check that the singularities are
ordinary is skipped.
If Adjoint is true then the adjoint ideal, an ideal of the coordinate
ring of P, is also computed and returned as a second value. The r-th graded
parts of this homogeneous ideal realises the linear system K + (r - d + 3)H on
the normalisation of the curve, where K is the canonical divisor and
H is the hyperplane section divisor corresponding to the (singular)
embedding into P. This can be used to compute various adjoint maps
(for example, r = d - 3 gives the canonical map) and its computation by
this function is more efficient than using the general method of
blowing-up in Adjoints (this function now also tests
for ordinariness and uses the adjoint ideal by default).
The base field can be finite or Q and RandomBound is as before.
RandomBound: RngIntElt Default: 9
Given a positive integer g and a field K this function generates
a random projective curve over K of genus g, for 0 ≤g ≤13.
When g ≤10, a plane nodal curve is returned as given by the function
RandomNodalCurve with degree g + 2 - [g/3]. For 11 ≤g ≤13,
a curve in P3 is returned, computed by syzygy computations as described
in [ST02].
The field K must be a finite field or Q. The parameter RandomBound
applies when K is chosen to be Q. Note that, although Q is allowed in all
cases, for the higher values of g, particularly for g ≥11, the heights of
the coefficients of the defining polynomials for the curve produced tend to be
very large, even for small values of RandomBound.
> SetSeed(1);
> C := RandomCurveByGenus(4, Rationals());
> C;
Curve over Rational Field defined by
x^5 + 34965/512*x*y*z^3 - 59355/512*x*z^4 + y^5 - 16705/48*y^3*z^2 -
1831885/1536*y^2*z^3 - 1553135/2304*y*z^4 + 655145/4608*z^5
> Genus(C);
4
> C := RandomCurveByGenus(8, GF(23));
> C;
Curve over GF(23) defined by
17*x^8 + 5*x^7*y + 5*x^7*z + 13*x^6*y^2 + 11*x^6*y*z + 8*x^6*z^2 + 16*x^5*y^3 +
17*x^5*y^2*z + 22*x^5*y*z^2 + 6*x^5*z^3 + 3*x^4*y^4 + 2*x^4*y^3*z +
18*x^4*y^2*z^2 + 3*x^4*y*z^3 + 14*x^4*z^4 + 19*x^3*y^5 + 19*x^3*y^4*z +
19*x^3*y^3*z^2 + 21*x^3*y^2*z^3 + 21*x^3*y*z^4 + 10*x^3*z^5 + 18*x^2*y^6 +
4*x^2*y^5*z + 9*x^2*y^4*z^2 + 2*x^2*y^3*z^3 + 21*x^2*y^2*z^4 + 22*x^2*y*z^5
+ 6*x^2*z^6 + 14*x*y^7 + 4*x*y^6*z + 17*x*y^5*z^2 + 20*x*y^4*z^3 +
14*x*y^2*z^5 + 15*x*y*z^6 + 3*x*z^7 + 18*y^8 + 2*y^7*z + 11*y^6*z^2 +
18*y^4*z^4 + 18*y^3*z^5 + 5*y^2*z^6 + 22*y*z^7 + 2*z^8
> Genus(C);
8
> C := RandomCurveByGenus(12, GF(23));
> Ambient(C);
Projective Space of dimension 3
Variables : x, y, z, t
> Degree(C); Genus(C);
12
12
The term ordinary plane curve refers to a curve in the projective plane
all of whose singularities are ordinary. This means that a singularity of
multiplicity m ≥2 has m "distinct tangent directions" -- the
equation of the curve expanded in local coordinates at the singularity
begins with a binary form of degree m which splits into m distinct
linear factors over the algebraic closure of the ground field.
A significant property of such curves is that all of their singularities
are resolved by a single blow-up. Their adjoint linear systems/adjoint
ideal can be computed in a more direct fashion than for more general
plane curves. These linear systems give important projective maps such
as the canonical map for curves of genus at least 2 and embeddings as
rational normal curves for curves of genus 0.
This section contains some functions relating to ordinary curves and, in
particular, to nodal curves, all of whose singularities are ordinary of
multiplicity 2 (nodes). The list of functions is likely to be extended in
future versions of Magma.
Adjoint: BoolElt Default: true
Given a plane curve C this function returns true in C has only
ordinary singularities. If that is the case it also returns the maximum
of the multiplicities of the singularities of C (1 means that C is
non-singular). Further, if C is ordinary and if Adjoint is
true, then the (saturated) adjoint ideal is also computed and returned
as the third value.
Given a plane curve C defined over Q perform a Monte Carlo
test for ordinariness. This will generally be faster than the
intrinsic OnlyOrdinarySingularities. The function does
not compute the adjoint ideal. Five primes are chosen for which
the mod p reduction of C is still a curve and which has
Jacobian ideal of the same degree as that of C. The five
reductions are tested for ordinary singularities. If all pass,
then true is returned. Otherwise false is returned.
If false is returned, then C is definitely not ordinary.
If it succeeds, then C is very likely to be ordinary but this is
not 100% guaranteed.
Returns the (saturated) adjoint ideal of an ordinary plane curve C. If C is
not ordinary then an error results.
AdjointLinearSystemForNodalCurve(C, d) : Crv, RngIntElt -> LinearSys
Given a plane curve C that is assumed to be nodal, these
are slightly faster intrinsics for computing the adjoint ideal and adjoint
linear system, respectively. The first function returns the adjoint
ideal I and the second returns the degree d adjoint linear system,
which is the linear subsystem of the complete plane linear system
of degree d given by the degree d graded part of I.
Given an ideal I and a positive integer d, this function returns the
degree d adjoint linear system for a plane curve whose (saturated)
adjoint ideal is I.
Given an ideal I and a positive integer d, this function returns the
canonical linear system for a plane curve of degree d whose (saturated)
adjoint ideal is I. This is the same as intrinsic
AdjointLinearSystemFromIdeal with I and d - 3 as arguments.
It will be empty if the curve has genus 0.
AdjointLinearSystem(C) : Crv -> LinearSys
Adjoints(C,d) : Crv, RngIntElt -> LinearSys
Given a plane curve C the first two functions return the canonical linear system
for any plane curve C and the third gives the general degree d adjoint linear system. If C is ordinary, then the functions compute the adjoint
ideal and takes its graded piece as above. If not, they have to work out in
detail the graph of the full resolution of singularities of C, which can
take some time.
In this example, we generate a random ordinary plane curve of
degree 7 with 3 nodes and one ordinary singularity of order 4.
We use its adjoint ideal to get the canonical map and compute
its canonical image in P 5. The computation of the canonical
map this way is generally faster and gives a much simpler map
description than the computation for general curves using the
function field machinery.
> P<x,y,z> := ProjectiveSpace(Rationals(),2);
> C, I := RandomPlaneCurve(7,[3,0,1],P : RandomBound := 2);
> C;
Curve over Rational Field defined by
x^7 + x^5*y*z + x^4*y^3 + x^3*y^2*z^2 - 708*x^3*z^4 - 3401/18*x^2*y^2*z^3 +
3274/9*x^2*y*z^4 + 29054/9*x^2*z^5 - 5861/15552*x*y^6 - 5279/432*x*y^5*z -
71851/1296*x*y^4*z^2 + 173479/486*x*y^3*z^3 + 87337/108*x*y^2*z^4 -
294685/81*x*y*z^5 - 662891/243*x*z^6 + 8117/15552*y^7 + 5543/972*y^6*z +
41419/1296*y^5*z^2 - 17087/243*y^4*z^3 - 646577/972*y^3*z^4 +
77026/81*y^2*z^5 + 423635/243*y*z^6 + 156920/243*z^7
> Genus(C);
6
> //check with OnlyOrdinarySingularities function
> boo,d,I1 := HasOnlyOrdinarySingularities(C);
> boo; d;
true
4
> I eq I1;
true
> // polynomials for canonical map come from the degree d-3=4
> // graded piece of the adjoint ideal.
> can_pols := AdjointLinearSystemFromIdeal(I, 4);
> Sections(can_pols);
[
x^4 - 24*x^2*z^2 - 83/36*x*y^2*z + 83/9*x*y*z^2 + 493/9*x*z^3 - 167/432*y^4
+ 145/108*y^3*z + 35/6*y^2*z^2 - 731/27*y*z^3 - 587/27*z^4,
x^3*y - 12*x^2*z^2 - 73/18*x*y^2*z + 38/9*x*y*z^2 + 286/9*x*z^3 - 55/216*y^4
+ 65/54*y^3*z + 7*y^2*z^2 - 494/27*y*z^3 - 350/27*z^4,
x^3*z - 6*x^2*z^2 - 5/18*x*y^2*z + 10/9*x*y*z^2 + 98/9*x*z^3 - 7/108*y^4 +
5/27*y^3*z + y^2*z^2 - 112/27*y*z^3 - 112/27*z^4,
x^2*y^2 - 4*x^2*z^2 - 11/3*x*y^2*z - 4/3*x*y*z^2 + 52/3*x*z^3 - 5/36*y^4 -
5/9*y^3*z + 10*y^2*z^2 - 116/9*y*z^3 - 68/9*z^4,
x^2*y*z - 2*x^2*z^2 - 2/3*x*y^2*z - 4/3*x*y*z^2 + 16/3*x*z^3 - 1/18*y^4 +
5/18*y^3*z + y^2*z^2 - 14/9*y*z^3 - 20/9*z^4,
x*y^3 - 12*x*y*z^2 + 16*x*z^3 - 1/2*y^4 - 2*y^3*z + 12*y^2*z^2 - 8*y*z^3 -
8*z^4
]
> X := CanonicalImage(C, Sections(can_pols));
> X;
Curve over Rational Field defined by
x[1]*x[4] - x[2]^2 + 5/36*x[2]*x[6] + 4*x[3]^2 + 11/3*x[3]*x[4] - 68/3*x[3]*x[5]
- 68/9*x[3]*x[6] - 95/216*x[4]*x[6] + 140/3*x[5]^2 + 2*x[5]*x[6] +
131/324*x[6]^2,
x[1]*x[5] - x[2]*x[3] + 1/18*x[2]*x[6] + 2*x[3]^2 + 2/3*x[3]*x[4] -
14/3*x[3]*x[5] - 5/9*x[3]*x[6] - 1/27*x[4]*x[6] + 7/6*x[5]^2 +
1/24*x[5]*x[6] + 2/81*x[6]^2,
-x[1]*x[6] + x[2]*x[4] - 1/2*x[2]*x[6] - 8*x[3]*x[5] + 5/3*x[3]*x[6] -
1/9*x[4]*x[6] + 14*x[5]^2 + 4*x[5]*x[6] + 43/216*x[6]^2,
x[2]*x[5] - x[3]*x[4] + 2*x[3]*x[5] + 2/3*x[3]*x[6] + 1/18*x[4]*x[6] - 7*x[5]^2
- 1/4*x[5]*x[6] - 1/27*x[6]^2,
-x[2]*x[6] + x[4]^2 - 1/2*x[4]*x[6] - 4*x[5]^2 + 16/3*x[5]*x[6] + 1/36*x[6]^2,
-x[3]*x[6] + x[4]*x[5] + 2*x[5]^2 + 1/6*x[5]*x[6] + 1/18*x[6]^2,
x[1]^3 - 10*x[1]^2*x[3] + x[1]*x[2]*x[3] + 52*x[1]*x[3]^2 + 95/216*x[2]^3 +
15/2*x[2]^2*x[3] + 337/432*x[2]^2*x[4] - 491/18*x[2]*x[3]^2 -
425/36*x[2]*x[3]*x[4] - 71/1296*x[2]*x[4]^2 + 676/27*x[3]^3 +
3907/108*x[3]^2*x[4] - 506/27*x[3]^2*x[5] + 341/36*x[3]*x[4]^2 -
529/36*x[3]*x[4]*x[5] + 2525/162*x[3]*x[5]^2 - 103/15552*x[4]^3 -
18385/1944*x[4]^2*x[5] + 4751/11664*x[4]^2*x[6] - 44317/1296*x[4]*x[5]^2 +
317441/46656*x[4]*x[5]*x[6] - 3677/139968*x[4]*x[6]^2 - 11905/162*x[5]^3 -
52453/11664*x[5]^2*x[6] - 1113761/279936*x[5]*x[6]^2 +
813889/1679616*x[6]^3,
x[1]^2*x[2] - 2*x[1]^2*x[3] - 8*x[1]*x[2]*x[3] + 16*x[1]*x[3]^2 - 31/36*x[2]^3 +
29/3*x[2]^2*x[3] + 113/72*x[2]^2*x[4] + 29/3*x[2]*x[3]^2 -
5/9*x[2]*x[3]*x[4] + 5/54*x[2]*x[4]^2 - 460/9*x[3]^3 - 577/18*x[3]^2*x[4] +
1688/9*x[3]^2*x[5] - 1391/108*x[3]*x[4]^2 + 2257/18*x[3]*x[4]*x[5] -
1717/9*x[3]*x[5]^2 - 437/648*x[4]^3 + 15593/648*x[4]^2*x[5] +
13321/15552*x[4]^2*x[6] - 10073/108*x[4]*x[5]^2 - 93221/7776*x[4]*x[5]*x[6]
+ 93403/93312*x[4]*x[6]^2 + 1582/9*x[5]^3 - 11059/1296*x[5]^2*x[6] -
193157/46656*x[5]*x[6]^2 + 363041/559872*x[6]^3,
x[1]*x[2]^2 - 4*x[1]*x[2]*x[3] + 4*x[1]*x[3]^2 - 7/6*x[2]^3 + x[2]^2*x[3] +
1/2*x[2]^2*x[4] + 10*x[2]*x[3]^2 + 26/3*x[2]*x[3]*x[4] + 10/9*x[2]*x[4]^2 -
44/3*x[3]^3 - 36*x[3]^2*x[4] + 200/3*x[3]^2*x[5] - 301/18*x[3]*x[4]^2 +
331/3*x[3]*x[4]*x[5] - 538/3*x[3]*x[5]^2 - 83/54*x[4]^3 +
1109/54*x[4]^2*x[5] + 13/8*x[4]^2*x[6] - 1117/12*x[4]*x[5]^2 -
4051/648*x[4]*x[5]*x[6] - 25/1296*x[4]*x[6]^2 + 2236/9*x[5]^3 +
14917/648*x[5]^2*x[6] - 1351/162*x[5]*x[6]^2 + 45109/46656*x[6]^3
[Next][Prev] [Right] [Left] [Up] [Index] [Root]
|