Section 15.5 Making More and More and More Points
Algorithm 15.5.1. Getting New Rational Points.
Two ways to obtain new rational points on a conic from rational points you already have are:
Connect two points with a secant line, and then make a line with the same slope but through another (rational) point. We call this adding points.
Find the tangent line through a point, and then make a line with the same slope but through another point. We call this doubling a point.
Fact 15.5.2.
The set of rational points on a conic section is an Abelian group. Assuming you have a point selected as an identity element, the group operation on two points
Subsection 15.5.1 Toward integer points
More germane to our investigation, our limited experience in the previous section suggests these processes may often give you integer points. This is not a coincidence; in general, we should try to add or double points to get (new) integer points. As we are only guaranteed rational points, this doesn't always work. Below, I try this on the ellipse from the beginning of Section 15.4.


xxxxxxxxxx
d=2
var('x,y')
def _(x_0=3,y_0=2,lattice=False,auto_update=False):
g(x,y)=x^2-d*y^2
x_1,y_1=x_0^2+2*y_0^2,2*x_0*y_0
plot1 = implicit_plot(g-1,(x_0-4,x_1+4),(x_0-4,x_1+4), plot_points = 200)
grid_pts = [[i,j] for i in [x_0-4..x_1+4] for j in [x_0-4..x_1+4]]
plot_grid_pts = points(grid_pts, rgbcolor=(0,0,0), pointsize=2)
lattice_pts = [coords for coords in grid_pts if (coords[0]^2-d*coords[1]^2==1)]
plot_lattice_pts = points(lattice_pts, rgbcolor = (0,0,1),pointsize=20)
line1 = plot((x_0/(2*y_0))*(x-x_0)+y_0,x_0-4,x_1+4, color='red')
line2 = plot((x_0/(2*y_0))*(x-1),x_0-4,x_1+4, color='red', linestyle='--')
if lattice:
show(plot1 + plot_grid_pts + plot_lattice_pts + line1 + line2, figsize = [5,5], xmin = x_0-4, xmax = x_1+4, ymin = y_0-4, ymax = y_1+4, aspect_ratio=1)
else:
show(plot1+plot_lattice_pts+line1+line2, figsize = [5,5], xmin = x_0-4, xmax = x_1+4, ymin = y_0-4, ymax = y_1+4, aspect_ratio=1)
pretty_print(html("The new points are $x_1=%s$ and $y_1=%s$"%(x_1,y_1)))
Historical remark 15.5.6. Brahmagupta.
Brahmagupta is one of the earliest Indian mathematicians we have records from, though as was typical for mathematicians around the world for over a millennium, he was the head of an astronomical observatory. In addition to working on Pell's equation (see for example Wikipedia), we saw earlier the Brahmagupta-Fibonacci identity, and he also had prescient results in approximation and geometry.
Historical remark 15.5.7. Stigler's Law.
In the event, Pell did not have anything to do with these equations; it was all based on a misunderstanding. But names stick. In mathematics this phenomenon of not naming things after the actual discoverer is sometimes called Boyer's law, more generally Stigler's law of eponymy (which are themselves self-referential).
Subsection 15.5.2 A surprising application
The particular equationxxxxxxxxxx
var('x,y')
def _(viewsize=slider(10,20,1),d=2):
f(x,y)=x^2-d*y^2
plot1 = implicit_plot(f-1, (-viewsize,viewsize), (-viewsize,viewsize), plot_points = 200)
grid_pts = [[i,j] for i in [-viewsize..viewsize] for j in [-viewsize..viewsize]]
plot_grid_pts = points(grid_pts,rgbcolor=(0,0,0),pointsize=2)
lattice_pts = [coords for coords in grid_pts if (coords[0]^2-d*coords[1]^2==1)]
plot_lattice_pts = points(lattice_pts, rgbcolor = (0,0,1),pointsize=20)
show(plot1+plot_grid_pts+plot_lattice_pts, figsize = [5,5], xmin = -viewsize, xmax = viewsize, ymin = -viewsize, ymax = viewsize, aspect_ratio=1)
pretty_print(html("Points on the curve $x^2-%sy^2=1$"%d))
Example 15.5.8.
What if we double the point and take the tangent at
Then the next point we get is