Karim BELABAS on Fri, 13 Nov 1998 13:25:49 +0100 (MET) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
2.0.12.alpha, patch 1(glcm) |
This patch corrects a bug reported (directly to us) by Thomas Papanikolaou in the glcm function, which could occur (rarely) when the operands had both more than 150 digits, and became systematic after ~5000 digits. Symptom: wrong result due to stack corruption (not even guaranteed to be a multiple of either operand). Many thanks to Gerhard Niklasch for a careful analysis of the problem. Karim. *** src/basemath/polarit2.c.orig Fri Nov 6 16:08:22 1998 --- src/basemath/polarit2.c Fri Nov 13 13:13:00 1998 *************** *** 1288,1301 **** if (gcmp0(x)) return gzero; if (tx==t_INT && ty==t_INT) { ! (void)new_chunk(lgefint(x)+lgefint(y)); ! p1=mppgcd(x,y); p2=divii(y,p1); avma = av; ! /* should be diviiexact. But still buggy...*/ ! p2 = mulii(p2,x); if (signe(p2)<0) setsigne(p2,1); ! return p2; } ! p1=ggcd(x,y); p2=gdiv(y,p1); ! p2=gmul(p2,x); if (typ(p2)==t_INT && signe(p2)<0) setsigne(p2,1); if (typ(p2)==t_POL) { --- 1288,1300 ---- if (gcmp0(x)) return gzero; if (tx==t_INT && ty==t_INT) { ! p1 = mppgcd(x,y); if (is_pm1(p1)) { avma = av; return mulii(x,y); } ! p2 = mulii(divii(y,p1), x); ! if (signe(p2)<0) setsigne(p2,1); ! return gerepileupto(av, p2); } ! p1 = ggcd(x,y); if (gcmp1(p1)) { avma = av; return gmul(x,y); } ! p2 = gmul(gdiv(y,p1), x); if (typ(p2)==t_INT && signe(p2)<0) setsigne(p2,1); if (typ(p2)==t_POL) { -- 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://pari.home.ml.org