Projective plane conics over a number field

AUTHORS:

  • Marco Streng (2010-07-20)

class sage.schemes.plane_conics.con_number_field.ProjectiveConic_number_field(A, f)[source]

Bases: ProjectiveConic_field

Create a projective plane conic curve over a number field. See Conic for full documentation.

EXAMPLES:

sage: K.<a> = NumberField(x^3 - 2, 'a')
sage: P.<X, Y, Z> = K[]
sage: Conic(X^2 + Y^2 - a*Z^2)
Projective Conic Curve over Number Field in a with defining polynomial x^3 - 2
 defined by X^2 + Y^2 + (-a)*Z^2
>>> from sage.all import *
>>> K = NumberField(x**Integer(3) - Integer(2), 'a', names=('a',)); (a,) = K._first_ngens(1)
>>> P = K['X, Y, Z']; (X, Y, Z,) = P._first_ngens(3)
>>> Conic(X**Integer(2) + Y**Integer(2) - a*Z**Integer(2))
Projective Conic Curve over Number Field in a with defining polynomial x^3 - 2
 defined by X^2 + Y^2 + (-a)*Z^2
K.<a> = NumberField(x^3 - 2, 'a')
P.<X, Y, Z> = K[]
Conic(X^2 + Y^2 - a*Z^2)
has_rational_point(point=False, obstruction=False, algorithm='default', read_cache=True)[source]

Return True if and only if self has a point defined over its base field \(B\).

If point and obstruction are both False (default), then the output is a boolean out saying whether self has a rational point.

If point or obstruction is True, then the output is a pair (out, S), where out is as above and:

  • if point is True and self has a rational point, then S is a rational point,

  • if obstruction is True, self has no rational point, then S is a prime or infinite place of \(B\) such that no rational point exists over the completion at S.

Points and obstructions are cached whenever they are found. Cached information is used for the output if available, but only if read_cache is True.

ALGORITHM:

The parameter algorithm specifies the algorithm to be used:

  • 'rnfisnorm' – use PARI’s rnfisnorm (cannot be combined with obstruction = True)

  • 'local' – check if a local solution exists for all primes and infinite places of \(B\) and apply the Hasse principle (cannot be combined with point = True)

  • 'default' – use algorithm 'rnfisnorm' first. Then, if no point exists and obstructions are requested, use algorithm 'local' to find an obstruction.

  • 'magma' (requires Magma to be installed) – delegates the task to the Magma computer algebra system

EXAMPLES:

An example over \(\QQ\)

sage: C = Conic(QQ, [1, 113922743, -310146482690273725409])
sage: C.has_rational_point(point=True)
(True, (-76842858034579/5424 : -5316144401/5424 : 1))
sage: C.has_rational_point(algorithm='local', read_cache=False)
True
>>> from sage.all import *
>>> C = Conic(QQ, [Integer(1), Integer(113922743), -Integer(310146482690273725409)])
>>> C.has_rational_point(point=True)
(True, (-76842858034579/5424 : -5316144401/5424 : 1))
>>> C.has_rational_point(algorithm='local', read_cache=False)
True
C = Conic(QQ, [1, 113922743, -310146482690273725409])
C.has_rational_point(point=True)
C.has_rational_point(algorithm='local', read_cache=False)

Examples over number fields:

sage: K.<i> = QuadraticField(-1)
sage: C = Conic(K, [1, 3, -5])
sage: C.has_rational_point(point=True, obstruction=True)
(False, Fractional ideal (-i - 2))
sage: C.has_rational_point(algorithm='rnfisnorm')
False
sage: C.has_rational_point(algorithm='rnfisnorm', obstruction=True,
....:                      read_cache=False)
Traceback (most recent call last):
...
ValueError: Algorithm rnfisnorm cannot be combined with
obstruction = True in has_rational_point

sage: P.<x> = QQ[]
sage: L.<b> = NumberField(x^3 - 5)
sage: C = Conic(L, [1, 2, -3])
sage: C.has_rational_point(point=True, algorithm='rnfisnorm')
(True, (5/3 : -1/3 : 1))

