=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/dist.c,v retrieving revision 1.48 retrieving revision 1.51 diff -u -p -r1.48 -r1.51 --- OpenXM_contrib2/asir2000/engine/dist.c 2014/08/19 06:35:01 1.48 +++ OpenXM_contrib2/asir2000/engine/dist.c 2015/09/24 04:43:13 1.51 @@ -45,7 +45,7 @@ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. * - * $OpenXM: OpenXM_contrib2/asir2000/engine/dist.c,v 1.47 2013/12/20 02:02:24 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/engine/dist.c,v 1.50 2014/10/10 09:02:25 noro Exp $ */ #include "ca.h" @@ -71,6 +71,9 @@ int (*cmpdl)()=cmpdl_revgradlex; int (*cmpdl_tie_breaker)(); int (*primitive_cmpdl[3])() = {cmpdl_revgradlex,cmpdl_gradlex,cmpdl_lex}; +Obj current_top_weight; +int current_top_weight_len; + int do_weyl; int dp_nelim,dp_fcoeffs; @@ -124,9 +127,17 @@ int has_sfcoef_p(P f) } } -extern Obj current_top_weight; -int current_top_weight_len; +extern Obj nd_top_weight; +void reset_top_weight() +{ + cmpdl = cmpdl_tie_breaker; + cmpdl_tie_breaker = 0; + nd_top_weight = 0; + current_top_weight = 0; + current_top_weight_len = 0; +} + void initd(struct order_spec *spec) { int len,i,k,row; @@ -181,7 +192,7 @@ void initd(struct order_spec *spec) cmpdl_tie_breaker = cmpdl; cmpdl = cmpdl_top_weight; if ( OID(current_top_weight) == O_VECT ) { - mat = (Q **)&BDY((MAT)current_top_weight); + mat = (Q **)&BDY((VECT)current_top_weight); row = 1; } else { mat = (Q **)BDY((MAT)current_top_weight); @@ -852,6 +863,54 @@ void weyl_muld(VL vl,DP p1,DP p2,DP *pr) bzero(w,l*sizeof(MP)); *pr = s; } +} + +void actm(VL vl,int nv,MP m1,MP m2,DP *pr) +{ + DL d1,d2,d; + int n2,i,j,k; + Q jq,c,c1; + MP m; + P t; + + d1 = m1->dl; + d2 = m2->dl; + for ( i = 0; i < nv; i++ ) + if ( d1->d[i] > d2->d[i] ) { + *pr = 0; return; + } + NEWDL(d,nv); + c = ONE; + for ( i = 0; i < nv; i++ ) { + for ( j = d2->d[i], k = d1->d[i]; k > 0; k--, j-- ) { + STOQ(j,jq); mulq(c,jq,&c1); c = c1; + } + d->d[i] = d2->d[i]-d1->d[i]; + } + mulp(vl,C(m1),C(m2),&t); + NEWMP(m); + mulp(vl,(P)c,t,&C(m)); + m->dl = d; + MKDP(nv,m,*pr); +} + +void weyl_actd(VL vl,DP p1,DP p2,DP *pr) +{ + int n; + MP m1,m2; + DP d,r,s; + + if ( !p1 || !p2 ) *pr = 0; + else { + n = NV(p1); + r = 0; + for ( m1 = BDY(p1); m1; m1 = NEXT(m1) ) + for ( m2 = BDY(p2); m2; m2 = NEXT(m2) ) { + actm(vl,n,m1,m2,&d); + addd(vl,r,d,&s); r = s; + } + *pr = r; + } } /* monomial * polynomial */