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
K = FractionField(PolynomialRing(QQ, 't'))
P.<X, Y, Z> = K[]
Conic(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))
K.<t> = FractionField(QQ['t'])
C = Conic([1, -t, t])
C.has_rational_point(point=True)                                              # needs sage.libs.singular
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
K = FractionField(PolynomialRing(QQ, 't'))
P.<X, Y, Z> = K[]
Conic(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))
K.<t> = FractionField(QQ['t'])
C = Conic(K, [t^2 - 2, 2*t^3, -2*t^3 - 13*t^2 - 2*t + 18])
C.has_rational_point(point=True)  # indirect test                     # needs sage.libs.singular

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)
# needs sage.rings.number_field
K.<t> = PolynomialRing(QQ, 't')
C = Conic(K, [t^2 - 2, 2*t, -2*t^3 - 13*t^2 - 2*t + 18])
supp = [[t^2 - 2], [t], [t^3 + 13/2*t^2 + t - 9]]
tbar1 = QQ.extension(supp[0][0], 'tbar').gens()[0]
tbar2 = QQ.extension(supp[1][0], 'tbar').gens()[0]
tbar3 = QQ.extension(supp[2][0], 'tbar').gens()[0]
roots = [[tbar1 + 1], [1/3*tbar2^0], [2/3*tbar3^2 + 11/3*tbar3 - 3]]
C.find_point(supp, roots, 1)
roots = [[-tbar1 - 1], [-1/3*tbar2^0], [-2/3*tbar3^2 - 11/3*tbar3 + 3]]
C.find_point(supp, roots, 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))
K.<t> = FractionField(PolynomialRing(QQ, 't'))
C = Conic(K, [t^2 - 2, 2*t^3, -2*t^3 - 13*t^2 - 2*t + 18])
C.has_rational_point(point=True)                                      # needs sage.libs.singular
R.<t> = FiniteField(23)[]
C = Conic([2, t^2 + 1, t^2 + 5])
C.has_rational_point()                                                # needs sage.libs.singular
C.has_rational_point(point=True)                                      # needs sage.libs.singular
# needs sage.rings.number_field
F.<i> = QuadraticField(-1)
R.<t> = F[]
C = Conic([1, i*t, -t^2 + 4])
C.has_rational_point(point=True)                                      # needs sage.libs.singular

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))
K.<t> = QQ[]
C = Conic([4, -4, 8, 1, -4, t + 4])
C.has_rational_point(point=True)                                      # needs sage.libs.singular

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)
K.<t> = QQ[]
C = Conic(K, [t^2, (t-1), -2*(t-1)])
C.has_rational_point()                                                # needs sage.libs.singular
C.has_rational_point(point=True)                                      # needs sage.libs.singular

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
F.<t1> = FractionField(QQ['t1'])
K.<t2> = FractionField(F['t2'])
a = K(1)
b = 2*t2^2 + 2*t1*t2 - t1^2
c = -3*t2^4 - 4*t1*t2^3 + 8*t1^2*t2^2 + 16*t1^3 - t2 - 48*t1^4
C = Conic([a,b,c])
C.has_rational_point()                                                # needs sage.libs.singular

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
P.<u> = QQ[]
E = P.fraction_field()
Q.<Y> = E[]
F.<v> = E.extension(Y^2 - u^3 - 1)
R.<t> = F[]
K = R.fraction_field()                                                # needs sage.rings.function_field
C = Conic(K, [u, v, 1])                                               # needs sage.rings.function_field
C.has_rational_point()                                                # needs sage.rings.function_field