=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/nd.c,v retrieving revision 1.103 retrieving revision 1.106 diff -u -p -r1.103 -r1.106 --- OpenXM_contrib2/asir2000/engine/nd.c 2004/09/15 06:06:42 1.103 +++ OpenXM_contrib2/asir2000/engine/nd.c 2004/09/21 02:23:49 1.106 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.102 2004/09/15 01:43:33 noro Exp $ */ +/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.105 2004/09/17 05:43:22 noro Exp $ */ #include "nd.h" @@ -3202,21 +3202,24 @@ ND ndv_mul_nm(int mod,NM m0,NDV p) } } -ND nd_quo(int mod,ND p,NDV d) +ND nd_quo(int mod,PGeoBucket bucket,NDV d) { NM mq0,mq; NMV tm; Q q; - int i,nv,sg,c,c1,c2; - ND t,r; - + int i,nv,sg,c,c1,c2,hindex; + ND p,t,r; + N tnm; + if ( !p ) return 0; else { - nv = NV(p); - sg = SG(p); + nv = NV(d); mq0 = 0; tm = (NMV)ALLOCA(nmv_adv); - while ( p ) { + while ( 1 ) { + hindex = mod?head_pbucket(mod,bucket):head_pbucket_q(bucket); + if ( hindex < 0 ) break; + p = bucket->body[hindex]; NEXTNM(mq0,mq); ndl_sub(HDL(p),HDL(d),DL(mq)); ndl_copy(DL(mq),DL(tm)); @@ -3225,17 +3228,24 @@ ND nd_quo(int mod,ND p,NDV d) DMAR(c1,c2,0,mod,c); CM(mq) = c; CM(tm) = mod-c; } else { - divq(HCQ(p),HCQ(d),&CQ(mq)); + divsn(NM(HCQ(p)),NM(HCQ(d)),&tnm); + NTOQ(tnm,SGN(HCQ(p))*SGN(HCQ(d)),CQ(mq)); chsgnq(CQ(mq),&CQ(tm)); } t = ndv_mul_nmv_trunc(mod,tm,d,HDL(d)); - p = nd_add(mod,p,t); + bucket->body[hindex] = nd_remove_head(p); + t = nd_remove_head(t); + add_pbucket(mod,bucket,t); } - NEXT(mq) = 0; - for ( i = 0, mq = mq0; mq; mq = NEXT(mq), i++ ); - MKND(nv,mq0,i,r); - /* XXX */ - SG(r) = sg-SG(d); + if ( !mq0 ) + r = 0; + else { + NEXT(mq) = 0; + for ( i = 0, mq = mq0; mq; mq = NEXT(mq), i++ ); + MKND(nv,mq0,i,r); + /* XXX */ + SG(r) = HTD(r); + } return r; } } @@ -4124,23 +4134,14 @@ NODE nd_f4(int m) NODE nd_f4_red(int m,ND_pairs sp0,UINT *s0vect,int col,NODE rp0) { IndArray *imat; - int nsp,nred,spcol,sprow,a; + int nsp,nred,i; int *rhead; - int i,j,k,l,rank; - NODE rp,r0,r; + NODE r0,rp; ND_pairs sp; - ND spol; - int **spmat; - UINT *svect,*v; - int *colstat; - struct oEGT eg0,eg1,eg2,eg_f4,eg_f4_1,eg_f4_2; NM_ind_pair *rvect; - int maxrs; - int *spsugar; - get_eg(&eg0); for ( sp = sp0, nsp = 0; sp; sp = NEXT(sp), nsp++ ); - nred = length(rp0); spcol = col-nred; + nred = length(rp0); imat = (IndArray *)ALLOCA(nred*sizeof(IndArray)); rhead = (int *)ALLOCA(col*sizeof(int)); for ( i = 0; i < col; i++ ) rhead[i] = 0; @@ -4152,7 +4153,27 @@ NODE nd_f4_red(int m,ND_pairs sp0,UINT *s0vect,int col imat[i] = nm_ind_pair_to_vect_compress(m,s0vect,col,rvect[i]); rhead[imat[i]->head] = 1; } + r0 = nd_f4_red_main(m,sp0,nsp,s0vect,col,rvect,rhead,imat,nred); + return r0; +} +NODE nd_f4_red_main(int m,ND_pairs sp0,int nsp,UINT *s0vect,int col, + NM_ind_pair *rvect,int *rhead,IndArray *imat,int nred) +{ + int spcol,sprow,a; + int i,j,k,l,rank; + NODE r0,r; + ND_pairs sp; + ND spol; + int **spmat; + UINT *svect,*v; + int *colstat; + struct oEGT eg0,eg1,eg2,eg_f4,eg_f4_1,eg_f4_2; + int maxrs; + int *spsugar; + + spcol = col-nred; + get_eg(&eg0); /* elimination (1st step) */ spmat = (int **)ALLOCA(nsp*sizeof(UINT *)); svect = (UINT *)ALLOCA(col*sizeof(UINT)); @@ -4711,6 +4732,7 @@ void nd_det(int mod,MAT f,P *rp) if ( mod ) ndv_mod(mod,d); chsgnq(ONE,&mone); for ( j = 0, sgn = 1; j < n; j++ ) { + if ( DP_Print ) fprintf(stderr,"j=%d\n",j); for ( i = j; i < n && !dm[i][j]; i++ ); if ( i == n ) { *rp = 0; @@ -4733,19 +4755,22 @@ void nd_det(int mod,MAT f,P *rp) sgn = -sgn; } for ( i = j+1, mj = dm[j], mjj = mj[j]; i < n; i++ ) { + if ( DP_Print ) fprintf(stderr," i=%d\n ",i); mi = dm[i]; mij = mi[j]; if ( mod ) ndv_mul_c(mod,mij,mod-1); else ndv_mul_c_q(mij,mone); for ( k = j+1; k < n; k++ ) { + if ( DP_Print ) fprintf(stderr,"k=%d ",k); bucket = create_pbucket(); - if ( mi[k] ) + if ( mi[k] ) { nmv = BDY(mjj); len = LEN(mjj); for ( a = 0; a < len; a++, NMV_ADV(nmv) ) { u = ndv_mul_nmv_trunc(mod,nmv,mi[k],DL(BDY(d))); add_pbucket(mod,bucket,u); } + } if ( mj[k] && mij ) { nmv = BDY(mij); len = LEN(mij); for ( a = 0; a < len; a++, NMV_ADV(nmv) ) { @@ -4753,10 +4778,10 @@ void nd_det(int mod,MAT f,P *rp) add_pbucket(mod,bucket,u); } } - u = normalize_pbucket(mod,bucket); - u = nd_quo(mod,u,d); + u = nd_quo(mod,bucket,d); mi[k] = ndtondv(mod,u); } + if ( DP_Print ) fprintf(stderr,"\n",k); } d = mjj; } @@ -4792,7 +4817,7 @@ ND ndv_mul_nmv_trunc(int mod,NMV m0,NDV p,UINT *d) if ( ndl_reducible(DL(tnm),d) ) { NEXTNM(mr0,mr); c1 = CM(m); DMAR(c1,c,0,mod,c2); CM(mr) = c2; - ndl_add(DL(m),d0,DL(mr)); + ndl_copy(DL(tnm),DL(mr)); } } } else { @@ -4802,7 +4827,7 @@ ND ndv_mul_nmv_trunc(int mod,NMV m0,NDV p,UINT *d) if ( ndl_reducible(DL(tnm),d) ) { NEXTNM(mr0,mr); mulq(CQ(m),q,&CQ(mr)); - ndl_add(DL(m),d0,DL(mr)); + ndl_copy(DL(tnm),DL(mr)); } } } @@ -4810,6 +4835,7 @@ ND ndv_mul_nmv_trunc(int mod,NMV m0,NDV p,UINT *d) return 0; else { NEXT(mr) = 0; + for ( len = 0, mr = mr0; mr; mr = NEXT(mr), len++ ); MKND(NV(p),mr0,len,r); SG(r) = SG(p) + TD(d0); return r;