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