version 1.74, 2007/10/21 07:47:59 |
version 1.81, 2010/04/16 07:13:42 |
|
|
* DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, |
* DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, |
* PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. |
* PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. |
* |
* |
* $OpenXM: OpenXM_contrib2/asir2000/builtin/dp.c,v 1.73 2007/10/14 02:32:21 noro Exp $ |
* $OpenXM: OpenXM_contrib2/asir2000/builtin/dp.c,v 1.80 2010/01/19 06:17:22 noro Exp $ |
*/ |
*/ |
#include "ca.h" |
#include "ca.h" |
#include "base.h" |
#include "base.h" |
Line 68 void Pdp_set_sugar(); |
|
Line 68 void Pdp_set_sugar(); |
|
void Pdp_cri1(),Pdp_cri2(),Pdp_subd(),Pdp_mod(),Pdp_red_mod(),Pdp_tdiv(); |
void Pdp_cri1(),Pdp_cri2(),Pdp_subd(),Pdp_mod(),Pdp_red_mod(),Pdp_tdiv(); |
void Pdp_prim(),Pdp_red_coef(),Pdp_mag(),Pdp_set_kara(),Pdp_rat(); |
void Pdp_prim(),Pdp_red_coef(),Pdp_mag(),Pdp_set_kara(),Pdp_rat(); |
void Pdp_nf(),Pdp_true_nf(),Pdp_true_nf_marked(),Pdp_true_nf_marked_mod(); |
void Pdp_nf(),Pdp_true_nf(),Pdp_true_nf_marked(),Pdp_true_nf_marked_mod(); |
void Pdp_true_nf_and_quotient_marked(); |
void Pdp_true_nf_and_quotient_marked(),Pdp_true_nf_and_quotient_marked_mod(); |
void Pdp_nf_mod(),Pdp_true_nf_mod(); |
void Pdp_nf_mod(),Pdp_true_nf_mod(); |
void Pdp_criB(),Pdp_nelim(); |
void Pdp_criB(),Pdp_nelim(); |
void Pdp_minp(),Pdp_sp_mod(); |
void Pdp_minp(),Pdp_sp_mod(); |
Line 91 void Pdp_weyl_gr_main(),Pdp_weyl_gr_mod_main(),Pdp_wey |
|
Line 91 void Pdp_weyl_gr_main(),Pdp_weyl_gr_mod_main(),Pdp_wey |
|
void Pdp_weyl_f4_main(),Pdp_weyl_f4_mod_main(),Pdp_weyl_f4_f_main(); |
void Pdp_weyl_f4_main(),Pdp_weyl_f4_mod_main(),Pdp_weyl_f4_f_main(); |
void Pdp_weyl_mul(),Pdp_weyl_mul_mod(); |
void Pdp_weyl_mul(),Pdp_weyl_mul_mod(); |
void Pdp_weyl_set_weight(); |
void Pdp_weyl_set_weight(); |
void Pdp_set_weight(),Pdp_set_top_weight(); |
void Pdp_set_weight(),Pdp_set_top_weight(),Pdp_set_module_weight(); |
void Pdp_nf_f(),Pdp_weyl_nf_f(); |
void Pdp_nf_f(),Pdp_weyl_nf_f(); |
void Pdp_lnf_f(); |
void Pdp_lnf_f(); |
void Pnd_gr(),Pnd_gr_trace(),Pnd_f4(),Pnd_f4_trace(); |
void Pnd_gr(),Pnd_gr_trace(),Pnd_f4(),Pnd_f4_trace(); |
void Pnd_gr_postproc(); |
void Pnd_gr_postproc(), Pnd_weyl_gr_postproc(); |
void Pnd_weyl_gr(),Pnd_weyl_gr_trace(); |
void Pnd_weyl_gr(),Pnd_weyl_gr_trace(); |
void Pnd_nf(); |
void Pnd_nf(); |
void Pdp_initial_term(); |
void Pdp_initial_term(); |
Line 105 void Pdp_compute_last_t(); |
|
Line 105 void Pdp_compute_last_t(); |
|
void Pdp_compute_last_w(); |
void Pdp_compute_last_w(); |
void Pdp_compute_essential_df(); |
void Pdp_compute_essential_df(); |
void Pdp_get_denomlist(); |
void Pdp_get_denomlist(); |
|
void Pdp_symb_add(); |
|
|
LIST dp_initial_term(); |
LIST dp_initial_term(); |
LIST dp_order(); |
LIST dp_order(); |
Line 140 struct ftab dp_tab[] = { |
|
Line 141 struct ftab dp_tab[] = { |
|
{"dp_true_nf",Pdp_true_nf,4}, |
{"dp_true_nf",Pdp_true_nf,4}, |
{"dp_true_nf_marked",Pdp_true_nf_marked,4}, |
{"dp_true_nf_marked",Pdp_true_nf_marked,4}, |
{"dp_true_nf_and_quotient_marked",Pdp_true_nf_and_quotient_marked,4}, |
{"dp_true_nf_and_quotient_marked",Pdp_true_nf_and_quotient_marked,4}, |
|
{"dp_true_nf_and_quotient_marked_mod",Pdp_true_nf_and_quotient_marked_mod,5}, |
{"dp_true_nf_marked_mod",Pdp_true_nf_marked_mod,5}, |
{"dp_true_nf_marked_mod",Pdp_true_nf_marked_mod,5}, |
{"dp_nf_mod",Pdp_nf_mod,5}, |
{"dp_nf_mod",Pdp_nf_mod,5}, |
{"dp_true_nf_mod",Pdp_true_nf_mod,5}, |
{"dp_true_nf_mod",Pdp_true_nf_mod,5}, |
Line 159 struct ftab dp_tab[] = { |
|
Line 161 struct ftab dp_tab[] = { |
|
{"nd_gr_trace",Pnd_gr_trace,5}, |
{"nd_gr_trace",Pnd_gr_trace,5}, |
{"nd_f4_trace",Pnd_f4_trace,5}, |
{"nd_f4_trace",Pnd_f4_trace,5}, |
{"nd_gr_postproc",Pnd_gr_postproc,5}, |
{"nd_gr_postproc",Pnd_gr_postproc,5}, |
|
{"nd_weyl_gr_postproc",Pnd_weyl_gr_postproc,5}, |
{"nd_weyl_gr",Pnd_weyl_gr,4}, |
{"nd_weyl_gr",Pnd_weyl_gr,4}, |
{"nd_weyl_gr_trace",Pnd_weyl_gr_trace,5}, |
{"nd_weyl_gr_trace",Pnd_weyl_gr_trace,5}, |
{"nd_nf",Pnd_nf,5}, |
{"nd_nf",Pnd_nf,5}, |
Line 195 struct ftab dp_tab[] = { |
|
Line 198 struct ftab dp_tab[] = { |
|
/* misc */ |
/* misc */ |
{"dp_inv_or_split",Pdp_inv_or_split,3}, |
{"dp_inv_or_split",Pdp_inv_or_split,3}, |
{"dp_set_weight",Pdp_set_weight,-1}, |
{"dp_set_weight",Pdp_set_weight,-1}, |
|
{"dp_set_module_weight",Pdp_set_module_weight,-1}, |
{"dp_set_top_weight",Pdp_set_top_weight,-1}, |
{"dp_set_top_weight",Pdp_set_top_weight,-1}, |
{"dp_weyl_set_weight",Pdp_weyl_set_weight,-1}, |
{"dp_weyl_set_weight",Pdp_weyl_set_weight,-1}, |
|
|
Line 243 struct ftab dp_supp_tab[] = { |
|
Line 247 struct ftab dp_supp_tab[] = { |
|
{"dp_rest",Pdp_rest,1}, |
{"dp_rest",Pdp_rest,1}, |
{"dp_initial_term",Pdp_initial_term,1}, |
{"dp_initial_term",Pdp_initial_term,1}, |
{"dp_order",Pdp_order,1}, |
{"dp_order",Pdp_order,1}, |
|
{"dp_symb_add",Pdp_symb_add,2}, |
|
|
/* degree and size */ |
/* degree and size */ |
{"dp_td",Pdp_td,1}, |
{"dp_td",Pdp_td,1}, |
|
|
MKLIST(*rp,n); |
MKLIST(*rp,n); |
} |
} |
|
|
|
DP *dp_true_nf_and_quotient_marked_mod (NODE b,DP g,DP *ps,DP *hps,int mod,DP *rp,P *dnp); |
|
|
|
void Pdp_true_nf_and_quotient_marked_mod(arg,rp) |
|
NODE arg; |
|
LIST *rp; |
|
{ |
|
NODE b,n; |
|
DP *ps,*hps; |
|
DP g; |
|
DP nm; |
|
VECT quo; |
|
P dn; |
|
int full,mod; |
|
|
|
do_weyl = 0; dp_fcoeffs = 0; |
|
asir_assert(ARG0(arg),O_LIST,"dp_true_nf_and_quotient_marked_mod"); |
|
asir_assert(ARG1(arg),O_DP,"dp_true_nf_and_quotient_marked_mod"); |
|
asir_assert(ARG2(arg),O_VECT,"dp_true_nf_and_quotient_marked_mod"); |
|
asir_assert(ARG3(arg),O_VECT,"dp_true_nf_and_quotient_marked_mod"); |
|
asir_assert(ARG4(arg),O_N,"dp_true_nf_and_quotient_marked_mod"); |
|
if ( !(g = (DP)ARG1(arg)) ) { |
|
nm = 0; dn = (P)ONE; |
|
} else { |
|
b = BDY((LIST)ARG0(arg)); |
|
ps = (DP *)BDY((VECT)ARG2(arg)); |
|
hps = (DP *)BDY((VECT)ARG3(arg)); |
|
mod = QTOS((Q)ARG4(arg)); |
|
NEWVECT(quo); quo->len = ((VECT)ARG2(arg))->len; |
|
quo->body = (pointer *)dp_true_nf_and_quotient_marked_mod(b,g,ps,hps,mod,&nm,&dn); |
|
} |
|
n = mknode(3,nm,dn,quo); |
|
MKLIST(*rp,n); |
|
} |
|
|
void Pdp_true_nf_marked_mod(arg,rp) |
void Pdp_true_nf_marked_mod(arg,rp) |
NODE arg; |
NODE arg; |
LIST *rp; |
LIST *rp; |
|
|
dp_subd(p1,p2,rp); |
dp_subd(p1,p2,rp); |
} |
} |
|
|
|
void Pdp_symb_add(arg,rp) |
|
NODE arg; |
|
DP *rp; |
|
{ |
|
DP p1,p2,r; |
|
NODE s0; |
|
MP mp0,mp; |
|
int nv; |
|
|
|
p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); |
|
asir_assert(p1,O_DP,"dp_symb_add"); |
|
asir_assert(p2,O_DP,"dp_symb_add"); |
|
if ( p1->nv != p2->nv ) |
|
error("dp_sumb_add : invalid input"); |
|
nv = p1->nv; |
|
s0 = symb_merge(dp_dllist(p1),dp_dllist(p2),nv); |
|
for ( mp0 = 0; s0; s0 = NEXT(s0) ) { |
|
NEXTMP(mp0,mp); mp->dl = (DL)BDY(s0); mp->c = (P)ONE; |
|
} |
|
NEXT(mp) = 0; |
|
MKDP(nv,mp0,r); r->sugar = MAX(p1->sugar,p2->sugar); |
|
*rp = r; |
|
} |
|
|
void Pdp_mul_trunc(arg,rp) |
void Pdp_mul_trunc(arg,rp) |
NODE arg; |
NODE arg; |
DP *rp; |
DP *rp; |
|
|
LIST *rp; |
LIST *rp; |
{ |
{ |
LIST f,v; |
LIST f,v; |
int m,homo; |
int m,find; |
|
Obj homo; |
struct order_spec *ord; |
struct order_spec *ord; |
|
|
do_weyl = 0; |
do_weyl = 0; |
asir_assert(ARG0(arg),O_LIST,"nd_gr"); |
asir_assert(ARG0(arg),O_LIST,"nd_f4"); |
asir_assert(ARG1(arg),O_LIST,"nd_gr"); |
asir_assert(ARG1(arg),O_LIST,"nd_f4"); |
asir_assert(ARG2(arg),O_N,"nd_gr"); |
asir_assert(ARG2(arg),O_N,"nd_f4"); |
f = (LIST)ARG0(arg); v = (LIST)ARG1(arg); |
f = (LIST)ARG0(arg); v = (LIST)ARG1(arg); |
f = remove_zero_from_list(f); |
f = remove_zero_from_list(f); |
if ( !BDY(f) ) { |
if ( !BDY(f) ) { |
|
|
} |
} |
m = QTOS((Q)ARG2(arg)); |
m = QTOS((Q)ARG2(arg)); |
create_order_spec(0,ARG3(arg),&ord); |
create_order_spec(0,ARG3(arg),&ord); |
nd_gr(f,v,m,1,ord,rp); |
find = get_opt("homo",&homo); |
|
nd_gr(f,v,m,find&&homo,1,ord,rp); |
} |
} |
|
|
void Pnd_gr(arg,rp) |
void Pnd_gr(arg,rp) |
|
|
LIST *rp; |
LIST *rp; |
{ |
{ |
LIST f,v; |
LIST f,v; |
int m,homo; |
int m,find; |
|
Obj homo; |
struct order_spec *ord; |
struct order_spec *ord; |
|
|
do_weyl = 0; |
do_weyl = 0; |
|
|
} |
} |
m = QTOS((Q)ARG2(arg)); |
m = QTOS((Q)ARG2(arg)); |
create_order_spec(0,ARG3(arg),&ord); |
create_order_spec(0,ARG3(arg),&ord); |
nd_gr(f,v,m,0,ord,rp); |
find = get_opt("homo",&homo); |
|
nd_gr(f,v,m,find&&homo,0,ord,rp); |
} |
} |
|
|
void Pnd_gr_postproc(arg,rp) |
void Pnd_gr_postproc(arg,rp) |
|
|
nd_gr_postproc(f,v,m,ord,do_check,rp); |
nd_gr_postproc(f,v,m,ord,do_check,rp); |
} |
} |
|
|
|
void Pnd_weyl_gr_postproc(arg,rp) |
|
NODE arg; |
|
LIST *rp; |
|
{ |
|
LIST f,v; |
|
int m,do_check; |
|
struct order_spec *ord; |
|
|
|
do_weyl = 1; |
|
asir_assert(ARG0(arg),O_LIST,"nd_gr"); |
|
asir_assert(ARG1(arg),O_LIST,"nd_gr"); |
|
asir_assert(ARG2(arg),O_N,"nd_gr"); |
|
f = (LIST)ARG0(arg); v = (LIST)ARG1(arg); |
|
f = remove_zero_from_list(f); |
|
if ( !BDY(f) ) { |
|
*rp = f; do_weyl = 0; return; |
|
} |
|
m = QTOS((Q)ARG2(arg)); |
|
create_order_spec(0,ARG3(arg),&ord); |
|
do_check = ARG4(arg) ? 1 : 0; |
|
nd_gr_postproc(f,v,m,ord,do_check,rp); |
|
do_weyl = 0; |
|
} |
|
|
void Pnd_gr_trace(arg,rp) |
void Pnd_gr_trace(arg,rp) |
NODE arg; |
NODE arg; |
LIST *rp; |
LIST *rp; |
|
|
LIST *rp; |
LIST *rp; |
{ |
{ |
LIST f,v; |
LIST f,v; |
int m,homo; |
int m,find; |
|
Obj homo; |
struct order_spec *ord; |
struct order_spec *ord; |
|
|
do_weyl = 1; |
do_weyl = 1; |
|
|
f = (LIST)ARG0(arg); v = (LIST)ARG1(arg); |
f = (LIST)ARG0(arg); v = (LIST)ARG1(arg); |
f = remove_zero_from_list(f); |
f = remove_zero_from_list(f); |
if ( !BDY(f) ) { |
if ( !BDY(f) ) { |
*rp = f; return; |
*rp = f; do_weyl = 0; return; |
} |
} |
m = QTOS((Q)ARG2(arg)); |
m = QTOS((Q)ARG2(arg)); |
create_order_spec(0,ARG3(arg),&ord); |
create_order_spec(0,ARG3(arg),&ord); |
nd_gr(f,v,m,0,ord,rp); |
find = get_opt("homo",&homo); |
|
nd_gr(f,v,m,find&&homo,0,ord,rp); |
|
do_weyl = 0; |
} |
} |
|
|
void Pnd_weyl_gr_trace(arg,rp) |
void Pnd_weyl_gr_trace(arg,rp) |
|
|
f = (LIST)ARG0(arg); v = (LIST)ARG1(arg); |
f = (LIST)ARG0(arg); v = (LIST)ARG1(arg); |
f = remove_zero_from_list(f); |
f = remove_zero_from_list(f); |
if ( !BDY(f) ) { |
if ( !BDY(f) ) { |
*rp = f; return; |
*rp = f; do_weyl = 0; return; |
} |
} |
homo = QTOS((Q)ARG2(arg)); |
homo = QTOS((Q)ARG2(arg)); |
m = QTOS((Q)ARG3(arg)); |
m = QTOS((Q)ARG3(arg)); |
create_order_spec(0,ARG4(arg),&ord); |
create_order_spec(0,ARG4(arg),&ord); |
nd_gr_trace(f,v,m,homo,0,ord,rp); |
nd_gr_trace(f,v,m,homo,0,ord,rp); |
|
do_weyl = 0; |
} |
} |
|
|
void Pnd_nf(arg,rp) |
void Pnd_nf(arg,rp) |
|
|
} |
} |
} |
} |
|
|
|
VECT current_module_weight_vector_obj; |
|
int *current_module_weight_vector; |
|
|
|
void Pdp_set_module_weight(arg,rp) |
|
NODE arg; |
|
VECT *rp; |
|
{ |
|
VECT v; |
|
int i,n; |
|
NODE node; |
|
|
|
if ( !arg ) |
|
*rp = current_module_weight_vector_obj; |
|
else if ( !ARG0(arg) ) { |
|
current_module_weight_vector_obj = 0; |
|
current_module_weight_vector = 0; |
|
*rp = 0; |
|
} else { |
|
if ( OID(ARG0(arg)) != O_VECT && OID(ARG0(arg)) != O_LIST ) |
|
error("dp_module_set_weight : invalid argument"); |
|
if ( OID(ARG0(arg)) == O_VECT ) |
|
v = (VECT)ARG0(arg); |
|
else { |
|
node = (NODE)BDY((LIST)ARG0(arg)); |
|
n = length(node); |
|
MKVECT(v,n); |
|
for ( i = 0; i < n; i++, node = NEXT(node) ) |
|
BDY(v)[i] = BDY(node); |
|
} |
|
current_module_weight_vector_obj = v; |
|
n = v->len; |
|
current_module_weight_vector = (int *)CALLOC(n,sizeof(int)); |
|
for ( i = 0; i < n; i++ ) |
|
current_module_weight_vector[i] = QTOS((Q)v->body[i]); |
|
*rp = v; |
|
} |
|
} |
|
|
VECT current_top_weight_vector_obj; |
VECT current_top_weight_vector_obj; |
N *current_top_weight_vector; |
N *current_top_weight_vector; |
|
|
|
|
|
|
if ( !arg ) |
if ( !arg ) |
*rp = current_weyl_weight_vector_obj; |
*rp = current_weyl_weight_vector_obj; |
else { |
else if ( !ARG0(arg) ) { |
|
current_weyl_weight_vector_obj = 0; |
|
current_weyl_weight_vector = 0; |
|
*rp = 0; |
|
} else { |
asir_assert(ARG0(arg),O_VECT,"dp_weyl_set_weight"); |
asir_assert(ARG0(arg),O_VECT,"dp_weyl_set_weight"); |
v = (VECT)ARG0(arg); |
v = (VECT)ARG0(arg); |
current_weyl_weight_vector_obj = v; |
current_weyl_weight_vector_obj = v; |
Line 2659 int dpv_hp(DPV p) |
|
Line 2796 int dpv_hp(DPV p) |
|
break; |
break; |
} |
} |
} |
} |
|
|
|
int get_opt(char *key0,Obj *r) { |
|
NODE tt,p; |
|
char *key; |
|
|
|
if ( current_option ) { |
|
for ( tt = current_option; tt; tt = NEXT(tt) ) { |
|
p = BDY((LIST)BDY(tt)); |
|
key = BDY((STRING)BDY(p)); |
|
/* value = (Obj)BDY(NEXT(p)); */ |
|
if ( !strcmp(key,key0) ) { |
|
*r = (Obj)BDY(NEXT(p)); |
|
return 1; |
|
} |
|
} |
|
} |
|
return 0; |
|
} |
|
|