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

Diff for /OpenXM_contrib2/asir2000/engine/gfspn.c between version 1.5 and 1.6

version 1.5, 2001/10/09 01:36:13 version 1.6, 2018/03/29 01:32:52
Line 1 
Line 1 
 /* $OpenXM: OpenXM_contrib2/asir2000/engine/gfspn.c,v 1.4 2001/09/03 07:01:06 noro Exp $ */  /* $OpenXM: OpenXM_contrib2/asir2000/engine/gfspn.c,v 1.5 2001/10/09 01:36:13 noro Exp $ */
   
 #include "ca.h"  #include "ca.h"
 #include "base.h"  #include "base.h"
Line 7  UM current_mod_gfsn;
Line 7  UM current_mod_gfsn;
   
 void setmod_gfsn(UM p)  void setmod_gfsn(UM p)
 {  {
         current_mod_gfsn = p;    current_mod_gfsn = p;
 }  }
   
 void getmod_gfsn(UM *up)  void getmod_gfsn(UM *up)
 {  {
         *up = current_mod_gfsn;    *up = current_mod_gfsn;
 }  }
   
 void simpgfsn(GFSN n,GFSN *r)  void simpgfsn(GFSN n,GFSN *r)
 {  {
         UM t,q;    UM t,q;
   
         if ( !n )    if ( !n )
                 *r = 0;      *r = 0;
         else if ( NID(n) != N_GFSN )    else if ( NID(n) != N_GFSN )
                 *r = n;      *r = n;
         else {    else {
                 t = UMALLOC(DEG(BDY(n)));      t = UMALLOC(DEG(BDY(n)));
                 q = W_UMALLOC(DEG(BDY(n)));      q = W_UMALLOC(DEG(BDY(n)));
                 cpyum(BDY(n),t);      cpyum(BDY(n),t);
                 DEG(t) = divsfum(t,current_mod_gfsn,q);      DEG(t) = divsfum(t,current_mod_gfsn,q);
                 MKGFSN(t,*r);      MKGFSN(t,*r);
         }    }
 }  }
   
 #define NZGFSN(a) ((a)&&(OID(a)==O_N)&&(NID(a)==N_GFSN))  #define NZGFSN(a) ((a)&&(OID(a)==O_N)&&(NID(a)==N_GFSN))
   
 void ntogfsn(Obj a,GFSN *b)  void ntogfsn(Obj a,GFSN *b)
 {  {
         UM t;    UM t;
         GFS c;    GFS c;
   
         if ( !a || (OID(a)==O_N && NID(a) == N_GFSN) )    if ( !a || (OID(a)==O_N && NID(a) == N_GFSN) )
                 *b = (GFSN)a;      *b = (GFSN)a;
         else if ( OID(a) == O_N && (NID(a) == N_GFS || NID(a) == N_Q) ) {    else if ( OID(a) == O_N && (NID(a) == N_GFS || NID(a) == N_Q) ) {
                 ntogfs((Obj)a,&c);      ntogfs((Obj)a,&c);
                 if ( !b )      if ( !b )
                         *b = 0;        *b = 0;
                 else {      else {
                         t = UMALLOC(0); ptosfum((P)c,t);        t = UMALLOC(0); ptosfum((P)c,t);
                         MKGFSN(t,*b);        MKGFSN(t,*b);
                 }      }
         } else    } else
                 error("ntogfsn : invalid argument");      error("ntogfsn : invalid argument");
 }  }
   
 void addgfsn(GFSN a,GFSN b,GFSN *c)  void addgfsn(GFSN a,GFSN b,GFSN *c)
 {  {
         UM t,q;    UM t,q;
         GFSN z;    GFSN z;
         int d;    int d;
   
         ntogfsn((Obj)a,&z); a = z; ntogfsn((Obj)b,&z); b = z;    ntogfsn((Obj)a,&z); a = z; ntogfsn((Obj)b,&z); b = z;
         if ( !a )    if ( !a )
                 *c = b;      *c = b;
         else if ( !b )    else if ( !b )
                 *c = a;      *c = a;
         else {    else {
                 d = MAX(DEG(BDY(a)),DEG(BDY(b)));      d = MAX(DEG(BDY(a)),DEG(BDY(b)));
                 t = UMALLOC(d);      t = UMALLOC(d);
                 q = W_UMALLOC(d);      q = W_UMALLOC(d);
                 addsfum(BDY(a),BDY(b),t);      addsfum(BDY(a),BDY(b),t);
                 DEG(t) = divsfum(t,current_mod_gfsn,q);      DEG(t) = divsfum(t,current_mod_gfsn,q);
                 MKGFSN(t,z);      MKGFSN(t,z);
                 *c = (GFSN)z;      *c = (GFSN)z;
         }    }
 }  }
   
 void subgfsn(GFSN a,GFSN b,GFSN *c)  void subgfsn(GFSN a,GFSN b,GFSN *c)
 {  {
         UM t,q;    UM t,q;
         GFSN z;    GFSN z;
         int d;    int d;
   
         ntogfsn((Obj)a,&z); a = z; ntogfsn((Obj)b,&z); b = z;    ntogfsn((Obj)a,&z); a = z; ntogfsn((Obj)b,&z); b = z;
         if ( !a )    if ( !a )
                 chsgngfsn(b,c);      chsgngfsn(b,c);
         else if ( !b )    else if ( !b )
                 *c = a;      *c = a;
         else {    else {
                 d = MAX(DEG(BDY(a)),DEG(BDY(b)));      d = MAX(DEG(BDY(a)),DEG(BDY(b)));
                 t = UMALLOC(d);      t = UMALLOC(d);
                 q = W_UMALLOC(d);      q = W_UMALLOC(d);
                 subsfum(BDY(a),BDY(b),t);      subsfum(BDY(a),BDY(b),t);
                 DEG(t) = divsfum(t,current_mod_gfsn,q);      DEG(t) = divsfum(t,current_mod_gfsn,q);
                 MKGFSN(t,*c);      MKGFSN(t,*c);
         }    }
 }  }
   
 extern int up_lazy;  extern int up_lazy;
   
 void mulgfsn(GFSN a,GFSN b,GFSN *c)  void mulgfsn(GFSN a,GFSN b,GFSN *c)
 {  {
         UM t,q;    UM t,q;
         GFSN z;    GFSN z;
         int d;    int d;
   
         ntogfsn((Obj)a,&z); a = z; ntogfsn((Obj)b,&z); b = z;    ntogfsn((Obj)a,&z); a = z; ntogfsn((Obj)b,&z); b = z;
         if ( !a || !b )    if ( !a || !b )
                 *c = 0;      *c = 0;
         else {    else {
                 d = DEG(BDY(a))+DEG(BDY(b));      d = DEG(BDY(a))+DEG(BDY(b));
                 t = UMALLOC(d);      t = UMALLOC(d);
                 q = W_UMALLOC(d);      q = W_UMALLOC(d);
                 mulsfum(BDY(a),BDY(b),t);      mulsfum(BDY(a),BDY(b),t);
                 DEG(t) = divsfum(t,current_mod_gfsn,q);      DEG(t) = divsfum(t,current_mod_gfsn,q);
                 MKGFSN(t,*c);      MKGFSN(t,*c);
         }    }
 }  }
   
 void divgfsn(GFSN a,GFSN b,GFSN *c)  void divgfsn(GFSN a,GFSN b,GFSN *c)
 {  {
         GFSN z;    GFSN z;
         int d;    int d;
         UM wb,wc,wd,we,t,q;    UM wb,wc,wd,we,t,q;
   
         ntogfsn((Obj)a,&z); a = z; ntogfsn((Obj)b,&z); b = z;    ntogfsn((Obj)a,&z); a = z; ntogfsn((Obj)b,&z); b = z;
         if ( !b )    if ( !b )
                 error("divgfsn: division by 0");      error("divgfsn: division by 0");
         else if ( !a )    else if ( !a )
                 *c = 0;      *c = 0;
         else {    else {
                 wb = W_UMALLOC(DEG(BDY(b))); cpyum(BDY(b),wb);      wb = W_UMALLOC(DEG(BDY(b))); cpyum(BDY(b),wb);
                 d = DEG(current_mod_gfsn);      d = DEG(current_mod_gfsn);
                 wc = W_UMALLOC(d); cpyum(current_mod_gfsn,wc);      wc = W_UMALLOC(d); cpyum(current_mod_gfsn,wc);
                 wd = W_UMALLOC(2*d); we = W_UMALLOC(2*d);      wd = W_UMALLOC(2*d); we = W_UMALLOC(2*d);
                 /* wd*wb+we*wc=1 */      /* wd*wb+we*wc=1 */
                 eucsfum(wb,wc,wd,we);      eucsfum(wb,wc,wd,we);
                 d = DEG(BDY(a))+DEG(wd);      d = DEG(BDY(a))+DEG(wd);
                 t = UMALLOC(d);      t = UMALLOC(d);
                 q = W_UMALLOC(d);      q = W_UMALLOC(d);
                 mulsfum(BDY(a),wd,t);      mulsfum(BDY(a),wd,t);
                 DEG(t) = divsfum(t,current_mod_gfsn,q);      DEG(t) = divsfum(t,current_mod_gfsn,q);
                 MKGFSN(t,*c);      MKGFSN(t,*c);
         }    }
 }  }
   
 void invgfsn(GFSN b,GFSN *c)  void invgfsn(GFSN b,GFSN *c)
 {  {
         GFSN z;    GFSN z;
         int d;    int d;
         UM wb,wc,wd,we,t;    UM wb,wc,wd,we,t;
   
         ntogfsn((Obj)b,&z); b = z;    ntogfsn((Obj)b,&z); b = z;
         if ( !b )    if ( !b )
                 error("divgfsn: division by 0");      error("divgfsn: division by 0");
         else {    else {
                 wb = W_UMALLOC(DEG(BDY(b))); cpyum(BDY(b),wb);      wb = W_UMALLOC(DEG(BDY(b))); cpyum(BDY(b),wb);
                 d = DEG(current_mod_gfsn);      d = DEG(current_mod_gfsn);
                 wc = W_UMALLOC(d); cpyum(current_mod_gfsn,wc);      wc = W_UMALLOC(d); cpyum(current_mod_gfsn,wc);
                 wd = W_UMALLOC(2*d); we = W_UMALLOC(2*d);      wd = W_UMALLOC(2*d); we = W_UMALLOC(2*d);
                 /* wd*wb+we*wc=1 */      /* wd*wb+we*wc=1 */
                 eucsfum(wb,wc,wd,we);      eucsfum(wb,wc,wd,we);
                 d = DEG(wd);      d = DEG(wd);
                 t = UMALLOC(d);      t = UMALLOC(d);
                 cpyum(wd,t);      cpyum(wd,t);
                 MKGFSN(t,*c);      MKGFSN(t,*c);
         }    }
 }  }
   
 void chsgngfsn(GFSN a,GFSN *c)  void chsgngfsn(GFSN a,GFSN *c)
 {  {
         GFSN z;    GFSN z;
         int d;    int d;
         struct oUM zero;    struct oUM zero;
         UM t;    UM t;
   
         ntogfsn((Obj)a,&z); a = z;    ntogfsn((Obj)a,&z); a = z;
         if ( !a )    if ( !a )
                 *c = 0;      *c = 0;
         else {    else {
                 d = DEG(BDY(a));      d = DEG(BDY(a));
                 t = UMALLOC(d);      t = UMALLOC(d);
                 DEG(&zero) = -1;      DEG(&zero) = -1;
                 subsfum(&zero,BDY(a),t);      subsfum(&zero,BDY(a),t);
                 MKGFSN(t,*c);      MKGFSN(t,*c);
         }    }
 }  }
   
 void pwrgfsn(GFSN a,Q b,GFSN *c)  void pwrgfsn(GFSN a,Q b,GFSN *c)
 {  {
         GFSN z;    GFSN z;
         UM t,x,y,q;    UM t,x,y,q;
         int d,k;    int d,k;
         N e;    N e;
   
         ntogfsn((Obj)a,&z); a = z;    ntogfsn((Obj)a,&z); a = z;
         if ( !b ) {    if ( !b ) {
                 t = UMALLOC(0); DEG(t) = 0; COEF(t)[0] = _onesf();      t = UMALLOC(0); DEG(t) = 0; COEF(t)[0] = _onesf();
                 MKGFSN(t,*c);      MKGFSN(t,*c);
         } else if ( !a )    } else if ( !a )
                 *c = 0;      *c = 0;
         else {    else {
                 d = DEG(current_mod_gfsn);      d = DEG(current_mod_gfsn);
   
                 /* y = 1 */      /* y = 1 */
                 y = UMALLOC(d); DEG(y) = 0; COEF(y)[0] = _onesf();      y = UMALLOC(d); DEG(y) = 0; COEF(y)[0] = _onesf();
   
                 t = W_UMALLOC(2*d); q = W_UMALLOC(2*d);      t = W_UMALLOC(2*d); q = W_UMALLOC(2*d);
   
                 /* x = simplify(a) */      /* x = simplify(a) */
                 x = W_UMALLOC(DEG(BDY(a))); cpyum(BDY(a),x);      x = W_UMALLOC(DEG(BDY(a))); cpyum(BDY(a),x);
                 DEG(x) = divsfum(x,current_mod_gfsn,q);      DEG(x) = divsfum(x,current_mod_gfsn,q);
                 if ( DEG(x) < 0 ) {      if ( DEG(x) < 0 ) {
                         *c = 0;        *c = 0;
                 } else {      } else {
                         e = NM(b);        e = NM(b);
                         for ( k = n_bits(e)-1; k >= 0; k-- ) {        for ( k = n_bits(e)-1; k >= 0; k-- ) {
                                 mulsfum(y,y,t);          mulsfum(y,y,t);
                                 DEG(t) = divsfum(t,current_mod_gfsn,q);          DEG(t) = divsfum(t,current_mod_gfsn,q);
                                 cpyum(t,y);          cpyum(t,y);
                                 if ( e->b[k/32] & (1<<(k%32)) ) {          if ( e->b[k/32] & (1<<(k%32)) ) {
                                         mulsfum(y,x,t);            mulsfum(y,x,t);
                                         DEG(t) = divsfum(t,current_mod_gfsn,q);            DEG(t) = divsfum(t,current_mod_gfsn,q);
                                         cpyum(t,y);            cpyum(t,y);
                                 }          }
                         }        }
                         MKGFSN(y,*c);        MKGFSN(y,*c);
                 }      }
         }    }
 }  }
   
 int cmpgfsn(GFSN a,GFSN b)  int cmpgfsn(GFSN a,GFSN b)
 {  {
         GFSN z;    GFSN z;
   
         ntogfsn((Obj)a,&z); a = z; ntogfsn((Obj)b,&z); b = z;    ntogfsn((Obj)a,&z); a = z; ntogfsn((Obj)b,&z); b = z;
         if ( !a )    if ( !a )
                 if ( !b )      if ( !b )
                         return 0;        return 0;
                 else      else
                         return -1;        return -1;
         else if ( !b )    else if ( !b )
                         return 1;        return 1;
         else    else
                 return compsfum(BDY(a),BDY(b));      return compsfum(BDY(a),BDY(b));
 }  }
   
 void randomgfsn(GFSN *r)  void randomgfsn(GFSN *r)
 {  {
         int d;    int d;
         UM t;    UM t;
   
         if ( !current_mod_gfsn )    if ( !current_mod_gfsn )
                 error("randomgfsn : current_mod_gfsn is not set");      error("randomgfsn : current_mod_gfsn is not set");
         d = DEG(current_mod_gfsn);    d = DEG(current_mod_gfsn);
         t = UMALLOC(d-1);    t = UMALLOC(d-1);
         randsfum(d,t);    randsfum(d,t);
         degum(t,d-1);    degum(t,d-1);
         if ( DEG(t) < 0 )    if ( DEG(t) < 0 )
                 *r = 0;      *r = 0;
         else {    else {
                 MKGFSN(t,*r);      MKGFSN(t,*r);
         }    }
 }  }

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

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