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

Diff for /OpenXM_contrib2/asir2000/engine/Z.c between version 1.4 and 1.5

version 1.4, 2004/09/29 08:50:23 version 1.5, 2004/10/06 11:58:52
Line 1 
Line 1 
 #if 1  
 #include "ca.h"  #include "ca.h"
   #include "base.h"
 #include "inline.h"  #include "inline.h"
 #endif  
   
 typedef struct oZ {  inline void _addz(Z n1,Z n2,Z nr);
         int p;  inline void _subz(Z n1,Z n2,Z nr);
         unsigned int b[1];  inline void _mulz(Z n1,Z n2,Z nr);
 } *Z;  inline int _addz_main(unsigned int *m1,int d1,unsigned int *m2,int d2,unsigned int *mr);
   inline int _subz_main(unsigned int *m1,int d1,unsigned int *m2,int d2,unsigned int *mr);
   
 #define IMM_MAX 1073741823  
 #define IMM_MIN -1073741823  
   
 /* immediate int -> Z */  /* immediate int -> Z */
 #define IMMTOZ(c,n) (n)=((c)>=IMM_MIN&&(c)<=IMM_MAX?((Z)(((c)<<1)|1)):immtoz(c))  #define UTOZ(c,n) (n)=(!((unsigned int)(c))?0:(((unsigned int)(c))<=IMM_MAX?((Z)((((unsigned int)(c))<<1)|1)):utoz((unsigned int)(c))))
   #define STOZ(c,n) (n)=(!((int)(c))?0:(((int)(c))>=IMM_MIN&&((int)(c))<=IMM_MAX?((Z)((((int)(c))<<1)|1)):stoz((int)(c))))
 /* immediate Z ? */  /* immediate Z ? */
 #define IS_IMM(c) (((unsigned int)c)&1)  #define IS_IMM(c) (((unsigned int)c)&1)
 /* Z can be conver to immediate ? */  /* Z can be conver to immediate ? */
 #define IS_IMMZ(n) (SL(n) == 1&&BD(n)[0]<=IMM_MAX)  #define IS_SZ(n) (((SL(n) == 1)||(SL(n)==-1))&&BD(n)[0]<=IMM_MAX)
 /* Z -> immediate Z */  /* Z -> immediate Z */
 #define IMMZTOZ(n,z) (z)=(Z)(SL(n)<0?(((-BD(n)[0])<<1)|1):(((BD(n)[0])<<1)|1))  #define SZTOZ(n,z) (z)=(Z)(SL(n)<0?(((-BD(n)[0])<<1)|1):(((BD(n)[0])<<1)|1))
 /* Z -> immediate int */  /* Z -> immediate int */
 #define ZTOIMM(c) (((int)(c))>>1)  #define ZTOS(c) (((int)(c))>>1)
 #define ZALLOC(d) ((Z)MALLOC_ATOMIC(TRUESIZE(oZ,(d)-1,int)))  
 #define SL(n) ((n)->p)  
   
 Z immtoz(int c);  int uniz(Z a)
 Z qtoz(Q n);  {
 Q ztoq(Z n);          if ( IS_IMM(a) && ZTOS(a) == 1 ) return 1;
 Z chsgnz(Z n);          else return 0;
 Z dupz(Z n);  }
 Z addz(Z n1,Z n2);  
 Z subz(Z n1,Z n2);  
 Z mulz(Z n1,Z n2);  
 Z divsz(Z n1,Z n2);  
 Z divz(Z n1,Z n2,Z *rem);  
 Z gcdz(Z n1,Z n2);  
 Z gcdz_cofactor(Z n1,Z n2,Z *c1,Z *c2);  
 Z estimate_array_gcdz(Z *a,int n);  
 Z array_gcdz(Z *a,int n);  
 void mkwcz(int k,int l,Z *t);  
 int remzi(Z n,int m);  
 inline void _addz(Z n1,Z n2,Z nr);  
 inline void _subz(Z n1,Z n2,Z nr);  
 inline void _mulz(Z n1,Z n2,Z nr);  
 inline int _addz_main(unsigned int *m1,int d1,unsigned int *m2,int d2,unsigned int *mr);  
 inline int _subz_main(unsigned int *m1,int d1,unsigned int *m2,int d2,unsigned int *mr);  
   
 Z immtoz(int c)  int cmpz(Z a,Z b)
 {  {
           int *ma,*mb;
           int sa,sb,da,db,ca,cb,i;
   
           if ( !a )
                   return -sgnz(b);
           else if ( !b )
                   return sgnz(a);
           else {
                   sa = sgnz(a); sb = sgnz(b);
                   if ( sa > sb ) return 1;
                   else if ( sa < sb ) return -1;
                   else if ( IS_IMM(a) )
                           if ( IS_IMM(b) ) {
                                   ca = ZTOS(a); cb = ZTOS(b);
                                   if ( ca > cb ) return sa;
                                   else if ( ca < cb ) return -sa;
                                   else return 0;
                           } else
                                   return -sa;
                   else if ( IS_IMM(b) )
                           return sa;
                   else {
                           da = SL(a)*sa; db = SL(b)*sa;
                           if ( da > db ) return sa;
                           else if ( da < db ) return -sa;
                           else {
                                   for ( i = da-1, ma = BD(a)+i, mb = BD(b)+i; i >= 0; i-- )
                                           if ( *ma > *mb ) return sa;
                                           else if ( *ma < *mb ) return -sa;
                                   return 0;
                           }
                   }
           }
   }
   
   Z stoz(int c)
   {
         Z z;          Z z;
   
         z = ZALLOC(1);          z = ZALLOC(1);
Line 59  Z immtoz(int c)
Line 76  Z immtoz(int c)
         return z;          return z;
 }  }
   
   Z utoz(unsigned int c)
   {
           Z z;
   
           z = ZALLOC(1);
           SL(z) = 1; BD(z)[0] = c;
           return z;
   }
   
   Z simpz(Z n)
   {
           Z n1;
   
           if ( !n ) return 0;
           else if ( IS_IMM(n) ) return n;
           else if ( IS_SZ(n) ) {
                   SZTOZ(n,n1); return n1;
           } else
                   return n;
   }
   
 int sgnz(Z n)  int sgnz(Z n)
 {  {
         if ( !n ) return 0;          if ( !n ) return 0;
         else if ( IS_IMM(n) ) return ZTOIMM(n)>0?1:1;          else if ( IS_IMM(n) ) return ZTOS(n)>0?1:-1;
         else if ( SL(n) < 0 ) return -1;          else if ( SL(n) < 0 ) return -1;
         else return 1;          else return 1;
 }  }
