=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2018/engine/nd.c,v retrieving revision 1.8 retrieving revision 1.10 diff -u -p -r1.8 -r1.10 --- OpenXM_contrib2/asir2018/engine/nd.c 2018/10/01 07:48:01 1.8 +++ OpenXM_contrib2/asir2018/engine/nd.c 2018/10/19 23:27:38 1.10 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM_contrib2/asir2018/engine/nd.c,v 1.7 2018/10/01 05:49:06 noro Exp $ */ +/* $OpenXM: OpenXM_contrib2/asir2018/engine/nd.c,v 1.9 2018/10/02 09:06:15 noro Exp $ */ #include "nd.h" @@ -6042,6 +6042,7 @@ int ndv_reduce_vect_q(Z *svect,int trace,int col,IndAr return maxrs; } #else + /* direct mpz version */ int ndv_reduce_vect_q(Z *svect0,int trace,int col,IndArray *imat,NM_ind_pair *rp0,int nred) { @@ -6084,8 +6085,12 @@ int ndv_reduce_vect_q(Z *svect0,int trace,int col,IndA mpz_div(cs,svect[k],gcd); mpz_div(cr,BDY(CZ(mr)),gcd); mpz_neg(cs,cs); - for ( j = 0; j < col; j++ ) - mpz_mul(svect[j],svect[j],cr); + if ( MUNIMPZ(cr) ) + for ( j = 0; j < col; j++ ) mpz_neg(svect[j],svect[j]); + else if ( !UNIMPZ(cr) ) + for ( j = 0; j < col; j++ ) { + if ( mpz_sgn(svect[j]) ) mpz_mul(svect[j],svect[j],cr); + } mpz_set_ui(svect[k],0); prev = k; switch ( ivect->width ) { @@ -8196,7 +8201,7 @@ P ndc_div(int mod,union oNDC a,union oNDC b) int inv,t; if ( mod == -1 ) c.m = _mulsf(a.m,_invsf(b.m)); - else if ( mod == -2 ) divlf(a.gz,b.gz,&c.gz); + else if ( mod == -2 ) divlf(a.z,b.z,&c.z); else if ( mod ) { inv = invm(b.m,mod); DMAR(a.m,inv,0,mod,t); c.m = t; @@ -8216,7 +8221,7 @@ P ndctop(int mod,union oNDC c) if ( mod == -1 ) { e = IFTOF(c.m); MKGFS(e,gfs); return (P)gfs; } else if ( mod == -2 ) { - q = c.gz; return (P)q; + q = c.z; return (P)q; } else if ( mod > 0 ) { STOZ(c.m,q); return (P)q; } else