def __init__(self, X, v, check=True): """ The Python constructor. See :class:`SchemeMorphism_point_affine` for details. TESTS:: sage: from sage.schemes.affine.affine_point import SchemeMorphism_point_affine sage: A3.<x,y,z> = AffineSpace(QQ, 3) sage: SchemeMorphism_point_affine(A3(QQ), [1,2,3]) (1, 2, 3) """ SchemeMorphism.__init__(self, X) if is_SchemeMorphism(v): v = list(v) if check: # Verify that there are the right number of coords d = self.codomain().ambient_space().ngens() if len(v) != d: raise TypeError("Argument v (=%s) must have %s coordinates." % (v, d)) if not isinstance(v, (list, tuple)): raise TypeError( "Argument v (= %s) must be a scheme point, list, or tuple." % str(v)) # Make sure the coordinates all lie in the appropriate ring v = Sequence(v, X.value_ring()) # Verify that the point satisfies the equations of X. X.extended_codomain()._check_satisfies_equations(v) self._coords = tuple(v)
def __init__(self, X, coordinates, check=True): r""" See :class:`SchemeMorphism_point_toric_field` for documentation. TESTS:: sage: fan = FaceFan(lattice_polytope.octahedron(2)) sage: P1xP1 = ToricVariety(fan) sage: P1xP1(1,2,3,4) [1 : 2 : 3 : 4] """ # Convert scheme to its set of points over the base ring if is_Scheme(X): X = X(X.base_ring()) super(SchemeMorphism_point_toric_field, self).__init__(X) if check: # Verify that there are the right number of coords # Why is it not done in the parent? if is_SchemeMorphism(coordinates): coordinates = list(coordinates) if not isinstance(coordinates, (list, tuple)): raise TypeError("coordinates must be a scheme point, list, " "or tuple. Got %s" % coordinates) d = X.codomain().ambient_space().ngens() if len(coordinates) != d: raise ValueError("there must be %d coordinates! Got only %d: " "%s" % (d, len(coordinates), coordinates)) # Make sure the coordinates all lie in the appropriate ring coordinates = Sequence(coordinates, X.value_ring()) # Verify that the point satisfies the equations of X. X.codomain()._check_satisfies_equations(coordinates) self._coords = coordinates
def __init__(self, X, coordinates, check=True): r""" See :class:`SchemeMorphism_point_toric_field` for documentation. TESTS:: sage: fan = FaceFan(lattice_polytope.octahedron(2)) sage: P1xP1 = ToricVariety(fan) sage: P1xP1(1,2,3,4) [1 : 2 : 3 : 4] """ # Convert scheme to its set of points over the base ring if is_Scheme(X): X = X(X.base_ring()) super(SchemeMorphism_point_toric_field, self).__init__(X) if check: # Verify that there are the right number of coords # Why is it not done in the parent? if is_SchemeMorphism(coordinates): coordinates = list(coordinates) if not isinstance(coordinates, (list, tuple)): raise TypeError("coordinates must be a scheme point, list, " "or tuple. Got %s" % coordinates) d = X.codomain().ambient_space().ngens() if len(coordinates) != d: raise ValueError("there must be %d coordinates! Got only %d: " "%s" % (d, len(coordinates), coordinates)) # Make sure the coordinates all lie in the appropriate ring coordinates = Sequence(coordinates, X.value_ring()) # Verify that the point satisfies the equations of X. X.codomain()._check_satisfies_equations(coordinates) self._coords = coordinates
def __init__(self, X, v, check=True): """ The Python constructor. See :class:`SchemeMorphism_point_affine` for details. TESTS:: sage: from sage.schemes.affine.affine_point import SchemeMorphism_point_affine sage: A3.<x,y,z> = AffineSpace(QQ, 3) sage: SchemeMorphism_point_affine(A3(QQ), [1,2,3]) (1, 2, 3) """ SchemeMorphism.__init__(self, X) if is_SchemeMorphism(v): v = list(v) if check: # Verify that there are the right number of coords d = self.codomain().ambient_space().ngens() if len(v) != d: raise TypeError("Argument v (=%s) must have %s coordinates." % (v, d)) if not isinstance(v, (list, tuple)): raise TypeError("Argument v (= %s) must be a scheme point, list, or tuple." % str(v)) # Make sure the coordinates all lie in the appropriate ring v = Sequence(v, X.value_ring()) # Verify that the point satisfies the equations of X. X.extended_codomain()._check_satisfies_equations(v) self._coords = tuple(v)
def __init__(self, X=None, category=None): """ Construct a scheme. TESTS:: sage: R.<x, y> = QQ[] sage: I = (x^2 - y^2)*R sage: RmodI = R.quotient(I) sage: X = Spec(RmodI) sage: TestSuite(X).run(skip = ["_test_an_element", "_test_elements", ... "_test_some_elements", "_test_category"]) # See #7946 """ from sage.schemes.generic.spec import is_Spec from sage.schemes.generic.morphism import is_SchemeMorphism if X is None: try: from sage.schemes.generic.spec import SpecZ self._base_scheme = SpecZ except ImportError: # we are currently constructing SpecZ self._base_ring = ZZ elif is_Scheme(X): self._base_scheme = X elif is_SchemeMorphism(X): self._base_morphism = X elif is_CommutativeRing(X): self._base_ring = X elif is_RingHomomorphism(X): self._base_ring = X.codomain() else: raise ValueError("The base must be define by a scheme, " "scheme morphism, or commutative ring.") from sage.categories.schemes import Schemes if not X: default_category = Schemes() else: default_category = Schemes(self.base_scheme()) if category is None: category = default_category else: assert category.is_subcategory(default_category), "%s is not a subcategory of %s" % ( category, default_category, ) Parent.__init__(self, self.base_ring(), category=category)
def __init__(self, X=None, category=None): """ Construct a scheme. TESTS:: sage: R.<x, y> = QQ[] sage: I = (x^2 - y^2)*R sage: RmodI = R.quotient(I) sage: X = Spec(RmodI) sage: TestSuite(X).run(skip = ["_test_an_element", "_test_elements", ... "_test_some_elements", "_test_category"]) # See #7946 """ from sage.schemes.generic.spec import is_Spec from sage.schemes.generic.morphism import is_SchemeMorphism if X is None: try: from sage.schemes.generic.spec import SpecZ self._base_scheme = SpecZ except ImportError: # we are currently constructing SpecZ self._base_ring = ZZ elif is_Scheme(X): self._base_scheme = X elif is_SchemeMorphism(X): self._base_morphism = X elif is_CommutativeRing(X): self._base_ring = X elif is_RingHomomorphism(X): self._base_ring = X.codomain() else: raise ValueError('The base must be define by a scheme, ' 'scheme morphism, or commutative ring.') from sage.categories.schemes import Schemes if not X: default_category = Schemes() else: default_category = Schemes(self.base_scheme()) if category is None: category = default_category else: assert category.is_subcategory(default_category), \ "%s is not a subcategory of %s"%(category, default_category) Parent.__init__(self, self.base_ring(), category=category)
def __init__(self, X=None, category=None): """ Construct a scheme. TESTS: The full test suite works since :trac:`7946`:: sage: R.<x, y> = QQ[] sage: I = (x^2 - y^2)*R sage: RmodI = R.quotient(I) sage: X = Spec(RmodI) sage: TestSuite(X).run() """ from sage.schemes.generic.morphism import is_SchemeMorphism from sage.categories.map import Map from sage.categories.all import Rings if X is None: self._base_ring = ZZ elif is_Scheme(X): self._base_scheme = X elif is_SchemeMorphism(X): self._base_morphism = X elif isinstance(X, CommutativeRing): self._base_ring = X elif isinstance(X, Map) and X.category_for().is_subcategory(Rings()): # X is a morphism of Rings self._base_ring = X.codomain() else: raise ValueError('The base must be define by a scheme, ' 'scheme morphism, or commutative ring.') from sage.categories.schemes import Schemes if X is None: default_category = Schemes() else: default_category = Schemes(self.base_scheme()) if category is None: category = default_category else: assert category.is_subcategory(default_category), \ "%s is not a subcategory of %s"%(category, default_category) Parent.__init__(self, self.base_ring(), category = category)
def __init__(self, X=None, category=None): """ Construct a scheme. TESTS: The full test suite works since :trac:`7946`:: sage: R.<x, y> = QQ[] sage: I = (x^2 - y^2)*R sage: RmodI = R.quotient(I) sage: X = Spec(RmodI) sage: TestSuite(X).run() """ from sage.schemes.generic.morphism import is_SchemeMorphism from sage.categories.map import Map from sage.categories.all import Rings if X is None: self._base_ring = ZZ elif is_Scheme(X): self._base_scheme = X elif is_SchemeMorphism(X): self._base_morphism = X elif isinstance(X, CommutativeRing): self._base_ring = X elif isinstance(X, Map) and X.category_for().is_subcategory(Rings()): # X is a morphism of Rings self._base_ring = X.codomain() else: raise ValueError('The base must be define by a scheme, ' 'scheme morphism, or commutative ring.') from sage.categories.schemes import Schemes if X is None: default_category = Schemes() else: default_category = Schemes(self.base_scheme()) if category is None: category = default_category else: assert category.is_subcategory(default_category), \ "%s is not a subcategory of %s"%(category, default_category) Parent.__init__(self, self.base_ring(), category=category)
def _call_(self, x): """ Construct a scheme from the data in ``x`` EXAMPLES: Let us first construct the category of schemes:: sage: S = Schemes(); S Category of schemes We create a scheme from a ring:: sage: X = S(ZZ); X # indirect doctest Spectrum of Integer Ring We create a scheme from a scheme (do nothing):: sage: S(X) Spectrum of Integer Ring We create a scheme morphism from a ring homomorphism.x:: sage: phi = ZZ.hom(QQ); phi Ring Coercion morphism: From: Integer Ring To: Rational Field sage: f = S(phi); f # indirect doctest Affine Scheme morphism: From: Spectrum of Rational Field To: Spectrum of Integer Ring Defn: Ring Coercion morphism: From: Integer Ring To: Rational Field sage: f.domain() Spectrum of Rational Field sage: f.codomain() Spectrum of Integer Ring sage: S(f) # indirect doctest Affine Scheme morphism: From: Spectrum of Rational Field To: Spectrum of Integer Ring Defn: Ring Coercion morphism: From: Integer Ring To: Rational Field """ from sage.schemes.generic.scheme import is_Scheme if is_Scheme(x): return x from sage.schemes.generic.morphism import is_SchemeMorphism if is_SchemeMorphism(x): return x from sage.rings.morphism import is_RingHomomorphism from sage.rings.commutative_ring import is_CommutativeRing from sage.schemes.generic.spec import Spec if is_CommutativeRing(x): return Spec(x) elif is_RingHomomorphism(x): A = Spec(x.codomain()) return A.hom(x) else: raise TypeError( "No way to create an object or morphism in %s from %s" % (self, x))
def __init__(self, X, v, check=True): """ The Python constructor. See :class:`SchemeMorphism_point_projective_ring` for details. This function still normalizes points so that the rightmost non-zero coordinate is 1. This is to maintain functionality with current implementations of curves in projectives space (plane, conic, elliptic, etc). The :class:`SchemeMorphism_point_projective_ring` is for general use. EXAMPLES:: sage: P = ProjectiveSpace(2, QQ) sage: P(2, 3/5, 4) (1/2 : 3/20 : 1) :: sage: P = ProjectiveSpace(3, QQ) sage: P(0, 0, 0, 0) Traceback (most recent call last): ... ValueError: [0, 0, 0, 0] does not define a valid point since all entries are 0 :: sage: P.<x, y, z> = ProjectiveSpace(2, QQ) sage: X = P.subscheme([x^2-y*z]) sage: X([2, 2, 2]) (1 : 1 : 1) :: sage: P = ProjectiveSpace(1, GF(7)) sage: Q=P([2, 1]) sage: Q[0].parent() Finite Field of size 7 :: sage: P = ProjectiveSpace(QQ,1) sage: P.point(Infinity) (1 : 0) sage: P(infinity) (1 : 0) :: sage: P = ProjectiveSpace(QQ,2) sage: P(infinity) Traceback (most recent call last): ... ValueError: +Infinity not well defined in dimension > 1 sage: P.point(infinity) Traceback (most recent call last): ... ValueError: +Infinity not well defined in dimension > 1 """ SchemeMorphism.__init__(self, X) if check: from sage.schemes.elliptic_curves.ell_point import EllipticCurvePoint_field from sage.rings.ring import CommutativeRing d = X.codomain().ambient_space().ngens() if is_SchemeMorphism(v) or isinstance(v, EllipticCurvePoint_field): v = list(v) else: try: if isinstance(v.parent(), CommutativeRing): v = [v] except AttributeError: pass if not isinstance(v, (list,tuple)): raise TypeError("argument v (= %s) must be a scheme point, list, or tuple"%str(v)) if len(v) != d and len(v) != d-1: raise TypeError("v (=%s) must have %s components"%(v, d)) R = X.value_ring() v = Sequence(v, R) if len(v) == d-1: # very common special case v.append(R(1)) n = len(v) all_zero = True for i in range(n): last = n-1-i if v[last]: all_zero = False c = v[last] if c == R.one(): break for j in range(last): v[j] /= c v[last] = R.one() break if all_zero: raise ValueError("%s does not define a valid point since all entries are 0"%repr(v)) X.extended_codomain()._check_satisfies_equations(v) self._coords = tuple(v)
def __init__(self, X, v, check=True): """ The Python constructor. EXAMPLES:: sage: P = ProjectiveSpace(2, QQ) sage: P(2, 3/5, 4) (1/2 : 3/20 : 1) :: sage: P = ProjectiveSpace(1, ZZ) sage: P([0, 1]) (0 : 1) :: sage: P = ProjectiveSpace(1, ZZ) sage: P([0, 0, 1]) Traceback (most recent call last): ... TypeError: v (=[0, 0, 1]) must have 2 components :: sage: P = ProjectiveSpace(3, QQ) sage: P(0,0,0,0) Traceback (most recent call last): ... ValueError: [0, 0, 0, 0] does not define a valid point since all entries are 0 It is possible to avoid the possibly time-consuming checks, but be careful!! :: sage: P = ProjectiveSpace(3, QQ) sage: P.point([0,0,0,0], check=False) (0 : 0 : 0 : 0) :: sage: P.<x, y, z> = ProjectiveSpace(2, ZZ) sage: X = P.subscheme([x^2-y*z]) sage: X([2, 2, 2]) (2 : 2 : 2) :: sage: R.<t> = PolynomialRing(ZZ) sage: P = ProjectiveSpace(1, R.quo(t^2+1)) sage: P([2*t, 1]) (2*tbar : 1) :: sage: P = ProjectiveSpace(ZZ,1) sage: P.point(Infinity) (1 : 0) sage: P(infinity) (1 : 0) :: sage: P = ProjectiveSpace(ZZ,2) sage: P(Infinity) Traceback (most recent call last): ... ValueError: +Infinity not well defined in dimension > 1 sage: P.point(infinity) Traceback (most recent call last): ... ValueError: +Infinity not well defined in dimension > 1 """ SchemeMorphism.__init__(self, X) if check: from sage.schemes.elliptic_curves.ell_point import EllipticCurvePoint_field from sage.rings.ring import CommutativeRing d = X.codomain().ambient_space().ngens() if is_SchemeMorphism(v) or isinstance(v, EllipticCurvePoint_field): v = list(v) else: try: if isinstance(v.parent(), CommutativeRing): v = [v] except AttributeError: pass if not isinstance(v, (list, tuple)): raise TypeError("argument v (= %s) must be a scheme point, list, or tuple"%str(v)) if len(v) != d and len(v) != d-1: raise TypeError("v (=%s) must have %s components"%(v, d)) R = X.value_ring() v = Sequence(v, R) if len(v) == d-1: # very common special case v.append(R(1)) n = len(v) all_zero = True for i in range(n): last = n-1-i if v[last]: all_zero = False break if all_zero: raise ValueError("%s does not define a valid point since all entries are 0"%repr(v)) X.extended_codomain()._check_satisfies_equations(v) self._coords = tuple(v)
def _call_(self, x): """ Construct a scheme from the data in ``x`` EXAMPLES: Let us first construct the category of schemes:: sage: S = Schemes(); S Category of schemes We create a scheme from a ring:: sage: X = S(ZZ); X # indirect doctest Spectrum of Integer Ring We create a scheme from a scheme (do nothing):: sage: S(X) Spectrum of Integer Ring We create a scheme morphism from a ring homomorphism.x:: sage: phi = ZZ.hom(QQ); phi Ring Coercion morphism: From: Integer Ring To: Rational Field sage: f = S(phi); f # indirect doctest Affine Scheme morphism: From: Spectrum of Rational Field To: Spectrum of Integer Ring Defn: Ring Coercion morphism: From: Integer Ring To: Rational Field sage: f.domain() Spectrum of Rational Field sage: f.codomain() Spectrum of Integer Ring sage: S(f) # indirect doctest Affine Scheme morphism: From: Spectrum of Rational Field To: Spectrum of Integer Ring Defn: Ring Coercion morphism: From: Integer Ring To: Rational Field """ from sage.schemes.generic.scheme import is_Scheme if is_Scheme(x): return x from sage.schemes.generic.morphism import is_SchemeMorphism if is_SchemeMorphism(x): return x from sage.rings.morphism import is_RingHomomorphism from sage.rings.ring import CommutativeRing from sage.schemes.generic.spec import Spec if isinstance(x, CommutativeRing): return Spec(x) elif is_RingHomomorphism(x): A = Spec(x.codomain()) return A.hom(x) else: raise TypeError("No way to create an object or morphism in %s from %s"%(self, x))
def __init__(self, X, v, check=True): """ The Python constructor. See :class:`SchemeMorphism_point_projective_ring` for details. This function still normalized points so that the rightmost non-zero coordinate is 1. The is to maintain current functionality with current implementations of curves in projectives space (plane, connic, elliptic, etc). The class:`SchemeMorphism_point_projective_ring` is for general use. EXAMPLES:: sage: P = ProjectiveSpace(2, QQ) sage: P(2, 3/5, 4) (1/2 : 3/20 : 1) :: sage: P = ProjectiveSpace(3, QQ) sage: P(0,0,0,0) Traceback (most recent call last): ... ValueError: [0, 0, 0, 0] does not define a valid point since all entries are 0 :: sage: P.<x, y, z> = ProjectiveSpace(2, QQ) sage: X=P.subscheme([x^2-y*z]) sage: X([2,2,2]) (1 : 1 : 1) """ SchemeMorphism.__init__(self, X) if check: from sage.schemes.elliptic_curves.ell_point import EllipticCurvePoint_field d = X.codomain().ambient_space().ngens() if is_SchemeMorphism(v) or isinstance(v, EllipticCurvePoint_field): v = list(v) elif v is infinity: v = [0] * (d) v[1] = 1 if not isinstance(v,(list,tuple)): raise TypeError("Argument v (= %s) must be a scheme point, list, or tuple."%str(v)) if len(v) != d and len(v) != d-1: raise TypeError("v (=%s) must have %s components"%(v, d)) R = X.value_ring() v = Sequence(v, R) if len(v) == d-1: # very common special case v.append(1) n = len(v) all_zero = True for i in range(n): last = n-1-i if v[last]: all_zero = False c = v[last] if c == R.one(): break for j in range(last): v[j] /= c v[last] = R.one() break if all_zero: raise ValueError("%s does not define a valid point since all entries are 0"%repr(v)) X.extended_codomain()._check_satisfies_equations(v) self._coords = v
def __call__(self, P): r""" Returns a rational point P in the abstract Homset J(K), given: 0. A point P in J = Jac(C), returning P; 1. A point P on the curve C such that J = Jac(C), where C is an odd degree model, returning [P - oo]; 2. A pair of points (P, Q) on the curve C such that J = Jac(C), returning [P-Q]; 2. A list of polynomials (a,b) such that `b^2 + h*b - f = 0 mod a`, returning [(a(x),y-b(x))]. EXAMPLES:: sage: P.<x> = PolynomialRing(QQ) sage: f = x^5 - x + 1; h = x sage: C = HyperellipticCurve(f,h,'u,v') sage: P = C(0,1,1) sage: J = C.jacobian() sage: Q = J(QQ)(P) sage: for i in range(6): i*Q (1) (u, v - 1) (u^2, v + u - 1) (u^2, v + 1) (u, v + 1) (1) :: sage: F.<a> = GF(3) sage: R.<x> = F[] sage: f = x^5-1 sage: C = HyperellipticCurve(f) sage: J = C.jacobian() sage: X = J(F) sage: a = x^2-x+1 sage: b = -x +1 sage: c = x-1 sage: d = 0 sage: D1 = X([a,b]) sage: D1 (x^2 + 2*x + 1, y + x + 2) sage: D2 = X([c,d]) sage: D2 (x + 2, y) sage: D1+D2 (x^2 + 2*x + 2, y + 2*x + 1) """ if isinstance(P, (int, long, Integer)) and P == 0: R = PolynomialRing(self.value_ring(), 'x') return JacobianMorphism_divisor_class_field(self, (R(1), R(0))) elif isinstance(P, (list, tuple)): if len(P) == 1 and P[0] == 0: R = PolynomialRing(self.value_ring(), 'x') return JacobianMorphism_divisor_class_field(self, (R(1), R(0))) elif len(P) == 2: P1 = P[0] P2 = P[1] if is_Integer(P1) and is_Integer(P2): R = PolynomialRing(self.value_ring(), 'x') P1 = R(P1) P2 = R(P2) return JacobianMorphism_divisor_class_field( self, tuple([P1, P2])) if is_Integer(P1) and is_Polynomial(P2): R = PolynomialRing(self.value_ring(), 'x') P1 = R(P1) return JacobianMorphism_divisor_class_field( self, tuple([P1, P2])) if is_Integer(P2) and is_Polynomial(P1): R = PolynomialRing(self.value_ring(), 'x') P2 = R(P2) return JacobianMorphism_divisor_class_field( self, tuple([P1, P2])) if is_Polynomial(P1) and is_Polynomial(P2): return JacobianMorphism_divisor_class_field(self, tuple(P)) if is_SchemeMorphism(P1) and is_SchemeMorphism(P2): return self(P1) - self(P2) raise TypeError("Argument P (= %s) must have length 2." % P) elif isinstance( P, JacobianMorphism_divisor_class_field) and self == P.parent(): return P elif is_SchemeMorphism(P): x0 = P[0] y0 = P[1] R, x = PolynomialRing(self.value_ring(), 'x').objgen() return self((x - x0, R(y0))) raise TypeError( "Argument P (= %s) does not determine a divisor class" % P)
def __init__(self, X, v, check=True): """ The Python constructor. EXAMPLES:: sage: P = ProjectiveSpace(2, QQ) sage: P(2, 3/5, 4) (1/2 : 3/20 : 1) :: sage: P = ProjectiveSpace(1, ZZ) sage: P([0, 1]) (0 : 1) :: sage: P = ProjectiveSpace(1, ZZ) sage: P([0, 0, 1]) Traceback (most recent call last): ... TypeError: v (=[0, 0, 1]) must have 2 components :: sage: P = ProjectiveSpace(3, QQ) sage: P(0,0,0,0) Traceback (most recent call last): ... ValueError: [0, 0, 0, 0] does not define a valid point since all entries are 0 :: It is possible to avoid the possibly time consuming checks, but be careful!! sage: P = ProjectiveSpace(3, QQ) sage: P.point([0,0,0,0],check=False) (0 : 0 : 0 : 0) :: sage: P.<x, y, z> = ProjectiveSpace(2, ZZ) sage: X=P.subscheme([x^2-y*z]) sage: X([2,2,2]) (2 : 2 : 2) """ SchemeMorphism.__init__(self, X) if check: from sage.schemes.elliptic_curves.ell_point import EllipticCurvePoint_field d = X.codomain().ambient_space().ngens() if is_SchemeMorphism(v) or isinstance(v, EllipticCurvePoint_field): v = list(v) elif v is infinity: v = [0] * (d) v[1] = 1 if not isinstance(v,(list,tuple)): raise TypeError("Argument v (= %s) must be a scheme point, list, or tuple."%str(v)) if len(v) != d and len(v) != d-1: raise TypeError("v (=%s) must have %s components"%(v, d)) R = X.value_ring() v = Sequence(v, R) if len(v) == d-1: # very common special case v.append(1) n = len(v) all_zero = True for i in range(n): last = n-1-i if v[last]: all_zero = False break if all_zero: raise ValueError("%s does not define a valid point since all entries are 0"%repr(v)) X.extended_codomain()._check_satisfies_equations(v) if isinstance(X.codomain().base_ring(), QuotientRing_generic): lift_coords = [P.lift() for P in v] else: lift_coords = v v = Sequence(lift_coords) self._coords = v
def _call_(self, x): """ Construct a scheme from the data in ``x`` EXAMPLES: Let us first construct the category of schemes:: sage: S = Schemes(); S Category of schemes We create a scheme from a ring:: sage: X = S(ZZ); X # indirect doctest Spectrum of Integer Ring We create a scheme from a scheme (do nothing):: sage: S(X) Spectrum of Integer Ring We create a scheme morphism from a ring homomorphism.x:: sage: phi = ZZ.hom(QQ); phi Natural morphism: From: Integer Ring To: Rational Field sage: f = S(phi); f # indirect doctest Affine Scheme morphism: From: Spectrum of Rational Field To: Spectrum of Integer Ring Defn: Natural morphism: From: Integer Ring To: Rational Field sage: f.domain() Spectrum of Rational Field sage: f.codomain() Spectrum of Integer Ring sage: S(f) # indirect doctest Affine Scheme morphism: From: Spectrum of Rational Field To: Spectrum of Integer Ring Defn: Natural morphism: From: Integer Ring To: Rational Field """ from sage.schemes.generic.scheme import is_Scheme if is_Scheme(x): return x from sage.schemes.generic.morphism import is_SchemeMorphism if is_SchemeMorphism(x): return x from sage.rings.ring import CommutativeRing from sage.schemes.generic.spec import Spec from sage.categories.map import Map from sage.categories.all import Rings if isinstance(x, CommutativeRing): return Spec(x) elif isinstance(x, Map) and x.category_for().is_subcategory(Rings()): # x is a morphism of Rings A = Spec(x.codomain()) return A.hom(x) else: raise TypeError("No way to create an object or morphism in %s from %s"%(self, x))
def __call__(self, P): r""" Returns a rational point P in the abstract Homset J(K), given: 0. A point P in J = Jac(C), returning P; 1. A point P on the curve C such that J = Jac(C), where C is an odd degree model, returning [P - oo]; 2. A pair of points (P, Q) on the curve C such that J = Jac(C), returning [P-Q]; 2. A list of polynomials (a,b) such that `b^2 + h*b - f = 0 mod a`, returning [(a(x),y-b(x))]. EXAMPLES:: sage: P.<x> = PolynomialRing(QQ) sage: f = x^5 - x + 1; h = x sage: C = HyperellipticCurve(f,h,'u,v') sage: P = C(0,1,1) sage: J = C.jacobian() sage: Q = J(QQ)(P) sage: for i in range(6): i*Q (1) (u, v - 1) (u^2, v + u - 1) (u^2, v + 1) (u, v + 1) (1) :: sage: F.<a> = GF(3) sage: R.<x> = F[] sage: f = x^5-1 sage: C = HyperellipticCurve(f) sage: J = C.jacobian() sage: X = J(F) sage: a = x^2-x+1 sage: b = -x +1 sage: c = x-1 sage: d = 0 sage: D1 = X([a,b]) sage: D1 (x^2 + 2*x + 1, y + x + 2) sage: D2 = X([c,d]) sage: D2 (x + 2, y) sage: D1+D2 (x^2 + 2*x + 2, y + 2*x + 1) """ if isinstance(P,(int,long,Integer)) and P == 0: R = PolynomialRing(self.value_ring(), 'x') return JacobianMorphism_divisor_class_field(self, (R(1),R(0))) elif isinstance(P,(list,tuple)): if len(P) == 1 and P[0] == 0: R = PolynomialRing(self.value_ring(), 'x') return JacobianMorphism_divisor_class_field(self, (R(1),R(0))) elif len(P) == 2: P1 = P[0] P2 = P[1] if is_Integer(P1) and is_Integer(P2): R = PolynomialRing(self.value_ring(), 'x') P1 = R(P1) P2 = R(P2) return JacobianMorphism_divisor_class_field(self, tuple([P1,P2])) if is_Integer(P1) and is_Polynomial(P2): R = PolynomialRing(self.value_ring(), 'x') P1 = R(P1) return JacobianMorphism_divisor_class_field(self, tuple([P1,P2])) if is_Integer(P2) and is_Polynomial(P1): R = PolynomialRing(self.value_ring(), 'x') P2 = R(P2) return JacobianMorphism_divisor_class_field(self, tuple([P1,P2])) if is_Polynomial(P1) and is_Polynomial(P2): return JacobianMorphism_divisor_class_field(self, tuple(P)) if is_SchemeMorphism(P1) and is_SchemeMorphism(P2): return self(P1) - self(P2) raise TypeError("Argument P (= %s) must have length 2."%P) elif isinstance(P,JacobianMorphism_divisor_class_field) and self == P.parent(): return P elif is_SchemeMorphism(P): x0 = P[0]; y0 = P[1] R, x = PolynomialRing(self.value_ring(), 'x').objgen() return self((x-x0,R(y0))) raise TypeError("Argument P (= %s) does not determine a divisor class"%P)