Gerhard Niklasch on Thu, 13 Apr 2000 21:46:04 +0200 (MET DST) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: bug report (.roots member function) |
(Moving this from pari-users to pari-dev, and Cc'ing Cliff Bergman in case he isn't subscribed to the latter: apologies if you get this twice, Cliff!) In response to: > Message-Id: <200004131920.OAA10409@orion.math.iastate.edu> > Date: Thu, 13 Apr 2000 14:20:06 -0500 > From: Cliff Bergman <cbergman@iastate.edu> > To: pari-users@list.cr.yp.to > Subject: bug report > > Hello. I just (twice) got an error starting from a clean invocation of gp > 2.0.17 (under Redhat Linux 6.1) after the following computations: > > ? ec=[0,0,0,-Mod(1,13),-Mod(3,13)] > %1 = [0, 0, 0, Mod(12, 13), Mod(10, 13)] > ? c=ellinit(ec,1) > %2 = [0, 0, 0, Mod(12, 13), Mod(10, 13), 0, Mod(11, 13), Mod(1, 13), Mod(12, 13), Mod(9, 13), Mod(5, 13), Mod(11, 13), Mod(6, 13)] > ? c.disc > %3 = Mod(11, 13) > ? c.roots > *** segmentation fault: bug in GP (please report). > > I'm just doing as requested: reporting the error. Enjoy! Thanks! Still present in 2.0.19.beta (on Solaris, I get a Bus Error / SIGBUS), and the mechanism is fairly obvious: the .roots member function appears to look blindly for one of the last six components of the curve, but since ellinit was called with flag=1, there are only 13 instead of 19 components. (I tried a few curves of either kind.) The culprit is src/language/anal.c : ===8<--- static GEN mroots(GEN x) /* roots */ { int t; GEN y = get_nf(x,&t); if (!y) { if (t == typ_ELL) return (GEN)x[14]; /* <<< here --GN */ if (t == typ_GAL) return (GEN)x[3]; err(member,"roots",mark.member,mark.start); } return (GEN)y[6]; } --->8=== (And last I checked the CVS archive, about 1 minute ago, it's still like this.) I guess it should return gzero when x[14] is beyond the length of x --- comments anyone? Cheers, Gerhard