version 1.2, 2000/04/05 08:32:17 |
version 1.4, 2000/04/25 04:07:59 |
|
|
/* $OpenXM: OpenXM_contrib2/asir2000/engine/dist.c,v 1.1.1.1 1999/12/03 07:39:08 noro Exp $ */ |
/* $OpenXM: OpenXM_contrib2/asir2000/engine/dist.c,v 1.3 2000/04/13 06:01:02 noro Exp $ */ |
#include "ca.h" |
#include "ca.h" |
|
|
#define NV(p) ((p)->nv) |
#define NV(p) ((p)->nv) |
|
|
} |
} |
} |
} |
|
|
|
/* |
|
* destructive merge of two list |
|
* |
|
* p1, p2 : list of DL |
|
* return : a merged list |
|
*/ |
|
|
|
NODE symb_merge(m1,m2,n) |
|
NODE m1,m2; |
|
int n; |
|
{ |
|
NODE top,prev,cur,m,t; |
|
|
|
if ( !m1 ) |
|
return m2; |
|
else if ( !m2 ) |
|
return m1; |
|
else { |
|
switch ( (*cmpdl)(n,(DL)BDY(m1),(DL)BDY(m2)) ) { |
|
case 0: |
|
top = m1; m = NEXT(m2); |
|
break; |
|
case 1: |
|
top = m1; m = m2; |
|
break; |
|
case -1: |
|
top = m2; m = m1; |
|
break; |
|
} |
|
prev = top; cur = NEXT(top); |
|
/* BDY(prev) > BDY(m) always holds */ |
|
while ( cur && m ) { |
|
switch ( (*cmpdl)(n,(DL)BDY(cur),(DL)BDY(m)) ) { |
|
case 0: |
|
m = NEXT(m); |
|
prev = cur; cur = NEXT(cur); |
|
break; |
|
case 1: |
|
t = NEXT(cur); NEXT(cur) = m; m = t; |
|
prev = cur; cur = NEXT(cur); |
|
break; |
|
case -1: |
|
NEXT(prev) = m; m = cur; |
|
prev = NEXT(prev); cur = NEXT(prev); |
|
break; |
|
} |
|
} |
|
if ( !cur ) |
|
NEXT(prev) = m; |
|
return top; |
|
} |
|
} |
|
|
void subd(vl,p1,p2,pr) |
void subd(vl,p1,p2,pr) |
VL vl; |
VL vl; |
DP p1,p2,*pr; |
DP p1,p2,*pr; |
|
|
{ |
{ |
MP m; |
MP m; |
DP s,t,u; |
DP s,t,u; |
|
int i,l; |
|
MP *w; |
|
|
if ( !p1 || !p2 ) |
if ( !p1 || !p2 ) |
*pr = 0; |
*pr = 0; |
|
|
else if ( OID(p2) <= O_P ) |
else if ( OID(p2) <= O_P ) |
muldc(vl,p1,(P)p2,pr); |
muldc(vl,p1,(P)p2,pr); |
else { |
else { |
for ( m = BDY(p2), s = 0; m; m = NEXT(m) ) { |
for ( m = BDY(p2), l = 0; m; m = NEXT(m), l++ ); |
muldm(vl,p1,m,&t); addd(vl,s,t,&u); s = u; |
w = ALLOCA(l*sizeof(MP)); |
|
for ( m = BDY(p2), i = 0; i < l; m = NEXT(m), i++ ) |
|
w[i] = m; |
|
for ( s = 0, i = l-1; i >= 0; i-- ) { |
|
muldm(vl,p1,w[i],&t); addd(vl,s,t,&u); s = u; |
} |
} |
*pr = s; |
*pr = s; |
} |
} |
|
|
{ |
{ |
MP m; |
MP m; |
DP s,t,u; |
DP s,t,u; |
|
int i,l; |
|
MP *w; |
|
|
if ( !p1 || !p2 ) |
if ( !p1 || !p2 ) |
*pr = 0; |
*pr = 0; |
|
|
else if ( OID(p2) <= O_P ) |
else if ( OID(p2) <= O_P ) |
muldc(vl,p1,(P)p2,pr); |
muldc(vl,p1,(P)p2,pr); |
else { |
else { |
for ( m = BDY(p2), s = 0; m; m = NEXT(m) ) { |
for ( m = BDY(p2), l = 0; m; m = NEXT(m), l++ ); |
weyl_muldm(vl,p1,m,&t); addd(vl,s,t,&u); s = u; |
w = ALLOCA(l*sizeof(MP)); |
|
for ( m = BDY(p2), i = 0; i < l; m = NEXT(m), i++ ) |
|
w[i] = m; |
|
for ( s = 0, i = l-1; i >= 0; i-- ) { |
|
weyl_muldm(vl,p1,w[i],&t); addd(vl,s,t,&u); s = u; |
} |
} |
*pr = s; |
*pr = s; |
} |
} |
|
|
{ |
{ |
DP r,t,t1; |
DP r,t,t1; |
MP m; |
MP m; |
int n; |
int n,l,i; |
|
MP *w; |
|
|
if ( !p ) |
if ( !p ) |
*pr = 0; |
*pr = 0; |
else { |
else { |
for ( r = 0, m = BDY(p), n = NV(p); m; m = NEXT(m) ) { |
for ( m = BDY(p), l = 0; m; m = NEXT(m), l++ ); |
weyl_mulmm(vl,m,m0,n,&t); |
w = ALLOCA(l*sizeof(MP)); |
|
for ( m = BDY(p), i = 0; i < l; m = NEXT(m), i++ ) |
|
w[i] = m; |
|
for ( r = 0, i = l-1, n = NV(p); i >= 0; i-- ) { |
|
weyl_mulmm(vl,w[i],m0,n,&t); |
addd(vl,r,t,&t1); r = t1; |
addd(vl,r,t,&t1); r = t1; |
} |
} |
if ( r ) |
if ( r ) |