| Karim.Belabas on Fri, 6 Jul 2001 11:20:32 +0200 (MEST) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: PARI:Failure of ellheight on elliptic curve [0,-1,0,-784,8704] |
On Fri, 6 Jul 2001, Bill Allombert wrote:
> On Thu, Jul 05, 2001 at 06:14:52PM +0100, Martin Prickett wrote:
>> I am Martin Prickett, a phD student of John Cremona at Nottingham. I am
>> using PARI and have discovered that if I take curve
>> e=ellinit([0,-1,0,-784,8704]) and point P=[-8,120] then
>> ellheight(e,P) crashes the computer by causing it to run out of memory on
>> Linux machines. However on Dec alpha machines (which are 64 bit) it gives
>> the correct answer.
>
> First I suppose your Linux machine is a x86 ?
>
> I try this on a x86 Linux machine and on a sparc solaris machine
> and I got.
> *** the PARI stack overflows !
> current stack size: 33554432 (32.000 Mbytes)
>
> which is not a computer crash, just a stack overflow condition.
>
> I also try it on a alpha Linux machine and it work
> ? ellheight(e,P)
> %3 = 0.74629920869451370890943760363155317690
>
> So you are right is a 32bit-only issue.
Numerical instability in ellpointtoz (pre-AGM phase): the AGM entered an
infinite loop since requested accuracy couldn't possibly be attained [was
still possible on 64bit machines]. Eventually, the GP stack would overflow.
Please apply the patch below [CVS repository is also up to date]
Karim.
Index: src/modules/elliptic.c
===================================================================
RCS file: /home/megrez/cvsroot/pari/src/modules/elliptic.c,v
retrieving revision 1.21
diff -c -r1.21 elliptic.c
*** src/modules/elliptic.c 2001/03/20 00:04:00 1.21
--- src/modules/elliptic.c 2001/07/06 09:17:39
***************
*** 766,778 ****
b = gmul2n(w,-1);
r1 = gsub(a,b);
p1 = gadd(x, gmul2n(gadd(e1,r0),-1));
! if (gcmp0(p1))
! p1 = gsqrt(gneg_i(gmul(a,r1)),prec);
! else
! {
! GEN delta = gdiv(gmul(a,r1),gsqr(p1));
! p1 = gmul2n(gmul(p1,gaddsg(1,gsqrt(gsubsg(1,gmul2n(delta,2)),prec))),-1);
! }
*pta = a; *ptb = b;
return gmul(p1,gsqr(gmul2n(gaddsg(1,gsqrt(gdiv(gadd(p1,r1),p1),prec)),-1)));
}
--- 766,773 ----
b = gmul2n(w,-1);
r1 = gsub(a,b);
p1 = gadd(x, gmul2n(gadd(e1,r0),-1));
! p1 = gmul2n(p1,-1);
! p1 = gadd(p1, gsqrt(gsub(gsqr(p1), gmul(a,r1)), prec));
*pta = a; *ptb = b;
return gmul(p1,gsqr(gmul2n(gaddsg(1,gsqrt(gdiv(gadd(p1,r1),p1),prec)),-1)));
}
--
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://www.parigp-home.de/