=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2018/engine/nd.c,v retrieving revision 1.53 retrieving revision 1.57 diff -u -p -r1.53 -r1.57 --- OpenXM_contrib2/asir2018/engine/nd.c 2021/03/12 01:18:33 1.53 +++ OpenXM_contrib2/asir2018/engine/nd.c 2021/12/07 08:48:34 1.57 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM_contrib2/asir2018/engine/nd.c,v 1.52 2021/03/09 08:48:50 noro Exp $ */ +/* $OpenXM: OpenXM_contrib2/asir2018/engine/nd.c,v 1.56 2021/12/05 22:41:04 noro Exp $ */ #include "nd.h" @@ -1301,6 +1301,7 @@ INLINE int ndl_find_reducer_s(UINT *dg,SIG sig) _ndltodl(tmp,DL(quo)); _addtodl(nd_nvar,DL(nd_psh[i]->sig),DL(quo)); quo->pos = nd_psh[i]->sig->pos; + _adddl(nd_nvar,DL(quo),nd_sba_hm[quo->pos],DL2(quo)); ret = comp_sig(sig,quo); if ( ret > 0 ) { singular = 0; break; } if ( ret == 0 ) { /* fprintf(asir_out,"s"); fflush(asir_out); */ singular = 1; } @@ -1709,6 +1710,14 @@ int nd_nf_s(int mod,ND d,ND g,NDV *ps,int full,ND *rp) nd_removecont2(d,g); hmag = ((double)p_mag(HCP(g)))*nd_scale; } + if ( nd_gentrace ) { + /* Trace=[div,index,mul,ONE] */ + STOZ(index,iq); + nmtodp(mod,mul,&dmul); + node = mknode(4,div,iq,dmul,ONE); + } + MKLIST(hist,node); + MKNODE(node,hist,nd_tracelist); nd_tracelist = node; } else if ( index == -1 ) { // singular top reducible return -1; @@ -2470,80 +2479,78 @@ LIST compute_splist() } typedef struct oHPDATA { - P hn; // HP(t)=hn(t)/(1-t)^n - int len; - P *head; // hp(i)=head[i] (i=0,...,len-1) - P hp; // dim Hm(i)=hp(i) (i >= len) + int n; + P hn; // HP(t)=hn(t)/((1-t^w0)*...*(1-t^w(n-1))) VECT x; // BDY(x)[i] = <<0,...,1,...,0>> - P *plist; // plist[i]=(1-t)^i + int *w; } *HPDATA; void make_reduced(VECT b,int nv); void mhp_rec(VECT b,VECT x,P t,P *r); P mhp_ctop(P *r,P *plist,int n); -void mhp_to_hf(VL vl,P hp,int n,P *plist,VECT *head,P *hf); DL monomial_colon(DL a,DL b,int n); -LIST dp_monomial_hilbert_poincare(VECT b,VECT x,P *plist); +LIST dp_monomial_hilbert_poincare(VECT b,VECT x); +LIST dp_monomial_hilbert_poincare_weight(VECT b,VECT x,int *w); -int hpvalue(HPDATA data,int d) -{ - P *head; - int len; - P hp,val; - Z dz; - - head = data->head; - len = data->len; - hp = data->hp; - if ( d < len ) - return ZTOS((Z)head[d]); - else { - STOZ(d,dz); - substp(CO,hp,hp->v,(P)dz,&val); - return ZTOS((Z)val); - } -} - void setup_hpdata(HPDATA final,HPDATA current) { - int n,i; - P *r; + int n,i,wlen; DL *p; - P tv; - VECT b,x,head; + VECT b,x; DL dl; + LIST weight; + LIST ret; + int *w; + NODE nd; - n = nd_nvar; - final->hn = (P)ARG0(nd_hpdata); - head = (VECT)ARG2(nd_hpdata); - final->len = head->len; - final->head = (P *)BDY(head); - final->hp = (P)ARG3(nd_hpdata); - final->plist = (P *)BDY((VECT)ARG4(nd_hpdata)); + final->n = n = nd_nvar; + final->hn = (P)BDY(nd_hpdata); + if ( NEXT(nd_hpdata) != 0 && (weight=(LIST)BDY(NEXT(nd_hpdata))) != 0 ) { + wlen = length(BDY(weight)); + if ( n != wlen ) + error("setup_hpdata : inconsistent weight length"); + w = (int *)MALLOC(n*sizeof(int)); + for ( i = 0, nd = BDY((LIST)weight); i < n; i++, nd = NEXT(nd) ) + w[i] = ZTOS((Z)BDY(nd)); + } else + w = 0; MKVECT(x,n); for ( i = 0; i < n; i++ ) { NEWDL(dl,n); dl->d[i] = 1; dl->td = 1; BDY(x)[i] = dl; } final->x = x; + final->w = w; - r = (P *)CALLOC(n+1,sizeof(P)); MKVECT(b,nd_psn); p = (DL *)BDY(b); for ( i = 0; i < nd_psn; i++ ) { p[i] = ndltodl(n,nd_psh[i]->dl); } - make_reduced(b,n); - makevar("t",&tv); - mhp_rec(b,x,tv,r); - current->hn = mhp_ctop(r,final->plist,n); - mhp_to_hf(CO,current->hn,n,final->plist,&head,¤t->hp); - current->head = (P *)BDY(head); - current->len = head->len; + if ( w ) { + ret = dp_monomial_hilbert_poincare_weight(b,x,w); + } else + ret = dp_monomial_hilbert_poincare(b,x); + current->n = n; + current->hn = (P)BDY(BDY(ret)); current->x = x; - current->plist = final->plist; + current->w = w; } -void update_hpdata(HPDATA current,int nh,int do_hf) +int comp_hn(P a, P b) { + P s; + DCP dc; + + subp(CO,a,b,&s); + if ( !s ) return -1; + else if ( OID(s) == 1 ) return 0; + else { + for ( dc = DC(s); NEXT(dc); dc = NEXT(dc) ); + return (int)ZTOS((Z)dc->d); + } +} + +void update_hpdata(HPDATA current,int nh) +{ NODE data1,nd,t; DL new,dl; int len,i,n; @@ -2560,7 +2567,10 @@ void update_hpdata(HPDATA current,int nh,int do_hf) p[i] = monomial_colon(ndltodl(n,nd_psh[i]->dl),new,n); } // compute HP(I:new) - list1 = dp_monomial_hilbert_poincare(b,current->x,current->plist); + if ( current->w ) + list1 = dp_monomial_hilbert_poincare_weight(b,current->x,current->w); + else + list1 = dp_monomial_hilbert_poincare(b,current->x); data1 = BDY((LIST)list1); // HP(I+) = H(I)-t^d*H(I:new), d=tdeg(new) makevar("t",&tv); UTOZ(new->td,dz); @@ -2568,12 +2578,6 @@ void update_hpdata(HPDATA current,int nh,int do_hf) mulp(CO,(P)ARG0(data1),td,&s); subp(CO,current->hn,s,&hn); current->hn = hn; - if ( do_hf ) { - mhp_to_hf(CO,hn,n,current->plist,&head,&hpoly); - current->head = (P *)BDY(head); - current->len = head->len; - current->hp = hpoly; - } } ND_pairs nd_remove_same_sugar( ND_pairs d, int sugar) @@ -2642,18 +2646,6 @@ again: } sugar = SG(l); if ( DP_Print ) fprintf(asir_out,"%d",sugar); - if ( nd_hpdata ) { - if ( !compp(CO,final_hpdata.hn,current_hpdata.hn) ) - break; - else { - final_hpvalue = hpvalue(&final_hpdata,sugar); - if ( final_hpvalue == hpvalue(¤t_hpdata,sugar) ) { -// if ( DP_Print ) fprintf(asir_out,"done.\n",sugar); - d = nd_remove_same_sugar(d,sugar); - continue; - } - } - } } stat = nd_sp(m,0,l,&h); if ( !stat ) { @@ -2712,10 +2704,23 @@ get_eg(&eg2); add_eg(&eg_update,&eg1,&eg2); g = update_base(g,nh); FREENDP(l); if ( nd_hpdata ) { - update_hpdata(¤t_hpdata,nh,1); - if ( final_hpvalue == hpvalue(¤t_hpdata,sugar) ) { -// if ( DP_Print ) fprintf(asir_out,"sugar=%d done.\n",sugar); + int dg,sugar0; + + update_hpdata(¤t_hpdata,nh); + dg = comp_hn(final_hpdata.hn,current_hpdata.hn); + if ( dg < 0 ) { + fprintf(asir_out,"We found a gb\n"); + d = 0; + } + if ( dg > sugar ) { + // printexpr(CO,(Obj)current_hpdata.hn); + fprintf(asir_out,"\n"); + } + sugar0 = sugar; + while ( d && dg > sugar0 ) { + if ( DP_Print ) fprintf(asir_out,"sugar=%d done.\n",sugar); d = nd_remove_same_sugar(d,sugar); + sugar0++; } } } else { @@ -2727,14 +2732,14 @@ get_eg(&eg2); add_eg(&eg_update,&eg1,&eg2); MKNODE(t,list,nd_alltracelist); nd_alltracelist = t; nd_tracelist = 0; } - if ( DP_Print ) { printf("."); fflush(stdout); } + if ( DP_Print ) { fprintf(asir_out,"."); fflush(asir_out); } FREENDP(l); } } conv_ilist(nd_demand,0,g,indp); if ( !checkonly && DP_Print ) { - printf("\nnd_gb done. Nnd_add=%d,Npairs=%d, Nnfnz=%d,Nnfz=%d,",Nnd_add,Npairs,Nnfnz,Nnfz); - printf("Nremoved=%d\n",NcriB+NcriMF+Ncri2); + fprintf(asir_out,"\nnd_gb done. Nnd_add=%d,Npairs=%d, Nnfnz=%d,Nnfz=%d,",Nnd_add,Npairs,Nnfnz,Nnfz); + fprintf(asir_out,"Nremoved=%d\n",NcriB+NcriMF+Ncri2); fflush(asir_out); } if ( DP_Print ) { @@ -2886,12 +2891,12 @@ ND_pairs find_smallest_lcm(ND_pairs l) NODE t; ND_pairs r; struct oSIG sig1; - static DL mul,quo,minlm; + static DL mul,quo,quo2,minlm; static int nvar = 0; if ( nvar < nd_nvar ) { nvar = nd_nvar; - NEWDL(quo,nvar); NEWDL(mul,nvar); + NEWDL(quo,nvar); NEWDL(quo2,nvar); NEWDL(mul,nvar); NEWDL(minlm,nvar); } sig = l->sig; @@ -2919,6 +2924,8 @@ ND_pairs find_smallest_lcm(ND_pairs l) _addtodl(nd_nvar,nd_ps[i]->sig->dl,quo); sig1.pos = nd_ps[i]->sig->pos; sig1.dl = quo; + sig1.dl2 = quo2; + _adddl(nd_nvar,sig1.dl,nd_sba_hm[sig1.pos],sig1.dl2); if ( comp_sig(sig,&sig1) > 0 ) { // printf("X"); NEWND_pairs(r); @@ -2977,16 +2984,21 @@ SIG trivial_sig(int i,int j) if ( nvar != nd_nvar ) { nvar = nd_nvar; NEWDL(lcm,nvar); NEWDL(sigi.dl,nvar); NEWDL(sigj.dl,nvar); + NEWDL(sigi.dl2,nvar); NEWDL(sigj.dl2,nvar); } if ( nd_sba_inputisgb != 0 ) { lcm_of_DL(nd_nvar,nd_sba_hm[i],nd_sba_hm[j],lcm); sigi.pos = i; _subdl(nd_nvar,lcm,nd_sba_hm[i],sigi.dl); + _copydl(nd_nvar,lcm,sigi.dl2); sigj.pos = j; _subdl(nd_nvar,lcm,nd_sba_hm[j],sigj.dl); + _copydl(nd_nvar,lcm,sigj.dl2); if ( comp_sig(&sigi,&sigj) > 0 ) sig = dup_sig(&sigi); else sig = dup_sig(&sigj); } else { sigi.pos = i; _copydl(nd_nvar,nd_sba_hm[j],sigi.dl); + _adddl(nd_nvar,sigi.dl,nd_sba_hm[i],sigi.dl2); sigj.pos = j; _copydl(nd_nvar,nd_sba_hm[i],sigj.dl); + _adddl(nd_nvar,sigj.dl,nd_sba_hm[j],sigj.dl2); if ( comp_sig(&sigi,&sigj) > 0 ) sig = dup_sig(&sigi); else sig = dup_sig(&sigj); } @@ -3048,7 +3060,7 @@ init_eg(&eg_remove); Nnominimal = 0; Nredundant = 0; ngen = nd_psn; - if ( !do_weyl ) { + if ( !do_weyl || nd_sba_inputisgb ) { for ( i = 0; i < nd_psn; i++ ) for ( j = i+1; j < nd_psn; j++ ) { sig = trivial_sig(i,j); @@ -3116,7 +3128,7 @@ get_eg(&eg2); add_eg(&eg_sp,&eg1,&eg2); } get_eg(&eg1); #if USE_GEOBUCKET - 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); + stat = (m&&!nd_gentrace)?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,!nd_top&&!Top,&nf); #endif @@ -3144,24 +3156,24 @@ get_eg(&eg2); } add_eg(&eg_nf,&eg1,&eg2); hc = HCU(nf); - get_eg(&eg1); - nd_removecont(m,nf); - get_eg(&eg2); add_eg(&eg_removecont,&eg1,&eg2); - nfv = ndtondv(m,nf); nd_free(nf); - nh = ndv_newps(m,nfv,0); - - get_eg(&eg1); - dlen += update_pairs_array_s(d,nh,syzlist); - get_eg(&eg2); add_eg(&eg_updatepairs,&eg1,&eg2); - nd_sba_pos[sig->pos] = append_one(nd_sba_pos[sig->pos],nh); - if ( nd_hpdata ) { - get_eg(&eg1); - update_hpdata(¤t_hpdata,nh,0); - get_eg(&eg2); add_eg(&eg_hpdata,&eg1,&eg2); - if ( !compp(CO,final_hpdata.hn,current_hpdata.hn) ) { - if ( DP_Print ) { printf("\nWe found a gb.\n"); } - break; - } + get_eg(&eg1); + nd_removecont(m,nf); + get_eg(&eg2); add_eg(&eg_removecont,&eg1,&eg2); + nfv = ndtondv(m,nf); nd_free(nf); + nh = ndv_newps(m,nfv,0); + + get_eg(&eg1); + dlen += update_pairs_array_s(d,nh,syzlist); + get_eg(&eg2); add_eg(&eg_updatepairs,&eg1,&eg2); + nd_sba_pos[sig->pos] = append_one(nd_sba_pos[sig->pos],nh); + if ( nd_hpdata ) { + get_eg(&eg1); + update_hpdata(¤t_hpdata,nh); + get_eg(&eg2); add_eg(&eg_hpdata,&eg1,&eg2); + if ( !compp(CO,final_hpdata.hn,current_hpdata.hn) ) { + if ( DP_Print ) { printf("\nWe found a gb.\n"); } + break; + } } } else { d[ind] = d[ind]->next; dlen--; @@ -3425,18 +3437,6 @@ again: #endif sugar = SG(l); if ( DP_Print ) fprintf(asir_out,"%d",sugar); - if ( nd_hpdata ) { - if ( !compp(CO,final_hpdata.hn,current_hpdata.hn) ) - break; - else { - final_hpvalue = hpvalue(&final_hpdata,sugar); - if ( final_hpvalue == hpvalue(¤t_hpdata,sugar) ) { -// if ( DP_Print ) fprintf(asir_out,"sugar=%d done.\n",sugar); - d = nd_remove_same_sugar(d,sugar); - continue; - } - } - } } stat = nd_sp(m,0,l,&h); if ( !stat ) { @@ -3511,17 +3511,30 @@ again: d = update_pairs(d,g,nh,0); g = update_base(g,nh); if ( nd_hpdata ) { - update_hpdata(¤t_hpdata,nh,1); - if ( final_hpvalue == hpvalue(¤t_hpdata,sugar) ) { -// if ( DP_Print ) fprintf(asir_out,"sugar=%d done.\n",sugar); + int dg,sugar0; + + update_hpdata(¤t_hpdata,nh); + dg = comp_hn(final_hpdata.hn,current_hpdata.hn); + if ( dg < 0 ) { + fprintf(asir_out,"We found a gb\n"); + d = 0; + } + if ( dg > sugar ) { + // printexpr(CO,(Obj)current_hpdata.hn); + fprintf(asir_out,"\n"); + } + sugar0 = sugar; + while ( d && dg > sugar0 ) { + if ( DP_Print ) fprintf(asir_out,"sugar=%d done.\n",sugar); d = nd_remove_same_sugar(d,sugar); + sugar0++; } } } else { - if ( DP_Print ) { printf("*"); fflush(stdout); } + if ( DP_Print ) { fprintf(asir_out,"*"); fflush(asir_out); } } } else { - if ( DP_Print ) { printf("."); fflush(stdout); } + if ( DP_Print ) { fprintf(asir_out,"."); fflush(asir_out); } } FREENDP(l); } @@ -3533,7 +3546,7 @@ again: } } conv_ilist(nd_demand,1,g,indp); - if ( DP_Print ) { printf("\nnd_gb_trace done.\n"); fflush(stdout); } + if ( DP_Print ) { fprintf(asir_out,"\nnd_gb_trace done.\n"); fflush(asir_out); } return g; } @@ -3919,7 +3932,9 @@ int comp_sig_monomial(int n,DL d1,DL d2) } if ( !nd_sba_modord ) return (*cmpdl)(n,d1,d2); - else { + else if ( !nd_sba_modord->weight && !nd_sba_modord->oldv ) { + return (*nd_sba_modord->cmpdl)(n,d1,d2); + } else { weight = nd_sba_modord->weight; oldv = nd_sba_modord->oldv; if ( oldv ) { @@ -3945,7 +3960,7 @@ int comp_sig(SIG s1,SIG s2) if ( nd_sba_pot ) { if ( s1->pos > s2->pos ) return 1; else if ( s1->pos < s2->pos ) return -1; - else return comp_sig_monomial(nd_nvar,s1->dl,s2->dl); + else return comp_sig_monomial(nd_nvar,DL(s1),DL(s2)); } else { static DL m1,m2; static int nvar = 0; @@ -3954,12 +3969,10 @@ int comp_sig(SIG s1,SIG s2) 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); if ( !nd_sba_modord ) - ret = (*cmpdl)(nd_nvar,m1,m2); + ret = (*cmpdl)(nd_nvar,DL2(s1),DL2(s2)); else - ret = comp_sig_monomial(nd_nvar,m1,m2); + ret = comp_sig_monomial(nd_nvar,DL2(s1),DL2(s2)); if ( ret != 0 ) return ret; else if ( s1->pos > s2->pos ) return 1; else if ( s1->pos < s2->pos ) return -1; @@ -3996,6 +4009,7 @@ int _create_spair_s(int i1,int i2,ND_pairs sp,SIG sig1 _ndltodl(lcm,DL(sig1)); _addtodl(nd_nvar,DL(p1->sig),DL(sig1)); sig1->pos = p1->sig->pos; + _adddl(nd_nvar,DL(sig1),nd_sba_hm[sig1->pos],DL2(sig1)); // DL(sig2) <- sp->lcm // DL(sig2) -= DL(p2) @@ -4004,6 +4018,7 @@ int _create_spair_s(int i1,int i2,ND_pairs sp,SIG sig1 _ndltodl(lcm,DL(sig2)); _addtodl(nd_nvar,DL(p2->sig),DL(sig2)); sig2->pos = p2->sig->pos; + _adddl(nd_nvar,DL(sig2),nd_sba_hm[sig2->pos],DL2(sig2)); ret = comp_sig(sig1,sig2); if ( ret == 0 ) return 0; @@ -4025,6 +4040,7 @@ SIG dup_sig(SIG sig) else { NEWSIG(r); _copydl(nd_nvar,DL(sig),DL(r)); + _copydl(nd_nvar,DL2(sig),DL2(r)); r->pos = sig->pos; return r; } @@ -4708,6 +4724,7 @@ int ndv_setup(int mod,int trace,NODE f,int dont_sort,i ndv_lm_modord(nd_ps[i],nd_sba_hm[i]); else _ndltodl(DL(nd_psh[i]),nd_sba_hm[i]); + _adddl(nd_nvar,DL(sig),nd_sba_hm[i],DL2(sig)); } nd_sba_pos = (NODE *)MALLOC(nd_psn*sizeof(NODE)); for ( i = 0; i < nd_psn; i++ ) { @@ -5073,7 +5090,7 @@ NODE nd_sba_f4(int m,int **indp); void nd_sba(LIST f,LIST v,int m,int homo,int retdp,int f4,struct order_spec *ord,LIST *rp) { VL tv,fv,vv,vc,av; - NODE fd,fd0,r,r0,t,x,s,xx,nd,syz; + NODE fd,fd0,r,r0,t,x,s,xx,nd,nd1,syz; int e,max,nvar,i; NDV b; int ishomo,nalg,wmax,len; @@ -5086,6 +5103,8 @@ void nd_sba(LIST f,LIST v,int m,int homo,int retdp,int EPOS oepos; int obpe,oadv,ompos,cbpe; struct oEGT eg0,eg1,egconv,egintred; + LIST l1,redind; + Z z; nd_module = 0; nd_demand = 0; @@ -5158,6 +5177,9 @@ void nd_sba(LIST f,LIST v,int m,int homo,int retdp,int } ndv_setup(m,0,fd0,nd_sba_dontsort,0,1); + if ( nd_gentrace ) { + MKLIST(l1,nd_tracelist); MKNODE(nd_alltracelist,l1,0); + } x = f4 ? nd_sba_f4(m,&perm) : nd_sba_buch(m,ishomo || homo,&perm,&syz); if ( !x ) { *rp = 0; return; @@ -5173,6 +5195,10 @@ void nd_sba(LIST f,LIST v,int m,int homo,int retdp,int nd_demand = 0; get_eg(&eg0); x = ndv_reducebase(x,perm); + for ( nd = 0, i = length(x)-1; i >= 0; i-- ) { + STOZ(perm[i],z); MKNODE(nd1,z,nd); nd = nd1; + } + MKLIST(redind,nd); x = ndv_reduceall(m,x); get_eg(&eg1); init_eg(&egintred); add_eg(&egintred,&eg0,&eg1); nd_setup_parameters(nd_nvar,0); @@ -5185,12 +5211,18 @@ void nd_sba(LIST f,LIST v,int m,int homo,int retdp,int if ( r0 ) NEXT(r) = 0; if ( nd_sba_syz ) { LIST gb,hsyz; - NODE nd; MKLIST(gb,r0); MKLIST(hsyz,syz); nd = mknode(2,gb,hsyz); MKLIST(*rp,nd); + } else if ( nd_gentrace ) { + LIST gb,trace; + + MKLIST(trace,nd_alltracelist); + MKLIST(gb,r0); + nd = mknode(3,gb,redind,trace); + MKLIST(*rp,nd); } else MKLIST(*rp,r0); get_eg(&eg1); init_eg(&egconv); add_eg(&egconv,&eg0,&eg1); @@ -5629,7 +5661,7 @@ void nd_gr_trace(LIST f,LIST v,int trace,int homo,int tl3 = nd_alltracelist; nd_alltracelist = 0; } else tl3 = 0; /* gbcheck : cand is a GB of Id(cand) ? */ - if ( nd_vc || nd_gentrace || nd_gensyz ) + if ( nd_vc || nd_gentrace || nd_gensyz || do_weyl ) ret = nd_gb(0,0,1,nd_gensyz?1:0,0)!=0; else ret = nd_f4(0,1,0)!=0; @@ -11912,6 +11944,7 @@ INLINE int ndl_find_reducer_minsig(UINT *dg) _ndltodl(tmp,DL(quo)); _addtodl(nd_nvar,DL(nd_psh[i]->sig),DL(quo)); quo->pos = nd_psh[i]->sig->pos; + _adddl(nd_nvar,DL(quo),nd_sba_hm[quo->pos],DL2(quo)); if ( imin < 0 || comp_sig(quomin,quo) > 0 ) { t = quo; quo = quomin; quomin = t; imin = i; @@ -11962,6 +11995,7 @@ int nd_symbolic_preproc_s(PGeoBucket bucket,int trace, _ndltodl(DL(mul),DL(sig)); _addtodl(nd_nvar,DL(nd_psh[index]->sig),DL(sig)); sig->pos = nd_psh[index]->sig->pos; + _adddl(nd_nvar,DL(sig),nd_sba_hm[sig->pos],DL2(sig)); MKNM_ind_pair(pair,mul,index,sugar,sig); red = ndv_mul_nm_symbolic(mul,ps[index]); add_pbucket_symbolic(bucket,nd_remove_head(red));