version 1.176, 2009/09/24 07:13:00 |
version 1.181, 2010/02/05 05:18:38 |
|
|
/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.175 2009/09/09 08:13:24 noro Exp $ */ |
/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.180 2010/02/05 04:24:00 noro Exp $ */ |
|
|
#include "nd.h" |
#include "nd.h" |
|
|
Line 2594 int ndv_newps(int m,NDV a,NDV aq) |
|
Line 2594 int ndv_newps(int m,NDV a,NDV aq) |
|
} |
} |
|
|
/* nd_tracelist = [[0,index,div],...,[nd_psn-1,index,div]] */ |
/* nd_tracelist = [[0,index,div],...,[nd_psn-1,index,div]] */ |
|
/* return 1 if success, 0 if failure (HC(a mod p)) */ |
|
|
void ndv_setup(int mod,int trace,NODE f,int dont_sort,int dont_removecont) |
int ndv_setup(int mod,int trace,NODE f,int dont_sort,int dont_removecont) |
{ |
{ |
int i,j,td,len,max; |
int i,j,td,len,max; |
NODE s,s0,f0,tn; |
NODE s,s0,f0,tn; |
Line 2649 void ndv_setup(int mod,int trace,NODE f,int dont_sort, |
|
Line 2650 void ndv_setup(int mod,int trace,NODE f,int dont_sort, |
|
register_hcf(a); |
register_hcf(a); |
am = nd_ps[i] = ndv_dup(mod,a); |
am = nd_ps[i] = ndv_dup(mod,a); |
ndv_mod(mod,am); |
ndv_mod(mod,am); |
|
if ( DL_COMPARE(HDL(am),HDL(a)) ) |
|
return 0; |
ndv_removecont(mod,am); |
ndv_removecont(mod,am); |
} else { |
} else { |
a = nd_ps[i] = ndv_dup(mod,w[i].p); |
a = nd_ps[i] = ndv_dup(mod,w[i].p); |
Line 2675 void ndv_setup(int mod,int trace,NODE f,int dont_sort, |
|
Line 2678 void ndv_setup(int mod,int trace,NODE f,int dont_sort, |
|
} |
} |
} |
} |
if ( nd_gentrace && nd_tracelist ) NEXT(tn) = 0; |
if ( nd_gentrace && nd_tracelist ) NEXT(tn) = 0; |
|
return 1; |
} |
} |
|
|
struct order_spec *append_block(struct order_spec *spec, |
struct order_spec *append_block(struct order_spec *spec, |
Line 2841 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
Line 2845 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
} |
} |
nd_init_ord(ord); |
nd_init_ord(ord); |
mrank = 0; |
mrank = 0; |
for ( t = BDY(f), max = 0; t; t = NEXT(t) ) |
for ( t = BDY(f), max = 1; t; t = NEXT(t) ) |
for ( tv = vv; tv; tv = NEXT(tv) ) { |
for ( tv = vv; tv; tv = NEXT(tv) ) { |
if ( nd_module ) { |
if ( nd_module ) { |
s = BDY((LIST)BDY(t)); |
s = BDY((LIST)BDY(t)); |
Line 2971 void nd_gr_postproc(LIST f,LIST v,int m,struct order_s |
|
Line 2975 void nd_gr_postproc(LIST f,LIST v,int m,struct order_s |
|
nvar += nalg; |
nvar += nalg; |
} |
} |
nd_init_ord(ord); |
nd_init_ord(ord); |
for ( t = BDY(f), max = 0; t; t = NEXT(t) ) |
for ( t = BDY(f), max = 1; t; t = NEXT(t) ) |
for ( tv = vv; tv; tv = NEXT(tv) ) { |
for ( tv = vv; tv; tv = NEXT(tv) ) { |
e = getdeg(tv->v,(P)BDY(t)); |
e = getdeg(tv->v,(P)BDY(t)); |
max = MAX(e,max); |
max = MAX(e,max); |
Line 3083 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
Line 3087 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
m = trace > 1 ? trace : get_lprime(mindex); |
m = trace > 1 ? trace : get_lprime(mindex); |
nd_init_ord(ord); |
nd_init_ord(ord); |
mrank = 0; |
mrank = 0; |
for ( t = BDY(f), max = 0; t; t = NEXT(t) ) |
for ( t = BDY(f), max = 1; t; t = NEXT(t) ) |
for ( tv = vv; tv; tv = NEXT(tv) ) { |
for ( tv = vv; tv; tv = NEXT(tv) ) { |
if ( nd_module ) { |
if ( nd_module ) { |
s = BDY((LIST)BDY(t)); |
s = BDY((LIST)BDY(t)); |
Line 3135 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
Line 3139 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
while ( 1 ) { |
while ( 1 ) { |
if ( Demand ) |
if ( Demand ) |
nd_demand = 1; |
nd_demand = 1; |
ndv_setup(m,1,fd0,0,0); |
|
if ( nd_gentrace ) { |
if ( nd_gentrace ) { |
MKLIST(l1,nd_tracelist); MKNODE(nd_alltracelist,l1,0); |
MKLIST(l1,nd_tracelist); MKNODE(nd_alltracelist,l1,0); |
} |
} |
cand = f4?nd_f4_trace(m,&perm):nd_gb_trace(m,ishomo || homo,&perm); |
ret = ndv_setup(m,1,fd0,0,0); |
if ( !cand ) { |
if ( ret ) |
|
cand = f4?nd_f4_trace(m,&perm):nd_gb_trace(m,ishomo || homo,&perm); |
|
if ( !ret || !cand ) { |
/* failure */ |
/* failure */ |
if ( trace > 1 ) { *rp = 0; return; } |
if ( trace > 1 ) { *rp = 0; return; } |
else m = get_lprime(++mindex); |
else m = get_lprime(++mindex); |
Line 3443 void ndv_homogenize(NDV p,int obpe,int oadv,EPOS oepos |
|
Line 3448 void ndv_homogenize(NDV p,int obpe,int oadv,EPOS oepos |
|
NMV m,mr0,mr,t; |
NMV m,mr0,mr,t; |
|
|
len = p->len; |
len = p->len; |
for ( m = BDY(p), i = 0, max = 0; i < len; NMV_OADV(m), i++ ) |
for ( m = BDY(p), i = 0, max = 1; i < len; NMV_OADV(m), i++ ) |
max = MAX(max,TD(DL(m))); |
max = MAX(max,TD(DL(m))); |
mr0 = nmv_adv>oadv?(NMV)REALLOC(BDY(p),len*nmv_adv):BDY(p); |
mr0 = nmv_adv>oadv?(NMV)REALLOC(BDY(p),len*nmv_adv):BDY(p); |
m = (NMV)((char *)mr0+(len-1)*oadv); |
m = (NMV)((char *)mr0+(len-1)*oadv); |
Line 4047 void weyl_mul_nm_nmv(int n,int mod,NM m0,NMV m1,NM *ta |
|
Line 4052 void weyl_mul_nm_nmv(int n,int mod,NM m0,NMV m1,NM *ta |
|
NEWNM(m); d = DL(m); |
NEWNM(m); d = DL(m); |
if ( mod ) { |
if ( mod ) { |
c0 = CM(m0); c1 = CM(m1); DMAR(c0,c1,0,mod,c); CM(m) = c; |
c0 = CM(m0); c1 = CM(m1); DMAR(c0,c1,0,mod,c); CM(m) = c; |
} else |
} else if ( nd_vc ) |
|
mulp(nd_vc,CP(m0),CP(m1),&CP(m)); |
|
else |
mulq(CQ(m0),CQ(m1),&CQ(m)); |
mulq(CQ(m0),CQ(m1),&CQ(m)); |
for ( i = 0; i < nd_wpd; i++ ) d[i] = 0; |
for ( i = 0; i < nd_wpd; i++ ) d[i] = 0; |
homo = n&1 ? 1 : 0; |
homo = n&1 ? 1 : 0; |
Line 4102 void weyl_mul_nm_nmv(int n,int mod,NM m0,NMV m1,NM *ta |
|
Line 4109 void weyl_mul_nm_nmv(int n,int mod,NM m0,NMV m1,NM *ta |
|
ndl_addto(DL(tab[u]),d); |
ndl_addto(DL(tab[u]),d); |
if ( mod ) { |
if ( mod ) { |
c0 = CM(tab[u]); DMAR(c0,c,0,mod,c1); CM(tab[u]) = c1; |
c0 = CM(tab[u]); DMAR(c0,c,0,mod,c1); CM(tab[u]) = c1; |
} else { |
} else if ( nd_vc ) |
|
mulp(nd_vc,CP(tab[u]),(P)q,&CP(tab[u])); |
|
else { |
mulq(CQ(tab[u]),q,&q1); CQ(tab[u]) = q1; |
mulq(CQ(tab[u]),q,&q1); CQ(tab[u]) = q1; |
} |
} |
} |
} |
Line 4114 void weyl_mul_nm_nmv(int n,int mod,NM m0,NMV m1,NM *ta |
|
Line 4123 void weyl_mul_nm_nmv(int n,int mod,NM m0,NMV m1,NM *ta |
|
ndl_add(DL(tab[u]),d,DL(t)); |
ndl_add(DL(tab[u]),d,DL(t)); |
if ( mod ) { |
if ( mod ) { |
c0 = CM(tab[u]); DMAR(c0,c,0,mod,c1); CM(t) = c1; |
c0 = CM(tab[u]); DMAR(c0,c,0,mod,c1); CM(t) = c1; |
} else |
} else if ( nd_vc ) |
|
mulp(nd_vc,CP(tab[u]),(P)q,&CP(t)); |
|
else |
mulq(CQ(tab[u]),q,&CQ(t)); |
mulq(CQ(tab[u]),q,&CQ(t)); |
*p = t; |
*p = t; |
} |
} |
Line 4903 void nd_nf_p(P f,LIST g,LIST v,int m,struct order_spec |
|
Line 4914 void nd_nf_p(P f,LIST g,LIST v,int m,struct order_spec |
|
for ( nvar = 0, tv = vv; tv; tv = NEXT(tv), nvar++ ); |
for ( nvar = 0, tv = vv; tv; tv = NEXT(tv), nvar++ ); |
|
|
/* get the degree bound */ |
/* get the degree bound */ |
for ( t = BDY(g), max = 0; t; t = NEXT(t) ) |
for ( t = BDY(g), max = 1; t; t = NEXT(t) ) |
for ( tv = vv; tv; tv = NEXT(tv) ) { |
for ( tv = vv; tv; tv = NEXT(tv) ) { |
e = getdeg(tv->v,(P)BDY(t)); |
e = getdeg(tv->v,(P)BDY(t)); |
max = MAX(e,max); |
max = MAX(e,max); |
Line 6498 void nd_det(int mod,MAT f,P *rp) |
|
Line 6509 void nd_det(int mod,MAT f,P *rp) |
|
m = (pointer **)w; |
m = (pointer **)w; |
} |
} |
|
|
for ( i = 0, max = 0; i < n; i++ ) |
for ( i = 0, max = 1; i < n; i++ ) |
for ( j = 0; j < n; j++ ) |
for ( j = 0; j < n; j++ ) |
for ( tv = fv; tv; tv = NEXT(tv) ) { |
for ( tv = fv; tv; tv = NEXT(tv) ) { |
e = getdeg(tv->v,(P)m[i][j]); |
e = getdeg(tv->v,(P)m[i][j]); |
Line 6506 void nd_det(int mod,MAT f,P *rp) |
|
Line 6517 void nd_det(int mod,MAT f,P *rp) |
|
} |
} |
nd_setup_parameters(nvar,max); |
nd_setup_parameters(nvar,max); |
dm = (NDV **)almat_pointer(n,n); |
dm = (NDV **)almat_pointer(n,n); |
for ( i = 0, max = 0; i < n; i++ ) |
for ( i = 0, max = 1; i < n; i++ ) |
for ( j = 0; j < n; j++ ) { |
for ( j = 0; j < n; j++ ) { |
dm[i][j] = ptondv(CO,fv,m[i][j]); |
dm[i][j] = ptondv(CO,fv,m[i][j]); |
if ( mod ) ndv_mod(mod,dm[i][j]); |
if ( mod ) ndv_mod(mod,dm[i][j]); |