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 P and Q is given by the first, “adding points”, operation Algorithm 15.5.1. That is, you connect P and Q by a secant line of slope m, and then connect the identity to a fourth point P+Q with a line of slope m. Adding a point P to itself uses the slope of the tangent line at P, the second, “doubling points”, operation in Algorithm 15.5.1.
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 equation x2−2y2=1 was studied by Greeks such as Theon of Smyrna (though not in this generality) to shed light on √2. Why would solutions to this equation help? Well, imagine that (x,y) fulfill the equation. Then divide and rearrange the original equation to getxxxxxxxxxx
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 (3,2)? (See Algorithm 15.5.1.) Then we take that slope, and make a new line through the “base” point (in this case, (1,0)).
Then the next point we get is (17,12). (See Exercise 15.7.14.) Indeed, 172−2⋅122=1 and 17/12≈1.417, already correct to three significant digits. Those Greeks!