=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/nd.c,v retrieving revision 1.150 retrieving revision 1.153 diff -u -p -r1.150 -r1.153 --- OpenXM_contrib2/asir2000/engine/nd.c 2006/12/12 11:50:37 1.150 +++ OpenXM_contrib2/asir2000/engine/nd.c 2007/04/30 02:11:12 1.153 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.149 2006/12/04 01:40:51 noro Exp $ */ +/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.152 2006/12/21 07:45:02 ohara Exp $ */ #include "nd.h" @@ -50,6 +50,7 @@ static int nd_demand; NumberField get_numberfield(); UINT *nd_det_compute_bound(NDV **dm,int n,int j); void nd_det_reconstruct(NDV **dm,int n,int j,NDV d); +void nd_heu_nezgcdnpz(VL vl,P *pl,int m,int full,P *pr); int nd_monic(int m,ND *p); NDV plain_vect_to_ndv_q(Q *mat,int col,UINT *s0vect); @@ -1319,7 +1320,7 @@ int ndv_check_candidate(NODE input,int obpe,int oadv,E NODE t,s; union oNDC dn; - ndv_setup(0,0,cand,0); + ndv_setup(0,0,cand,0,1); n = length(cand); /* membercheck : list is a subset of Id(cand) ? */ @@ -1967,7 +1968,7 @@ NODE ndv_reduceall(int m,NODE f) (int (*)(const void *,const void *))ndv_compare); for ( t = f, i = 0; t; i++, t = NEXT(t) ) BDY(t) = (pointer)w[i]; #endif - ndv_setup(m,0,f,0); + ndv_setup(m,0,f,0,1); for ( i = 0; i < n; ) { g = ndvtond(m,nd_ps[i]); g = nd_separate_head(g,&head); @@ -2300,7 +2301,7 @@ int ndv_newps(int m,NDV a,NDV aq) return nd_psn++; } -void ndv_setup(int mod,int trace,NODE f,int dont_sort) +void ndv_setup(int mod,int trace,NODE f,int dont_sort,int dont_removecont) { int i,j,td,len,max; NODE s,s0,f0; @@ -2341,14 +2342,14 @@ void ndv_setup(int mod,int trace,NODE f,int dont_sort) for ( i = 0; i < nd_psn; i++ ) { if ( trace ) { a = nd_ps_trace[i] = ndv_dup(0,w[i]); - ndv_removecont(0,a); + if ( !dont_removecont) ndv_removecont(0,a); register_hcf(a); am = nd_ps[i] = ndv_dup(mod,a); ndv_mod(mod,am); ndv_removecont(mod,am); } else { a = nd_ps[i] = ndv_dup(mod,w[i]); - ndv_removecont(mod,a); + if ( mod || !dont_removecont ) ndv_removecont(mod,a); if ( !mod ) register_hcf(a); } NEWRHist(r); SG(r) = HTD(a); ndl_copy(HDL(a),DL(r)); @@ -2536,7 +2537,7 @@ void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe if ( b ) { NEXTNODE(fd0,fd); BDY(fd) = (pointer)b; } } if ( fd0 ) NEXT(fd) = 0; - ndv_setup(m,0,fd0,0); + ndv_setup(m,0,fd0,0,0); x = f4?nd_f4(m):nd_gb(m,ishomo,0); nd_demand = 0; x = ndv_reducebase(x); @@ -2611,7 +2612,7 @@ void nd_gr_postproc(LIST f,LIST v,int m,struct order_s if ( b ) { NEXTNODE(fd0,fd); BDY(fd) = (pointer)b; } } if ( fd0 ) NEXT(fd) = 0; - ndv_setup(m,0,fd0,0); + ndv_setup(m,0,fd0,0,1); for ( x = 0, i = 0; i < nd_psn; i++ ) x = update_base(x,i); if ( do_check ) { @@ -2729,7 +2730,7 @@ void nd_gr_trace(LIST f,LIST v,int trace,int homo,int while ( 1 ) { if ( Demand ) nd_demand = 1; - ndv_setup(m,1,fd0,0); + ndv_setup(m,1,fd0,0,0); cand = f4?nd_f4_trace(m):nd_gb_trace(m,ishomo || homo); if ( !cand ) { /* failure */ @@ -4274,8 +4275,8 @@ void nd_nf_p(P f,LIST g,LIST v,int m,struct order_spec if ( m ) ndv_mod(m,(NDV)BDY(in)); NEXT(in) = 0; - /* dont sort */ - ndv_setup(m,0,in0,1); + /* dont sort, dont removecont */ + ndv_setup(m,0,in0,1,1); nd_psn--; nd_scale=2; while ( 1 ) { @@ -5805,7 +5806,9 @@ void nd_det(int mod,MAT f,P *rp) sgn = -sgn; } bound = nd_det_compute_bound(dm,n,j); - if ( ndl_check_bound(bound,bound) ) + for ( k = 0; k < nd_nvar; k++ ) + if ( bound[k]*2 > nd_mask0 ) break; + if ( k < nd_nvar ) nd_det_reconstruct(dm,n,j,d); for ( i = j+1, mj = dm[j], mjj = mj[j]; i < n; i++ ) { @@ -5935,24 +5938,23 @@ void nd_det_reconstruct(NDV **dm,int n,int j,NDV d) #endif } +/* returns a UINT array containing degree bounds */ + UINT *nd_det_compute_bound(NDV **dm,int n,int j) { UINT *d0,*d1,*d,*t,*r; - int k,l; + int k,l,i; - d0 = (UINT *)ALLOCA(nd_wpd*sizeof(UINT)); - d1 = (UINT *)ALLOCA(nd_wpd*sizeof(UINT)); - for ( k = 0; k < nd_wpd; k++ ) d0[k] = 0; + d0 = (UINT *)MALLOC(nd_nvar*sizeof(UINT)); + for ( k = 0; k < nd_nvar; k++ ) d0[k] = 0; for ( k = j; k < n; k++ ) for ( l = j; l < n; l++ ) if ( dm[k][l] ) { d = ndv_compute_bound(dm[k][l]); - ndl_lcm(d,d0,d1); - t = d1; d1 = d0; d0 = t; + for ( i = 0; i < nd_nvar; i++ ) + d0[i] = MAX(d0[i],d[i]); } - r = (UINT *)ALLOCA(nd_wpd*sizeof(UINT)); - for ( k = 0; k < nd_wpd; k++ ) r[k] = d0[k]; - return r; + return d0; } DL nd_separate_d(UINT *d,UINT *trans)