=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/nd.c,v retrieving revision 1.32 retrieving revision 1.42 diff -u -p -r1.32 -r1.42 --- OpenXM_contrib2/asir2000/engine/nd.c 2003/08/19 04:38:09 1.32 +++ OpenXM_contrib2/asir2000/engine/nd.c 2003/08/21 08:20:06 1.42 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.31 2003/08/13 03:13:22 noro Exp $ */ +/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.41 2003/08/21 07:39:25 noro Exp $ */ #include "ca.h" #include "inline.h" @@ -15,11 +15,14 @@ #define REDTAB_LEN 32003 +/* GeoBucket for polynomial addition */ + typedef struct oPGeoBucket { int m; struct oND *body[32]; } *PGeoBucket; +/* distributed polynomial; linked list rep. */ typedef struct oND { struct oNM *body; int nv; @@ -27,6 +30,7 @@ typedef struct oND { int sugar; } *ND; +/* distributed polynomial; array rep. */ typedef struct oNDV { struct oNMV *body; int nv; @@ -34,113 +38,142 @@ typedef struct oNDV { int sugar; } *NDV; +/* monomial; linked list rep. */ typedef struct oNM { struct oNM *next; union { int m; Q z; } c; - int td; unsigned int dl[1]; } *NM; +/* monomial; array rep. */ typedef struct oNMV { union { int m; Q z; } c; - int td; unsigned int dl[1]; } *NMV; +/* history of reducer */ typedef struct oRHist { struct oRHist *next; int index; - int td,sugar; + int sugar; unsigned int dl[1]; } *RHist; +/* S-pair list */ typedef struct oND_pairs { struct oND_pairs *next; int i1,i2; - int td,sugar; + int sugar; unsigned int lcm[1]; } *ND_pairs; -int (*nm_compare_generic)(NM a,NM b); -int (*nmv_compare_generic)(NMV a,NMV b); +/* index and shift count for each exponent */ +typedef struct oEPOS { + int i; /* index */ + int s; /* shift */ +} *EPOS; -double nd_scale=2; +int (*nd_compare_function)(unsigned int *a1,unsigned int *a2); + +static double nd_scale=2; static unsigned int **nd_bound; -int nd_nvar; -int nd_isrlex; -int nd_epw,nd_bpe,nd_wpd; -unsigned int nd_mask[32]; -unsigned int nd_mask0,nd_mask1; +static struct order_spec *nd_ord; +static EPOS nd_epos; +static int nd_nvar; +static int nd_isrlex; +static int nd_epw,nd_bpe,nd_wpd,nd_exporigin; +static unsigned int nd_mask[32]; +static unsigned int nd_mask0,nd_mask1; -NM _nm_free_list; -ND _nd_free_list; -ND_pairs _ndp_free_list; +static NM _nm_free_list; +static ND _nd_free_list; +static ND_pairs _ndp_free_list; static NDV *nd_ps; static NDV *nd_psq; -int *nd_psl; -RHist *nd_psh; -int nd_psn,nd_pslen; +static RHist *nd_psh; +static int nd_psn,nd_pslen; -RHist *nd_red; -int nd_red_len; +static RHist *nd_red; -int nd_found,nd_create,nd_notfirst; -int nm_adv; -int nmv_adv; -int nd_degcompat; +static int nd_found,nd_create,nd_notfirst; +static int nm_adv; +static int nmv_adv; +static int nd_dcomp; -extern int Top,Reverse; +extern int Top,Reverse,dp_nelim; -#define HTD(d) ((d)->body->td) +/* fundamental macros */ +#define TD(d) (d[0]) #define HDL(d) ((d)->body->dl) +#define HTD(d) (TD(HDL(d))) #define HCM(d) ((d)->body->c.m) #define HCQ(d) ((d)->body->c.z) #define CM(a) ((a)->c.m) #define CQ(a) ((a)->c.z) #define DL(a) ((a)->dl) -#define TD(a) ((a)->td) #define SG(a) ((a)->sugar) #define LEN(a) ((a)->len) +#define LCM(a) ((a)->lcm) +#define GET_EXP(d,a) (((d)[nd_epos[a].i]>>nd_epos[a].s)&nd_mask0) +#define PUT_EXP(r,a,e) ((r)[nd_epos[a].i] |= ((e)<TD(m2)?1\ - :(TD(m1)TD(d2)?1:(TD(d1)>((nd_epw-1)*nd_bpe))&nd_mask0; - for ( i = 0; i < nd_wpd; i++ ) + h = (d[nd_exporigin]>>((nd_epw-1)*nd_bpe))&nd_mask0; + for ( i = nd_exporigin; i < nd_wpd; i++ ) d[i] = ((d[i]<>((nd_epw-1)*nd_bpe))&nd_mask0):0); - return h; + TD(d) -= h; } - } else { - /* do nothing */ - return d[nd_wpd-1]; - } + } else + TD(d) -= ((d[(nd_nvar-1)/nd_epw+nd_exporigin]>> + ((nd_epw-((nd_nvar-1)%nd_epw)-1)*nd_bpe))&((1<t2?t1:t2; t1 = (u1&0xf000000); t2 = (u2&0xf000000); u |= t1>t2?t1:t2; @@ -398,7 +453,7 @@ void ndl_lcm(unsigned int *d1,unsigned *d2,unsigned in } break; case 6: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = nd_exporigin; i < nd_wpd; i++ ) { u1 = d1[i]; u2 = d2[i]; t1 = (u1&0x3f000000); t2 = (u2&0x3f000000); u = t1>t2?t1:t2; t1 = (u1&0xfc0000); t2 = (u2&0xfc0000); u |= t1>t2?t1:t2; @@ -409,7 +464,7 @@ void ndl_lcm(unsigned int *d1,unsigned *d2,unsigned in } break; case 8: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = nd_exporigin; i < nd_wpd; i++ ) { u1 = d1[i]; u2 = d2[i]; t1 = (u1&0xff000000); t2 = (u2&0xff000000); u = t1>t2?t1:t2; t1 = (u1&0xff0000); t2 = (u2&0xff0000); u |= t1>t2?t1:t2; @@ -419,7 +474,7 @@ void ndl_lcm(unsigned int *d1,unsigned *d2,unsigned in } break; case 16: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = nd_exporigin; i < nd_wpd; i++ ) { u1 = d1[i]; u2 = d2[i]; t1 = (u1&0xffff0000); t2 = (u2&0xffff0000); u = t1>t2?t1:t2; t1 = (u1&0xffff); t2 = (u2&0xffff); u |= t1>t2?t1:t2; @@ -427,13 +482,13 @@ void ndl_lcm(unsigned int *d1,unsigned *d2,unsigned in } break; case 32: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = nd_exporigin; i < nd_wpd; i++ ) { u1 = d1[i]; u2 = d2[i]; d[i] = u1>u2?u1:u2; } break; default: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = nd_exporigin; i < nd_wpd; i++ ) { u1 = d1[i]; u2 = d2[i]; for ( j = 0, u = 0; j < nd_epw; j++ ) { t1 = (u1&nd_mask[j]); t2 = (u2&nd_mask[j]); u |= t1>t2?t1:t2; @@ -442,14 +497,15 @@ void ndl_lcm(unsigned int *d1,unsigned *d2,unsigned in } break; } + TD(d) = ndl_weight(d); } -int ndl_td(unsigned int *d) +int ndl_weight(unsigned int *d) { unsigned int t,u; int i,j; - for ( t = 0, i = 0; i < nd_wpd; i++ ) { + for ( t = 0, i = nd_exporigin; i < nd_wpd; i++ ) { u = d[i]; for ( j = 0; j < nd_epw; j++, u>>=nd_bpe ) t += (u&nd_mask0); @@ -457,11 +513,13 @@ int ndl_td(unsigned int *d) return t; } -INLINE int ndl_compare(unsigned int *d1,unsigned int *d2) +INLINE int ndl_lex_compare(unsigned int *d1,unsigned int *d2) { int i; - for ( i = 0; i < nd_wpd; i++, d1++, d2++ ) + d1 += nd_exporigin; + d2 += nd_exporigin; + for ( i = nd_exporigin; i < nd_wpd; i++, d1++, d2++ ) if ( *d1 > *d2 ) return nd_isrlex ? -1 : 1; else if ( *d1 < *d2 ) @@ -474,7 +532,7 @@ INLINE int ndl_equal(unsigned int *d1,unsigned int *d2 int i; for ( i = 0; i < nd_wpd; i++ ) - if ( d1[i] != d2[i] ) + if ( *d1++ != *d2++ ) return 0; return 1; } @@ -484,13 +542,15 @@ INLINE void ndl_copy(unsigned int *d1,unsigned int *d2 int i; switch ( nd_wpd ) { - case 1: - d2[0] = d1[0]; - break; case 2: - d2[0] = d1[0]; + TD(d2) = TD(d1); d2[1] = d1[1]; break; + case 3: + TD(d2) = TD(d1); + d2[1] = d1[1]; + d2[2] = d1[2]; + break; default: for ( i = 0; i < nd_wpd; i++ ) d2[i] = d1[i]; @@ -503,13 +563,15 @@ INLINE void ndl_add(unsigned int *d1,unsigned int *d2, int i; switch ( nd_wpd ) { - case 1: - d[0] = d1[0]+d2[0]; - break; case 2: - d[0] = d1[0]+d2[0]; + TD(d) = TD(d1)+TD(d2); d[1] = d1[1]+d2[1]; break; + case 3: + TD(d) = TD(d1)+TD(d2); + d[1] = d1[1]+d2[1]; + d[2] = d1[2]+d2[2]; + break; default: for ( i = 0; i < nd_wpd; i++ ) d[i] = d1[i]+d2[i]; @@ -517,29 +579,10 @@ INLINE void ndl_add(unsigned int *d1,unsigned int *d2, } } -INLINE void ndl_add2(unsigned int *d1,unsigned int *d2) +INLINE void ndl_sub(unsigned int *d1,unsigned int *d2,unsigned int *d) { int i; - switch ( nd_wpd ) { - case 1: - d2[0] += d1[0]; - break; - case 2: - d2[0] += d1[0]; - d2[1] += d1[1]; - break; - default: - for ( i = 0; i < nd_wpd; i++ ) - d2[i] += d1[i]; - break; - } -} - -void ndl_sub(unsigned int *d1,unsigned int *d2,unsigned int *d) -{ - int i; - for ( i = 0; i < nd_wpd; i++ ) d[i] = d1[i]-d2[i]; } @@ -551,7 +594,7 @@ int ndl_disjoint(unsigned int *d1,unsigned int *d2) switch ( nd_bpe ) { case 4: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = nd_exporigin; i < nd_wpd; i++ ) { u1 = d1[i]; u2 = d2[i]; t1 = u1&0xf0000000; t2 = u2&0xf0000000; if ( t1&&t2 ) return 0; t1 = u1&0xf000000; t2 = u2&0xf000000; if ( t1&&t2 ) return 0; @@ -565,7 +608,7 @@ int ndl_disjoint(unsigned int *d1,unsigned int *d2) return 1; break; case 6: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = nd_exporigin; i < nd_wpd; i++ ) { u1 = d1[i]; u2 = d2[i]; t1 = u1&0x3f000000; t2 = u2&0x3f000000; if ( t1&&t2 ) return 0; t1 = u1&0xfc0000; t2 = u2&0xfc0000; if ( t1&&t2 ) return 0; @@ -576,7 +619,7 @@ int ndl_disjoint(unsigned int *d1,unsigned int *d2) return 1; break; case 8: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = nd_exporigin; i < nd_wpd; i++ ) { u1 = d1[i]; u2 = d2[i]; t1 = u1&0xff000000; t2 = u2&0xff000000; if ( t1&&t2 ) return 0; t1 = u1&0xff0000; t2 = u2&0xff0000; if ( t1&&t2 ) return 0; @@ -586,7 +629,7 @@ int ndl_disjoint(unsigned int *d1,unsigned int *d2) return 1; break; case 16: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = nd_exporigin; i < nd_wpd; i++ ) { u1 = d1[i]; u2 = d2[i]; t1 = u1&0xffff0000; t2 = u2&0xffff0000; if ( t1&&t2 ) return 0; t1 = u1&0xffff; t2 = u2&0xffff; if ( t1&&t2 ) return 0; @@ -594,12 +637,12 @@ int ndl_disjoint(unsigned int *d1,unsigned int *d2) return 1; break; case 32: - for ( i = 0; i < nd_wpd; i++ ) + for ( i = nd_exporigin; i < nd_wpd; i++ ) if ( d1[i] && d2[i] ) return 0; return 1; break; default: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = nd_exporigin; i < nd_wpd; i++ ) { u1 = d1[i]; u2 = d2[i]; for ( j = 0; j < nd_epw; j++ ) { if ( (u1&nd_mask0) && (u2&nd_mask0) ) return 0; @@ -621,7 +664,7 @@ int ndl_check_bound2(int index,unsigned int *d2) ind = 0; switch ( nd_bpe ) { case 4: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = nd_exporigin; i < nd_wpd; i++ ) { u2 = d2[i]; if ( d1[ind++]+((u2>>28)&0xf) >= 0x10 ) return 1; if ( d1[ind++]+((u2>>24)&0xf) >= 0x10 ) return 1; @@ -635,7 +678,7 @@ int ndl_check_bound2(int index,unsigned int *d2) return 0; break; case 6: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = nd_exporigin; i < nd_wpd; i++ ) { u2 = d2[i]; if ( d1[ind++]+((u2>>24)&0x3f) >= 0x40 ) return 1; if ( d1[ind++]+((u2>>18)&0x3f) >= 0x40 ) return 1; @@ -646,7 +689,7 @@ int ndl_check_bound2(int index,unsigned int *d2) return 0; break; case 8: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = nd_exporigin; i < nd_wpd; i++ ) { u2 = d2[i]; if ( d1[ind++]+((u2>>24)&0xff) >= 0x100 ) return 1; if ( d1[ind++]+((u2>>16)&0xff) >= 0x100 ) return 1; @@ -656,7 +699,7 @@ int ndl_check_bound2(int index,unsigned int *d2) return 0; break; case 16: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = nd_exporigin; i < nd_wpd; i++ ) { u2 = d2[i]; if ( d1[ind++]+((u2>>16)&0xffff) > 0x10000 ) return 1; if ( d1[ind++]+(u2&0xffff) > 0x10000 ) return 1; @@ -664,12 +707,12 @@ int ndl_check_bound2(int index,unsigned int *d2) return 0; break; case 32: - for ( i = 0; i < nd_wpd; i++ ) + for ( i = nd_exporigin; i < nd_wpd; i++ ) if ( d1[i]+d2[i]>28)&0xf)+((u2>>28)&0xf) >= 0x10 ) return 1; if ( ((u1>>24)&0xf)+((u2>>24)&0xf) >= 0x10 ) return 1; @@ -701,7 +744,7 @@ int ndl_check_bound2_direct(unsigned int *d1,unsigned return 0; break; case 6: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = nd_exporigin; i < nd_wpd; i++ ) { u1 = d1[i]; u2 = d2[i]; if ( ((u1>>24)&0x3f)+((u2>>24)&0x3f) >= 0x40 ) return 1; if ( ((u1>>18)&0x3f)+((u2>>18)&0x3f) >= 0x40 ) return 1; @@ -712,7 +755,7 @@ int ndl_check_bound2_direct(unsigned int *d1,unsigned return 0; break; case 8: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = nd_exporigin; i < nd_wpd; i++ ) { u1 = d1[i]; u2 = d2[i]; if ( ((u1>>24)&0xff)+((u2>>24)&0xff) >= 0x100 ) return 1; if ( ((u1>>16)&0xff)+((u2>>16)&0xff) >= 0x100 ) return 1; @@ -722,7 +765,7 @@ int ndl_check_bound2_direct(unsigned int *d1,unsigned return 0; break; case 16: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = nd_exporigin; i < nd_wpd; i++ ) { u1 = d1[i]; u2 = d2[i]; if ( ((u1>>16)&0xffff)+((u2>>16)&0xffff) > 0x10000 ) return 1; if ( (u2&0xffff)+(u2&0xffff) > 0x10000 ) return 1; @@ -730,12 +773,12 @@ int ndl_check_bound2_direct(unsigned int *d1,unsigned return 0; break; case 32: - for ( i = 0; i < nd_wpd; i++ ) + for ( i = nd_exporigin; i < nd_wpd; i++ ) if ( d1[i]+d2[i] 0 ) nd_notfirst++; nd_found++; return r->index; } } +#endif if ( Reverse ) for ( i = nd_psn-1; i >= 0; i-- ) { r = nd_psh[i]; - if ( HTD(g) >= TD(r) && ndl_reducible(HDL(g),DL(r)) ) { + if ( ndl_reducible(dg,DL(r)) ) { nd_create++; - nd_append_red(HDL(g),HTD(g),i); + nd_append_red(dg,i); return i; } } else for ( i = 0; i < nd_psn; i++ ) { r = nd_psh[i]; - if ( HTD(g) >= TD(r) && ndl_reducible(HDL(g),DL(r)) ) { + if ( ndl_reducible(dg,DL(r)) ) { nd_create++; - nd_append_red(HDL(g),HTD(g),i); + nd_append_red(dg,i); return i; } } @@ -801,16 +848,16 @@ INLINE int nd_find_reducer_direct(ND g,NDV *ps,int len if ( Reverse ) for ( i = len-1; i >= 0; i-- ) { r = ps[i]; - if ( HTD(g) >= HTD(r) && ndl_reducible(HDL(g),HDL(r)) ) { - nd_append_red(HDL(g),HTD(g),i); + if ( ndl_reducible(HDL(g),HDL(r)) ) { + nd_append_red(HDL(g),i); return i; } } else for ( i = 0; i < len; i++ ) { r = ps[i]; - if ( HTD(g) >= HTD(r) && ndl_reducible(HDL(g),HDL(r)) ) { - nd_append_red(HDL(g),HTD(g),i); + if ( ndl_reducible(HDL(g),HDL(r)) ) { + nd_append_red(HDL(g),i); return i; } } @@ -820,32 +867,26 @@ INLINE int nd_find_reducer_direct(ND g,NDV *ps,int len ND nd_add(int mod,ND p1,ND p2) { int n,c; - int t,can; + int t,can,td1,td2; ND r; NM m1,m2,mr0,mr,s; - if ( !p1 ) - return p2; - else if ( !p2 ) - return p1; - else if ( !mod ) - return nd_add_q(p1,p2); + if ( !p1 ) return p2; + else if ( !p2 ) return p1; + else if ( !mod ) return nd_add_q(p1,p2); else { can = 0; for ( n = NV(p1), m1 = BDY(p1), m2 = BDY(p2), mr0 = 0; m1 && m2; ) { - c = NM_COMPARE(m1,m2); + c = DL_COMPARE(DL(m1),DL(m2)); switch ( c ) { case 0: t = ((CM(m1))+(CM(m2))) - mod; - if ( t < 0 ) - t += mod; + if ( t < 0 ) t += mod; s = m1; m1 = NEXT(m1); if ( t ) { - can++; - NEXTNM2(mr0,mr,s); CM(mr) = (t); + can++; NEXTNM2(mr0,mr,s); CM(mr) = (t); } else { - can += 2; - FREENM(s); + can += 2; FREENM(s); } s = m2; m2 = NEXT(m2); FREENM(s); break; @@ -858,18 +899,12 @@ ND nd_add(int mod,ND p1,ND p2) } } if ( !mr0 ) - if ( m1 ) - mr0 = m1; - else if ( m2 ) - mr0 = m2; - else - return 0; - else if ( m1 ) - NEXT(mr) = m1; - else if ( m2 ) - NEXT(mr) = m2; - else - NEXT(mr) = 0; + if ( m1 ) mr0 = m1; + else if ( m2 ) mr0 = m2; + else return 0; + else if ( m1 ) NEXT(mr) = m1; + else if ( m2 ) NEXT(mr) = m2; + else NEXT(mr) = 0; BDY(p1) = mr0; SG(p1) = MAX(SG(p1),SG(p2)); LEN(p1) = LEN(p1)+LEN(p2)-can; @@ -885,24 +920,20 @@ ND nd_add_q(ND p1,ND p2) NM m1,m2,mr0,mr,s; Q t; - if ( !p1 ) - return p2; - else if ( !p2 ) - return p1; + if ( !p1 ) return p2; + else if ( !p2 ) return p1; else { can = 0; for ( n = NV(p1), m1 = BDY(p1), m2 = BDY(p2), mr0 = 0; m1 && m2; ) { - c = NM_COMPARE(m1,m2); + c = DL_COMPARE(DL(m1),DL(m2)); switch ( c ) { case 0: addq(CQ(m1),CQ(m2),&t); s = m1; m1 = NEXT(m1); if ( t ) { - can++; - NEXTNM2(mr0,mr,s); CQ(mr) = (t); + can++; NEXTNM2(mr0,mr,s); CQ(mr) = (t); } else { - can += 2; - FREENM(s); + can += 2; FREENM(s); } s = m2; m2 = NEXT(m2); FREENM(s); break; @@ -915,18 +946,12 @@ ND nd_add_q(ND p1,ND p2) } } if ( !mr0 ) - if ( m1 ) - mr0 = m1; - else if ( m2 ) - mr0 = m2; - else - return 0; - else if ( m1 ) - NEXT(mr) = m1; - else if ( m2 ) - NEXT(mr) = m2; - else - NEXT(mr) = 0; + if ( m1 ) mr0 = m1; + else if ( m2 ) mr0 = m2; + else return 0; + else if ( m1 ) NEXT(mr) = m1; + else if ( m2 ) NEXT(mr) = m2; + else NEXT(mr) = 0; BDY(p1) = mr0; SG(p1) = MAX(SG(p1),SG(p2)); LEN(p1) = LEN(p1)+LEN(p2)-can; @@ -952,8 +977,7 @@ int nd_nf(int mod,ND g,int full,ND *rp) *rp = 0; return 1; } - if ( !mod ) - hmag = ((double)p_mag((P)HCQ(g)))*nd_scale; + if ( !mod ) hmag = ((double)p_mag((P)HCQ(g)))*nd_scale; sugar0 = sugar = SG(g); n = NV(g); @@ -963,12 +987,6 @@ int nd_nf(int mod,ND g,int full,ND *rp) if ( index >= 0 ) { h = nd_psh[index]; ndl_sub(HDL(g),DL(h),DL(mul)); - TD(mul) = HTD(g)-TD(h); -#if 0 - if ( d && (SG(p)+TD(mul)) > sugar ) { - goto afo; - } -#endif if ( ndl_check_bound2(index,DL(mul)) ) { nd_free(g); nd_free(d); return 0; @@ -984,7 +1002,7 @@ int nd_nf(int mod,ND g,int full,ND *rp) nd_mul_c_q(d,cred); nd_mul_c_q(g,cred); } g = nd_add(mod,g,ndv_mul_nm(mod,p,mul)); - sugar = MAX(sugar,SG(p)+TD(mul)); + sugar = MAX(sugar,SG(p)+TD(DL(mul))); if ( !mod && hmag && g && ((double)(p_mag((P)HCQ(g))) > hmag) ) { nd_removecont2(d,g); hmag = ((double)p_mag((P)HCQ(g)))*nd_scale; @@ -993,26 +1011,20 @@ int nd_nf(int mod,ND g,int full,ND *rp) *rp = g; return 1; } else { -afo: m = BDY(g); if ( NEXT(m) ) { - BDY(g) = NEXT(m); NEXT(m) = 0; - LEN(g)--; + BDY(g) = NEXT(m); NEXT(m) = 0; LEN(g)--; } else { FREEND(g); g = 0; } if ( d ) { - NEXT(tail)=m; - tail=m; - LEN(d)++; + NEXT(tail)=m; tail=m; LEN(d)++; } else { - MKND(n,m,1,d); - tail = BDY(d); + MKND(n,m,1,d); tail = BDY(d); } } } - if ( d ) - SG(d) = sugar; + if ( d ) SG(d) = sugar; *rp = d; return 1; } @@ -1037,8 +1049,7 @@ int nd_nf_pbucket(int mod,ND g,int full,ND *rp) } sugar = SG(g); n = NV(g); - if ( !mod ) - hmag = ((double)p_mag((P)HCQ(g)))*nd_scale; + if ( !mod ) hmag = ((double)p_mag((P)HCQ(g)))*nd_scale; bucket = create_pbucket(); add_pbucket(mod,bucket,g); d = 0; @@ -1046,8 +1057,7 @@ int nd_nf_pbucket(int mod,ND g,int full,ND *rp) while ( 1 ) { hindex = mod?head_pbucket(mod,bucket):head_pbucket_q(bucket); if ( hindex < 0 ) { - if ( d ) - SG(d) = sugar; + if ( d ) SG(d) = sugar; *rp = d; return 1; } @@ -1056,7 +1066,6 @@ int nd_nf_pbucket(int mod,ND g,int full,ND *rp) if ( index >= 0 ) { h = nd_psh[index]; ndl_sub(HDL(g),DL(h),DL(mul)); - TD(mul) = HTD(g)-TD(h); if ( ndl_check_bound2(index,DL(mul)) ) { nd_free(d); free_pbucket(bucket); @@ -1080,12 +1089,12 @@ int nd_nf_pbucket(int mod,ND g,int full,ND *rp) bucket->body[hindex] = nd_remove_head(g); red = nd_remove_head(red); add_pbucket(mod,bucket,red); - sugar = MAX(sugar,SG(p)+TD(mul)); + psugar = SG(p)+TD(DL(mul)); + sugar = MAX(sugar,psugar); if ( !mod && hmag && (gmag > hmag) ) { g = normalize_pbucket(mod,bucket); if ( !g ) { - if ( d ) - SG(d) = sugar; + if ( d ) SG(d) = sugar; *rp = d; return 1; } @@ -1095,27 +1104,22 @@ int nd_nf_pbucket(int mod,ND g,int full,ND *rp) } } else if ( !full ) { g = normalize_pbucket(mod,bucket); - if ( g ) - SG(g) = sugar; + if ( g ) SG(g) = sugar; *rp = g; return 1; } else { m = BDY(g); if ( NEXT(m) ) { - BDY(g) = NEXT(m); NEXT(m) = 0; - LEN(g)--; + BDY(g) = NEXT(m); NEXT(m) = 0; LEN(g)--; } else { FREEND(g); g = 0; } bucket->body[hindex] = g; NEXT(m) = 0; if ( d ) { - NEXT(tail)=m; - tail=m; - LEN(d)++; + NEXT(tail)=m; tail=m; LEN(d)++; } else { - MKND(n,m,1,d); - tail = BDY(d); + MKND(n,m,1,d); tail = BDY(d); } } } @@ -1153,7 +1157,6 @@ int nd_nf_direct(int mod,ND g,NDV *ps,int len,int full if ( index >= 0 ) { p = ps[index]; ndl_sub(HDL(g),HDL(p),DL(mul)); - TD(mul) = HTD(g)-HTD(p); if ( ndl_check_bound2_direct(HDL(p),DL(mul)) ) { nd_free(g); nd_free(d); return 0; @@ -1167,7 +1170,7 @@ int nd_nf_direct(int mod,ND g,NDV *ps,int len,int full nd_mul_c_q(d,cred); nd_mul_c_q(g,cred); } g = nd_add(mod,g,ndv_mul_nm(mod,p,mul)); - sugar = MAX(sugar,SG(p)+TD(mul)); + sugar = MAX(sugar,SG(p)+TD(DL(mul))); if ( !mod && hmag && g && ((double)(p_mag((P)HCQ(g))) > hmag) ) { nd_removecont2(d,g); hmag = ((double)p_mag((P)HCQ(g)))*nd_scale; @@ -1178,23 +1181,18 @@ int nd_nf_direct(int mod,ND g,NDV *ps,int len,int full } else { m = BDY(g); if ( NEXT(m) ) { - BDY(g) = NEXT(m); NEXT(m) = 0; - LEN(g)--; + BDY(g) = NEXT(m); NEXT(m) = 0; LEN(g)--; } else { FREEND(g); g = 0; } if ( d ) { - NEXT(tail)=m; - tail=m; - LEN(d)++; + NEXT(tail)=m; tail=m; LEN(d)++; } else { - MKND(n,m,1,d); - tail = BDY(d); + MKND(n,m,1,d); tail = BDY(d); } } } - if ( d ) - SG(d) = sugar; + if ( d ) SG(d) = sugar; *rp = d; return 1; } @@ -1243,7 +1241,6 @@ int nd_nf_direct_pbucket(int mod,ND g,NDV *ps,int len, if ( index >= 0 ) { p = ps[index]; ndl_sub(HDL(g),HDL(p),DL(mul)); - TD(mul) = HTD(g)-HTD(p); if ( ndl_check_bound2_direct(HDL(p),DL(mul)) ) { nd_free(d); free_pbucket(bucket); @@ -1265,12 +1262,11 @@ int nd_nf_direct_pbucket(int mod,ND g,NDV *ps,int len, bucket->body[hindex] = nd_remove_head(g); red = nd_remove_head(red); add_pbucket(mod,bucket,red); - sugar = MAX(sugar,SG(p)+TD(mul)); + sugar = MAX(sugar,SG(p)+TD(DL(mul))); if ( !mod && hmag && (gmag > hmag) ) { g = normalize_pbucket(mod,bucket); if ( !g ) { - if ( d ) - SG(d) = sugar; + if ( d ) SG(d) = sugar; *rp = d; return 1; } @@ -1280,27 +1276,22 @@ int nd_nf_direct_pbucket(int mod,ND g,NDV *ps,int len, } } else if ( !full ) { g = normalize_pbucket(mod,bucket); - if ( g ) - SG(g) = sugar; + if ( g ) SG(g) = sugar; *rp = g; return 1; } else { m = BDY(g); if ( NEXT(m) ) { - BDY(g) = NEXT(m); NEXT(m) = 0; - LEN(g)--; + BDY(g) = NEXT(m); NEXT(m) = 0; LEN(g)--; } else { FREEND(g); g = 0; } bucket->body[hindex] = g; NEXT(m) = 0; if ( d ) { - NEXT(tail)=m; - tail=m; - LEN(d)++; + NEXT(tail)=m; tail=m; LEN(d)++; } else { - MKND(n,m,1,d); - tail = BDY(d); + MKND(n,m,1,d); tail = BDY(d); } } } @@ -1314,21 +1305,18 @@ int nd_check_candidate(NODE input,NODE cand) ND nf,d; NODE t; - nd_setup(0,cand); + nd_setup(0,0,cand); n = length(cand); /* membercheck : list is a subset of Id(cand) ? */ for ( t = input; t; t = NEXT(t) ) { d = dptond(0,(DP)BDY(t)); stat = nd_nf_direct(0,d,nd_psq,n,0,&nf); - if ( !stat ) - nd_reconstruct_direct(0,nd_psq,n); - else if ( nf ) - return 0; + if ( !stat ) nd_reconstruct_direct(0,nd_psq,n); + else if ( nf ) return 0; } /* gbcheck : cand is a GB of Id(cand) ? */ - if ( !nd_gb(0,1) ) - return 0; + if ( !nd_gb(0,1) ) return 0; /* XXX */ return 1; } @@ -1339,11 +1327,9 @@ ND nd_remove_head(ND p) m = BDY(p); if ( !NEXT(m) ) { - FREEND(p); - p = 0; + FREEND(p); p = 0; } else { - BDY(p) = NEXT(m); - LEN(p)--; + BDY(p) = NEXT(m); LEN(p)--; } FREENM(m); return p; @@ -1395,7 +1381,6 @@ void mulq_pbucket(PGeoBucket g,Q c) nd_mul_c_q(g->body[k],c); } -/* XXX not completed */ int head_pbucket(int mod,PGeoBucket g) { int j,i,c,k,nv,sum; @@ -1414,28 +1399,22 @@ int head_pbucket(int mod,PGeoBucket g) dj = HDL(gj); sum = HCM(gj); } else { - di = HDL(gi); - nv = NV(gi); - c = NM_COMPARE(BDY(gi),BDY(gj)); + c = DL_COMPARE(HDL(gi),dj); if ( c > 0 ) { - if ( sum ) - HCM(gj) = sum; - else - g->body[j] = nd_remove_head(gj); + if ( sum ) HCM(gj) = sum; + else g->body[j] = nd_remove_head(gj); j = i; gj = g->body[j]; dj = HDL(gj); sum = HCM(gj); } else if ( c == 0 ) { sum = sum+HCM(gi)-mod; - if ( sum < 0 ) - sum += mod; + if ( sum < 0 ) sum += mod; g->body[i] = nd_remove_head(gi); } } } - if ( j < 0 ) - return -1; + if ( j < 0 ) return -1; else if ( sum ) { HCM(gj) = sum; return j; @@ -1448,32 +1427,25 @@ int head_pbucket_q(PGeoBucket g) { int j,i,c,k,nv; Q sum,t; - unsigned int *di,*dj; ND gi,gj; k = g->m; while ( 1 ) { j = -1; for ( i = 0; i <= k; i++ ) { - if ( !(gi = g->body[i]) ) - continue; + if ( !(gi = g->body[i]) ) continue; if ( j < 0 ) { j = i; gj = g->body[j]; - dj = HDL(gj); sum = HCQ(gj); } else { - di = HDL(gi); nv = NV(gi); - c = NM_COMPARE(BDY(gi),BDY(gj)); + c = DL_COMPARE(HDL(gi),HDL(gj)); if ( c > 0 ) { - if ( sum ) - HCQ(gj) = sum; - else - g->body[j] = nd_remove_head(gj); + if ( sum ) HCQ(gj) = sum; + else g->body[j] = nd_remove_head(gj); j = i; gj = g->body[j]; - dj = HDL(gj); sum = HCQ(gj); } else if ( c == 0 ) { addq(sum,HCQ(gi),&t); @@ -1482,8 +1454,7 @@ int head_pbucket_q(PGeoBucket g) } } } - if ( j < 0 ) - return -1; + if ( j < 0 ) return -1; else if ( sum ) { HCQ(gj) = sum; return j; @@ -1535,7 +1506,11 @@ again: d = nd_reconstruct(m,0,d); goto again; } +#if USE_GEOBUCKET stat = m?nd_nf_pbucket(m,h,!Top,&nf):nd_nf(m,h,!Top,&nf); +#else + stat = nd_nf(m,h,!Top,&nf); +#endif if ( !stat ) { NEXT(l) = d; d = l; d = nd_reconstruct(m,0,d); @@ -1543,7 +1518,7 @@ again: } else if ( nf ) { if ( checkonly ) return 0; printf("+"); fflush(stdout); - nh = nd_newps(m,nf); + nh = m?nd_newps(m,nf,0):nd_newps(m,0,nf); d = update_pairs(d,g,nh); g = update_base(g,nh); FREENDP(l); @@ -1553,11 +1528,9 @@ again: } } if ( m ) - for ( t = g; t; t = NEXT(t) ) - BDY(t) = (pointer)nd_ps[(int)BDY(t)]; + for ( t = g; t; t = NEXT(t) ) BDY(t) = (pointer)nd_ps[(int)BDY(t)]; else - for ( t = g; t; t = NEXT(t) ) - BDY(t) = (pointer)nd_psq[(int)BDY(t)]; + for ( t = g; t; t = NEXT(t) ) BDY(t) = (pointer)nd_psq[(int)BDY(t)]; return g; } @@ -1588,7 +1561,11 @@ again: d = nd_reconstruct(m,1,d); goto again; } +#if USE_GEOBUCKET stat = nd_nf_pbucket(m,h,!Top,&nf); +#else + stat = nd_nf(m,h,!Top,&nf); +#endif if ( !stat ) { NEXT(l) = d; d = l; d = nd_reconstruct(m,1,d); @@ -1599,9 +1576,9 @@ again: nd_nf(0,h,!Top,&nfq); if ( nfq ) { printf("+"); fflush(stdout); - nh = nd_newps_trace(m,nf,nfq); + nh = nd_newps(m,nf,nfq); /* failure; m|HC(nfq) */ - if ( nf < 0 ) return 0; + if ( nh < 0 ) return 0; d = update_pairs(d,g,nh); g = update_base(g,nh); } else { @@ -1619,20 +1596,12 @@ again: int ndv_compare(NDV *p1,NDV *p2) { - int td1,td2; - - if ( nd_degcompat ) { - td1 = HTD(*p1); td2 = HTD(*p2); - if ( td1 > td2 ) return 1; - else if ( td1 < td2 ) return -1; - else return ndl_compare(HDL(*p1),HDL(*p2)); - } else - return (*nmv_compare_generic)(BDY(*p1),BDY(*p2)); + return DL_COMPARE(HDL(*p1),HDL(*p2)); } int ndv_compare_rev(NDV *p1,NDV *p2) { - return -ndv_compare(p1,p2); + return -DL_COMPARE(HDL(*p1),HDL(*p2)); } NODE nd_reduceall(int m,NODE f) @@ -1649,10 +1618,8 @@ NODE nd_reduceall(int m,NODE f) qsort(ps,n,sizeof(NDV),(int (*)(const void *,const void *))ndv_compare); w = (NDV *)ALLOCA((n-1)*sizeof(NDV)); for ( i = 0; i < n; i++ ) { - for ( j = 0; j < i; j++ ) - w[j] = (NDV)ps[j]; - for ( j = i+1; j < n; j++ ) - w[j-1] = ps[j]; + for ( j = 0; j < i; j++ ) w[j] = (NDV)ps[j]; + for ( j = i+1; j < n; j++ ) w[j-1] = ps[j]; g = ndvtond(m,ps[i]); stat = nd_nf_direct(m,g,w,n-1,1,&nf); if ( !stat ) @@ -1660,8 +1627,7 @@ NODE nd_reduceall(int m,NODE f) else if ( !nf ) { printf("."); fflush(stdout); ndv_free(ps[i]); - for ( j = i+1; j < n; j++ ) - ps[j-1] = ps[j]; + for ( j = i+1; j < n; j++ ) ps[j-1] = ps[j]; n--; } else { printf("."); fflush(stdout); @@ -1692,23 +1658,18 @@ ND_pairs update_pairs( ND_pairs d, NODE /* of index */ while ( cur ) { if ( crit_2( cur->i1,cur->i2 ) ) { remove = cur; - if ( !prev ) { - head = cur = NEXT(cur); - } else { - cur = NEXT(prev) = NEXT(cur); - } + if ( !prev ) head = cur = NEXT(cur); + else cur = NEXT(prev) = NEXT(cur); FREENDP(remove); } else { - prev = cur; - cur = NEXT(cur); + prev = cur; cur = NEXT(cur); } } if ( !d ) return head; else { nd = d; - while ( NEXT(nd) ) - nd = NEXT(nd); + while ( NEXT(nd) ) nd = NEXT(nd); NEXT(nd) = head; return d; } @@ -1718,20 +1679,18 @@ ND_pairs nd_newpairs( NODE g, int t ) { NODE h; unsigned int *dl; - int td,ts,s; + int ts,s; ND_pairs r,r0; dl = DL(nd_psh[t]); - td = TD(nd_psh[t]); - ts = SG(nd_psh[t]) - td; + ts = SG(nd_psh[t]) - TD(dl); for ( r0 = 0, h = g; h; h = NEXT(h) ) { NEXTND_pairs(r0,r); r->i1 = (int)BDY(h); r->i2 = t; ndl_lcm(DL(nd_psh[r->i1]),dl,r->lcm); - TD(r) = ndl_td(r->lcm); - s = SG(nd_psh[r->i1])-TD(nd_psh[r->i1]); - SG(r) = MAX(s,ts) + TD(r); + s = SG(nd_psh[r->i1])-TD(DL(nd_psh[r->i1])); + SG(r) = MAX(s,ts) + TD(LCM(r)); } NEXT(r) = 0; return r0; @@ -1761,39 +1720,34 @@ ND_pairs crit_B( ND_pairs d, int s ) } FREENDP(remove); } else { - prev = cur; - cur = NEXT(cur); + prev = cur; cur = NEXT(cur); } } return head; } +/* XXX : check is necessary */ + ND_pairs crit_M( ND_pairs d1 ) { ND_pairs e,d2,d3,dd,p; unsigned int *id,*jd; - int itd,jtd; for ( dd = 0, e = d1; e; e = d3 ) { if ( !(d2 = NEXT(e)) ) { NEXT(e) = dd; return e; } - id = e->lcm; - itd = TD(e); + id = LCM(e); for ( d3 = 0; d2; d2 = p ) { - p = NEXT(d2), - jd = d2->lcm; - jtd = TD(d2); - if ( jtd == itd ) - if ( id == jd ); - else if ( ndl_reducible(jd,id) ) continue; - else if ( ndl_reducible(id,jd) ) goto delit; - else ; - else if ( jtd > itd ) + p = NEXT(d2); + jd = LCM(d2); + if ( ndl_equal(jd,id) ) + ; + else if ( TD(jd) > TD(id) ) if ( ndl_reducible(jd,id) ) continue; else ; - else if ( ndl_reducible(id,jd ) ) goto delit; + else if ( ndl_reducible(id,jd) ) goto delit; NEXT(d2) = d3; d3 = d2; } @@ -1860,25 +1814,21 @@ int crit_2( int dp1, int dp2 ) return ndl_disjoint(DL(nd_psh[dp1]),DL(nd_psh[dp2])); } -static ND_pairs equivalent_pairs( ND_pairs d1, ND_pairs *prest ) +ND_pairs equivalent_pairs( ND_pairs d1, ND_pairs *prest ) { ND_pairs w,p,r,s; unsigned int *d; - int td; w = d1; - d = w->lcm; - td = TD(w); + d = LCM(w); s = NEXT(w); NEXT(w) = 0; for ( r = 0; s; s = p ) { p = NEXT(s); - if ( td == TD(s) && ndl_equal(d,s->lcm) ) { - NEXT(s) = w; - w = s; + if ( ndl_equal(d,LCM(s)) ) { + NEXT(s) = w; w = s; } else { - NEXT(s) = r; - r = s; + NEXT(s) = r; r = s; } } *prest = r; @@ -1889,14 +1839,11 @@ NODE update_base(NODE nd,int ndp) { unsigned int *dl, *dln; NODE last, p, head; - int td,tdn; dl = DL(nd_psh[ndp]); - td = TD(nd_psh[ndp]); for ( head = last = 0, p = nd; p; ) { dln = DL(nd_psh[(int)BDY(p)]); - tdn = TD(nd_psh[(int)BDY(p)]); - if ( tdn >= td && ndl_reducible( dln, dl ) ) { + if ( ndl_reducible( dln, dl ) ) { p = NEXT(p); if ( last ) NEXT(last) = p; } else { @@ -1912,38 +1859,19 @@ ND_pairs nd_minp( ND_pairs d, ND_pairs *prest ) { ND_pairs m,ml,p,l; unsigned int *lcm; - int s,td,len,tlen,c; + int s,td,len,tlen,c,c1; if ( !(p = NEXT(m = d)) ) { *prest = p; NEXT(m) = 0; return m; } - lcm = m->lcm; s = SG(m); - td = TD(m); - len = nd_psl[m->i1]+nd_psl[m->i2]; - for ( ml = 0, l = m; p; p = NEXT(l = p) ) { - if (SG(p) < s) - goto find; - else if ( SG(p) == s ) { - if ( TD(p) < td ) - goto find; - else if ( TD(p) == td ) { - c = ndl_compare(p->lcm,lcm); - if ( c < 0 ) - goto find; - } + for ( ml = 0, l = m; p; p = NEXT(l = p) ) + if ( (SG(p) < s) + || ((SG(p) == s) && (DL_COMPARE(LCM(p),LCM(m)) < 0)) ) { + ml = l; m = p; s = SG(m); } - continue; -find: - ml = l; - m = p; - lcm = m->lcm; - s = SG(m); - td = TD(m); - len = tlen; - } if ( !ml ) *prest = NEXT(m); else { NEXT(ml) = NEXT(m); @@ -1953,7 +1881,7 @@ find: return m; } -int nd_newps(int mod,ND a) +int nd_newps(int mod,ND a,ND aq) { int len; RHist r; @@ -1961,62 +1889,36 @@ int nd_newps(int mod,ND a) if ( nd_psn == nd_pslen ) { nd_pslen *= 2; - nd_psl = (int *)REALLOC((char *)nd_psl,nd_pslen*sizeof(int)); nd_ps = (NDV *)REALLOC((char *)nd_ps,nd_pslen*sizeof(NDV)); nd_psq = (NDV *)REALLOC((char *)nd_psq,nd_pslen*sizeof(NDV)); nd_psh = (RHist *)REALLOC((char *)nd_psh,nd_pslen*sizeof(RHist)); nd_bound = (unsigned int **) REALLOC((char *)nd_bound,nd_pslen*sizeof(unsigned int *)); } - nd_removecont(mod,a); - nd_bound[nd_psn] = nd_compute_bound(a); - NEWRHist(r); SG(r) = SG(a); TD(r) = HTD(a); ndl_copy(HDL(a),DL(r)); - nd_psh[nd_psn] = r; - b = ndtondv(mod,a); - len = LEN(b); - if ( mod ) - nd_ps[nd_psn] = b; - else - nd_psq[nd_psn] = b; - nd_psl[nd_psn] = len; - nd_free(a); - return nd_psn++; -} - -int nd_newps_trace(int mod,ND nf,ND nfq) -{ - int len; - RHist r; - NDV b; - - if ( nd_psn == nd_pslen ) { - nd_pslen *= 2; - nd_psl = (int *)REALLOC((char *)nd_psl,nd_pslen*sizeof(int)); - nd_ps = (NDV *)REALLOC((char *)nd_ps,nd_pslen*sizeof(NDV)); - nd_psq = (NDV *)REALLOC((char *)nd_psq,nd_pslen*sizeof(NDV)); - nd_psh = (RHist *)REALLOC((char *)nd_psh,nd_pslen*sizeof(RHist)); - nd_bound = (unsigned int **) - REALLOC((char *)nd_bound,nd_pslen*sizeof(unsigned int *)); + if ( a && aq ) { + /* trace lifting */ + if ( !rem(NM(HCQ(aq)),mod) ) return -1; } - if ( !rem(NM(HCQ(nfq)),mod) ) return -1; - nd_removecont(mod,nf); - nd_ps[nd_psn] = ndtondv(mod,nf); - - nd_removecont(0,nfq); - nd_psq[nd_psn] = ndtondv(0,nfq); - - nd_bound[nd_psn] = nd_compute_bound(nfq); - NEWRHist(r); SG(r) = SG(nf); TD(r) = HTD(nf); ndl_copy(HDL(nf),DL(r)); - nd_psh[nd_psn] = r; - - len = LEN(nd_psq[nd_psn]); - nd_psl[nd_psn] = len; - - nd_free(nf); nd_free(nfq); + NEWRHist(r); nd_psh[nd_psn] = r; + if ( aq ) { + nd_removecont(0,aq); + nd_psq[nd_psn] = ndtondv(0,aq); + nd_bound[nd_psn] = nd_compute_bound(aq); + SG(r) = SG(aq); ndl_copy(HDL(aq),DL(r)); + } + if ( a ) { + nd_removecont(mod,a); + nd_ps[nd_psn] = ndtondv(mod,a); + if ( !aq ) { + nd_bound[nd_psn] = nd_compute_bound(a); + SG(r) = SG(a); ndl_copy(HDL(a),DL(r)); + } + } + nd_free(a); nd_free(aq); return nd_psn++; } -void nd_setup(int mod,NODE f) +void nd_setup(int mod,int trace,NODE f) { int i,j,td,len,max; NODE s,s0,f0; @@ -2027,7 +1929,6 @@ void nd_setup(int mod,NODE f) nd_found = 0; nd_notfirst = 0; nd_create = 0; nd_psn = length(f); nd_pslen = 2*nd_psn; - nd_psl = (int *)MALLOC(nd_pslen*sizeof(int)); nd_ps = (NDV *)MALLOC(nd_pslen*sizeof(NDV)); nd_psq = (NDV *)MALLOC(nd_pslen*sizeof(NDV)); nd_psh = (RHist *)MALLOC(nd_pslen*sizeof(RHist)); @@ -2041,87 +1942,32 @@ void nd_setup(int mod,NODE f) nd_red = (RHist *)MALLOC(REDTAB_LEN*sizeof(RHist)); bzero(nd_red,REDTAB_LEN*sizeof(RHist)); - if ( max < 2 ) - nd_bpe = 2; - else if ( max < 4 ) - nd_bpe = 4; - else if ( max < 64 ) - nd_bpe = 6; - else if ( max < 256 ) - nd_bpe = 8; - else if ( max < 65536 ) - nd_bpe = 16; - else - nd_bpe = 32; + if ( max < 2 ) nd_bpe = 2; + else if ( max < 4 ) nd_bpe = 4; + else if ( max < 64 ) nd_bpe = 6; + else if ( max < 256 ) nd_bpe = 8; + else if ( max < 65536 ) nd_bpe = 16; + else nd_bpe = 32; nd_setup_parameters(); nd_free_private_storage(); - len = 0; for ( i = 0; i < nd_psn; i++, f = NEXT(f) ) { NEWRHist(r); - a = dptondv(mod,(DP)BDY(f)); - ndv_removecont(mod,a); - len = MAX(len,LEN(a)); - SG(r) = HTD(a); TD(r) = HTD(a); ndl_copy(HDL(a),DL(r)); - if ( mod ) + a = dptondv(mod,(DP)BDY(f)); ndv_removecont(mod,a); + SG(r) = HTD(a); ndl_copy(HDL(a),DL(r)); + + if ( trace ) { nd_ps[i] = a; - else + a = dptondv(0,(DP)BDY(f)); ndv_removecont(0,a); nd_psq[i] = a; + } else { + if ( mod ) nd_ps[i] = a; + else nd_psq[i] = a; + } nd_psh[i] = r; } } -void nd_setup_trace(int mod,NODE f) -{ - int i,j,td,len,max; - NODE s,s0,f0; - unsigned int *d; - RHist r; - NDV a; - - nd_found = 0; nd_notfirst = 0; nd_create = 0; - - nd_psn = length(f); nd_pslen = 2*nd_psn; - nd_psl = (int *)MALLOC(nd_pslen*sizeof(int)); - nd_ps = (NDV *)MALLOC(nd_pslen*sizeof(NDV)); - nd_psq = (NDV *)MALLOC(nd_pslen*sizeof(NDV)); - nd_psh = (RHist *)MALLOC(nd_pslen*sizeof(RHist)); - nd_bound = (unsigned int **)MALLOC(nd_pslen*sizeof(unsigned int *)); - for ( max = 0, i = 0, s = f; i < nd_psn; i++, s = NEXT(s) ) { - nd_bound[i] = d = dp_compute_bound((DP)BDY(s)); - for ( j = 0; j < nd_nvar; j++ ) - max = MAX(d[j],max); - } - if ( !nd_red ) - nd_red = (RHist *)MALLOC(REDTAB_LEN*sizeof(RHist)); - bzero(nd_red,REDTAB_LEN*sizeof(RHist)); - - if ( max < 2 ) - nd_bpe = 2; - else if ( max < 4 ) - nd_bpe = 4; - else if ( max < 64 ) - nd_bpe = 6; - else if ( max < 256 ) - nd_bpe = 8; - else if ( max < 65536 ) - nd_bpe = 16; - else - nd_bpe = 32; - - nd_setup_parameters(); - nd_free_private_storage(); - len = 0; - for ( i = 0; i < nd_psn; i++, f = NEXT(f) ) { - a = dptondv(mod,(DP)BDY(f)); ndv_removecont(mod,a); nd_ps[i] = a; - a = dptondv(0,(DP)BDY(f)); ndv_removecont(0,a); nd_psq[i] = a; - NEWRHist(r); - len = MAX(len,LEN(a)); - SG(r) = HTD(a); TD(r) = HTD(a); ndl_copy(HDL(a),DL(r)); - nd_psh[i] = r; - } -} - void nd_gr(LIST f,LIST v,int m,struct order_spec *ord,LIST *rp) { struct order_spec ord1; @@ -2139,7 +1985,7 @@ void nd_gr(LIST f,LIST v,int m,struct order_spec *ord, NEXTNODE(fd0,fd); BDY(fd) = (pointer)b; } if ( fd0 ) NEXT(fd) = 0; - nd_setup(m,fd0); + nd_setup(m,0,fd0); x = nd_gb(m,0); fprintf(asir_out,"found=%d,notfirst=%d,create=%d\n", nd_found,nd_notfirst,nd_create); @@ -2184,11 +2030,6 @@ void nd_gr_trace(LIST f,LIST v,int m,int homo,struct o initd(&ord1); nd_nvar++; } else { - switch ( ord->ord.simple ) { - case 0: nd_isrlex = 1; nd_degcompat = 1; break; - case 1: nd_isrlex = 0; nd_degcompat = 1; break; - default: error("nd_gr : unsupported order"); - } for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) { ptod(CO,vv,(P)BDY(t),&c); if ( c ) { @@ -2197,9 +2038,10 @@ void nd_gr_trace(LIST f,LIST v,int m,int homo,struct o } if ( fd0 ) NEXT(fd) = 0; in0 = fd0; + nd_init_ord(ord); } do { - nd_setup_trace(m,fd0); + nd_setup(m,1,fd0); cand = nd_gb_trace(m); if ( !cand ) continue; if ( homo ) { @@ -2236,32 +2078,29 @@ void dltondl(int n,DL dl,unsigned int *r) int i; d = dl->d; - bzero(r,nd_wpd*sizeof(unsigned int)); + for ( i = 0; i < nd_wpd; i++ ) r[i] = 0; if ( nd_isrlex ) - for ( i = 0; i < n; i++ ) - r[(n-1-i)/nd_epw] |= (d[i]<<((nd_epw-((n-1-i)%nd_epw)-1)*nd_bpe)); + for ( i = 0; i < n; i++ ) PUT_EXP(r,n-1-i,d[i]); else - for ( i = 0; i < n; i++ ) - r[i/nd_epw] |= d[i]<<((nd_epw-(i%nd_epw)-1)*nd_bpe); + for ( i = 0; i < n; i++ ) PUT_EXP(r,i,d[i]); + TD(r) = ndl_weight(r); } -DL ndltodl(int n,int td,unsigned int *ndl) +DL ndltodl(int n,unsigned int *ndl) { DL dl; int *d; int i; NEWDL(dl,n); - TD(dl) = td; + dl->td = TD(ndl); d = dl->d; if ( nd_isrlex ) for ( i = 0; i < n; i++ ) - d[i] = (ndl[(n-1-i)/nd_epw]>>((nd_epw-((n-1-i)%nd_epw)-1)*nd_bpe)) - &((1<>((nd_epw-(i%nd_epw)-1)*nd_bpe)) - &((1<>((nd_epw-((n-1-i)%nd_epw)-1)*nd_bpe)) - &((1<>((nd_epw-(i%nd_epw)-1)*nd_bpe)) - &((1<>"); } @@ -2372,9 +2200,7 @@ void ndp_print(ND_pairs d) { ND_pairs t; - for ( t = d; t; t = NEXT(t) ) { - printf("%d,%d ",t->i1,t->i2); - } + for ( t = d; t; t = NEXT(t) ) printf("%d,%d ",t->i1,t->i2); printf("\n"); } @@ -2387,15 +2213,13 @@ void nd_removecont(int mod,ND p) struct oVECT v; N q,r; - if ( mod ) - nd_mul_c(mod,p,invm(HCM(p),mod)); + if ( mod ) nd_mul_c(mod,p,invm(HCM(p),mod)); else { for ( m = BDY(p), n = 0; m; m = NEXT(m), n++ ); w = (Q *)ALLOCA(n*sizeof(Q)); v.len = n; v.body = (pointer *)w; - for ( m = BDY(p), i = 0; i < n; m = NEXT(m), i++ ) - w[i] = CQ(m); + for ( m = BDY(p), i = 0; i < n; m = NEXT(m), i++ ) w[i] = CQ(m); removecont_array(w,n); for ( m = BDY(p), i = 0; i < n; m = NEXT(m), i++ ) CQ(m) = w[i]; } @@ -2421,10 +2245,8 @@ void nd_removecont2(ND p1,ND p2) w = (Q *)ALLOCA(n*sizeof(Q)); v.len = n; v.body = (pointer *)w; - for ( m = BDY(p1), i = 0; i < n1; m = NEXT(m), i++ ) - w[i] = CQ(m); - for ( m = BDY(p2); i < n; m = NEXT(m), i++ ) - w[i] = CQ(m); + for ( m = BDY(p1), i = 0; i < n1; m = NEXT(m), i++ ) w[i] = CQ(m); + for ( m = BDY(p2); i < n; m = NEXT(m), i++ ) w[i] = CQ(m); removecont_array(w,n); for ( m = BDY(p1), i = 0; i < n1; m = NEXT(m), i++ ) CQ(m) = w[i]; for ( m = BDY(p2); i < n; m = NEXT(m), i++ ) CQ(m) = w[i]; @@ -2442,8 +2264,7 @@ void ndv_removecont(int mod,NDV p) else { len = p->len; w = (Q *)ALLOCA(len*sizeof(Q)); - for ( m = BDY(p), i = 0; i < len; NMV_ADV(m), i++ ) - w[i] = CQ(m); + for ( m = BDY(p), i = 0; i < len; NMV_ADV(m), i++ ) w[i] = CQ(m); sortbynm(w,len); qltozl(w,len,&dvr); for ( m = BDY(p), i = 0; i < len; NMV_ADV(m), i++ ) { @@ -2463,14 +2284,14 @@ void ndv_dehomogenize(NDV p) len = p->len; newnvar = nd_nvar-1; - newwpd = newnvar/nd_epw+(newnvar%nd_epw?1:0); + newwpd = newnvar/nd_epw+(newnvar%nd_epw?1:0)+nd_exporigin; for ( m = BDY(p), i = 0; i < len; NMV_ADV(m), i++ ) - TD(m) -= ndl_dehomogenize(DL(m)); + ndl_dehomogenize(DL(m)); if ( newwpd != nd_wpd ) { d = (unsigned int *)ALLOCA(newwpd*sizeof(unsigned int)); newadv = sizeof(struct oNMV)+(newwpd-1)*sizeof(unsigned int); for ( m = r = BDY(p), i = 0; i < len; NMV_ADV(m), NEWADV(r), i++ ) { - CQ(r) = CQ(m); TD(r) = TD(m); ndl_copy(DL(m),d); ndl_copy(d,DL(r)); + CQ(r) = CQ(m); ndl_copy(DL(m),d); ndl_copy(d,DL(r)); } } NV(p)--; @@ -2493,9 +2314,7 @@ void removecont_array(Q *c,int n) NTOQ(qn,SGN(c[i])*SGN(d0),q[i]); NTOQ(rn,SGN(c[i]),r[i]); } - for ( i = 0; i < n; i++ ) - if ( r[i] ) - break; + for ( i = 0; i < n; i++ ) if ( r[i] ) break; if ( i < n ) { v.id = O_VECT; v.len = n; v.body = (pointer *)r; igcdv(&v,&d1); @@ -2510,8 +2329,7 @@ void removecont_array(Q *c,int n) q[i] = u; } } - for ( i = 0; i < n; i++ ) - c[i] = q[i]; + for ( i = 0; i < n; i++ ) c[i] = q[i]; } void nd_mul_c(int mod,ND p,int mul) @@ -2519,8 +2337,7 @@ void nd_mul_c(int mod,ND p,int mul) NM m; int c,c1; - if ( !p ) - return; + if ( !p ) return; for ( m = BDY(p); m; m = NEXT(m) ) { c1 = CM(m); DMAR(c1,mul,0,mod,c); @@ -2533,8 +2350,7 @@ void nd_mul_c_q(ND p,Q mul) NM m; Q c; - if ( !p ) - return; + if ( !p ) return; for ( m = BDY(p); m; m = NEXT(m) ) { mulq(CQ(m),mul,&c); CQ(m) = c; } @@ -2544,8 +2360,7 @@ void nd_free(ND p) { NM t,s; - if ( !p ) - return; + if ( !p ) return; t = BDY(p); while ( t ) { s = NEXT(t); @@ -2560,15 +2375,14 @@ void ndv_free(NDV p) GC_free(BDY(p)); } -void nd_append_red(unsigned int *d,int td,int i) +void nd_append_red(unsigned int *d,int i) { RHist m,m0; int h; NEWRHist(m); - h = ndl_hash_value(td,d); + h = ndl_hash_value(d); m->index = i; - TD(m) = td; ndl_copy(d,DL(m)); NEXT(m) = nd_red[h]; nd_red[h] = m; @@ -2585,7 +2399,8 @@ unsigned int *dp_compute_bound(DP p) d1 = (unsigned int *)ALLOCA(nd_nvar*sizeof(unsigned int)); d2 = (unsigned int *)ALLOCA(nd_nvar*sizeof(unsigned int)); m = BDY(p); - bcopy(DL(m)->d,d1,nd_nvar*sizeof(unsigned int)); + d = DL(m)->d; + for ( i = 0; i < nd_nvar; i++ ) d1[i] = d[i]; for ( m = NEXT(BDY(p)); m; m = NEXT(m) ) { d = DL(m)->d; for ( i = 0; i < nd_nvar; i++ ) @@ -2594,8 +2409,8 @@ unsigned int *dp_compute_bound(DP p) } l = (nd_nvar+31); t = (unsigned int *)MALLOC_ATOMIC(l*sizeof(unsigned int)); - bzero(t,l*sizeof(unsigned int)); - bcopy(d1,t,nd_nvar*sizeof(unsigned int)); + for ( i = 0; i < nd_nvar; i++ ) t[i] = d1[i]; + for ( ; i < l; i++ ) t[i] = 0; return t; } @@ -2609,16 +2424,15 @@ unsigned int *nd_compute_bound(ND p) return 0; d1 = (unsigned int *)ALLOCA(nd_wpd*sizeof(unsigned int)); d2 = (unsigned int *)ALLOCA(nd_wpd*sizeof(unsigned int)); - bcopy(HDL(p),d1,nd_wpd*sizeof(unsigned int)); + ndl_copy(HDL(p),d1); for ( m = NEXT(BDY(p)); m; m = NEXT(m) ) { ndl_lcm(DL(m),d1,d2); t = d1; d1 = d2; d2 = t; } l = nd_nvar+31; t = (unsigned int *)MALLOC_ATOMIC(l*sizeof(unsigned int)); - bzero(t,l*sizeof(unsigned int)); - for ( i = 0; i < nd_nvar; i++ ) - t[i] = (d1[i/nd_epw]>>((nd_epw-(i%nd_epw)-1)*nd_bpe))&nd_mask0; + for ( i = 0; i < nd_nvar; i++ ) t[i] = GET_EXP(d1,i); + for ( ; i < l; i++ ) t[i] = 0; return t; } @@ -2627,6 +2441,19 @@ void nd_setup_parameters() { nd_epw = (sizeof(unsigned int)*8)/nd_bpe; nd_wpd = nd_nvar/nd_epw+(nd_nvar%nd_epw?1:0); + switch ( nd_ord->id ) { + case 0: + nd_exporigin = 1; + break; + case 1: + /* block order */ + nd_exporigin = nd_ord->ord.block.length; + break; + case 2: + error("nd_setup_parameters : matrix order is not supported yet."); + break; + } + nd_wpd += nd_exporigin; if ( nd_bpe < 32 ) { nd_mask0 = (1< realloc nd_ps and pd_psq */ - ND_pairs nd_reconstruct(int mod,int trace,ND_pairs d) { - int i,obpe,oadv; + int i,obpe,oadv,h; NM prev_nm_free_list; RHist mr0,mr; RHist r; + RHist *old_red; ND_pairs s0,s,t,prev_ndp_free_list; obpe = nd_bpe; oadv = nmv_adv; - if ( obpe < 4 ) - nd_bpe = 4; - else if ( obpe < 6 ) - nd_bpe = 6; - else if ( obpe < 8 ) - nd_bpe = 8; - else if ( obpe < 16 ) - nd_bpe = 16; - else if ( obpe < 32 ) - nd_bpe = 32; - else - error("nd_reconstruct : exponent too large"); + if ( obpe < 4 ) nd_bpe = 4; + else if ( obpe < 6 ) nd_bpe = 6; + else if ( obpe < 8 ) nd_bpe = 8; + else if ( obpe < 16 ) nd_bpe = 16; + else if ( obpe < 32 ) nd_bpe = 32; + else error("nd_reconstruct : exponent too large"); nd_setup_parameters(); prev_nm_free_list = _nm_free_list; @@ -2673,34 +2499,38 @@ ND_pairs nd_reconstruct(int mod,int trace,ND_pairs d) _nm_free_list = 0; _ndp_free_list = 0; if ( mod != 0 ) - for ( i = nd_psn-1; i >= 0; i-- ) - ndv_realloc(nd_ps[i],obpe,oadv); + for ( i = nd_psn-1; i >= 0; i-- ) ndv_realloc(nd_ps[i],obpe,oadv); if ( !mod || trace ) - for ( i = nd_psn-1; i >= 0; i-- ) - ndv_realloc(nd_psq[i],obpe,oadv); + for ( i = nd_psn-1; i >= 0; i-- ) ndv_realloc(nd_psq[i],obpe,oadv); s0 = 0; for ( t = d; t; t = NEXT(t) ) { NEXTND_pairs(s0,s); s->i1 = t->i1; s->i2 = t->i2; - TD(s) = TD(t); SG(s) = SG(t); - ndl_dup(obpe,t->lcm,s->lcm); + ndl_reconstruct(obpe,LCM(t),LCM(s)); } + + old_red = (RHist *)ALLOCA(REDTAB_LEN*sizeof(RHist)); for ( i = 0; i < REDTAB_LEN; i++ ) { - for ( mr0 = 0, r = nd_red[i]; r; r = NEXT(r) ) { - NEXTRHist(mr0,mr); + old_red[i] = nd_red[i]; + nd_red[i] = 0; + } + for ( i = 0; i < REDTAB_LEN; i++ ) + for ( r = old_red[i]; r; r = NEXT(r) ) { + NEWRHist(mr); mr->index = r->index; SG(mr) = SG(r); - TD(mr) = TD(r); - ndl_dup(obpe,DL(r),DL(mr)); + ndl_reconstruct(obpe,DL(r),DL(mr)); + h = ndl_hash_value(DL(mr)); + NEXT(mr) = nd_red[h]; + nd_red[h] = mr; } - if ( mr0 ) NEXT(mr) = 0; - nd_red[i] = mr0; - } + for ( i = 0; i < REDTAB_LEN; i++ ) old_red[i] = 0; + old_red = 0; for ( i = 0; i < nd_psn; i++ ) { NEWRHist(r); SG(r) = SG(nd_psh[i]); - TD(r) = TD(nd_psh[i]); ndl_dup(obpe,DL(nd_psh[i]),DL(r)); + ndl_reconstruct(obpe,DL(nd_psh[i]),DL(r)); nd_psh[i] = r; } if ( s0 ) NEXT(s) = 0; @@ -2712,52 +2542,50 @@ ND_pairs nd_reconstruct(int mod,int trace,ND_pairs d) void nd_reconstruct_direct(int mod,NDV *ps,int len) { - int i,obpe,oadv; + int i,obpe,oadv,h; NM prev_nm_free_list; RHist mr0,mr; RHist r; + RHist *old_red; ND_pairs s0,s,t,prev_ndp_free_list; obpe = nd_bpe; oadv = nmv_adv; - if ( obpe < 4 ) - nd_bpe = 4; - else if ( obpe < 6 ) - nd_bpe = 6; - else if ( obpe < 8 ) - nd_bpe = 8; - else if ( obpe < 16 ) - nd_bpe = 16; - else if ( obpe < 32 ) - nd_bpe = 32; - else - error("nd_reconstruct_direct : exponent too large"); + if ( obpe < 4 ) nd_bpe = 4; + else if ( obpe < 6 ) nd_bpe = 6; + else if ( obpe < 8 ) nd_bpe = 8; + else if ( obpe < 16 ) nd_bpe = 16; + else if ( obpe < 32 ) nd_bpe = 32; + else error("nd_reconstruct_direct : exponent too large"); nd_setup_parameters(); prev_nm_free_list = _nm_free_list; prev_ndp_free_list = _ndp_free_list; - _nm_free_list = 0; - _ndp_free_list = 0; - if ( mod != 0 ) - for ( i = len-1; i >= 0; i-- ) - ndv_realloc(ps[i],obpe,oadv); + _nm_free_list = 0; _ndp_free_list = 0; + for ( i = len-1; i >= 0; i-- ) ndv_realloc(ps[i],obpe,oadv); + old_red = (RHist *)ALLOCA(REDTAB_LEN*sizeof(RHist)); for ( i = 0; i < REDTAB_LEN; i++ ) { - for ( mr0 = 0, r = nd_red[i]; r; r = NEXT(r) ) { - NEXTRHist(mr0,mr); + old_red[i] = nd_red[i]; + nd_red[i] = 0; + } + for ( i = 0; i < REDTAB_LEN; i++ ) + for ( r = old_red[i]; r; r = NEXT(r) ) { + NEWRHist(mr); mr->index = r->index; SG(mr) = SG(r); - TD(mr) = TD(r); - ndl_dup(obpe,DL(r),DL(mr)); + ndl_reconstruct(obpe,DL(r),DL(mr)); + h = ndl_hash_value(DL(mr)); + NEXT(mr) = nd_red[h]; + nd_red[h] = mr; } - if ( mr0 ) NEXT(mr) = 0; - nd_red[i] = mr0; - } + for ( i = 0; i < REDTAB_LEN; i++ ) old_red[i] = 0; + old_red = 0; prev_nm_free_list = 0; prev_ndp_free_list = 0; GC_gcollect(); } -void ndl_dup(int obpe,unsigned int *d,unsigned int *r) +void ndl_reconstruct(int obpe,unsigned int *d,unsigned int *r) { int n,i,ei,oepw,cepw,cbpe; @@ -2765,19 +2593,19 @@ void ndl_dup(int obpe,unsigned int *d,unsigned int *r) oepw = (sizeof(unsigned int)*8)/obpe; cepw = nd_epw; cbpe = nd_bpe; - for ( i = 0; i < nd_wpd; i++ ) - r[i] = 0; + TD(r) = TD(d); + for ( i = nd_exporigin; i < nd_wpd; i++ ) r[i] = 0; if ( nd_isrlex ) for ( i = 0; i < n; i++ ) { - ei = (d[(n-1-i)/oepw]>>((oepw-((n-1-i)%oepw)-1)*obpe)) + ei = (d[(n-1-i)/oepw+nd_exporigin]>>((oepw-((n-1-i)%oepw)-1)*obpe)) &((1<>((oepw-(i%oepw)-1)*obpe)) + ei = (d[i/oepw+nd_exporigin]>>((oepw-(i%oepw)-1)*obpe)) &((1<i1]; p2 = nd_psq[p->i2]; } - lcm = p->lcm; - td = TD(p); + lcm = LCM(p); NEWNM(m); CQ(m) = HCQ(p2); - TD(m) = td-HTD(p1); ndl_sub(lcm,HDL(p1),DL(m)); - if ( ndl_check_bound2(p->i1,DL(m)) ) - return 0; + ndl_sub(lcm,HDL(p1),DL(m)); + if ( ndl_check_bound2(p->i1,DL(m)) ) return 0; t1 = ndv_mul_nm(mod,p1,m); - if ( mod ) - CM(m) = mod-HCM(p1); - else - chsgnq(HCQ(p1),&CQ(m)); - TD(m) = td-HTD(p2); ndl_sub(lcm,HDL(p2),DL(m)); + if ( mod ) CM(m) = mod-HCM(p1); + else chsgnq(HCQ(p1),&CQ(m)); + ndl_sub(lcm,HDL(p2),DL(m)); if ( ndl_check_bound2(p->i2,DL(m)) ) { nd_free(t1); return 0; @@ -2862,13 +2683,10 @@ void ndv_mul_c(int mod,NDV p,int mul) NMV m; int c,c1,len,i; - if ( !p ) - return; + if ( !p ) return; len = LEN(p); for ( m = BDY(p), i = 0; i < len; i++, NMV_ADV(m) ) { - c1 = CM(m); - DMAR(c1,mul,0,mod,c); - CM(m) = c; + c1 = CM(m); DMAR(c1,mul,0,mod,c); CM(m) = c; } } @@ -2878,8 +2696,7 @@ void ndv_mul_c_q(NDV p,Q mul) Q c; int len,i; - if ( !p ) - return; + if ( !p ) return; len = LEN(p); for ( m = BDY(p), i = 0; i < len; i++, NMV_ADV(m) ) { mulq(CQ(m),mul,&c); CQ(m) = c; @@ -2895,13 +2712,13 @@ ND ndv_mul_nm(int mod,NDV p,NM m0) Q q; ND r; - if ( !p ) - return 0; + if ( !p ) return 0; else { n = NV(p); m = BDY(p); - d = DL(m0); td = TD(m0); + d = DL(m0); len = LEN(p); mr0 = 0; + td = TD(d); if ( mod ) { c = CM(m0); for ( i = 0; i < len; i++, NMV_ADV(m) ) { @@ -2909,7 +2726,6 @@ ND ndv_mul_nm(int mod,NDV p,NM m0) c1 = CM(m); DMAR(c1,c,0,mod,c2); CM(mr) = c2; - TD(mr) = TD(m)+td; ndl_add(DL(m),d,DL(mr)); } } else { @@ -2917,13 +2733,12 @@ ND ndv_mul_nm(int mod,NDV p,NM m0) for ( i = 0; i < len; i++, NMV_ADV(m) ) { NEXTNM(mr0,mr); mulq(CQ(m),q,&CQ(mr)); - TD(mr) = TD(m)+td; ndl_add(DL(m),d,DL(mr)); } } NEXT(mr) = 0; MKND(NV(p),mr0,len,r); - SG(r) = SG(p) + td; + SG(r) = SG(p) + TD(d); return r; } } @@ -2938,20 +2753,15 @@ void ndv_realloc(NDV p,int obpe,int oadv) if ( p ) { m = BDY(p); len = LEN(p); - if ( nmv_adv > oadv ) - mr0 = (NMV)REALLOC(BDY(p),len*nmv_adv); - else - mr0 = BDY(p); + mr0 = nmv_adv>oadv?(NMV)REALLOC(BDY(p),len*nmv_adv):BDY(p); m = (NMV)((char *)mr0+(len-1)*oadv); mr = (NMV)((char *)mr0+(len-1)*nmv_adv); t = (NMV)ALLOCA(nmv_adv); for ( i = 0; i < len; i++, NMV_OPREV(m), NMV_PREV(mr) ) { CQ(t) = CQ(m); - TD(t) = TD(m); for ( k = 0; k < nd_wpd; k++ ) DL(t)[k] = 0; - ndl_dup(obpe,DL(m),DL(t)); + ndl_reconstruct(obpe,DL(m),DL(t)); CQ(mr) = CQ(t); - TD(mr) = TD(t); ndl_copy(DL(t),DL(mr)); } BDY(p) = mr0; @@ -2965,15 +2775,10 @@ NDV ndtondv(int mod,ND p) NM t; int i,len; - if ( !p ) - return 0; + if ( !p ) return 0; len = LEN(p); - if ( mod ) - m0 = m = (NMV)MALLOC_ATOMIC(len*nmv_adv); - else - m0 = m = (NMV)MALLOC(len*nmv_adv); + m0 = m = (NMV)(mod?MALLOC_ATOMIC(len*nmv_adv):MALLOC(len*nmv_adv)); for ( t = BDY(p), i = 0; t; t = NEXT(t), i++, NMV_ADV(m) ) { - TD(m) = TD(t); ndl_copy(DL(t),DL(m)); CQ(m) = CQ(t); } @@ -2989,13 +2794,11 @@ ND ndvtond(int mod,NDV p) NMV t; int i,len; - if ( !p ) - return 0; + if ( !p ) return 0; m0 = 0; len = p->len; for ( t = BDY(p), i = 0; i < len; NMV_ADV(t), i++ ) { NEXTNM(m0,m); - TD(m) = TD(t); ndl_copy(DL(t),DL(m)); CQ(m) = CQ(t); } @@ -3013,8 +2816,7 @@ NDV dptondv(int mod,DP p) DP q; int l,i,n; - if ( !p ) - return 0; + if ( !p ) return 0; for ( t = BDY(p), l = 0; t; t = NEXT(t), l++ ); if ( mod ) { _dp_mod(p,mod,0,&q); p = q; @@ -3023,11 +2825,8 @@ NDV dptondv(int mod,DP p) m0 = m = (NMV)MALLOC(l*nmv_adv); n = NV(p); for ( t = BDY(p), i = 0; i < l; i++, t = NEXT(t), NMV_ADV(m) ) { - if ( mod ) - CM(m) = ITOS(C(t)); - else - CQ(m) = (Q)C(t); - TD(m) = TD(DL(t)); + if ( mod ) CM(m) = ITOS(C(t)); + else CQ(m) = (Q)C(t); dltondl(n,DL(t),DL(m)); } MKNDV(n,m0,l,d); @@ -3042,18 +2841,15 @@ DP ndvtodp(int mod,NDV p) NMV t; int len,i,n; - if ( !p ) - return 0; + if ( !p ) return 0; m0 = 0; len = LEN(p); n = NV(p); for ( t = BDY(p), i = 0; i < len; i++, NMV_ADV(t) ) { NEXTMP(m0,m); - if ( mod ) - C(m) = STOI(CM(t)); - else - C(m) = (P)CQ(t); - DL(m) = ndltodl(n,TD(t),DL(t)); + if ( mod ) C(m) = STOI(CM(t)); + else C(m) = (P)CQ(t); + DL(m) = ndltodl(n,DL(t)); } NEXT(m) = 0; MKDP(NV(p),m0,d); @@ -3066,8 +2862,7 @@ void ndv_print(NDV p) NMV m; int i,len; - if ( !p ) - printf("0\n"); + if ( !p ) printf("0\n"); else { len = LEN(p); for ( m = BDY(p), i = 0; i < len; i++, NMV_ADV(m) ) { @@ -3083,8 +2878,7 @@ void ndv_print_q(NDV p) NMV m; int i,len; - if ( !p ) - printf("0\n"); + if ( !p ) printf("0\n"); else { len = LEN(p); for ( m = BDY(p), i = 0; i < len; i++, NMV_ADV(m) ) { @@ -3097,18 +2891,6 @@ void ndv_print_q(NDV p) } } -int nd_equal(ND a,ND b) -{ - NM ma,mb; - - if ( (!a && b)||(a&& !b)||(NV(a) != NV(b))||(SG(a) != SG(b)) ) return 0; - for ( ma = BDY(a), mb = BDY(b); ma && mb; ma = NEXT(ma), mb = NEXT(mb) ) { - if ( (TD(ma) != TD(mb)) || !ndl_equal(DL(ma),DL(mb)) ) return 0; - } - if ( !ma && !mb ) return 1; - else return 0; -} - NODE nd_reducebase(NODE x) { int len,i,j; @@ -3136,18 +2918,24 @@ void nd_init_ord(struct order_spec *ord) { if ( ord->id ) error("nd_gr : unsupported order"); - nd_degcompat = 0; + nd_dcomp = 0; switch ( ord->ord.simple ) { case 0: - nd_degcompat = 1; + nd_dcomp = 1; nd_isrlex = 1; break; case 1: - nd_degcompat = 1; + nd_dcomp = 1; nd_isrlex = 0; break; + case 9: + /* td1->td->rlex */ + nd_dcomp = -dp_nelim; + nd_isrlex = 1; + break; default: error("nd_gr : unsupported order"); } + nd_ord = ord; }