default(parisize,"32M");
mwrank(E,e=0) = setrand(1); ellrank(E,e);

{
E=ellinit([1,0,1,34318214642441646362435632562579908747,
          3184376895814127197244886284686214848599453811643486936756]);
}
R=mwrank(E)
round(matdet(ellheightmatrix(E,ellsaturation(E,R[4],100))))
{
E=ellinit([0,-438879732513040081/428593506250000,0,-112353213812869130368/26787094140625,3081846839375070007684953094049946244/717548412498706207275390625]);
}
R=mwrank(E)
round(matdet(ellheightmatrix(E,ellsaturation(E,R[4],100))))
dujella=
{
[[1,0,0,-1086750289534747727483801311783198679020964,435973165715323898311705750809969552813996511661336976727731984],
[1,1,1,-204436185783252342785934887233210383183371840,1165977772244037776901948451219544033496456897571880326934385121505],
[1,1,1,-10920091632464590365831264648975539,437651494057993449247068775775947593191303103178481],
[1,0,0,-615411322294732283803288785027250860840,5538719221187391635372324416383813743465156669756429313600],
[0,-1,0,-28988736544619415368095370719165120,2092184664137813418988486724511221531954993872509532],
[1,1,1,690560257169377937125059126423812540,-33492188518937203020097127431557287129957999127407035],
[1,0,0,-756828185715435657801375588494450478688880,253401847133358152315350001760510755926602193561212158650118400],
[0,1,0,-11849634571550798667743047864720,15613761915399875450490670165233536220551598068],
[1,0,0,-304241169811532712979315990,2065986446448965089594679105215890328100],
[1,0,0,-476388667785943389435012002002520620,126543502804781110382893072580356730547061880243200400],
[1,0,0,-4422329901784763147754792226039053294186858800,98943710602886706347390586357680210847183616798063680624530387016000],
[1,0,0,-3531474678706925407855636725500,2548317483638211729406118411284184511350250000],
[1,-1,1,-42403753582533569425032932,106274144228004532427905140464314177031],
[1,0,0,-2749906390198370341509293334209840,55466178854972875780766488008304927128432629217600],
[1,0,0,-544753256053055692212823356675,154756127532691562955214620687209364995464257],
[1,-1,0,-1478818379630960182018543975144238479079598870400357903794,21612333371564362906227820064846376685227380006732368388851217276076518563786908263808],
[0,1,0,-126805284556646749335939083075808898286800006041,6437933136993997783664151467830511224300392764380156814845149031129959],
[1,0,0,-1209873315556653510389989204544209972082084,331058311839965956052748107957148273288865814054655695750098704],
[1,1,1,-3303894515586689289541165506478574062530571840,73094841061617585831898118162636503049865840051589473263026790881505],
[1,1,1,-16343354562559064151871130832020659,-42639589563151841387449703830240754991749490260239],
[0,1,0,-6141005737705911671519806644217969840,5857433177348803158586285785929631477808095171159063188],
[1,1,1,-2245321045583713014514387556551626518613389075,40951023798706743647147655022412395573869307978556305934134697952785],
[0,-1,0,-3600510377430985267434688529347574077140,83138379062405631329348360175446817662846629397471808788100],
[0,1,0,-23686061832482481624168232900,1401294826072670363740983663536729053022048],
[0,-1,0,-866893152450363503763740085700,61220734062068506723288644020689511073795652],
[1,0,0,-37680956700999226080263982005713090640,-36992898397926078743894505902555362159162611772488902400],
[1,0,1,-5012222351518888614250804048874855041913,136464417579052941096027626504118630642626009794008307407656],
[1,0,0,-990429690240960203866170,343844266388187332499781887080604900],
[1,0,0,-2353799432200918732090882185,39989567111692230080439457690563434811225],
[1,0,0,-59964332656283235183736182568175070,5262192586204697880378286484023061659919913201000900],
[1,0,0,-15745932530829089880,24028219957095969426339278400],
[1,0,0,-2564530435455464744050430,-774033544664307864229665861908231100],
[1,0,0,-18262097056293794050462967800,947221615382521776843113311413294620840000],
[1,0,0,-1501011456398147086648544266758850,22251270940723503314374317274872523646621572635332],
[1,0,0,-590353702194591280765010561772238260,174588372339329184400865798305984325852297773091859600]];
}
womack=
{[
[0, 0, 1, -79, 342],
[1, 0, 0, -22, 219],
[0, 0, 1, -247, 1476],
[1, -1, 0, -415, 3481],
[0, 0, 0, -532, 4420],
[1, 1, 0, -2582, 48720],
[0, 0, 1, -7077, 235516],
[1, -1, 0, -2326, 43456],
[1, -1, 0, -16249, 799549],
[1, -1, 1, -63147, 6081915],
[0, 0, 0, -10012, 346900],
[1, 0, 1, -14733, 694232],
[0, 0, 1, -36673, 2704878],
[1, -1, 0, -92656, 10865908],
[1, -1, 0, -18664, 958204],
[1, -1, 0, -106384, 13075804],
[1, -1, 0, -222751, 40537273],
[0, 0, 0, -481663, 128212738],
[1, -1, 0, -71899, 5522449],
[1, -1, 0, -124294, 14418784],
[1, -1, 0, -135004, 97151644],
[1, -1, 0, -613069, 98885089],
[0, 0, 1, -3835819, 2889890730],
[1, 0, 1, -1493028, 701820182],
[1, 0, 1, -1076185, 496031340],
[0, 0, 1, -16312387, 25970162646],
[1, -1, 0, -10194109, 12647638369],
[0, 0, 1, -21078967, 35688990786],
[1, -1, 0, -1536664, 648294124],
[1, -1, 0, -4513546, 3716615296],
[0, 0, 1, -16359067, 26274178986],
[1, -1, 0, -38099014, 115877816224],
[1, -1, 0, -41032399, 106082399089],
[1, -1, 0, -34125664, 69523358164]
];}
checkwomack()=
{
  for(i=1,#womack,
    print("W:",i,":",mwrank(ellinit(womack[i]))[1..2]));
}
checkwomack()
checkdujella()=
{
  for(i=1,#dujella,
    print("D:",i,":",mwrank(ellinit(dujella[i]),2)[1..2]));
}
checkdujella()
crv3(D)=[0,0,1,0,(-27*D-1)/4];
quer=[-23,-3299,-3321607,-653329427];
checkquer()=
{
  for(i=1,#quer,
    print("Q:",i,":",mwrank(ellinit(crv3(quer[i])))[1..2]));
}
checkquer()

