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 ****
  	case t_PADIC: return factorpadic4(x,p,pa);
  
          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;
              case t_QUAD: p5=cgetg(4,t_QUAD);
                p5[1]=(long)pol; p5[2]=zero; p5[3]=un;
  	    default: err(impl,"factor of general polynomial");
            }
            p2=(GEN)p1[1];
--- 872,911 ----
  	case t_PADIC: return factorpadic4(x,p,pa);
  
          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;
              case t_QUAD: p5=cgetg(4,t_QUAD);
                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
--
PARI/GP Home Page: http://pari.home.ml.org