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: 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
>>> 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: 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))
>>> 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)[source]

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: 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
>>> 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:

find_point(supports, roots, case, solution=0)[source]

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: 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))
>>> 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: # 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)
>>> 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)[source]

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: 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))
>>> 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: 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))
>>> 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: 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)
>>> 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: 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
>>> 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: 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
>>> 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