sage: K.<a> = NumberField(x^4+2)
sage: Conic(QQ, [4,5,6]).has_rational_point()
False
sage: Conic(K, [4,5,6]).has_rational_point()
True
sage: Conic(K, [4,5,6]).has_rational_point(algorithm='magma',   # optional - magma
....:                                      read_cache=False)
True

sage: P.<a> = QuadraticField(2)
sage: C = Conic(P, [1,1,1])
sage: C.has_rational_point()
False
sage: C.has_rational_point(point=True)
(False, None)
sage: C.has_rational_point(obstruction=True)
(False,
 Ring morphism:
   From: Number Field in a with defining polynomial x^2 - 2
         with a = 1.414213562373095?
   To:   Algebraic Real Field
   Defn: a |--> -1.414213562373095?)
sage: C.has_rational_point(point=True, obstruction=True)
(False,
 Ring morphism:
   From: Number Field in a with defining polynomial x^2 - 2
         with a = 1.414213562373095?
   To:   Algebraic Real Field
   Defn: a |--> -1.414213562373095?)
>>> from sage.all import *
>>> K = QuadraticField(-Integer(1), names=('i',)); (i,) = K._first_ngens(1)
>>> C = Conic(K, [Integer(1), Integer(3), -Integer(5)])
>>> C.has_rational_point(point=True, obstruction=True)
(False, Fractional ideal (-i - 2))
>>> C.has_rational_point(algorithm='rnfisnorm')
False
>>> C.has_rational_point(algorithm='rnfisnorm', obstruction=True,
...                      read_cache=False)
Traceback (most recent call last):
...
ValueError: Algorithm rnfisnorm cannot be combined with
obstruction = True in has_rational_point

>>> P = QQ['x']; (x,) = P._first_ngens(1)
>>> L = NumberField(x**Integer(3) - Integer(5), names=('b',)); (b,) = L._first_ngens(1)
>>> C = Conic(L, [Integer(1), Integer(2), -Integer(3)])
>>> C.has_rational_point(point=True, algorithm='rnfisnorm')
(True, (5/3 : -1/3 : 1))

>>> K = NumberField(x**Integer(4)+Integer(2), names=('a',)); (a,) = K._first_ngens(1)
>>> Conic(QQ, [Integer(4),Integer(5),Integer(6)]).has_rational_point()
False
>>> Conic(K, [Integer(4),Integer(5),Integer(6)]).has_rational_point()
True
>>> Conic(K, [Integer(4),Integer(5),Integer(6)]).has_rational_point(algorithm='magma',   # optional - magma
...                                      read_cache=False)
True

>>> P = QuadraticField(Integer(2), names=('a',)); (a,) = P._first_ngens(1)
>>> C = Conic(P, [Integer(1),Integer(1),Integer(1)])
>>> C.has_rational_point()
False
>>> C.has_rational_point(point=True)
(False, None)
>>> C.has_rational_point(obstruction=True)
(False,
 Ring morphism:
   From: Number Field in a with defining polynomial x^2 - 2
         with a = 1.414213562373095?
   To:   Algebraic Real Field
   Defn: a |--> -1.414213562373095?)
>>> C.has_rational_point(point=True, obstruction=True)
(False,
 Ring morphism:
   From: Number Field in a with defining polynomial x^2 - 2
         with a = 1.414213562373095?
   To:   Algebraic Real Field
   Defn: a |--> -1.414213562373095?)
K.<i> = QuadraticField(-1)
C = Conic(K, [1, 3, -5])
C.has_rational_point(point=True, obstruction=True)
C.has_rational_point(algorithm='rnfisnorm')
C.has_rational_point(algorithm='rnfisnorm', obstruction=True,
                     read_cache=False)
P.<x> = QQ[]
L.<b> = NumberField(x^3 - 5)
C = Conic(L, [1, 2, -3])
C.has_rational_point(point=True, algorithm='rnfisnorm')
K.<a> = NumberField(x^4+2)
Conic(QQ, [4,5,6]).has_rational_point()
Conic(K, [4,5,6]).has_rational_point()
Conic(K, [4,5,6]).has_rational_point(algorithm='magma',   # optional - magma
                                     read_cache=False)
