elliptic_curve.mw

> # Introduction to elliptic curves
# A. Betten 12/4/05

# for M360 Colorado State University

> # start with a cubic polynomial with three real roots:

> f(x) := x * (x+1) * (x-1);

f(x) := x*(x+1)*(x-1)

> plot(f(x),x=-2..2);

[Plot]

> # now take the square root:

> plot(sqrt(f(x)),x=-2..2);

[Plot]

> # actually, we have two branches, the positive
# and the negative one. We get two components

> plot([sqrt(f(x)),-sqrt(f(x))],x=-2..2);

[Plot]

> # now a cubic with complex roots:

> g(x) := x^3 + 73;

g(x) := x^3+73

>

> plot(g(x),x=-5..5);

[Plot]

> # this time, we have only one component. In both cases,
# we say that we have a curve in the real x/y plane.

# the equation of the curve is

# y^2=g(x)

> plot([sqrt(g(x)),-sqrt(g(x))],x=-5..5);

[Plot]

> # save  the plot for future use.  

> C := plot([sqrt(g(x)),-sqrt(g(x))],x=-5..5):

> with(plottools):

> with(plots):

Warning, the previous binding of the name arrow has been removed and it now has an assigned value

> display(C);

[Plot]

> # there is a special command for plotting curves,
# it is implicitplot

> implicitplot(y^2-x^3-73,x=-5..5,y=-12..12);

[Plot]

> C := implicitplot(y^2-x^3-73,x=-5..5,y=-12..12):

> # x=3 gives y=9 (and y=-9), i.e. we have found
# an integral point on the curve

> P1 := pointplot({[2,9]});

P1 := INTERFACE_PLOT(POINTS([2., 9.]))

> display(C,P1);

[Plot]

> # BTW, such a curve is called elliptic curve.

> # x=3 gives y=10 (and -10), ie we have found another
# integral point
on the curve

> P2 := pointplot({[3,10]});

P2 := INTERFACE_PLOT(POINTS([3., 10.]))

> display(C,P1,P2);

[Plot]

> # Let's determine the line through the two points.
# Its equation is y = x+7

# check: plugging in 2 gives 9, plugging in 3 gives 10.

> L := plot(x+7,x=-5..5):

> display(C,P1,P2,L);

[Plot]

> # the line L intersects the curve in another point.

> solve(sqrt(g(x))-(x+7),x);

2, 3, -4

> # OK, the third point is at x=-4

> simplify(eval(sqrt(g(x)),x=-4));

3

> # that was a bit complicated, but the thrid
# integral point is

# P3 = (-4,3)

> P3 := pointplot({[-4,3]});

P3 := INTERFACE_PLOT(POINTS([-4., 3.]))

> display(C,L,P1,P2,P3);

[Plot]

> # the main point was that knowing two (integral)
# points on the curve

# enabled us to produce another (integral) point.

> # now comes a nice trick from algebraic geometry:
# we substitute x=X/Z and y = Y/Z into the

# equation of the curve to get

# Y^2/Z^2 = X^3/Z^3 + 73

# and hence

# Y^2Z = X^3 + 73Z^3

# this is an equation of a curve in 3 variables.

# The equation is homogeneous of degree 3.

# This means that whenever (X,Y,Z) is a solution,

# then also any non-zero scalar multiple

# (aX,aY,aZ) is a solution.

# In particular, we find that the points (x,y,1)

# are solutions, provided (x,y) was a solution

# to the original equation.

# In addition, there is the solution (0,1,0).

# We may think of the scalar multiples of (X,Y,Z)

# as being an entity, called a projective point.

# To express the fact that we consider scalar multiples,

# we write (X:Y:Z).

# The new points (X:Y:1) behave much like the old points,

# more precisely, they are in 1-1 correspondence.

# In addition, the curve has the new point (0:1:0),

# which we may imagine as sitting on top of the Y-axis.

# (and also at the very bottom of the Y-axis).

# We have just introduced the projective plane

# over the reals. It looks much like the ordinary

# (affine) plane except that it has points

# (X:Y:0) which we may imagine as sitting far out.

# We say that these are the points at infinity.

# So, projectively, the elliptic curve has one more

# point than it has in the affine plane.

> # Let's look at what happens to lines.
# The vertical lines of the form x=c, c a constant,

# become
X/Z=c or X=cZ.
# Thus, the point at infinity (i.e. Z=0)

# (0:1:0) is on all these vertical lines.

# Lines of the form y = mx + c become

# Y/Z = mX/Z + c or Y = mX + cZ.

# The point at infinity (1:m:0) is on all those lines

# for fixed m, i.e. for fixed slope.

# That is, the parallel lines of the form

# y = mx + b for fixed m and various b

# all intersect in the point (1:m:0).

