[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.1 and 1.5

version 1.1, 1999/12/03 07:39:08 version 1.5, 2001/10/09 01:36:11
Line 1 
Line 1 
 /* $OpenXM: OpenXM/src/asir99/engine/PD.c,v 1.1.1.1 1999/11/10 08:12:26 noro Exp $ */  /*
    * Copyright (c) 1994-2000 FUJITSU LABORATORIES LIMITED
    * All rights reserved.
    *
    * FUJITSU LABORATORIES LIMITED ("FLL") hereby grants you a limited,
    * non-exclusive and royalty-free license to use, copy, modify and
    * redistribute, solely for non-commercial and non-profit purposes, the
    * computer program, "Risa/Asir" ("SOFTWARE"), subject to the terms and
    * conditions of this Agreement. For the avoidance of doubt, you acquire
    * only a limited right to use the SOFTWARE hereunder, and FLL or any
    * third party developer retains all rights, including but not limited to
    * copyrights, in and to the SOFTWARE.
    *
    * (1) FLL does not grant you a license in any way for commercial
    * purposes. You may use the SOFTWARE only for non-commercial and
    * non-profit purposes only, such as academic, research and internal
    * business use.
    * (2) The SOFTWARE is protected by the Copyright Law of Japan and
    * international copyright treaties. If you make copies of the SOFTWARE,
    * with or without modification, as permitted hereunder, you shall affix
    * to all such copies of the SOFTWARE the above copyright notice.
    * (3) An explicit reference to this SOFTWARE and its copyright owner
    * shall be made on your publication or presentation in any form of the
    * results obtained by use of the SOFTWARE.
    * (4) In the event that you modify the SOFTWARE, you shall notify FLL by
    * e-mail at risa-admin@sec.flab.fujitsu.co.jp of the detailed specification
    * for such modification or the source code of the modified part of the
    * SOFTWARE.
    *
    * THE SOFTWARE IS PROVIDED AS IS WITHOUT ANY WARRANTY OF ANY KIND. FLL
    * MAKES ABSOLUTELY NO WARRANTIES, EXPRESSED, IMPLIED OR STATUTORY, AND
    * EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS
    * FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT OF THIRD PARTIES'
    * RIGHTS. NO FLL DEALER, AGENT, EMPLOYEES IS AUTHORIZED TO MAKE ANY
    * MODIFICATIONS, EXTENSIONS, OR ADDITIONS TO THIS WARRANTY.
    * UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, TORT, CONTRACT,
    * OR OTHERWISE, SHALL FLL BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY
    * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL
    * DAMAGES OF ANY CHARACTER, INCLUDING, WITHOUT LIMITATION, DAMAGES
    * ARISING OUT OF OR RELATING TO THE SOFTWARE OR THIS AGREEMENT, DAMAGES
    * FOR LOSS OF GOODWILL, WORK STOPPAGE, OR LOSS OF DATA, OR FOR ANY
    * DAMAGES, EVEN IF FLL SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF
    * SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY. EVEN IF A PART
    * OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY
    * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
    * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
    *
    * $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
 #endif  #endif
Line 121  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 150  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 164  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 252  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 271  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 337  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 349  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.1  
changed lines
  Added in v.1.5

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