| Karim BELABAS on Wed, 23 Jan 2002 21:19:46 +0100 (MET) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: ellap() bug? |
On Wed, 23 Jan 2002, Iwao KIMURA wrote:
> I heard that ellap() returns wrong answer for large p.
>
> ? e=ellinit([0,0,0,0,24])
> ? p=557018866141
> ? ellap(e,p)
> time = 2mn, 24,587 ms.
> %4 = 47745597502
> ? 47745597502 < 2*sqrt(p)
> time = 0 ms.
> %5 = 0
>
> ellap(e,p) returns 47745597502, but this is not smaller than
> 2*sqrt(p), violating Hasse's theorem.
Stack corruption, easy to fix once the problem is spotted. Patch follows
[should apply to any of the 2.1.* and 2.2.* releases; I updated both CVS
archives (stable and unstable)].
(20:39) gp > e=ellinit([0,0,0,0,24]); p=557018866141;
(20:41) gp > ellap(e,p)
time = 10 ms.
%2 = 1228567
Karim.
Index: src/modules/elliptic.c
===================================================================
RCS file: /home/megrez/cvsroot/pari/src/modules/elliptic.c,v
retrieving revision 1.35
retrieving revision 1.37
diff -c -r1.35 -r1.37
*** src/modules/elliptic.c 2002/01/08 22:19:34 1.35
--- src/modules/elliptic.c 2002/01/23 19:56:48 1.37
***************
*** 1339,1352 ****
static GEN
addsell(GEN e, GEN z1, GEN z2, GEN p)
{
! GEN p1,p2,x,x1,x2,y,y1,y2;
! long av = avma;
if (!z1) return z2;
if (!z2) return z1;
x1 = (GEN)z1[1]; y1 = (GEN)z1[2];
x2 = (GEN)z2[1]; y2 = (GEN)z2[2];
p2 = subii(x2, x1);
if (p2 == gzero)
{
--- 1339,1353 ----
static GEN
addsell(GEN e, GEN z1, GEN z2, GEN p)
{
! GEN z,p1,p2,x,x1,x2,y,y1,y2;
! ulong av;
if (!z1) return z2;
if (!z2) return z1;
x1 = (GEN)z1[1]; y1 = (GEN)z1[2];
x2 = (GEN)z2[1]; y2 = (GEN)z2[2];
+ z = cgetg(3, t_VEC); av = avma;
p2 = subii(x2, x1);
if (p2 == gzero)
{
***************
*** 1358,1368 ****
else p1 = subii(y2,y1);
p1 = mulii(p1, mpinvmod(p2, p));
p1 = resii(p1, p);
! x = subii(sqri(p1), addii(x1,x2)); x = modii(x,p);
y = negi(addii(y1, mulii(p1,subii(x,x1))));
! avma = av; p1 = cgetg(3,t_VEC);
! p1[1] = licopy(x);
! p1[2] = lmodii(y, p); return p1;
}
/* z1 <-- z1 + z2 */
--- 1359,1370 ----
else p1 = subii(y2,y1);
p1 = mulii(p1, mpinvmod(p2, p));
p1 = resii(p1, p);
! x = subii(sqri(p1), addii(x1,x2));
y = negi(addii(y1, mulii(p1,subii(x,x1))));
! x = modii(x,p);
! y = modii(y,p); avma = av;
! z[1] = licopy(x);
! z[2] = licopy(y); return z;
}
/* z1 <-- z1 + z2 */
--
Karim Belabas Tel: (+33) (0)1 69 15 57 48
Dép. de Mathematiques, Bat. 425 Fax: (+33) (0)1 69 15 60 19
Université Paris-Sud Email: Karim.Belabas@math.u-psud.fr
F-91405 Orsay (France) http://www.math.u-psud.fr/~belabas
--
PARI/GP Home Page: http://www.parigp-home.de/