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
. Assumesself
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 formsupports
– 3-tuple wheresupports[i]
is a list of all monic irreducible \(p \in F[t]\) that divide the \(i\)-th of the 3 coefficientsroots
– 3-tuple containing lists of roots of all elements ofsupports[i]
, in the same ordercase
– 1 or 0, as in [HC2006]solution
– (default: 0) a solution of (5) in [HC2006], ifcase
= 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 conicself
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