[Next][Prev] [Right] [Left] [Up] [Index] [Root]

Local Geometry

Here we discuss some basic functions providing analysis of a point p lying on a curve C. Firstly we describe how to create points on curves and their basic access functions. One should also refer to the comments in Section Points and Point Sets of the general schemes chapter about the point sets of point arguments of these functions where there is a fuller discussion of point sets.

Most functions usually have two arguments, a curve and a point on that curve. In fact, the point need not actually be in a point set of the curve since coercion will be attempted if not. Moreover, the curve argument is not strictly necessary either, since if the point does lie in a point set of the curve, that can be recovered automatically. So these functions also work with the curve argument omitted. However, omitting the curve argument should be thought of merely as a convenient shorthand and should be used with care --- it is very easy to use a point from some other space for which the function still makes sense but returns a misleading answer.

Subsections

Creation of Points on Curves

Points of a curve C, and indeed points of any scheme in Magma, lie in point sets associated to C rather than C itself. Each point set is the parent of points whose coordinates lie in a particular extension ring of the base ring of the curve. Thus, if k is the base ring of the curve C, points whose coordinates lie in k are elements of the "base ring point set" denoted C(k). If L is an extension ring of k (in the sense of admitting coercion from k or being the codomain of a ring homomorphism from k) then points with coordinates in L lie in the point set C(L).

Here we give the basic point creation methods and access functions. For more information, consult the discussion of points and point sets in Section Points and Point Sets of Chapter SCHEMES on schemes.

