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- selfis 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 - Trueif and only if the conic- selfhas a point over its base field \(F(t)\), which is a field of rational functions.- If - pointis 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_cacheis 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 - algorithmspecifies 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