checktwist(e,f,v=[])=
{ my(E=ellinit(e), F=ellinit(f), rk, R, C, D);

  setrand(1); rk = ellrankinit(E);
  R = ellrank([rk,F],,v); print(R);
  foreach(ell2cover([rk,F]),C,
    if(!ellisoncurve(F,C[2]*Mod(1,y^2-C[1])),error(e)));
  if(#R[3]&&vecmin(ellisoncurve(F,R[3]))==0,error("twist"));
}
checktwist([28,-172,304,-328628448,1486696690624],[66,-954,5454,-37136547171,1787447910597444]);
checktwist([66,-954,5454,-173907,-7341759],[28,-172,304,-4064,-20032]);
checktwist([66,-954,5454,-173502,-7327179],[28,-172,304,-3744,-20032]);
checktwist([-1,1],[-36,216]);
checktwist([-289,1],[-289*5^2,-5^3],[[369/4,-2753/8]]);
checktwist([1,3],[323761,552660027]);

E=ellinit([-27^2,7]);
[Q,P]=ell2cover(E)[1]
H=hyperellratpoints(Q,10^4,1)[1]
PE=substvec(P,[x,y],H)
ellisoncurve(E,PE)

E=ellinit([-441,0]);
[Q,P]=ell2cover(E)[1]
H=hyperellratpoints(Q,10^4,1)[1]
PE=substvec(P,[x,y],H)
ellisoncurve(E,PE)

\\ gcov
for(i=1,8,setrand(i); ellrank(ellinit([1,0,0,-164,-1386])));
mwrank(ellinit([-3888,-97200]))
mwrank(ellinit([-2109,-37100]))
for(i=1,4,setrand(i); ellrank(ellinit([0,-1,0,-30169,-2107466])));

\\ check for old regressions
mwrank(ellinit([-181^2,-1]))
mwrank(ellinit([1,0,1,-33,68]))
mwrank(ellinit([0,1,0,-150908,-22509312]))
E=ellinit([0,-7396/27]); ellglobalred(E); mwrank(E)
mwrank(ellinit([0,-1,0,-260,-1530]))
E=ellinit([0,0,0,-1,351298031616]); mwrank(E)
mwrank(ellinit([-625,3125]))
mwrank(ellinit([1,0,1,54,-4676]));
mwrank(ellinit([0,0,1,0,11864580]))
mwrank(ellinit([0,-1,0,-877,-9662]))
mwrank(ellinit([0, -1, 1, -616, -25561]))
mwrank(ellinit([1, -1, 1, -3129930, -2196797303]))

localbitprec(64); mwrank(ellinit([1,0,0,-3548640074840486080,-2573007444343298815350037540]))

\\error
checktwist([1,2],[1,3])
checktwist([1,0],[2,0])
checktwist([0,1],[0,3])
ellrank([ellinit([1/2]),1,1]);
ellrank([ellinit([1,1,1,1,1]),1,1]);
ellrank([ellinit([0,1,1,1,1]),1,1]);
