[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.3 and 1.4

version 1.3, 2001/09/03 01:06:40 version 1.4, 2001/09/03 07:01:06
Line 1 
Line 1 
 /* $OpenXM$ */  /* $OpenXM: OpenXM_contrib2/asir2000/engine/gfsn.c,v 1.3 2001/09/03 01:06:40 noro Exp $ */
   
 #include "ca.h"  #include "ca.h"
 #include "base.h"  #include "base.h"
   
 UM current_mod_gfspn;  UM current_mod_gfsn;
   
 void setmod_gfspn(p)  void setmod_gfsn(p)
 UM p;  UM p;
 {  {
         current_mod_gfspn = p;          current_mod_gfsn = p;
 }  }
   
 void getmod_gfspn(up)  void getmod_gfsn(up)
 UM *up;  UM *up;
 {  {
         *up = current_mod_gfspn;          *up = current_mod_gfsn;
 }  }
   
 void simpgfspn(n,r)  void simpgfsn(n,r)
 GFSPN n;  GFSN n;
 GFSPN *r;  GFSN *r;
 {  {
         UM t,q;          UM t,q;
   
         if ( !n )          if ( !n )
                 *r = 0;                  *r = 0;
         else if ( NID(n) != N_GFSPN )          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);
                 divsfum(t,current_mod_gfspn,q);                  DEG(t) = divsfum(t,current_mod_gfsn,q);
                 MKGFSPN(t,*r);                  MKGFSN(t,*r);
         }          }
 }  }
   
 #define NZGFSPN(a) ((a)&&(OID(a)==O_N)&&(NID(a)==N_GFSPN))  #define NZGFSN(a) ((a)&&(OID(a)==O_N)&&(NID(a)==N_GFSN))
   
 void ntogfspn(a,b)  void ntogfsn(a,b)
 Obj a;  Obj a;
 GFSPN *b;  GFSN *b;
 {  {
         UM t;          UM t;
         GFS c;          GFS c;
   
         if ( !a || (OID(a)==O_N && NID(a) == N_GFSPN) )          if ( !a || (OID(a)==O_N && NID(a) == N_GFSN) )
                 *b = (GFSPN)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((Num)a,&c);                  ntogfs((Num)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);
                         MKGFSPN(t,*b);                          MKGFSN(t,*b);
                 }                  }
         } else          } else
                 error("ntogfspn : invalid argument");                  error("ntogfsn : invalid argument");
 }  }
   
 void addgfspn(a,b,c)  void addgfsn(a,b,c)
 GFSPN a,b;  GFSN a,b;
 GFSPN *c;  GFSN *c;
 {  {
         UM t,q;          UM t,q;
         GFSPN z;          GFSN z;
         int d;          int d;
           MQ qq;
   
         ntogfspn((Obj)a,&z); a = z; ntogfspn((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 )
Line 77  GFSPN *c;
Line 78  GFSPN *c;
                 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);
                 divsfum(t,current_mod_gfspn,q);                  DEG(t) = divsfum(t,current_mod_gfsn,q);
                 MKGFSPN(t,*c);                  MKGFSN(t,z);
                   *c = (GFSN)z;
         }          }
 }  }
   
 void subgfspn(a,b,c)  void subgfsn(a,b,c)
 GFSPN a,b;  GFSN a,b;
 GFSPN *c;  GFSN *c;
 {  {
         UM t,q;          UM t,q;
         GFSPN z;          GFSN z;
         int d;          int d;
   
         ntogfspn((Obj)a,&z); a = z; ntogfspn((Obj)b,&z); b = z;          ntogfsn((Obj)a,&z); a = z; ntogfsn((Obj)b,&z); b = z;
         if ( !a )          if ( !a )
                 chsgngfspn(b,c);                  chsgngfsn(b,c);
         else if ( !b )          else if ( !b )
                 *c = a;                  *c = a;
         else {          else {
Line 100  GFSPN *c;
Line 102  GFSPN *c;
                 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);
                 divsfum(t,current_mod_gfspn,q);                  DEG(t) = divsfum(t,current_mod_gfsn,q);
                 MKGFSPN(t,*c);                  MKGFSN(t,*c);
         }          }
 }  }
   
 extern int up_lazy;  extern int up_lazy;
   
 void mulgfspn(a,b,c)  void mulgfsn(a,b,c)
 GFSPN a,b;  GFSN a,b;
 GFSPN *c;  GFSN *c;
 {  {
         UM t,q;          UM t,q;
         GFSPN z;          GFSN z;
         int d;          int d;
   
         ntogfspn((Obj)a,&z); a = z; ntogfspn((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 {
Line 123  GFSPN *c;
Line 125  GFSPN *c;
                 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);
                 divsfum(t,current_mod_gfspn,q);                  DEG(t) = divsfum(t,current_mod_gfsn,q);
                 MKGFSPN(t,*c);                  MKGFSN(t,*c);
         }          }
 }  }
   
 void divgfspn(a,b,c)  void divgfsn(a,b,c)
 GFSPN a,b;  GFSN a,b;
 GFSPN *c;  GFSN *c;
 {  {
         GFSPN z;          GFSN z;
         int d;          int d;
         UM wb,wc,wd,we,t,q;          UM wb,wc,wd,we,t,q;
   
         ntogfspn((Obj)a,&z); a = z; ntogfspn((Obj)b,&z); b = z;          ntogfsn((Obj)a,&z); a = z; ntogfsn((Obj)b,&z); b = z;
         if ( !b )          if ( !b )
                 error("divgfspn: 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_gfspn);                  d = DEG(current_mod_gfsn);
                 wc = W_UMALLOC(d); cpyum(current_mod_gfspn,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(a,wd,t);                  mulsfum(BDY(a),wd,t);
                 divsfum(t,current_mod_gfspn,q);                  DEG(t) = divsfum(t,current_mod_gfsn,q);
                 MKGFSPN(t,*c);                  MKGFSN(t,*c);
         }          }
 }  }
   
 void invgfspn(b,c)  void invgfsn(b,c)
 GFSPN b;  GFSN b;
 GFSPN *c;  GFSN *c;
 {  {
         GFSPN z;          GFSN z;
         int d;          int d;
         UM wb,wc,wd,we,t;          UM wb,wc,wd,we,t;
   
         ntogfspn((Obj)b,&z); b = z;          ntogfsn((Obj)b,&z); b = z;
         if ( !b )          if ( !b )
                 error("divgfspn: 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_gfspn);                  d = DEG(current_mod_gfsn);
                 wc = W_UMALLOC(d); cpyum(current_mod_gfspn,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);
                 MKGFSPN(t,*c);                  MKGFSN(t,*c);
         }          }
 }  }
   
 void chsgngfspn(a,c)  void chsgngfsn(a,c)
 GFSPN a,*c;  GFSN a,*c;
 {  {
         GFSPN z;          GFSN z;
         int d;          int d;
         struct oUM zero;          struct oUM zero;
         UM t;          UM t;
   
         ntogfspn((Obj)a,&z); a = z;          ntogfsn((Obj)a,&z); a = z;
         if ( !a )          if ( !a )
                 *c = 0;                  *c = 0;
         else {          else {
Line 198  GFSPN a,*c;
Line 200  GFSPN a,*c;
                 t = UMALLOC(d);                  t = UMALLOC(d);
                 DEG(&zero) = -1;                  DEG(&zero) = -1;
                 subsfum(&zero,BDY(a),t);                  subsfum(&zero,BDY(a),t);
                 MKGFSPN(t,*c);                  MKGFSN(t,*c);
         }          }
 }  }
   
 void pwrgfspn(a,b,c)  void pwrgfsn(a,b,c)
 GFSPN a;  GFSN a;
 Q b;  Q b;
 GFSPN *c;  GFSN *c;
 {  {
         GFSPN z;          GFSN z;
         UM t,x,y,q;          UM t,x,y,q;
         int d,k;          int d,k;
         N e;          N e;
   
         ntogfspn((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();
                 MKGFSPN(t,*c);                  MKGFSN(t,*c);
         } else if ( !a )          } else if ( !a )
                 *c = 0;                  *c = 0;
         else {          else {
                 d = DEG(current_mod_gfspn);                  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();
Line 228  GFSPN *c;
Line 230  GFSPN *c;
   
                 /* 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);
                 divsfum(x,current_mod_gfspn,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);
                                 divsfum(t,current_mod_gfspn,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);
                                         divsfum(t,current_mod_gfspn,q);                                          DEG(t) = divsfum(t,current_mod_gfsn,q);
                                         cpyum(t,y);                                          cpyum(t,y);
                                 }                                  }
                         }                          }
                         MKGFSPN(y,*c);                          MKGFSN(y,*c);
                 }                  }
         }          }
 }  }
   
 int cmpgfspn(a,b)  int cmpgfsn(a,b)
 GFSPN a,b;  GFSN a,b;
 {  {
         GFSPN z;          GFSN z;
   
         ntogfspn((Obj)a,&z); a = z; ntogfspn((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;
Line 265  GFSPN a,b;
Line 267  GFSPN a,b;
                 return compsfum(BDY(a),BDY(b));                  return compsfum(BDY(a),BDY(b));
 }  }
   
 void randomgfspn(r)  void randomgfsn(r)
 GFSPN *r;  GFSN *r;
 {  {
         int i,d;          int i,d;
         UM t;          UM t;
   
         if ( !current_mod_gfspn )          if ( !current_mod_gfsn )
                 error("randomgfspn : current_mod_gfspn is not set");                  error("randomgfsn : current_mod_gfsn is not set");
         d = DEG(current_mod_gfspn);          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 {
                 MKGFSPN(t,*r);                  MKGFSN(t,*r);
         }          }
 }  }

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

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