Karim BELABAS on Tue, 8 Dec 1998 17:13:25 +0100 (MET)

[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

 Re: bug with complex coefficient polynomials

```[Igor:]
> ? factor(x^2-I)
>   ***   segmentation fault: bug in GP (please report).

This one was hard to correct... I had introduced two different bugs when
trying

1) to improve factornf (use modular gcd), but the input is not always suitable.

2) to avoid the following annoyance:

(17:09) gp > factor(x^2+I)
%1 =
[x^2 + I 1]

(17:09) gp > factor(y^2+I)
***   polynomial variable must be of higher priority than number field
variable in factornf.

[Also 3): the internal data was inconsistent but used to work due to a kernel
"feature" ]

It should work better now (and with t_QUADs also).

Karim.

P.S: I will try to put together 2.0.13.alpha before the end of the week.

*** src/basemath/polarit2.c.orig	Fri Nov 13 13:26:00 1998
--- src/basemath/polarit2.c	Tue Dec  8 16:59:28 1998
***************
*** 633,642 ****
{
long t[LT]; /* code pour 0,1,2,3,61,62,63,67,7,81,82,83,86,87,91,93,97 */
long tx = typ(x),lx,i,j,s,pa=BIGINT;
!   static long pcx[] = { evaltyp(t_POL)|m_evallg(5),
!                         evalsigne(1)|evalvarn(0)|m_evallgef(5),
!                         0, 0, 0 }; /* x^2 + 1 */
!   GEN  p=NULL,pol=NULL,p1,p2;

if (is_scalar_t(tx))
{
--- 633,639 ----
{
long t[LT]; /* code pour 0,1,2,3,61,62,63,67,7,81,82,83,86,87,91,93,97 */
long tx = typ(x),lx,i,j,s,pa=BIGINT;
!   GEN pcx=NULL, p=NULL,pol=NULL,p1,p2;

if (is_scalar_t(tx))
{
***************
*** 644,650 ****
x = scalarpol(x,0);
}
for (i=2; i<LT; i++) t[i]=0; /* t[0..1] unused */
!   lx = lgef(x); pcx[2]=pcx[4]=un; pcx[3]=zero;
for (i=2; i<lx; i++)
{
p1=(GEN)x[i];
--- 641,647 ----
x = scalarpol(x,0);
}
for (i=2; i<LT; i++) t[i]=0; /* t[0..1] unused */
!   lx = lgef(x);
for (i=2; i<lx; i++)
{
p1=(GEN)x[i];
***************
*** 659,664 ****
--- 656,667 ----
assign_or_fail((GEN)p1[1],p);
t[3]=1; break;
case t_COMPLEX:
+         if (!pcx)
+         {
+           pcx = cgetg(5,t_POL); /* x^2 + 1 */
+           pcx[1] = evalsigne(1)|evalvarn(0)|m_evallgef(5),
+           pcx[2]=pcx[4]=un; pcx[3]=zero;
+         }
for (j=1; j<=2; j++)
{
p2 = (GEN)p1[j];
***************
*** 869,900 ****

default:
! 	  av=avma; x = dummycopy(x); lx=lgef(x); v = varn(pol);
! 	  for(i=2; i<lx; i++)
! 	  {
! 	    p1=(GEN)x[i];
! 	    switch(typ(p1))
! 	    {
! 	      case t_QUAD: p1++;
! 	      case t_COMPLEX:
! 	        p2 = cgetg(3, t_POLMOD); x[i] = (long) p2;
! 		p2[1] = (long)pol;
! 		p2[2] = (long)poldeg1(v, (GEN)p1[1],(GEN)p1[2]);
! 	    }
! 	  }
! 	  tetpil=avma;
! 	  switch(typ2(tx))
! 	  {
! 	    case t_INT: p1 = polfnf(x,pol); break;
! 	    case t_INTMOD: p1 = factmod9(x,p,pol); break;
default: err(impl,"factor of general polynomial");
! 	  }
switch (typ1(tx))
{
!             case t_POLMOD: return gerepile(av,tetpil,p1);
case t_COMPLEX: p5 = gi; break;
p5[1]=(long)pol; p5[2]=zero; p5[3]=un;
default: err(impl,"factor of general polynomial");
}
p2=(GEN)p1[1];
--- 872,911 ----

default:
!         {
!           long killv;
! 	  av=avma; x = dummycopy(x); lx=lgef(x);
!           pol = dummycopy(pol);
!           v = manage_var(4,NULL);
!           for(i=2; i<lx; i++)
!           {
!             p1=(GEN)x[i];
!             switch(typ(p1))
!             {
!               case t_QUAD: p1++;
!               case t_COMPLEX:
!                 p2 = cgetg(3, t_POLMOD); x[i] = (long) p2;
!                 p2[1] = (long)pol;
!                 p2[2] = (long)poldeg1(v, (GEN)p1[1],(GEN)p1[2]);
!             }
!           }
!           killv = (avma != (long)pol);
!           if (killv) setvarn(pol, fetch_var());
!           switch (typ2(tx))
!           {
!             case t_INT: p1 = polfnf(x,pol); break;
!             case t_INTMOD: p1 = factmod9(x,p,pol);
default: err(impl,"factor of general polynomial");
!           }
switch (typ1(tx))
{
!             case t_POLMOD:
!               if (killv) delete_var();
!               return gerepileupto(av,p1);
case t_COMPLEX: p5 = gi; break;
p5[1]=(long)pol; p5[2]=zero; p5[3]=un;
+               break;
default: err(impl,"factor of general polynomial");
}
p2=(GEN)p1[1];
***************
*** 904,915 ****
for(j=2; j<lgef(p3); j++)
{
p4=(GEN)p3[j];
!               if(typ(p4)==t_POLMOD) p3[j]=lsubst((GEN)p4[2],varn(pol),p5);
}
}
tetpil=avma; y=cgetg(3,t_MAT);
y[1]=lcopy(p2);y[2]=lcopy((GEN)p1[2]);
return gerepile(av,tetpil,y);
}

case t_RFRACN:
--- 915,928 ----
for(j=2; j<lgef(p3); j++)
{
p4=(GEN)p3[j];
!               if(typ(p4)==t_POLMOD) p3[j]=lsubst((GEN)p4[2],v,p5);
}
}
+           if (killv) delete_var();
tetpil=avma; y=cgetg(3,t_MAT);
y[1]=lcopy(p2);y[2]=lcopy((GEN)p1[2]);
return gerepile(av,tetpil,y);
+         }
}

case t_RFRACN:
***************
*** 2253,2259 ****
vt=varn(t); v=varn(a);
if (vt<v)
err(talker,"polynomial variable must be of higher priority than number field variable\nin factornf");
!   u = gdiv(a,modulargcd(a,derivpol(a)));
unt = gmodulsg(1,t); u = gmul(unt,u);
g=lift(u); k = -2;
do
--- 2264,2270 ----
vt=varn(t); v=varn(a);
if (vt<v)
err(talker,"polynomial variable must be of higher priority than number field variable\nin factornf");
!   u = gdiv(a,ggcd(a,derivpol(a)));
unt = gmodulsg(1,t); u = gmul(unt,u);
g=lift(u); k = -2;
do
*** src/language/anal.c.orig	Wed Dec  2 16:21:54 1998
--- src/language/anal.c	Tue Dec  8 14:55:05 1998
***************
*** 1660,1665 ****
--- 1660,1666 ----
{
case 2: return nvar=0;
case 3: return nvar;
+       case 4: return max_avail;
}

/* user wants to delete one of his/her/its variables */
--
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
--