Karim BELABAS on Mon, 11 Oct 1999 16:57:43 +0200 (MET DST) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: bug report |
[Kiyoshi Ohgishi:] > > I found the following. [...] > ? randomprime()= > { > p=random; > while(isprime(p)!=1,p++); > p > } > ? while(ellap(E=ellinit([0,0,0,random,random]),p=randomprime)!=1,) > *** bug in apell1: doubling?, please report Indeed, there was a missing case. I had mistakenly decided it couldn't occur but left the assertion behind, just in case. The fix is small, but the patch is quite big, since I added/modified some comments while I was investigating. Karim. P.S: randomprime() = nextprime(random); would be more efficient [not that it matters much...]. P.S2: Anybody feels like implementing SEA ? Index: src/modules/elliptic.c =================================================================== RCS file: /home/megrez/cvsroot/pari/src/modules/elliptic.c,v retrieving revision 1.4 diff -c -r1.4 elliptic.c *** src/modules/elliptic.c 1999/10/01 14:13:46 1.4 --- src/modules/elliptic.c 1999/10/11 14:45:16 *************** *** 1547,1559 **** fh = powsell(cp4,f,h,p); s = itos(gceil(gsqrt(gdiv(pordmin,bcon),DEFAULTPREC))) >> 1; nb = min(128, s >> 1); if (bcon == gun) { /* first time: initialize */ tx = newbloc(s+1); *tx = evaltyp(t_VECSMALL) | evallg(s+1); ty = newbloc(s+1); ti = newbloc(s+1); } ! else f = powsell(cp4,f,bcon,p); if (!fh) goto FOUND; p1 = gcopy(fh); --- 1547,1560 ---- fh = powsell(cp4,f,h,p); s = itos(gceil(gsqrt(gdiv(pordmin,bcon),DEFAULTPREC))) >> 1; nb = min(128, s >> 1); + /* look for h s.t f^h = 0 */ if (bcon == gun) { /* first time: initialize */ tx = newbloc(s+1); *tx = evaltyp(t_VECSMALL) | evallg(s+1); ty = newbloc(s+1); ti = newbloc(s+1); } ! else f = powsell(cp4,f,bcon,p); /* F */ if (!fh) goto FOUND; p1 = gcopy(fh); *************** *** 1561,1596 **** j = lgefint(p); for (i=1; i<=nb; i++) { /* baby steps */ ! pts[i] = (long)p1; _fix(p1+1, j); tx[i] = _low((GEN)p1[1]); _fix(p1+2, j); ty[i] = _low((GEN)p1[2]); ! p1 = addsell(cp4,p1,f,p); /* f^h * F^nb */ if (!p1) { h = addii(h, mulsi(i,bcon)); goto FOUND; } } mfh = dummycopy(fh); mfh[2] = lnegi((GEN)mfh[2]); ! fg = addsell(cp4,p1,mfh,p); /* F^nb */ ! if (!fg) { h = addii(h, mulsi(nb,bcon)); goto FOUND; } u = cgetg(nb+1, t_VEC); av2 = avma; /* more baby steps, nb points at a time */ while (i <= s) { long maxj; ! for (j=1; j<=nb; j++) { ! p1 = (GEN)pts[j]; u[j] = lsubii((GEN)fg[1], (GEN)p1[1]); ! if (u[j] == zero) { ! if (!signe(p1[2]) || !egalii((GEN)p1[2],(GEN)fg[2])) ! { h = addii(h, mulsi(i+j-1,bcon)); goto FOUND; } ! /* doubling never occurs */ ! err(bugparier, "apell1: doubling?"); } } v = multi_invmod(u, p); maxj = (i-1 + nb <= s)? nb: s % nb; ! for (j=1; j<=maxj; j++,i++) { p1 = (GEN)pts[j]; addsell_part2(cp4,p1,fg,p, (GEN)v[j]); --- 1562,1597 ---- j = lgefint(p); for (i=1; i<=nb; i++) { /* baby steps */ ! pts[i] = (long)p1; /* h.f + (i-1).F */ _fix(p1+1, j); tx[i] = _low((GEN)p1[1]); _fix(p1+2, j); ty[i] = _low((GEN)p1[2]); ! p1 = addsell(cp4,p1,f,p); /* h.f + i.F */ if (!p1) { h = addii(h, mulsi(i,bcon)); goto FOUND; } } mfh = dummycopy(fh); mfh[2] = lnegi((GEN)mfh[2]); ! fg = addsell(cp4,p1,mfh,p); /* nb.F */ ! if (!fg) { h = mulsi(nb,bcon); goto FOUND; } u = cgetg(nb+1, t_VEC); av2 = avma; /* more baby steps, nb points at a time */ while (i <= s) { long maxj; ! for (j=1; j<=nb; j++) /* adding nb.F (part 1) */ { ! p1 = (GEN)pts[j]; /* h.f + (i-nb-1+j-1).F */ u[j] = lsubii((GEN)fg[1], (GEN)p1[1]); ! if (u[j] == zero) /* sum = 0 or doubling */ { ! long k = i+j-2; ! if (egalii((GEN)p1[2],(GEN)fg[2])) k -= 2*nb; /* fg = p1 */ ! h = addii(h, mulsi(k,bcon)); ! goto FOUND; } } v = multi_invmod(u, p); maxj = (i-1 + nb <= s)? nb: s % nb; ! for (j=1; j<=maxj; j++,i++) /* adding nb.F (part 2) */ { p1 = (GEN)pts[j]; addsell_part2(cp4,p1,fg,p, (GEN)v[j]); *************** *** 1617,1623 **** gaffect(fg, (GEN)pts[1]); for (j=2; j<=nb; j++) /* pts = first nb multiples of fg */ gaffect(addsell(cp4,(GEN)pts[j-1],fg,p), (GEN)pts[j]); ! /* replace fg by fg^nb since we do nb points at a time */ avma = av2; fg = gcopy((GEN)pts[nb]); av2 = avma; --- 1618,1624 ---- gaffect(fg, (GEN)pts[1]); for (j=2; j<=nb; j++) /* pts = first nb multiples of fg */ gaffect(addsell(cp4,(GEN)pts[j-1],fg,p), (GEN)pts[j]); ! /* replace fg by nb.fg since we do nb points at a time */ avma = av2; fg = gcopy((GEN)pts[nb]); av2 = avma; *************** *** 1647,1655 **** p1 = addsell(cp4, powsell(cp4,f,stoi(j2),p),fh,p); if (egalii((GEN)p1[1], (GEN)ftest[1])) { - h = addii(h, mulsi(j2,bcon)); if (egalii((GEN)p1[2], (GEN)ftest[2])) i = -i; ! h = addii(h, mulsi(s, mulsi(i, bcon))); goto FOUND; } } --- 1648,1655 ---- p1 = addsell(cp4, powsell(cp4,f,stoi(j2),p),fh,p); if (egalii((GEN)p1[1], (GEN)ftest[1])) { if (egalii((GEN)p1[2], (GEN)ftest[2])) i = -i; ! h = addii(h, mulii(addis(mulss(s,i), j2), bcon)); goto FOUND; } } __ 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/