P.<a> = QuadraticField(2)
C = Conic(P, [1,1,1])
C.has_rational_point()
C.has_rational_point(point=True)
C.has_rational_point(obstruction=True)
C.has_rational_point(point=True, obstruction=True)
is_locally_solvable(p)[source]

Return True if and only if self has a solution over the completion of the base field \(B\) of self at p. Here p is a finite prime or infinite place of \(B\).

EXAMPLES:

sage: P.<x> = QQ[]
sage: K.<a> = NumberField(x^3 + 5)
sage: C = Conic(K, [1, 2, 3 - a])
sage: [p1, p2] = K.places()
sage: C.is_locally_solvable(p1)
False

sage: C.is_locally_solvable(p2)
True

sage: f = (2*K).factor()
sage: C.is_locally_solvable(f[0][0])
True

sage: C.is_locally_solvable(f[1][0])
False
>>> from sage.all import *
>>> P = QQ['x']; (x,) = P._first_ngens(1)
>>> K = NumberField(x**Integer(3) + Integer(5), names=('a',)); (a,) = K._first_ngens(1)
>>> C = Conic(K, [Integer(1), Integer(2), Integer(3) - a])
>>> [p1, p2] = K.places()
>>> C.is_locally_solvable(p1)
False

>>> C.is_locally_solvable(p2)
True

>>> f = (Integer(2)*K).factor()
>>> C.is_locally_solvable(f[Integer(0)][Integer(0)])
True

>>> C.is_locally_solvable(f[Integer(1)][Integer(0)])
False
P.<x> = QQ[]
K.<a> = NumberField(x^3 + 5)
C = Conic(K, [1, 2, 3 - a])
[p1, p2] = K.places()
C.is_locally_solvable(p1)
C.is_locally_solvable(p2)
f = (2*K).factor()
C.is_locally_solvable(f[0][0])
C.is_locally_solvable(f[1][0])
local_obstructions(finite=True, infinite=True, read_cache=True)[source]

Return the sequence of finite primes and/or infinite places such that self is locally solvable at those primes and places.

If the base field is \(\QQ\), then the infinite place is denoted \(-1\).

The parameters finite and infinite (both True by default) are used to specify whether to look at finite and/or infinite places. Note that finite = True involves factorization of the determinant of self, hence may be slow.

Local obstructions are cached. The parameter read_cache specifies whether to look at the cache before computing anything.

EXAMPLES:

sage: K.<i> = QuadraticField(-1)
sage: Conic(K, [1, 2, 3]).local_obstructions()
[]

sage: L.<a> = QuadraticField(5)
sage: Conic(L, [1, 2, 3]).local_obstructions()
[Ring morphism:
   From: Number Field in a with defining polynomial x^2 - 5
         with a = 2.236067977499790?
   To:   Algebraic Real Field
   Defn: a |--> -2.236067977499790?,
 Ring morphism:
   From: Number Field in a with defining polynomial x^2 - 5
         with a = 2.236067977499790?
   To:   Algebraic Real Field
   Defn: a |--> 2.236067977499790?]
>>> from sage.all import *
>>> K = QuadraticField(-Integer(1), names=('i',)); (i,) = K._first_ngens(1)
>>> Conic(K, [Integer(1), Integer(2), Integer(3)]).local_obstructions()
[]

>>> L = QuadraticField(Integer(5), names=('a',)); (a,) = L._first_ngens(1)
>>> Conic(L, [Integer(1), Integer(2), Integer(3)]).local_obstructions()
[Ring morphism:
   From: Number Field in a with defining polynomial x^2 - 5
         with a = 2.236067977499790?
   To:   Algebraic Real Field
   Defn: a |--> -2.236067977499790?,
 Ring morphism:
   From: Number Field in a with defining polynomial x^2 - 5
         with a = 2.236067977499790?
   To:   Algebraic Real Field
   Defn: a |--> 2.236067977499790?]
K.<i> = QuadraticField(-1)
Conic(K, [1, 2, 3]).local_obstructions()
L.<a> = QuadraticField(5)
Conic(L, [1, 2, 3]).local_obstructions()