
///////////////////////////////////////////////////////////////////
// Test various routines for EC over Q 
// (that may not be covered elsewhere)
///////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////
// MordellWeilShaInformation (with CasselsTatePairing, FourDescent)

E := EllipticCurve([1, -1, 0, -71232869785, -7780523236091859]);

rank, gens, sha := MordellWeilShaInformation(E : ShaInfo:=false);

assert rank eq [1,1];
assert <2,[2,2]> in sha;

assert Round(Height(3*gens[1])) eq 197;


//////////////////////////////////////////////////////////////////
// SIntegralPoints (which calls MordellWeilShaInformation)

E := EllipticCurve([0,-19]);

pts := SIntegralPoints(E, [2,19]);
assert #pts eq 1;

E:=EllipticCurve([0,0,0,0,-2^3*19^2]);
pts := SIntegralPoints(E, [2,19]);
assert #pts eq 7;


//////////////////////////////////////////////////////////////////
// Saturation ("famous" rank 14 curve)

E := EllipticCurve([0,0,0,402599774387690701016910427272483,0]);

gens := [E(Rationals()) |
    [ 17715373576525779, 3562569314711466369088086, 1 ],
    [ 2626434695669379, 1037072601415883504491614, 1 ],
    [ 156700527821255649, 62537010977954916410183946, 1 ],
    [ 5428507892971009, -1531498322675141720086726, 1 ],
    [ 128753783392686169/9, 79581130616006291375138314/27, 1 ],
    [ 1709271952310405217, -2234841206561032041411823818, 1 ],
    [ 22127635884219481/4, -12384333006640216816679947/8, 1 ],
    [ 208383733118864688, 95565185470960061947766676, 1 ],
    [ 11128279325458521297, 37122971602658636202688033218, 1 ],
    [ 103189419061250643, 33768487838255557704513174, 1 ],
    [ 3677939718151953/16, 19470968228742079971746439/64, 1 ],
    [ 42337048599217681, 9640067401849260110173858, 1 ],
    [ 720879213837082377/4, -615841405474949482510918467/8, 1 ],
    [ 46439279877409015377/1681, -391130341466321391183789029622/68921, 1 ]
];

R := Regulator(gens);
assert Round(R) eq 1916970694428081;

// B is chosen at random; 13375 is a rigorous bound (Siksek's thesis)
B := 300;
"Saturating for primes up to", B;
time sat := Saturation(gens, B); 

RS := Regulator(gens);
assert Round(RS) eq 1916970694428081;
assert Abs(R - RS) lt 10^-10;

