| Karim BELABAS on Mon, 7 Jun 1999 15:13:15 +0200 (MET DST) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: rank=8, torsion group=Z/2Z*Z/2Z |
[Igor:]
>> On Mon, Apr 26, 1999 at 10:52:55AM -0400, Andrej Dujella wrote:
>>> I found three examples of elliptic cuves over Q
>>> with torsion group isomorphic to Z/2Z * Z/2Z
>>> and with rank = 8.
>>> This improves my previous examples with rank = 7
>>> (see A. Dujella: Diophantine triples and construction of
>>> high-rank elliptic curves over Q with three non-trivial
>>> 2-torsion points, Rocky Mountain J. Math., to appear).
>>>
>>> These elliptic curves are
>>>
>>> y^2=x*[x+(b-a)(d-c)]*[x+(c-a)(d-b)],
>>>
>>> where (a,b,c,d)=
>>> (32/91, 60/91, 1878240/1324801, 15343900/12215287),
>>> (17/448, 2145/448, 23460/7, 2352/7921) and
>>> (559/1380, 252/115, 24264935/2979076, 16454108/1703535).
[...]
>>
>> So PARI thinks the torsion groups are isomorphic to Z/2Z,
>> contrary to what Dr. Dujella's findings.
>>
>> I looked at it many times, and I believe I set it up correctly. So
>> looks like it's a PARI bug.
[...]
> On the other hand, if I use the integral model
> and reduce the curves globally, it works fine:
[...]
> So the bug is definitely related to handling non-integral
> coefficients.
Here's a tentative (brute force) patch. In effect, it switches to an integral
model [not a minimal one, hence it'll be much faster than ellglobalred, which
requires factoring the discriminant].
The patch "fixes" the same problem in Lutz-Nagell (which raised an error, not
a wrong result). Here a minimal model would definitely help, but this
approach is hopelessly slow anyway...
Finally, it replaces "precision loss in truncation" messages in the routine
by something more helpful.
Karim.
*** src/modules/elliptic.c.orig Thu Jun 3 15:59:26 1999
--- src/modules/elliptic.c Mon Jun 7 15:09:41 1999
***************
*** 2694,2699 ****
--- 2694,2712 ----
avma=av; return gzero;
}
+ /* one can do much better by factoring denom(D) (see ellglobalred) */
+ static GEN
+ ellintegralmodel(GEN e)
+ {
+ GEN a = cgetg(6,t_VEC), v;
+ long i;
+
+ for (i=1; i<6; i++) a[i]=e[i];
+ a = denom(a); if (gcmp1(a)) return NULL;
+ v = cgetg(5,t_VEC);
+ v[1]=linv(a); v[2]=v[3]=v[4]=zero; return v;
+ }
+
/* Using Lutz-Nagell */
/* p is a polynomial of degree exactly 3 with integral coefficients
***************
*** 2747,2767 ****
GEN
torsellnagelllutz(GEN e)
{
! GEN d,ld,pol,p1,lr,v,w,w2,w3;
long i,j,nlr,t,t2,k,k2,av=avma;
checkell(e);
! for (i=1; i<=5; i++)
! if (typ(e[i]) != t_INT) err(talker, "not an integral model in torsell");
pol = RHSpol(e);
lr=ratroot(pol); nlr=lg(lr)-1;
! v=cgetg(17,t_VEC); p1=cgetg(2,t_VEC); p1[1]=zero; v[1]=(long)p1;
for (t=1,i=1; i<=nlr; i++)
{
p1=cgetg(3,t_VEC);
p1[1] = lr[i];
p1[2] = lmul2n(gneg(ellLHS0(e,(GEN)lr[i])), -1);
! v[++t]=(long)p1;
}
ld = factor(gmul2n(absi((GEN)e[12]), 4));
p1 = (GEN)ld[2]; k = lg(p1);
--- 2760,2780 ----
GEN
torsellnagelllutz(GEN e)
{
! GEN d,ld,pol,p1,lr,r,v,w,w2,w3;
long i,j,nlr,t,t2,k,k2,av=avma;
checkell(e);
! v = ellintegralmodel(e);
! if (v) e = coordch(e,v);
pol = RHSpol(e);
lr=ratroot(pol); nlr=lg(lr)-1;
! r=cgetg(17,t_VEC); p1=cgetg(2,t_VEC); p1[1]=zero; r[1]=(long)p1;
for (t=1,i=1; i<=nlr; i++)
{
p1=cgetg(3,t_VEC);
p1[1] = lr[i];
p1[2] = lmul2n(gneg(ellLHS0(e,(GEN)lr[i])), -1);
! r[++t]=(long)p1;
}
ld = factor(gmul2n(absi((GEN)e[12]), 4));
p1 = (GEN)ld[2]; k = lg(p1);
***************
*** 2776,2788 ****
p1[1] = lr[i];
p1[2] = lmul2n(gsub(d,ellLHS0(e,(GEN)lr[i])), -1);
! if (is_new_torsion(e,v,p1,t2))
{
GEN p2 = cgetg(3,t_VEC);
p2[1] = p1[1];
p2[2] = lsub((GEN)p1[2],d);
! v[++t]=(long)p1;
! v[++t]=(long)p2;
}
}
}
--- 2789,2801 ----
p1[1] = lr[i];
p1[2] = lmul2n(gsub(d,ellLHS0(e,(GEN)lr[i])), -1);
! if (is_new_torsion(e,r,p1,t2))
{
GEN p2 = cgetg(3,t_VEC);
p2[1] = p1[1];
p2[2] = lsub((GEN)p1[2],d);
! r[++t]=(long)p1;
! r[++t]=(long)p2;
}
}
}
***************
*** 2799,2808 ****
{
w2=cgetg(2,t_VEC); w2[1]=lstoi(t);
for (k=2; k<=t; k++)
! if (itos(orderell(e,(GEN)v[k])) == t) break;
if (k>t) err(bugparier,"torsell (bug1)");
! w3=cgetg(2,t_VEC); w3[1]=v[k];
}
else
{
--- 2812,2821 ----
{
w2=cgetg(2,t_VEC); w2[1]=lstoi(t);
for (k=2; k<=t; k++)
! if (itos(orderell(e,(GEN)r[k])) == t) break;
if (k>t) err(bugparier,"torsell (bug1)");
! w3=cgetg(2,t_VEC); w3[1]=r[k];
}
else
{
***************
*** 2810,2821 ****
t2 = t>>1;
w2=cgetg(3,t_VEC); w2[1]=lstoi(t2); w2[2]=(long)gdeux;
for (k=2; k<=t; k++)
! if (itos(orderell(e,(GEN)v[k])) == t2) break;
if (k>t) err(bugparier,"torsell (bug3)");
! p1 = powell(e,(GEN)v[k],stoi(t>>2));
! k2 = (lg(p1)==3 && gegal((GEN)v[2],p1))? 3: 2;
! w3=cgetg(3,t_VEC); w3[1]=v[k]; w3[2]=v[k2];
}
w=cgetg(4,t_VEC);
w[1] = lstoi(t);
--- 2823,2839 ----
t2 = t>>1;
w2=cgetg(3,t_VEC); w2[1]=lstoi(t2); w2[2]=(long)gdeux;
for (k=2; k<=t; k++)
! if (itos(orderell(e,(GEN)r[k])) == t2) break;
if (k>t) err(bugparier,"torsell (bug3)");
! p1 = powell(e,(GEN)r[k],stoi(t>>2));
! k2 = (lg(p1)==3 && gegal((GEN)r[2],p1))? 3: 2;
! w3=cgetg(3,t_VEC); w3[1]=r[k]; w3[2]=r[k2];
! }
! if (v)
! {
! v[1] = linv((GEN)v[1]);
! w3 = pointch(w3,v);
}
w=cgetg(4,t_VEC);
w[1] = lstoi(t);
***************
*** 2849,2863 ****
return b;
}
/* Input the curve, a point, and an integer n, returns a point of order n
on the curve, or 0 if the point p is not a proper point. */
static GEN
torspnt(GEN e, GEN q, long n)
{
GEN p = cgetg(3,t_VEC);
! p[1] = lmul2n(ground(gmul2n((GEN)q[1],2)),-2);
! p[2] = lmul2n(ground(gmul2n((GEN)q[2],3)),-3);
! return (oncurve(e,p) && gcmp0(gimag(p))
&& lg(powell(e,p,stoi(n))) == 2
&& itos(orderell(e,p)) == n)? greal(p): NULL;
}
--- 2867,2891 ----
return b;
}
+ static GEN
+ _round(GEN x)
+ {
+ long e;
+ x = grndtoi(x,&e);
+ if (e >= 0)
+ err(talker, "ellinit data not accurate enough. Increase precision");
+ return x;
+ }
+
/* Input the curve, a point, and an integer n, returns a point of order n
on the curve, or 0 if the point p is not a proper point. */
static GEN
torspnt(GEN e, GEN q, long n)
{
GEN p = cgetg(3,t_VEC);
! p[1] = lmul2n(_round(gmul2n((GEN)q[1],2)),-2);
! p[2] = lmul2n(_round(gmul2n((GEN)q[2],3)),-3);
! return (gcmp0(gimag(p)) && oncurve(e,p)
&& lg(powell(e,p,stoi(n))) == 2
&& itos(orderell(e,p)) == n)? greal(p): NULL;
}
***************
*** 2885,2891 ****
}
static GEN
! tors(GEN e, long k, GEN p, GEN q)
{
GEN p1, r = cgetg(4,t_VEC);
if (q)
--- 2913,2919 ----
}
static GEN
! tors(GEN e, long k, GEN p, GEN q, GEN v)
{
GEN p1, r = cgetg(4,t_VEC);
if (q)
***************
*** 2897,2903 ****
if (smaller_x((GEN)p1[1], (GEN)best[1])) q = p1;
else if (best == np) { p = addell(e,p,q); q = np; }
p = best_in_cycle(e,p,k);
!
r[1] = lstoi(2*k); p1 = cgetg(3,t_VEC); p1[1] = lstoi(k); p1[2] = deux;
r[2] = (long)p1; p1 = cgetg(3,t_VEC); p1[1] = lcopy(p); p1[2] = lcopy(q);
r[3] = (long)p1;
--- 2925,2936 ----
if (smaller_x((GEN)p1[1], (GEN)best[1])) q = p1;
else if (best == np) { p = addell(e,p,q); q = np; }
p = best_in_cycle(e,p,k);
! if (v)
! {
! v[1] = linv((GEN)v[1]);
! p = pointch(p,v);
! q = pointch(q,v);
! }
r[1] = lstoi(2*k); p1 = cgetg(3,t_VEC); p1[1] = lstoi(k); p1[2] = deux;
r[2] = (long)p1; p1 = cgetg(3,t_VEC); p1[1] = lcopy(p); p1[2] = lcopy(q);
r[3] = (long)p1;
***************
*** 2907,2912 ****
--- 2940,2950 ----
if (p)
{
p = best_in_cycle(e,p,k);
+ if (v)
+ {
+ v[1] = linv((GEN)v[1]);
+ p = pointch(p,v);
+ }
r = cgetg(4,t_VEC);
r[1] = lstoi(k); p1 = cgetg(2,t_VEC); p1[1] = r[1];
r[2] = (long)p1; p1 = cgetg(2,t_VEC); p1[1] = lcopy(p);
***************
*** 2921,2933 ****
torselldoud(GEN e)
{
long b,i,ord,av=avma,prec, k = 1;
! GEN w1,w22,w1j,w12,p,tor1,tor2;
checkbell(e);
! prec=max(MEDDEFAULTPREC,gprecision(e));
b = torsbound(e,3);
! if (b==1) { avma=av; return tors(e,1,NULL,NULL); }
w22 = gmul2n((GEN)e[16],-1);
w1 = (GEN)e[15];
if (b % 4)
--- 2959,2974 ----
torselldoud(GEN e)
{
long b,i,ord,av=avma,prec, k = 1;
! GEN v,w1,w22,w1j,w12,p,tor1,tor2;
checkbell(e);
+ v = ellintegralmodel(e);
+ if (v) e = coordch(e,v);
! prec=precision((GEN)e[15]);
! prec=max(prec,MEDDEFAULTPREC);
b = torsbound(e,3);
! if (b==1) { avma=av; return tors(e,1,NULL,NULL, v); }
w22 = gmul2n((GEN)e[16],-1);
w1 = (GEN)e[15];
if (b % 4)
***************
*** 2948,2954 ****
else p = NULL;
if (p) {k = i; break; }
}
! return gerepileupto(av, tors(e,k,p,NULL));
}
ord = 0; tor2 = NULL;
--- 2989,2995 ----
else p = NULL;
if (p) {k = i; break; }
}
! return gerepileupto(av, tors(e,k,p,NULL, v));
}
ord = 0; tor2 = NULL;
***************
*** 3010,3016 ****
if (!p) { p = tor1; k = 2; }
break;
}
! return gerepileupto(av, tors(e,k,p,tor2));
}
GEN
--- 3051,3057 ----
if (!p) { p = tor1; k = 2; }
break;
}
! return gerepileupto(av, tors(e,k,p,tor2, v));
}
GEN
__
Karim Belabas email: Karim.Belabas@math.u-psud.fr
Dep. de Mathematiques, Bat. 425
Universite Paris-Sud Tel: (00 33) 1 69 15 57 48
F-91405 Orsay (France) Fax: (00 33) 1 69 15 60 19
--
PARI/GP Home Page: http://hasse.mathematik.tu-muenchen.de/ntsw/pari/