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

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)
(True, (0 : 1 : 1))
class sage.schemes.plane_conics.con_rational_function_field.ProjectiveConic_rational_function_field(A, f)

Bases: sage.schemes.plane_conics.con_field.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

REFERENCES:

[HC2006](1, 2, 3, 4, 5, 6, 7) Mark van Hoeij and John Cremona, Solving Conics over function fields. J. Théor. Nombres Bordeaux, 2006.
[ACKERMANS2016]Lennart Ackermans, Oplosbaarheid van Kegelsneden. http://www.math.leidenuniv.nl/nl/theses/Bachelor/.
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 [ACKERMANS2016].

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
(True, (-3 : (t + 1)/t : 1))

Different solubility certificates give different points:

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)
has_rational_point(point=False, algorithm='default', read_cache=True)

Returns 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)
(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()
True
sage: C.has_rational_point(point=True)
(True, (5*t : 8 : 1))
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)
(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)
(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()
False
sage: C.has_rational_point(point=True)
(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()
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()
sage: C = Conic(K, [u, v, 1])
sage: C.has_rational_point()
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

has_rational_point fails for some conics over function fields over finite fields, due to trac ticket #20003:

sage: K.<t> = PolynomialRing(GF(7))
sage: C = Conic([5*t^2+4, t^2+3*t+3, 6*t^2+3*t+2, 5*t^2+5, 4*t+3, 4*t^2+t+5])
sage: C.has_rational_point()
Traceback (most recent call last):
...
TypeError: self (=Scheme morphism:
  From: Projective Conic Curve over Fraction Field of Univariate Polynomial Ring in t over Finite Field of size 7 defined by (5*t^2 + 4)*x^2 + ((6*t^3 + 3*t^2 + 5*t + 5)/(t + 3))*y^2 + ((6*t^6 + 3*t^5 + t^3 + 6*t^2 + 6*t + 2)/(t^4 + t^3 + 4*t^2 + 3*t + 1))*z^2
  To:   Projective Conic Curve over Fraction Field of Univariate Polynomial Ring in t over Finite Field of size 7 defined by (5*t^2 + 4)*x^2 + (t^2 + 3*t + 3)*x*y + (5*t^2 + 5)*y^2 + (6*t^2 + 3*t + 2)*x*z + (4*t + 3)*y*z + (4*t^2 + t + 5)*z^2
  Defn: Defined on coordinates by sending (x : y : z) to
        (x + ((2*t + 5)/(t + 3))*y + ((3*t^4 + 2*t^3 + 5*t^2 + 5*t + 3)/(t^4 + t^3 + 4*t^2 + 3*t + 1))*z : y + ((6*t^3 + 6*t^2 + 3*t + 6)/(t^3 + 4*t^2 + 2*t + 2))*z : z)) domain must equal right (=Scheme morphism:
  From: Projective Conic Curve over Fraction Field of Univariate Polynomial Ring in t over Finite Field of size 7 defined by (5*t^3 + 6*t^2 + 3*t + 3)*x^2 + (t + 4)*y^2 + (6*t^7 + 2*t^5 + t^4 + 2*t^3 + 3*t^2 + 6*t + 6)*z^2
  To:   Projective Conic Curve over Fraction Field of Univariate Polynomial Ring in t over Finite Field of size 7 defined by (5/(t^3 + 4*t^2 + 2*t + 2))*x^2 + (1/(t^3 + 3*t^2 + 5*t + 1))*y^2 + ((6*t^6 + 3*t^5 + t^3 + 6*t^2 + 6*t + 2)/(t^9 + 5*t^8 + t^7 + 6*t^6 + 3*t^5 + 4*t^3 + t^2 + 5*t + 3))*z^2
  Defn: Defined on coordinates by sending (x : y : z) to
        ((t^3 + 4*t^2 + 2*t + 2)*x : (t^2 + 5)*y : (t^5 + 4*t^4 + t^2 + 3*t + 3)*z)) codomain