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

Diff for /OpenXM_contrib2/asir2000/engine/C.c between version 1.7 and 1.15

version 1.7, 2001/05/28 08:22:01 version 1.15, 2018/03/29 01:32:51
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/C.c,v 1.6 2001/03/14 06:04:53 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/engine/C.c,v 1.14 2003/01/16 00:33:28 noro Exp $
 */  */
 #include "ca.h"  #include "ca.h"
 #include "inline.h"  #include "inline.h"
Line 54 
Line 54 
 V up_var;  V up_var;
   
 /* binary has at least 32 leading 0 chars. */  /* binary has at least 32 leading 0 chars. */
 void binaryton(binary,np)  void binaryton(char *binary,N *np)
 char *binary;  
 N *np;  
 {  {
         int i,w,len;    int i,w,len;
         N n;    N n;
         char buf[33];    char buf[33];
   
         binary += strlen(binary)%32;    binary += strlen(binary)%32;
         len = strlen(binary);    len = strlen(binary);
         w = len/32; /* sufficient for holding binary */    w = len/32; /* sufficient for holding binary */
         n = NALLOC(w);    n = NALLOC(w);
         for ( i = 0; i < w; i++ ) {    for ( i = 0; i < w; i++ ) {
                 strncpy(buf,binary+len-32*(i+1),32); buf[32] = 0;      strncpy(buf,binary+len-32*(i+1),32); buf[32] = 0;
                 n->b[i] = strtoul(buf,0,2);      n->b[i] = strtoul(buf,0,2);
         }    }
         for ( i = w-1; i >= 0 && !n->b[i]; i-- );    for ( i = w-1; i >= 0 && !n->b[i]; i-- );
         if ( i < 0 )    if ( i < 0 )
                 *np = 0;      *np = 0;
         else {    else {
                 n->p = i+1;      n->p = i+1;
                 *np = n;      *np = n;
         }    }
 }  }
   
 /* hex has at least 8 leading 0 chars. */  /* hex has at least 8 leading 0 chars. */
 void hexton(hex,np)  void hexton(char *hex,N *np)
 char *hex;  
 N *np;  
 {  {
         int i,w,len;    int i,w,len;
         N n;    N n;
         char buf[9];    char buf[9];
   
         hex += strlen(hex)%8;    hex += strlen(hex)%8;
         len = strlen(hex);    len = strlen(hex);
         w = len/8; /* sufficient for holding hex */    w = len/8; /* sufficient for holding hex */
         n = NALLOC(w);    n = NALLOC(w);
         for ( i = 0; i < w; i++ ) {    for ( i = 0; i < w; i++ ) {
                 strncpy(buf,hex+len-8*(i+1),8); buf[8] = 0;      strncpy(buf,hex+len-8*(i+1),8); buf[8] = 0;
                 n->b[i] = strtoul(buf,0,16);      n->b[i] = strtoul(buf,0,16);
         }    }
         for ( i = w-1; i >= 0 && !n->b[i]; i-- );    for ( i = w-1; i >= 0 && !n->b[i]; i-- );
         if ( i < 0 )    if ( i < 0 )
                 *np = 0;      *np = 0;
         else {    else {
                 n->p = i+1;      n->p = i+1;
                 *np = n;      *np = n;
         }    }
 }  }
   
 void ntobn(base,n,nrp)  void ntobn(int base,N n,N *nrp)
 int base;  
 N n,*nrp;  
 {  {
         int i,d,plc;    int i,d,plc;
         unsigned int *c,*x,*w;    unsigned int *c,*x,*w;
         unsigned int r;    unsigned int r;
         L m;    L m;
         N nr;    N nr;
   
         if ( !n ) {    if ( !n ) {
                 *nrp = NULL;      *nrp = NULL;
                 return;      return;
         }    }
   
         d = PL(n);    d = PL(n);
         w = BD(n);    w = BD(n);
   
         for ( i = 1, m = 1; m <= LBASE/(L)base; m *= base, i++ );    for ( i = 1, m = 1; m <= LBASE/(L)base; m *= base, i++ );
   
         c = (unsigned int *)W_ALLOC(d*i+1);    c = (unsigned int *)W_ALLOC(d*i+1);
         x = (unsigned int *)W_ALLOC(d+1);    x = (unsigned int *)W_ALLOC(d+1);
         for ( i = 0; i < d; i++ )    for ( i = 0; i < d; i++ )
                 x[i] = w[i];      x[i] = w[i];
         for ( plc = 0; d >= 1; plc++ ) {    for ( plc = 0; d >= 1; plc++ ) {
                 for ( i = d - 1, r = 0; i >= 0; i-- ) {      for ( i = d - 1, r = 0; i >= 0; i-- ) {
                         DSAB((unsigned int)base,r,x[i],x[i],r)        DSAB((unsigned int)base,r,x[i],x[i],r)
                 }      }
                 c[plc] = r;      c[plc] = r;
                 if ( !x[d-1] ) d--;      if ( !x[d-1] ) d--;
         }    }
   
         *nrp = nr = NALLOC(plc); INITRC(nr);    *nrp = nr = NALLOC(plc); INITRC(nr);
         PL(nr) = plc;    PL(nr) = plc;
         for ( i = 0; i < plc; i++ )    for ( i = 0; i < plc; i++ )
                 BD(nr)[i] = c[i];      BD(nr)[i] = c[i];
 }  }
   
 void bnton(base,n,nrp)  void bnton(int base,N n,N *nrp)
 int base;  
 N n,*nrp;  
 {  {
         unsigned int carry;    unsigned int carry;
         unsigned int *x,*w;    unsigned int *x,*w;
         int i,j,d,plc;    int i,j,d,plc;
         N nr;    N nr;
   
         if ( !n ) {    if ( !n ) {
                 *nrp = 0;      *nrp = 0;
                 return;      return;
         }    }
   
         d = PL(n);    d = PL(n);
         w = BD(n);    w = BD(n);
         x = (unsigned int *)W_ALLOC(d + 1);    x = (unsigned int *)W_ALLOC(d + 1);
   
         for ( plc = 0, i = d - 1; i >= 0; i-- ) {    for ( plc = 0, i = d - 1; i >= 0; i-- ) {
                 for ( carry = w[i],j = 0; j < plc; j++ ) {      for ( carry = w[i],j = 0; j < plc; j++ ) {
                         DMA(x[j],(unsigned int)base,carry,carry,x[j])        DMA(x[j],(unsigned int)base,carry,carry,x[j])
                 }      }
                 if ( carry ) x[plc++] = carry;      if ( carry ) x[plc++] = carry;
         }    }
         *nrp = nr = NALLOC(plc); INITRC(nr);    *nrp = nr = NALLOC(plc); INITRC(nr);
         PL(nr) = plc;    PL(nr) = plc;
         for ( i = 0; i < plc; i++ )    for ( i = 0; i < plc; i++ )
                 BD(nr)[i] = x[i];      BD(nr)[i] = x[i];
 }  }
   
 void ptomp(m,p,pr)  void ptomp(int m,P p,P *pr)
 int m;  
 P p;  
 P *pr;  
 {  {
         DCP dc,dcr,dcr0;    DCP dc,dcr,dcr0;
         Q q;    Q q;
         unsigned int a,b;    unsigned int a,b;
         P t;    P t;
         MQ s;    MQ s;
   
         if ( !p )    if ( !p )
                 *pr = 0;      *pr = 0;
         else if ( NUM(p) ) {    else if ( NUM(p) ) {
                 q = (Q)p;      q = (Q)p;
                 a = rem(NM(q),m);      a = rem(NM(q),m);
                 if ( a && (SGN(q) < 0) )      if ( a && (SGN(q) < 0) )
                         a = m-a;        a = m-a;
                 b = !DN(q)?1:rem(DN(q),m);      b = !DN(q)?1:rem(DN(q),m);
                 if ( !b )      if ( !b )
                         error("ptomp : denominator = 0");        error("ptomp : denominator = 0");
                 a = dmar(a,invm(b,m),0,m); STOMQ(a,s); *pr = (P)s;      a = dmar(a,invm(b,m),0,m); STOMQ(a,s); *pr = (P)s;
         } else {    } else {
                 for ( dc = DC(p), dcr0 = 0; dc; dc = NEXT(dc) ) {      for ( dc = DC(p), dcr0 = 0; dc; dc = NEXT(dc) ) {
                         ptomp(m,COEF(dc),&t);        ptomp(m,COEF(dc),&t);
                         if ( t ) {        if ( t ) {
                                 NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); COEF(dcr) = t;          NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); COEF(dcr) = t;
                         }        }
                 }      }
                 if ( !dcr0 )      if ( !dcr0 )
                         *pr = 0;        *pr = 0;
                 else {      else {
                         NEXT(dcr) = 0; MKP(VR(p),dcr0,*pr);        NEXT(dcr) = 0; MKP(VR(p),dcr0,*pr);
                 }      }
         }    }
 }  }
   
 void mptop(f,gp)  void mptop(P f,P *gp)
 P f;  
 P *gp;  
 {  {
         DCP dc,dcr,dcr0;    DCP dc,dcr,dcr0;
         Q q;    Q q;
   
         if ( !f )    if ( !f )
                 *gp = 0;      *gp = 0;
         else if ( NUM(f) )    else if ( NUM(f) )
                 STOQ(CONT((MQ)f),q),*gp = (P)q;      STOQ(CONT((MQ)f),q),*gp = (P)q;
         else {    else {
                 for ( dc = DC(f), dcr0 = 0; dc; dc = NEXT(dc) ) {      for ( dc = DC(f), dcr0 = 0; dc; dc = NEXT(dc) ) {
                         NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); mptop(COEF(dc),&COEF(dcr));        NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); mptop(COEF(dc),&COEF(dcr));
                 }      }
                 NEXT(dcr) = 0; MKP(VR(f),dcr0,*gp);      NEXT(dcr) = 0; MKP(VR(f),dcr0,*gp);
         }    }
 }  }
   
 void ptosfp(p,pr)  void ptosfp(P p,P *pr)
 P p;  
 P *pr;  
 {  {
         DCP dc,dcr,dcr0;    DCP dc,dcr,dcr0;
         GFS a;    GFS a;
         P t;    P t;
   
         if ( !p )    if ( !p )
                 *pr = 0;      *pr = 0;
         else if ( NUM(p) ) {    else if ( NUM(p) ) {
                 qtogfs((Q)p,&a); *pr = (P)a;      if ( NID((Num)p) == N_GFS )
         } else {        *pr = (P)p;
                 for ( dc = DC(p), dcr0 = 0; dc; dc = NEXT(dc) ) {      else {
                         ptosfp(COEF(dc),&t);        qtogfs((Q)p,&a); *pr = (P)a;
                         if ( t ) {      }
                                 NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); COEF(dcr) = t;    } else {
                         }      for ( dc = DC(p), dcr0 = 0; dc; dc = NEXT(dc) ) {
                 }        ptosfp(COEF(dc),&t);
                 if ( !dcr0 )        if ( t ) {
                         *pr = 0;          NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); COEF(dcr) = t;
                 else {        }
                         NEXT(dcr) = 0; MKP(VR(p),dcr0,*pr);      }
                 }      if ( !dcr0 )
         }        *pr = 0;
       else {
         NEXT(dcr) = 0; MKP(VR(p),dcr0,*pr);
       }
     }
 }  }
   
 void sfptop(f,gp)  void sfptop(P f,P *gp)
 P f;  
 P *gp;  
 {  {
         DCP dc,dcr,dcr0;    DCP dc,dcr,dcr0;
         Q q;    Q q;
         MQ fq;    MQ fq;
   
         if ( !f )    if ( !f )
                 *gp = 0;      *gp = 0;
         else if ( NUM(f) ) {    else if ( NUM(f) ) {
                 gfstomq((GFS)f,&fq);      gfstomq((GFS)f,&fq);
                 STOQ(CONT(fq),q);      STOQ(CONT(fq),q);
                 *gp = (P)q;      *gp = (P)q;
         } else {    } else {
                 for ( dc = DC(f), dcr0 = 0; dc; dc = NEXT(dc) ) {      for ( dc = DC(f), dcr0 = 0; dc; dc = NEXT(dc) ) {
                         NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); sfptop(COEF(dc),&COEF(dcr));        NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); sfptop(COEF(dc),&COEF(dcr));
                 }      }
                 NEXT(dcr) = 0; MKP(VR(f),dcr0,*gp);      NEXT(dcr) = 0; MKP(VR(f),dcr0,*gp);
         }    }
 }  }
   
 void sf_galois_action(p,e,pr)  void sfptopsfp(P f,V v,P *gp)
 P p;  
 Q e;  
 P *pr;  
 {  {
         DCP dc,dcr,dcr0;    DCP dc,dcr,dcr0;
         GFS a;    Q q;
         P t;    P fq;
   
         if ( !p )    if ( !f )
                 *pr = 0;      *gp = 0;
         else if ( NUM(p) ) {    else if ( NUM(f) )
                 gfs_galois_action(p,e,&a); *pr = (P)a;      gfstopgfs((GFS)f,v,gp);
         } else {    else {
                 for ( dc = DC(p), dcr0 = 0; dc; dc = NEXT(dc) ) {      for ( dc = DC(f), dcr0 = 0; dc; dc = NEXT(dc) ) {
                         sf_galois_action(COEF(dc),e,&t);        NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc);
                         if ( t ) {        sfptopsfp(COEF(dc),v,&COEF(dcr));
                                 NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); COEF(dcr) = t;      }
                         }      NEXT(dcr) = 0; MKP(VR(f),dcr0,*gp);
                 }    }
                 if ( !dcr0 )  
                         *pr = 0;  
                 else {  
                         NEXT(dcr) = 0; MKP(VR(p),dcr0,*pr);  
                 }  
         }  
 }  }
   
 void ptolmp(p,pr)  void sf_galois_action(P p,Q e,P *pr)
 P p;  
 P *pr;  
 {  {
         DCP dc,dcr,dcr0;    DCP dc,dcr,dcr0;
         LM a;    GFS a;
         P t;    P t;
   
         if ( !p )    if ( !p )
                 *pr = 0;      *pr = 0;
         else if ( NUM(p) ) {    else if ( NUM(p) ) {
                 qtolm((Q)p,&a); *pr = (P)a;      gfs_galois_action((GFS)p,e,&a); *pr = (P)a;
         } else {    } else {
                 for ( dc = DC(p), dcr0 = 0; dc; dc = NEXT(dc) ) {      for ( dc = DC(p), dcr0 = 0; dc; dc = NEXT(dc) ) {
                         ptolmp(COEF(dc),&t);        sf_galois_action(COEF(dc),e,&t);
                         if ( t ) {        if ( t ) {
                                 NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); COEF(dcr) = t;          NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); COEF(dcr) = t;
                         }        }
                 }      }
                 if ( !dcr0 )      if ( !dcr0 )
                         *pr = 0;        *pr = 0;
                 else {      else {
                         NEXT(dcr) = 0; MKP(VR(p),dcr0,*pr);        NEXT(dcr) = 0; MKP(VR(p),dcr0,*pr);
                 }      }
         }    }
 }  }
   
 void lmptop(f,gp)  /* GF(pn)={0,1,a,a^2,...} -> GF(pm)={0,1,b,b^2,..} ; a -> b^k */
 P f;  
 P *gp;  void sf_embed(P p,int k,int pm,P *pr)
 {  {
         DCP dc,dcr,dcr0;    DCP dc,dcr,dcr0;
         Q q;    GFS a;
     P t;
   
         if ( !f )    if ( !p )
                 *gp = 0;      *pr = 0;
         else if ( NUM(f) ) {    else if ( NUM(p) ) {
                 NTOQ(((LM)f)->body,1,q); *gp = (P)q;      gfs_embed((GFS)p,k,pm,&a); *pr = (P)a;
         } else {    } else {
                 for ( dc = DC(f), dcr0 = 0; dc; dc = NEXT(dc) ) {      for ( dc = DC(p), dcr0 = 0; dc; dc = NEXT(dc) ) {
                         NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); lmptop(COEF(dc),&COEF(dcr));        sf_embed(COEF(dc),k,pm,&t);
                 }        if ( t ) {
                 NEXT(dcr) = 0; MKP(VR(f),dcr0,*gp);          NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); COEF(dcr) = t;
         }        }
       }
       if ( !dcr0 )
         *pr = 0;
       else {
         NEXT(dcr) = 0; MKP(VR(p),dcr0,*pr);
       }
     }
 }  }
   
 void ptoum(m,f,wf)  void ptolmp(P p,P *pr)
 int m;  
 P f;  
 UM wf;  
 {  {
         unsigned int r;    DCP dc,dcr,dcr0;
         int i;    LM a;
         DCP dc;    P t;
   
         for ( i = UDEG(f); i >= 0; i-- )    if ( !p )
                 COEF(wf)[i] = 0;      *pr = 0;
     else if ( NUM(p) ) {
       qtolm((Q)p,&a); *pr = (P)a;
     } else {
       for ( dc = DC(p), dcr0 = 0; dc; dc = NEXT(dc) ) {
         ptolmp(COEF(dc),&t);
         if ( t ) {
           NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); COEF(dcr) = t;
         }
       }
       if ( !dcr0 )
         *pr = 0;
       else {
         NEXT(dcr) = 0; MKP(VR(p),dcr0,*pr);
       }
     }
   }
   
   void lmptop(P f,P *gp)
   {
     DCP dc,dcr,dcr0;
     Q q;
   
         for ( dc = DC(f); dc; dc = NEXT(dc) ) {    if ( !f )
                 r = rem(NM((Q)COEF(dc)),m);      *gp = 0;
                 if ( r && (SGN((Q)COEF(dc)) < 0) )    else if ( NUM(f) ) {
                         r = m-r;      NTOQ(((LM)f)->body,1,q); *gp = (P)q;
                 COEF(wf)[QTOS(DEG(dc))] = r;    } else {
         }      for ( dc = DC(f), dcr0 = 0; dc; dc = NEXT(dc) ) {
         degum(wf,UDEG(f));        NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); lmptop(COEF(dc),&COEF(dcr));
       }
       NEXT(dcr) = 0; MKP(VR(f),dcr0,*gp);
     }
 }  }
   
 void umtop(v,w,f)  void ptoum(int m,P f,UM wf)
 V v;  
 UM w;  
 P *f;  
 {  {
         int *c;    unsigned int r;
         DCP dc,dc0;    int i;
         int i;    DCP dc;
         Q q;  
   
         if ( DEG(w) < 0 )    for ( i = UDEG(f); i >= 0; i-- )
                 *f = 0;      COEF(wf)[i] = 0;
         else if ( DEG(w) == 0 )  
                 STOQ(COEF(w)[0],q), *f = (P)q;    for ( dc = DC(f); dc; dc = NEXT(dc) ) {
         else {      r = rem(NM((Q)COEF(dc)),m);
                 for ( i = DEG(w), c = COEF(w), dc0 = 0; i >= 0; i-- )      if ( r && (SGN((Q)COEF(dc)) < 0) )
                         if ( c[i] ) {        r = m-r;
                                 NEXTDC(dc0,dc);      COEF(wf)[QTOS(DEG(dc))] = r;
                                 STOQ(i,DEG(dc));    }
                                 STOQ(c[i],q), COEF(dc) = (P)q;    degum(wf,UDEG(f));
                         }  
                 NEXT(dc) = 0;  
                 MKP(v,dc0,*f);  
         }  
 }  }
   
 void ptoup(n,nr)  void umtop(V v,UM w,P *f)
 P n;  
 UP *nr;  
 {  {
         DCP dc;    int *c;
         UP r;    DCP dc,dc0;
         int d;    int i;
     Q q;
   
         if ( !n )    if ( DEG(w) < 0 )
                 *nr = 0;      *f = 0;
         else if ( OID(n) == O_N ) {    else if ( DEG(w) == 0 )
                 *nr = r = UPALLOC(0);      STOQ(COEF(w)[0],q), *f = (P)q;
                 DEG(r) = 0; COEF(r)[0] = (Num)n;    else {
         } else {      for ( i = DEG(w), c = COEF(w), dc0 = 0; i >= 0; i-- )
                 d = UDEG(n);        if ( c[i] ) {
                 up_var = VR(n);          NEXTDC(dc0,dc);
                 *nr = r = UPALLOC(d); DEG(r) = d;          STOQ(i,DEG(dc));
                 for ( dc = DC(n); dc; dc = NEXT(dc) ) {          STOQ(c[i],q), COEF(dc) = (P)q;
                         COEF(r)[QTOS(DEG(dc))] = (Num)COEF(dc);        }
                 }      NEXT(dc) = 0;
         }      MKP(v,dc0,*f);
     }
 }  }
   
 void uptop(n,nr)  void ptosfum(P f,UM wf)
 UP n;  
 P *nr;  
 {  {
         int i;    GFS c;
         DCP dc0,dc;    int i;
     DCP dc;
   
         if ( !n )    if ( OID(f) == O_N ) {
                 *nr = 0;      DEG(wf) = 0;
         else if ( !DEG(n) )      ntogfs((Obj)f,&c);
                 *nr = (P)COEF(n)[0];      COEF(wf)[0] = FTOIF(CONT(c));
         else {      return;
                 for ( i = DEG(n), dc0 = 0; i >= 0; i-- )    }
                         if ( COEF(n)[i] ) {  
                                 NEXTDC(dc0,dc); STOQ(i,DEG(dc)); COEF(dc) = (P)COEF(n)[i];    for ( i = UDEG(f); i >= 0; i-- )
                         }      COEF(wf)[i] = 0;
                 if ( !up_var )  
                         up_var = CO->v;    for ( dc = DC(f); dc; dc = NEXT(dc) ) {
                 MKP(up_var,dc0,*nr);      ntogfs((Obj)COEF(dc),&c);
         }      if ( c )
         COEF(wf)[QTOS(DEG(dc))] = FTOIF(CONT(c));
     }
     degum(wf,UDEG(f));
 }  }
   
 void ulmptoum(m,f,wf)  void sfumtop(V v,UM w,P *f)
 int m;  
 UP f;  
 UM wf;  
 {  {
         int i,d;    int *c;
         LM *c;    DCP dc,dc0;
     int i,t;
     GFS q;
   
         if ( !f )    if ( DEG(w) < 0 )
                 wf->d = -1;      *f = 0;
         else {    else if ( DEG(w) == 0 ) {
                 wf->d = d = f->d;      t = COEF(w)[0];
                 c = (LM *)f->c;      t = IFTOF(t);
                 for ( i = 0, d = f->d; i <= d; i++ )      MKGFS(t,q);
                         COEF(wf)[i] = rem(c[i]->body,m);      *f = (P)q;
         }    } else {
       for ( i = DEG(w), c = COEF(w), dc0 = 0; i >= 0; i-- )
         if ( c[i] ) {
           NEXTDC(dc0,dc);
           STOQ(i,DEG(dc));
           t = COEF(w)[i];
           t = IFTOF(t);
           MKGFS(t,q);
           COEF(dc) = (P)q;
         }
       NEXT(dc) = 0;
       MKP(v,dc0,*f);
     }
 }  }
   
 void objtobobj(base,p,rp)  void ptoup(P n,UP *nr)
 int base;  
 Obj p;  
 Obj *rp;  
 {  {
         if ( !p )    DCP dc;
                 *rp = 0;    UP r;
         else    int d;
                 switch ( OID(p) ) {  
                         case O_N:    if ( !n )
                                 numtobnum(base,(Num)p,(Num *)rp); break;      *nr = 0;
                         case O_P:    else if ( OID(n) == O_N ) {
                                 ptobp(base,(P)p,(P *)rp); break;      *nr = r = UPALLOC(0);
                         case O_LIST:      DEG(r) = 0; COEF(r)[0] = (Num)n;
                                 listtoblist(base,(LIST)p,(LIST *)rp); break;    } else {
                         case O_VECT:      d = UDEG(n);
                                 vecttobvect(base,(VECT)p,(VECT *)rp); break;      up_var = VR(n);
                         case O_MAT:      *nr = r = UPALLOC(d); DEG(r) = d;
                                 mattobmat(base,(MAT)p,(MAT *)rp); break;      for ( dc = DC(n); dc; dc = NEXT(dc) ) {
                         case O_STR:        COEF(r)[QTOS(DEG(dc))] = (Num)COEF(dc);
                                 *rp = p; break;      }
                         case O_COMP: default:    }
                                 error("objtobobj : not implemented"); break;  
                 }  
 }  }
   
 void bobjtoobj(base,p,rp)  void uptop(UP n,P *nr)
 int base;  
 Obj p;  
 Obj *rp;  
 {  {
         if ( !p )    int i;
                 *rp = 0;    DCP dc0,dc;
         else  
                 switch ( OID(p) ) {    if ( !n )
                         case O_N:      *nr = 0;
                                 bnumtonum(base,(Num)p,(Num *)rp); break;    else if ( !DEG(n) )
                         case O_P:      *nr = (P)COEF(n)[0];
                                 bptop(base,(P)p,(P *)rp); break;    else {
                         case O_LIST:      for ( i = DEG(n), dc0 = 0; i >= 0; i-- )
                                 blisttolist(base,(LIST)p,(LIST *)rp); break;        if ( COEF(n)[i] ) {
                         case O_VECT:          NEXTDC(dc0,dc); STOQ(i,DEG(dc)); COEF(dc) = (P)COEF(n)[i];
                                 bvecttovect(base,(VECT)p,(VECT *)rp); break;        }
                         case O_MAT:      if ( !up_var )
                                 bmattomat(base,(MAT)p,(MAT *)rp); break;        up_var = CO->v;
                         case O_STR:      MKP(up_var,dc0,*nr);
                                 *rp = p; break;    }
                         case O_COMP: default:  
                                 error("bobjtoobj : not implemented"); break;  
                 }  
 }  }
   
 void numtobnum(base,p,rp)  void ulmptoum(int m,UP f,UM wf)
 int base;  
 Num p;  
 Num *rp;  
 {  {
         N nm,dn,body;    int i,d;
         Q q;    LM *c;
         LM l;  
   
         if ( !p )    if ( !f )
                 *rp = 0;      wf->d = -1;
         else    else {
                 switch ( NID(p) ) {      wf->d = d = f->d;
                         case N_Q:      c = (LM *)f->c;
                                 ntobn(base,NM((Q)p),&nm);      for ( i = 0, d = f->d; i <= d; i++ )
                                 if ( DN((Q)p) ) {        COEF(wf)[i] = rem(c[i]->body,m);
                                         ntobn(base,DN((Q)p),&dn);    }
                                         NDTOQ(nm,dn,SGN((Q)p),q);  
                                 } else  
                                         NTOQ(nm,SGN((Q)p),q);  
                                 *rp = (Num)q;  
                                 break;  
                         case N_R:  
                                 *rp = p; break;  
                         case N_LM:  
                                 ntobn(base,((LM)p)->body,&body);  
                                 MKLM(body,l); *rp = (Num)l;  
                                 break;  
                         default:  
                                 error("numtobnum : not implemented"); break;  
                 }  
 }  }
   
 void bnumtonum(base,p,rp)  void objtobobj(int base,Obj p,Obj *rp)
 int base;  
 Num p;  
 Num *rp;  
 {  {
         N nm,dn,body;    if ( !p )
         Q q;      *rp = 0;
         LM l;    else
       switch ( OID(p) ) {
         case O_N:
           numtobnum(base,(Num)p,(Num *)rp); break;
         case O_P:
           ptobp(base,(P)p,(P *)rp); break;
         case O_LIST:
           listtoblist(base,(LIST)p,(LIST *)rp); break;
         case O_VECT:
           vecttobvect(base,(VECT)p,(VECT *)rp); break;
         case O_MAT:
           mattobmat(base,(MAT)p,(MAT *)rp); break;
         case O_STR:
           *rp = p; break;
         case O_COMP: default:
           error("objtobobj : not implemented"); break;
       }
   }
   
         if ( !p )  void bobjtoobj(int base,Obj p,Obj *rp)
                 *rp = 0;  {
         else    if ( !p )
                 switch ( NID(p) ) {      *rp = 0;
                         case N_Q:    else
                                 bnton(base,NM((Q)p),&nm);      switch ( OID(p) ) {
                                 if ( DN((Q)p) ) {        case O_N:
                                         bnton(base,DN((Q)p),&dn);          bnumtonum(base,(Num)p,(Num *)rp); break;
                                         NDTOQ(nm,dn,SGN((Q)p),q);        case O_P:
                                 } else          bptop(base,(P)p,(P *)rp); break;
                                         NTOQ(nm,SGN((Q)p),q);        case O_LIST:
                                 *rp = (Num)q;          blisttolist(base,(LIST)p,(LIST *)rp); break;
                                 break;        case O_VECT:
                         case N_R:          bvecttovect(base,(VECT)p,(VECT *)rp); break;
                                 *rp = p; break;        case O_MAT:
                         case N_LM:          bmattomat(base,(MAT)p,(MAT *)rp); break;
                                 bnton(base,((LM)p)->body,&body);        case O_STR:
                                 MKLM(body,l); *rp = (Num)l;          *rp = p; break;
                                 break;        case O_COMP: default:
                         default:          error("bobjtoobj : not implemented"); break;
                                 error("bnumtonum : not implemented"); break;      }
                 }  
 }  }
   
 void ptobp(base,p,rp)  void numtobnum(int base,Num p,Num *rp)
 int base;  
 P p;  
 P *rp;  
 {  {
         DCP dcr0,dcr,dc;    N nm,dn,body;
     Q q;
     LM l;
   
         if ( !p )    if ( !p )
                 *rp = p;      *rp = 0;
         else {    else
                 for ( dcr0 = 0, dc = DC(p); dc; dc = NEXT(dc) ) {      switch ( NID(p) ) {
                         NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc);        case N_Q:
                         objtobobj(base,(Obj)COEF(dc),(Obj *)&COEF(dcr));          ntobn(base,NM((Q)p),&nm);
                 }          if ( DN((Q)p) ) {
                 NEXT(dcr) = 0;            ntobn(base,DN((Q)p),&dn);
                 MKP(VR(p),dcr0,*rp);            NDTOQ(nm,dn,SGN((Q)p),q);
         }          } else
             NTOQ(nm,SGN((Q)p),q);
           *rp = (Num)q;
           break;
         case N_R:
           *rp = p; break;
         case N_LM:
           ntobn(base,((LM)p)->body,&body);
           MKLM(body,l); *rp = (Num)l;
           break;
         default:
           error("numtobnum : not implemented"); break;
       }
 }  }
   
 void bptop(base,p,rp)  void bnumtonum(int base,Num p,Num *rp)
 int base;  
 P p;  
 P *rp;  
 {  {
         DCP dcr0,dcr,dc;    N nm,dn,body;
     Q q;
     LM l;
   
         if ( !p )    if ( !p )
                 *rp = p;      *rp = 0;
         else {    else
                 for ( dcr0 = 0, dc = DC(p); dc; dc = NEXT(dc) ) {      switch ( NID(p) ) {
                         NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc);        case N_Q:
                         bobjtoobj(base,(Obj)COEF(dc),(Obj *)&COEF(dcr));          bnton(base,NM((Q)p),&nm);
                 }          if ( DN((Q)p) ) {
                 NEXT(dcr) = 0;            bnton(base,DN((Q)p),&dn);
                 MKP(VR(p),dcr0,*rp);            NDTOQ(nm,dn,SGN((Q)p),q);
         }          } else
             NTOQ(nm,SGN((Q)p),q);
           *rp = (Num)q;
           break;
         case N_R:
           *rp = p; break;
         case N_LM:
           bnton(base,((LM)p)->body,&body);
           MKLM(body,l); *rp = (Num)l;
           break;
         default:
           error("bnumtonum : not implemented"); break;
       }
 }  }
   
 void listtoblist(base,p,rp)  void ptobp(int base,P p,P *rp)
 int base;  
 LIST p;  
 LIST *rp;  
 {  {
         NODE nr0,nr,n;    DCP dcr0,dcr,dc;
   
         if ( !p )    if ( !p )
                 *rp = p;      *rp = p;
         else {    else {
                 for ( nr0 = 0, n = BDY(p); n; n = NEXT(n) ) {      for ( dcr0 = 0, dc = DC(p); dc; dc = NEXT(dc) ) {
                         NEXTNODE(nr0,nr);        NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc);
                         objtobobj(base,BDY(n),(Obj *)&BDY(nr));        objtobobj(base,(Obj)COEF(dc),(Obj *)&COEF(dcr));
                 }      }
                 NEXT(nr) = 0;      NEXT(dcr) = 0;
                 MKLIST(*rp,nr0);      MKP(VR(p),dcr0,*rp);
         }    }
 }  }
   
 void blisttolist(base,p,rp)  void bptop(int base,P p,P *rp)
 int base;  
 LIST p;  
 LIST *rp;  
 {  {
         NODE nr0,nr,n;    DCP dcr0,dcr,dc;
   
         if ( !p )    if ( !p )
                 *rp = p;      *rp = p;
         else {    else {
                 for ( nr0 = 0, n = BDY(p); n; n = NEXT(n) ) {      for ( dcr0 = 0, dc = DC(p); dc; dc = NEXT(dc) ) {
                         NEXTNODE(nr0,nr);        NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc);
                         bobjtoobj(base,BDY(n),(Obj *)&BDY(nr));        bobjtoobj(base,(Obj)COEF(dc),(Obj *)&COEF(dcr));
                 }      }
                 NEXT(nr) = 0;      NEXT(dcr) = 0;
                 MKLIST(*rp,nr0);      MKP(VR(p),dcr0,*rp);
         }    }
 }  }
   
 void vecttobvect(base,p,rp)  void listtoblist(int base,LIST p,LIST *rp)
 int base;  
 VECT p;  
 VECT *rp;  
 {  {
         int i,l;    NODE nr0,nr,n;
         VECT r;  
   
         if ( !p )    if ( !p )
                 *rp = p;      *rp = p;
         else {    else {
                 l = p->len;      for ( nr0 = 0, n = BDY(p); n; n = NEXT(n) ) {
                 MKVECT(r,l); *rp = r;        NEXTNODE(nr0,nr);
                 for ( i = 0; i < l; i++ )        objtobobj(base,BDY(n),(Obj *)&BDY(nr));
                         objtobobj(base,p->body[i],(Obj *)&r->body[i]);      }
         }      NEXT(nr) = 0;
       MKLIST(*rp,nr0);
     }
 }  }
   
 void bvecttovect(base,p,rp)  void blisttolist(int base,LIST p,LIST *rp)
 int base;  
 VECT p;  
 VECT *rp;  
 {  {
         int i,l;    NODE nr0,nr,n;
         VECT r;  
   
         if ( !p )    if ( !p )
                 *rp = p;      *rp = p;
         else {    else {
                 l = p->len;      for ( nr0 = 0, n = BDY(p); n; n = NEXT(n) ) {
                 MKVECT(r,l); *rp = r;        NEXTNODE(nr0,nr);
                 for ( i = 0; i < l; i++ )        bobjtoobj(base,BDY(n),(Obj *)&BDY(nr));
                         bobjtoobj(base,p->body[i],(Obj *)&r->body[i]);      }
         }      NEXT(nr) = 0;
       MKLIST(*rp,nr0);
     }
 }  }
   
 void mattobmat(base,p,rp)  void vecttobvect(int base,VECT p,VECT *rp)
 int base;  
 MAT p;  
 MAT *rp;  
 {  {
         int row,col,i,j;    int i,l;
         MAT r;    VECT r;
   
         if ( !p )    if ( !p )
                 *rp = p;      *rp = p;
         else {    else {
                 row = p->row; col = p->col;      l = p->len;
                 MKMAT(r,row,col); *rp = r;      MKVECT(r,l); *rp = r;
                 for ( i = 0; i < row; i++ )      for ( i = 0; i < l; i++ )
                         for ( j = 0; i < col; j++ )        objtobobj(base,p->body[i],(Obj *)&r->body[i]);
                         objtobobj(base,p->body[i][j],(Obj *)&r->body[i][j]);    }
         }  
 }  }
   
 void bmattomat(base,p,rp)  void bvecttovect(int base,VECT p,VECT *rp)
 int base;  
 MAT p;  
 MAT *rp;  
 {  {
         int row,col,i,j;    int i,l;
         MAT r;    VECT r;
   
         if ( !p )    if ( !p )
                 *rp = p;      *rp = p;
         else {    else {
                 row = p->row; col = p->col;      l = p->len;
                 MKMAT(r,row,col); *rp = r;      MKVECT(r,l); *rp = r;
                 for ( i = 0; i < row; i++ )      for ( i = 0; i < l; i++ )
                         for ( j = 0; i < col; j++ )        bobjtoobj(base,p->body[i],(Obj *)&r->body[i]);
                         bobjtoobj(base,p->body[i][j],(Obj *)&r->body[i][j]);    }
         }  
 }  }
   
 void n32ton27(g,rp)  void mattobmat(int base,MAT p,MAT *rp)
 N g;  
 N *rp;  
 {  {
         int i,j,k,l,r,bits,words;    int row,col,i,j;
         unsigned int t;    MAT r;
         unsigned int *a,*b;  
         N z;  
   
         l = PL(g); a = BD(g);    if ( !p )
         for ( i = 31, t = a[l-1]; !(t&(1<<i)); i-- );      *rp = p;
         bits = (l-1)*32+i+1; words = (bits+26)/27;    else {
         *rp = z = NALLOC(words); PL(z) = words;      row = p->row; col = p->col;
         bzero((char *)BD(z),words*sizeof(unsigned int));      MKMAT(r,row,col); *rp = r;
         for ( j = 0, b = BD(z); j < words; j++ ) {      for ( i = 0; i < row; i++ )
                 k = (27*j)/32; r = (27*j)%32;        for ( j = 0; i < col; j++ )
                 if ( r > 5 )        objtobobj(base,p->body[i][j],(Obj *)&r->body[i][j]);
                         b[j] = (a[k]>>r)|(k==(l-1)?0:((a[k+1]&((1<<(r-5))-1))<<(32-r)));    }
                 else  
                         b[j] = (a[k]>>r)&((1<<27)-1);  
         }  
         if ( !(r = bits%27) )  
                 r = 27;  
         b[words-1] &= ((1<<r)-1);  
 }  }
   
 void n27ton32(a,rp)  void bmattomat(int base,MAT p,MAT *rp)
 N a;  
 N *rp;  
 {  {
         int i,j,k,l,r,bits,words;    int row,col,i,j;
         unsigned int t;    MAT r;
         unsigned int *b,*c;  
         N z;  
   
         l = PL(a); b = BD(a);    if ( !p )
         for ( i = 26, t = b[l-1]; !(t&(1<<i)); i-- );      *rp = p;
         bits = (l-1)*27+i+1; words = (bits+31)/32;    else {
         *rp = z = NALLOC(words); PL(z) = words;      row = p->row; col = p->col;
         bzero((char *)BD(z),words*sizeof(unsigned int));      MKMAT(r,row,col); *rp = r;
         for ( j = 0, c = BD(z); j < l; j++ ) {      for ( i = 0; i < row; i++ )
                 k = (27*j)/32; r = (27*j)%32;        for ( j = 0; i < col; j++ )
                 if ( r > 5 ) {        bobjtoobj(base,p->body[i][j],(Obj *)&r->body[i][j]);
                         c[k] |= (b[j]&((1<<(32-r))-1))<<r;    }
                         if ( k+1 < words )  
                                 c[k+1] = (b[j]>>(32-r));  
                 } else  
                         c[k] |= (b[j]<<r);  
         }  
 }  }
   
 void mptoum(p,pr)  void n32ton27(N g,N *rp)
 P p;  
 UM pr;  
 {  {
         DCP dc;    int i,j,k,l,r,bits,words;
     unsigned int t;
     unsigned int *a,*b;
     N z;
   
         if ( !p )    l = PL(g); a = BD(g);
                 DEG(pr) = -1;    for ( i = 31, t = a[l-1]; !(t&(1<<i)); i-- );
         else if ( NUM(p) ) {    bits = (l-1)*32+i+1; words = (bits+26)/27;
                 DEG(pr) = 0; COEF(pr)[0] = CONT((MQ)p);    *rp = z = NALLOC(words); PL(z) = words;
         } else {    bzero((char *)BD(z),words*sizeof(unsigned int));
                 bzero((char *)pr,(int)((UDEG(p)+2)*sizeof(int)));    for ( j = 0, b = BD(z); j < words; j++ ) {
                 for ( dc = DC(p); dc; dc = NEXT(dc) )      k = (27*j)/32; r = (27*j)%32;
                         COEF(pr)[QTOS(DEG(dc))] = CONT((MQ)COEF(dc));      if ( r > 5 )
                 degum(pr,UDEG(p));        b[j] = (a[k]>>r)|(k==(l-1)?0:((a[k+1]&((1<<(r-5))-1))<<(32-r)));
         }      else
         b[j] = (a[k]>>r)&((1<<27)-1);
     }
     if ( !(r = bits%27) )
       r = 27;
     b[words-1] &= ((1<<r)-1);
 }  }
   
 void umtomp(v,p,pr)  void n27ton32(N a,N *rp)
 V v;  
 UM p;  
 P *pr;  
 {  {
         DCP dc,dc0;    int i,j,k,l,r,bits,words;
         int i;    unsigned int t;
         MQ q;    unsigned int *b,*c;
     N z;
   
         if ( !p || (DEG(p) < 0) )    l = PL(a); b = BD(a);
                 *pr = 0;    for ( i = 26, t = b[l-1]; !(t&(1<<i)); i-- );
         else if ( !DEG(p) )    bits = (l-1)*27+i+1; words = (bits+31)/32;
                 STOMQ(COEF(p)[0],q), *pr = (P)q;    *rp = z = NALLOC(words); PL(z) = words;
         else {    bzero((char *)BD(z),words*sizeof(unsigned int));
                 for ( dc0 = 0, i = DEG(p); i >= 0; i-- )    for ( j = 0, c = BD(z); j < l; j++ ) {
                         if ( COEF(p)[i] ) {      k = (27*j)/32; r = (27*j)%32;
                                 NEXTDC(dc0,dc); STOQ(i,DEG(dc));      if ( r > 5 ) {
                                 STOMQ(COEF(p)[i],q), COEF(dc) = (P)q;        c[k] |= (b[j]&((1<<(32-r))-1))<<r;
                         }        if ( k+1 < words )
                 NEXT(dc) = 0; MKP(v,dc0,*pr);          c[k+1] = (b[j]>>(32-r));
         }      } else
         c[k] |= (b[j]<<r);
     }
 }  }
   
   void mptoum(P p,UM pr)
   {
     DCP dc;
   
     if ( !p )
       DEG(pr) = -1;
     else if ( NUM(p) ) {
       DEG(pr) = 0; COEF(pr)[0] = CONT((MQ)p);
     } else {
       bzero((char *)pr,(int)((UDEG(p)+2)*sizeof(int)));
       for ( dc = DC(p); dc; dc = NEXT(dc) )
         COEF(pr)[QTOS(DEG(dc))] = CONT((MQ)COEF(dc));
       degum(pr,UDEG(p));
     }
   }
   
   void umtomp(V v,UM p,P *pr)
   {
     DCP dc,dc0;
     int i;
     MQ q;
   
     if ( !p || (DEG(p) < 0) )
       *pr = 0;
     else if ( !DEG(p) )
       STOMQ(COEF(p)[0],q), *pr = (P)q;
     else {
       for ( dc0 = 0, i = DEG(p); i >= 0; i-- )
         if ( COEF(p)[i] ) {
           NEXTDC(dc0,dc); STOQ(i,DEG(dc));
           STOMQ(COEF(p)[i],q), COEF(dc) = (P)q;
         }
       NEXT(dc) = 0; MKP(v,dc0,*pr);
     }
   }
   
 /* f(p) -> f(x) */  /* f(p) -> f(x) */
   
 void enc_to_p(p,a,v,pr)  void enc_to_p(int p,int a,V v,P *pr)
 int p,a;  
 V v;  
 P *pr;  
 {  {
         DCP dc,dct;    DCP dc,dct;
         int i,c;    int i,c;
         Q dq,cq;    Q dq,cq;
   
         dc = 0;    dc = 0;
         for ( i = 0; a; i++, a /= p ) {    for ( i = 0; a; i++, a /= p ) {
                 c = a%p;      c = a%p;
                 if ( c ) {      if ( c ) {
                         STOQ(i,dq); STOQ(c,cq);        STOQ(i,dq); STOQ(c,cq);
                         NEWDC(dct); DEG(dct) = dq; COEF(dct) = (P)cq;        NEWDC(dct); DEG(dct) = dq; COEF(dct) = (P)cq;
                         NEXT(dct) = dc; dc = dct;        NEXT(dct) = dc; dc = dct;
                 }      }
         }    }
         MKP(v,dc,*pr);    MKP(v,dc,*pr);
 }  }

Legend:
Removed from v.1.7  
changed lines
  Added in v.1.15

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