=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/nd.c,v retrieving revision 1.33 retrieving revision 1.34 diff -u -p -r1.33 -r1.34 --- OpenXM_contrib2/asir2000/engine/nd.c 2003/08/19 05:29:11 1.33 +++ OpenXM_contrib2/asir2000/engine/nd.c 2003/08/20 06:06:07 1.34 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.32 2003/08/19 04:38:09 noro Exp $ */ +/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.33 2003/08/19 05:29:11 noro Exp $ */ #include "ca.h" #include "inline.h" @@ -40,7 +40,6 @@ typedef struct oNM { int m; Q z; } c; - int td; unsigned int dl[1]; } *NM; @@ -49,27 +48,24 @@ typedef struct oNMV { int m; Q z; } c; - int td; unsigned int dl[1]; } *NMV; typedef struct oRHist { struct oRHist *next; int index; - int td,sugar; + int sugar; unsigned int dl[1]; } *RHist; 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_function)(NM a,NM b); -int (*nmv_compare_function)(NMV a,NMV b); -int (*ndp_compare_function)(ND_pairs a,ND_pairs b); +int (*nd_compare_function)(unsigned int *a1,unsigned int *a2); double nd_scale=2; static unsigned int **nd_bound; @@ -94,40 +90,41 @@ int nd_red_len; int nd_found,nd_create,nd_notfirst; int nm_adv; int nmv_adv; -int nd_degcompat; +int nd_dcomp; -extern int Top,Reverse; +extern int Top,Reverse,dp_nelim; -#define HTD(d) ((d)->body->td) +#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 NM_COMPARE(m1,m2)\ -(nd_degcompat?(TD(m1)>TD(m2)?1\ - :(TD(m1)TD(m2)?1\ - :(TD(m1)TD(m2)?1\ - :(TD(m1)TD(d2)?1:(TD(d1)next = _nm_free_list; _nm_free_list = p; } } @@ -274,7 +270,7 @@ void _NDP_alloc() for ( i = 0; i < 1024; i++ ) { p = (ND_pairs)GC_malloc(sizeof(struct oND_pairs) - +(nd_wpd-1)*sizeof(unsigned int)); + +nd_wpd*sizeof(unsigned int)); p->next = _ndp_free_list; _ndp_free_list = p; } } @@ -292,14 +288,15 @@ INLINE int nd_length(ND p) } } -INLINE int ndl_reducible(unsigned int *d1,unsigned int *d2) +int ndl_reducible(unsigned int *d1,unsigned int *d2) { unsigned int u1,u2; int i,j; + if ( TD(d1) < TD(d2) ) return 0; switch ( nd_bpe ) { case 4: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = 1; i <= nd_wpd; i++ ) { u1 = d1[i]; u2 = d2[i]; if ( (u1&0xf0000000) < (u2&0xf0000000) ) return 0; if ( (u1&0xf000000) < (u2&0xf000000) ) return 0; @@ -313,7 +310,7 @@ INLINE int ndl_reducible(unsigned int *d1,unsigned int return 1; break; case 6: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = 1; i <= nd_wpd; i++ ) { u1 = d1[i]; u2 = d2[i]; if ( (u1&0x3f000000) < (u2&0x3f000000) ) return 0; if ( (u1&0xfc0000) < (u2&0xfc0000) ) return 0; @@ -324,7 +321,7 @@ INLINE int ndl_reducible(unsigned int *d1,unsigned int return 1; break; case 8: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = 1; i <= nd_wpd; i++ ) { u1 = d1[i]; u2 = d2[i]; if ( (u1&0xff000000) < (u2&0xff000000) ) return 0; if ( (u1&0xff0000) < (u2&0xff0000) ) return 0; @@ -334,7 +331,7 @@ INLINE int ndl_reducible(unsigned int *d1,unsigned int return 1; break; case 16: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = 1; i <= nd_wpd; i++ ) { u1 = d1[i]; u2 = d2[i]; if ( (u1&0xffff0000) < (u2&0xffff0000) ) return 0; if ( (u1&0xffff) < (u2&0xffff) ) return 0; @@ -342,12 +339,12 @@ INLINE int ndl_reducible(unsigned int *d1,unsigned int return 1; break; case 32: - for ( i = 0; i < nd_wpd; i++ ) + for ( i = 1; i <= nd_wpd; i++ ) if ( d1[i] < d2[i] ) return 0; return 1; break; default: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = 1; i <= nd_wpd; i++ ) { u1 = d1[i]; u2 = d2[i]; for ( j = 0; j < nd_epw; j++ ) if ( (u1&nd_mask[j]) < (u2&nd_mask[j]) ) return 0; @@ -356,9 +353,7 @@ INLINE int ndl_reducible(unsigned int *d1,unsigned int } } -/* returns the exponent of homo variable */ - -int ndl_dehomogenize(unsigned int *d) +void ndl_dehomogenize(unsigned int *d) { unsigned int mask; unsigned int h; @@ -366,24 +361,23 @@ int ndl_dehomogenize(unsigned int *d) if ( nd_isrlex ) { if ( nd_bpe == 32 ) { - h = d[0]; - for ( i = 1; i < nd_wpd; i++ ) + h = d[1]; + for ( i = 2; i <= nd_wpd; i++ ) d[i-1] = d[i]; d[i-1] = 0; - return h; + TD(d) -= h; } else { bits = nd_epw*nd_bpe; mask = bits==32?0xffffffff:((1<<(nd_epw*nd_bpe))-1); - h = (d[0]>>((nd_epw-1)*nd_bpe))&nd_mask0; - for ( i = 0; i < nd_wpd; i++ ) + h = (d[1]>>((nd_epw-1)*nd_bpe))&nd_mask0; + for ( i = 1; 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+1]>> + ((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; @@ -407,7 +401,7 @@ void ndl_lcm(unsigned int *d1,unsigned *d2,unsigned in } break; case 6: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = 1; 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; @@ -418,7 +412,7 @@ void ndl_lcm(unsigned int *d1,unsigned *d2,unsigned in } break; case 8: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = 1; 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; @@ -428,7 +422,7 @@ void ndl_lcm(unsigned int *d1,unsigned *d2,unsigned in } break; case 16: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = 1; 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; @@ -436,13 +430,13 @@ void ndl_lcm(unsigned int *d1,unsigned *d2,unsigned in } break; case 32: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = 1; 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 = 1; 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; @@ -451,6 +445,7 @@ void ndl_lcm(unsigned int *d1,unsigned *d2,unsigned in } break; } + TD(d) = ndl_td(d); } int ndl_td(unsigned int *d) @@ -458,7 +453,7 @@ int ndl_td(unsigned int *d) unsigned int t,u; int i,j; - for ( t = 0, i = 0; i < nd_wpd; i++ ) { + for ( t = 0, i = 1; i <= nd_wpd; i++ ) { u = d[i]; for ( j = 0; j < nd_epw; j++, u>>=nd_bpe ) t += (u&nd_mask0); @@ -466,7 +461,7 @@ 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; @@ -482,8 +477,9 @@ 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; + for ( i = 1; i <= nd_wpd; i++ ) + if ( *d1++ != *d2++ ) return 0; return 1; } @@ -494,62 +490,47 @@ INLINE void ndl_copy(unsigned int *d1,unsigned int *d2 switch ( nd_wpd ) { case 1: - d2[0] = d1[0]; + TD(d2) = TD(d1); + d2[1] = d1[1]; break; case 2: - d2[0] = d1[0]; + TD(d2) = TD(d1); d2[1] = d1[1]; + d2[2] = d1[2]; break; default: - for ( i = 0; i < nd_wpd; i++ ) + for ( i = 0; i <= nd_wpd; i++ ) d2[i] = d1[i]; break; } } +/* XXX : TD is not added */ + INLINE void ndl_add(unsigned int *d1,unsigned int *d2,unsigned int *d) { int i; switch ( nd_wpd ) { case 1: - d[0] = d1[0]+d2[0]; + d[1] = d1[1]+d2[1]; break; case 2: - d[0] = d1[0]+d2[0]; d[1] = d1[1]+d2[1]; + d[2] = d1[2]+d2[2]; break; default: - for ( i = 0; i < nd_wpd; i++ ) + for ( i = 1; i <= nd_wpd; i++ ) d[i] = d1[i]+d2[i]; break; } } -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++ ) + for ( i = 0; i <= nd_wpd; i++ ) d[i] = d1[i]-d2[i]; } @@ -560,7 +541,7 @@ int ndl_disjoint(unsigned int *d1,unsigned int *d2) switch ( nd_bpe ) { case 4: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = 1; 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; @@ -574,7 +555,7 @@ int ndl_disjoint(unsigned int *d1,unsigned int *d2) return 1; break; case 6: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = 1; 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; @@ -585,7 +566,7 @@ int ndl_disjoint(unsigned int *d1,unsigned int *d2) return 1; break; case 8: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = 1; 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; @@ -595,7 +576,7 @@ int ndl_disjoint(unsigned int *d1,unsigned int *d2) return 1; break; case 16: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = 1; 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; @@ -603,12 +584,12 @@ int ndl_disjoint(unsigned int *d1,unsigned int *d2) return 1; break; case 32: - for ( i = 0; i < nd_wpd; i++ ) + for ( i = 1; i <= nd_wpd; i++ ) if ( d1[i] && d2[i] ) return 0; return 1; break; default: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = 1; 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; @@ -630,7 +611,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 = 1; 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; @@ -644,7 +625,7 @@ int ndl_check_bound2(int index,unsigned int *d2) return 0; break; case 6: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = 1; 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; @@ -655,7 +636,7 @@ int ndl_check_bound2(int index,unsigned int *d2) return 0; break; case 8: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = 1; 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; @@ -665,7 +646,7 @@ int ndl_check_bound2(int index,unsigned int *d2) return 0; break; case 16: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = 1; i <= nd_wpd; i++ ) { u2 = d2[i]; if ( d1[ind++]+((u2>>16)&0xffff) > 0x10000 ) return 1; if ( d1[ind++]+(u2&0xffff) > 0x10000 ) return 1; @@ -673,12 +654,12 @@ int ndl_check_bound2(int index,unsigned int *d2) return 0; break; case 32: - for ( i = 0; i < nd_wpd; i++ ) + for ( i = 1; 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; @@ -710,7 +691,7 @@ int ndl_check_bound2_direct(unsigned int *d1,unsigned return 0; break; case 6: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = 1; 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; @@ -721,7 +702,7 @@ int ndl_check_bound2_direct(unsigned int *d1,unsigned return 0; break; case 8: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = 1; 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; @@ -731,7 +712,7 @@ int ndl_check_bound2_direct(unsigned int *d1,unsigned return 0; break; case 16: - for ( i = 0; i < nd_wpd; i++ ) { + for ( i = 1; 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; @@ -739,12 +720,12 @@ int ndl_check_bound2_direct(unsigned int *d1,unsigned return 0; break; case 32: - for ( i = 0; i < nd_wpd; i++ ) + for ( i = 1; i <= nd_wpd; i++ ) if ( d1[i]+d2[i] 0 ) nd_notfirst++; nd_found++; return r->index; @@ -783,18 +766,18 @@ INLINE int nd_find_reducer(ND g) 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; } } @@ -810,16 +793,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; } } @@ -829,32 +812,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; @@ -867,18 +844,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; @@ -894,24 +865,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; @@ -924,18 +891,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; @@ -961,23 +922,16 @@ 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); - mul = (NM)ALLOCA(sizeof(struct oNM)+(nd_wpd-1)*sizeof(unsigned int)); + mul = (NM)ALLOCA(sizeof(struct oNM)+nd_wpd*sizeof(unsigned int)); for ( d = 0; g; ) { index = nd_find_reducer(g); 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; @@ -993,7 +947,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; @@ -1002,26 +956,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; } @@ -1046,17 +994,15 @@ 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; - mul = (NM)ALLOCA(sizeof(struct oNM)+(nd_wpd-1)*sizeof(unsigned int)); + mul = (NM)ALLOCA(sizeof(struct oNM)+nd_wpd*sizeof(unsigned int)); 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; } @@ -1065,7 +1011,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); @@ -1089,12 +1034,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; } @@ -1104,27 +1049,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); } } } @@ -1156,13 +1096,12 @@ int nd_nf_direct(int mod,ND g,NDV *ps,int len,int full sugar0 = sugar = SG(g); n = NV(g); - mul = (NM)ALLOCA(sizeof(struct oNM)+(nd_wpd-1)*sizeof(unsigned int)); + mul = (NM)ALLOCA(sizeof(struct oNM)+nd_wpd*sizeof(unsigned int)); for ( d = 0; g; ) { index = nd_find_reducer_direct(g,ps,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(g); nd_free(d); return 0; @@ -1176,7 +1115,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; @@ -1187,23 +1126,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; } @@ -1238,7 +1172,7 @@ int nd_nf_direct_pbucket(int mod,ND g,NDV *ps,int len, bucket = create_pbucket(); add_pbucket(mod,bucket,g); d = 0; - mul = (NM)ALLOCA(sizeof(struct oNM)+(nd_wpd-1)*sizeof(unsigned int)); + mul = (NM)ALLOCA(sizeof(struct oNM)+nd_wpd*sizeof(unsigned int)); while ( 1 ) { hindex = mod?head_pbucket(mod,bucket):head_pbucket_q(bucket); if ( hindex < 0 ) { @@ -1252,7 +1186,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); @@ -1274,12 +1207,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; } @@ -1289,27 +1221,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); } } } @@ -1330,14 +1257,11 @@ int nd_check_candidate(NODE input,NODE 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; } @@ -1348,11 +1272,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; @@ -1404,7 +1326,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; @@ -1423,28 +1344,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; @@ -1457,32 +1372,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); @@ -1491,8 +1399,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; @@ -1562,11 +1469,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; } @@ -1628,12 +1533,12 @@ again: int ndv_compare(NDV *p1,NDV *p2) { - return NMV_COMPARE(BDY(*p1),BDY(*p2)); + return DL_COMPARE(HDL(*p1),HDL(*p2)); } int ndv_compare_rev(NDV *p1,NDV *p2) { - return -NMV_COMPARE(BDY(*p1),BDY(*p2)); + return -DL_COMPARE(HDL(*p1),HDL(*p2)); } NODE nd_reduceall(int m,NODE f) @@ -1650,10 +1555,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 ) @@ -1661,8 +1564,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); @@ -1693,23 +1595,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; } @@ -1719,20 +1616,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; @@ -1748,7 +1643,7 @@ ND_pairs crit_B( ND_pairs d, int s ) t = DL(nd_psh[s]); prev = 0; head = cur = d; - lcm = (unsigned int *)ALLOCA(nd_wpd*sizeof(unsigned int)); + lcm = (unsigned int *)ALLOCA((nd_wpd+1)*sizeof(unsigned int)); while ( cur ) { tl = cur->lcm; if ( ndl_reducible(tl,t) @@ -1762,39 +1657,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; } @@ -1865,16 +1755,14 @@ static ND_pairs equivalent_pairs( ND_pairs d1, ND_pair { 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) ) { + if ( ndl_equal(d,LCM(s)) ) { NEXT(s) = w; w = s; } else { @@ -1890,14 +1778,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 { @@ -1922,7 +1807,8 @@ ND_pairs nd_minp( ND_pairs d, ND_pairs *prest ) } s = SG(m); for ( ml = 0, l = m; p; p = NEXT(l = p) ) - if ( (SG(p) < s) || ((SG(p) == s) && (NDP_COMPARE(p,m) < 0)) ) { + if ( (SG(p) < s) + || ((SG(p) == s) && (DL_COMPARE(LCM(p),LCM(m)) < 0)) ) { ml = l; m = p; s = SG(m); @@ -1952,7 +1838,7 @@ int nd_newps(int mod,ND a) } 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)); + NEWRHist(r); SG(r) = SG(a); ndl_copy(HDL(a),DL(r)); nd_psh[nd_psn] = r; b = ndtondv(mod,a); len = LEN(b); @@ -1986,7 +1872,7 @@ int nd_newps_trace(int mod,ND nf,ND 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)); + NEWRHist(r); SG(r) = SG(nf); ndl_copy(HDL(nf),DL(r)); nd_psh[nd_psn] = r; nd_free(nf); nd_free(nfq); return nd_psn++; @@ -2016,18 +1902,12 @@ 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(); @@ -2037,11 +1917,9 @@ void nd_setup(int mod,NODE f) 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 ) - nd_ps[i] = a; - else - nd_psq[i] = a; + SG(r) = HTD(a); ndl_copy(HDL(a),DL(r)); + if ( mod ) nd_ps[i] = a; + else nd_psq[i] = a; nd_psh[i] = r; } } @@ -2070,18 +1948,12 @@ void nd_setup_trace(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(); @@ -2091,7 +1963,7 @@ void nd_setup_trace(int mod,NODE f) 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)); + SG(r) = HTD(a); ndl_copy(HDL(a),DL(r)); nd_psh[i] = r; } } @@ -2206,31 +2078,32 @@ void dltondl(int n,DL dl,unsigned int *r) int i; d = dl->d; - bzero(r,nd_wpd*sizeof(unsigned int)); + bzero(r,(nd_wpd+1)*sizeof(unsigned int)); 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)); + r[(n-1-i)/nd_epw+1] |= (d[i]<<((nd_epw-((n-1-i)%nd_epw)-1)*nd_bpe)); else for ( i = 0; i < n; i++ ) - r[i/nd_epw] |= d[i]<<((nd_epw-(i%nd_epw)-1)*nd_bpe); + r[i/nd_epw+1] |= d[i]<<((nd_epw-(i%nd_epw)-1)*nd_bpe); + TD(r) = ndl_td(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)) + d[i] = (ndl[(n-1-i)/nd_epw+1]>>((nd_epw-((n-1-i)%nd_epw)-1)*nd_bpe)) &((1<>((nd_epw-(i%nd_epw)-1)*nd_bpe)) + d[i] = (ndl[i/nd_epw+1]>>((nd_epw-(i%nd_epw)-1)*nd_bpe)) &((1<>((nd_epw-((n-1-i)%nd_epw)-1)*nd_bpe)) + (dl[(n-1-i)/nd_epw+1]>>((nd_epw-((n-1-i)%nd_epw)-1)*nd_bpe)) &((1<>((nd_epw-(i%nd_epw)-1)*nd_bpe)) + (dl[i/nd_epw+1]>>((nd_epw-(i%nd_epw)-1)*nd_bpe)) &((1<>"); } @@ -2342,9 +2210,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"); } @@ -2357,15 +2223,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]; } @@ -2391,10 +2255,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]; @@ -2412,8 +2274,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++ ) { @@ -2435,12 +2296,12 @@ void ndv_dehomogenize(NDV p) newnvar = nd_nvar-1; newwpd = newnvar/nd_epw+(newnvar%nd_epw?1:0); 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); + d = (unsigned int *)ALLOCA((newwpd+1)*sizeof(unsigned int)); + newadv = sizeof(struct oNMV)+newwpd*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)--; @@ -2463,9 +2324,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); @@ -2480,8 +2339,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) @@ -2489,8 +2347,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); @@ -2503,8 +2360,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; } @@ -2514,8 +2370,7 @@ void nd_free(ND p) { NM t,s; - if ( !p ) - return; + if ( !p ) return; t = BDY(p); while ( t ) { s = NEXT(t); @@ -2530,15 +2385,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; @@ -2588,7 +2442,7 @@ unsigned int *nd_compute_bound(ND p) 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; + t[i] = (d1[i/nd_epw+1]>>((nd_epw-(i%nd_epw)-1)*nd_bpe))&nd_mask0; return t; } @@ -2608,8 +2462,8 @@ void nd_setup_parameters() { nd_mask[nd_epw-i-1] = (nd_mask0<<(i*nd_bpe)); nd_mask1 |= (1<<(nd_bpe-1))<<(i*nd_bpe); } - nm_adv = sizeof(struct oNM)+(nd_wpd-1)*sizeof(unsigned int); - nmv_adv = sizeof(struct oNMV)+(nd_wpd-1)*sizeof(unsigned int); + nm_adv = sizeof(struct oNM)+nd_wpd*sizeof(unsigned int); + nmv_adv = sizeof(struct oNMV)+nd_wpd*sizeof(unsigned int); } /* mod < 0 => realloc nd_ps and pd_psq */ @@ -2624,18 +2478,12 @@ ND_pairs nd_reconstruct(int mod,int trace,ND_pairs d) 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; @@ -2643,26 +2491,22 @@ 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_dup(obpe,LCM(t),LCM(s)); } for ( i = 0; i < REDTAB_LEN; i++ ) { for ( mr0 = 0, r = nd_red[i]; r; r = NEXT(r) ) { NEXTRHist(mr0,mr); mr->index = r->index; SG(mr) = SG(r); - TD(mr) = TD(r); ndl_dup(obpe,DL(r),DL(mr)); } if ( mr0 ) NEXT(mr) = 0; @@ -2670,7 +2514,7 @@ ND_pairs nd_reconstruct(int mod,int trace,ND_pairs d) } 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_dup(obpe,DL(nd_psh[i]),DL(r)); nd_psh[i] = r; } if ( s0 ) NEXT(s) = 0; @@ -2690,33 +2534,24 @@ void nd_reconstruct_direct(int mod,NDV *ps,int len) 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; + _nm_free_list = 0; _ndp_free_list = 0; if ( mod != 0 ) - for ( i = len-1; i >= 0; i-- ) - ndv_realloc(ps[i],obpe,oadv); + for ( i = len-1; i >= 0; i-- ) ndv_realloc(ps[i],obpe,oadv); for ( i = 0; i < REDTAB_LEN; i++ ) { for ( mr0 = 0, r = nd_red[i]; r; r = NEXT(r) ) { NEXTRHist(mr0,mr); mr->index = r->index; SG(mr) = SG(r); - TD(mr) = TD(r); ndl_dup(obpe,DL(r),DL(mr)); } if ( mr0 ) NEXT(mr) = 0; @@ -2735,19 +2570,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 = 1; 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+1]>>((oepw-((n-1-i)%oepw)-1)*obpe)) &((1<>((oepw-(i%oepw)-1)*obpe)) + ei = (d[i/oepw+1]>>((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; @@ -2832,13 +2661,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; } } @@ -2848,8 +2674,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; @@ -2865,13 +2690,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) ) { @@ -2879,7 +2704,7 @@ 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; + TD(DL(mr)) = TD(DL(m))+td; ndl_add(DL(m),d,DL(mr)); } } else { @@ -2887,13 +2712,13 @@ 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; + TD(DL(mr)) = TD(DL(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; } } @@ -2908,20 +2733,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)); CQ(mr) = CQ(t); - TD(mr) = TD(t); ndl_copy(DL(t),DL(mr)); } BDY(p) = mr0; @@ -2935,15 +2755,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); } @@ -2959,13 +2774,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); } @@ -2983,8 +2796,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; @@ -2993,11 +2805,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); @@ -3012,18 +2821,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); @@ -3036,8 +2842,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) ) { @@ -3053,8 +2858,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) ) { @@ -3067,18 +2871,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; @@ -3106,15 +2898,20 @@ 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");