All published worksheets from http://sagenb.org
Image: ubuntu2004
We choose an elliptic curve E:
We choose a Heegner discriminant for E:
With the choice of a Heegner discriminant, -3, we list possible Kolyvagin primes:
We define the field L=Q(E[2]):
Indeed, the 2-division polynomial of E factors completely over L:
We use Robert Miller's number field Selmer group function.
The key difficulty is implementing the L-Selmer group as a vector space. Robert Miller's function only gives a basis as elements of L--we need the structure of the actual group.
Two functions: this one goes from a vector to a Selmer class.
This one goes the opposite way. It is by far the most time-consuming operation here.
Here we learn the Galois action on 2-torsion points.
W represents the tensor product vector space.
Functions for dealing with the tensor product:
Now we can write the Galois generators as matrices. They are big, but once constructed, Sage handles them with lightning speed.
Our problem is reduced to finding the common Eigenspace of these two matrices.
We have bounded the Selmer group inside a group of size 4. Now finding it exactly is a matter of checking a modified local condition at primes above 2. We do this in a way that is surely sub-optimal: trying to divide a Mordell-Weil generator by two in various extension fields.
The first nonzero element in the list above is the true Selmer generator. The others fail. Hence the 2-Selmer group has rank 1, and so does E
Now let's try a modified Selmer group, using the Kolyvagin prime 17.
To narrow down this group of size 8, we must check the transverse condition at primes above 17. The function below will do this:
Now the modified Selmer group is bounded in a group of size 4, and it suffices to check the local condition at 2.
So this modified Selmer group turns out to be trivial.
One more example, with Kolyvagin prime 29:
This at least tips us off that this modified Selmer group is nontrivial. But the theory of Kolyvagin systems predicts that it should have rank 2, not 1. I think the problem is that the local condition at 2 is implemented incorrectly. There must be a better test than the one I wrote. That would be the first priority for improving this code...