Line 73  z_mag(Z n)
Line 111  z_mag(Z n)
   
         if ( !n ) return 0;          if ( !n ) return 0;
         else if ( IS_IMM(n) ) {          else if ( IS_IMM(n) ) {
                 c = ZTOIMM(n);                  c = ZTOS(n);
                 if ( c < 0 ) c = -c;                  if ( c < 0 ) c = -c;
                 for ( i = 0; c; c >>= 1, i++ );                  for ( i = 0; c; c >>= 1, i++ );
                 return i;                  return i;
Line 91  Z qtoz(Q n)
Line 129  Z qtoz(Q n)
                 error("qtoz : invalid input");                  error("qtoz : invalid input");
         else {          else {
                 t = (Z)NM(n);                  t = (Z)NM(n);
                 if ( IS_IMMZ(t) ) {                  if ( IS_SZ(t) ) {
                         c = SGN(n) < 0 ? -BD(t)[0] : BD(t)[0];                          c = SGN(n) < 0 ? -BD(t)[0] : BD(t)[0];
                         IMMTOZ(c,r);                          STOZ(c,r);
                 } else {                  } else {
                         r = dupz((Z)t);                          r = dupz((Z)t);
                         if ( SGN(n) < 0 ) SL(r) = -SL(r);                          if ( SGN(n) < 0 ) SL(r) = -SL(r);
Line 110  Q ztoq(Z n)
Line 148  Q ztoq(Z n)
   
         if ( !n ) return 0;          if ( !n ) return 0;
         else if ( IS_IMM(n) ) {          else if ( IS_IMM(n) ) {
                 c = ZTOIMM(n);                  c = ZTOS(n);
                 STOQ(c,r);                  STOQ(c,r);
                 return r;                  return r;
         } else {          } else {
Line 127  Q ztoq(Z n)
Line 165  Q ztoq(Z n)
   
 Z dupz(Z n)  Z dupz(Z n)
 {  {
         Z nr;          Z r;
         int sd,i;          int sd,i;
   
         if ( !n ) return 0;          if ( !n ) return 0;
         else if ( IS_IMM(n) ) return n;          else if ( IS_IMM(n) ) return n;
         else {          else {
                 if ( (sd = SL(n)) < 0 ) sd = -sd;                  if ( (sd = SL(n)) < 0 ) sd = -sd;
                 nr = ZALLOC(sd);                  r = ZALLOC(sd);
                 SL(nr) = SL(n);                  SL(r) = SL(n);
                 for ( i = 0; i < sd; i++ ) BD(nr)[i] = BD(n)[i];                  for ( i = 0; i < sd; i++ ) BD(r)[i] = BD(n)[i];
                 return nr;                  return r;
         }          }
 }  }
   
Line 148  Z chsgnz(Z n)
Line 186  Z chsgnz(Z n)
   
         if ( !n ) return 0;          if ( !n ) return 0;
         else if ( IS_IMM(n) ) {          else if ( IS_IMM(n) ) {
                 c = -ZTOIMM(n);                  c = -ZTOS(n);
                 IMMTOZ(c,r);                  STOZ(c,r);
                 return r;                  return r;
         } else {          } else {
                 r = dupz(n);                  r = dupz(n);
Line 158  Z chsgnz(Z n)
Line 196  Z chsgnz(Z n)
         }          }
 }  }
   
   Z absz(Z n)
   {
           Z r;
           int c;
   
           if ( !n ) return 0;
           else if ( sgnz(n) > 0 )
                   return n;
           else
                   return chsgnz(n);
   }
   
 Z addz(Z n1,Z n2)  Z addz(Z n1,Z n2)
 {  {
         int d1,d2,d,c;          int d1,d2,d,c;
Line 169  Z addz(Z n1,Z n2)
Line 218  Z addz(Z n1,Z n2)
         else if ( !n2 ) return dupz(n1);          else if ( !n2 ) return dupz(n1);
         else if ( IS_IMM(n1) ) {          else if ( IS_IMM(n1) ) {
                 if ( IS_IMM(n2) ) {                  if ( IS_IMM(n2) ) {
                         c = ZTOIMM(n1)+ZTOIMM(n2);                          c = ZTOS(n1)+ZTOS(n2);
                         IMMTOZ(c,r);                          STOZ(c,r);
                         return r;  
                 } else {                  } else {
                         c = ZTOIMM(n1);                          c = ZTOS(n1);
                         if ( c < 0 ) {                          if ( c < 0 ) {
                                 t.p = -1; t.b[0] = -c;                                  t.p = -1; t.b[0] = -c;
                         } else {                          } else {
Line 182  Z addz(Z n1,Z n2)
Line 230  Z addz(Z n1,Z n2)
                         if ( (d2 = SL(n2)) < 0 ) d2 = -d2;                          if ( (d2 = SL(n2)) < 0 ) d2 = -d2;
                         r = ZALLOC(d2+1);                          r = ZALLOC(d2+1);
                         _addz(&t,n2,r);                          _addz(&t,n2,r);
                         return r;                          if ( !SL(r) ) r = 0;
                 }                  }
         } else if ( IS_IMM(n2) ) {          } else if ( IS_IMM(n2) ) {
                 c = ZTOIMM(n2);                  c = ZTOS(n2);
                 if ( c < 0 ) {                  if ( c < 0 ) {
                         t.p = -1; t.b[0] = -c;                          t.p = -1; t.b[0] = -c;
                 } else {                  } else {
Line 194  Z addz(Z n1,Z n2)
Line 242  Z addz(Z n1,Z n2)
                 if ( (d1 = SL(n1)) < 0 ) d1 = -d1;                  if ( (d1 = SL(n1)) < 0 ) d1 = -d1;
                 r = ZALLOC(d1+1);                  r = ZALLOC(d1+1);
                 _addz(n1,&t,r);                  _addz(n1,&t,r);
                 return r;                  if ( !SL(r) ) r = 0;
         } else {          } else {
                 if ( (d1 = SL(n1)) < 0 ) d1 = -d1;                  if ( (d1 = SL(n1)) < 0 ) d1 = -d1;
                 if ( (d2 = SL(n2)) < 0 ) d2 = -d2;                  if ( (d2 = SL(n2)) < 0 ) d2 = -d2;
Line 202  Z addz(Z n1,Z n2)
Line 250  Z addz(Z n1,Z n2)
                 r = ZALLOC(d);                  r = ZALLOC(d);
                 _addz(n1,n2,r);                  _addz(n1,n2,r);
                 if ( !SL(r) ) r = 0;                  if ( !SL(r) ) r = 0;
                 else if ( IS_IMMZ(r) ) {  
                         IMMZTOZ(r,r1); r = r1;  
                 }  
                 return r;  
         }          }
           if ( r && !((int)r&1) && IS_SZ(r) ) {
                   SZTOZ(r,r1); r = r1;
           }
           return r;
 }  }
   
 Z subz(Z n1,Z n2)  Z subz(Z n1,Z n2)
Line 215  Z subz(Z n1,Z n2)
Line 263  Z subz(Z n1,Z n2)
         Z r,r1;          Z r,r1;
         struct oZ t;          struct oZ t;
   
         if ( !n1 ) {          if ( !n1 )
                 r = dupz(n2);                  return chsgnz(n2);
                 SL(r) = -SL(r);          else if ( !n2 ) return n1;
                 return r;  
         } else if ( !n2 ) return dupz(n1);  
         else if ( IS_IMM(n1) ) {          else if ( IS_IMM(n1) ) {
                 if ( IS_IMM(n2) ) {                  if ( IS_IMM(n2) ) {
                         c = ZTOIMM(n1)-ZTOIMM(n2);                          c = ZTOS(n1)-ZTOS(n2);
                         IMMTOZ(c,r);                          STOZ(c,r);
                         return r;  
                 } else {                  } else {
                         c = ZTOIMM(n1);                          c = ZTOS(n1);
                         if ( c < 0 ) {                          if ( c < 0 ) {
                                 t.p = -1; t.b[0] = -c;                                  t.p = -1; t.b[0] = -c;
                         } else {                          } else {
Line 235  Z subz(Z n1,Z n2)
Line 280  Z subz(Z n1,Z n2)
                         if ( (d2 = SL(n2)) < 0 ) d2 = -d2;                          if ( (d2 = SL(n2)) < 0 ) d2 = -d2;
                         r = ZALLOC(d2+1);                          r = ZALLOC(d2+1);
                         _subz(&t,n2,r);                          _subz(&t,n2,r);
                         return r;                          if ( !SL(r) ) r = 0;
                 }                  }
         } else if ( IS_IMM(n2) ) {          } else if ( IS_IMM(n2) ) {
                 c = ZTOIMM(n2);                  c = ZTOS(n2);
                 if ( c < 0 ) {                  if ( c < 0 ) {
                         t.p = -1; t.b[0] = -c;                          t.p = -1; t.b[0] = -c;
                 } else {                  } else {
Line 247  Z subz(Z n1,Z n2)
Line 292  Z subz(Z n1,Z n2)
                 if ( (d1 = SL(n1)) < 0 ) d1 = -d1;                  if ( (d1 = SL(n1)) < 0 ) d1 = -d1;
                 r = ZALLOC(d1+1);                  r = ZALLOC(d1+1);
                 _subz(n1,&t,r);                  _subz(n1,&t,r);
                 return r;                  if ( !SL(r) ) r = 0;
         } else {          } else {
                 if ( (d1 = SL(n1)) < 0 ) d1 = -d1;                  if ( (d1 = SL(n1)) < 0 ) d1 = -d1;
                 if ( (d2 = SL(n2)) < 0 ) d2 = -d2;                  if ( (d2 = SL(n2)) < 0 ) d2 = -d2;
Line 255  Z subz(Z n1,Z n2)
Line 300  Z subz(Z n1,Z n2)
                 r = ZALLOC(d);                  r = ZALLOC(d);
                 _subz(n1,n2,r);                  _subz(n1,n2,r);
                 if ( !SL(r) ) r = 0;                  if ( !SL(r) ) r = 0;
                 else if ( IS_IMMZ(r) ) {  
                         IMMZTOZ(r,r1); r = r1;  
                 }  
                 return r;  
         }          }
           if ( r && !((int)r&1) && IS_SZ(r) ) {
                   SZTOZ(r,r1); r = r1;
           }
           return r;
 }  }
   
 Z mulz(Z n1,Z n2)  Z mulz(Z n1,Z n2)
 {  {
         int d1,d2,sgn,i;          int d1,d2,sgn,i;
           int c1,c2;
         unsigned int u1,u2,u,l;          unsigned int u1,u2,u,l;
         Z r;          Z r;
   
         if ( !n1 || !n2 ) return 0;          if ( !n1 || !n2 ) return 0;
   
         if ( IS_IMM(n1) ) {          if ( IS_IMM(n1) ) {
                 sgn = 1;                  c1 = ZTOS(n1);
                 u1 = ZTOIMM(n1); if ( u1 < 0 ) { sgn = -sgn; u1 = -u1; }  
                 if ( IS_IMM(n2) ) {                  if ( IS_IMM(n2) ) {
                         u2 = ZTOIMM(n2); if ( u2 < 0 ) { sgn = -sgn; u2 = -u2; }                          c2 = ZTOS(n2);
                         DM(u1,u2,u,l);                          if ( c1 == 1 )
                         if ( !u ) {                                  return n2;
                                 IMMTOZ(l,r);                          else if ( c1 == -1 )
                         } else {                                  return chsgnz(n2);
                                 r = ZALLOC(2); SL(r) = 2; BD(r)[1] = u; BD(r)[0] = l;                          else if ( c2 == 1 )
                                   return n1;
                           else if ( c2 == -1 )
                                   return chsgnz(n1);
                           else {
                                   sgn = 1;
                                   if ( c1 < 0 ) { c1 = -c1; sgn = -sgn; }
                                   if ( c2 < 0 ) { c2 = -c2; sgn = -sgn; }
                                   u1 = (unsigned int)c1; u2 = (unsigned int)c2;
                                   DM(u1,u2,u,l);
                                   if ( !u ) {
                                           UTOZ(l,r);
                                   } else {
                                           r = ZALLOC(2); SL(r) = 2; BD(r)[1] = u; BD(r)[0] = l;
                                   }
                         }                          }
                 } else {                  } else {
                           sgn = 1;
                           if ( c1 < 0 ) { c1 = -c1; sgn = -sgn; }
                           u1 = (unsigned int)c1;
                         if ( (d2 = SL(n2)) < 0 ) { sgn = -sgn; d2 = -d2; }                          if ( (d2 = SL(n2)) < 0 ) { sgn = -sgn; d2 = -d2; }
                         r = ZALLOC(d2+1);                          r = ZALLOC(d2+1);
                         for ( i = d2; i >= 0; i-- ) BD(r)[i] = 0;                          for ( i = d2; i >= 0; i-- ) BD(r)[i] = 0;
Line 289  Z mulz(Z n1,Z n2)
Line 351  Z mulz(Z n1,Z n2)
                         SL(r) = BD(r)[d2]?d2+1:d2;                          SL(r) = BD(r)[d2]?d2+1:d2;
                 }                  }
         } else if ( IS_IMM(n2) ) {          } else if ( IS_IMM(n2) ) {
                   c2 = ZTOS(n2);
                   if ( c2 == 1 )
                           return n1;
                   else if ( c2 == -1 )
                           return chsgnz(n1);
   
                 sgn = 1;                  sgn = 1;
                 u2 = ZTOIMM(n2); if ( u2 < 0 ) { sgn = -sgn; u2 = -u2; }                  if ( c2 < 0 ) { sgn = -sgn; c2 = -c2; }
                   u2 = (unsigned int)c2;
                 if ( (d1 = SL(n1)) < 0 ) { sgn = -sgn; d1 = -d1; }                  if ( (d1 = SL(n1)) < 0 ) { sgn = -sgn; d1 = -d1; }
                 r = ZALLOC(d1+1);                  r = ZALLOC(d1+1);
                 for ( i = d1; i >= 0; i-- ) BD(r)[i] = 0;                  for ( i = d1; i >= 0; i-- ) BD(r)[i] = 0;
Line 298  Z mulz(Z n1,Z n2)
Line 367  Z mulz(Z n1,Z n2)
                 SL(r) = BD(r)[d1]?d1+1:d1;                  SL(r) = BD(r)[d1]?d1+1:d1;
         } else {          } else {
                 sgn = 1;                  sgn = 1;
                 if ( (d1 = SL(n1)) < 0 ) { sgn = -sgn; d1 = -d1; }                  if ( (d1 = SL(n1)) < 0 ) d1 = -d1;
                 if ( (d2 = SL(n2)) < 0 ) { sgn = -sgn; d2 = -d2; }                  if ( (d2 = SL(n2)) < 0 ) d2 = -d2;
                 r = ZALLOC(d1+d2);                  r = ZALLOC(d1+d2);
                 _mulz(n1,n2,r);                  _mulz(n1,n2,r);
         }          }
         if ( sgn < 0 ) SL(r) = -SL(r);          if ( sgn < 0 ) r = chsgnz(r);
         return r;          return r;
 }  }
   
Line 320  Z divsz(Z n1,Z n2)
Line 389  Z divsz(Z n1,Z n2)
         if ( IS_IMM(n1) ) {          if ( IS_IMM(n1) ) {
                 if ( !IS_IMM(n2) )                  if ( !IS_IMM(n2) )
                         error("divsz : cannot happen");                          error("divsz : cannot happen");
                 c = ZTOIMM(n1)/ZTOIMM(n2);                  c = ZTOS(n1)/ZTOS(n2);
                 IMMTOZ(c,q);                  STOZ(c,q);
                 return q;                  return q;
         }          }
         if ( IS_IMM(n2) ) {          if ( IS_IMM(n2) ) {
                 sgn = 1;                  sgn = 1;
                 u2 = ZTOIMM(n2); if ( u2 < 0 ) { sgn = -sgn; u2 = -u2; }                  u2 = ZTOS(n2); if ( u2 < 0 ) { sgn = -sgn; u2 = -u2; }
                 diviz(n1,u2,&q);                  diviz(n1,u2,&q);
                 if ( sgn < 0 ) SL(q) = -SL(q);                  if ( sgn < 0 ) SL(q) = -SL(q);
                 return q;                  return q;
Line 343  Z divsz(Z n1,Z n2)
Line 412  Z divsz(Z n1,Z n2)
         if ( d1 < d2 ) error("divsz : cannot happen");          if ( d1 < d2 ) error("divsz : cannot happen");
         return q;          return q;
 }  }
   #endif
   
   /* XXX */
   Z divz(Z n1,Z n2,Z *r)
   {
           int s1,s2;
           Q t1,t2,qq,rq;
           N qn,rn;
   
           if ( !n1 ) {
                   *r = 0; return 0;
           }
           if ( !n2 )
                   error("divz : division by 0");
           t1 = ztoq(n1); t2 = ztoq(n2);
           s1 = sgnz(n1); s2 = sgnz(n2);
           /* n1 = qn*SGN(n1)*SGN(n2)*n2+SGN(n1)*rn */
           divn(NM(t1),NM(t2),&qn,&rn);
           NTOQ(qn,s1*s2,qq);
           NTOQ(rn,s1,rq);
           *r = qtoz(rq);
           return qtoz(qq);
   }
   
   Z divsz(Z n1,Z n2)
   {
           int s1,s2;
           Q t1,t2,qq;
           N qn;
   
           if ( !n1 )
                   return 0;
           if ( !n2 )
                   error("divsz : division by 0");
           t1 = ztoq(n1); t2 = ztoq(n2);
           s1 = sgnz(n1); s2 = sgnz(n2);
           /* n1 = qn*SGN(n1)*SGN(n2)*n2 */
           divsn(NM(t1),NM(t2),&qn);
           NTOQ(qn,s1*s2,qq);
           return qtoz(qq);
   }
   
   int gcdimm(int c1,int c2)
   {
           int r;
   
           if ( !c1 ) return c2;
           else if ( !c2 ) return c1;
           while ( 1 ) {
                   r = c1%c2;
                   if ( !r ) return c2;
                   c1 = c2; c2 = r;
           }
   }
   
 Z gcdz(Z n1,Z n2)  Z gcdz(Z n1,Z n2)
 {  {
         int d1,d2;          int c1,c2,g;
         N gcd;          Z gcd,r;
           N gn;
   
         if ( !n1 ) return n2;          if ( !n1 ) return n2;
         else if ( !n2 ) return n1;          else if ( !n2 ) return n1;
   
         n1 = dupz(n1);          if ( IS_IMM(n1) ) {
         if ( SL(n1) < 0 ) SL(n1) = -SL(n1);                  c1 = ZTOS(n1);
         n2 = dupz(n2);                  if ( c1 < 0 ) c1 = -c1;
         if ( SL(n2) < 0 ) SL(n2) = -SL(n2);                  if ( IS_IMM(n2) )
         gcdn((N)n1,(N)n2,&gcd);                          c2 = ZTOS(n2);
         return (Z)gcd;                  else
                           c2 = remzi(n2,c1>0?c1:-c1);
                   if ( c2 < 0 ) c2 = -c2;
                   g = gcdimm(c1,c2);
                   STOZ(g,gcd);
                   return gcd;
           } else if ( IS_IMM(n2) ) {
                   c2 = ZTOS(n2);
                   if ( c2 < 0 ) c2 = -c2;
                   c1 = remzi(n1,c2>0?c2:-c2);
                   if ( c1 < 0 ) c1 = -c1;
                   g = gcdimm(c1,c2);
                   STOZ(g,gcd);
                   return gcd;
           } else {
                   n1 = dupz(n1);
                   if ( SL(n1) < 0 ) SL(n1) = -SL(n1);
                   n2 = dupz(n2);
                   if ( SL(n2) < 0 ) SL(n2) = -SL(n2);
                   gcdn((N)n1,(N)n2,&gn);
                   gcd = (Z)gn;
                   if ( IS_SZ(gcd) ) {
                           SZTOZ(gcd,r); gcd = r;
                   }
                   return gcd;
           }
 }  }
   
 int remzi(Z n,int m)  int remzi(Z n,int m)
 {  {
         unsigned int *x;          unsigned int *x;
         unsigned int t,r;          unsigned int t,r;
         int i;          int i,c;
   
         if ( !n ) return 0;          if ( !n ) return 0;
           if ( IS_IMM(n) ) {
                   c = ZTOS(n)%m;
                   if ( c < 0 ) c += m;
                   return c;
           }
   
         i = SL(n);          i = SL(n);
         if ( i < 0 ) i = -i;          if ( i < 0 ) i = -i;
         for ( i--, x = BD(n)+i, r = 0; i >= 0; i--, x-- ) {          for ( i--, x = BD(n)+i, r = 0; i >= 0; i--, x-- ) {
Line 376  int remzi(Z n,int m)
Line 531  int remzi(Z n,int m)
                 DSAB(m,r,*x,t,r);                  DSAB(m,r,*x,t,r);
 #endif  #endif
         }          }
           if ( r && SL(n) < 0 )
                   r = m-r;
         return r;          return r;
 }  }
   
Line 389  Z gcdz_cofactor(Z n1,Z n2,Z *c1,Z *c2)
Line 546  Z gcdz_cofactor(Z n1,Z n2,Z *c1,Z *c2)
         return gcd;          return gcd;
 }  }
   
   #if 0
 Z estimate_array_gcdz(Z *b,int n)  Z estimate_array_gcdz(Z *b,int n)
 {  {
         int m,i,j,sd;          int m,i,j,sd;
Line 683  void printz(Z n)
Line 841  void printz(Z n)
         if ( !n )          if ( !n )
                 fprintf(asir_out,"0");                  fprintf(asir_out,"0");
         else if ( IS_IMM(n) ) {          else if ( IS_IMM(n) ) {
                 u = ZTOIMM(n);                  u = ZTOS(n);
                 fprintf(asir_out,"%d",u);                  fprintf(asir_out,"%d",u);
         } else {          } else {
                 if ( (sd = SL(n)) < 0 ) { SL(n) = -SL(n); fprintf(asir_out,"-"); }                  if ( (sd = SL(n)) < 0 ) { SL(n) = -SL(n); fprintf(asir_out,"-"); }

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

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