# The vertical lines all intersect in (0:1:0).

# Sadly enough, there is no Maple command to plot

# curves in the projective plane.

# As a curiosity, the line Z=0 is a line

# which contains all the points at infinity.

# This line contains no affine point, and hence

# cannot be seen in the affine x/y-plane.

> # From now on, let us identify (x,y) with (x:y:1).
# Also, it is usual to denote (0:1:0) as infinity.

# The main idea is to introduce a group structure

# on the points of an elliptic curve as follows:

# infinity is the identity element in the group.

# For points P,Q,R we say that

# P + Q + R = infinity (=0)

# if and only if P,Q,R are collinear

> display(C,L,P1,P2,P3);

[Plot]

> # this is just saying that P1+P2+P3 = 0.

> # It is a nice fact that in the projective plane,
# a line intersects the elliptic curve in exactly

# three points, provided one counts points with

# the appropriate multiplicities, i.e. a

# tangent point counts twice.

# In other words, three points add to infinity

# (ie zero in the group)
if they are collinear
# (collinear = being on a line).

# Since the vertical lines intersect at infinity,

# we automatically have that if P=(x,y) then -P=(x,-y)

# since (x,y),(x,-y),infinity are collinear.

> P3 := pointplot({[-4,3]});

P3 := INTERFACE_PLOT(POINTS([-4., 3.]))

> P3minus := pointplot({[-4,-3]});

P3minus := INTERFACE_PLOT(POINTS([-4., -3.]))

> L3 := implicitplot(x+4,x=-5..5,y=-12..12):

> display(C,P3,P3minus,L3);

[Plot]

> # Thus, to add points P and Q, one rewrites
# the fundamental equation P+Q+R=infinity as

# P+Q=-R. Thus, to compute P+Q one has to take the

# line through P and Q, intersect it with the curve

# to get R = (x,y). Then P+Q = -R = (x,-y).

# Thus, P1+P2=-P3, i.e.

> display(C,P1,P2,P3minus,L,L3);

[Plot]

> # The crucial point is that the resulting
# addition is assiciative, i.e.

# P+(Q+R) = (P+Q)+R.

# Showing this is non-trivial.

> # It is possible to write down general formulas
# for the addition of points on the curve.

# To add a point P to itself, one draws the tangent

# line to the curve at that point and intersects

# it with the curve. Negation of the y-coordinate

# gives 2P.

> # Example: let's add P3 to itself.

> # the slope of the tanget of C at P3 is obtained by
# implicitly differentiating the equation for C.

# So y^2=x^3+73 differentiated implicitly gives

# 2y dy = 3x^2 dx, i.e.

# dy/dx = 3/2 x^2/y.

# Plugging in the coordinates of P3=(-4,-3) gives

# dy/dx at P3 = 3/2 * 16/(-3) = -8.

# The equation of the langent line is therefore

# -8 * (x+4) -3

> T := plot(-8 * (x+4) -3,x=-5..5,y=-12..12):

> display(C,T,P3);

[Plot]

> # Let us find the "third" intersection point.
# note that we have to take the

# negative branch

> solve(-sqrt(g(x))-((-8)*(x+4)-3),x);

72, -4

> # So, the third point is at (72,?)

> simplify(eval(-sqrt(g(x)),x=72));

-611

> # OK the point is (72,-611)

> P4 := pointplot({[72,-611]});

P4 := INTERFACE_PLOT(POINTS([72., -611.]))

> display([C,P3,P4,T]);

[Plot]

> T := plot(-8 * (x+4) -3,x=-20..75,y=-650..650):

> C := plot([sqrt(g(x)),-sqrt(g(x))],x=-20..75,y=-650..650):

> display(C,T,P4);

[Plot]

> P4negative := pointplot({[72,611]});

P4negative := INTERFACE_PLOT(POINTS([72., 611.]))

> display(C,T,P3,P4negative);

[Plot]

> # thus we have computed 2*P3

> # In general, if the curve E is given by
# y^2=x^3+bx+c

# and if P1 = (x1,y1), P2=(x2,y2)

# then P3 = (x3,y3) where

# x3 = m^2 - x1-x2

# y3 = m(x1-x3)-y1

# and

# m= (y2-y1)/(x2-x1) if P1 not equal P2

# and

# m = (3*x1^2+b)/(2*y1) if P1 = P2.

# If the slope m is infinite then P3 = infinity

# Also, infinity + P = P for all points P.

# This addition is associative,

# infinity is the identity element, and

# the inverse of P=(x,y) is -P=(x,-y).

# Thus we have a group.

# The group is abelian, as P+Q = Q+P

# (as can be seen from the fact that the formulae

# are symmetric in x and y (up to a minus sign

# which cancels).

# Thus we have an abelian group.

>