[BACK]Return to PD.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / engine

Diff for /OpenXM_contrib2/asir2000/engine/PD.c between version 1.3 and 1.5

version 1.3, 2000/08/22 05:04:04 version 1.5, 2001/10/09 01:36:11
Line 45 
Line 45 
  * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,   * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
  * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.   * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
  *   *
  * $OpenXM: OpenXM_contrib2/asir2000/engine/PD.c,v 1.2 2000/08/21 08:31:26 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/engine/PD.c,v 1.4 2001/03/29 09:49:57 noro Exp $
 */  */
 #ifndef FBASE  #ifndef FBASE
 #define FBASE  #define FBASE
Line 169  P p1,p2,*q;
Line 169  P p1,p2,*q;
 }  }
   
 #ifdef FBASE  #ifdef FBASE
 void plisttop(f,v,n,gp)  void plisttop(P *f,V v,int n,P *gp)
 P *f;  
 V v;  
 int n;  
 P *gp;  
 {  {
         int i;          int i;
         DCP dc,dc0;          DCP dc,dc0;
Line 198  P *gp;
Line 194  P *gp;
         }          }
 }  }
   
 int divtpz(vl,p1,p2,q)  /* for multivariate polynomials over fields */
 VL vl;  
 P p1,p2,*q;  int divtp(VL vl,P p1,P p2,P *q)
 {  {
         register int i,j;          register int i,j;
         register DCP dc1,dc2,dc;          register DCP dc1,dc2,dc;
Line 212  P p1,p2,*q;
Line 208  P p1,p2,*q;
   
         if ( !p1 ) {          if ( !p1 ) {
                 *q = 0;                  *q = 0;
                   return 1;
           } else if ( NUM(p2) ) {
                   divsp(vl,p1,p2,q);
                   return 1;
           } else if ( NUM(p1) ) {
                   *q = 0;
                   return 0;
           } else if ( ( v1 = VR(p1) ) == ( v2 = VR(p2) ) ) {
                   dc1 = DC(p1); dc2 = DC(p2);
                   deg1 = DEG(dc1); deg2 = DEG(dc2);
                   sgn = cmpq(deg1,deg2);
                   if ( sgn == 0 )
                           if ( !divtp(vl,COEF(dc1),COEF(dc2),&m) ) {
                                   *q = 0;
                                   return 0;
                           } else {
                                   mulp(vl,p2,m,&m1); subp(vl,p1,m1,&s);
                                   if ( !s ) {
                                           *q = m;
                                           return 1;
                                   } else {
                                           *q = 0;
                                           return 0;
                                   }
                           }
                   else if ( sgn < 0 ) {
                           *q = 0;
                           return 0;
                   } else {
                           if ( (PL(NM(deg1)) > 1) ) {
                                   error("divtp : invalid input");
                                   *q = 0;
                                   return ( 0 );
                           }
                           d1 = QTOS(deg1); d2 = QTOS(deg2);
                           W_CALLOC(d1-d2,P,pq); W_CALLOC(d1,P,pr); W_CALLOC(d2,P,pd);
                           for ( dc = dc1; dc; dc = NEXT(dc) )
                                   pr[QTOS(DEG(dc))] = COEF(dc);
                           for ( dc = dc2; dc; dc = NEXT(dc) )
                                   pd[QTOS(DEG(dc))] = COEF(dc);
                           for ( dvr = COEF(dc2), i = d1 - d2; i >= 0; i-- )
                                   if ( !pr[i+d2] )
                                           continue;
                                   else if ( !divtp(vl,pr[i+d2],dvr,&m) ) {
                                           *q = 0;
                                           return 0;
                                   } else {
                                           pq[i] = m;
                                           for ( j = d2; j >= 0; j-- ) {
                                                   mulp(vl,pq[i],pd[j],&m);
                                                   subp(vl,pr[i + j],m,&s); pr[i + j] = s;
                                           }
                                   }
                           plisttop(pq,v1,d1 - d2,&m); plisttop(pr,v1,d1 - 1,&t);
                           if ( t ) {
                                   *q = 0;
                                   return 0;
                           } else {
                                   *q = m;
                                   return 1;
                           }
                   }
           } else {
                   for ( ; (v1 != vl->v) && (v2 != vl->v); vl = NEXT(vl) );
                   if ( v2 == vl->v ) {
                           *q = 0;
                           return 0;
                   } else
                           return divtdcp(vl,p1,p2,q);
           }
   }
   
   int divtdcp(VL vl,P p1,P p2,P *q)
   {
   
           P m;
           register DCP dc,dcr,dcr0;
   
           for ( dc = DC(p1), dcr0 = 0; dc; dc = NEXT(dc) )
                   if ( !divtp(vl,COEF(dc),p2,&m) ) {
                           *q = 0;
                           return 0;
                   } else {
                           NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); COEF(dcr) = m; NEXT(dcr) = 0;
                   }
           MKP(VR(p1),dcr0,*q);
           return 1;
   }
   
   int divtpz(VL vl,P p1,P p2,P *q)
   {
           register int i,j;
           register DCP dc1,dc2,dc;
           P m,m1,s,dvr,t;
           P *pq,*pr,*pd;
           V v1,v2;
           Q deg1,deg2;
           int d1,d2,sgn;
   
           if ( !p1 ) {
                   *q = 0;
                 return ( 1 );                  return ( 1 );
         } else if ( NUM(p2) )          } else if ( NUM(p2) )
                 if ( NUM(p1) ) {                  if ( NUM(p1) ) {
Line 300  P p1,p2,*q;
Line 397  P p1,p2,*q;
         }          }
 }  }
   
 int divtdcpz(vl,p1,p2,q)  int divtdcpz(VL vl,P p1,P p2,P *q)
 VL vl;  
 P p1,p2,*q;  
 {  {
   
         P m;          P m;
Line 319  P p1,p2,*q;
Line 414  P p1,p2,*q;
         return ( 1 );          return ( 1 );
 }  }
   
 void udivpz(f1,f2,fqp,frp)  void udivpz(P f1,P f2,P *fqp,P *frp)
 P f1,f2,*fqp,*frp;  
 {  {
         register int n1,n2,i,j;          register int n1,n2,i,j;
         Q *pq,*pr,*pd,d,m,s,q;          Q *pq,*pr,*pd,d,m,s,q;
Line 385  P f1,f2,*fqp,*frp;
Line 479  P f1,f2,*fqp,*frp;
         plisttop((P *)pq,VR(f1),n1-n2,fqp); plisttop((P *)pr,VR(f1),n2-1,frp);          plisttop((P *)pq,VR(f1),n1-n2,fqp); plisttop((P *)pr,VR(f1),n2-1,frp);
 }  }
   
 void udivpwm(mod,p1,p2,q,r)  void udivpwm(Q mod,P p1,P p2,P *q,P *r)
 Q mod;  
 P p1,p2;  
 P *q,*r;  
 {  {
         P s,t,u,tq,tr;          P s,t,u,tq,tr;
   
Line 397  P *q,*r;
Line 488  P *q,*r;
         cmp(mod,tr,r); mulpq(tq,t,&s); cmp(mod,s,q);          cmp(mod,tr,r); mulpq(tq,t,&s); cmp(mod,s,q);
 }  }
   
 void udivpzwm(mod,f1,f2,fqp,frp)  void udivpzwm(Q mod,P f1,P f2,P *fqp,P *frp)
 Q mod;  
 P f1,f2,*fqp,*frp;  
 {  {
         register int n1,n2,i,j;          register int n1,n2,i,j;
         Q *pq,*pr,*pd,d,m,s,q;          Q *pq,*pr,*pd,d,m,s,q;

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.5

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>