=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/PU.c,v retrieving revision 1.9 retrieving revision 1.12 diff -u -p -r1.9 -r1.12 --- OpenXM_contrib2/asir2000/engine/PU.c 2002/09/11 07:23:25 1.9 +++ OpenXM_contrib2/asir2000/engine/PU.c 2004/09/14 09:25:48 1.12 @@ -45,7 +45,7 @@ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. * - * $OpenXM: OpenXM_contrib2/asir2000/engine/PU.c,v 1.8 2001/10/09 01:36:11 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/engine/PU.c,v 1.11 2004/09/14 07:23:34 noro Exp $ */ #include "ca.h" @@ -116,7 +116,7 @@ void substp(VL vl,P p,V v0,P p0,P *pr) void detp(VL vl,P **rmat,int n,P *dp) { - int i,j,k,sgn; + int i,j,k,l,sgn,nmin,kmin,lmin,ntmp; P mjj,mij,t,s,u,d; P **mat; P *mi,*mj; @@ -130,12 +130,22 @@ void detp(VL vl,P **rmat,int n,P *dp) if ( i == n ) { *dp = 0; return; } - for ( k = i; k < n; k++ ) - if ( mat[k][j] && (nmonop(mat[k][j]) < nmonop(mat[i][j]) ) ) - i = k; - if ( j != i ) { - mj = mat[j]; mat[j] = mat[i]; mat[i] = mj; sgn = -sgn; + nmin = nmonop(mat[i][j]); + kmin=i; lmin=j; + for ( k = j; k < n; k++ ) + for ( l = j; l < n; l++ ) + if ( mat[k][l] && ((ntmp=nmonop(mat[k][l])) < nmin) ) { + kmin = k; lmin = l; nmin = ntmp; + } + if ( kmin != j ) { + mj = mat[j]; mat[j] = mat[kmin]; mat[kmin] = mj; sgn = -sgn; } + if ( lmin != j ) { + for ( k = j; k < n; k++ ) { + t = mat[k][j]; mat[k][j] = mat[k][lmin]; mat[k][lmin] = t; + } + sgn = -sgn; + } for ( i = j + 1, mj = mat[j], mjj = mj[j]; i < n; i++ ) for ( k = j + 1, mi = mat[i], mij = mi[j]; k < n; k++ ) { mulp(vl,mi[k],mjj,&t); mulp(vl,mj[k],mij,&s); @@ -1030,7 +1040,7 @@ int maxblenp(P p) return n_bits(NM((Q)p))+(INT((Q)p)?0:n_bits(DN((Q)p))); else { for ( dc = DC(p), s = 0; dc; dc = NEXT(dc) ) { - t = p_mag(COEF(dc)); + t = maxblenp(COEF(dc)); s = MAX(t,s); } return s;