Projective plane conics over a rational function field - Plane and Space Curves

Skip to content
Back to top
View this page
Edit this page

# Projective plane conics over a rational function field

The class `ProjectiveConic_rational_function_field` represents a projective plane conic over a rational function field \(F(t)\), where \(F\) is any field. Instances can be created using `Conic()`.

AUTHORS:

- Lennart Ackermans (2016-02-07): initial version

EXAMPLES:

Create a conic:

Sage

    sage: K = FractionField(PolynomialRing(QQ, 't'))
    sage: P.<X, Y, Z> = K[]
    sage: Conic(X^2 + Y^2 - Z^2)
    Projective Conic Curve over Fraction Field of Univariate
    Polynomial Ring in t over Rational Field defined by
    X^2 + Y^2 - Z^2

Python

    >>> from sage.all import *
    >>> K = FractionField(PolynomialRing(QQ, 't'))
    >>> P = K['X, Y, Z']; (X, Y, Z,) = P._first_ngens(3)
    >>> Conic(X**Integer(2) + Y**Integer(2) - Z**Integer(2))
    Projective Conic Curve over Fraction Field of Univariate
    Polynomial Ring in t over Rational Field defined by
    X^2 + Y^2 - Z^2

Points can be found using `has_rational_point()`:

Sage

    sage: K.<t> = FractionField(QQ['t'])
    sage: C = Conic([1, -t, t])
    sage: C.has_rational_point(point=True)                                              # needs sage.libs.singular
    (True, (0 : 1 : 1))

[Python]

    >>> from sage.all import *
    >>> K = FractionField(QQ['t'], names=('t',)); (t,) = K._first_ngens(1)
    >>> C = Conic([Integer(1), -t, t])
    >>> C.has_rational_point(point=True)                                              # needs sage.libs.singular
    (True, (0 : 1 : 1))

