version 1.18, 2003/07/31 05:42:22 |
version 1.19, 2003/07/31 07:30:27 |
|
|
/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.17 2003/07/31 05:30:38 noro Exp $ */ |
/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.18 2003/07/31 05:42:22 noro Exp $ */ |
|
|
#include "ca.h" |
#include "ca.h" |
#include "inline.h" |
#include "inline.h" |
Line 65 typedef struct oND_pairs { |
|
Line 65 typedef struct oND_pairs { |
|
} *ND_pairs; |
} *ND_pairs; |
|
|
static unsigned int **nd_bound; |
static unsigned int **nd_bound; |
int nd_mod,nd_nvar; |
int nd_nvar; |
int is_rlex; |
int is_rlex; |
int nd_epw,nd_bpe,nd_wpd; |
int nd_epw,nd_bpe,nd_wpd; |
unsigned int nd_mask[32]; |
unsigned int nd_mask[32]; |
Line 139 void nd_free_private_storage(); |
|
Line 139 void nd_free_private_storage(); |
|
void _NM_alloc(); |
void _NM_alloc(); |
void _ND_alloc(); |
void _ND_alloc(); |
int ndl_td(unsigned int *d); |
int ndl_td(unsigned int *d); |
ND nd_add(ND p1,ND p2); |
ND nd_add(int mod,ND p1,ND p2); |
ND nd_add_q(ND p1,ND p2); |
ND nd_add_q(ND p1,ND p2); |
ND nd_mul_nm(int mod,ND p,NM m0); |
ND nd_mul_nm(int mod,ND p,NM m0); |
ND nd_mul_ind_nm(int mod,int index,NM m0); |
ND nd_mul_ind_nm(int mod,int index,NM m0); |
Line 156 void ndv_print(NDV p); |
|
Line 156 void ndv_print(NDV p); |
|
void ndv_print_q(NDV p); |
void ndv_print_q(NDV p); |
void ndp_print(ND_pairs d); |
void ndp_print(ND_pairs d); |
int nd_length(ND p); |
int nd_length(ND p); |
void nd_monic(ND p); |
void nd_monic(int mod,ND p); |
void nd_mul_c(ND p,int mul); |
void nd_mul_c(int mod,ND p,int mul); |
void nd_free_redlist(); |
void nd_free_redlist(); |
void nd_append_red(unsigned int *d,int td,int i); |
void nd_append_red(unsigned int *d,int td,int i); |
unsigned int *nd_compute_bound(ND p); |
unsigned int *nd_compute_bound(ND p); |
|
|
int nmv_len; |
int nmv_len; |
NDV ndv_red; |
NDV ndv_red; |
|
|
void ndv_mul_c(NDV p,int mul); |
void ndv_mul_c(int mod,NDV p,int mul); |
ND ndv_add(ND p1,NDV p2); |
ND ndv_add(int mod,ND p1,NDV p2); |
ND ndv_add_q(ND p1,NDV p2); |
ND ndv_add_q(ND p1,NDV p2); |
NDV ndtondv(int mod,ND p); |
NDV ndtondv(int mod,ND p); |
void ndv_mul_nm(int mod,NDV pv,NM m,NDV r); |
void ndv_mul_nm(int mod,NDV pv,NM m,NDV r); |
Line 659 INLINE int nd_find_reducer(ND g) |
|
Line 659 INLINE int nd_find_reducer(ND g) |
|
return -1; |
return -1; |
} |
} |
|
|
ND nd_add(ND p1,ND p2) |
ND nd_add(int mod,ND p1,ND p2) |
{ |
{ |
int n,c; |
int n,c; |
int t; |
int t; |
Line 680 ND nd_add(ND p1,ND p2) |
|
Line 680 ND nd_add(ND p1,ND p2) |
|
c = ndl_compare(DL(m1),DL(m2)); |
c = ndl_compare(DL(m1),DL(m2)); |
switch ( c ) { |
switch ( c ) { |
case 0: |
case 0: |
t = ((CM(m1))+(CM(m2))) - nd_mod; |
t = ((CM(m1))+(CM(m2))) - mod; |
if ( t < 0 ) |
if ( t < 0 ) |
t += nd_mod; |
t += mod; |
s = m1; m1 = NEXT(m1); |
s = m1; m1 = NEXT(m1); |
if ( t ) { |
if ( t ) { |
NEXTNM2(mr0,mr,s); CM(mr) = (t); |
NEXTNM2(mr0,mr,s); CM(mr) = (t); |
Line 814 int nd_nf(int mod,ND g,int full,ND *rp) |
|
Line 814 int nd_nf(int mod,ND g,int full,ND *rp) |
|
} |
} |
if ( mod ) { |
if ( mod ) { |
p = nd_ps[index]; |
p = nd_ps[index]; |
c1 = invm(HCM(p),nd_mod); c2 = nd_mod-HCM(g); |
c1 = invm(HCM(p),mod); c2 = mod-HCM(g); |
DMAR(c1,c2,0,nd_mod,c); CM(mul) = c; |
DMAR(c1,c2,0,mod,c); CM(mul) = c; |
ndv_mul_nm(mod,p,mul,ndv_red); |
ndv_mul_nm(mod,p,mul,ndv_red); |
g = ndv_add(g,ndv_red); |
g = ndv_add(mod,g,ndv_red); |
} else { |
} else { |
p = nd_ps[index]; |
p = nd_ps[index]; |
igcd_cofactor(HCQ(g),HCQ(p),&gcd,&cg,&cred); |
igcd_cofactor(HCQ(g),HCQ(p),&gcd,&cg,&cred); |
Line 878 PGeoBucket create_pbucket() |
|
Line 878 PGeoBucket create_pbucket() |
|
return g; |
return g; |
} |
} |
|
|
void add_pbucket(PGeoBucket g,ND d) |
void add_pbucket(int mod,PGeoBucket g,ND d) |
{ |
{ |
int l,k,m; |
int l,k,m; |
|
|
l = nd_length(d); |
l = nd_length(d); |
for ( k = 0, m = 1; l > m; k++, m <<= 2 ); |
for ( k = 0, m = 1; l > m; k++, m <<= 2 ); |
/* 4^(k-1) < l <= 4^k */ |
/* 4^(k-1) < l <= 4^k */ |
d = nd_add(g->body[k],d); |
d = nd_add(mod,g->body[k],d); |
for ( ; d && nd_length(d) > 1<<(2*k); k++ ) { |
for ( ; d && nd_length(d) > 1<<(2*k); k++ ) { |
g->body[k] = 0; |
g->body[k] = 0; |
d = nd_add(g->body[k+1],d); |
d = nd_add(int mod,g->body[k+1],d); |
} |
} |
g->body[k] = d; |
g->body[k] = d; |
g->m = MAX(g->m,k); |
g->m = MAX(g->m,k); |
} |
} |
|
|
int head_pbucket(PGeoBucket g) |
int head_pbucket(int mod,PGeoBucket g) |
{ |
{ |
int j,i,c,k,nv,sum; |
int j,i,c,k,nv,sum; |
unsigned int *di,*dj; |
unsigned int *di,*dj; |
Line 930 int head_pbucket(PGeoBucket g) |
|
Line 930 int head_pbucket(PGeoBucket g) |
|
dj = HDL(gj); |
dj = HDL(gj); |
sum = HCM(gj); |
sum = HCM(gj); |
} else if ( c == 0 ) { |
} else if ( c == 0 ) { |
sum = sum+HCM(gi)-nd_mod; |
sum = sum+HCM(gi)-mod; |
if ( sum < 0 ) |
if ( sum < 0 ) |
sum += nd_mod; |
sum += mod; |
g->body[i] = nd_remove_head(gi); |
g->body[i] = nd_remove_head(gi); |
} |
} |
} |
} |
Line 954 ND normalize_pbucket(PGeoBucket g) |
|
Line 954 ND normalize_pbucket(PGeoBucket g) |
|
|
|
r = 0; |
r = 0; |
for ( i = 0; i <= g->m; i++ ) |
for ( i = 0; i <= g->m; i++ ) |
r = nd_add(r,g->body[i]); |
r = nd_add(mod,r,g->body[i]); |
return r; |
return r; |
} |
} |
|
|
Line 1356 int nd_newps(int mod,ND a) |
|
Line 1356 int nd_newps(int mod,ND a) |
|
REALLOC((char *)nd_bound,nd_pslen*sizeof(unsigned int *)); |
REALLOC((char *)nd_bound,nd_pslen*sizeof(unsigned int *)); |
} |
} |
if ( mod ) |
if ( mod ) |
nd_monic(a); |
nd_monic(mod,a); |
else |
else |
nd_removecont(a); |
nd_removecont(a); |
nd_bound[nd_psn] = nd_compute_bound(a); |
nd_bound[nd_psn] = nd_compute_bound(a); |
Line 1413 NODE nd_setup(int mod,NODE f) |
|
Line 1413 NODE nd_setup(int mod,NODE f) |
|
for ( i = 0; i < nd_psn; i++, f = NEXT(f) ) { |
for ( i = 0; i < nd_psn; i++, f = NEXT(f) ) { |
nd_ps[i] = dptondv(mod,(DP)BDY(f)); |
nd_ps[i] = dptondv(mod,(DP)BDY(f)); |
if ( mod ) |
if ( mod ) |
ndv_mul_c(nd_ps[i],invm(HCM(nd_ps[i]),nd_mod)); |
ndv_mul_c(mod,nd_ps[i],invm(HCM(nd_ps[i]),mod)); |
else |
else |
ndv_removecont(nd_ps[i]); |
ndv_removecont(nd_ps[i]); |
len = MAX(len,LEN(nd_ps[i])); |
len = MAX(len,LEN(nd_ps[i])); |
Line 1455 void nd_gr(LIST f,LIST v,int m,struct order_spec *ord, |
|
Line 1455 void nd_gr(LIST f,LIST v,int m,struct order_spec *ord, |
|
error("nd_gr : unsupported order"); |
error("nd_gr : unsupported order"); |
} |
} |
initd(ord); |
initd(ord); |
nd_mod = m; |
|
for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) { |
for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) { |
ptod(CO,vv,(P)BDY(t),&b); |
ptod(CO,vv,(P)BDY(t),&b); |
if ( m ) |
if ( m ) |
Line 1671 void ndv_removecont(NDV p) |
|
Line 1670 void ndv_removecont(NDV p) |
|
} |
} |
} |
} |
|
|
void nd_monic(ND p) |
void nd_monic(int mod,ND p) |
{ |
{ |
if ( !p ) |
if ( !p ) |
return; |
return; |
else |
else |
nd_mul_c(p,invm(HCM(p),nd_mod)); |
nd_mul_c(mod,p,invm(HCM(p),mod)); |
} |
} |
|
|
void nd_mul_c(ND p,int mul) |
void nd_mul_c(int mod,ND p,int mul) |
{ |
{ |
NM m; |
NM m; |
int c,c1; |
int c,c1; |
Line 1688 void nd_mul_c(ND p,int mul) |
|
Line 1687 void nd_mul_c(ND p,int mul) |
|
return; |
return; |
for ( m = BDY(p); m; m = NEXT(m) ) { |
for ( m = BDY(p); m; m = NEXT(m) ) { |
c1 = CM(m); |
c1 = CM(m); |
DMAR(c1,mul,0,nd_mod,c); |
DMAR(c1,mul,0,mod,c); |
CM(m) = c; |
CM(m) = c; |
} |
} |
} |
} |
Line 1959 int nd_sp(int mod,ND_pairs p,ND *rp) |
|
Line 1958 int nd_sp(int mod,ND_pairs p,ND *rp) |
|
ndv_mul_nm(mod,p2,m,ndv_red); |
ndv_mul_nm(mod,p2,m,ndv_red); |
FREENM(m); |
FREENM(m); |
if ( mod ) |
if ( mod ) |
*rp = ndv_add(t1,ndv_red); |
*rp = ndv_add(mod,t1,ndv_red); |
else |
else |
*rp = ndv_add_q(t1,ndv_red); |
*rp = ndv_add_q(t1,ndv_red); |
return 1; |
return 1; |
} |
} |
|
|
void ndv_mul_c(NDV p,int mul) |
void ndv_mul_c(int mod,NDV p,int mul) |
{ |
{ |
NMV m; |
NMV m; |
int c,c1,len,i; |
int c,c1,len,i; |
Line 1975 void ndv_mul_c(NDV p,int mul) |
|
Line 1974 void ndv_mul_c(NDV p,int mul) |
|
len = LEN(p); |
len = LEN(p); |
for ( m = BDY(p), i = 0; i < len; i++, NMV_ADV(m) ) { |
for ( m = BDY(p), i = 0; i < len; i++, NMV_ADV(m) ) { |
c1 = CM(m); |
c1 = CM(m); |
DMAR(c1,mul,0,nd_mod,c); |
DMAR(c1,mul,0,mod,c); |
CM(m) = c; |
CM(m) = c; |
} |
} |
} |
} |
Line 2011 void ndv_mul_nm(int mod,NDV p,NM m0,NDV r) |
|
Line 2010 void ndv_mul_nm(int mod,NDV p,NM m0,NDV r) |
|
if ( mod ) { |
if ( mod ) { |
c = CM(m0); |
c = CM(m0); |
for ( ; len > 0; len--, NMV_ADV(m), NMV_ADV(mr) ) { |
for ( ; len > 0; len--, NMV_ADV(m), NMV_ADV(mr) ) { |
c1 = CM(m); DMAR(c1,c,0,nd_mod,c2); CM(mr) = c2; |
c1 = CM(m); DMAR(c1,c,0,mod,c2); CM(mr) = c2; |
TD(mr) = TD(m)+td; ndl_add(DL(m),d,DL(mr)); |
TD(mr) = TD(m)+td; ndl_add(DL(m),d,DL(mr)); |
} |
} |
} else { |
} else { |
Line 2048 ND ndv_mul_nm_create(int mod,NDV p,NM m0) |
|
Line 2047 ND ndv_mul_nm_create(int mod,NDV p,NM m0) |
|
for ( i = 0; i < len; i++, NMV_ADV(m) ) { |
for ( i = 0; i < len; i++, NMV_ADV(m) ) { |
NEXTNM(mr0,mr); |
NEXTNM(mr0,mr); |
c1 = CM(m); |
c1 = CM(m); |
DMAR(c1,c,0,nd_mod,c2); |
DMAR(c1,c,0,mod,c2); |
CM(mr) = c2; |
CM(mr) = c2; |
TD(mr) = TD(m)+td; |
TD(mr) = TD(m)+td; |
ndl_add(DL(m),d,DL(mr)); |
ndl_add(DL(m),d,DL(mr)); |
Line 2069 ND ndv_mul_nm_create(int mod,NDV p,NM m0) |
|
Line 2068 ND ndv_mul_nm_create(int mod,NDV p,NM m0) |
|
} |
} |
} |
} |
|
|
ND ndv_add(ND p1,NDV p2) |
ND ndv_add(int mod,ND p1,NDV p2) |
{ |
{ |
register NM prev,cur,new; |
register NM prev,cur,new; |
int c,c1,c2,t,td,td2,mul,len,i; |
int c,c1,c2,t,td,td2,mul,len,i; |
Line 2097 ND ndv_add(ND p1,NDV p2) |
|
Line 2096 ND ndv_add(ND p1,NDV p2) |
|
else c = ndl_compare(DL(cur),DL(m2)); |
else c = ndl_compare(DL(cur),DL(m2)); |
switch ( c ) { |
switch ( c ) { |
case 0: |
case 0: |
t = CM(m2)+CM(cur)-nd_mod; |
t = CM(m2)+CM(cur)-mod; |
if ( t < 0 ) t += nd_mod; |
if ( t < 0 ) t += mod; |
if ( t ) CM(cur) = t; |
if ( t ) CM(cur) = t; |
else if ( !prev ) { |
else if ( !prev ) { |
head = NEXT(cur); FREENM(cur); cur = head; |
head = NEXT(cur); FREENM(cur); cur = head; |