Enumeration of rational points on projective schemes#
Naive algorithms for enumerating rational points over \(\QQ\) or finite fields over for general schemes.
Warning
Incorrect results and infinite loops may occur if using a wrong function. (For instance using an affine function for a projective scheme or a finite field function for a scheme defined over an infinite field.)
EXAMPLES:
Projective, over \(\QQ\):
sage: from sage.schemes.projective.projective_rational_point import enum_projective_rational_field
sage: P.<X,Y,Z> = ProjectiveSpace(2,QQ)
sage: C = P.subscheme([X+Y-Z])
sage: enum_projective_rational_field(C, 3)
[(-2 : 3 : 1), (-1 : 1 : 0), (-1 : 2 : 1), (-1/2 : 3/2 : 1),
(0 : 1 : 1), (1/3 : 2/3 : 1), (1/2 : 1/2 : 1), (2/3 : 1/3 : 1),
(1 : 0 : 1), (3/2 : -1/2 : 1), (2 : -1 : 1), (3 : -2 : 1)]
Projective over a finite field:
sage: from sage.schemes.projective.projective_rational_point import enum_projective_finite_field
sage: E = EllipticCurve('72').change_ring(GF(19))
sage: enum_projective_finite_field(E)
[(0 : 1 : 0), (1 : 0 : 1), (3 : 0 : 1), (4 : 9 : 1), (4 : 10 : 1),
(6 : 6 : 1), (6 : 13 : 1), (7 : 6 : 1), (7 : 13 : 1), (9 : 4 : 1),
(9 : 15 : 1), (12 : 8 : 1), (12 : 11 : 1), (13 : 8 : 1), (13 : 11 : 1),
(14 : 3 : 1), (14 : 16 : 1), (15 : 0 : 1), (16 : 9 : 1), (16 : 10 : 1),
(17 : 7 : 1), (17 : 12 : 1), (18 : 9 : 1), (18 : 10 : 1)]
AUTHORS:
David R. Kohel <kohel@maths.usyd.edu.au>: original version.
John Cremona and Charlie Turner <charlotteturner@gmail.com> (06-2010): improvements to clarity and documentation.
Raghukul Raman <raghukul.raman01@gmail.com> (2018): Added sieve algorithm
- sage.schemes.projective.projective_rational_point.enum_projective_finite_field(X)#
Enumerates projective points on scheme
X
defined over a finite field.INPUT:
X
- a scheme defined over a finite field or a set of abstract rational points of such a scheme.
OUTPUT:
a list containing the projective points of
X
over the finite field, sorted.
EXAMPLES:
sage: F = GF(53) sage: P.<X,Y,Z> = ProjectiveSpace(2,F) sage: from sage.schemes.projective.projective_rational_point import enum_projective_finite_field sage: len(enum_projective_finite_field(P(F))) 2863 sage: 53^2+53+1 2863
sage: F = GF(9,'a') sage: P.<X,Y,Z> = ProjectiveSpace(2,F) sage: C = Curve(X^3-Y^3+Z^2*Y) sage: enum_projective_finite_field(C(F)) [(0 : 0 : 1), (0 : 1 : 1), (0 : 2 : 1), (1 : 1 : 0), (a + 1 : 2*a : 1), (a + 1 : 2*a + 1 : 1), (a + 1 : 2*a + 2 : 1), (2*a + 2 : a : 1), (2*a + 2 : a + 1 : 1), (2*a + 2 : a + 2 : 1)]
sage: F = GF(5) sage: P2F.<X,Y,Z> = ProjectiveSpace(2,F) sage: enum_projective_finite_field(P2F) [(0 : 0 : 1), (0 : 1 : 0), (0 : 1 : 1), (0 : 2 : 1), (0 : 3 : 1), (0 : 4 : 1), (1 : 0 : 0), (1 : 0 : 1), (1 : 1 : 0), (1 : 1 : 1), (1 : 2 : 1), (1 : 3 : 1), (1 : 4 : 1), (2 : 0 : 1), (2 : 1 : 0), (2 : 1 : 1), (2 : 2 : 1), (2 : 3 : 1), (2 : 4 : 1), (3 : 0 : 1), (3 : 1 : 0), (3 : 1 : 1), (3 : 2 : 1), (3 : 3 : 1), (3 : 4 : 1), (4 : 0 : 1), (4 : 1 : 0), (4 : 1 : 1), (4 : 2 : 1), (4 : 3 : 1), (4 : 4 : 1)]
ALGORITHM:
Checks all points in projective space to see if they lie on
X
.Warning
If
X
is defined over an infinite field, this code will not finish!AUTHORS:
John Cremona and Charlie Turner (06-2010).
- sage.schemes.projective.projective_rational_point.enum_projective_number_field(X, **kwds)#
Enumerates projective points on scheme
X
defined over a number field.Simply checks all of the points of absolute height of at most
B
and adds those that are on the scheme to the list.This algorithm computes 2 lists: L containing elements x in \(K\) such that H_k(x) <= B, and a list L’ containing elements x in \(K\) that, due to floating point issues, may be slightly larger then the bound. This can be controlled by lowering the tolerance.
ALGORITHM:
This is an implementation of the revised algorithm (Algorithm 4) in [DK2013]. Algorithm 5 is used for imaginary quadratic fields.
INPUT:
kwds:
bound
- a real numbertolerance
- a rational number in (0,1] used in doyle-krumm algorithm-4precision
- the precision to use for computing the elements of bounded height of number fields.
OUTPUT:
a list containing the projective points of
X
of absolute height up toB
, sorted.
EXAMPLES:
sage: from sage.schemes.projective.projective_rational_point import enum_projective_number_field sage: u = QQ['u'].0 sage: K = NumberField(u^3 - 5,'v') sage: P.<x,y,z> = ProjectiveSpace(K, 2) sage: X = P.subscheme([x - y]) sage: enum_projective_number_field(X(K), bound=RR(5^(1/3)), prec=2^10) [(0 : 0 : 1), (1 : 1 : 0), (-1 : -1 : 1), (1 : 1 : 1)]
sage: u = QQ['u'].0 sage: K = NumberField(u^2 + 3, 'v') sage: A.<x,y> = ProjectiveSpace(K,1) sage: X = A.subscheme(x-y) sage: from sage.schemes.projective.projective_rational_point import enum_projective_number_field sage: enum_projective_number_field(X, bound=2) [(1 : 1)]
- sage.schemes.projective.projective_rational_point.enum_projective_rational_field(X, B)#
Enumerates projective, rational points on scheme
X
of height up to boundB
.INPUT:
X
- a scheme or set of abstract rational points of a scheme.B
- a positive integer bound.
OUTPUT:
a list containing the projective points of
X
of height up toB
, sorted.
EXAMPLES:
sage: P.<X,Y,Z> = ProjectiveSpace(2, QQ) sage: C = P.subscheme([X+Y-Z]) sage: from sage.schemes.projective.projective_rational_point import enum_projective_rational_field sage: enum_projective_rational_field(C(QQ), 6) [(-5 : 6 : 1), (-4 : 5 : 1), (-3 : 4 : 1), (-2 : 3 : 1), (-3/2 : 5/2 : 1), (-1 : 1 : 0), (-1 : 2 : 1), (-2/3 : 5/3 : 1), (-1/2 : 3/2 : 1), (-1/3 : 4/3 : 1), (-1/4 : 5/4 : 1), (-1/5 : 6/5 : 1), (0 : 1 : 1), (1/6 : 5/6 : 1), (1/5 : 4/5 : 1), (1/4 : 3/4 : 1), (1/3 : 2/3 : 1), (2/5 : 3/5 : 1), (1/2 : 1/2 : 1), (3/5 : 2/5 : 1), (2/3 : 1/3 : 1), (3/4 : 1/4 : 1), (4/5 : 1/5 : 1), (5/6 : 1/6 : 1), (1 : 0 : 1), (6/5 : -1/5 : 1), (5/4 : -1/4 : 1), (4/3 : -1/3 : 1), (3/2 : -1/2 : 1), (5/3 : -2/3 : 1), (2 : -1 : 1), (5/2 : -3/2 : 1), (3 : -2 : 1), (4 : -3 : 1), (5 : -4 : 1), (6 : -5 : 1)] sage: enum_projective_rational_field(C,6) == enum_projective_rational_field(C(QQ),6) True
sage: P3.<W,X,Y,Z> = ProjectiveSpace(3, QQ) sage: enum_projective_rational_field(P3, 1) [(-1 : -1 : -1 : 1), (-1 : -1 : 0 : 1), (-1 : -1 : 1 : 0), (-1 : -1 : 1 : 1), (-1 : 0 : -1 : 1), (-1 : 0 : 0 : 1), (-1 : 0 : 1 : 0), (-1 : 0 : 1 : 1), (-1 : 1 : -1 : 1), (-1 : 1 : 0 : 0), (-1 : 1 : 0 : 1), (-1 : 1 : 1 : 0), (-1 : 1 : 1 : 1), (0 : -1 : -1 : 1), (0 : -1 : 0 : 1), (0 : -1 : 1 : 0), (0 : -1 : 1 : 1), (0 : 0 : -1 : 1), (0 : 0 : 0 : 1), (0 : 0 : 1 : 0), (0 : 0 : 1 : 1), (0 : 1 : -1 : 1), (0 : 1 : 0 : 0), (0 : 1 : 0 : 1), (0 : 1 : 1 : 0), (0 : 1 : 1 : 1), (1 : -1 : -1 : 1), (1 : -1 : 0 : 1), (1 : -1 : 1 : 0), (1 : -1 : 1 : 1), (1 : 0 : -1 : 1), (1 : 0 : 0 : 0), (1 : 0 : 0 : 1), (1 : 0 : 1 : 0), (1 : 0 : 1 : 1), (1 : 1 : -1 : 1), (1 : 1 : 0 : 0), (1 : 1 : 0 : 1), (1 : 1 : 1 : 0), (1 : 1 : 1 : 1)]
ALGORITHM:
We just check all possible projective points in correct dimension of projective space to see if they lie on
X
.AUTHORS:
John Cremona and Charlie Turner (06-2010)
- sage.schemes.projective.projective_rational_point.sieve(X, bound)#
Returns the list of all projective, rational points on scheme
X
of height up tobound
.Height of a projective point X = (x_1, x_2,…, x_n) is given by H_X = max(y_1, y_2,…, y_n), where H_X is height of point X and y_i’s are the normalized coordinates such that all y_i are integers and gcd(y_1, y_2,…, y_n) = 1.
ALGORITHM:
Main idea behind the algorithm is to find points modulo primes and then reconstruct them using chinese remainder theorem. We find modulo primes parallelly and then lift them and apply LLL in parallel.
For the algorithm to work correctly, sufficient primes need to be present, these are calculated using the bound given in this([Hutz2015]) paper.
INPUT:
X
- a scheme with ambient space defined over projective spacebound
- a positive integer bound
OUTPUT:
a list containing the projective rational points of
X
of height up tobound
, sorted
EXAMPLES:
sage: from sage.schemes.projective.projective_rational_point import sieve sage: P.<x,y,z,q>=ProjectiveSpace(QQ,3) sage: Y=P.subscheme([x^2-3^2*y^2+z*q,x+z+4*q]) sage: sorted(sieve(Y, 12)) # long time [(-4 : -4/3 : 0 : 1), (-4 : 4/3 : 0 : 1), (-1 : -1/3 : 1 : 0), (-1 : 1/3 : 1 : 0)]
sage: from sage.schemes.projective.projective_rational_point import sieve sage: E = EllipticCurve('37a') sage: sorted(sieve(E, 14)) # long time [(-1 : -1 : 1), (-1 : 0 : 1), (0 : -1 : 1), (0 : 0 : 1), (0 : 1 : 0), (1/4 : -5/8 : 1), (1/4 : -3/8 : 1), (1 : -1 : 1), (1 : 0 : 1), (2 : -3 : 1), (2 : 2 : 1), (6 : 14 : 1)]