C ! [a,...] : Crv,[RngElt] -> Pt
For a sequence of elements a, ... of the base ring of C, this creates the point of C with coordinates (a, ... ). The parent of the resulting point is the base point set of the curve C rather than C itself.
C(L) ! [a,...] : SetPt,[RngElt] -> Pt
For a sequence of elements a, ... of the extension ring L of the base ring of C, this creates the point of C with coordinates (a, ... ). The parent of the resulting point is the point set C(L) of the curve C rather than C itself. The phrase `extension ring' here means that either L admits automatic coercion from the base ring of C, or that L is the codomain of a ring homomorphism from that base ring.
Curve(p) : Pt -> Crv
The smallest scheme in the inclusion chain above the scheme on which the point p lies which is a curve. If p lies on a curve then the curve will be returned.
Curve(P) : SetPt -> Crv
The smallest scheme in the inclusion chain above the scheme P is a point set of which is a curve. If P is a point set of a curve then this curve will be returned.
Coordinates(p) : Pt -> SeqEnum
The sequence of ring elements corresponding to the coordinates of the point p.
p[i] : Pt, RngIntElt -> RngElt
Coordinate(p,i) : Pt,RngIntElt -> SeqEnum
The ith coordinate of the point p.
p eq q : Pt,Pt -> BoolElt
Returns true if and only if the two points p and q lie in schemes contained in a common ambient space, have coordinates that can be compared (either by lying in the same ring, or by an automatic coercion) and these coordinates are equal.

Operations at a Point

Most of the functions in this section report an error if p does not lie on C. Functions having arguments C, p allow the omission of C as long as the parent of p is a point set of C.

p in C : Pt,Sch -> BoolElt
S in C : SeqEnum,Sch -> BoolElt
Returns true if and only if the point p or the sequence of coordinates S lies on the curve C. That is, return true if and only if the coordinates of p satisfy the equation of C.

IsNonsingular(p) : Sch,Pt -> BoolElt
IsNonsingular(C,p) : Sch,Pt -> BoolElt
Returns true if and only if p is a nonsingular point of the curve C.

IsSingular(p) : Sch,Pt -> BoolElt
IsSingular(C,p) : Sch,Pt -> BoolElt
Returns true if and only if the point p is a singular point on the curve C.

IsInflectionPoint(p) : Sch,Pt -> BoolElt,RngIntElt
IsInflectionPoint(C,p) : Sch,Pt -> BoolElt,RngIntElt
IsFlex(C,p) : Sch,Pt -> BoolElt,RngIntElt
IsFlex(p) : Sch,Pt -> BoolElt,RngIntElt
Returns true if and only if the point p is a flex of the curve C. An error is reported if p is a singular point of C. The second return value is the order of the flex, that is, the local intersection number at p of C with its tangent line at p.

TangentLine(p) : Crv,Pt -> Crv
TangentLine(C,p) : Crv,Pt -> Crv
The tangent line to the curve C at the point p embedded as an plane curve in the same space; an error if p is a singular point of C.

TangentCone(p) : Crv,Pt -> Crv
TangentCone(C,p) : Crv,Pt -> Crv
The tangent cone to the curve C at the point p embedded as an plane curve in the same space.
IsTangent(C,D,p) : Sch,Sch,Pt -> BoolElt
Returns true if and only if the curves C and D are nonsingular and tangent at the point p.

Singularity Analysis

These functions report an error if p is not a singular point of C. Again, the arguments can be abbreviated to just the point if care is taken about its parent.

Multiplicity(p) : Sch,Pt -> RngIntElt
Multiplicity(C,p) : Sch,Pt -> RngIntElt
The multiplicity of the curve C at the point p.

IsDoublePoint(p) : Crv,Pt -> BoolElt
IsDoublePoint(C,p) : Crv,Pt -> BoolElt
Returns true if and only if the point p is a double point of the curve C.

IsOrdinarySingularity(p) : Sch,Pt -> BoolElt
IsOrdinarySingularity(C,p) : Sch,Pt -> BoolElt
Returns true if and only if the point p is a singular point of the curve C with reduced tangent cone.

IsNode(p) : Crv,Pt -> BoolElt
IsNode(C,p) : Crv,Pt -> BoolElt
Returns true if and only if the point p is an ordinary double point of the curve C.

IsCusp(p) : Crv,Pt -> BoolElt
IsCusp(C,p) : Crv,Pt -> BoolElt
Returns true if and only if the point p is a nonordinary double point of the curve C.
IsAnalyticallyIrreducible(p) : Crv,Pt -> BoolElt
IsAnalyticallyIrreducible(C,p) : Crv,Pt -> BoolElt
Returns true if and only if the curve C has exactly one place at the point p, or equivalently if the resolution of singularities is injective above p.

Example Crv_curve-iscusp (H82E4)

Each of the two curves in this example have a double point at the origin. One of these is node and one is a cusp.

> A<x,y> := AffineSpace(Rationals(),2);
> C := Curve(A,x^2-y^3);
> p := Origin(A);
> IsCusp(C,p);
true
> IsDoublePoint(C,p);
true
> IsReduced(TangentCone(C,p));
false
> D := Curve(A,x^2 - y^3 - y^2);
> IsAnalyticallyIrreducible(D,p);
false
> IsNode(D,p);
true

Resolution of Singularities

Blowup(C) : Crv -> Crv, Crv
Given the affine curve C, return the two affine plane curves lying on the standard patches of the blowup of the affine plane at the origin. Note that the two curves returned are the birational transforms of C on the blowup patches. The patches are contained in the same affine space as the curve itself. If C does not contain the origin this returns an error message.

Blowup(C,M) : Crv,Mtrx -> Crv, RngIntElt, RngIntElt
This returns the weighted blowup of the curve C at the origin defined by the 2 x 2 matrix of integers M. Again, the birational transform of C is returned inside the ambient plane of C. An error is reported if M does not have determinant +- 1.

Example Crv_weighted-blowup (H82E5)

It often happens that one can replace a string of ordinary blowups used to resolve a curve singularity by a single weighted blowup.

> A<x,y> := AffineSpace(Rationals(),2);
> C := Curve(A,y^2 - x^7);                   
> f := map< A -> A | [x^2*y,x^7*y^3] >;
> C @@ f;
Curve over Rational Field defined by
x^14*y^7 - x^14*y^6
> M := Matrix(2,[2,1,7,3]);
> Blowup(C,M);
Curve over Rational Field defined by
-y + 1
14 6
The blowup function makes the total pullback as the underlying map and then removes all copies of the x and y axes. The pair of numbers displayed in the final line is the multiplicity of these factors in the total pullback. The curve returned is the birational pullback of C on some patch of a rational surface arising by a number of blowups above the origin of A. It is clearly nonsingular --- it's linear! --- so this map resolves the singularity at the origin of C.

In fact, Magma has machinery for interpreting strings of blowups in terms of a graph, the resolution graph.

> ResolutionGraph(C);
The resolution graph on the Digraph
Vertex  Neighbours

1 ([ -2, 7, 4, 0 ])     2 ;
2 ([ -1, 14, 8, 1 ])    3 ;
3 ([ -3, 6, 3, 0 ])     4 ;
4 ([ -2, 4, 2, 0 ])     5 ;
5 ([ -2, 2, 1, 0 ])     ;
Consult Chapter RESOLUTION GRAPHS AND SPLICE DIAGRAMS for the full interpretation of this graph. Briefly, one should see this as representing a chain of five blowups which resolve the curve. Each vertex of the graph corresponds to one of the exceptional curves coming from these blowups. The curve extracted by the weighted blowup we saw above corresponds to vertex number 2. Indeed, we can see the multiplicity 14 in the total pullback as the second entry of the labelling sequence. (The multiplicity 6 which we saw above is the corresponding entry in exceptional curve 3.) The fourth entry of that sequence, 1, reports that the birational transform of C to the blownup surface intersects the exceptional curve with multiplicity 1. This is the only nonzero fourth entry of any vertex label, so we conclude that there is exactly one place above the singularity at the origin. This can be confirmed (more quickly!) by the divisor machinery which will be discussed in Section Divisors.

> Places(C ! Origin(A));
[
    Place at (0 : 0 : 1)
]
> Degree($1[1]);
1

Local Intersection Theory

The main function here uses a standard Euclidean algorithm to calculate local intersection numbers at points where two curves meet. It was taken from unpublished lecture notes of Franz Winkler, "Introduction to Commutative Algebra and Algebraic Geometry"; the same algorithm is in Fulton's book [Ful69]. These numbers are also called intersection multiplicities in the literature. In the following sections there are functions for finding the intersection points of two curves.

IsIntersection(C,D,p) : Sch,Sch,Pt -> BoolElt
Returns true if and only if the point p lies on both curves C and D.
IsTransverse(C,D,p) : Sch,Sch,Pt -> BoolElt
Returns true if and only if the point p is a nonsingular point of both curves C and D and the curves have distinct tangents there.
IntersectionNumber(C,D,p) : Sch,Sch,Pt -> RngIntElt
The local intersection number I_p(C, D) of the curves C and D at the point p. This reports an error if C or D have a common component at p.

Example Crv_local-intersection-example (H82E6)

The local intersection of two curves at a point where they share a common tangent is calculated. If the curves did not share a tangent, the intersection would be the product of multiplicities which it is not in this case.

> A<x,y> := AffineSpace(Rationals(),2);
> C := Curve(A, y^2 - x^5);
> D := Curve(A, y - x^2);
> p := Origin(A);
> IntersectionNumber(C,D,p);
4
> Multiplicity(C,p) * Multiplicity(D,p);
2
These intersection numbers are often defined to be the length of a particular affine algebra. (See [Har77] Chapter I, Exercise 5.4.) Below it is checked that this definition produces the same result in this case. Note that the algebra is not localised at p so the length calculated is the sum of intersection numbers at all intersection points. At the end one sees that the discrepancy of 1 is accounted for by a single transverse intersection away from the origin.

> RA := CoordinateRing(A);
> I := ideal< RA | Polynomial(C),Polynomial(D) >;
> Dimension(RA/I);
5
> IntersectionPoints(C,D);
{ (1, 1), (0, 0) }
> IP := SetToSequence($1);
> IP;
[ (1, 1), (0, 0) ]
> IsTransverse(C,D,IP[1]);
true

 [Next][Prev] [Right] [Left] [Up] [Index] [Root]