Explicit Formulation of the Group Law Around (0,0)
In this worksheet we will explicitly calculate the group law in terms of z and w in the open set V. We will use the chord tangent approach that is detailed by Silverman in The Arithmetic of Elliptic Curves on the open set of U which is determined by the equation f = y^2 - x^3 - a4*x - a6 and in the local coordinates of x and y. Our local coordinates will be z and w, our origin will be the point (0,0), and our neighborhood V will be the one determined by the equation g = w - z^3 - a4*z*w^2 - a6*w^3. It is easily seen that the inverse of a point P = (z0,w0) is (-z0, -w0) and so this is left to the reader.
> restart;
The equation defining V
> g:= w - z^3 - a4*z*w^2 - a6*w^3;
>
We recall that as detailed by J. Silverman, the sum of two points P1 and P2 on an elliptic curve is the inverse of the third intersection point of the line that connects P1 and P2 with the equation g. This being the case we calculate the line connecting the points P1 = (z1,w1) and P2 = (z2,w2) assuming for now that z1 is not equal to z2. Then we substitute the equation for this line into g and solve for the points of intersection. We remark at this point that we already know two of the points of intersection.
The line connection P1 and P2
This is a line in terms of z and w.
> wline:=((w2-w1)/(z2-z1))*(z-z1) + w1;
> wsimp:=collect(simplify(wline),z);
> waltline:= lambda * z + nu;
Substituting the line into g and solving
> helio:=subs(w=wline,g);
Here is where we now need to find the three roots in order to find the negative of the z term of the sum. Note that by substituting in we have removed w from consideration for a while. On the surface this may seem a bit daunting, and it would be except for two facts: the first fact is that we already know two of the three roots of the numerator of this equation, namely z1 and z2; the second fact is that we have the equalities contained in the 'zero equations' subsection.
> lineas:=rem(helio,(z-z1)*(z-z2),z,'pauling');
Note that the remainder from the rem function is in fact zero if you take into account the 'zero equations' below which arise from the fact that both (z1,w1) and (z2,w2) satisfy g. Then 'pauling' is simply the quotient from this division and hence the term which when solved for 'z' will give us the third root.
> pauling;
>
Zero Equations
These are the equalities between w1 and z1 and between w2 and z2.
> w1eq:=subs({w=w1,z=z1},g);
> w2eq:=subs({w=w2,z=z2},g);
> normal(pauling);
Ok. Now we are actually solving and then simplifying by further using the zero equations.
> genetic:=solve(pauling,z);
> torvald:=expand(numer(genetic) + w2eq*(z2- 2*z1) + w1eq*(2*z2 - z1))/expand(denom(genetic)+ w2eq*(-1) + w1eq*(1));
Now that we have torvald, we can find the equation for w by substituting torvald into wline.
> bohr:=subs(z=torvald,wline);
> neils:=simplify(bohr);
>
Group Law!
Ok. So now that we have solved for the 'roots' the equations that explicitly give the group law are simply the negative of the euqations that give the 'roots'.
> z3eq:=-torvald;
> w3eq:=-neils;
> subs({w1=-w2,z1=-z2},z3eq);
> subs({w1=-w2,z1=-z2},w3eq);
> subs({w2=0,z2=0},z3eq);
> subs({w2=0,z2=0},w3eq);
> subs({w1=0,z1=0},z3eq);
> subs({w1=0,z1=0},w3eq);
Here we note that in fact this group law works for P1 + -P1! (Who sez good things doing come to those who perservere!) Now in order to determine what this group law should do to the sections we add a section that simply lists the group law, and then we add a section that does the p-derivations of the w part of the group law sum. Finally we should consider what to do when z1 = z2... this is the only case that does not immediately work with this group law... ie adding a point to itself...
> subs({w1=w2,z1=z2},numer(w3eq));
> subs({w1=w2,z1=z2},denom(w3eq));
> subs({w1=w2,z1=z2},numer(z3eq));
> subs({w1=w2,z1=z2},denom(z3eq));
So because of the possible removable singularity we can now apply a limiting process and take the 'limit as w1 -> w2 and z1 -> z2'... which in this case means that we are going to apply L'Hopitals. Ok. am stuck for now.
> numer(w3eq);
> denom(w3eq);
> newwline:=subs({z=z1,w=w1},diff(g,w)/diff(g,z))*(z - z1) + w1;
> tandoori:=subs(w=newwline,g);
> vindaloo:=normal(rem(tandoori,(z-z1)^2,z,'satay'));
> graham:=collect(expand(collect(numer(vindaloo),z) + w1eq*(z*(-9*a6*w1 -12*a4*z1 + 9*a4*z1) - 3*z1^2 + 12*a4*z1^2*a4 + 9*z1*a6*w1 - a4*w1^2 + 3*z1^2*a4 - 12*z1^2*a4^2)),z);
> normal(satay);
>
>
> saber:=a6^3*collect(coeff(graham,a6,4),w1)/w1^3:
> tooth:=a6^2*collect(coeff(graham,a6,3),w1)/w1^3:
> tiger:=collect(coeff(graham,a6,2),w1):
> couger:=a6*(tiger - coeff(tiger,w1,2)*w1^2)/w1^3:
> hill:=collect(expand(graham + w1eq*(saber + tooth + couger)),a6):
> coeff(hill,a6,4):
> coeff(hill,a6,3):
>
>
The first p-derivative of z3.
This is an addendum section. In it we first take insert the function for taking p-derivatives and then go ahead and take the p-derivative of w3.
p-derivation function for p an odd prime
> aegis:=(z3eq);
> crystal:=z3eq;
> alpha:=numer(crystal);
> mu:=-denom(crystal);
> beta:=-numer(w3eq);
> -denom(w3eq);
GIVING MYSELF A LITTLE SPACE BEFORE COMPUTING P-DERIVATIONS...
> palpha:=collect(subs({(-1)^p = -1,delta(-2) = -delta(2),delta(-3)= -delta(3)},simplify(expand(pdiff(alpha)),power,symbolic)),p):
> degree(alpha);
> degree(beta);
> degree(mu);
> palpha2:=subs({p^2=0,p^3=0,p^4=0,p^5=0,p^6=0},palpha):
> pbeta:=collect(subs({(-1)^p = -1,delta(-2) = -delta(2),delta(-3)= -delta(3)},simplify(expand(pdiff(beta)),power,symbolic)),p):
> pbeta2:=subs({p^2=0,p^3=0,p^4=0,p^5=0,p^6=0},pbeta):
> pmu:=collect(subs({(-1)^p = -1,delta(-2) = -delta(2),delta(-3)= -delta(3)},simplify(expand(pdiff(mu)),power,symbolic)),p):
> pmu2:=subs({p^2=0,p^3=0,p^4=0,p^5=0,p^6=0},pmu);
>
>
>
> aegisnumer:=collect(subs({(-1)^p = -1,delta(-2) = -delta(2),delta(-3)= -delta(3)},simplify(expand(pdiff(numer(aegis))),power,symbolic)),p):
> collect(subs({p^2=0,p^3=0,p^4=0,p^5=0,p^6=0},aegisnumer),[p,delta(a4),delta(a6)]);
>
> numerderiv:=collect(expand(subs((-1)^p = -1,simplify(subs((-1)^p = -1,pdiffmodp(numer(aegis))),power,symbolic))),p);
> denomderiv:=collect(expand(subs((-1)^p = -1,simplify(subs((-1)^p = -1,pdiffmodp(denom(aegis))),power,symbolic))),p):
> simplify(subs( [p^2 = 0,p^3 = 0,p^4=0,p^5=0,delta(-2) = - delta(2),delta(-3)= - delta(3)],numerderiv),power,symbolic);
> simplify(subs( [p^2 = 0,p^3 = 0,p^4=0,p^5=0,delta(-2) = - delta(2),delta(-3)= - delta(3)],denomderiv),power,symbolic):
> aegisderiv:=collect(expand(subs((-1)^p = -1,simplify(subs((-1)^p = -1,pdiffmodp(aegis)),power,symbolic))),p);
>
>