Magma V2.9-12 Wed Sep 11 2002 18:44:44 on galois [Seed = 3667453432] Type ? for help. Type -D to quit. Loading startup file "/home/bruin/.magmabatchrc" > ///////////////////////////////////////////////////////////////////////// > //example1.m > // > //Nils Bruin, 11/09/2002 > // > //Accompanying MAGMA script for article > // > //Nils Bruin, Visualising Sha[2] in Abelian surfaces > // > //This script verifies the computations referred to in Section 7, Example 1 > //The script has been tested on Magma V2.9-12 > > //First load the package for computing Selmer groups > AttachSpec("Algaem/Algaem.spec"); > _:=PolynomialRing(Rationals()); > //Oddly enough, we need the *number field* Q. > Q:=NumberField(x-1:DoLinearExtension); > K:=Q; > Kx:=PolynomialRing(K); > > f:=x^3-22*x^2+21*x+1; > > delta:=2; > > //The elliptic curves ... > E1:=PolToEllipticCurve(Kx!f); > E2:=PolToEllipticCurve(Kx!f*delta); > > //Getting the 2-Selmer groups ... > two1:=MultiplicationByMMap(E1,2); > two2:=MultiplicationByMMap(E2,2); > mu1:=IsogenyMu(two1); > A:=Codomain(mu1); > S1small,mp1:=SelmerGroup(two1); > Aa,toAa1:=AbsoluteAlgebra(Codomain(mu1)); > mu2:=IsogenyMu(two2:Fields:={Component(Aa,i):i in [1..NumberOfComponents(Aa)]}); > A2:=Codomain(mu2); > A2toA:=homA|[theta*delta]>; > S2small,mp2:=SelmerGroup(two2); > > //And compute a structure in which both Selmer groups fit. > S:={LookupPrime(p[1]): p in Factorisation(2*Disc*IntegerRing(BaseRing(E2)))} > where Disc:=Discriminant(E2); > H1,toH1:=pSelmerGroup(Codomain(mu1),2,S); > > S1:=sub; > S2:=sub; > > Slower:=sub; > Supper:=sub; > > //Some stuff necessary to be able to compute the Norm map later on > Lrel:=NumberField(xK^2-delta); > L:=NumberField(x^2-delta); > LisLrel,LtoLrel:=IsIsomorphic(L,Lrel); > assert LisLrel; > > EL:=BaseChange(E1,L); > twoL:=MultiplicationByMMap(EL,2); > muL:=IsogenyMu(twoL); > AL:=Codomain(muL); > AaL:=AbsoluteAlgebra(AL); > //We're lazy with the classgroup computation here. If you want, you can remove > //the "Bound:=300" and still arrive at the same (but now proven-to-be-correct) > //answer. > [ClassGroup(AaL[i]:Bound:=300): > i in [1..NumberOfComponents(AaL)]]; [ Abelian Group isomorphic to Z/2 + Z/2 Defined on 2 generators Relations: 2*\$.1 = 0 2*\$.2 = 0 ] > > SL,mpL:=SelmerGroup(twoL); > > //Unfortunately, @LtoLrel@@LtoLrel isn't always the identity. > //Conjugation of L/K is easy enough for Lrel. > Lrelcon:=homLrel|[-Lrel.1]>; > //To compute what this does to L.1, we consider two options and pick the > //nontrivial one > L1con:=[a:a in [LtoLrel(L.1)@@LtoLrel,Lrelcon(LtoLrel(L.1))@@LtoLrel]| a ne L.1]; > //We should really end up with only one option > assert #L1con eq 1; > //That supposedly defines conjugation > Lcon:=homL|[L1con[1]]>; > //But better check that it really does, i.e., leaves K invariant. > assert k eq Lcon(k) where k:=(Lrel!K.1)@@LtoLrel; > //And, just to be sure, that conjugation is of order 2 (it is not the identity > //by picking L1con different from L.1) > assert Lcon(Lcon(L.1)) eq L.1; > > ALcon:=homAL|a:->AL![Lcon(b):b in Eltseq(a)]>; > ALnorm:=homA|a:->A![Eltseq(LtoLrel(b))[1]:b in Eltseq(a*ALcon(a))]>; > NS:=sub; > > /////////////////////////////////////////////////////////////////////////// > //Given the computations above, we now have computed the objects with which we > //can check the claims in Example 1 in Section 7 of the article. > > //First if S1=S^(2)(E1/Q) is what is claimed in the article > sub eq S1; true > > //And if the points [0,1] [1,1] generate the group that is said > sub eq > sub; true > > //And that rational points on E2 generate the other part in S1. > sub eq > sub; true > > > //Test that the rational points on E1(Q(sqrt(2))) generate SL, which is the > //2-Selmer group of E1 over Q(sqrt(2)). > sub [EL![0,1],EL![1,1],EL![1/2,7/4*L.1],EL![1/8,41/32*L.1]]]> eq SL; true > > //And that it is what it said it should be > sub eq SL; true > > //And of course that Norm(SL) is trivial: > #NS eq 1; true Total time: 11.390 seconds, Total memory usage: 5.07MB