class sage.schemes.plane_conics.con_rational_function_field.ProjectiveConic_rational_function_field(A, f)

  Bases: `ProjectiveConic_field`

  Create a projective plane conic curve over a rational function field \(F(t)\), where \(F\) is any field.

  The algorithms used in this class come mostly from [HC2006].

  EXAMPLES:

  Sage

      sage: K = FractionField(PolynomialRing(QQ, 't'))
      sage: P.<X, Y, Z> = K[]
      sage: Conic(X^2 + Y^2 - Z^2)
      Projective Conic Curve over Fraction Field of Univariate
      Polynomial Ring in t over Rational Field defined by
      X^2 + Y^2 - Z^2

  Python

      >>> from sage.all import *
      >>> K = FractionField(PolynomialRing(QQ, 't'))
      >>> P = K['X, Y, Z']; (X, Y, Z,) = P._first_ngens(3)
      >>> Conic(X**Integer(2) + Y**Integer(2) - Z**Integer(2))
      Projective Conic Curve over Fraction Field of Univariate
      Polynomial Ring in t over Rational Field defined by
      X^2 + Y^2 - Z^2

  REFERENCES:

  - [HC2006]

  - [Ack2016]

  find_point(supports, roots, case, solution=0)

    Given a solubility certificate like in [HC2006], find a point on `self`. Assumes `self` is in reduced form (see [HC2006] for a definition).

    If you don’t have a solubility certificate and just want to find a point, use the function `has_rational_point()` instead.

    INPUT:

    - `self` – conic in reduced form

    - `supports` – 3-tuple where `supports[i]` is a list of all monic irreducible \(p \in F[t]\) that divide the \(i\)-th of the 3 coefficients

    - `roots` – 3-tuple containing lists of roots of all elements of `supports[i]`, in the same order

    - `case` – 1 or 0, as in [HC2006]

    - `solution` – (default: 0) a solution of (5) in [HC2006], if `case` = 0, 0 otherwise

    OUTPUT:

    A point \((x,y,z) \in F(t)\) of `self`. Output is undefined when the input solubility certificate is incorrect.

    ALGORITHM:

    The algorithm used is the algorithm FindPoint in [HC2006], with a simplification from [Ack2016].

    EXAMPLES:

    Sage

        sage: K.<t> = FractionField(QQ['t'])
        sage: C = Conic(K, [t^2 - 2, 2*t^3, -2*t^3 - 13*t^2 - 2*t + 18])
        sage: C.has_rational_point(point=True)  # indirect test                     # needs sage.libs.singular
        (True, (3 : (t + 1)/t : 1))

    Python

        >>> from sage.all import *
        >>> K = FractionField(QQ['t'], names=('t',)); (t,) = K._first_ngens(1)
        >>> C = Conic(K, [t**Integer(2) - Integer(2), Integer(2)*t**Integer(3), -Integer(2)*t**Integer(3) - Integer(13)*t**Integer(2) - Integer(2)*t + Integer(18)])
        >>> C.has_rational_point(point=True)  # indirect test                     # needs sage.libs.singular
        (True, (3 : (t + 1)/t : 1))

    Different solubility certificates give different points:

    Sage

        sage: # needs sage.rings.number_field
        sage: K.<t> = PolynomialRing(QQ, 't')
        sage: C = Conic(K, [t^2 - 2, 2*t, -2*t^3 - 13*t^2 - 2*t + 18])
        sage: supp = [[t^2 - 2], [t], [t^3 + 13/2*t^2 + t - 9]]
        sage: tbar1 = QQ.extension(supp[0][0], 'tbar').gens()[0]
        sage: tbar2 = QQ.extension(supp[1][0], 'tbar').gens()[0]
        sage: tbar3 = QQ.extension(supp[2][0], 'tbar').gens()[0]
        sage: roots = [[tbar1 + 1], [1/3*tbar2^0], [2/3*tbar3^2 + 11/3*tbar3 - 3]]
        sage: C.find_point(supp, roots, 1)
        (3 : t + 1 : 1)
        sage: roots = [[-tbar1 - 1], [-1/3*tbar2^0], [-2/3*tbar3^2 - 11/3*tbar3 + 3]]
        sage: C.find_point(supp, roots, 1)
        (3 : -t - 1 : 1)

    [Python]

        >>> from sage.all import *
        >>> # needs sage.rings.number_field
        >>> K = PolynomialRing(QQ, 't', names=('t',)); (t,) = K._first_ngens(1)
        >>> C = Conic(K, [t**Integer(2) - Integer(2), Integer(2)*t, -Integer(2)*t**Integer(3) - Integer(13)*t**Integer(2) - Integer(2)*t + Integer(18)])
        >>> supp = [[t**Integer(2) - Integer(2)], [t], [t**Integer(3) + Integer(13)/Integer(2)*t**Integer(2) + t - Integer(9)]]
        >>> tbar1 = QQ.extension(supp[Integer(0)][Integer(0)], 'tbar').gens()[Integer(0)]
        >>> tbar2 = QQ.extension(supp[Integer(1)][Integer(0)], 'tbar').gens()[Integer(0)]
        >>> tbar3 = QQ.extension(supp[Integer(2)][Integer(0)], 'tbar').gens()[Integer(0)]
        >>> roots = [[tbar1 + Integer(1)], [Integer(1)/Integer(3)*tbar2**Integer(0)], [Integer(2)/Integer(3)*tbar3**Integer(2) + Integer(11)/Integer(3)*tbar3 - Integer(3)]]
        >>> C.find_point(supp, roots, Integer(1))
        (3 : t + 1 : 1)
        >>> roots = [[-tbar1 - Integer(1)], [-Integer(1)/Integer(3)*tbar2**Integer(0)], [-Integer(2)/Integer(3)*tbar3**Integer(2) - Integer(11)/Integer(3)*tbar3 + Integer(3)]]
        >>> C.find_point(supp, roots, Integer(1))
        (3 : -t - 1 : 1)

  has_rational_point(point=False, algorithm='default', read_cache=True)

    Return `True` if and only if the conic `self` has a point over its base field \(F(t)\), which is a field of rational functions.

    If `point` is True, then returns a second output, which is a rational point if one exists.

    Points are cached whenever they are found. Cached information is used if and only if `read_cache` is True.

    The default algorithm does not (yet) work for all base fields \(F\). In particular, sage is required to have:

    - an algorithm for finding the square root of elements in finite extensions of \(F\);

    - a factorization and gcd algorithm for \(F[t]\);

    - an algorithm for solving conics over \(F\).

    ALGORITHM:

    The parameter `algorithm` specifies the algorithm to be used:

    - `'default'` – use a native Sage implementation, based on the algorithm Conic in [HC2006].

    - `'magma'` (requires Magma to be installed) – delegates the task to the Magma computer algebra system.

    EXAMPLES:

    We can find points for function fields over (extensions of) \(\QQ\) and finite fields:

    Sage

        sage: K.<t> = FractionField(PolynomialRing(QQ, 't'))
        sage: C = Conic(K, [t^2 - 2, 2*t^3, -2*t^3 - 13*t^2 - 2*t + 18])
        sage: C.has_rational_point(point=True)                                      # needs sage.libs.singular
        (True, (3 : (t + 1)/t : 1))

        sage: R.<t> = FiniteField(23)[]
        sage: C = Conic([2, t^2 + 1, t^2 + 5])
        sage: C.has_rational_point()                                                # needs sage.libs.singular
        True
        sage: C.has_rational_point(point=True)                                      # needs sage.libs.singular
        (True, (5*t : 8 : 1))

        sage: # needs sage.rings.number_field
        sage: F.<i> = QuadraticField(-1)
        sage: R.<t> = F[]
        sage: C = Conic([1, i*t, -t^2 + 4])
        sage: C.has_rational_point(point=True)                                      # needs sage.libs.singular
        (True, (-t - 2*i : -2*i : 1))

    Python

        >>> from sage.all import *
        >>> K = FractionField(PolynomialRing(QQ, 't'), names=('t',)); (t,) = K._first_ngens(1)
        >>> C = Conic(K, [t**Integer(2) - Integer(2), Integer(2)*t**Integer(3), -Integer(2)*t**Integer(3) - Integer(13)*t**Integer(2) - Integer(2)*t + Integer(18)])
        >>> C.has_rational_point(point=True)                                      # needs sage.libs.singular
        (True, (3 : (t + 1)/t : 1))

        >>> R = FiniteField(Integer(23))['t']; (t,) = R._first_ngens(1)
        >>> C = Conic([Integer(2), t**Integer(2) + Integer(1), t**Integer(2) + Integer(5)])
        >>> C.has_rational_point()                                                # needs sage.libs.singular
        True
        >>> C.has_rational_point(point=True)                                      # needs sage.libs.singular
        (True, (5*t : 8 : 1))

        >>> # needs sage.rings.number_field
        >>> F = QuadraticField(-Integer(1), names=('i',)); (i,) = F._first_ngens(1)
        >>> R = F['t']; (t,) = R._first_ngens(1)
        >>> C = Conic([Integer(1), i*t, -t**Integer(2) + Integer(4)])
        >>> C.has_rational_point(point=True)                                      # needs sage.libs.singular
        (True, (-t - 2*i : -2*i : 1))

    It works on non-diagonal conics as well:

    Sage

        sage: K.<t> = QQ[]
        sage: C = Conic([4, -4, 8, 1, -4, t + 4])
        sage: C.has_rational_point(point=True)                                      # needs sage.libs.singular
        (True, (1/2 : 1 : 0))

    [Python]

        >>> from sage.all import *
        >>> K = QQ['t']; (t,) = K._first_ngens(1)
        >>> C = Conic([Integer(4), -Integer(4), Integer(8), Integer(1), -Integer(4), t + Integer(4)])
        >>> C.has_rational_point(point=True)                                      # needs sage.libs.singular
        (True, (1/2 : 1 : 0))

    If no point exists output still depends on the argument `point`:

    Sage

        sage: K.<t> = QQ[]
        sage: C = Conic(K, [t^2, (t-1), -2*(t-1)])
        sage: C.has_rational_point()                                                # needs sage.libs.singular
        False
        sage: C.has_rational_point(point=True)                                      # needs sage.libs.singular
        (False, None)

    Python

        >>> from sage.all import *
        >>> K = QQ['t']; (t,) = K._first_ngens(1)
        >>> C = Conic(K, [t**Integer(2), (t-Integer(1)), -Integer(2)*(t-Integer(1))])
        >>> C.has_rational_point()                                                # needs sage.libs.singular
        False
        >>> C.has_rational_point(point=True)                                      # needs sage.libs.singular
        (False, None)

    Due to limitations in Sage of algorithms we depend on, it is not yet possible to find points on conics over multivariate function fields (see the requirements above):

    Sage

        sage: F.<t1> = FractionField(QQ['t1'])
        sage: K.<t2> = FractionField(F['t2'])
        sage: a = K(1)
        sage: b = 2*t2^2 + 2*t1*t2 - t1^2
        sage: c = -3*t2^4 - 4*t1*t2^3 + 8*t1^2*t2^2 + 16*t1^3 - t2 - 48*t1^4
        sage: C = Conic([a,b,c])
        sage: C.has_rational_point()                                                # needs sage.libs.singular
        Traceback (most recent call last):
        ...
        NotImplementedError: is_square() not implemented for elements of
        Univariate Quotient Polynomial Ring in tbar over Fraction Field
        of Univariate Polynomial Ring in t1 over Rational Field with
        modulus tbar^2 + t1*tbar - 1/2*t1^2

    [Python]

        >>> from sage.all import *
        >>> F = FractionField(QQ['t1'], names=('t1',)); (t1,) = F._first_ngens(1)
        >>> K = FractionField(F['t2'], names=('t2',)); (t2,) = K._first_ngens(1)
        >>> a = K(Integer(1))
        >>> b = Integer(2)*t2**Integer(2) + Integer(2)*t1*t2 - t1**Integer(2)
        >>> c = -Integer(3)*t2**Integer(4) - Integer(4)*t1*t2**Integer(3) + Integer(8)*t1**Integer(2)*t2**Integer(2) + Integer(16)*t1**Integer(3) - t2 - Integer(48)*t1**Integer(4)
        >>> C = Conic([a,b,c])
        >>> C.has_rational_point()                                                # needs sage.libs.singular
        Traceback (most recent call last):
        ...
        NotImplementedError: is_square() not implemented for elements of
        Univariate Quotient Polynomial Ring in tbar over Fraction Field
        of Univariate Polynomial Ring in t1 over Rational Field with
        modulus tbar^2 + t1*tbar - 1/2*t1^2

    In some cases, the algorithm requires us to be able to solve conics over \(F\). In particular, the following does not work:

    Sage

        sage: P.<u> = QQ[]
        sage: E = P.fraction_field()
        sage: Q.<Y> = E[]
        sage: F.<v> = E.extension(Y^2 - u^3 - 1)
        sage: R.<t> = F[]
        sage: K = R.fraction_field()                                                # needs sage.rings.function_field
        sage: C = Conic(K, [u, v, 1])                                               # needs sage.rings.function_field
        sage: C.has_rational_point()                                                # needs sage.rings.function_field
        Traceback (most recent call last):
        ...
        NotImplementedError: has_rational_point not implemented for conics
        over base field Univariate Quotient Polynomial Ring in v over
        Fraction Field of Univariate Polynomial Ring in u over Rational
        Field with modulus v^2 - u^3 - 1

    Python

        >>> from sage.all import *
        >>> P = QQ['u']; (u,) = P._first_ngens(1)
        >>> E = P.fraction_field()
        >>> Q = E['Y']; (Y,) = Q._first_ngens(1)
        >>> F = E.extension(Y**Integer(2) - u**Integer(3) - Integer(1), names=('v',)); (v,) = F._first_ngens(1)
        >>> R = F['t']; (t,) = R._first_ngens(1)
        >>> K = R.fraction_field()                                                # needs sage.rings.function_field
        >>> C = Conic(K, [u, v, Integer(1)])                                               # needs sage.rings.function_field
        >>> C.has_rational_point()                                                # needs sage.rings.function_field
        Traceback (most recent call last):
        ...
        NotImplementedError: has_rational_point not implemented for conics
        over base field Univariate Quotient Polynomial Ring in v over
        Fraction Field of Univariate Polynomial Ring in u over Rational
        Field with modulus v^2 - u^3 - 1