The first of these 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.
> 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 3The 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^3This is almost a Weierstrass form already. It is a pleasant exercise to make coordinate changes which `absorb' some of the coefficients. Or one can use the intrinsic EllipticCurve to make the entire transformation in one go.
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 > BaseScheme(phi) subset pullbackQ; true > P in pullbackQ; true (-1 : 1 : 0) > Degree(BaseScheme(phi))+1 eq Degree(pullbackQ); true
Given a non-constant map phi: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 phi^ * as Pullbacks and to the covariant maps phi_ *, corresponding to the Norm between the function fields, as Pushforwards.
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 phi:D to C between curves and a function, differential, place or divisor on C, returns the pullback of X along phi.
Given a map phi:D to C between curves and a function, place or divisor on C, returns the pushforward of X along phi.
> 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(KC)[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 commutes.
> g:=KD.1; > Divisor(Pushforward(phi,g)) eq Pushforward(phi,Divisor(g)); true