=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2018/engine/nd.c,v retrieving revision 1.36 retrieving revision 1.40 diff -u -p -r1.36 -r1.40 --- OpenXM_contrib2/asir2018/engine/nd.c 2020/09/27 04:35:04 1.36 +++ OpenXM_contrib2/asir2018/engine/nd.c 2020/11/02 08:30:55 1.40 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM_contrib2/asir2018/engine/nd.c,v 1.35 2020/08/26 06:40:36 noro Exp $ */ +/* $OpenXM: OpenXM_contrib2/asir2018/engine/nd.c,v 1.39 2020/10/29 01:50:35 noro Exp $ */ #include "nd.h" @@ -66,6 +66,8 @@ static int *nd_poly_weight,*nd_module_weight; static NODE nd_tracelist; static NODE nd_alltracelist; static int nd_gentrace,nd_gensyz,nd_nora,nd_newelim,nd_intersect,nd_lf; +static int nd_f4_td,nd_sba_f4step,nd_sba_pot,nd_sba_largelcm,nd_sba_dontsort; +static int nd_top; static int *nd_gbblock; static NODE nd_nzlist,nd_check_splist; static int nd_splist; @@ -114,6 +116,7 @@ NODE nd_f4_red_mod64_main(int m,ND_pairs sp0,int nsp,U NODE nd_f4_red_lf_main(int m,ND_pairs sp0,int nsp,int trace,UINT *s0vect,int col, NM_ind_pair *rvect,int *rhead,IndArray *imat,int nred); int nd_gauss_elim_lf(mpz_t **mat0,int *sugar,int row,int col,int *colstat); +int nd_gauss_elim_mod_s(UINT **mat,int *sugar,ND_pairs *spactive,int row,int col,int md,int *colstat,SIG *sig); NODE nd_f4_lf_trace_main(int m,int **indp); void nd_f4_lf_trace(LIST f,LIST v,int trace,int homo,struct order_spec *ord,LIST *rp); @@ -1256,7 +1259,7 @@ INLINE int ndl_find_reducer_s(UINT *dg,SIG sig) quo->pos = nd_psh[i]->sig->pos; ret = comp_sig(sig,quo); if ( ret > 0 ) { singular = 0; break; } - if ( ret == 0 ) { fprintf(asir_out,"s"); fflush(asir_out); singular = 1; } + if ( ret == 0 ) { /* fprintf(asir_out,"s"); fflush(asir_out); */ singular = 1; } } } if ( singular ) return -1; @@ -2028,6 +2031,7 @@ void free_pbucket(PGeoBucket b) { GCFREE(b); } +#if 0 void add_pbucket_symbolic(PGeoBucket g,ND d) { int l,i,k,m; @@ -2045,7 +2049,32 @@ void add_pbucket_symbolic(PGeoBucket g,ND d) g->body[k] = d; g->m = MAX(g->m,k); } +#else +void add_pbucket_symbolic(PGeoBucket g,ND d) +{ + int l,i,k,m,m0; + if ( !d ) + return; + m0 = g->m; + while ( 1 ) { + l = LEN(d); + for ( k = 0, m = 1; l > m; k++, m <<= 1 ); + /* 2^(k-1) < l <= 2^k (=m) */ + if ( g->body[k] == 0 ) { + g->body[k] = d; + m0 = MAX(k,m0); + break; + } else { + d = nd_merge(g->body[k],d); + g->body[k] = 0; + } + } + g->m = m0; +} +#endif + +#if 0 void add_pbucket(int mod,PGeoBucket g,ND d) { int l,i,k,m; @@ -2063,7 +2092,29 @@ void add_pbucket(int mod,PGeoBucket g,ND d) g->body[k] = d; g->m = MAX(g->m,k); } +#else +void add_pbucket(int mod,PGeoBucket g,ND d) +{ + int l,i,k,m,m0; + m0 = g->m; + while ( d != 0 ) { + l = LEN(d); + for ( k = 0, m = 1; l > m; k++, m <<= 1 ); + /* 2^(k-1) < l <= 2^k (=m) */ + if ( g->body[k] == 0 ) { + g->body[k] = d; + m0 = MAX(k,m0); + break; + } else { + d = nd_add(mod,g->body[k],d); + g->body[k] = 0; + } + } + g->m = m0; +} +#endif + void mulq_pbucket(PGeoBucket g,Z c) { int k; @@ -2423,10 +2474,10 @@ again: goto again; } #if USE_GEOBUCKET - stat = (m&&!nd_gentrace)?nd_nf_pbucket(m,h,nd_ps,!Top,&nf) - :nd_nf(m,0,h,nd_ps,!Top,&nf); + stat = (m&&!nd_gentrace)?nd_nf_pbucket(m,h,nd_ps,!nd_top&&!Top,&nf) + :nd_nf(m,0,h,nd_ps,!nd_top&&!Top,&nf); #else - stat = nd_nf(m,0,h,nd_ps,!Top,&nf); + stat = nd_nf(m,0,h,nd_ps,!nd_top&&!Top,&nf); #endif if ( !stat ) { NEXT(l) = d; d = l; @@ -2561,6 +2612,7 @@ int small_lcm(ND_pairs l) static DL lcm,mul,quo; static int nvar; + if ( nd_sba_largelcm ) return 0; if ( nvar < nd_nvar ) { nvar = nd_nvar; NEWDL(lcm,nvar); NEWDL(quo,nvar); NEWDL(mul,nvar); } @@ -2617,7 +2669,7 @@ NODE conv_ilist_s(int demand,int trace,int **indp); NODE nd_sba_buch(int m,int ishomo,int **indp) { - int i,j,nh,sugar,stat; + int i,j,nh,sugar,stat,pos; NODE r,t,g; ND_pairs d; ND_pairs l; @@ -2649,6 +2701,7 @@ init_eg(&eg_remove); syzlist[sig->pos] = insert_sig(syzlist[sig->pos],sig); } sugar = 0; + pos = 0; NEWDL(lcm,nd_nvar); NEWDL(quo,nd_nvar); NEWDL(mul,nd_nvar); init_eg(&eg_create); init_eg(&eg_merge); @@ -2675,6 +2728,12 @@ again: if ( DP_Print ) fprintf(asir_out,"%d",sugar); } sig = l->sig; + if ( DP_Print && nd_sba_pot ) { + if ( sig->pos != pos ) { + fprintf(asir_out,"[%d]",sig->pos); + pos = sig->pos; + } + } stat = nd_sp(m,0,l,&h); if ( !stat ) { NEXT(l) = d; d = l; @@ -2683,9 +2742,9 @@ again: } get_eg(&eg1); #if USE_GEOBUCKET - stat = m?nd_nf_pbucket_s(m,h,nd_ps,!Top,&nf):nd_nf_s(m,0,h,nd_ps,!Top,&nf); + stat = m?nd_nf_pbucket_s(m,h,nd_ps,!nd_top&&!Top,&nf):nd_nf_s(m,0,h,nd_ps,!nd_top&&!Top,&nf); #else - stat = nd_nf_s(m,0,h,nd_ps,!Top,&nf); + stat = nd_nf_s(m,0,h,nd_ps,!nd_top&&!Top,&nf); #endif get_eg(&eg2); if ( !stat ) { @@ -2758,7 +2817,7 @@ again: d = nd_reconstruct(0,d); goto again; } - stat = nd_nf(m,0,h,nd_ps,!Top,&nf); + stat = nd_nf(m,0,h,nd_ps,!nd_top&&!Top,&nf); if ( !stat ) { NEXT(l) = d; d = l; d = nd_reconstruct(0,d); @@ -2933,9 +2992,9 @@ again: goto again; } #if USE_GEOBUCKET - stat = nd_nf_pbucket(m,h,nd_ps,!Top,&nf); + stat = nd_nf_pbucket(m,h,nd_ps,!nd_top&&!Top,&nf); #else - stat = nd_nf(m,0,h,nd_ps,!Top,&nf); + stat = nd_nf(m,0,h,nd_ps,!nd_top&&!Top,&nf); #endif if ( !stat ) { NEXT(l) = d; d = l; @@ -2948,7 +3007,7 @@ again: } else nfq = 0; if ( !nfq ) { - if ( !nd_sp(0,1,l,&h) || !nd_nf(0,0,h,nd_ps_trace,!Top,&nfq) ) { + if ( !nd_sp(0,1,l,&h) || !nd_nf(0,0,h,nd_ps_trace,!nd_top&&!Top,&nfq) ) { NEXT(l) = d; d = l; d = nd_reconstruct(1,d); goto again; @@ -3203,33 +3262,26 @@ ND_pairs nd_newpairs( NODE g, int t ) int comp_sig(SIG s1,SIG s2) { -#if 0 - if ( s1->pos > s2->pos ) return 1; - else if ( s1->pos < s2->pos ) return -1; - else return (*cmpdl)(nd_nvar,s1->dl,s2->dl); -#else - static DL m1,m2; - static int nvar; - int ret; - - if ( nvar != nd_nvar ) { - nvar = nd_nvar; NEWDL(m1,nvar); NEWDL(m2,nvar); + if ( nd_sba_pot ) { + if ( s1->pos > s2->pos ) return 1; + else if ( s1->pos < s2->pos ) return -1; + else return (*cmpdl)(nd_nvar,s1->dl,s2->dl); + } else { + static DL m1,m2; + static int nvar; + int ret; + + if ( nvar != nd_nvar ) { + nvar = nd_nvar; NEWDL(m1,nvar); NEWDL(m2,nvar); + } + _adddl(nd_nvar,s1->dl,nd_sba_hm[s1->pos],m1); + _adddl(nd_nvar,s2->dl,nd_sba_hm[s2->pos],m2); + ret = (*cmpdl)(nd_nvar,m1,m2); + if ( ret != 0 ) return ret; + else if ( s1->pos > s2->pos ) return 1; + else if ( s1->pos < s2->pos ) return -1; + else return 0; } -#if 0 - _copydl(nd_nvar,nd_sba_hm[s1->pos],m1); - _copydl(nd_nvar,nd_sba_hm[s2->pos],m2); - _addtodl(nd_nvar,s1->dl,m1); - _addtodl(nd_nvar,s2->dl,m2); -#else - _adddl(nd_nvar,s1->dl,nd_sba_hm[s1->pos],m1); - _adddl(nd_nvar,s2->dl,nd_sba_hm[s2->pos],m2); -#endif - ret = (*cmpdl)(nd_nvar,m1,m2); - if ( ret != 0 ) return ret; - else if ( s1->pos > s2->pos ) return 1; - else if ( s1->pos < s2->pos ) return -1; - else return 0; -#endif } int _create_spair_s(int i1,int i2,ND_pairs sp,SIG sig1,SIG sig2) @@ -4325,7 +4377,7 @@ void nd_sba(LIST f,LIST v,int m,int homo,int retdp,int ndv_homogenize((NDV)BDY(t),obpe,oadv,oepos,ompos); } - ndv_setup(m,0,fd0,0,0,1); + ndv_setup(m,0,fd0,nd_sba_dontsort,0,1); x = f4 ? nd_sba_f4(m,&perm) : nd_sba_buch(m,ishomo || homo,&perm); if ( !x ) { *rp = 0; return; @@ -7407,7 +7459,7 @@ int ndv_reduce_vect_q(Z *svect0,int trace,int col,IndA } #endif -int ndv_reduce_vect(int m,UINT *svect,int col,IndArray *imat,NM_ind_pair *rp0,int nred) +int ndv_reduce_vect(int m,UINT *svect,int col,IndArray *imat,NM_ind_pair *rp0,int nred,SIG sig) { int i,j,k,len,pos,prev; UINT c,c1,c2,c3,up,lo,dmy; @@ -7424,7 +7476,7 @@ int ndv_reduce_vect(int m,UINT *svect,int col,IndArray for ( i = 0; i < nred; i++ ) { ivect = imat[i]; k = ivect->head; svect[k] %= m; - if ( (c = svect[k]) != 0 ) { + if ( (c = svect[k]) != 0 && (sig == 0 || comp_sig(sig,rp0[i]->sig) > 0 ) ) { maxrs = MAX(maxrs,rp0[i]->sugar); c = m-c; redv = nd_ps[rp0[i]->index]; len = LEN(redv); mr = BDY(redv); @@ -7434,12 +7486,12 @@ int ndv_reduce_vect(int m,UINT *svect,int col,IndArray ivc = ivect->index.c; for ( j = 1, NMV_ADV(mr); j < len; j++, NMV_ADV(mr) ) { pos = prev+ivc[j]; c1 = CM(mr); prev = pos; - if ( c1 ) { - c2 = svect[pos]; + if ( c1 ) { + c2 = svect[pos]; DMA(c1,c,c2,up,lo); if ( up ) { DSAB(m,up,lo,dmy,c3); svect[pos] = c3; } else svect[pos] = lo; - } + } } break; case 2: @@ -7447,12 +7499,12 @@ int ndv_reduce_vect(int m,UINT *svect,int col,IndArray for ( j = 1, NMV_ADV(mr); j < len; j++, NMV_ADV(mr) ) { pos = prev+ivs[j]; c1 = CM(mr); prev = pos; - if ( c1 ) { - c2 = svect[pos]; + if ( c1 ) { + c2 = svect[pos]; DMA(c1,c,c2,up,lo); if ( up ) { DSAB(m,up,lo,dmy,c3); svect[pos] = c3; } else svect[pos] = lo; - } + } } break; case 4: @@ -7460,12 +7512,12 @@ int ndv_reduce_vect(int m,UINT *svect,int col,IndArray for ( j = 1, NMV_ADV(mr); j < len; j++, NMV_ADV(mr) ) { pos = prev+ivi[j]; c1 = CM(mr); prev = pos; - if ( c1 ) { - c2 = svect[pos]; + if ( c1 ) { + c2 = svect[pos]; DMA(c1,c,c2,up,lo); if ( up ) { DSAB(m,up,lo,dmy,c3); svect[pos] = c3; } else svect[pos] = lo; - } + } } break; } @@ -7733,6 +7785,29 @@ NDV vect_to_ndv(UINT *vect,int spcol,int col,int *rhea } } +NDV vect_to_ndv_s(UINT *vect,int col,UINT *s0vect) +{ + int j,k,len; + UINT *p; + UINT c; + NDV r; + NMV mr0,mr; + + for ( j = 0, len = 0; j < col; j++ ) if ( vect[j] ) len++; + if ( !len ) return 0; + else { + mr0 = (NMV)MALLOC_ATOMIC_IGNORE_OFF_PAGE(nmv_adv*len); + mr = mr0; + p = s0vect; + for ( j = k = 0; j < col; j++, p += nd_wpd ) + if ( (c = vect[k++]) != 0 ) { + ndl_copy(p,DL(mr)); CM(mr) = c; NMV_ADV(mr); + } + MKNDV(nd_nvar,mr0,len,r); + return r; + } +} + NDV vect_to_ndv_2(unsigned long *vect,int col,UINT *s0vect) { int j,k,len; @@ -7999,6 +8074,7 @@ NODE nd_f4(int m,int checkonly,int **indp) if ( nflist ) nd_last_nonzero = f4red; for ( r = nflist; r; r = NEXT(r) ) { nf = (NDV)BDY(r); + if ( nd_f4_td ) SG(nf) = nd_tdeg(nf); ndv_removecont(m,nf); if ( !m && nd_nalg ) { ND nf1; @@ -8403,7 +8479,7 @@ NODE nd_f4_red_main(int m,ND_pairs sp0,int nsp,UINT *s if ( m == -1 ) maxrs = ndv_reduce_vect_sf(m,svect,col,imat,rvect,nred); else - maxrs = ndv_reduce_vect(m,svect,col,imat,rvect,nred); + maxrs = ndv_reduce_vect(m,svect,col,imat,rvect,nred,0); for ( i = 0; i < col; i++ ) if ( svect[i] ) break; if ( i < col ) { spmat[sprow] = v = (UINT *)MALLOC_ATOMIC(spcol*sizeof(UINT)); @@ -8459,7 +8535,84 @@ NODE nd_f4_red_main(int m,ND_pairs sp0,int nsp,UINT *s return r0; } +NODE nd_f4_red_main_s(int m,ND_pairs sp0,int nsp,UINT *s0vect,int col, + NM_ind_pair *rvect,int *rhead,IndArray *imat,int nred,NODE *syzlistp) +{ + int spcol,sprow,a; + int i,j,k,l,rank; + NODE r0,r; + ND_pairs sp; + ND spol; + UINT **spmat; + UINT *svect,*cvect; + UINT *v; + int *colstat; + struct oEGT eg0,eg1,eg2,eg_f4,eg_f4_1,eg_f4_2; + int maxrs; + int *spsugar; + ND_pairs *spactive; + SIG *spsig; + get_eg(&eg0); + /* elimination (1st step) */ + spmat = (UINT **)MALLOC(nsp*sizeof(UINT *)); + spsugar = (int *)MALLOC(nsp*sizeof(int)); + spsig = (SIG *)MALLOC(nsp*sizeof(SIG)); + for ( a = sprow = 0, sp = sp0; a < nsp; a++, sp = NEXT(sp) ) { + nd_sp(m,0,sp,&spol); + if ( !spol ) { + syzlistp[sp->sig->pos] = insert_sig(syzlistp[sp->sig->pos],sp->sig); + continue; + } + svect = (UINT *)MALLOC(col*sizeof(UINT)); + nd_to_vect(m,s0vect,col,spol,svect); + maxrs = ndv_reduce_vect(m,svect,col,imat,rvect,nred,spol->sig); + for ( i = 0; i < col; i++ ) if ( svect[i] ) break; + if ( i < col ) { + spmat[sprow] = svect; + spsugar[sprow] = MAX(maxrs,SG(spol)); + spsig[sprow] = sp->sig; + sprow++; + } else { + syzlistp[sp->sig->pos] = insert_sig(syzlistp[sp->sig->pos],sp->sig); + } + nd_free(spol); + } + get_eg(&eg1); init_eg(&eg_f4_1); add_eg(&eg_f4_1,&eg0,&eg1); add_eg(&f4_elim1,&eg0,&eg1); + if ( DP_Print ) { + fprintf(asir_out,"elim1=%.3fsec,",eg_f4_1.exectime); + fflush(asir_out); + } + /* free index arrays */ + for ( i = 0; i < nred; i++ ) GCFREE(imat[i]->index.c); + + /* elimination (2nd step) */ + colstat = (int *)MALLOC(col*sizeof(int)); + rank = nd_gauss_elim_mod_s(spmat,spsugar,0,sprow,col,m,colstat,spsig); + r0 = 0; + for ( i = 0; i < sprow; i++ ) { + if ( spsugar[i] >= 0 ) { + NEXTNODE(r0,r); + BDY(r) = vect_to_ndv_s(spmat[i],col,s0vect); + SG((NDV)BDY(r)) = spsugar[i]; + ((NDV)BDY(r))->sig = spsig[i]; + } else + syzlistp[spsig[i]->pos] = insert_sig(syzlistp[spsig[i]->pos],spsig[i]); + GCFREE(spmat[i]); + } + if ( r0 ) NEXT(r) = 0; + get_eg(&eg2); init_eg(&eg_f4_2); add_eg(&eg_f4_2,&eg1,&eg2); add_eg(&f4_elim2,&eg1,&eg2); + init_eg(&eg_f4); add_eg(&eg_f4,&eg0,&eg2); + if ( DP_Print ) { + fprintf(asir_out,"elim2=%.3fsec,",eg_f4_2.exectime); + fprintf(asir_out,"nsp=%d,nred=%d,spmat=(%d,%d),rank=%d ", + nsp,nred,sprow,col,rank); + fprintf(asir_out,"%.3fsec,",eg_f4.exectime); + } + return r0; +} + + /* for small finite fields */ NODE nd_f4_red_sf_main(int m,ND_pairs sp0,int nsp,UINT *s0vect,int col, @@ -8871,7 +9024,57 @@ int nd_gauss_elim_mod(UINT **mat0,int *sugar,ND_pairs return rank; } +int nd_gauss_elim_mod_s(UINT **mat,int *sugar,ND_pairs *spactive,int row,int col,int md,int *colstat,SIG *sig) +{ + int i,j,k,l,rank,s,imin; + UINT inv; + UINT a; + UINT *t,*pivot,*pk; + UINT *ck; + UINT *ct; + ND_pairs pair; + SIG sg; + int *used; + used = (int *)MALLOC(row*sizeof(int)); + for ( j = 0; j < col; j++ ) { + for ( i = 0; i < row; i++ ) + a = mat[i][j] %= md; + for ( i = 0; i < row; i++ ) + if ( !used[i] && mat[i][j] ) break; + if ( i == row ) { + colstat[j] = 0; + continue; + } else { + colstat[j] = 1; + used[i] = 1; + } + /* column j is normalized */ + s = sugar[i]; + inv = invm(mat[i][j],md); + /* normalize pivot row */ + for ( k = j, pk = mat[i]+j; k < col; k++, pk++, ck++ ) { + DMAR(*pk,inv,0,md,*pk); + } + for ( k = i+1; k < row; k++ ) { + if ( (a = mat[k][j]) != 0 ) { + sugar[k] = MAX(sugar[k],s); + red_by_vect(md,mat[k]+j,mat[i]+j,(int)(md-a),col-j); + Nf4_red++; + } + } + } + rank = 0; + for ( i = 0; i < row; i++ ) { + for ( j = 0; j < col; j++ ) + if ( mat[i][j] ) break; + if ( j == col ) sugar[i] = -1; + else rank++; + } + return rank; +} + + int nd_gauss_elim_sf(UINT **mat0,int *sugar,int row,int col,int md,int *colstat) { int i,j,k,l,inv,a,rank,s; @@ -9568,39 +9771,40 @@ NODE conv_ilist_s(int demand,int trace,int **indp) void parse_nd_option(NODE opt) { - NODE t,p,u; + NODE t,p,u; int i,s,n; - char *key; - Obj value; + char *key; + Obj value; - nd_gentrace = 0; nd_gensyz = 0; nd_nora = 0; nd_gbblock = 0; + nd_gentrace = 0; nd_gensyz = 0; nd_nora = 0; nd_gbblock = 0; nd_newelim = 0; nd_intersect = 0; nd_nzlist = 0; nd_splist = 0; nd_check_splist = 0; - nd_sugarweight = 0; - nd_f4red =0; - nd_rank0 = 0; - for ( t = opt; t; t = NEXT(t) ) { - p = BDY((LIST)BDY(t)); - key = BDY((STRING)BDY(p)); - value = (Obj)BDY(NEXT(p)); - if ( !strcmp(key,"gentrace") ) - nd_gentrace = value?1:0; - else if ( !strcmp(key,"gensyz") ) - nd_gensyz = value?1:0; - else if ( !strcmp(key,"nora") ) - nd_nora = value?1:0; - else if ( !strcmp(key,"gbblock") ) { - if ( value && OID(value) == O_LIST ) { + nd_sugarweight = 0; nd_f4red =0; nd_rank0 = 0; + nd_f4_td = 0; nd_sba_f4step = 2; nd_sba_pot = 0; nd_sba_largelcm = 0; + nd_sba_dontsort = 0; nd_top = 0; + + for ( t = opt; t; t = NEXT(t) ) { + p = BDY((LIST)BDY(t)); + key = BDY((STRING)BDY(p)); + value = (Obj)BDY(NEXT(p)); + if ( !strcmp(key,"gentrace") ) + nd_gentrace = value?1:0; + else if ( !strcmp(key,"gensyz") ) + nd_gensyz = value?1:0; + else if ( !strcmp(key,"nora") ) + nd_nora = value?1:0; + else if ( !strcmp(key,"gbblock") ) { + if ( value && OID(value) == O_LIST ) { u = BDY((LIST)value); - nd_gbblock = MALLOC((2*length(u)+1)*sizeof(int)); + nd_gbblock = MALLOC((2*length(u)+1)*sizeof(int)); for ( i = 0; u; u = NEXT(u) ) { p = BDY((LIST)BDY(u)); s = nd_gbblock[i++] = ZTOS((Q)BDY(p)); nd_gbblock[i++] = s+ZTOS((Q)BDY(NEXT(p)))-1; } nd_gbblock[i] = -1; - } else - nd_gbblock = 0; + } else + nd_gbblock = 0; } else if ( !strcmp(key,"newelim") ) nd_newelim = value?1:0; else if ( !strcmp(key,"intersect") ) @@ -9610,27 +9814,39 @@ void parse_nd_option(NODE opt) else if ( !strcmp(key,"lf") ) nd_lf = value?1:0; else if ( !strcmp(key,"trace") ) { - if ( value ) { - u = BDY((LIST)value); - nd_nzlist = BDY((LIST)ARG2(u)); - nd_bpe = ZTOS((Q)ARG3(u)); - } + if ( value ) { + u = BDY((LIST)value); + nd_nzlist = BDY((LIST)ARG2(u)); + nd_bpe = ZTOS((Q)ARG3(u)); + } } else if ( !strcmp(key,"f4red") ) { - nd_f4red = ZTOS((Q)value); + nd_f4red = ZTOS((Q)value); } else if ( !strcmp(key,"rank0") ) { - nd_rank0 = value?1:0; + nd_rank0 = value?1:0; } else if ( !strcmp(key,"splist") ) { - nd_splist = value?1:0; + nd_splist = value?1:0; } else if ( !strcmp(key,"check_splist") ) { nd_check_splist = BDY((LIST)value); } else if ( !strcmp(key,"sugarweight") ) { u = BDY((LIST)value); - n = length(u); - nd_sugarweight = MALLOC(n*sizeof(int)); + n = length(u); + nd_sugarweight = MALLOC(n*sizeof(int)); for ( i = 0; i < n; i++, u = NEXT(u) ) - nd_sugarweight[i] = ZTOS((Q)BDY(u)); + nd_sugarweight[i] = ZTOS((Q)BDY(u)); + } else if ( !strcmp(key,"f4_td") ) { + nd_f4_td = value?1:0; + } else if ( !strcmp(key,"sba_f4step") ) { + nd_sba_f4step = value?ZTOS((Q)value):0; + } else if ( !strcmp(key,"sba_pot") ) { + nd_sba_pot = value?1:0; + } else if ( !strcmp(key,"sba_largelcm") ) { + nd_sba_largelcm = value?1:0; + } else if ( !strcmp(key,"sba_dontsort") ) { + nd_sba_dontsort = value?1:0; + } else if ( !strcmp(key,"top") ) { + nd_top = value?1:0; } - } + } } ND mdptond(DP d); @@ -10595,7 +10811,6 @@ int nd_gauss_elim_mod64(mp_limb_t **mat,int *sugar,ND_ GCFREE(cmat); return rank; } -#endif int nd_gauss_elim_mod64_s(mp_limb_t **mat,int *sugar,ND_pairs *spactive,int row,int col,int md,int *colstat,SIG *sig) { @@ -10737,6 +10952,7 @@ NODE nd_f4_red_mod64_main_s(int m,ND_pairs sp0,int nsp } return r0; } +#endif NODE nd_f4_red_s(int m,ND_pairs sp0,int trace,UINT *s0vect,int col,NODE rp0,NODE *syzlistp) { @@ -10775,7 +10991,11 @@ NODE nd_f4_red_s(int m,ND_pairs sp0,int trace,UINT *s0 fflush(asir_out); } if ( m > 0 ) +#if SIZEOF_LONG==8 r0 = nd_f4_red_mod64_main_s(m,sp0,nsp,s0vect,col,rvect,rhead,imat,nred,syzlistp); +#else + r0 = nd_f4_red_main_s(m,sp0,nsp,s0vect,col,rvect,rhead,imat,nred,syzlistp); +#endif else // r0 = nd_f4_red_q_main_s(sp0,nsp,trace,s0vect,col,rvect,rhead,imat,nred); error("nd_f4_red_q_main_s : not implemented yet"); @@ -10910,7 +11130,7 @@ NODE nd_sba_f4(int m,int **indp) while ( d ) { for ( t = d, ms = SG(d); t; t = NEXT(t) ) if ( SG(t) < ms ) ms = SG(t); - if ( ms == psugar && f4step >= 2 ) { + if ( ms == psugar && f4step >= nd_sba_f4step ) { again: l = d; d = d->next; if ( small_lcm(l) ) { @@ -10926,9 +11146,9 @@ again: } get_eg(&eg1); #if USE_GEOBUCKET - stat = m?nd_nf_pbucket_s(m,h,nd_ps,!Top,&nf):nd_nf_s(m,0,h,nd_ps,!Top,&nf); + stat = m?nd_nf_pbucket_s(m,h,nd_ps,!nd_top&&!Top,&nf):nd_nf_s(m,0,h,nd_ps,!nd_top&&!Top,&nf); #else - stat = nd_nf_s(m,0,h,nd_ps,!Top,&nf); + stat = nd_nf_s(m,0,h,nd_ps,!nd_top&&!Top,&nf); #endif get_eg(&eg2); if ( !stat ) { @@ -10977,8 +11197,9 @@ again2: if ( bucket->m < 0 ) continue; col = nd_symbolic_preproc_s(bucket,0,&s0vect,&rp0); if ( !col ) { - for ( t = l; NEXT(t); t = NEXT(t) ); - NEXT(t) = d; d = l; + for ( t = l; NEXT(t); t = NEXT(t) ) + ; + NEXT(t) = d; d = l; d = nd_reconstruct(0,d); goto again2; } @@ -10987,6 +11208,7 @@ again2: /* adding new bases */ for ( r = nflist; r; r = NEXT(r) ) { nfv = (NDV)BDY(r); + if ( nd_f4_td ) SG(nfv) = nd_tdeg(nfv); ndv_removecont(m,nfv); nh = ndv_newps(m,nfv,0); d = update_pairs_s(d,nh,syzlist);