The first group of functions create selfmaps of the affine plane. Such a map f can be used to move a curve around the plane simply by applying it to the curve. See Chapter SCHEMES on schemes for more details about maps.
These are the basic automorphisms of the affine plane A taking (x, y) to (x, y), (x - a, y - b), (y, x) and (x + q(y), y) respectively, where p is the point (a, b) and q is a polynomial on A involving y only.
The image of C under the change of coordinates which translates p to the point (0:1:0) in the projective plane and makes the tangent line there equal to the line at infinity. An error is reported if p is a singular point of C. The change of coordinates map is given so that other curves can be mapped by the same change of coordinates.
In this example we show how one could begin to work out a Weierstrass equation for a Fermat cubic. First we define that cubic curve C in the projective plane and choose a point p on C.
> P<x,y,z> := ProjectiveSpace(Rationals(),2); > C := Curve(P,x^3 + y^3 + z^3); > p := C ! [1,-1,0]; > IsFlex(C,p); true 3
The point we have chosen is a flex --- the second return value of 3 is the local intersection number of the curve C with its tangent line at p. We use the intrinsic TranslationToInfinity to make an automorphism of P which takes the point p to the point (0:1:0) and takes the curve C to a curve which has tangent line z=0 at the image of p.
> C1,phi := TranslationToInfinity(C,p); > phi(p); (0 : 1 : 0) > C1; Curve over Rational Field defined by x^3 + 3*y^2*z - 3*y*z^2 + z^3
This is almost in Weierstrass form already. It is a pleasant exercise to make coordinate changes which "absorb" some of the coefficients. Alternatively, one can use the intrinsic EllipticCurve to perform the entire transformation in one step.
Given a map m: C to D, and a nonsingular point P on C, where C is a curve, return m(P), evaluating m(P) using a power series expansion if necessary. This allows a rational map on C to be evaluated at nonsingular base points.
> P2<X,Y,Z>:=ProjectiveSpace(Rationals(),2); > C:=Curve(P2,X^3+Y^3-2*Z^3); > D:=Curve(P2,Y^2*Z-X^3+27*Z^3); > phi:=map<C->D|[-6*X^2-6*X*Z+6*Y^2+6*Y*Z, > 9*X^2+18*X*Y+18*X*Z+9*Y^2+18*Y*Z+36*Z^2, > X^2-2*X*Z-Y^2+2*Y*Z > ]>; > P:=C![-1,1,0]; > P in BaseScheme(phi); true (-1 : 1 : 0) > Q:=EvaluateByPowerSeries(phi,P); > Q; (3 : 0 : 1) > phi(P); >> phi(P); ^ Runtime error in map application: Image of map does not lie in the codomain > pullbackQ:=Q@@phi; > pullbackQ; Scheme over Rational Field defined by -9*X^2 + 9*Y^2, 9*X^2 + 18*X*Y + 18*X*Z + 9*Y^2 + 18*Y*Z + 36*Z^2, X^3 + Y^3 - 2*Z^3 > IsSubscheme(BaseScheme(phi), pullbackQ); true > P in pullbackQ; true (-1 : 1 : 0) > Degree(BaseScheme(phi))+1 eq Degree(pullbackQ); true
Given a non-constant map φ:D to C between curves, there are several induced maps between the function fields of C and D and the divisor groups (Div)(C) and (Div)(D). We refer to the contravariant maps φ * as Pullbacks and to the covariant maps φ_ *, corresponding to the Norm between the function fields, as Pushforwards. Divisor groups and other function field related items are discussed in Section Function Fields.
Returns the degree of a non-constant dominant map m between curves.
Returns the ramification divisor of a non-constant dominant map m between irreducible curves.
Given a map φ:D to C between curves and a function, differential, place or divisor X on C, this function returns the pullback of X along φ.
Given a map φ:D to C between curves and a function, place or divisor X on C, this function returns the pushforward of X along φ. In older versions, the function applied to a place used to only work with the image of the point (or cluster) below the place for speed and would give an error when φ was undefined there. Now, if this is true, the function reverts to working entirely with places and should never fail.
> Puvw<u,v,w>:=ProjectiveSpace(Rationals(),2); > Pxyz<x,y,z>:=ProjectiveSpace(Rationals(),2); > D:=Curve(Puvw,u^4+v^4-w^4); > C:=Curve(Pxyz,x^4-y^4+y^2*z^2); > phiAmb:=map<Puvw->Pxyz|[y*z,z^2,x^2]>; > phi:=Restriction(phiAmb,D,C); > KC:=FunctionField(C); > KD:=FunctionField(D); > Omega:=BasisOfHolomorphicDifferentials(C)[1];Here we see a holomorphic differential pulls back to holomorphic.
> IsEffective(Divisor(Pullback(phi,Omega))); trueRamification divisors are actually quite easy to compute.
> RamificationDivisor(phi) eq > Divisor(Pullback(phi,Omega))-Pullback(phi,Divisor(Omega)); trueVerifying Riemann-Hurwitz:
> 2*Genus(D)-2 eq Degree(phi)*(2*Genus(C)-2)+Degree(RamificationDivisor(phi)); truePulling back and pushing forward is taking powers on the function field.
> f:=KC.1; > Pushforward(phi,Pullback(phi,f)) eq f^Degree(phi); trueDivisor and Pushforward commute.
> g:=KD.1; > Divisor(Pushforward(phi,g)) eq Pushforward(phi,Divisor(g)); true