version 1.119, 2004/12/06 09:29:34 |
version 1.120, 2004/12/07 15:15:52 |
|
|
/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.118 2004/12/04 09:39:27 noro Exp $ */ |
/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.119 2004/12/06 09:29:34 noro Exp $ */ |
|
|
#include "nd.h" |
#include "nd.h" |
|
|
Line 2214 void ndv_setup(int mod,int trace,NODE f) |
|
Line 2214 void ndv_setup(int mod,int trace,NODE f) |
|
struct order_spec *append_block(struct order_spec *spec, |
struct order_spec *append_block(struct order_spec *spec, |
int nv,int nalg,int ord); |
int nv,int nalg,int ord); |
|
|
|
void preprocess_algcoef(VL vv,VL av,struct order_spec *ord,LIST f, |
|
struct order_spec **ord1p,LIST *f1p,NODE *alistp) |
|
{ |
|
NODE alist,t,s,r0,r; |
|
VL tv; |
|
P poly; |
|
DP d; |
|
Alg alpha,dp; |
|
DAlg inv,da,hc; |
|
MP m; |
|
int i,nvar,nalg; |
|
NumberField nf; |
|
LIST f1,f2; |
|
struct order_spec *current_spec; |
|
|
|
for ( nvar = 0, tv = vv; tv; tv = NEXT(tv), nvar++); |
|
for ( nalg = 0, tv = av; tv; tv = NEXT(tv), nalg++); |
|
|
|
for ( alist = 0, tv = av; tv; tv = NEXT(tv) ) { |
|
NEXTNODE(alist,t); MKV(tv->v,poly); |
|
MKAlg(poly,alpha); BDY(t) = (pointer)alpha; |
|
tv->v = tv->v->priv; |
|
} |
|
NEXT(t) = 0; |
|
|
|
/* simplification, makeing polynomials monic */ |
|
setfield_dalg(alist); |
|
obj_algtodalg(f,&f1); |
|
for ( t = BDY(f); t; t = NEXT(t) ) { |
|
initd(ord); ptod(vv,vv,(P)BDY(t),&d); |
|
hc = (DAlg)BDY(d)->c; |
|
if ( NID(hc) == N_DA ) { |
|
invdalg(hc,&inv); |
|
for ( m = BDY(d); m; m = NEXT(m) ) { |
|
muldalg(inv,(DAlg)m->c,&da); m->c = (P)da; |
|
} |
|
} |
|
initd(ord); dtop(vv,vv,d,&poly); BDY(f) = (pointer)poly; |
|
} |
|
obj_dalgtoalg(f1,&f); |
|
|
|
/* append alg vars to the var list */ |
|
for ( tv = vv; NEXT(tv); tv = NEXT(tv) ); |
|
NEXT(tv) = av; |
|
|
|
/* append a block to ord */ |
|
*ord1p = append_block(ord,nvar,nalg,2); |
|
|
|
/* create generator list */ |
|
nf = get_numberfield(); |
|
for ( i = nalg-1, t = BDY(f); i >= 0; i-- ) { |
|
MKAlg(nf->defpoly[i],dp); |
|
MKNODE(s,dp,t); t = s; |
|
} |
|
MKLIST(f1,t); |
|
*alistp = alist; |
|
algobjtorat(f1,f1p); |
|
} |
|
|
void nd_gr(LIST f,LIST v,int m,int f4,struct order_spec *ord,LIST *rp) |
void nd_gr(LIST f,LIST v,int m,int f4,struct order_spec *ord,LIST *rp) |
{ |
{ |
VL tv,fv,vv,vc,av; |
VL tv,fv,vv,vc,av; |
Line 2226 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
Line 2285 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
LIST f1,f2; |
LIST f1,f2; |
Obj obj; |
Obj obj; |
NumberField nf; |
NumberField nf; |
|
struct order_spec *ord1; |
|
|
if ( !m && Demand ) nd_demand = 1; |
if ( !m && Demand ) nd_demand = 1; |
else nd_demand = 0; |
else nd_demand = 0; |
Line 2250 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
Line 2310 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
nd_nalg = nalg; |
nd_nalg = nalg; |
/* #i -> t#i */ |
/* #i -> t#i */ |
if ( nalg ) { |
if ( nalg ) { |
for ( alist = 0, tv = av; tv; tv = NEXT(tv) ) { |
preprocess_algcoef(vv,av,ord,f,&ord1,&f1,&alist); |
NEXTNODE(alist,t); MKV(tv->v,p); |
ord = ord1; |
MKAlg(p,alpha); BDY(t) = (pointer)alpha; |
f = f1; |
tv->v = tv->v->priv; |
|
} |
|
NEXT(t) = 0; |
|
for ( tv = vv; NEXT(tv); tv = NEXT(tv) ); |
|
NEXT(tv) = av; |
|
ord = append_block(ord,nvar,nalg,2); |
|
nvar += nalg; |
|
setfield_dalg(alist); |
|
nf = get_numberfield(); |
|
for ( i = nalg-1, t = BDY(f); i >= 0; i-- ) { |
|
MKAlg(nf->defpoly[i],dp); |
|
MKNODE(s,dp,t); t = s; |
|
} |
|
MKLIST(f1,t); |
|
algobjtorat(f1,&f2); f = f2; |
|
} |
} |
|
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 = 0; t; t = NEXT(t) ) |
Line 2311 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
Line 2357 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
|
|
void nd_gr_trace(LIST f,LIST v,int trace,int homo,struct order_spec *ord,LIST *rp) |
void nd_gr_trace(LIST f,LIST v,int trace,int homo,struct order_spec *ord,LIST *rp) |
{ |
{ |
struct order_spec *ord1; |
|
VL tv,fv,vv,vc,av; |
VL tv,fv,vv,vc,av; |
NODE fd,fd0,in0,in,r,r0,t,s,cand,alist; |
NODE fd,fd0,in0,in,r,r0,t,s,cand,alist; |
int m,nocheck,nvar,mindex,e,max; |
int m,nocheck,nvar,mindex,e,max; |
Line 2325 void nd_gr_trace(LIST f,LIST v,int trace,int homo,stru |
|
Line 2370 void nd_gr_trace(LIST f,LIST v,int trace,int homo,stru |
|
LIST f1,f2; |
LIST f1,f2; |
Obj obj; |
Obj obj; |
NumberField nf; |
NumberField nf; |
|
struct order_spec *ord1; |
|
|
get_vars((Obj)f,&fv); pltovl(v,&vv); |
get_vars((Obj)f,&fv); pltovl(v,&vv); |
for ( nvar = 0, tv = vv; tv; tv = NEXT(tv), nvar++ ); |
for ( nvar = 0, tv = vv; tv; tv = NEXT(tv), nvar++ ); |
Line 2342 void nd_gr_trace(LIST f,LIST v,int trace,int homo,stru |
|
Line 2388 void nd_gr_trace(LIST f,LIST v,int trace,int homo,stru |
|
nd_nalg = nalg; |
nd_nalg = nalg; |
/* #i -> t#i */ |
/* #i -> t#i */ |
if ( nalg ) { |
if ( nalg ) { |
for ( alist = 0, tv = av; tv; tv = NEXT(tv) ) { |
preprocess_algcoef(vv,av,ord,f,&ord1,&f1,&alist); |
NEXTNODE(alist,t); MKV(tv->v,poly); |
ord = ord1; |
MKAlg(poly,alpha); BDY(t) = (pointer)alpha; |
f = f1; |
tv->v = tv->v->priv; |
|
} |
|
NEXT(t) = 0; |
|
for ( tv = vv; NEXT(tv); tv = NEXT(tv) ); |
|
NEXT(tv) = av; |
|
ord = append_block(ord,nvar,nalg,2); |
|
nvar += nalg; |
|
setfield_dalg(alist); |
|
nf = get_numberfield(); |
|
for ( i = nalg-1, t = BDY(f); i >= 0; i-- ) { |
|
MKAlg(nf->defpoly[i],dp); |
|
MKNODE(s,dp,t); t = s; |
|
} |
|
MKLIST(f1,t); |
|
algobjtorat(f1,&f2); f = f2; |
|
} |
} |
|
nvar += nalg; |
|
|
nocheck = 0; |
nocheck = 0; |
mindex = 0; |
mindex = 0; |