| version 1.107, 2017/09/14 01:34:53 | 
version 1.108, 2018/03/29 01:32:50 | 
 | 
 | 
|   * 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.106 2017/09/06 06:25:26 noro Exp $ | 
  * $OpenXM: OpenXM_contrib2/asir2000/builtin/dp.c,v 1.107 2017/09/14 01:34:53 noro Exp $ | 
|  */ | 
 */ | 
|  #include "ca.h" | 
 #include "ca.h" | 
|  #include "base.h" | 
 #include "base.h" | 
| Line 126  void Pdp_rref2(),Psumi_updatepairs(),Psumi_symbolic(); | 
 
  | 
| Line 126  void Pdp_rref2(),Psumi_updatepairs(),Psumi_symbolic(); | 
 
 
 | 
|  LIST dp_initial_term(); | 
 LIST dp_initial_term(); | 
|  LIST dp_order(); | 
 LIST dp_order(); | 
|  void parse_gr_option(LIST f,NODE opt,LIST *v,Num *homo, | 
 void parse_gr_option(LIST f,NODE opt,LIST *v,Num *homo, | 
|          int *modular,struct order_spec **ord); | 
   int *modular,struct order_spec **ord); | 
|  NODE dp_inv_or_split(NODE gb,DP f,struct order_spec *spec, DP *inv); | 
 NODE dp_inv_or_split(NODE gb,DP f,struct order_spec *spec, DP *inv); | 
|   | 
  | 
|  LIST remove_zero_from_list(LIST); | 
 LIST remove_zero_from_list(LIST); | 
|   | 
  | 
|  struct ftab dp_tab[] = { | 
 struct ftab dp_tab[] = { | 
|          /* content reduction */ | 
   /* content reduction */ | 
|          {"dp_ptozp",Pdp_ptozp,1}, | 
   {"dp_ptozp",Pdp_ptozp,1}, | 
|          {"dp_ptozp2",Pdp_ptozp2,2}, | 
   {"dp_ptozp2",Pdp_ptozp2,2}, | 
|          {"dp_prim",Pdp_prim,1}, | 
   {"dp_prim",Pdp_prim,1}, | 
|          {"dp_red_coef",Pdp_red_coef,2}, | 
   {"dp_red_coef",Pdp_red_coef,2}, | 
|          {"dp_cont",Pdp_cont,1}, | 
   {"dp_cont",Pdp_cont,1}, | 
|   | 
  | 
|  /* polynomial ring */ | 
 /* polynomial ring */ | 
|          /* special operations */ | 
   /* special operations */ | 
|          {"dp_mul_trunc",Pdp_mul_trunc,3}, | 
   {"dp_mul_trunc",Pdp_mul_trunc,3}, | 
|          {"dp_quo",Pdp_quo,2}, | 
   {"dp_quo",Pdp_quo,2}, | 
|   | 
  | 
|          /* s-poly */ | 
   /* s-poly */ | 
|          {"dp_sp",Pdp_sp,2}, | 
   {"dp_sp",Pdp_sp,2}, | 
|          {"dp_sp_mod",Pdp_sp_mod,3}, | 
   {"dp_sp_mod",Pdp_sp_mod,3}, | 
|   | 
  | 
|          /* m-reduction */ | 
   /* m-reduction */ | 
|          {"dp_red",Pdp_red,3}, | 
   {"dp_red",Pdp_red,3}, | 
|          {"dp_red_mod",Pdp_red_mod,4}, | 
   {"dp_red_mod",Pdp_red_mod,4}, | 
|   | 
  | 
|          /* normal form */ | 
   /* normal form */ | 
|          {"dp_nf",Pdp_nf,4}, | 
   {"dp_nf",Pdp_nf,4}, | 
|          {"dp_nf_mod",Pdp_nf_mod,5}, | 
   {"dp_nf_mod",Pdp_nf_mod,5}, | 
|          {"dp_nf_f",Pdp_nf_f,4}, | 
   {"dp_nf_f",Pdp_nf_f,4}, | 
|          {"dpm_nf_f",Pdpm_nf_f,4}, | 
   {"dpm_nf_f",Pdpm_nf_f,4}, | 
|          {"dpm_weyl_nf_f",Pdpm_weyl_nf_f,4}, | 
   {"dpm_weyl_nf_f",Pdpm_weyl_nf_f,4}, | 
|          {"dpm_nf",Pdpm_nf,4}, | 
   {"dpm_nf",Pdpm_nf,4}, | 
|          {"dpm_sp",Pdpm_sp,2}, | 
   {"dpm_sp",Pdpm_sp,2}, | 
|          {"dpm_weyl_sp",Pdpm_weyl_sp,2}, | 
   {"dpm_weyl_sp",Pdpm_weyl_sp,2}, | 
|   | 
  | 
|          {"dp_true_nf",Pdp_true_nf,4}, | 
   {"dp_true_nf",Pdp_true_nf,4}, | 
|          {"dp_true_nf_mod",Pdp_true_nf_mod,5}, | 
   {"dp_true_nf_mod",Pdp_true_nf_mod,5}, | 
|          {"dp_true_nf_marked",Pdp_true_nf_marked,4}, | 
   {"dp_true_nf_marked",Pdp_true_nf_marked,4}, | 
|          {"dp_true_nf_marked_mod",Pdp_true_nf_marked_mod,5}, | 
   {"dp_true_nf_marked_mod",Pdp_true_nf_marked_mod,5}, | 
|   | 
  | 
|          {"dp_true_nf_and_quotient",Pdp_true_nf_and_quotient,3}, | 
   {"dp_true_nf_and_quotient",Pdp_true_nf_and_quotient,3}, | 
|          {"dp_true_nf_and_quotient_mod",Pdp_true_nf_and_quotient_mod,4}, | 
   {"dp_true_nf_and_quotient_mod",Pdp_true_nf_and_quotient_mod,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_and_quotient_marked_mod",Pdp_true_nf_and_quotient_marked_mod,5}, | 
|   | 
  | 
|          {"dp_lnf_mod",Pdp_lnf_mod,3}, | 
   {"dp_lnf_mod",Pdp_lnf_mod,3}, | 
|          {"dp_nf_tab_f",Pdp_nf_tab_f,2}, | 
   {"dp_nf_tab_f",Pdp_nf_tab_f,2}, | 
|          {"dp_nf_tab_mod",Pdp_nf_tab_mod,3}, | 
   {"dp_nf_tab_mod",Pdp_nf_tab_mod,3}, | 
|          {"dp_lnf_f",Pdp_lnf_f,2}, | 
   {"dp_lnf_f",Pdp_lnf_f,2}, | 
|   | 
  | 
|          /* Buchberger algorithm */ | 
   /* Buchberger algorithm */ | 
|          {"dp_gr_main",Pdp_gr_main,-5}, | 
   {"dp_gr_main",Pdp_gr_main,-5}, | 
|          {"dp_interreduce",Pdp_interreduce,3}, | 
   {"dp_interreduce",Pdp_interreduce,3}, | 
|          {"dp_gr_mod_main",Pdp_gr_mod_main,5}, | 
   {"dp_gr_mod_main",Pdp_gr_mod_main,5}, | 
|          {"dp_gr_f_main",Pdp_gr_f_main,4}, | 
   {"dp_gr_f_main",Pdp_gr_f_main,4}, | 
|          {"dp_gr_checklist",Pdp_gr_checklist,2}, | 
   {"dp_gr_checklist",Pdp_gr_checklist,2}, | 
|          {"nd_f4",Pnd_f4,-4}, | 
   {"nd_f4",Pnd_f4,-4}, | 
|          {"nd_gr",Pnd_gr,-4}, | 
   {"nd_gr",Pnd_gr,-4}, | 
|          {"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_gr_recompute_trace",Pnd_gr_recompute_trace,5}, | 
   {"nd_gr_recompute_trace",Pnd_gr_recompute_trace,5}, | 
|          {"nd_btog",Pnd_btog,-6}, | 
   {"nd_btog",Pnd_btog,-6}, | 
|          {"nd_weyl_gr_postproc",Pnd_weyl_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}, | 
|          {"nd_weyl_nf",Pnd_weyl_nf,5}, | 
   {"nd_weyl_nf",Pnd_weyl_nf,5}, | 
|   | 
  | 
|          /* F4 algorithm */ | 
   /* F4 algorithm */ | 
|          {"dp_f4_main",Pdp_f4_main,3}, | 
   {"dp_f4_main",Pdp_f4_main,3}, | 
|          {"dp_f4_mod_main",Pdp_f4_mod_main,4}, | 
   {"dp_f4_mod_main",Pdp_f4_mod_main,4}, | 
|   | 
  | 
|  /* weyl algebra */ | 
 /* weyl algebra */ | 
|          /* multiplication */ | 
   /* multiplication */ | 
|          {"dp_weyl_mul",Pdp_weyl_mul,2}, | 
   {"dp_weyl_mul",Pdp_weyl_mul,2}, | 
|          {"dp_weyl_mul_mod",Pdp_weyl_mul_mod,3}, | 
   {"dp_weyl_mul_mod",Pdp_weyl_mul_mod,3}, | 
|          {"dp_weyl_act",Pdp_weyl_act,2}, | 
   {"dp_weyl_act",Pdp_weyl_act,2}, | 
|   | 
  | 
|          /* s-poly */ | 
   /* s-poly */ | 
|          {"dp_weyl_sp",Pdp_weyl_sp,2}, | 
   {"dp_weyl_sp",Pdp_weyl_sp,2}, | 
|   | 
  | 
|          /* m-reduction */ | 
   /* m-reduction */ | 
|          {"dp_weyl_red",Pdp_weyl_red,3}, | 
   {"dp_weyl_red",Pdp_weyl_red,3}, | 
|   | 
  | 
|          /* normal form */ | 
   /* normal form */ | 
|          {"dp_weyl_nf",Pdp_weyl_nf,4}, | 
   {"dp_weyl_nf",Pdp_weyl_nf,4}, | 
|          {"dpm_weyl_nf",Pdpm_weyl_nf,4}, | 
   {"dpm_weyl_nf",Pdpm_weyl_nf,4}, | 
|          {"dp_weyl_nf_mod",Pdp_weyl_nf_mod,5}, | 
   {"dp_weyl_nf_mod",Pdp_weyl_nf_mod,5}, | 
|          {"dp_weyl_nf_f",Pdp_weyl_nf_f,4}, | 
   {"dp_weyl_nf_f",Pdp_weyl_nf_f,4}, | 
|   | 
  | 
|          {"dp_weyl_true_nf_and_quotient",Pdp_weyl_true_nf_and_quotient,3}, | 
   {"dp_weyl_true_nf_and_quotient",Pdp_weyl_true_nf_and_quotient,3}, | 
|          {"dp_weyl_true_nf_and_quotient_mod",Pdp_weyl_true_nf_and_quotient_mod,4}, | 
   {"dp_weyl_true_nf_and_quotient_mod",Pdp_weyl_true_nf_and_quotient_mod,4}, | 
|          {"dp_weyl_true_nf_and_quotient_marked",Pdp_weyl_true_nf_and_quotient_marked,4}, | 
   {"dp_weyl_true_nf_and_quotient_marked",Pdp_weyl_true_nf_and_quotient_marked,4}, | 
|          {"dp_weyl_true_nf_and_quotient_marked_mod",Pdp_weyl_true_nf_and_quotient_marked_mod,5}, | 
   {"dp_weyl_true_nf_and_quotient_marked_mod",Pdp_weyl_true_nf_and_quotient_marked_mod,5}, | 
|   | 
  | 
|   | 
  | 
|          /* Buchberger algorithm */ | 
   /* Buchberger algorithm */ | 
|          {"dp_weyl_gr_main",Pdp_weyl_gr_main,-5}, | 
   {"dp_weyl_gr_main",Pdp_weyl_gr_main,-5}, | 
|          {"dp_weyl_gr_mod_main",Pdp_weyl_gr_mod_main,5}, | 
   {"dp_weyl_gr_mod_main",Pdp_weyl_gr_mod_main,5}, | 
|          {"dp_weyl_gr_f_main",Pdp_weyl_gr_f_main,4}, | 
   {"dp_weyl_gr_f_main",Pdp_weyl_gr_f_main,4}, | 
|   | 
  | 
|          /* F4 algorithm */ | 
   /* F4 algorithm */ | 
|          {"dp_weyl_f4_main",Pdp_weyl_f4_main,3}, | 
   {"dp_weyl_f4_main",Pdp_weyl_f4_main,3}, | 
|          {"dp_weyl_f4_mod_main",Pdp_weyl_f4_mod_main,4}, | 
   {"dp_weyl_f4_mod_main",Pdp_weyl_f4_mod_main,4}, | 
|   | 
  | 
|          /* 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_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}, | 
|   | 
  | 
|          {"dp_get_denomlist",Pdp_get_denomlist,0}, | 
   {"dp_get_denomlist",Pdp_get_denomlist,0}, | 
|          {0,0,0}, | 
   {0,0,0}, | 
|  }; | 
 }; | 
|   | 
  | 
|  struct ftab dp_supp_tab[] = { | 
 struct ftab dp_supp_tab[] = { | 
|          /* setting flags */ | 
   /* setting flags */ | 
|          {"dp_sort",Pdp_sort,1}, | 
   {"dp_sort",Pdp_sort,1}, | 
|          {"dp_ord",Pdp_ord,-1}, | 
   {"dp_ord",Pdp_ord,-1}, | 
|          {"dpm_ord",Pdpm_ord,-1}, | 
   {"dpm_ord",Pdpm_ord,-1}, | 
|          {"dpv_ord",Pdpv_ord,-2}, | 
   {"dpv_ord",Pdpv_ord,-2}, | 
|          {"dp_set_kara",Pdp_set_kara,-1}, | 
   {"dp_set_kara",Pdp_set_kara,-1}, | 
|          {"dp_nelim",Pdp_nelim,-1}, | 
   {"dp_nelim",Pdp_nelim,-1}, | 
|          {"dp_gr_flags",Pdp_gr_flags,-1}, | 
   {"dp_gr_flags",Pdp_gr_flags,-1}, | 
|          {"dp_gr_print",Pdp_gr_print,-1}, | 
   {"dp_gr_print",Pdp_gr_print,-1}, | 
|   | 
  | 
|          /* converters */ | 
   /* converters */ | 
|          {"homogenize",Phomogenize,3}, | 
   {"homogenize",Phomogenize,3}, | 
|          {"dp_ptod",Pdp_ptod,-2}, | 
   {"dp_ptod",Pdp_ptod,-2}, | 
|          {"dp_dtop",Pdp_dtop,2}, | 
   {"dp_dtop",Pdp_dtop,2}, | 
|          {"dp_homo",Pdp_homo,1}, | 
   {"dp_homo",Pdp_homo,1}, | 
|          {"dp_dehomo",Pdp_dehomo,1}, | 
   {"dp_dehomo",Pdp_dehomo,1}, | 
|          {"dp_etov",Pdp_etov,1}, | 
   {"dp_etov",Pdp_etov,1}, | 
|          {"dp_vtoe",Pdp_vtoe,1}, | 
   {"dp_vtoe",Pdp_vtoe,1}, | 
|          {"dp_dtov",Pdp_dtov,1}, | 
   {"dp_dtov",Pdp_dtov,1}, | 
|          {"dp_mdtod",Pdp_mdtod,1}, | 
   {"dp_mdtod",Pdp_mdtod,1}, | 
|          {"dp_mod",Pdp_mod,3}, | 
   {"dp_mod",Pdp_mod,3}, | 
|          {"dp_rat",Pdp_rat,1}, | 
   {"dp_rat",Pdp_rat,1}, | 
|          {"dp_ltod",Pdp_ltod,-2}, | 
   {"dp_ltod",Pdp_ltod,-2}, | 
|   | 
  | 
|          {"dpm_ltod",Pdpm_ltod,2}, | 
   {"dpm_ltod",Pdpm_ltod,2}, | 
|          {"dpm_dtol",Pdpm_dtol,3}, | 
   {"dpm_dtol",Pdpm_dtol,3}, | 
|   | 
  | 
|          /* criteria */ | 
   /* criteria */ | 
|          {"dp_cri1",Pdp_cri1,2}, | 
   {"dp_cri1",Pdp_cri1,2}, | 
|          {"dp_cri2",Pdp_cri2,2}, | 
   {"dp_cri2",Pdp_cri2,2}, | 
|          {"dp_criB",Pdp_criB,3}, | 
   {"dp_criB",Pdp_criB,3}, | 
|   | 
  | 
|          /* simple operation */ | 
   /* simple operation */ | 
|          {"dp_subd",Pdp_subd,2}, | 
   {"dp_subd",Pdp_subd,2}, | 
|          {"dp_lcm",Pdp_lcm,2}, | 
   {"dp_lcm",Pdp_lcm,2}, | 
|          {"dp_hm",Pdp_hm,1}, | 
   {"dp_hm",Pdp_hm,1}, | 
|          {"dp_ht",Pdp_ht,1}, | 
   {"dp_ht",Pdp_ht,1}, | 
|          {"dp_hc",Pdp_hc,1}, | 
   {"dp_hc",Pdp_hc,1}, | 
|          {"dpv_hm",Pdpv_hm,1}, | 
   {"dpv_hm",Pdpv_hm,1}, | 
|          {"dpv_ht",Pdpv_ht,1}, | 
   {"dpv_ht",Pdpv_ht,1}, | 
|          {"dpv_hc",Pdpv_hc,1}, | 
   {"dpv_hc",Pdpv_hc,1}, | 
|          {"dpm_hm",Pdpm_hm,1}, | 
   {"dpm_hm",Pdpm_hm,1}, | 
|          {"dpm_ht",Pdpm_ht,1}, | 
   {"dpm_ht",Pdpm_ht,1}, | 
|          {"dpm_hc",Pdpm_hc,1}, | 
   {"dpm_hc",Pdpm_hc,1}, | 
|          {"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}, | 
   {"dp_symb_add",Pdp_symb_add,2}, | 
|   | 
  | 
|          /* degree and size */ | 
   /* degree and size */ | 
|          {"dp_td",Pdp_td,1}, | 
   {"dp_td",Pdp_td,1}, | 
|          {"dp_mag",Pdp_mag,1}, | 
   {"dp_mag",Pdp_mag,1}, | 
|          {"dp_sugar",Pdp_sugar,1}, | 
   {"dp_sugar",Pdp_sugar,1}, | 
|          {"dp_set_sugar",Pdp_set_sugar,2}, | 
   {"dp_set_sugar",Pdp_set_sugar,2}, | 
|   | 
  | 
|          /* misc */ | 
   /* misc */ | 
|          {"dp_mbase",Pdp_mbase,1}, | 
   {"dp_mbase",Pdp_mbase,1}, | 
|          {"dp_redble",Pdp_redble,2}, | 
   {"dp_redble",Pdp_redble,2}, | 
|          {"dp_sep",Pdp_sep,2}, | 
   {"dp_sep",Pdp_sep,2}, | 
|          {"dp_idiv",Pdp_idiv,2}, | 
   {"dp_idiv",Pdp_idiv,2}, | 
|          {"dp_tdiv",Pdp_tdiv,2}, | 
   {"dp_tdiv",Pdp_tdiv,2}, | 
|          {"dp_minp",Pdp_minp,2}, | 
   {"dp_minp",Pdp_minp,2}, | 
|          {"dp_compute_last_w",Pdp_compute_last_w,5}, | 
   {"dp_compute_last_w",Pdp_compute_last_w,5}, | 
|          {"dp_compute_last_t",Pdp_compute_last_t,5}, | 
   {"dp_compute_last_t",Pdp_compute_last_t,5}, | 
|          {"dp_compute_essential_df",Pdp_compute_essential_df,2}, | 
   {"dp_compute_essential_df",Pdp_compute_essential_df,2}, | 
|          {"dp_mono_raddec",Pdp_mono_raddec,2}, | 
   {"dp_mono_raddec",Pdp_mono_raddec,2}, | 
|          {"dp_mono_reduce",Pdp_mono_reduce,2}, | 
   {"dp_mono_reduce",Pdp_mono_reduce,2}, | 
|   | 
  | 
|          {"dp_rref2",Pdp_rref2,2}, | 
   {"dp_rref2",Pdp_rref2,2}, | 
|          {"sumi_updatepairs",Psumi_updatepairs,3}, | 
   {"sumi_updatepairs",Psumi_updatepairs,3}, | 
|          {"sumi_symbolic",Psumi_symbolic,5}, | 
   {"sumi_symbolic",Psumi_symbolic,5}, | 
|   | 
  | 
|          {0,0,0} | 
   {0,0,0} | 
|  }; | 
 }; | 
|   | 
  | 
|  NODE compute_last_w(NODE g,NODE gh,int n,int **v,int row1,int **m1,int row2,int **m2); | 
 NODE compute_last_w(NODE g,NODE gh,int n,int **v,int row1,int **m1,int row2,int **m2); | 
| Line 325  Q compute_last_t(NODE g,NODE gh,Q t,VECT w1,VECT w2,NO | 
 
  | 
| Line 325  Q compute_last_t(NODE g,NODE gh,Q t,VECT w1,VECT w2,NO | 
 
 
 | 
|   | 
  | 
|  void Pdp_compute_last_t(NODE arg,LIST *rp) | 
 void Pdp_compute_last_t(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          NODE g,gh,homo,n; | 
   NODE g,gh,homo,n; | 
|          LIST hlist; | 
   LIST hlist; | 
|          VECT v1,v2,w; | 
   VECT v1,v2,w; | 
|          Q t; | 
   Q t; | 
|   | 
  | 
|          g = (NODE)BDY((LIST)ARG0(arg)); | 
   g = (NODE)BDY((LIST)ARG0(arg)); | 
|          gh = (NODE)BDY((LIST)ARG1(arg)); | 
   gh = (NODE)BDY((LIST)ARG1(arg)); | 
|          t = (Q)ARG2(arg); | 
   t = (Q)ARG2(arg); | 
|          v1 = (VECT)ARG3(arg); | 
   v1 = (VECT)ARG3(arg); | 
|          v2 = (VECT)ARG4(arg); | 
   v2 = (VECT)ARG4(arg); | 
|          t = compute_last_t(g,gh,t,v1,v2,&homo,&w); | 
   t = compute_last_t(g,gh,t,v1,v2,&homo,&w); | 
|          MKLIST(hlist,homo); | 
   MKLIST(hlist,homo); | 
|          n = mknode(3,t,w,hlist); | 
   n = mknode(3,t,w,hlist); | 
|          MKLIST(*rp,n); | 
   MKLIST(*rp,n); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_compute_last_w(NODE arg,LIST *rp) | 
 void Pdp_compute_last_w(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          NODE g,gh,r; | 
   NODE g,gh,r; | 
|          VECT w,rv; | 
   VECT w,rv; | 
|          LIST l; | 
   LIST l; | 
|          MAT w1,w2; | 
   MAT w1,w2; | 
|          int row1,row2,i,j,n; | 
   int row1,row2,i,j,n; | 
|          int *v; | 
   int *v; | 
|          int **m1,**m2; | 
   int **m1,**m2; | 
|          Q q; | 
   Q q; | 
|   | 
  | 
|          g = (NODE)BDY((LIST)ARG0(arg)); | 
   g = (NODE)BDY((LIST)ARG0(arg)); | 
|          gh = (NODE)BDY((LIST)ARG1(arg)); | 
   gh = (NODE)BDY((LIST)ARG1(arg)); | 
|          w = (VECT)ARG2(arg); | 
   w = (VECT)ARG2(arg); | 
|          w1 = (MAT)ARG3(arg); | 
   w1 = (MAT)ARG3(arg); | 
|          w2 = (MAT)ARG4(arg); | 
   w2 = (MAT)ARG4(arg); | 
|          n = w1->col; | 
   n = w1->col; | 
|          row1 = w1->row; | 
   row1 = w1->row; | 
|          row2 = w2->row; | 
   row2 = w2->row; | 
|          if ( w ) { | 
   if ( w ) { | 
|                  v = W_ALLOC(n); | 
     v = W_ALLOC(n); | 
|                  for ( i = 0; i < n; i++ ) v[i] = QTOS((Q)w->body[i]); | 
     for ( i = 0; i < n; i++ ) v[i] = QTOS((Q)w->body[i]); | 
|          } else v = 0; | 
   } else v = 0; | 
|          m1 = almat(row1,n); | 
   m1 = almat(row1,n); | 
|          for ( i = 0; i < row1; i++ ) | 
   for ( i = 0; i < row1; i++ ) | 
|                  for ( j = 0; j < n; j++ ) m1[i][j] = QTOS((Q)w1->body[i][j]); | 
     for ( j = 0; j < n; j++ ) m1[i][j] = QTOS((Q)w1->body[i][j]); | 
|          m2 = almat(row2,n); | 
   m2 = almat(row2,n); | 
|          for ( i = 0; i < row2; i++ ) | 
   for ( i = 0; i < row2; i++ ) | 
|                  for ( j = 0; j < n; j++ ) m2[i][j] = QTOS((Q)w2->body[i][j]); | 
     for ( j = 0; j < n; j++ ) m2[i][j] = QTOS((Q)w2->body[i][j]); | 
|          r = compute_last_w(g,gh,n,&v,row1,m1,row2,m2); | 
   r = compute_last_w(g,gh,n,&v,row1,m1,row2,m2); | 
|          if ( !r ) *rp = 0; | 
   if ( !r ) *rp = 0; | 
|          else { | 
   else { | 
|                  MKVECT(rv,n); | 
     MKVECT(rv,n); | 
|                  for ( i = 0; i < n; i++ ) { | 
     for ( i = 0; i < n; i++ ) { | 
|                          STOQ(v[i],q); rv->body[i] = (pointer)q; | 
       STOQ(v[i],q); rv->body[i] = (pointer)q; | 
|                  } | 
     } | 
|                  MKLIST(l,r); | 
     MKLIST(l,r); | 
|                  r = mknode(2,rv,l); | 
     r = mknode(2,rv,l); | 
|                  MKLIST(*rp,r); | 
     MKLIST(*rp,r); | 
|          } | 
   } | 
|  } | 
 } | 
|   | 
  | 
|  NODE compute_essential_df(DP *g,DP *gh,int n); | 
 NODE compute_essential_df(DP *g,DP *gh,int n); | 
|   | 
  | 
|  void Pdp_compute_essential_df(NODE arg,LIST *rp) | 
 void Pdp_compute_essential_df(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          VECT g,gh; | 
   VECT g,gh; | 
|          NODE r; | 
   NODE r; | 
|   | 
  | 
|          g = (VECT)ARG0(arg); | 
   g = (VECT)ARG0(arg); | 
|          gh = (VECT)ARG1(arg); | 
   gh = (VECT)ARG1(arg); | 
|          r = (NODE)compute_essential_df((DP *)BDY(g),(DP *)BDY(gh),g->len); | 
   r = (NODE)compute_essential_df((DP *)BDY(g),(DP *)BDY(gh),g->len); | 
|          MKLIST(*rp,r); | 
   MKLIST(*rp,r); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_inv_or_split(NODE arg,Obj *rp) | 
 void Pdp_inv_or_split(NODE arg,Obj *rp) | 
|  { | 
 { | 
|          NODE gb,newgb; | 
   NODE gb,newgb; | 
|          DP f,inv; | 
   DP f,inv; | 
|          struct order_spec *spec; | 
   struct order_spec *spec; | 
|          LIST list; | 
   LIST list; | 
|   | 
  | 
|          do_weyl = 0; dp_fcoeffs = 0; | 
   do_weyl = 0; dp_fcoeffs = 0; | 
|          asir_assert(ARG0(arg),O_LIST,"dp_inv_or_split"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_inv_or_split"); | 
|          asir_assert(ARG1(arg),O_DP,"dp_inv_or_split"); | 
   asir_assert(ARG1(arg),O_DP,"dp_inv_or_split"); | 
|          if ( !create_order_spec(0,(Obj)ARG2(arg),&spec) ) | 
   if ( !create_order_spec(0,(Obj)ARG2(arg),&spec) ) | 
|                  error("dp_inv_or_split : invalid order specification"); | 
     error("dp_inv_or_split : invalid order specification"); | 
|          gb = BDY((LIST)ARG0(arg)); | 
   gb = BDY((LIST)ARG0(arg)); | 
|          f = (DP)ARG1(arg); | 
   f = (DP)ARG1(arg); | 
|          newgb = (NODE)dp_inv_or_split(gb,f,spec,&inv); | 
   newgb = (NODE)dp_inv_or_split(gb,f,spec,&inv); | 
|          if ( !newgb ) { | 
   if ( !newgb ) { | 
|                  /* invertible */ | 
     /* invertible */ | 
|                  *rp = (Obj)inv; | 
     *rp = (Obj)inv; | 
|          } else { | 
   } else { | 
|                  MKLIST(list,newgb); | 
     MKLIST(list,newgb); | 
|                  *rp = (Obj)list; | 
     *rp = (Obj)list; | 
|          } | 
   } | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_sort(NODE arg,DP *rp) | 
 void Pdp_sort(NODE arg,DP *rp) | 
|  { | 
 { | 
|          dp_sort((DP)ARG0(arg),rp); | 
   dp_sort((DP)ARG0(arg),rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_mdtod(NODE arg,DP *rp) | 
 void Pdp_mdtod(NODE arg,DP *rp) | 
|  { | 
 { | 
|          MP m,mr,mr0; | 
   MP m,mr,mr0; | 
|          DP p; | 
   DP p; | 
|          P t; | 
   P t; | 
|   | 
  | 
|          p = (DP)ARG0(arg); | 
   p = (DP)ARG0(arg); | 
|          if ( !p ) | 
   if ( !p ) | 
|                  *rp = 0; | 
     *rp = 0; | 
|          else { | 
   else { | 
|                  for ( mr0 = 0, m = BDY(p); m; m = NEXT(m) ) { | 
     for ( mr0 = 0, m = BDY(p); m; m = NEXT(m) ) { | 
|                          mptop((P)m->c,&t); NEXTMP(mr0,mr); mr->c = (Obj)t; mr->dl = m->dl; | 
       mptop((P)m->c,&t); NEXTMP(mr0,mr); mr->c = (Obj)t; mr->dl = m->dl; | 
|                  } | 
     } | 
|                  NEXT(mr) = 0; MKDP(p->nv,mr0,*rp); (*rp)->sugar = p->sugar; | 
     NEXT(mr) = 0; MKDP(p->nv,mr0,*rp); (*rp)->sugar = p->sugar; | 
|          } | 
   } | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_sep(NODE arg,VECT *rp) | 
 void Pdp_sep(NODE arg,VECT *rp) | 
|  { | 
 { | 
|          DP p,r; | 
   DP p,r; | 
|          MP m,t; | 
   MP m,t; | 
|          MP *w0,*w; | 
   MP *w0,*w; | 
|          int i,n,d,nv,sugar; | 
   int i,n,d,nv,sugar; | 
|          VECT v; | 
   VECT v; | 
|          pointer *pv; | 
   pointer *pv; | 
|   | 
  | 
|          p = (DP)ARG0(arg); m = BDY(p); | 
   p = (DP)ARG0(arg); m = BDY(p); | 
|          d = QTOS((Q)ARG1(arg)); | 
   d = QTOS((Q)ARG1(arg)); | 
|          for ( t = m, n = 0; t; t = NEXT(t), n++ ); | 
   for ( t = m, n = 0; t; t = NEXT(t), n++ ); | 
|          if ( d > n ) | 
   if ( d > n ) | 
|                  d = n; | 
     d = n; | 
|          MKVECT(v,d); *rp = v; | 
   MKVECT(v,d); *rp = v; | 
|          pv = BDY(v); nv = p->nv; sugar = p->sugar; | 
   pv = BDY(v); nv = p->nv; sugar = p->sugar; | 
|          w0 = (MP *)MALLOC(d*sizeof(MP)); bzero(w0,d*sizeof(MP)); | 
   w0 = (MP *)MALLOC(d*sizeof(MP)); bzero(w0,d*sizeof(MP)); | 
|          w = (MP *)MALLOC(d*sizeof(MP)); bzero(w,d*sizeof(MP)); | 
   w = (MP *)MALLOC(d*sizeof(MP)); bzero(w,d*sizeof(MP)); | 
|          for ( t = BDY(p), i = 0; t; t = NEXT(t), i++, i %= d  ) { | 
   for ( t = BDY(p), i = 0; t; t = NEXT(t), i++, i %= d  ) { | 
|                  NEXTMP(w0[i],w[i]); w[i]->c = t->c; w[i]->dl = t->dl; | 
     NEXTMP(w0[i],w[i]); w[i]->c = t->c; w[i]->dl = t->dl; | 
|          } | 
   } | 
|          for ( i = 0; i < d; i++ ) { | 
   for ( i = 0; i < d; i++ ) { | 
|                  NEXT(w[i]) = 0; MKDP(nv,w0[i],r); r->sugar = sugar; | 
     NEXT(w[i]) = 0; MKDP(nv,w0[i],r); r->sugar = sugar; | 
|                  pv[i] = (pointer)r; | 
     pv[i] = (pointer)r; | 
|          } | 
   } | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_idiv(NODE arg,DP *rp) | 
 void Pdp_idiv(NODE arg,DP *rp) | 
|  { | 
 { | 
|          dp_idiv((DP)ARG0(arg),(Q)ARG1(arg),rp); | 
   dp_idiv((DP)ARG0(arg),(Q)ARG1(arg),rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_cont(NODE arg,Q *rp) | 
 void Pdp_cont(NODE arg,Q *rp) | 
|  { | 
 { | 
|          dp_cont((DP)ARG0(arg),rp); | 
   dp_cont((DP)ARG0(arg),rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_dtov(NODE arg,VECT *rp) | 
 void Pdp_dtov(NODE arg,VECT *rp) | 
|  { | 
 { | 
|          dp_dtov((DP)ARG0(arg),rp); | 
   dp_dtov((DP)ARG0(arg),rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_mbase(NODE arg,LIST *rp) | 
 void Pdp_mbase(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          NODE mb; | 
   NODE mb; | 
|   | 
  | 
|          asir_assert(ARG0(arg),O_LIST,"dp_mbase"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_mbase"); | 
|          dp_mbase(BDY((LIST)ARG0(arg)),&mb); | 
   dp_mbase(BDY((LIST)ARG0(arg)),&mb); | 
|          MKLIST(*rp,mb); | 
   MKLIST(*rp,mb); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_etov(NODE arg,VECT *rp) | 
 void Pdp_etov(NODE arg,VECT *rp) | 
|  { | 
 { | 
|          DP dp; | 
   DP dp; | 
|          int n,i; | 
   int n,i; | 
|          int *d; | 
   int *d; | 
|          VECT v; | 
   VECT v; | 
|          Q t; | 
   Q t; | 
|   | 
  | 
|          dp = (DP)ARG0(arg); | 
   dp = (DP)ARG0(arg); | 
|          asir_assert(dp,O_DP,"dp_etov"); | 
   asir_assert(dp,O_DP,"dp_etov"); | 
|          n = dp->nv; d = BDY(dp)->dl->d; | 
   n = dp->nv; d = BDY(dp)->dl->d; | 
|          MKVECT(v,n); | 
   MKVECT(v,n); | 
|          for ( i = 0; i < n; i++ ) { | 
   for ( i = 0; i < n; i++ ) { | 
|                  STOQ(d[i],t); v->body[i] = (pointer)t; | 
     STOQ(d[i],t); v->body[i] = (pointer)t; | 
|          } | 
   } | 
|          *rp = v; | 
   *rp = v; | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_vtoe(NODE arg,DP *rp) | 
 void Pdp_vtoe(NODE arg,DP *rp) | 
|  { | 
 { | 
|          DP dp; | 
   DP dp; | 
|          DL dl; | 
   DL dl; | 
|          MP m; | 
   MP m; | 
|          int n,i,td; | 
   int n,i,td; | 
|          int *d; | 
   int *d; | 
|          VECT v; | 
   VECT v; | 
|   | 
  | 
|          v = (VECT)ARG0(arg); | 
   v = (VECT)ARG0(arg); | 
|          asir_assert(v,O_VECT,"dp_vtoe"); | 
   asir_assert(v,O_VECT,"dp_vtoe"); | 
|          n = v->len; | 
   n = v->len; | 
|          NEWDL(dl,n); d = dl->d; | 
   NEWDL(dl,n); d = dl->d; | 
|          for ( i = 0, td = 0; i < n; i++ ) { | 
   for ( i = 0, td = 0; i < n; i++ ) { | 
|                  d[i] = QTOS((Q)(v->body[i])); td += MUL_WEIGHT(d[i],i); | 
     d[i] = QTOS((Q)(v->body[i])); td += MUL_WEIGHT(d[i],i); | 
|          } | 
   } | 
|          dl->td = td; | 
   dl->td = td; | 
|          NEWMP(m); m->dl = dl; m->c = (Obj)ONE; NEXT(m) = 0; | 
   NEWMP(m); m->dl = dl; m->c = (Obj)ONE; NEXT(m) = 0; | 
|          MKDP(n,m,dp); dp->sugar = td; | 
   MKDP(n,m,dp); dp->sugar = td; | 
|          *rp = dp; | 
   *rp = dp; | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_lnf_mod(NODE arg,LIST *rp) | 
 void Pdp_lnf_mod(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          DP r1,r2; | 
   DP r1,r2; | 
|          NODE b,g,n; | 
   NODE b,g,n; | 
|          int mod; | 
   int mod; | 
|   | 
  | 
|          asir_assert(ARG0(arg),O_LIST,"dp_lnf_mod"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_lnf_mod"); | 
|          asir_assert(ARG1(arg),O_LIST,"dp_lnf_mod"); | 
   asir_assert(ARG1(arg),O_LIST,"dp_lnf_mod"); | 
|          asir_assert(ARG2(arg),O_N,"dp_lnf_mod"); | 
   asir_assert(ARG2(arg),O_N,"dp_lnf_mod"); | 
|          b = BDY((LIST)ARG0(arg)); g = BDY((LIST)ARG1(arg)); | 
   b = BDY((LIST)ARG0(arg)); g = BDY((LIST)ARG1(arg)); | 
|          mod = QTOS((Q)ARG2(arg)); | 
   mod = QTOS((Q)ARG2(arg)); | 
|          dp_lnf_mod((DP)BDY(b),(DP)BDY(NEXT(b)),g,mod,&r1,&r2); | 
   dp_lnf_mod((DP)BDY(b),(DP)BDY(NEXT(b)),g,mod,&r1,&r2); | 
|          NEWNODE(n); BDY(n) = (pointer)r1; | 
   NEWNODE(n); BDY(n) = (pointer)r1; | 
|          NEWNODE(NEXT(n)); BDY(NEXT(n)) = (pointer)r2; | 
   NEWNODE(NEXT(n)); BDY(NEXT(n)) = (pointer)r2; | 
|          NEXT(NEXT(n)) = 0; MKLIST(*rp,n); | 
   NEXT(NEXT(n)) = 0; MKLIST(*rp,n); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_lnf_f(NODE arg,LIST *rp) | 
 void Pdp_lnf_f(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          DP r1,r2; | 
   DP r1,r2; | 
|          NODE b,g,n; | 
   NODE b,g,n; | 
|   | 
  | 
|          asir_assert(ARG0(arg),O_LIST,"dp_lnf_f"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_lnf_f"); | 
|          asir_assert(ARG1(arg),O_LIST,"dp_lnf_f"); | 
   asir_assert(ARG1(arg),O_LIST,"dp_lnf_f"); | 
|          b = BDY((LIST)ARG0(arg)); g = BDY((LIST)ARG1(arg)); | 
   b = BDY((LIST)ARG0(arg)); g = BDY((LIST)ARG1(arg)); | 
|          dp_lnf_f((DP)BDY(b),(DP)BDY(NEXT(b)),g,&r1,&r2); | 
   dp_lnf_f((DP)BDY(b),(DP)BDY(NEXT(b)),g,&r1,&r2); | 
|          NEWNODE(n); BDY(n) = (pointer)r1; | 
   NEWNODE(n); BDY(n) = (pointer)r1; | 
|          NEWNODE(NEXT(n)); BDY(NEXT(n)) = (pointer)r2; | 
   NEWNODE(NEXT(n)); BDY(NEXT(n)) = (pointer)r2; | 
|          NEXT(NEXT(n)) = 0; MKLIST(*rp,n); | 
   NEXT(NEXT(n)) = 0; MKLIST(*rp,n); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_nf_tab_mod(NODE arg,DP *rp) | 
 void Pdp_nf_tab_mod(NODE arg,DP *rp) | 
|  { | 
 { | 
|          asir_assert(ARG0(arg),O_DP,"dp_nf_tab_mod"); | 
   asir_assert(ARG0(arg),O_DP,"dp_nf_tab_mod"); | 
|          asir_assert(ARG1(arg),O_VECT,"dp_nf_tab_mod"); | 
   asir_assert(ARG1(arg),O_VECT,"dp_nf_tab_mod"); | 
|          asir_assert(ARG2(arg),O_N,"dp_nf_tab_mod"); | 
   asir_assert(ARG2(arg),O_N,"dp_nf_tab_mod"); | 
|          dp_nf_tab_mod((DP)ARG0(arg),(LIST *)BDY((VECT)ARG1(arg)), | 
   dp_nf_tab_mod((DP)ARG0(arg),(LIST *)BDY((VECT)ARG1(arg)), | 
|                  QTOS((Q)ARG2(arg)),rp); | 
     QTOS((Q)ARG2(arg)),rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_nf_tab_f(NODE arg,DP *rp) | 
 void Pdp_nf_tab_f(NODE arg,DP *rp) | 
|  { | 
 { | 
|          asir_assert(ARG0(arg),O_DP,"dp_nf_tab_f"); | 
   asir_assert(ARG0(arg),O_DP,"dp_nf_tab_f"); | 
|          asir_assert(ARG1(arg),O_VECT,"dp_nf_tab_f"); | 
   asir_assert(ARG1(arg),O_VECT,"dp_nf_tab_f"); | 
|          dp_nf_tab_f((DP)ARG0(arg),(LIST *)BDY((VECT)ARG1(arg)),rp); | 
   dp_nf_tab_f((DP)ARG0(arg),(LIST *)BDY((VECT)ARG1(arg)),rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_ord(NODE arg,Obj *rp) | 
 void Pdp_ord(NODE arg,Obj *rp) | 
|  { | 
 { | 
|          struct order_spec *spec; | 
   struct order_spec *spec; | 
|          LIST v; | 
   LIST v; | 
|          struct oLIST f; | 
   struct oLIST f; | 
|          Num homo; | 
   Num homo; | 
|          int modular; | 
   int modular; | 
|   | 
  | 
|          f.id = O_LIST; f.body = 0; | 
   f.id = O_LIST; f.body = 0; | 
|          if ( !arg && !current_option ) | 
   if ( !arg && !current_option ) | 
|                  *rp = dp_current_spec->obj; | 
     *rp = dp_current_spec->obj; | 
|          else { | 
   else { | 
|                  if ( current_option ) | 
     if ( current_option ) | 
|                          parse_gr_option(&f,current_option,&v,&homo,&modular,&spec); | 
       parse_gr_option(&f,current_option,&v,&homo,&modular,&spec); | 
|                  else if ( !create_order_spec(0,(Obj)ARG0(arg),&spec) ) | 
     else if ( !create_order_spec(0,(Obj)ARG0(arg),&spec) ) | 
|                          error("dp_ord : invalid order specification"); | 
       error("dp_ord : invalid order specification"); | 
|                  initd(spec); *rp = spec->obj; | 
     initd(spec); *rp = spec->obj; | 
|          } | 
   } | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_ptod(NODE arg,DP *rp) | 
 void Pdp_ptod(NODE arg,DP *rp) | 
|  { | 
 { | 
|          P p; | 
   P p; | 
|          NODE n; | 
   NODE n; | 
|          VL vl,tvl; | 
   VL vl,tvl; | 
|          struct oLIST f; | 
   struct oLIST f; | 
|          int ac; | 
   int ac; | 
|          LIST v; | 
   LIST v; | 
|          Num homo; | 
   Num homo; | 
|          int modular; | 
   int modular; | 
|          struct order_spec *ord; | 
   struct order_spec *ord; | 
|   | 
  | 
|          asir_assert(ARG0(arg),O_P,"dp_ptod"); | 
   asir_assert(ARG0(arg),O_P,"dp_ptod"); | 
|          p = (P)ARG0(arg); | 
   p = (P)ARG0(arg); | 
|          ac = argc(arg); | 
   ac = argc(arg); | 
|          if ( ac == 1 ) { | 
   if ( ac == 1 ) { | 
|                  if ( current_option ) { | 
     if ( current_option ) { | 
|                          f.id = O_LIST; f.body = mknode(1,p); | 
       f.id = O_LIST; f.body = mknode(1,p); | 
|                          parse_gr_option(&f,current_option,&v,&homo,&modular,&ord); | 
       parse_gr_option(&f,current_option,&v,&homo,&modular,&ord); | 
|                          initd(ord); | 
       initd(ord); | 
|                  } else | 
     } else | 
|                          error("dp_ptod : invalid argument"); | 
       error("dp_ptod : invalid argument"); | 
|          } else { | 
   } else { | 
|                  asir_assert(ARG1(arg),O_LIST,"dp_ptod"); | 
     asir_assert(ARG1(arg),O_LIST,"dp_ptod"); | 
|                  v = (LIST)ARG1(arg); | 
     v = (LIST)ARG1(arg); | 
|          } | 
   } | 
|          for ( vl = 0, n = BDY(v); n; n = NEXT(n) ) { | 
   for ( vl = 0, n = BDY(v); n; n = NEXT(n) ) { | 
|                  if ( !vl ) { | 
     if ( !vl ) { | 
|                          NEWVL(vl); tvl = vl; | 
       NEWVL(vl); tvl = vl; | 
|                  } else { | 
     } else { | 
|                          NEWVL(NEXT(tvl)); tvl = NEXT(tvl); | 
       NEWVL(NEXT(tvl)); tvl = NEXT(tvl); | 
|                  } | 
     } | 
|                  VR(tvl) = VR((P)BDY(n)); | 
     VR(tvl) = VR((P)BDY(n)); | 
|          } | 
   } | 
|          if ( vl ) | 
   if ( vl ) | 
|                  NEXT(tvl) = 0; | 
     NEXT(tvl) = 0; | 
|          ptod(CO,vl,p,rp); | 
   ptod(CO,vl,p,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Phomogenize(NODE arg,Obj *rp) | 
 void Phomogenize(NODE arg,Obj *rp) | 
|  { | 
 { | 
|          P p; | 
   P p; | 
|          DP d,h; | 
   DP d,h; | 
|          NODE n; | 
   NODE n; | 
|          V hv; | 
   V hv; | 
|          VL vl,tvl,last; | 
   VL vl,tvl,last; | 
|          struct oLIST f; | 
   struct oLIST f; | 
|          LIST v; | 
   LIST v; | 
|   | 
  | 
|          asir_assert(ARG0(arg),O_P,"homogenize"); | 
   asir_assert(ARG0(arg),O_P,"homogenize"); | 
|          p = (P)ARG0(arg); | 
   p = (P)ARG0(arg); | 
|          asir_assert(ARG1(arg),O_LIST,"homogenize"); | 
   asir_assert(ARG1(arg),O_LIST,"homogenize"); | 
|          v = (LIST)ARG1(arg); | 
   v = (LIST)ARG1(arg); | 
|          asir_assert(ARG2(arg),O_P,"homogenize"); | 
   asir_assert(ARG2(arg),O_P,"homogenize"); | 
|          hv = VR((P)ARG2(arg)); | 
   hv = VR((P)ARG2(arg)); | 
|          for ( vl = 0, n = BDY(v); n; n = NEXT(n) ) { | 
   for ( vl = 0, n = BDY(v); n; n = NEXT(n) ) { | 
|                  if ( !vl ) { | 
     if ( !vl ) { | 
|                          NEWVL(vl); tvl = vl; | 
       NEWVL(vl); tvl = vl; | 
|                  } else { | 
     } else { | 
|                          NEWVL(NEXT(tvl)); tvl = NEXT(tvl); | 
       NEWVL(NEXT(tvl)); tvl = NEXT(tvl); | 
|                  } | 
     } | 
|                  VR(tvl) = VR((P)BDY(n)); | 
     VR(tvl) = VR((P)BDY(n)); | 
|          } | 
   } | 
|          if ( vl ) { | 
   if ( vl ) { | 
|                  last = tvl; | 
     last = tvl; | 
|                  NEXT(tvl) = 0; | 
     NEXT(tvl) = 0; | 
|          } | 
   } | 
|          ptod(CO,vl,p,&d); | 
   ptod(CO,vl,p,&d); | 
|          dp_homo(d,&h); | 
   dp_homo(d,&h); | 
|          NEWVL(NEXT(last)); last = NEXT(last); | 
   NEWVL(NEXT(last)); last = NEXT(last); | 
|          VR(last) = hv; NEXT(last) = 0; | 
   VR(last) = hv; NEXT(last) = 0; | 
|          dtop(CO,vl,h,rp); | 
   dtop(CO,vl,h,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_ltod(NODE arg,DPV *rp) | 
 void Pdp_ltod(NODE arg,DPV *rp) | 
|  { | 
 { | 
|          NODE n; | 
   NODE n; | 
|          VL vl,tvl; | 
   VL vl,tvl; | 
|          LIST f,v; | 
   LIST f,v; | 
|          int sugar,i,len,ac,modular; | 
   int sugar,i,len,ac,modular; | 
|          Num homo; | 
   Num homo; | 
|          struct order_spec *ord; | 
   struct order_spec *ord; | 
|          DP *e; | 
   DP *e; | 
|          NODE nd,t; | 
   NODE nd,t; | 
|   | 
  | 
|          ac = argc(arg); | 
   ac = argc(arg); | 
|          asir_assert(ARG0(arg),O_LIST,"dp_ptod"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_ptod"); | 
|          f = (LIST)ARG0(arg); | 
   f = (LIST)ARG0(arg); | 
|          if ( ac == 1 ) { | 
   if ( ac == 1 ) { | 
|                  if ( current_option ) { | 
     if ( current_option ) { | 
|                          parse_gr_option(f,current_option,&v,&homo,&modular,&ord); | 
       parse_gr_option(f,current_option,&v,&homo,&modular,&ord); | 
|                          initd(ord); | 
       initd(ord); | 
|                  } else | 
     } else | 
|                          error("dp_ltod : invalid argument"); | 
       error("dp_ltod : invalid argument"); | 
|          } else { | 
   } else { | 
|                  asir_assert(ARG1(arg),O_LIST,"dp_ptod"); | 
     asir_assert(ARG1(arg),O_LIST,"dp_ptod"); | 
|                  v = (LIST)ARG1(arg); | 
     v = (LIST)ARG1(arg); | 
|          } | 
   } | 
|          for ( vl = 0, n = BDY(v); n; n = NEXT(n) ) { | 
   for ( vl = 0, n = BDY(v); n; n = NEXT(n) ) { | 
|                  if ( !vl ) { | 
     if ( !vl ) { | 
|                          NEWVL(vl); tvl = vl; | 
       NEWVL(vl); tvl = vl; | 
|                  } else { | 
     } else { | 
|                          NEWVL(NEXT(tvl)); tvl = NEXT(tvl); | 
       NEWVL(NEXT(tvl)); tvl = NEXT(tvl); | 
|                  } | 
     } | 
|                  VR(tvl) = VR((P)BDY(n)); | 
     VR(tvl) = VR((P)BDY(n)); | 
|          } | 
   } | 
|          if ( vl ) | 
   if ( vl ) | 
|                  NEXT(tvl) = 0; | 
     NEXT(tvl) = 0; | 
|   | 
  | 
|          nd = BDY(f); | 
   nd = BDY(f); | 
|          len = length(nd); | 
   len = length(nd); | 
|          e = (DP *)MALLOC(len*sizeof(DP)); | 
   e = (DP *)MALLOC(len*sizeof(DP)); | 
|          sugar = 0; | 
   sugar = 0; | 
|          for ( i = 0, t = nd; i < len; i++, t = NEXT(t) ) { | 
   for ( i = 0, t = nd; i < len; i++, t = NEXT(t) ) { | 
|                  ptod(CO,vl,(P)BDY(t),&e[i]); | 
     ptod(CO,vl,(P)BDY(t),&e[i]); | 
|                  if ( e[i] ) | 
     if ( e[i] ) | 
|                          sugar = MAX(sugar,e[i]->sugar); | 
       sugar = MAX(sugar,e[i]->sugar); | 
|          } | 
   } | 
|          MKDPV(len,e,*rp); | 
   MKDPV(len,e,*rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdpm_ltod(NODE arg,DPM *rp) | 
 void Pdpm_ltod(NODE arg,DPM *rp) | 
|  { | 
 { | 
|          NODE n; | 
   NODE n; | 
|          VL vl,tvl; | 
   VL vl,tvl; | 
|          LIST f,v; | 
   LIST f,v; | 
|          int i,len; | 
   int i,len; | 
|          NODE nd; | 
   NODE nd; | 
|    NODE t; | 
   NODE t; | 
|    DP d; | 
   DP d; | 
|    DPM s,u,w; | 
   DPM s,u,w; | 
|   | 
  | 
|    f = (LIST)ARG0(arg); | 
   f = (LIST)ARG0(arg); | 
|    v = (LIST)ARG1(arg); | 
   v = (LIST)ARG1(arg); | 
|          for ( vl = 0, n = BDY(v); n; n = NEXT(n) ) { | 
   for ( vl = 0, n = BDY(v); n; n = NEXT(n) ) { | 
|                  if ( !vl ) { | 
     if ( !vl ) { | 
|                          NEWVL(vl); tvl = vl; | 
       NEWVL(vl); tvl = vl; | 
|                  } else { | 
     } else { | 
|                          NEWVL(NEXT(tvl)); tvl = NEXT(tvl); | 
       NEWVL(NEXT(tvl)); tvl = NEXT(tvl); | 
|                  } | 
     } | 
|                  VR(tvl) = VR((P)BDY(n)); | 
     VR(tvl) = VR((P)BDY(n)); | 
|          } | 
   } | 
|          if ( vl ) | 
   if ( vl ) | 
|                  NEXT(tvl) = 0; | 
     NEXT(tvl) = 0; | 
|   | 
  | 
|          nd = BDY(f); | 
   nd = BDY(f); | 
|          len = length(nd); | 
   len = length(nd); | 
|          for ( i = 0, t = nd, s = 0; i < len; i++, t = NEXT(t) ) { | 
   for ( i = 0, t = nd, s = 0; i < len; i++, t = NEXT(t) ) { | 
|                  ptod(CO,vl,(P)BDY(t),&d); | 
     ptod(CO,vl,(P)BDY(t),&d); | 
|      dtodpm(d,i,&u); | 
     dtodpm(d,i,&u); | 
|      adddpm(CO,s,u,&w); s = w; | 
     adddpm(CO,s,u,&w); s = w; | 
|          } | 
   } | 
|    *rp = s; | 
   *rp = s; | 
|  } | 
 } | 
|   | 
  | 
| Line 777  void Pdpm_dtol(NODE arg,LIST *rp) | 
 
  | 
| Line 777  void Pdpm_dtol(NODE arg,LIST *rp) | 
 
 
 | 
|      } | 
     } | 
|      VR(tvl) = VR((P)BDY(nd)); | 
     VR(tvl) = VR((P)BDY(nd)); | 
|    } | 
   } | 
|          if ( vl ) | 
   if ( vl ) | 
|                  NEXT(tvl) = 0; | 
     NEXT(tvl) = 0; | 
|     n = QTOS((Q)ARG2(arg)); | 
    n = QTOS((Q)ARG2(arg)); | 
|     w = (MP *)CALLOC(n,sizeof(MP)); | 
    w = (MP *)CALLOC(n,sizeof(MP)); | 
|     for ( t = BDY(a), len = 0; t; t = NEXT(t) ) len++; | 
    for ( t = BDY(a), len = 0; t; t = NEXT(t) ) len++; | 
| Line 792  void Pdpm_dtol(NODE arg,LIST *rp) | 
 
  | 
| Line 792  void Pdpm_dtol(NODE arg,LIST *rp) | 
 
 
 | 
|     } | 
    } | 
|    nd = 0; | 
   nd = 0; | 
|    for ( i = n-1; i >= 0; i-- ) { | 
   for ( i = n-1; i >= 0; i-- ) { | 
|                  MKDP(nv,w[i],u); u->sugar = a->sugar; /* XXX */ | 
     MKDP(nv,w[i],u); u->sugar = a->sugar; /* XXX */ | 
|            dtop(CO,vl,u,&s); | 
     dtop(CO,vl,u,&s); | 
|            MKNODE(nd1,s,nd); nd = nd1; | 
     MKNODE(nd1,s,nd); nd = nd1; | 
|    } | 
   } | 
|    MKLIST(*rp,nd); | 
   MKLIST(*rp,nd); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_dtop(NODE arg,Obj *rp) | 
 void Pdp_dtop(NODE arg,Obj *rp) | 
|  { | 
 { | 
|          NODE n; | 
   NODE n; | 
|          VL vl,tvl; | 
   VL vl,tvl; | 
|   | 
  | 
|          asir_assert(ARG0(arg),O_DP,"dp_dtop"); | 
   asir_assert(ARG0(arg),O_DP,"dp_dtop"); | 
|          asir_assert(ARG1(arg),O_LIST,"dp_dtop"); | 
   asir_assert(ARG1(arg),O_LIST,"dp_dtop"); | 
|          for ( vl = 0, n = BDY((LIST)ARG1(arg)); n; n = NEXT(n) ) { | 
   for ( vl = 0, n = BDY((LIST)ARG1(arg)); n; n = NEXT(n) ) { | 
|                  if ( !vl ) { | 
     if ( !vl ) { | 
|                          NEWVL(vl); tvl = vl; | 
       NEWVL(vl); tvl = vl; | 
|                  } else { | 
     } else { | 
|                          NEWVL(NEXT(tvl)); tvl = NEXT(tvl); | 
       NEWVL(NEXT(tvl)); tvl = NEXT(tvl); | 
|                  } | 
     } | 
|                  VR(tvl) = VR((P)BDY(n)); | 
     VR(tvl) = VR((P)BDY(n)); | 
|          } | 
   } | 
|          if ( vl ) | 
   if ( vl ) | 
|                  NEXT(tvl) = 0; | 
     NEXT(tvl) = 0; | 
|          dtop(CO,vl,(DP)ARG0(arg),rp); | 
   dtop(CO,vl,(DP)ARG0(arg),rp); | 
|  } | 
 } | 
|   | 
  | 
|  extern LIST Dist; | 
 extern LIST Dist; | 
|   | 
  | 
|  void Pdp_ptozp(NODE arg,Obj *rp) | 
 void Pdp_ptozp(NODE arg,Obj *rp) | 
|  { | 
 { | 
|          Q t; | 
   Q t; | 
|      NODE tt,p; | 
     NODE tt,p; | 
|      NODE n,n0; | 
     NODE n,n0; | 
|      char *key; | 
     char *key; | 
|          DP pp; | 
   DP pp; | 
|          LIST list; | 
   LIST list; | 
|      int get_factor=0; | 
     int get_factor=0; | 
|   | 
  | 
|          asir_assert(ARG0(arg),O_DP,"dp_ptozp"); | 
   asir_assert(ARG0(arg),O_DP,"dp_ptozp"); | 
|   | 
  | 
|      /* analyze the option */ | 
     /* analyze the option */ | 
|      if ( current_option ) { | 
     if ( current_option ) { | 
| Line 846  void Pdp_ptozp(NODE arg,Obj *rp) | 
 
  | 
| Line 846  void Pdp_ptozp(NODE arg,Obj *rp) | 
 
 
 | 
|        } | 
       } | 
|      } | 
     } | 
|   | 
  | 
|          dp_ptozp3((DP)ARG0(arg),&t,&pp); | 
   dp_ptozp3((DP)ARG0(arg),&t,&pp); | 
|   | 
  | 
|      /* printexpr(NULL,t); */ | 
     /* printexpr(NULL,t); */ | 
|          /* if the option factor is given, then it returns the answer | 
   /* if the option factor is given, then it returns the answer | 
|         in the format [zpoly, num] where num*zpoly is equal to the argument.*/ | 
        in the format [zpoly, num] where num*zpoly is equal to the argument.*/ | 
|      if (get_factor) { | 
     if (get_factor) { | 
|            n0 = mknode(2,pp,t); | 
     n0 = mknode(2,pp,t); | 
|        MKLIST(list,n0); | 
       MKLIST(list,n0); | 
|            *rp = (Obj)list; | 
     *rp = (Obj)list; | 
|      } else | 
     } else | 
|        *rp = (Obj)pp; | 
       *rp = (Obj)pp; | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_ptozp2(NODE arg,LIST *rp) | 
 void Pdp_ptozp2(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          DP p0,p1,h,r; | 
   DP p0,p1,h,r; | 
|          NODE n0; | 
   NODE n0; | 
|   | 
  | 
|          p0 = (DP)ARG0(arg); p1 = (DP)ARG1(arg); | 
   p0 = (DP)ARG0(arg); p1 = (DP)ARG1(arg); | 
|          asir_assert(p0,O_DP,"dp_ptozp2"); | 
   asir_assert(p0,O_DP,"dp_ptozp2"); | 
|          asir_assert(p1,O_DP,"dp_ptozp2"); | 
   asir_assert(p1,O_DP,"dp_ptozp2"); | 
|          dp_ptozp2(p0,p1,&h,&r); | 
   dp_ptozp2(p0,p1,&h,&r); | 
|          NEWNODE(n0); BDY(n0) = (pointer)h; | 
   NEWNODE(n0); BDY(n0) = (pointer)h; | 
|          NEWNODE(NEXT(n0)); BDY(NEXT(n0)) = (pointer)r; | 
   NEWNODE(NEXT(n0)); BDY(NEXT(n0)) = (pointer)r; | 
|          NEXT(NEXT(n0)) = 0; | 
   NEXT(NEXT(n0)) = 0; | 
|          MKLIST(*rp,n0); | 
   MKLIST(*rp,n0); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_prim(NODE arg,DP *rp) | 
 void Pdp_prim(NODE arg,DP *rp) | 
|  { | 
 { | 
|          DP t; | 
   DP t; | 
|   | 
  | 
|          asir_assert(ARG0(arg),O_DP,"dp_prim"); | 
   asir_assert(ARG0(arg),O_DP,"dp_prim"); | 
|          dp_prim((DP)ARG0(arg),&t); dp_ptozp(t,rp); | 
   dp_prim((DP)ARG0(arg),&t); dp_ptozp(t,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_mod(NODE arg,DP *rp) | 
 void Pdp_mod(NODE arg,DP *rp) | 
|  { | 
 { | 
|          DP p; | 
   DP p; | 
|          int mod; | 
   int mod; | 
|          NODE subst; | 
   NODE subst; | 
|   | 
  | 
|          asir_assert(ARG0(arg),O_DP,"dp_mod"); | 
   asir_assert(ARG0(arg),O_DP,"dp_mod"); | 
|          asir_assert(ARG1(arg),O_N,"dp_mod"); | 
   asir_assert(ARG1(arg),O_N,"dp_mod"); | 
|          asir_assert(ARG2(arg),O_LIST,"dp_mod"); | 
   asir_assert(ARG2(arg),O_LIST,"dp_mod"); | 
|          p = (DP)ARG0(arg); mod = QTOS((Q)ARG1(arg)); | 
   p = (DP)ARG0(arg); mod = QTOS((Q)ARG1(arg)); | 
|          subst = BDY((LIST)ARG2(arg)); | 
   subst = BDY((LIST)ARG2(arg)); | 
|          dp_mod(p,mod,subst,rp); | 
   dp_mod(p,mod,subst,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_rat(NODE arg,DP *rp) | 
 void Pdp_rat(NODE arg,DP *rp) | 
|  { | 
 { | 
|          asir_assert(ARG0(arg),O_DP,"dp_rat"); | 
   asir_assert(ARG0(arg),O_DP,"dp_rat"); | 
|          dp_rat((DP)ARG0(arg),rp); | 
   dp_rat((DP)ARG0(arg),rp); | 
|  } | 
 } | 
|   | 
  | 
|  extern int DP_Multiple; | 
 extern int DP_Multiple; | 
|   | 
  | 
|  void Pdp_nf(NODE arg,DP *rp) | 
 void Pdp_nf(NODE arg,DP *rp) | 
|  { | 
 { | 
|          NODE b; | 
   NODE b; | 
|          DP *ps; | 
   DP *ps; | 
|          DP g; | 
   DP g; | 
|          int full; | 
   int full; | 
|   | 
  | 
|          do_weyl = 0; dp_fcoeffs = 0; | 
   do_weyl = 0; dp_fcoeffs = 0; | 
|          asir_assert(ARG0(arg),O_LIST,"dp_nf"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_nf"); | 
|          asir_assert(ARG1(arg),O_DP,"dp_nf"); | 
   asir_assert(ARG1(arg),O_DP,"dp_nf"); | 
|          asir_assert(ARG2(arg),O_VECT,"dp_nf"); | 
   asir_assert(ARG2(arg),O_VECT,"dp_nf"); | 
|          asir_assert(ARG3(arg),O_N,"dp_nf"); | 
   asir_assert(ARG3(arg),O_N,"dp_nf"); | 
|          if ( !(g = (DP)ARG1(arg)) ) { | 
   if ( !(g = (DP)ARG1(arg)) ) { | 
|                  *rp = 0; return; | 
     *rp = 0; return; | 
|          } | 
   } | 
|          b = BDY((LIST)ARG0(arg)); ps = (DP *)BDY((VECT)ARG2(arg)); | 
   b = BDY((LIST)ARG0(arg)); ps = (DP *)BDY((VECT)ARG2(arg)); | 
|          full = (Q)ARG3(arg) ? 1 : 0; | 
   full = (Q)ARG3(arg) ? 1 : 0; | 
|          dp_nf_z(b,g,ps,full,DP_Multiple,rp); | 
   dp_nf_z(b,g,ps,full,DP_Multiple,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_weyl_nf(NODE arg,DP *rp) | 
 void Pdp_weyl_nf(NODE arg,DP *rp) | 
|  { | 
 { | 
|          NODE b; | 
   NODE b; | 
|          DP *ps; | 
   DP *ps; | 
|          DP g; | 
   DP g; | 
|          int full; | 
   int full; | 
|   | 
  | 
|          asir_assert(ARG0(arg),O_LIST,"dp_weyl_nf"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_weyl_nf"); | 
|          asir_assert(ARG1(arg),O_DP,"dp_weyl_nf"); | 
   asir_assert(ARG1(arg),O_DP,"dp_weyl_nf"); | 
|          asir_assert(ARG2(arg),O_VECT,"dp_weyl_nf"); | 
   asir_assert(ARG2(arg),O_VECT,"dp_weyl_nf"); | 
|          asir_assert(ARG3(arg),O_N,"dp_weyl_nf"); | 
   asir_assert(ARG3(arg),O_N,"dp_weyl_nf"); | 
|          if ( !(g = (DP)ARG1(arg)) ) { | 
   if ( !(g = (DP)ARG1(arg)) ) { | 
|                  *rp = 0; return; | 
     *rp = 0; return; | 
|          } | 
   } | 
|          b = BDY((LIST)ARG0(arg)); ps = (DP *)BDY((VECT)ARG2(arg)); | 
   b = BDY((LIST)ARG0(arg)); ps = (DP *)BDY((VECT)ARG2(arg)); | 
|          full = (Q)ARG3(arg) ? 1 : 0; | 
   full = (Q)ARG3(arg) ? 1 : 0; | 
|          do_weyl = 1; | 
   do_weyl = 1; | 
|          dp_nf_z(b,g,ps,full,DP_Multiple,rp); | 
   dp_nf_z(b,g,ps,full,DP_Multiple,rp); | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|  } | 
 } | 
|   | 
  | 
|  void Pdpm_nf(NODE arg,DP *rp) | 
 void Pdpm_nf(NODE arg,DP *rp) | 
|  { | 
 { | 
|          NODE b; | 
   NODE b; | 
|          DPM *ps; | 
   DPM *ps; | 
|          DPM g; | 
   DPM g; | 
|          int full; | 
   int full; | 
|   | 
  | 
|          if ( !(g = (DPM)ARG1(arg)) ) { | 
   if ( !(g = (DPM)ARG1(arg)) ) { | 
|                  *rp = 0; return; | 
     *rp = 0; return; | 
|          } | 
   } | 
|          do_weyl = 0; dp_fcoeffs = 0; | 
   do_weyl = 0; dp_fcoeffs = 0; | 
|          asir_assert(ARG0(arg),O_LIST,"dpm_nf"); | 
   asir_assert(ARG0(arg),O_LIST,"dpm_nf"); | 
|          asir_assert(ARG1(arg),O_DPM,"dpm_nf"); | 
   asir_assert(ARG1(arg),O_DPM,"dpm_nf"); | 
|          asir_assert(ARG2(arg),O_VECT,"dpm_nf"); | 
   asir_assert(ARG2(arg),O_VECT,"dpm_nf"); | 
|          asir_assert(ARG3(arg),O_N,"dpm_nf"); | 
   asir_assert(ARG3(arg),O_N,"dpm_nf"); | 
|          b = BDY((LIST)ARG0(arg)); ps = (DPM *)BDY((VECT)ARG2(arg)); | 
   b = BDY((LIST)ARG0(arg)); ps = (DPM *)BDY((VECT)ARG2(arg)); | 
|          full = (Q)ARG3(arg) ? 1 : 0; | 
   full = (Q)ARG3(arg) ? 1 : 0; | 
|          dpm_nf_z(b,g,ps,full,DP_Multiple,rp); | 
   dpm_nf_z(b,g,ps,full,DP_Multiple,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdpm_weyl_nf(NODE arg,DPM *rp) | 
 void Pdpm_weyl_nf(NODE arg,DPM *rp) | 
|  { | 
 { | 
|          NODE b; | 
   NODE b; | 
|          DPM *ps; | 
   DPM *ps; | 
|          DPM g; | 
   DPM g; | 
|          int full; | 
   int full; | 
|   | 
  | 
|          if ( !(g = (DPM)ARG1(arg)) ) { | 
   if ( !(g = (DPM)ARG1(arg)) ) { | 
|                  *rp = 0; return; | 
     *rp = 0; return; | 
|          } | 
   } | 
|          asir_assert(ARG0(arg),O_LIST,"dpm_weyl_nf"); | 
   asir_assert(ARG0(arg),O_LIST,"dpm_weyl_nf"); | 
|          asir_assert(ARG1(arg),O_DPM,"dpm_weyl_nf"); | 
   asir_assert(ARG1(arg),O_DPM,"dpm_weyl_nf"); | 
|          asir_assert(ARG2(arg),O_VECT,"dpm_weyl_nf"); | 
   asir_assert(ARG2(arg),O_VECT,"dpm_weyl_nf"); | 
|          asir_assert(ARG3(arg),O_N,"dpm_weyl_nf"); | 
   asir_assert(ARG3(arg),O_N,"dpm_weyl_nf"); | 
|          b = BDY((LIST)ARG0(arg)); ps = (DPM *)BDY((VECT)ARG2(arg)); | 
   b = BDY((LIST)ARG0(arg)); ps = (DPM *)BDY((VECT)ARG2(arg)); | 
|          full = (Q)ARG3(arg) ? 1 : 0; | 
   full = (Q)ARG3(arg) ? 1 : 0; | 
|          do_weyl = 1; | 
   do_weyl = 1; | 
|          dpm_nf_z(b,g,ps,full,DP_Multiple,rp); | 
   dpm_nf_z(b,g,ps,full,DP_Multiple,rp); | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|  } | 
 } | 
|   | 
  | 
|  /* nf computation using field operations */ | 
 /* nf computation using field operations */ | 
|   | 
  | 
|  void Pdp_nf_f(NODE arg,DP *rp) | 
 void Pdp_nf_f(NODE arg,DP *rp) | 
|  { | 
 { | 
|          NODE b; | 
   NODE b; | 
|          DP *ps; | 
   DP *ps; | 
|          DP g; | 
   DP g; | 
|          int full; | 
   int full; | 
|   | 
  | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|          asir_assert(ARG0(arg),O_LIST,"dp_nf_f"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_nf_f"); | 
|          asir_assert(ARG1(arg),O_DP,"dp_nf_f"); | 
   asir_assert(ARG1(arg),O_DP,"dp_nf_f"); | 
|          asir_assert(ARG2(arg),O_VECT,"dp_nf_f"); | 
   asir_assert(ARG2(arg),O_VECT,"dp_nf_f"); | 
|          asir_assert(ARG3(arg),O_N,"dp_nf_f"); | 
   asir_assert(ARG3(arg),O_N,"dp_nf_f"); | 
|          if ( !(g = (DP)ARG1(arg)) ) { | 
   if ( !(g = (DP)ARG1(arg)) ) { | 
|                  *rp = 0; return; | 
     *rp = 0; return; | 
|          } | 
   } | 
|          b = BDY((LIST)ARG0(arg)); ps = (DP *)BDY((VECT)ARG2(arg)); | 
   b = BDY((LIST)ARG0(arg)); ps = (DP *)BDY((VECT)ARG2(arg)); | 
|          full = (Q)ARG3(arg) ? 1 : 0; | 
   full = (Q)ARG3(arg) ? 1 : 0; | 
|          dp_nf_f(b,g,ps,full,rp); | 
   dp_nf_f(b,g,ps,full,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_weyl_nf_f(NODE arg,DP *rp) | 
 void Pdp_weyl_nf_f(NODE arg,DP *rp) | 
|  { | 
 { | 
|          NODE b; | 
   NODE b; | 
|          DP *ps; | 
   DP *ps; | 
|          DP g; | 
   DP g; | 
|          int full; | 
   int full; | 
|   | 
  | 
|          asir_assert(ARG0(arg),O_LIST,"dp_weyl_nf_f"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_weyl_nf_f"); | 
|          asir_assert(ARG1(arg),O_DP,"dp_weyl_nf_f"); | 
   asir_assert(ARG1(arg),O_DP,"dp_weyl_nf_f"); | 
|          asir_assert(ARG2(arg),O_VECT,"dp_weyl_nf_f"); | 
   asir_assert(ARG2(arg),O_VECT,"dp_weyl_nf_f"); | 
|          asir_assert(ARG3(arg),O_N,"dp_weyl_nf_f"); | 
   asir_assert(ARG3(arg),O_N,"dp_weyl_nf_f"); | 
|          if ( !(g = (DP)ARG1(arg)) ) { | 
   if ( !(g = (DP)ARG1(arg)) ) { | 
|                  *rp = 0; return; | 
     *rp = 0; return; | 
|          } | 
   } | 
|          b = BDY((LIST)ARG0(arg)); ps = (DP *)BDY((VECT)ARG2(arg)); | 
   b = BDY((LIST)ARG0(arg)); ps = (DP *)BDY((VECT)ARG2(arg)); | 
|          full = (Q)ARG3(arg) ? 1 : 0; | 
   full = (Q)ARG3(arg) ? 1 : 0; | 
|          do_weyl = 1; | 
   do_weyl = 1; | 
|          dp_nf_f(b,g,ps,full,rp); | 
   dp_nf_f(b,g,ps,full,rp); | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|  } | 
 } | 
|   | 
  | 
|  void Pdpm_nf_f(NODE arg,DPM *rp) | 
 void Pdpm_nf_f(NODE arg,DPM *rp) | 
|  { | 
 { | 
|          NODE b; | 
   NODE b; | 
|          DPM *ps; | 
   DPM *ps; | 
|          DPM g; | 
   DPM g; | 
|          int full; | 
   int full; | 
|   | 
  | 
|          if ( !(g = (DPM)ARG1(arg)) ) { | 
   if ( !(g = (DPM)ARG1(arg)) ) { | 
|                  *rp = 0; return; | 
     *rp = 0; return; | 
|          } | 
   } | 
|          asir_assert(ARG0(arg),O_LIST,"dpm_nf_f"); | 
   asir_assert(ARG0(arg),O_LIST,"dpm_nf_f"); | 
|          asir_assert(ARG1(arg),O_DPM,"dpm_nf_f"); | 
   asir_assert(ARG1(arg),O_DPM,"dpm_nf_f"); | 
|          asir_assert(ARG2(arg),O_VECT,"dpm_nf_f"); | 
   asir_assert(ARG2(arg),O_VECT,"dpm_nf_f"); | 
|          asir_assert(ARG3(arg),O_N,"dpm_nf_f"); | 
   asir_assert(ARG3(arg),O_N,"dpm_nf_f"); | 
|          b = BDY((LIST)ARG0(arg)); ps = (DPM *)BDY((VECT)ARG2(arg)); | 
   b = BDY((LIST)ARG0(arg)); ps = (DPM *)BDY((VECT)ARG2(arg)); | 
|          full = (Q)ARG3(arg) ? 1 : 0; | 
   full = (Q)ARG3(arg) ? 1 : 0; | 
|          dpm_nf_f(b,g,ps,full,rp); | 
   dpm_nf_f(b,g,ps,full,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdpm_weyl_nf_f(NODE arg,DPM *rp) | 
 void Pdpm_weyl_nf_f(NODE arg,DPM *rp) | 
|  { | 
 { | 
|          NODE b; | 
   NODE b; | 
|          DPM *ps; | 
   DPM *ps; | 
|          DPM g; | 
   DPM g; | 
|          int full; | 
   int full; | 
|   | 
  | 
|          if ( !(g = (DPM)ARG1(arg)) ) { | 
   if ( !(g = (DPM)ARG1(arg)) ) { | 
|                  *rp = 0; return; | 
     *rp = 0; return; | 
|          } | 
   } | 
|          asir_assert(ARG0(arg),O_LIST,"dpm_weyl_nf_f"); | 
   asir_assert(ARG0(arg),O_LIST,"dpm_weyl_nf_f"); | 
|          asir_assert(ARG1(arg),O_DP,"dpm_weyl_nf_f"); | 
   asir_assert(ARG1(arg),O_DP,"dpm_weyl_nf_f"); | 
|          asir_assert(ARG2(arg),O_VECT,"dpm_weyl_nf_f"); | 
   asir_assert(ARG2(arg),O_VECT,"dpm_weyl_nf_f"); | 
|          asir_assert(ARG3(arg),O_N,"dpm_weyl_nf_f"); | 
   asir_assert(ARG3(arg),O_N,"dpm_weyl_nf_f"); | 
|          b = BDY((LIST)ARG0(arg)); ps = (DPM *)BDY((VECT)ARG2(arg)); | 
   b = BDY((LIST)ARG0(arg)); ps = (DPM *)BDY((VECT)ARG2(arg)); | 
|          full = (Q)ARG3(arg) ? 1 : 0; | 
   full = (Q)ARG3(arg) ? 1 : 0; | 
|          do_weyl = 1; | 
   do_weyl = 1; | 
|          dpm_nf_f(b,g,ps,full,rp); | 
   dpm_nf_f(b,g,ps,full,rp); | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|  } | 
 } | 
|   | 
  | 
|   | 
  | 
|  void Pdp_nf_mod(NODE arg,DP *rp) | 
 void Pdp_nf_mod(NODE arg,DP *rp) | 
|  { | 
 { | 
|          NODE b; | 
   NODE b; | 
|          DP g; | 
   DP g; | 
|          DP *ps; | 
   DP *ps; | 
|          int mod,full,ac; | 
   int mod,full,ac; | 
|          NODE n,n0; | 
   NODE n,n0; | 
|   | 
  | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|          ac = argc(arg); | 
   ac = argc(arg); | 
|          asir_assert(ARG0(arg),O_LIST,"dp_nf_mod"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_nf_mod"); | 
|          asir_assert(ARG1(arg),O_DP,"dp_nf_mod"); | 
   asir_assert(ARG1(arg),O_DP,"dp_nf_mod"); | 
|          asir_assert(ARG2(arg),O_VECT,"dp_nf_mod"); | 
   asir_assert(ARG2(arg),O_VECT,"dp_nf_mod"); | 
|          asir_assert(ARG3(arg),O_N,"dp_nf_mod"); | 
   asir_assert(ARG3(arg),O_N,"dp_nf_mod"); | 
|          asir_assert(ARG4(arg),O_N,"dp_nf_mod"); | 
   asir_assert(ARG4(arg),O_N,"dp_nf_mod"); | 
|          if ( !(g = (DP)ARG1(arg)) ) { | 
   if ( !(g = (DP)ARG1(arg)) ) { | 
|                  *rp = 0; return; | 
     *rp = 0; return; | 
|          } | 
   } | 
|          b = BDY((LIST)ARG0(arg)); ps = (DP *)BDY((VECT)ARG2(arg)); | 
   b = BDY((LIST)ARG0(arg)); ps = (DP *)BDY((VECT)ARG2(arg)); | 
|          full = QTOS((Q)ARG3(arg)); mod = QTOS((Q)ARG4(arg)); | 
   full = QTOS((Q)ARG3(arg)); mod = QTOS((Q)ARG4(arg)); | 
|          for ( n0 = n = 0; b; b = NEXT(b) ) { | 
   for ( n0 = n = 0; b; b = NEXT(b) ) { | 
|                  NEXTNODE(n0,n); | 
     NEXTNODE(n0,n); | 
|                  BDY(n) = (pointer)QTOS((Q)BDY(b)); | 
     BDY(n) = (pointer)QTOS((Q)BDY(b)); | 
|          } | 
   } | 
|          if ( n0 ) | 
   if ( n0 ) | 
|                  NEXT(n) = 0; | 
     NEXT(n) = 0; | 
|          dp_nf_mod(n0,g,ps,mod,full,rp); | 
   dp_nf_mod(n0,g,ps,mod,full,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_true_nf(NODE arg,LIST *rp) | 
 void Pdp_true_nf(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          NODE b,n; | 
   NODE b,n; | 
|          DP *ps; | 
   DP *ps; | 
|          DP g; | 
   DP g; | 
|          DP nm; | 
   DP nm; | 
|          P dn; | 
   P dn; | 
|          int full; | 
   int full; | 
|   | 
  | 
|          do_weyl = 0; dp_fcoeffs = 0; | 
   do_weyl = 0; dp_fcoeffs = 0; | 
|          asir_assert(ARG0(arg),O_LIST,"dp_true_nf"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_true_nf"); | 
|          asir_assert(ARG1(arg),O_DP,"dp_true_nf"); | 
   asir_assert(ARG1(arg),O_DP,"dp_true_nf"); | 
|          asir_assert(ARG2(arg),O_VECT,"dp_true_nf"); | 
   asir_assert(ARG2(arg),O_VECT,"dp_true_nf"); | 
|          asir_assert(ARG3(arg),O_N,"dp_nf"); | 
   asir_assert(ARG3(arg),O_N,"dp_nf"); | 
|          if ( !(g = (DP)ARG1(arg)) ) { | 
   if ( !(g = (DP)ARG1(arg)) ) { | 
|                  nm = 0; dn = (P)ONE; | 
     nm = 0; dn = (P)ONE; | 
|          } else { | 
   } else { | 
|                  b = BDY((LIST)ARG0(arg)); ps = (DP *)BDY((VECT)ARG2(arg)); | 
     b = BDY((LIST)ARG0(arg)); ps = (DP *)BDY((VECT)ARG2(arg)); | 
|                  full = (Q)ARG3(arg) ? 1 : 0; | 
     full = (Q)ARG3(arg) ? 1 : 0; | 
|                  dp_true_nf(b,g,ps,full,&nm,&dn); | 
     dp_true_nf(b,g,ps,full,&nm,&dn); | 
|          } | 
   } | 
|          NEWNODE(n); BDY(n) = (pointer)nm; | 
   NEWNODE(n); BDY(n) = (pointer)nm; | 
|          NEWNODE(NEXT(n)); BDY(NEXT(n)) = (pointer)dn; | 
   NEWNODE(NEXT(n)); BDY(NEXT(n)) = (pointer)dn; | 
|          NEXT(NEXT(n)) = 0; MKLIST(*rp,n); | 
   NEXT(NEXT(n)) = 0; MKLIST(*rp,n); | 
|  } | 
 } | 
|   | 
  | 
|  DP *dp_true_nf_and_quotient_marked(NODE b,DP g,DP *ps,DP *hps,DP *rp,P *dnp); | 
 DP *dp_true_nf_and_quotient_marked(NODE b,DP g,DP *ps,DP *hps,DP *rp,P *dnp); | 
|   | 
  | 
|  void Pdp_true_nf_and_quotient_marked(NODE arg,LIST *rp) | 
 void Pdp_true_nf_and_quotient_marked(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          NODE b,n; | 
   NODE b,n; | 
|          DP *ps,*hps; | 
   DP *ps,*hps; | 
|          DP g; | 
   DP g; | 
|          DP nm; | 
   DP nm; | 
|          VECT quo; | 
   VECT quo; | 
|          P dn; | 
   P dn; | 
|          int full; | 
   int full; | 
|   | 
  | 
|          do_weyl = 0; dp_fcoeffs = 0; | 
   do_weyl = 0; dp_fcoeffs = 0; | 
|          asir_assert(ARG0(arg),O_LIST,"dp_true_nf_and_quotient_marked"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_true_nf_and_quotient_marked"); | 
|          asir_assert(ARG1(arg),O_DP,"dp_true_nf_and_quotient_marked"); | 
   asir_assert(ARG1(arg),O_DP,"dp_true_nf_and_quotient_marked"); | 
|          asir_assert(ARG2(arg),O_VECT,"dp_true_nf_and_quotient_marked"); | 
   asir_assert(ARG2(arg),O_VECT,"dp_true_nf_and_quotient_marked"); | 
|          asir_assert(ARG3(arg),O_VECT,"dp_true_nf_and_quotient_marked"); | 
   asir_assert(ARG3(arg),O_VECT,"dp_true_nf_and_quotient_marked"); | 
|          if ( !(g = (DP)ARG1(arg)) ) { | 
   if ( !(g = (DP)ARG1(arg)) ) { | 
|                  nm = 0; dn = (P)ONE; | 
     nm = 0; dn = (P)ONE; | 
|          } else { | 
   } else { | 
|                  b = BDY((LIST)ARG0(arg)); | 
     b = BDY((LIST)ARG0(arg)); | 
|                  ps = (DP *)BDY((VECT)ARG2(arg)); | 
     ps = (DP *)BDY((VECT)ARG2(arg)); | 
|                  hps = (DP *)BDY((VECT)ARG3(arg)); | 
     hps = (DP *)BDY((VECT)ARG3(arg)); | 
|                  NEWVECT(quo); quo->len = ((VECT)ARG2(arg))->len; | 
     NEWVECT(quo); quo->len = ((VECT)ARG2(arg))->len; | 
|                  quo->body = (pointer *)dp_true_nf_and_quotient_marked(b,g,ps,hps,&nm,&dn); | 
     quo->body = (pointer *)dp_true_nf_and_quotient_marked(b,g,ps,hps,&nm,&dn); | 
|          } | 
   } | 
|          n = mknode(3,nm,dn,quo); | 
   n = mknode(3,nm,dn,quo); | 
|          MKLIST(*rp,n); | 
   MKLIST(*rp,n); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_true_nf_and_quotient(NODE arg,LIST *rp) | 
 void Pdp_true_nf_and_quotient(NODE arg,LIST *rp) | 
| Line 1166  DP *dp_true_nf_and_quotient_marked_mod (NODE b,DP g,DP | 
 
  | 
| Line 1166  DP *dp_true_nf_and_quotient_marked_mod (NODE b,DP g,DP | 
 
 
 | 
|   | 
  | 
|  void Pdp_true_nf_and_quotient_marked_mod(NODE arg,LIST *rp) | 
 void Pdp_true_nf_and_quotient_marked_mod(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          NODE b,n; | 
   NODE b,n; | 
|          DP *ps,*hps; | 
   DP *ps,*hps; | 
|          DP g; | 
   DP g; | 
|          DP nm; | 
   DP nm; | 
|          VECT quo; | 
   VECT quo; | 
|          P dn; | 
   P dn; | 
|          int full,mod; | 
   int full,mod; | 
|   | 
  | 
|          do_weyl = 0; dp_fcoeffs = 0; | 
   do_weyl = 0; dp_fcoeffs = 0; | 
|          asir_assert(ARG0(arg),O_LIST,"dp_true_nf_and_quotient_marked_mod"); | 
   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(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(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(ARG3(arg),O_VECT,"dp_true_nf_and_quotient_marked_mod"); | 
|          asir_assert(ARG4(arg),O_N,"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)) ) { | 
   if ( !(g = (DP)ARG1(arg)) ) { | 
|                  nm = 0; dn = (P)ONE; | 
     nm = 0; dn = (P)ONE; | 
|          } else { | 
   } else { | 
|                  b = BDY((LIST)ARG0(arg)); | 
     b = BDY((LIST)ARG0(arg)); | 
|                  ps = (DP *)BDY((VECT)ARG2(arg)); | 
     ps = (DP *)BDY((VECT)ARG2(arg)); | 
|                  hps = (DP *)BDY((VECT)ARG3(arg)); | 
     hps = (DP *)BDY((VECT)ARG3(arg)); | 
|                  mod = QTOS((Q)ARG4(arg)); | 
     mod = QTOS((Q)ARG4(arg)); | 
|                  NEWVECT(quo); quo->len = ((VECT)ARG2(arg))->len; | 
     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); | 
     quo->body = (pointer *)dp_true_nf_and_quotient_marked_mod(b,g,ps,hps,mod,&nm,&dn); | 
|          } | 
   } | 
|          n = mknode(3,nm,dn,quo); | 
   n = mknode(3,nm,dn,quo); | 
|          MKLIST(*rp,n); | 
   MKLIST(*rp,n); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_true_nf_and_quotient_mod(NODE arg,LIST *rp) | 
 void Pdp_true_nf_and_quotient_mod(NODE arg,LIST *rp) | 
| Line 1202  void Pdp_true_nf_and_quotient_mod(NODE arg,LIST *rp) | 
 
  | 
| Line 1202  void Pdp_true_nf_and_quotient_mod(NODE arg,LIST *rp) | 
 
 
 | 
|   | 
  | 
|  void Pdp_true_nf_marked(NODE arg,LIST *rp) | 
 void Pdp_true_nf_marked(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          NODE b,n; | 
   NODE b,n; | 
|          DP *ps,*hps; | 
   DP *ps,*hps; | 
|          DP g; | 
   DP g; | 
|          DP nm; | 
   DP nm; | 
|          Q cont; | 
   Q cont; | 
|          P dn; | 
   P dn; | 
|          int full; | 
   int full; | 
|   | 
  | 
|          do_weyl = 0; dp_fcoeffs = 0; | 
   do_weyl = 0; dp_fcoeffs = 0; | 
|          asir_assert(ARG0(arg),O_LIST,"dp_true_nf_marked"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_true_nf_marked"); | 
|          asir_assert(ARG1(arg),O_DP,"dp_true_nf_marked"); | 
   asir_assert(ARG1(arg),O_DP,"dp_true_nf_marked"); | 
|          asir_assert(ARG2(arg),O_VECT,"dp_true_nf_marked"); | 
   asir_assert(ARG2(arg),O_VECT,"dp_true_nf_marked"); | 
|          asir_assert(ARG3(arg),O_VECT,"dp_true_nf_marked"); | 
   asir_assert(ARG3(arg),O_VECT,"dp_true_nf_marked"); | 
|          if ( !(g = (DP)ARG1(arg)) ) { | 
   if ( !(g = (DP)ARG1(arg)) ) { | 
|                  nm = 0; dn = (P)ONE; | 
     nm = 0; dn = (P)ONE; | 
|          } else { | 
   } else { | 
|                  b = BDY((LIST)ARG0(arg)); | 
     b = BDY((LIST)ARG0(arg)); | 
|                  ps = (DP *)BDY((VECT)ARG2(arg)); | 
     ps = (DP *)BDY((VECT)ARG2(arg)); | 
|                  hps = (DP *)BDY((VECT)ARG3(arg)); | 
     hps = (DP *)BDY((VECT)ARG3(arg)); | 
|                  dp_true_nf_marked(b,g,ps,hps,&nm,(P *)&cont,(P *)&dn); | 
     dp_true_nf_marked(b,g,ps,hps,&nm,(P *)&cont,(P *)&dn); | 
|          } | 
   } | 
|          n = mknode(3,nm,cont,dn); | 
   n = mknode(3,nm,cont,dn); | 
|          MKLIST(*rp,n); | 
   MKLIST(*rp,n); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_true_nf_marked_mod(NODE arg,LIST *rp) | 
 void Pdp_true_nf_marked_mod(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          NODE b,n; | 
   NODE b,n; | 
|          DP *ps,*hps; | 
   DP *ps,*hps; | 
|          DP g; | 
   DP g; | 
|          DP nm; | 
   DP nm; | 
|          P dn; | 
   P dn; | 
|          int mod; | 
   int mod; | 
|   | 
  | 
|          do_weyl = 0; dp_fcoeffs = 0; | 
   do_weyl = 0; dp_fcoeffs = 0; | 
|          asir_assert(ARG0(arg),O_LIST,"dp_true_nf_marked_mod"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_true_nf_marked_mod"); | 
|          asir_assert(ARG1(arg),O_DP,"dp_true_nf_marked_mod"); | 
   asir_assert(ARG1(arg),O_DP,"dp_true_nf_marked_mod"); | 
|          asir_assert(ARG2(arg),O_VECT,"dp_true_nf_marked_mod"); | 
   asir_assert(ARG2(arg),O_VECT,"dp_true_nf_marked_mod"); | 
|          asir_assert(ARG3(arg),O_VECT,"dp_true_nf_marked_mod"); | 
   asir_assert(ARG3(arg),O_VECT,"dp_true_nf_marked_mod"); | 
|          asir_assert(ARG4(arg),O_N,"dp_true_nf_marked_mod"); | 
   asir_assert(ARG4(arg),O_N,"dp_true_nf_marked_mod"); | 
|          if ( !(g = (DP)ARG1(arg)) ) { | 
   if ( !(g = (DP)ARG1(arg)) ) { | 
|                  nm = 0; dn = (P)ONE; | 
     nm = 0; dn = (P)ONE; | 
|          } else { | 
   } else { | 
|                  b = BDY((LIST)ARG0(arg)); | 
     b = BDY((LIST)ARG0(arg)); | 
|                  ps = (DP *)BDY((VECT)ARG2(arg)); | 
     ps = (DP *)BDY((VECT)ARG2(arg)); | 
|                  hps = (DP *)BDY((VECT)ARG3(arg)); | 
     hps = (DP *)BDY((VECT)ARG3(arg)); | 
|                  mod = QTOS((Q)ARG4(arg)); | 
     mod = QTOS((Q)ARG4(arg)); | 
|                  dp_true_nf_marked_mod(b,g,ps,hps,mod,&nm,&dn); | 
     dp_true_nf_marked_mod(b,g,ps,hps,mod,&nm,&dn); | 
|          } | 
   } | 
|          n = mknode(2,nm,dn); | 
   n = mknode(2,nm,dn); | 
|          MKLIST(*rp,n); | 
   MKLIST(*rp,n); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_weyl_nf_mod(NODE arg,DP *rp) | 
 void Pdp_weyl_nf_mod(NODE arg,DP *rp) | 
|  { | 
 { | 
|          NODE b; | 
   NODE b; | 
|          DP g; | 
   DP g; | 
|          DP *ps; | 
   DP *ps; | 
|          int mod,full,ac; | 
   int mod,full,ac; | 
|          NODE n,n0; | 
   NODE n,n0; | 
|   | 
  | 
|          ac = argc(arg); | 
   ac = argc(arg); | 
|          asir_assert(ARG0(arg),O_LIST,"dp_weyl_nf_mod"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_weyl_nf_mod"); | 
|          asir_assert(ARG1(arg),O_DP,"dp_weyl_nf_mod"); | 
   asir_assert(ARG1(arg),O_DP,"dp_weyl_nf_mod"); | 
|          asir_assert(ARG2(arg),O_VECT,"dp_weyl_nf_mod"); | 
   asir_assert(ARG2(arg),O_VECT,"dp_weyl_nf_mod"); | 
|          asir_assert(ARG3(arg),O_N,"dp_weyl_nf_mod"); | 
   asir_assert(ARG3(arg),O_N,"dp_weyl_nf_mod"); | 
|          asir_assert(ARG4(arg),O_N,"dp_weyl_nf_mod"); | 
   asir_assert(ARG4(arg),O_N,"dp_weyl_nf_mod"); | 
|          if ( !(g = (DP)ARG1(arg)) ) { | 
   if ( !(g = (DP)ARG1(arg)) ) { | 
|                  *rp = 0; return; | 
     *rp = 0; return; | 
|          } | 
   } | 
|          b = BDY((LIST)ARG0(arg)); ps = (DP *)BDY((VECT)ARG2(arg)); | 
   b = BDY((LIST)ARG0(arg)); ps = (DP *)BDY((VECT)ARG2(arg)); | 
|          full = QTOS((Q)ARG3(arg)); mod = QTOS((Q)ARG4(arg)); | 
   full = QTOS((Q)ARG3(arg)); mod = QTOS((Q)ARG4(arg)); | 
|          for ( n0 = n = 0; b; b = NEXT(b) ) { | 
   for ( n0 = n = 0; b; b = NEXT(b) ) { | 
|                  NEXTNODE(n0,n); | 
     NEXTNODE(n0,n); | 
|                  BDY(n) = (pointer)QTOS((Q)BDY(b)); | 
     BDY(n) = (pointer)QTOS((Q)BDY(b)); | 
|          } | 
   } | 
|          if ( n0 ) | 
   if ( n0 ) | 
|                  NEXT(n) = 0; | 
     NEXT(n) = 0; | 
|          do_weyl = 1; | 
   do_weyl = 1; | 
|          dp_nf_mod(n0,g,ps,mod,full,rp); | 
   dp_nf_mod(n0,g,ps,mod,full,rp); | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_true_nf_mod(NODE arg,LIST *rp) | 
 void Pdp_true_nf_mod(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          NODE b; | 
   NODE b; | 
|          DP g,nm; | 
   DP g,nm; | 
|          P dn; | 
   P dn; | 
|          DP *ps; | 
   DP *ps; | 
|          int mod,full; | 
   int mod,full; | 
|          NODE n; | 
   NODE n; | 
|   | 
  | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|          asir_assert(ARG0(arg),O_LIST,"dp_nf_mod"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_nf_mod"); | 
|          asir_assert(ARG1(arg),O_DP,"dp_nf_mod"); | 
   asir_assert(ARG1(arg),O_DP,"dp_nf_mod"); | 
|          asir_assert(ARG2(arg),O_VECT,"dp_nf_mod"); | 
   asir_assert(ARG2(arg),O_VECT,"dp_nf_mod"); | 
|          asir_assert(ARG3(arg),O_N,"dp_nf_mod"); | 
   asir_assert(ARG3(arg),O_N,"dp_nf_mod"); | 
|          asir_assert(ARG4(arg),O_N,"dp_nf_mod"); | 
   asir_assert(ARG4(arg),O_N,"dp_nf_mod"); | 
|          if ( !(g = (DP)ARG1(arg)) ) { | 
   if ( !(g = (DP)ARG1(arg)) ) { | 
|                  nm = 0; dn = (P)ONEM; | 
     nm = 0; dn = (P)ONEM; | 
|          } else { | 
   } else { | 
|                  b = BDY((LIST)ARG0(arg)); ps = (DP *)BDY((VECT)ARG2(arg)); | 
     b = BDY((LIST)ARG0(arg)); ps = (DP *)BDY((VECT)ARG2(arg)); | 
|                  full = QTOS((Q)ARG3(arg)); mod = QTOS((Q)ARG4(arg)); | 
     full = QTOS((Q)ARG3(arg)); mod = QTOS((Q)ARG4(arg)); | 
|                  dp_true_nf_mod(b,g,ps,mod,full,&nm,&dn); | 
     dp_true_nf_mod(b,g,ps,mod,full,&nm,&dn); | 
|          } | 
   } | 
|          NEWNODE(n); BDY(n) = (pointer)nm; | 
   NEWNODE(n); BDY(n) = (pointer)nm; | 
|          NEWNODE(NEXT(n)); BDY(NEXT(n)) = (pointer)dn; | 
   NEWNODE(NEXT(n)); BDY(NEXT(n)) = (pointer)dn; | 
|          NEXT(NEXT(n)) = 0; MKLIST(*rp,n); | 
   NEXT(NEXT(n)) = 0; MKLIST(*rp,n); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_weyl_true_nf_and_quotient_marked(NODE arg,LIST *rp) | 
 void Pdp_weyl_true_nf_and_quotient_marked(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          NODE b,n; | 
   NODE b,n; | 
|          DP *ps,*hps; | 
   DP *ps,*hps; | 
|          DP g; | 
   DP g; | 
|          DP nm; | 
   DP nm; | 
|          VECT quo; | 
   VECT quo; | 
|          P dn; | 
   P dn; | 
|          int full; | 
   int full; | 
|   | 
  | 
|          do_weyl = 1; dp_fcoeffs = 0; | 
   do_weyl = 1; dp_fcoeffs = 0; | 
|          asir_assert(ARG0(arg),O_LIST,"dp_weyl_true_nf_and_quotient_marked"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_weyl_true_nf_and_quotient_marked"); | 
|          asir_assert(ARG1(arg),O_DP,"dp_weyl_true_nf_and_quotient_marked"); | 
   asir_assert(ARG1(arg),O_DP,"dp_weyl_true_nf_and_quotient_marked"); | 
|          asir_assert(ARG2(arg),O_VECT,"dp_weyl_true_nf_and_quotient_marked"); | 
   asir_assert(ARG2(arg),O_VECT,"dp_weyl_true_nf_and_quotient_marked"); | 
|          asir_assert(ARG3(arg),O_VECT,"dp_weyl_true_nf_and_quotient_marked"); | 
   asir_assert(ARG3(arg),O_VECT,"dp_weyl_true_nf_and_quotient_marked"); | 
|          if ( !(g = (DP)ARG1(arg)) ) { | 
   if ( !(g = (DP)ARG1(arg)) ) { | 
|                  nm = 0; dn = (P)ONE; | 
     nm = 0; dn = (P)ONE; | 
|          } else { | 
   } else { | 
|                  b = BDY((LIST)ARG0(arg)); | 
     b = BDY((LIST)ARG0(arg)); | 
|                  ps = (DP *)BDY((VECT)ARG2(arg)); | 
     ps = (DP *)BDY((VECT)ARG2(arg)); | 
|                  hps = (DP *)BDY((VECT)ARG3(arg)); | 
     hps = (DP *)BDY((VECT)ARG3(arg)); | 
|                  NEWVECT(quo); quo->len = ((VECT)ARG2(arg))->len; | 
     NEWVECT(quo); quo->len = ((VECT)ARG2(arg))->len; | 
|                  quo->body = (pointer *)dp_true_nf_and_quotient_marked(b,g,ps,hps,&nm,&dn); | 
     quo->body = (pointer *)dp_true_nf_and_quotient_marked(b,g,ps,hps,&nm,&dn); | 
|          } | 
   } | 
|          n = mknode(3,nm,dn,quo); | 
   n = mknode(3,nm,dn,quo); | 
|          MKLIST(*rp,n); | 
   MKLIST(*rp,n); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_weyl_true_nf_and_quotient(NODE arg,LIST *rp) | 
 void Pdp_weyl_true_nf_and_quotient(NODE arg,LIST *rp) | 
| Line 1349  void Pdp_weyl_true_nf_and_quotient(NODE arg,LIST *rp) | 
 
  | 
| Line 1349  void Pdp_weyl_true_nf_and_quotient(NODE arg,LIST *rp) | 
 
 
 | 
|   | 
  | 
|  void Pdp_weyl_true_nf_and_quotient_marked_mod(NODE arg,LIST *rp) | 
 void Pdp_weyl_true_nf_and_quotient_marked_mod(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          NODE b,n; | 
   NODE b,n; | 
|          DP *ps,*hps; | 
   DP *ps,*hps; | 
|          DP g; | 
   DP g; | 
|          DP nm; | 
   DP nm; | 
|          VECT quo; | 
   VECT quo; | 
|          P dn; | 
   P dn; | 
|          int full,mod; | 
   int full,mod; | 
|   | 
  | 
|          do_weyl = 1; dp_fcoeffs = 0; | 
   do_weyl = 1; dp_fcoeffs = 0; | 
|          asir_assert(ARG0(arg),O_LIST,"dp_weyl_true_nf_and_quotient_marked_mod"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_weyl_true_nf_and_quotient_marked_mod"); | 
|          asir_assert(ARG1(arg),O_DP,"dp_weyl_true_nf_and_quotient_marked_mod"); | 
   asir_assert(ARG1(arg),O_DP,"dp_weyl_true_nf_and_quotient_marked_mod"); | 
|          asir_assert(ARG2(arg),O_VECT,"dp_weyl_true_nf_and_quotient_marked_mod"); | 
   asir_assert(ARG2(arg),O_VECT,"dp_weyl_true_nf_and_quotient_marked_mod"); | 
|          asir_assert(ARG3(arg),O_VECT,"dp_weyl_true_nf_and_quotient_marked_mod"); | 
   asir_assert(ARG3(arg),O_VECT,"dp_weyl_true_nf_and_quotient_marked_mod"); | 
|          asir_assert(ARG4(arg),O_N,"dp_weyl_true_nf_and_quotient_marked_mod"); | 
   asir_assert(ARG4(arg),O_N,"dp_weyl_true_nf_and_quotient_marked_mod"); | 
|          if ( !(g = (DP)ARG1(arg)) ) { | 
   if ( !(g = (DP)ARG1(arg)) ) { | 
|                  nm = 0; dn = (P)ONE; | 
     nm = 0; dn = (P)ONE; | 
|          } else { | 
   } else { | 
|                  b = BDY((LIST)ARG0(arg)); | 
     b = BDY((LIST)ARG0(arg)); | 
|                  ps = (DP *)BDY((VECT)ARG2(arg)); | 
     ps = (DP *)BDY((VECT)ARG2(arg)); | 
|                  hps = (DP *)BDY((VECT)ARG3(arg)); | 
     hps = (DP *)BDY((VECT)ARG3(arg)); | 
|                  mod = QTOS((Q)ARG4(arg)); | 
     mod = QTOS((Q)ARG4(arg)); | 
|                  NEWVECT(quo); quo->len = ((VECT)ARG2(arg))->len; | 
     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); | 
     quo->body = (pointer *)dp_true_nf_and_quotient_marked_mod(b,g,ps,hps,mod,&nm,&dn); | 
|          } | 
   } | 
|          n = mknode(3,nm,dn,quo); | 
   n = mknode(3,nm,dn,quo); | 
|          MKLIST(*rp,n); | 
   MKLIST(*rp,n); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_weyl_true_nf_and_quotient_mod(NODE arg,LIST *rp) | 
 void Pdp_weyl_true_nf_and_quotient_mod(NODE arg,LIST *rp) | 
| Line 1386  void Pdp_weyl_true_nf_and_quotient_mod(NODE arg,LIST * | 
 
  | 
| Line 1386  void Pdp_weyl_true_nf_and_quotient_mod(NODE arg,LIST * | 
 
 
 | 
|   | 
  | 
|  void Pdp_tdiv(NODE arg,DP *rp) | 
 void Pdp_tdiv(NODE arg,DP *rp) | 
|  { | 
 { | 
|          MP m,mr,mr0; | 
   MP m,mr,mr0; | 
|          DP p; | 
   DP p; | 
|          Q c; | 
   Q c; | 
|          N d,q,r; | 
   N d,q,r; | 
|          int sgn; | 
   int sgn; | 
|   | 
  | 
|          asir_assert(ARG0(arg),O_DP,"dp_tdiv"); | 
   asir_assert(ARG0(arg),O_DP,"dp_tdiv"); | 
|          asir_assert(ARG1(arg),O_N,"dp_tdiv"); | 
   asir_assert(ARG1(arg),O_N,"dp_tdiv"); | 
|          p = (DP)ARG0(arg); d = NM((Q)ARG1(arg)); sgn = SGN((Q)ARG1(arg)); | 
   p = (DP)ARG0(arg); d = NM((Q)ARG1(arg)); sgn = SGN((Q)ARG1(arg)); | 
|          if ( !p ) | 
   if ( !p ) | 
|                  *rp = 0; | 
     *rp = 0; | 
|          else { | 
   else { | 
|                  for ( mr0 = 0, m = BDY(p); m; m = NEXT(m) ) { | 
     for ( mr0 = 0, m = BDY(p); m; m = NEXT(m) ) { | 
|                          divn(NM((Q)m->c),d,&q,&r); | 
       divn(NM((Q)m->c),d,&q,&r); | 
|                          if ( r ) { | 
       if ( r ) { | 
|                                  *rp = 0; return; | 
         *rp = 0; return; | 
|                          } else { | 
       } else { | 
|                                  NEXTMP(mr0,mr); NTOQ(q,SGN((Q)m->c)*sgn,c); | 
         NEXTMP(mr0,mr); NTOQ(q,SGN((Q)m->c)*sgn,c); | 
|                                  mr->c = (Obj)c; mr->dl = m->dl; | 
         mr->c = (Obj)c; mr->dl = m->dl; | 
|                          } | 
       } | 
|                  } | 
     } | 
|                  NEXT(mr) = 0; MKDP(p->nv,mr0,*rp); (*rp)->sugar = p->sugar; | 
     NEXT(mr) = 0; MKDP(p->nv,mr0,*rp); (*rp)->sugar = p->sugar; | 
|          } | 
   } | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_red_coef(NODE arg,DP *rp) | 
 void Pdp_red_coef(NODE arg,DP *rp) | 
|  { | 
 { | 
|          MP m,mr,mr0; | 
   MP m,mr,mr0; | 
|          P q,r; | 
   P q,r; | 
|          DP p; | 
   DP p; | 
|          P mod; | 
   P mod; | 
|   | 
  | 
|          p = (DP)ARG0(arg); mod = (P)ARG1(arg); | 
   p = (DP)ARG0(arg); mod = (P)ARG1(arg); | 
|          asir_assert(p,O_DP,"dp_red_coef"); | 
   asir_assert(p,O_DP,"dp_red_coef"); | 
|          asir_assert(mod,O_P,"dp_red_coef"); | 
   asir_assert(mod,O_P,"dp_red_coef"); | 
|          if ( !p ) | 
   if ( !p ) | 
|                  *rp = 0; | 
     *rp = 0; | 
|          else { | 
   else { | 
|                  for ( mr0 = 0, m = BDY(p); m; m = NEXT(m) ) { | 
     for ( mr0 = 0, m = BDY(p); m; m = NEXT(m) ) { | 
|                          divsrp(CO,(P)m->c,mod,&q,&r); | 
       divsrp(CO,(P)m->c,mod,&q,&r); | 
|                          if ( r ) { | 
       if ( r ) { | 
|                                  NEXTMP(mr0,mr); mr->c = (Obj)r; mr->dl = m->dl; | 
         NEXTMP(mr0,mr); mr->c = (Obj)r; mr->dl = m->dl; | 
|                          } | 
       } | 
|                  } | 
     } | 
|                  if ( mr0 ) { | 
     if ( mr0 ) { | 
|                          NEXT(mr) = 0; MKDP(p->nv,mr0,*rp); (*rp)->sugar = p->sugar; | 
       NEXT(mr) = 0; MKDP(p->nv,mr0,*rp); (*rp)->sugar = p->sugar; | 
|                  } else | 
     } else | 
|                          *rp = 0; | 
       *rp = 0; | 
|          } | 
   } | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_redble(NODE arg,Q *rp) | 
 void Pdp_redble(NODE arg,Q *rp) | 
|  { | 
 { | 
|          asir_assert(ARG0(arg),O_DP,"dp_redble"); | 
   asir_assert(ARG0(arg),O_DP,"dp_redble"); | 
|          asir_assert(ARG1(arg),O_DP,"dp_redble"); | 
   asir_assert(ARG1(arg),O_DP,"dp_redble"); | 
|          if ( dp_redble((DP)ARG0(arg),(DP)ARG1(arg)) ) | 
   if ( dp_redble((DP)ARG0(arg),(DP)ARG1(arg)) ) | 
|                  *rp = ONE; | 
     *rp = ONE; | 
|          else | 
   else | 
|                  *rp = 0; | 
     *rp = 0; | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_red_mod(NODE arg,LIST *rp) | 
 void Pdp_red_mod(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          DP h,r; | 
   DP h,r; | 
|          P dmy; | 
   P dmy; | 
|          NODE n; | 
   NODE n; | 
|   | 
  | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|          asir_assert(ARG0(arg),O_DP,"dp_red_mod"); | 
   asir_assert(ARG0(arg),O_DP,"dp_red_mod"); | 
|          asir_assert(ARG1(arg),O_DP,"dp_red_mod"); | 
   asir_assert(ARG1(arg),O_DP,"dp_red_mod"); | 
|          asir_assert(ARG2(arg),O_DP,"dp_red_mod"); | 
   asir_assert(ARG2(arg),O_DP,"dp_red_mod"); | 
|          asir_assert(ARG3(arg),O_N,"dp_red_mod"); | 
   asir_assert(ARG3(arg),O_N,"dp_red_mod"); | 
|          dp_red_mod((DP)ARG0(arg),(DP)ARG1(arg),(DP)ARG2(arg),QTOS((Q)ARG3(arg)), | 
   dp_red_mod((DP)ARG0(arg),(DP)ARG1(arg),(DP)ARG2(arg),QTOS((Q)ARG3(arg)), | 
|                  &h,&r,&dmy); | 
     &h,&r,&dmy); | 
|          NEWNODE(n); BDY(n) = (pointer)h; | 
   NEWNODE(n); BDY(n) = (pointer)h; | 
|          NEWNODE(NEXT(n)); BDY(NEXT(n)) = (pointer)r; | 
   NEWNODE(NEXT(n)); BDY(NEXT(n)) = (pointer)r; | 
|          NEXT(NEXT(n)) = 0; MKLIST(*rp,n); | 
   NEXT(NEXT(n)) = 0; MKLIST(*rp,n); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_subd(NODE arg,DP *rp) | 
 void Pdp_subd(NODE arg,DP *rp) | 
|  { | 
 { | 
|          DP p1,p2; | 
   DP p1,p2; | 
|   | 
  | 
|          p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); | 
   p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); | 
|          asir_assert(p1,O_DP,"dp_subd"); | 
   asir_assert(p1,O_DP,"dp_subd"); | 
|          asir_assert(p2,O_DP,"dp_subd"); | 
   asir_assert(p2,O_DP,"dp_subd"); | 
|          dp_subd(p1,p2,rp); | 
   dp_subd(p1,p2,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_symb_add(NODE arg,DP *rp) | 
 void Pdp_symb_add(NODE arg,DP *rp) | 
|  { | 
 { | 
|          DP p1,p2,r; | 
   DP p1,p2,r; | 
|          NODE s0; | 
   NODE s0; | 
|          MP mp0,mp; | 
   MP mp0,mp; | 
|          int nv; | 
   int nv; | 
|   | 
  | 
|          p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); | 
   p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); | 
|          asir_assert(p1,O_DP,"dp_symb_add"); | 
   asir_assert(p1,O_DP,"dp_symb_add"); | 
|          asir_assert(p2,O_DP,"dp_symb_add"); | 
   asir_assert(p2,O_DP,"dp_symb_add"); | 
|          if ( !p1 ) { *rp = p2; return; } | 
   if ( !p1 ) { *rp = p2; return; } | 
|          else if ( !p2 ) { *rp = p1; return; } | 
   else if ( !p2 ) { *rp = p1; return; } | 
|          if ( p1->nv != p2->nv ) | 
   if ( p1->nv != p2->nv ) | 
|                  error("dp_sumb_add : invalid input"); | 
     error("dp_sumb_add : invalid input"); | 
|          nv = p1->nv; | 
   nv = p1->nv; | 
|          s0 = symb_merge(dp_dllist(p1),dp_dllist(p2),nv); | 
   s0 = symb_merge(dp_dllist(p1),dp_dllist(p2),nv); | 
|          for ( mp0 = 0; s0; s0 = NEXT(s0) ) { | 
   for ( mp0 = 0; s0; s0 = NEXT(s0) ) { | 
|                  NEXTMP(mp0,mp); mp->dl = (DL)BDY(s0); mp->c = (Obj)ONE; | 
     NEXTMP(mp0,mp); mp->dl = (DL)BDY(s0); mp->c = (Obj)ONE; | 
|          } | 
   } | 
|          NEXT(mp) = 0; | 
   NEXT(mp) = 0; | 
|          MKDP(nv,mp0,r); r->sugar = MAX(p1->sugar,p2->sugar); | 
   MKDP(nv,mp0,r); r->sugar = MAX(p1->sugar,p2->sugar); | 
|          *rp = r; | 
   *rp = r; | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_mul_trunc(NODE arg,DP *rp) | 
 void Pdp_mul_trunc(NODE arg,DP *rp) | 
|  { | 
 { | 
|          DP p1,p2,p; | 
   DP p1,p2,p; | 
|   | 
  | 
|          p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); p = (DP)ARG2(arg); | 
   p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); p = (DP)ARG2(arg); | 
|          asir_assert(p1,O_DP,"dp_mul_trunc"); | 
   asir_assert(p1,O_DP,"dp_mul_trunc"); | 
|          asir_assert(p2,O_DP,"dp_mul_trunc"); | 
   asir_assert(p2,O_DP,"dp_mul_trunc"); | 
|          asir_assert(p,O_DP,"dp_mul_trunc"); | 
   asir_assert(p,O_DP,"dp_mul_trunc"); | 
|          comm_muld_trunc(CO,p1,p2,BDY(p)->dl,rp); | 
   comm_muld_trunc(CO,p1,p2,BDY(p)->dl,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_quo(NODE arg,DP *rp) | 
 void Pdp_quo(NODE arg,DP *rp) | 
|  { | 
 { | 
|          DP p1,p2; | 
   DP p1,p2; | 
|   | 
  | 
|          p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); | 
   p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); | 
|          asir_assert(p1,O_DP,"dp_quo"); | 
   asir_assert(p1,O_DP,"dp_quo"); | 
|          asir_assert(p2,O_DP,"dp_quo"); | 
   asir_assert(p2,O_DP,"dp_quo"); | 
|          comm_quod(CO,p1,p2,rp); | 
   comm_quod(CO,p1,p2,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_weyl_mul(NODE arg,DP *rp) | 
 void Pdp_weyl_mul(NODE arg,DP *rp) | 
|  { | 
 { | 
|          DP p1,p2; | 
   DP p1,p2; | 
|   | 
  | 
|          p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); | 
   p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); | 
|          asir_assert(p1,O_DP,"dp_weyl_mul"); asir_assert(p2,O_DP,"dp_weyl_mul"); | 
   asir_assert(p1,O_DP,"dp_weyl_mul"); asir_assert(p2,O_DP,"dp_weyl_mul"); | 
|          do_weyl = 1; | 
   do_weyl = 1; | 
|          muld(CO,p1,p2,rp); | 
   muld(CO,p1,p2,rp); | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_weyl_act(NODE arg,DP *rp) | 
 void Pdp_weyl_act(NODE arg,DP *rp) | 
|  { | 
 { | 
|          DP p1,p2; | 
   DP p1,p2; | 
|   | 
  | 
|          p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); | 
   p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); | 
|          asir_assert(p1,O_DP,"dp_weyl_act"); asir_assert(p2,O_DP,"dp_weyl_act"); | 
   asir_assert(p1,O_DP,"dp_weyl_act"); asir_assert(p2,O_DP,"dp_weyl_act"); | 
|          weyl_actd(CO,p1,p2,rp); | 
   weyl_actd(CO,p1,p2,rp); | 
|  } | 
 } | 
|   | 
  | 
|   | 
  | 
|  void Pdp_weyl_mul_mod(NODE arg,DP *rp) | 
 void Pdp_weyl_mul_mod(NODE arg,DP *rp) | 
|  { | 
 { | 
|          DP p1,p2; | 
   DP p1,p2; | 
|          Q m; | 
   Q m; | 
|   | 
  | 
|          p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); m = (Q)ARG2(arg); | 
   p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); m = (Q)ARG2(arg); | 
|          asir_assert(p1,O_DP,"dp_weyl_mul_mod"); | 
   asir_assert(p1,O_DP,"dp_weyl_mul_mod"); | 
|          asir_assert(p2,O_DP,"dp_mul_mod"); | 
   asir_assert(p2,O_DP,"dp_mul_mod"); | 
|          asir_assert(m,O_N,"dp_mul_mod"); | 
   asir_assert(m,O_N,"dp_mul_mod"); | 
|          do_weyl = 1; | 
   do_weyl = 1; | 
|          mulmd(CO,QTOS(m),p1,p2,rp); | 
   mulmd(CO,QTOS(m),p1,p2,rp); | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_red(NODE arg,LIST *rp) | 
 void Pdp_red(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          NODE n; | 
   NODE n; | 
|          DP head,rest,dmy1; | 
   DP head,rest,dmy1; | 
|          P dmy; | 
   P dmy; | 
|   | 
  | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|          asir_assert(ARG0(arg),O_DP,"dp_red"); | 
   asir_assert(ARG0(arg),O_DP,"dp_red"); | 
|          asir_assert(ARG1(arg),O_DP,"dp_red"); | 
   asir_assert(ARG1(arg),O_DP,"dp_red"); | 
|          asir_assert(ARG2(arg),O_DP,"dp_red"); | 
   asir_assert(ARG2(arg),O_DP,"dp_red"); | 
|          dp_red((DP)ARG0(arg),(DP)ARG1(arg),(DP)ARG2(arg),&head,&rest,&dmy,&dmy1); | 
   dp_red((DP)ARG0(arg),(DP)ARG1(arg),(DP)ARG2(arg),&head,&rest,&dmy,&dmy1); | 
|          NEWNODE(n); BDY(n) = (pointer)head; | 
   NEWNODE(n); BDY(n) = (pointer)head; | 
|          NEWNODE(NEXT(n)); BDY(NEXT(n)) = (pointer)rest; | 
   NEWNODE(NEXT(n)); BDY(NEXT(n)) = (pointer)rest; | 
|          NEXT(NEXT(n)) = 0; MKLIST(*rp,n); | 
   NEXT(NEXT(n)) = 0; MKLIST(*rp,n); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_weyl_red(NODE arg,LIST *rp) | 
 void Pdp_weyl_red(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          NODE n; | 
   NODE n; | 
|          DP head,rest,dmy1; | 
   DP head,rest,dmy1; | 
|          P dmy; | 
   P dmy; | 
|   | 
  | 
|          asir_assert(ARG0(arg),O_DP,"dp_weyl_red"); | 
   asir_assert(ARG0(arg),O_DP,"dp_weyl_red"); | 
|          asir_assert(ARG1(arg),O_DP,"dp_weyl_red"); | 
   asir_assert(ARG1(arg),O_DP,"dp_weyl_red"); | 
|          asir_assert(ARG2(arg),O_DP,"dp_weyl_red"); | 
   asir_assert(ARG2(arg),O_DP,"dp_weyl_red"); | 
|          do_weyl = 1; | 
   do_weyl = 1; | 
|          dp_red((DP)ARG0(arg),(DP)ARG1(arg),(DP)ARG2(arg),&head,&rest,&dmy,&dmy1); | 
   dp_red((DP)ARG0(arg),(DP)ARG1(arg),(DP)ARG2(arg),&head,&rest,&dmy,&dmy1); | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|          NEWNODE(n); BDY(n) = (pointer)head; | 
   NEWNODE(n); BDY(n) = (pointer)head; | 
|          NEWNODE(NEXT(n)); BDY(NEXT(n)) = (pointer)rest; | 
   NEWNODE(NEXT(n)); BDY(NEXT(n)) = (pointer)rest; | 
|          NEXT(NEXT(n)) = 0; MKLIST(*rp,n); | 
   NEXT(NEXT(n)) = 0; MKLIST(*rp,n); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_sp(NODE arg,DP *rp) | 
 void Pdp_sp(NODE arg,DP *rp) | 
|  { | 
 { | 
|          DP p1,p2; | 
   DP p1,p2; | 
|   | 
  | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|          p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); | 
   p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); | 
|          asir_assert(p1,O_DP,"dp_sp"); asir_assert(p2,O_DP,"dp_sp"); | 
   asir_assert(p1,O_DP,"dp_sp"); asir_assert(p2,O_DP,"dp_sp"); | 
|          dp_sp(p1,p2,rp); | 
   dp_sp(p1,p2,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_weyl_sp(NODE arg,DP *rp) | 
 void Pdp_weyl_sp(NODE arg,DP *rp) | 
|  { | 
 { | 
|          DP p1,p2; | 
   DP p1,p2; | 
|   | 
  | 
|          p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); | 
   p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); | 
|          asir_assert(p1,O_DP,"dp_weyl_sp"); asir_assert(p2,O_DP,"dp_weyl_sp"); | 
   asir_assert(p1,O_DP,"dp_weyl_sp"); asir_assert(p2,O_DP,"dp_weyl_sp"); | 
|          do_weyl = 1; | 
   do_weyl = 1; | 
|          dp_sp(p1,p2,rp); | 
   dp_sp(p1,p2,rp); | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|  } | 
 } | 
|   | 
  | 
|  void Pdpm_sp(NODE arg,DPM *rp) | 
 void Pdpm_sp(NODE arg,DPM *rp) | 
|  { | 
 { | 
|          DPM  p1,p2; | 
   DPM  p1,p2; | 
|   | 
  | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|          p1 = (DPM)ARG0(arg); p2 = (DPM)ARG1(arg); | 
   p1 = (DPM)ARG0(arg); p2 = (DPM)ARG1(arg); | 
|          asir_assert(p1,O_DPM,"dpm_sp"); asir_assert(p2,O_DPM,"dpm_sp"); | 
   asir_assert(p1,O_DPM,"dpm_sp"); asir_assert(p2,O_DPM,"dpm_sp"); | 
|          dpm_sp(p1,p2,rp); | 
   dpm_sp(p1,p2,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdpm_weyl_sp(NODE arg,DPM *rp) | 
 void Pdpm_weyl_sp(NODE arg,DPM *rp) | 
|  { | 
 { | 
|          DPM p1,p2; | 
   DPM p1,p2; | 
|   | 
  | 
|          p1 = (DPM)ARG0(arg); p2 = (DPM)ARG1(arg); | 
   p1 = (DPM)ARG0(arg); p2 = (DPM)ARG1(arg); | 
|          asir_assert(p1,O_DPM,"dpm_weyl_sp"); asir_assert(p2,O_DPM,"dpm_weyl_sp"); | 
   asir_assert(p1,O_DPM,"dpm_weyl_sp"); asir_assert(p2,O_DPM,"dpm_weyl_sp"); | 
|          do_weyl = 1; | 
   do_weyl = 1; | 
|          dpm_sp(p1,p2,rp); | 
   dpm_sp(p1,p2,rp); | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_sp_mod(NODE arg,DP *rp) | 
 void Pdp_sp_mod(NODE arg,DP *rp) | 
|  { | 
 { | 
|          DP p1,p2; | 
   DP p1,p2; | 
|          int mod; | 
   int mod; | 
|   | 
  | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|          p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); | 
   p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); | 
|          asir_assert(p1,O_DP,"dp_sp_mod"); asir_assert(p2,O_DP,"dp_sp_mod"); | 
   asir_assert(p1,O_DP,"dp_sp_mod"); asir_assert(p2,O_DP,"dp_sp_mod"); | 
|          asir_assert(ARG2(arg),O_N,"dp_sp_mod"); | 
   asir_assert(ARG2(arg),O_N,"dp_sp_mod"); | 
|          mod = QTOS((Q)ARG2(arg)); | 
   mod = QTOS((Q)ARG2(arg)); | 
|          dp_sp_mod(p1,p2,mod,rp); | 
   dp_sp_mod(p1,p2,mod,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_lcm(NODE arg,DP *rp) | 
 void Pdp_lcm(NODE arg,DP *rp) | 
|  { | 
 { | 
|          int i,n,td; | 
   int i,n,td; | 
|          DL d1,d2,d; | 
   DL d1,d2,d; | 
|          MP m; | 
   MP m; | 
|          DP p1,p2; | 
   DP p1,p2; | 
|   | 
  | 
|          p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); | 
   p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); | 
|          asir_assert(p1,O_DP,"dp_lcm"); asir_assert(p2,O_DP,"dp_lcm"); | 
   asir_assert(p1,O_DP,"dp_lcm"); asir_assert(p2,O_DP,"dp_lcm"); | 
|          n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl; | 
   n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl; | 
|          NEWDL(d,n); | 
   NEWDL(d,n); | 
|          for ( i = 0, td = 0; i < n; i++ ) { | 
   for ( i = 0, td = 0; i < n; i++ ) { | 
|                  d->d[i] = MAX(d1->d[i],d2->d[i]); td += MUL_WEIGHT(d->d[i],i); | 
     d->d[i] = MAX(d1->d[i],d2->d[i]); td += MUL_WEIGHT(d->d[i],i); | 
|          } | 
   } | 
|          d->td = td; | 
   d->td = td; | 
|          NEWMP(m); m->dl = d; m->c = (Obj)ONE; NEXT(m) = 0; | 
   NEWMP(m); m->dl = d; m->c = (Obj)ONE; NEXT(m) = 0; | 
|          MKDP(n,m,*rp); (*rp)->sugar = td;       /* XXX */ | 
   MKDP(n,m,*rp); (*rp)->sugar = td;  /* XXX */ | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_hm(NODE arg,DP *rp) | 
 void Pdp_hm(NODE arg,DP *rp) | 
|  { | 
 { | 
|          DP p; | 
   DP p; | 
|   | 
  | 
|          p = (DP)ARG0(arg); asir_assert(p,O_DP,"dp_hm"); | 
   p = (DP)ARG0(arg); asir_assert(p,O_DP,"dp_hm"); | 
|          dp_hm(p,rp); | 
   dp_hm(p,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_ht(NODE arg,DP *rp) | 
 void Pdp_ht(NODE arg,DP *rp) | 
|  { | 
 { | 
|          DP p; | 
   DP p; | 
|          MP m,mr; | 
   MP m,mr; | 
|   | 
  | 
|          p = (DP)ARG0(arg); asir_assert(p,O_DP,"dp_ht"); | 
   p = (DP)ARG0(arg); asir_assert(p,O_DP,"dp_ht"); | 
|          dp_ht(p,rp); | 
   dp_ht(p,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_hc(NODE arg,Obj *rp) | 
 void Pdp_hc(NODE arg,Obj *rp) | 
|  { | 
 { | 
|          asir_assert(ARG0(arg),O_DP,"dp_hc"); | 
   asir_assert(ARG0(arg),O_DP,"dp_hc"); | 
|          if ( !ARG0(arg) ) | 
   if ( !ARG0(arg) ) | 
|                  *rp = 0; | 
     *rp = 0; | 
|          else | 
   else | 
|                  *rp = BDY((DP)ARG0(arg))->c; | 
     *rp = BDY((DP)ARG0(arg))->c; | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_rest(NODE arg,DP *rp) | 
 void Pdp_rest(NODE arg,DP *rp) | 
|  { | 
 { | 
|          asir_assert(ARG0(arg),O_DP,"dp_rest"); | 
   asir_assert(ARG0(arg),O_DP,"dp_rest"); | 
|          if ( !ARG0(arg) ) | 
   if ( !ARG0(arg) ) | 
|                  *rp = 0; | 
     *rp = 0; | 
|          else | 
   else | 
|                  dp_rest((DP)ARG0(arg),rp); | 
     dp_rest((DP)ARG0(arg),rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_td(NODE arg,Q *rp) | 
 void Pdp_td(NODE arg,Q *rp) | 
|  { | 
 { | 
|          DP p; | 
   DP p; | 
|   | 
  | 
|          p = (DP)ARG0(arg); asir_assert(p,O_DP,"dp_td"); | 
   p = (DP)ARG0(arg); asir_assert(p,O_DP,"dp_td"); | 
|          if ( !p ) | 
   if ( !p ) | 
|                  *rp = 0; | 
     *rp = 0; | 
|          else | 
   else | 
|                  STOQ(BDY(p)->dl->td,*rp); | 
     STOQ(BDY(p)->dl->td,*rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_sugar(NODE arg,Q *rp) | 
 void Pdp_sugar(NODE arg,Q *rp) | 
|  { | 
 { | 
|          DP p; | 
   DP p; | 
|   | 
  | 
|          p = (DP)ARG0(arg); asir_assert(p,O_DP,"dp_sugar"); | 
   p = (DP)ARG0(arg); asir_assert(p,O_DP,"dp_sugar"); | 
|          if ( !p ) | 
   if ( !p ) | 
|                  *rp = 0; | 
     *rp = 0; | 
|          else | 
   else | 
|                  STOQ(p->sugar,*rp); | 
     STOQ(p->sugar,*rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_initial_term(NODE arg,Obj *rp) | 
 void Pdp_initial_term(NODE arg,Obj *rp) | 
|  { | 
 { | 
|          struct order_spec *ord; | 
   struct order_spec *ord; | 
|          Num homo; | 
   Num homo; | 
|          int modular,is_list; | 
   int modular,is_list; | 
|          LIST v,f,l,initiallist; | 
   LIST v,f,l,initiallist; | 
|          NODE n; | 
   NODE n; | 
|   | 
  | 
|          f = (LIST)ARG0(arg); | 
   f = (LIST)ARG0(arg); | 
|          if ( f && OID(f) == O_LIST ) | 
   if ( f && OID(f) == O_LIST ) | 
|                  is_list = 1; | 
     is_list = 1; | 
|          else { | 
   else { | 
|                  n = mknode(1,f); MKLIST(l,n); f = l; | 
     n = mknode(1,f); MKLIST(l,n); f = l; | 
|                  is_list = 0; | 
     is_list = 0; | 
|          } | 
   } | 
|          if ( current_option ) { | 
   if ( current_option ) { | 
|                  parse_gr_option(f,current_option,&v,&homo,&modular,&ord); | 
     parse_gr_option(f,current_option,&v,&homo,&modular,&ord); | 
|                  initd(ord); | 
     initd(ord); | 
|          } else | 
   } else | 
|                  ord = dp_current_spec; | 
     ord = dp_current_spec; | 
|          initiallist = dp_initial_term(f,ord); | 
   initiallist = dp_initial_term(f,ord); | 
|          if ( !is_list ) | 
   if ( !is_list ) | 
|                  *rp = (Obj)BDY(BDY(initiallist)); | 
     *rp = (Obj)BDY(BDY(initiallist)); | 
|          else | 
   else | 
|                  *rp = (Obj)initiallist; | 
     *rp = (Obj)initiallist; | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_order(NODE arg,Obj *rp) | 
 void Pdp_order(NODE arg,Obj *rp) | 
|  { | 
 { | 
|          struct order_spec *ord; | 
   struct order_spec *ord; | 
|          Num homo; | 
   Num homo; | 
|          int modular,is_list; | 
   int modular,is_list; | 
|          LIST v,f,l,ordlist; | 
   LIST v,f,l,ordlist; | 
|          NODE n; | 
   NODE n; | 
|   | 
  | 
|          f = (LIST)ARG0(arg); | 
   f = (LIST)ARG0(arg); | 
|          if ( f && OID(f) == O_LIST ) | 
   if ( f && OID(f) == O_LIST ) | 
|                  is_list = 1; | 
     is_list = 1; | 
|          else { | 
   else { | 
|                  n = mknode(1,f); MKLIST(l,n); f = l; | 
     n = mknode(1,f); MKLIST(l,n); f = l; | 
|                  is_list = 0; | 
     is_list = 0; | 
|          } | 
   } | 
|          if ( current_option ) { | 
   if ( current_option ) { | 
|                  parse_gr_option(f,current_option,&v,&homo,&modular,&ord); | 
     parse_gr_option(f,current_option,&v,&homo,&modular,&ord); | 
|                  initd(ord); | 
     initd(ord); | 
|          } else | 
   } else | 
|                  ord = dp_current_spec; | 
     ord = dp_current_spec; | 
|          ordlist = dp_order(f,ord); | 
   ordlist = dp_order(f,ord); | 
|          if ( !is_list ) | 
   if ( !is_list ) | 
|                  *rp = (Obj)BDY(BDY(ordlist)); | 
     *rp = (Obj)BDY(BDY(ordlist)); | 
|          else | 
   else | 
|                  *rp = (Obj)ordlist; | 
     *rp = (Obj)ordlist; | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_set_sugar(NODE arg,Q *rp) | 
 void Pdp_set_sugar(NODE arg,Q *rp) | 
|  { | 
 { | 
|          DP p; | 
   DP p; | 
|          Q q; | 
   Q q; | 
|          int i; | 
   int i; | 
|   | 
  | 
|          p = (DP)ARG0(arg); | 
   p = (DP)ARG0(arg); | 
|          q = (Q)ARG1(arg); | 
   q = (Q)ARG1(arg); | 
|          if ( p && q) { | 
   if ( p && q) { | 
|                  asir_assert(p,O_DP,"dp_set_sugar"); | 
     asir_assert(p,O_DP,"dp_set_sugar"); | 
|                  asir_assert(q,O_N, "dp_set_sugar"); | 
     asir_assert(q,O_N, "dp_set_sugar"); | 
|                  i = QTOS(q); | 
     i = QTOS(q); | 
|                  if (p->sugar < i) { | 
     if (p->sugar < i) { | 
|                          p->sugar = i; | 
       p->sugar = i; | 
|                  } | 
     } | 
|          } | 
   } | 
|          *rp = 0; | 
   *rp = 0; | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_cri1(NODE arg,Q *rp) | 
 void Pdp_cri1(NODE arg,Q *rp) | 
|  { | 
 { | 
|          DP p1,p2; | 
   DP p1,p2; | 
|          int *d1,*d2; | 
   int *d1,*d2; | 
|          int i,n; | 
   int i,n; | 
|   | 
  | 
|          p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); | 
   p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); | 
|          asir_assert(p1,O_DP,"dp_cri1"); asir_assert(p2,O_DP,"dp_cri1"); | 
   asir_assert(p1,O_DP,"dp_cri1"); asir_assert(p2,O_DP,"dp_cri1"); | 
|          n = p1->nv; d1 = BDY(p1)->dl->d; d2 = BDY(p2)->dl->d; | 
   n = p1->nv; d1 = BDY(p1)->dl->d; d2 = BDY(p2)->dl->d; | 
|          for ( i = 0; i < n; i++ ) | 
   for ( i = 0; i < n; i++ ) | 
|                  if ( d1[i] > d2[i] ) | 
     if ( d1[i] > d2[i] ) | 
|                          break; | 
       break; | 
|          *rp = i == n ? ONE : 0; | 
   *rp = i == n ? ONE : 0; | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_cri2(NODE arg,Q *rp) | 
 void Pdp_cri2(NODE arg,Q *rp) | 
|  { | 
 { | 
|          DP p1,p2; | 
   DP p1,p2; | 
|          int *d1,*d2; | 
   int *d1,*d2; | 
|          int i,n; | 
   int i,n; | 
|   | 
  | 
|          p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); | 
   p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg); | 
|          asir_assert(p1,O_DP,"dp_cri2"); asir_assert(p2,O_DP,"dp_cri2"); | 
   asir_assert(p1,O_DP,"dp_cri2"); asir_assert(p2,O_DP,"dp_cri2"); | 
|          n = p1->nv; d1 = BDY(p1)->dl->d; d2 = BDY(p2)->dl->d; | 
   n = p1->nv; d1 = BDY(p1)->dl->d; d2 = BDY(p2)->dl->d; | 
|          for ( i = 0; i < n; i++ ) | 
   for ( i = 0; i < n; i++ ) | 
|                  if ( MIN(d1[i],d2[i]) >= 1 ) | 
     if ( MIN(d1[i],d2[i]) >= 1 ) | 
|                          break; | 
       break; | 
|          *rp = i == n ? ONE : 0; | 
   *rp = i == n ? ONE : 0; | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_minp(NODE arg,LIST *rp) | 
 void Pdp_minp(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          NODE tn,tn1,d,dd,dd0,p,tp; | 
   NODE tn,tn1,d,dd,dd0,p,tp; | 
|          LIST l,minp; | 
   LIST l,minp; | 
|          DP lcm,tlcm; | 
   DP lcm,tlcm; | 
|          int s,ts; | 
   int s,ts; | 
|   | 
  | 
|          asir_assert(ARG0(arg),O_LIST,"dp_minp"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_minp"); | 
|          d = BDY((LIST)ARG0(arg)); minp = (LIST)BDY(d); | 
   d = BDY((LIST)ARG0(arg)); minp = (LIST)BDY(d); | 
|          p = BDY(minp); p = NEXT(NEXT(p)); lcm = (DP)BDY(p); p = NEXT(p); | 
   p = BDY(minp); p = NEXT(NEXT(p)); lcm = (DP)BDY(p); p = NEXT(p); | 
|          if ( !ARG1(arg) ) { | 
   if ( !ARG1(arg) ) { | 
|                  s = QTOS((Q)BDY(p)); p = NEXT(p); | 
     s = QTOS((Q)BDY(p)); p = NEXT(p); | 
|                  for ( dd0 = 0, d = NEXT(d); d; d = NEXT(d) ) { | 
     for ( dd0 = 0, d = NEXT(d); d; d = NEXT(d) ) { | 
|                          tp = BDY((LIST)BDY(d)); tp = NEXT(NEXT(tp)); | 
       tp = BDY((LIST)BDY(d)); tp = NEXT(NEXT(tp)); | 
|                          tlcm = (DP)BDY(tp); tp = NEXT(tp); | 
       tlcm = (DP)BDY(tp); tp = NEXT(tp); | 
|                          ts = QTOS((Q)BDY(tp)); tp = NEXT(tp); | 
       ts = QTOS((Q)BDY(tp)); tp = NEXT(tp); | 
|                          NEXTNODE(dd0,dd); | 
       NEXTNODE(dd0,dd); | 
|                          if ( ts < s ) { | 
       if ( ts < s ) { | 
|                                  BDY(dd) = (pointer)minp; | 
         BDY(dd) = (pointer)minp; | 
|                                  minp = (LIST)BDY(d); lcm = tlcm; s = ts; | 
         minp = (LIST)BDY(d); lcm = tlcm; s = ts; | 
|                          } else if ( ts == s ) { | 
       } else if ( ts == s ) { | 
|                                  if ( compd(CO,lcm,tlcm) > 0 ) { | 
         if ( compd(CO,lcm,tlcm) > 0 ) { | 
|                                          BDY(dd) = (pointer)minp; | 
           BDY(dd) = (pointer)minp; | 
|                                          minp = (LIST)BDY(d); lcm = tlcm; s = ts; | 
           minp = (LIST)BDY(d); lcm = tlcm; s = ts; | 
|                                  } else | 
         } else | 
|                                          BDY(dd) = BDY(d); | 
           BDY(dd) = BDY(d); | 
|                          } else | 
       } else | 
|                                  BDY(dd) = BDY(d); | 
         BDY(dd) = BDY(d); | 
|                  } | 
     } | 
|          } else { | 
   } else { | 
|                  for ( dd0 = 0, d = NEXT(d); d; d = NEXT(d) ) { | 
     for ( dd0 = 0, d = NEXT(d); d; d = NEXT(d) ) { | 
|                          tp = BDY((LIST)BDY(d)); tp = NEXT(NEXT(tp)); | 
       tp = BDY((LIST)BDY(d)); tp = NEXT(NEXT(tp)); | 
|                          tlcm = (DP)BDY(tp); | 
       tlcm = (DP)BDY(tp); | 
|                          NEXTNODE(dd0,dd); | 
       NEXTNODE(dd0,dd); | 
|                          if ( compd(CO,lcm,tlcm) > 0 ) { | 
       if ( compd(CO,lcm,tlcm) > 0 ) { | 
|                                  BDY(dd) = (pointer)minp; minp = (LIST)BDY(d); lcm = tlcm; | 
         BDY(dd) = (pointer)minp; minp = (LIST)BDY(d); lcm = tlcm; | 
|                          } else | 
       } else | 
|                                  BDY(dd) = BDY(d); | 
         BDY(dd) = BDY(d); | 
|                  } | 
     } | 
|          } | 
   } | 
|          if ( dd0 ) | 
   if ( dd0 ) | 
|                  NEXT(dd) = 0; | 
     NEXT(dd) = 0; | 
|          MKLIST(l,dd0); MKNODE(tn,l,0); MKNODE(tn1,minp,tn); MKLIST(*rp,tn1); | 
   MKLIST(l,dd0); MKNODE(tn,l,0); MKNODE(tn1,minp,tn); MKLIST(*rp,tn1); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_criB(NODE arg,LIST *rp) | 
 void Pdp_criB(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          NODE d,ij,dd,ddd; | 
   NODE d,ij,dd,ddd; | 
|          int i,j,s,n; | 
   int i,j,s,n; | 
|          DP *ps; | 
   DP *ps; | 
|          DL ts,ti,tj,lij,tdl; | 
   DL ts,ti,tj,lij,tdl; | 
|   | 
  | 
|          asir_assert(ARG0(arg),O_LIST,"dp_criB"); d = BDY((LIST)ARG0(arg)); | 
   asir_assert(ARG0(arg),O_LIST,"dp_criB"); d = BDY((LIST)ARG0(arg)); | 
|          asir_assert(ARG1(arg),O_N,"dp_criB"); s = QTOS((Q)ARG1(arg)); | 
   asir_assert(ARG1(arg),O_N,"dp_criB"); s = QTOS((Q)ARG1(arg)); | 
|          asir_assert(ARG2(arg),O_VECT,"dp_criB"); ps = (DP *)BDY((VECT)ARG2(arg)); | 
   asir_assert(ARG2(arg),O_VECT,"dp_criB"); ps = (DP *)BDY((VECT)ARG2(arg)); | 
|          if ( !d ) | 
   if ( !d ) | 
|                  *rp = (LIST)ARG0(arg); | 
     *rp = (LIST)ARG0(arg); | 
|          else { | 
   else { | 
|                  ts = BDY(ps[s])->dl; | 
     ts = BDY(ps[s])->dl; | 
|                  n = ps[s]->nv; | 
     n = ps[s]->nv; | 
|                  NEWDL(tdl,n); | 
     NEWDL(tdl,n); | 
|                  for ( dd = 0; d; d = NEXT(d) ) { | 
     for ( dd = 0; d; d = NEXT(d) ) { | 
|                          ij = BDY((LIST)BDY(d)); | 
       ij = BDY((LIST)BDY(d)); | 
|                          i = QTOS((Q)BDY(ij)); ij = NEXT(ij); | 
       i = QTOS((Q)BDY(ij)); ij = NEXT(ij); | 
|                          j = QTOS((Q)BDY(ij)); ij = NEXT(ij); | 
       j = QTOS((Q)BDY(ij)); ij = NEXT(ij); | 
|                          lij = BDY((DP)BDY(ij))->dl; | 
       lij = BDY((DP)BDY(ij))->dl; | 
|                          ti = BDY(ps[i])->dl; tj = BDY(ps[j])->dl; | 
       ti = BDY(ps[i])->dl; tj = BDY(ps[j])->dl; | 
|                          if ( lij->td != lcm_of_DL(n,lij,ts,tdl)->td | 
       if ( lij->td != lcm_of_DL(n,lij,ts,tdl)->td | 
|                                  || !dl_equal(n,lij,tdl) | 
         || !dl_equal(n,lij,tdl) | 
|                                  || (lij->td == lcm_of_DL(n,ti,ts,tdl)->td | 
         || (lij->td == lcm_of_DL(n,ti,ts,tdl)->td | 
|                                          && dl_equal(n,tdl,lij)) | 
           && dl_equal(n,tdl,lij)) | 
|                                  || (lij->td == lcm_of_DL(n,tj,ts,tdl)->td | 
         || (lij->td == lcm_of_DL(n,tj,ts,tdl)->td | 
|                                          && dl_equal(n,tdl,lij)) ) { | 
           && dl_equal(n,tdl,lij)) ) { | 
|                                  MKNODE(ddd,BDY(d),dd); | 
         MKNODE(ddd,BDY(d),dd); | 
|                                  dd = ddd; | 
         dd = ddd; | 
|                          } | 
       } | 
|                  } | 
     } | 
|                  MKLIST(*rp,dd); | 
     MKLIST(*rp,dd); | 
|          } | 
   } | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_nelim(NODE arg,Q *rp) | 
 void Pdp_nelim(NODE arg,Q *rp) | 
|  { | 
 { | 
|          if ( arg ) { | 
   if ( arg ) { | 
|                  asir_assert(ARG0(arg),O_N,"dp_nelim"); | 
     asir_assert(ARG0(arg),O_N,"dp_nelim"); | 
|                  dp_nelim = QTOS((Q)ARG0(arg)); | 
     dp_nelim = QTOS((Q)ARG0(arg)); | 
|          } | 
   } | 
|          STOQ(dp_nelim,*rp); | 
   STOQ(dp_nelim,*rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_mag(NODE arg,Q *rp) | 
 void Pdp_mag(NODE arg,Q *rp) | 
|  { | 
 { | 
|          DP p; | 
   DP p; | 
|          int s; | 
   int s; | 
|          MP m; | 
   MP m; | 
|   | 
  | 
|          p = (DP)ARG0(arg); | 
   p = (DP)ARG0(arg); | 
|          asir_assert(p,O_DP,"dp_mag"); | 
   asir_assert(p,O_DP,"dp_mag"); | 
|          if ( !p ) | 
   if ( !p ) | 
|                  *rp = 0; | 
     *rp = 0; | 
|          else { | 
   else { | 
|                  for ( s = 0, m = BDY(p); m; m = NEXT(m) ) | 
     for ( s = 0, m = BDY(p); m; m = NEXT(m) ) | 
|                          s += p_mag((P)m->c); | 
       s += p_mag((P)m->c); | 
|                  STOQ(s,*rp); | 
     STOQ(s,*rp); | 
|          } | 
   } | 
|  } | 
 } | 
|   | 
  | 
|  extern int kara_mag; | 
 extern int kara_mag; | 
|   | 
  | 
|  void Pdp_set_kara(NODE arg,Q *rp) | 
 void Pdp_set_kara(NODE arg,Q *rp) | 
|  { | 
 { | 
|          if ( arg ) { | 
   if ( arg ) { | 
|                  asir_assert(ARG0(arg),O_N,"dp_set_kara"); | 
     asir_assert(ARG0(arg),O_N,"dp_set_kara"); | 
|                  kara_mag = QTOS((Q)ARG0(arg)); | 
     kara_mag = QTOS((Q)ARG0(arg)); | 
|          } | 
   } | 
|          STOQ(kara_mag,*rp); | 
   STOQ(kara_mag,*rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_homo(NODE arg,DP *rp) | 
 void Pdp_homo(NODE arg,DP *rp) | 
|  { | 
 { | 
|          asir_assert(ARG0(arg),O_DP,"dp_homo"); | 
   asir_assert(ARG0(arg),O_DP,"dp_homo"); | 
|          dp_homo((DP)ARG0(arg),rp); | 
   dp_homo((DP)ARG0(arg),rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_dehomo(NODE arg,DP *rp) | 
 void Pdp_dehomo(NODE arg,DP *rp) | 
|  { | 
 { | 
|          asir_assert(ARG0(arg),O_DP,"dp_dehomo"); | 
   asir_assert(ARG0(arg),O_DP,"dp_dehomo"); | 
|          dp_dehomo((DP)ARG0(arg),rp); | 
   dp_dehomo((DP)ARG0(arg),rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_gr_flags(NODE arg,LIST *rp) | 
 void Pdp_gr_flags(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          Obj name,value; | 
   Obj name,value; | 
|          NODE n; | 
   NODE n; | 
|   | 
  | 
|          if ( arg ) { | 
   if ( arg ) { | 
|                  asir_assert(ARG0(arg),O_LIST,"dp_gr_flags"); | 
     asir_assert(ARG0(arg),O_LIST,"dp_gr_flags"); | 
|                  n = BDY((LIST)ARG0(arg)); | 
     n = BDY((LIST)ARG0(arg)); | 
|                  while ( n ) { | 
     while ( n ) { | 
|                          name = (Obj)BDY(n); n = NEXT(n); | 
       name = (Obj)BDY(n); n = NEXT(n); | 
|                          if ( !n ) | 
       if ( !n ) | 
|                                  break; | 
         break; | 
|                          else { | 
       else { | 
|                                  value = (Obj)BDY(n); n = NEXT(n); | 
         value = (Obj)BDY(n); n = NEXT(n); | 
|                          } | 
       } | 
|                          dp_set_flag(name,value); | 
       dp_set_flag(name,value); | 
|                  } | 
     } | 
|          } | 
   } | 
|          dp_make_flaglist(rp); | 
   dp_make_flaglist(rp); | 
|  } | 
 } | 
|   | 
  | 
|  extern int DP_Print, DP_PrintShort; | 
 extern int DP_Print, DP_PrintShort; | 
|   | 
  | 
|  void Pdp_gr_print(NODE arg,Q *rp) | 
 void Pdp_gr_print(NODE arg,Q *rp) | 
|  { | 
 { | 
|          Q q; | 
   Q q; | 
|          int s; | 
   int s; | 
|   | 
  | 
|          if ( arg ) { | 
   if ( arg ) { | 
|                  asir_assert(ARG0(arg),O_N,"dp_gr_print"); | 
     asir_assert(ARG0(arg),O_N,"dp_gr_print"); | 
|                  q = (Q)ARG0(arg); | 
     q = (Q)ARG0(arg); | 
|                  s = QTOS(q); | 
     s = QTOS(q); | 
|                  switch ( s ) { | 
     switch ( s ) { | 
|                          case 0: | 
       case 0: | 
|                                  DP_Print = 0; DP_PrintShort = 0; | 
         DP_Print = 0; DP_PrintShort = 0; | 
|                                  break; | 
         break; | 
|                          case 1: | 
       case 1: | 
|                                  DP_Print = 1; | 
         DP_Print = 1; | 
|                                  break; | 
         break; | 
|                          case 2: | 
       case 2: | 
|                                  DP_Print = 0; DP_PrintShort = 1; | 
         DP_Print = 0; DP_PrintShort = 1; | 
|                                  break; | 
         break; | 
|                          default: | 
       default: | 
|                                  DP_Print = s; DP_PrintShort = 0; | 
         DP_Print = s; DP_PrintShort = 0; | 
|                                  break; | 
         break; | 
|                  } | 
     } | 
|          } else { | 
   } else { | 
|                  if ( DP_Print ) { | 
     if ( DP_Print )  { | 
|                          STOQ(1,q); | 
       STOQ(1,q); | 
|                  } else if ( DP_PrintShort ) { | 
     } else if ( DP_PrintShort ) { | 
|                          STOQ(2,q); | 
       STOQ(2,q); | 
|                  } else | 
     } else | 
|                          q = 0; | 
       q = 0; | 
|          } | 
   } | 
|          *rp = q; | 
   *rp = q; | 
|  } | 
 } | 
|   | 
  | 
|  void parse_gr_option(LIST f,NODE opt,LIST *v,Num *homo, | 
 void parse_gr_option(LIST f,NODE opt,LIST *v,Num *homo, | 
|          int *modular,struct order_spec **ord) | 
   int *modular,struct order_spec **ord) | 
|  { | 
 { | 
|          NODE t,p; | 
   NODE t,p; | 
|          Q m; | 
   Q m; | 
|          char *key; | 
   char *key; | 
|          Obj value,dmy; | 
   Obj value,dmy; | 
|          int ord_is_set = 0; | 
   int ord_is_set = 0; | 
|          int modular_is_set = 0; | 
   int modular_is_set = 0; | 
|          int homo_is_set = 0; | 
   int homo_is_set = 0; | 
|          VL vl,vl0; | 
   VL vl,vl0; | 
|          LIST vars; | 
   LIST vars; | 
|          char xiname[BUFSIZ]; | 
   char xiname[BUFSIZ]; | 
|          NODE x0,x; | 
   NODE x0,x; | 
|          DP d; | 
   DP d; | 
|          P xi; | 
   P xi; | 
|          int nv,i; | 
   int nv,i; | 
|   | 
  | 
|          /* extract vars */ | 
   /* extract vars */ | 
|          vars = 0; | 
   vars = 0; | 
|          for ( t = opt; t; t = NEXT(t) ) { | 
   for ( t = opt; t; t = NEXT(t) ) { | 
|                  p = BDY((LIST)BDY(t)); | 
     p = BDY((LIST)BDY(t)); | 
|                  key = BDY((STRING)BDY(p)); | 
     key = BDY((STRING)BDY(p)); | 
|                  value = (Obj)BDY(NEXT(p)); | 
     value = (Obj)BDY(NEXT(p)); | 
|                  if ( !strcmp(key,"v") ) { | 
     if ( !strcmp(key,"v") ) { | 
|                          /* variable list */ | 
       /* variable list */ | 
|                          vars = (LIST)value; | 
       vars = (LIST)value; | 
|                          break; | 
       break; | 
|                  } | 
     } | 
|          } | 
   } | 
|          if ( vars ) { | 
   if ( vars ) { | 
|                  *v = vars; pltovl(vars,&vl); | 
     *v = vars; pltovl(vars,&vl); | 
|          } else { | 
   } else { | 
|                  for ( t = BDY(f); t; t = NEXT(t) ) | 
     for ( t = BDY(f); t; t = NEXT(t) ) | 
|                          if ( BDY(t) && OID((Obj)BDY(t))==O_DP ) | 
       if ( BDY(t) && OID((Obj)BDY(t))==O_DP ) | 
|                                  break; | 
         break; | 
|                  if ( t ) { | 
     if ( t ) { | 
|                          /* f is DP list */ | 
       /* f is DP list */ | 
|                          /* create dummy var list */ | 
       /* create dummy var list */ | 
|                          d = (DP)BDY(t); | 
       d = (DP)BDY(t); | 
|                          nv = NV(d); | 
       nv = NV(d); | 
|                          for ( i = 0, vl0 = 0, x0 = 0; i < nv; i++ ) { | 
       for ( i = 0, vl0 = 0, x0 = 0; i < nv; i++ ) { | 
|                                  NEXTVL(vl0,vl); | 
         NEXTVL(vl0,vl); | 
|                                  NEXTNODE(x0,x); | 
         NEXTNODE(x0,x); | 
|                                  sprintf(xiname,"x%d",i); | 
         sprintf(xiname,"x%d",i); | 
|                                  makevar(xiname,&xi); | 
         makevar(xiname,&xi); | 
|                                  x->body = (pointer)xi; | 
         x->body = (pointer)xi; | 
|                                  vl->v = VR((P)xi); | 
         vl->v = VR((P)xi); | 
|                          } | 
       } | 
|                          if ( vl0 ) { | 
       if ( vl0 ) { | 
|                                  NEXT(vl) = 0; | 
         NEXT(vl) = 0; | 
|                                  NEXT(x) = 0; | 
         NEXT(x) = 0; | 
|                          } | 
       } | 
|                          MKLIST(vars,x0); | 
       MKLIST(vars,x0); | 
|                          *v = vars; | 
       *v = vars; | 
|                          vl = vl0; | 
       vl = vl0; | 
|                  } else { | 
     } else { | 
|                          get_vars((Obj)f,&vl); vltopl(vl,v); | 
       get_vars((Obj)f,&vl); vltopl(vl,v); | 
|                  } | 
     } | 
|          } | 
   } | 
|   | 
  | 
|          for ( t = opt; t; t = NEXT(t) ) { | 
   for ( t = opt; t; t = NEXT(t) ) { | 
|                  p = BDY((LIST)BDY(t)); | 
     p = BDY((LIST)BDY(t)); | 
|                  key = BDY((STRING)BDY(p)); | 
     key = BDY((STRING)BDY(p)); | 
|                  value = (Obj)BDY(NEXT(p)); | 
     value = (Obj)BDY(NEXT(p)); | 
|                  if ( !strcmp(key,"v") ) { | 
     if ( !strcmp(key,"v") ) { | 
|                          /* variable list; ignore */ | 
       /* variable list; ignore */ | 
|                  } else if ( !strcmp(key,"order") ) { | 
     } else if ( !strcmp(key,"order") ) { | 
|                          /* order spec */ | 
       /* order spec */ | 
|                          if ( !vl ) | 
       if ( !vl ) | 
|                                  error("parse_gr_option : variables must be specified"); | 
         error("parse_gr_option : variables must be specified"); | 
|                          create_order_spec(vl,value,ord); | 
       create_order_spec(vl,value,ord); | 
|                          ord_is_set = 1; | 
       ord_is_set = 1; | 
|                  } else if ( !strcmp(key,"block") ) { | 
     } else if ( !strcmp(key,"block") ) { | 
|                          create_order_spec(0,value,ord); | 
       create_order_spec(0,value,ord); | 
|                          ord_is_set = 1; | 
       ord_is_set = 1; | 
|                  } else if ( !strcmp(key,"matrix") ) { | 
     } else if ( !strcmp(key,"matrix") ) { | 
|                          create_order_spec(0,value,ord); | 
       create_order_spec(0,value,ord); | 
|                          ord_is_set = 1; | 
       ord_is_set = 1; | 
|                  } else if ( !strcmp(key,"sugarweight") ) { | 
     } else if ( !strcmp(key,"sugarweight") ) { | 
|                          /* weight */ | 
       /* weight */ | 
|                          Pdp_set_weight(NEXT(p),&dmy); | 
       Pdp_set_weight(NEXT(p),&dmy); | 
|                  } else if ( !strcmp(key,"homo") ) { | 
     } else if ( !strcmp(key,"homo") ) { | 
|                          *homo = (Num)value; | 
       *homo = (Num)value; | 
|                          homo_is_set = 1; | 
       homo_is_set = 1; | 
|                  } else if ( !strcmp(key,"trace") ) { | 
     } else if ( !strcmp(key,"trace") ) { | 
|                          m = (Q)value; | 
       m = (Q)value; | 
|                          if ( !m ) | 
       if ( !m ) | 
|                                  *modular = 0; | 
         *modular = 0; | 
|                          else if ( PL(NM(m))>1 || (PL(NM(m)) == 1 | 
       else if ( PL(NM(m))>1 || (PL(NM(m)) == 1 | 
|                                  && BD(NM(m))[0] >= 0x80000000) ) | 
         && BD(NM(m))[0] >= 0x80000000) ) | 
|                                  error("parse_gr_option : too large modulus"); | 
         error("parse_gr_option : too large modulus"); | 
|                          else | 
       else | 
|                                  *modular = QTOS(m); | 
         *modular = QTOS(m); | 
|                          modular_is_set = 1; | 
       modular_is_set = 1; | 
|                  } else if ( !strcmp(key,"dp") ) { | 
     } else if ( !strcmp(key,"dp") ) { | 
|        /* XXX : ignore */ | 
       /* XXX : ignore */ | 
|                  } else | 
     } else | 
|                          error("parse_gr_option : not implemented"); | 
       error("parse_gr_option : not implemented"); | 
|          } | 
   } | 
|          if ( !ord_is_set ) create_order_spec(0,0,ord); | 
   if ( !ord_is_set ) create_order_spec(0,0,ord); | 
|          if ( !modular_is_set ) *modular = 0; | 
   if ( !modular_is_set ) *modular = 0; | 
|          if ( !homo_is_set ) *homo = 0; | 
   if ( !homo_is_set ) *homo = 0; | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_gr_main(NODE arg,LIST *rp) | 
 void Pdp_gr_main(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          LIST f,v; | 
   LIST f,v; | 
|          VL vl; | 
   VL vl; | 
|          Num homo; | 
   Num homo; | 
|          Q m; | 
   Q m; | 
|          int modular,ac; | 
   int modular,ac; | 
|          struct order_spec *ord; | 
   struct order_spec *ord; | 
|   | 
  | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|          asir_assert(ARG0(arg),O_LIST,"dp_gr_main"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_gr_main"); | 
|          f = (LIST)ARG0(arg); | 
   f = (LIST)ARG0(arg); | 
|          f = remove_zero_from_list(f); | 
   f = remove_zero_from_list(f); | 
|          if ( !BDY(f) ) { | 
   if ( !BDY(f) ) { | 
|                  *rp = f; return; | 
     *rp = f; return; | 
|          } | 
   } | 
|          if ( (ac = argc(arg)) == 5 ) { | 
   if ( (ac = argc(arg)) == 5 ) { | 
|                  asir_assert(ARG1(arg),O_LIST,"dp_gr_main"); | 
     asir_assert(ARG1(arg),O_LIST,"dp_gr_main"); | 
|                  asir_assert(ARG2(arg),O_N,"dp_gr_main"); | 
     asir_assert(ARG2(arg),O_N,"dp_gr_main"); | 
|                  asir_assert(ARG3(arg),O_N,"dp_gr_main"); | 
     asir_assert(ARG3(arg),O_N,"dp_gr_main"); | 
|                  v = (LIST)ARG1(arg); | 
     v = (LIST)ARG1(arg); | 
|                  homo = (Num)ARG2(arg); | 
     homo = (Num)ARG2(arg); | 
|                  m = (Q)ARG3(arg); | 
     m = (Q)ARG3(arg); | 
|                  if ( !m ) | 
     if ( !m ) | 
|                          modular = 0; | 
       modular = 0; | 
|                  else if ( PL(NM(m))>1 || (PL(NM(m)) == 1 && BD(NM(m))[0] >= 0x80000000) ) | 
     else if ( PL(NM(m))>1 || (PL(NM(m)) == 1 && BD(NM(m))[0] >= 0x80000000) ) | 
|                          error("dp_gr_main : too large modulus"); | 
       error("dp_gr_main : too large modulus"); | 
|                  else | 
     else | 
|                          modular = QTOS(m); | 
       modular = QTOS(m); | 
|                  create_order_spec(0,ARG4(arg),&ord); | 
     create_order_spec(0,ARG4(arg),&ord); | 
|          } else if ( current_option ) | 
   } else if ( current_option ) | 
|                  parse_gr_option(f,current_option,&v,&homo,&modular,&ord); | 
     parse_gr_option(f,current_option,&v,&homo,&modular,&ord); | 
|          else if ( ac == 1 ) | 
   else if ( ac == 1 ) | 
|                  parse_gr_option(f,0,&v,&homo,&modular,&ord); | 
     parse_gr_option(f,0,&v,&homo,&modular,&ord); | 
|          else | 
   else | 
|                  error("dp_gr_main : invalid argument"); | 
     error("dp_gr_main : invalid argument"); | 
|          dp_gr_main(f,v,homo,modular,0,ord,rp); | 
   dp_gr_main(f,v,homo,modular,0,ord,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_interreduce(NODE arg,LIST *rp) | 
 void Pdp_interreduce(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          LIST f,v; | 
   LIST f,v; | 
|          VL vl; | 
   VL vl; | 
|          int ac; | 
   int ac; | 
|          struct order_spec *ord; | 
   struct order_spec *ord; | 
|   | 
  | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|          asir_assert(ARG0(arg),O_LIST,"dp_interreduce"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_interreduce"); | 
|          f = (LIST)ARG0(arg); | 
   f = (LIST)ARG0(arg); | 
|          f = remove_zero_from_list(f); | 
   f = remove_zero_from_list(f); | 
|          if ( !BDY(f) ) { | 
   if ( !BDY(f) ) { | 
|                  *rp = f; return; | 
     *rp = f; return; | 
|          } | 
   } | 
|          if ( (ac = argc(arg)) == 3 ) { | 
   if ( (ac = argc(arg)) == 3 ) { | 
|                  asir_assert(ARG1(arg),O_LIST,"dp_interreduce"); | 
     asir_assert(ARG1(arg),O_LIST,"dp_interreduce"); | 
|                  v = (LIST)ARG1(arg); | 
     v = (LIST)ARG1(arg); | 
|                  create_order_spec(0,ARG2(arg),&ord); | 
     create_order_spec(0,ARG2(arg),&ord); | 
|          } | 
   } | 
|          dp_interreduce(f,v,0,ord,rp); | 
   dp_interreduce(f,v,0,ord,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_gr_f_main(NODE arg,LIST *rp) | 
 void Pdp_gr_f_main(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          LIST f,v; | 
   LIST f,v; | 
|          Num homo; | 
   Num homo; | 
|          int m,field,t; | 
   int m,field,t; | 
|          struct order_spec *ord; | 
   struct order_spec *ord; | 
|          NODE n; | 
   NODE n; | 
|   | 
  | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|          asir_assert(ARG0(arg),O_LIST,"dp_gr_f_main"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_gr_f_main"); | 
|          asir_assert(ARG1(arg),O_LIST,"dp_gr_f_main"); | 
   asir_assert(ARG1(arg),O_LIST,"dp_gr_f_main"); | 
|          asir_assert(ARG2(arg),O_N,"dp_gr_f_main"); | 
   asir_assert(ARG2(arg),O_N,"dp_gr_f_main"); | 
|          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; return; | 
|          } | 
   } | 
|          homo = (Num)ARG2(arg); | 
   homo = (Num)ARG2(arg); | 
|  #if 0 | 
 #if 0 | 
|          asir_assert(ARG3(arg),O_N,"dp_gr_f_main"); | 
   asir_assert(ARG3(arg),O_N,"dp_gr_f_main"); | 
|          m = QTOS((Q)ARG3(arg)); | 
   m = QTOS((Q)ARG3(arg)); | 
|          if ( m ) | 
   if ( m ) | 
|                  error("dp_gr_f_main : trace lifting is not implemented yet"); | 
     error("dp_gr_f_main : trace lifting is not implemented yet"); | 
|          create_order_spec(0,ARG4(arg),&ord); | 
   create_order_spec(0,ARG4(arg),&ord); | 
|  #else | 
 #else | 
|          m = 0; | 
   m = 0; | 
|          create_order_spec(0,ARG3(arg),&ord); | 
   create_order_spec(0,ARG3(arg),&ord); | 
|  #endif | 
 #endif | 
|          field = 0; | 
   field = 0; | 
|          for ( n = BDY(f); n; n = NEXT(n) ) { | 
   for ( n = BDY(f); n; n = NEXT(n) ) { | 
|                  t = get_field_type(BDY(n)); | 
     t = get_field_type(BDY(n)); | 
|                  if ( !t ) | 
     if ( !t ) | 
|                          continue; | 
       continue; | 
|                  if ( t < 0 ) | 
     if ( t < 0 ) | 
|                          error("dp_gr_f_main : incosistent coefficients"); | 
       error("dp_gr_f_main : incosistent coefficients"); | 
|                  if ( !field ) | 
     if ( !field ) | 
|                          field = t; | 
       field = t; | 
|                  else if ( t != field ) | 
     else if ( t != field ) | 
|                          error("dp_gr_f_main : incosistent coefficients"); | 
       error("dp_gr_f_main : incosistent coefficients"); | 
|          } | 
   } | 
|          dp_gr_main(f,v,homo,m?1:0,field,ord,rp); | 
   dp_gr_main(f,v,homo,m?1:0,field,ord,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_f4_main(NODE arg,LIST *rp) | 
 void Pdp_f4_main(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          LIST f,v; | 
   LIST f,v; | 
|          struct order_spec *ord; | 
   struct order_spec *ord; | 
|   | 
  | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|          asir_assert(ARG0(arg),O_LIST,"dp_f4_main"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_f4_main"); | 
|          asir_assert(ARG1(arg),O_LIST,"dp_f4_main"); | 
   asir_assert(ARG1(arg),O_LIST,"dp_f4_main"); | 
|          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; return; | 
|          } | 
   } | 
|          create_order_spec(0,ARG2(arg),&ord); | 
   create_order_spec(0,ARG2(arg),&ord); | 
|          dp_f4_main(f,v,ord,rp); | 
   dp_f4_main(f,v,ord,rp); | 
|  } | 
 } | 
|   | 
  | 
|  /* dp_gr_checklist(list of dp) */ | 
 /* dp_gr_checklist(list of dp) */ | 
|   | 
  | 
|  void Pdp_gr_checklist(NODE arg,LIST *rp) | 
 void Pdp_gr_checklist(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          VECT g; | 
   VECT g; | 
|          LIST dp; | 
   LIST dp; | 
|          NODE r; | 
   NODE r; | 
|          int n; | 
   int n; | 
|   | 
  | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|          asir_assert(ARG0(arg),O_LIST,"dp_gr_checklist"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_gr_checklist"); | 
|          asir_assert(ARG1(arg),O_N,"dp_gr_checklist"); | 
   asir_assert(ARG1(arg),O_N,"dp_gr_checklist"); | 
|          n = QTOS((Q)ARG1(arg)); | 
   n = QTOS((Q)ARG1(arg)); | 
|          gbcheck_list(BDY((LIST)ARG0(arg)),n,&g,&dp); | 
   gbcheck_list(BDY((LIST)ARG0(arg)),n,&g,&dp); | 
|          r = mknode(2,g,dp); | 
   r = mknode(2,g,dp); | 
|          MKLIST(*rp,r); | 
   MKLIST(*rp,r); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_f4_mod_main(NODE arg,LIST *rp) | 
 void Pdp_f4_mod_main(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          LIST f,v; | 
   LIST f,v; | 
|          int m; | 
   int m; | 
|          struct order_spec *ord; | 
   struct order_spec *ord; | 
|   | 
  | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|          asir_assert(ARG0(arg),O_LIST,"dp_f4_mod_main"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_f4_mod_main"); | 
|          asir_assert(ARG1(arg),O_LIST,"dp_f4_mod_main"); | 
   asir_assert(ARG1(arg),O_LIST,"dp_f4_mod_main"); | 
|          asir_assert(ARG2(arg),O_N,"dp_f4_mod_main"); | 
   asir_assert(ARG2(arg),O_N,"dp_f4_mod_main"); | 
|          f = (LIST)ARG0(arg); v = (LIST)ARG1(arg); m = QTOS((Q)ARG2(arg)); | 
   f = (LIST)ARG0(arg); v = (LIST)ARG1(arg); m = QTOS((Q)ARG2(arg)); | 
|          f = remove_zero_from_list(f); | 
   f = remove_zero_from_list(f); | 
|          if ( !BDY(f) ) { | 
   if ( !BDY(f) ) { | 
|                  *rp = f; return; | 
     *rp = f; return; | 
|          } | 
   } | 
|          if ( !m ) | 
   if ( !m ) | 
|                  error("dp_f4_mod_main : invalid argument"); | 
     error("dp_f4_mod_main : invalid argument"); | 
|          create_order_spec(0,ARG3(arg),&ord); | 
   create_order_spec(0,ARG3(arg),&ord); | 
|          dp_f4_mod_main(f,v,m,ord,rp); | 
   dp_f4_mod_main(f,v,m,ord,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_gr_mod_main(NODE arg,LIST *rp) | 
 void Pdp_gr_mod_main(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          LIST f,v; | 
   LIST f,v; | 
|          Num homo; | 
   Num homo; | 
|          int m; | 
   int m; | 
|          struct order_spec *ord; | 
   struct order_spec *ord; | 
|   | 
  | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|          asir_assert(ARG0(arg),O_LIST,"dp_gr_mod_main"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_gr_mod_main"); | 
|          asir_assert(ARG1(arg),O_LIST,"dp_gr_mod_main"); | 
   asir_assert(ARG1(arg),O_LIST,"dp_gr_mod_main"); | 
|          asir_assert(ARG2(arg),O_N,"dp_gr_mod_main"); | 
   asir_assert(ARG2(arg),O_N,"dp_gr_mod_main"); | 
|          asir_assert(ARG3(arg),O_N,"dp_gr_mod_main"); | 
   asir_assert(ARG3(arg),O_N,"dp_gr_mod_main"); | 
|          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; return; | 
|          } | 
   } | 
|          homo = (Num)ARG2(arg); m = QTOS((Q)ARG3(arg)); | 
   homo = (Num)ARG2(arg); m = QTOS((Q)ARG3(arg)); | 
|          if ( !m ) | 
   if ( !m ) | 
|                  error("dp_gr_mod_main : invalid argument"); | 
     error("dp_gr_mod_main : invalid argument"); | 
|          create_order_spec(0,ARG4(arg),&ord); | 
   create_order_spec(0,ARG4(arg),&ord); | 
|          dp_gr_mod_main(f,v,homo,m,ord,rp); | 
   dp_gr_mod_main(f,v,homo,m,ord,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pnd_f4(NODE arg,LIST *rp) | 
 void Pnd_f4(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          LIST f,v; | 
   LIST f,v; | 
|          int m,homo,retdp,ac; | 
   int m,homo,retdp,ac; | 
|          Obj val; | 
   Obj val; | 
|    Q mq; | 
   Q mq; | 
|    Num nhomo; | 
   Num nhomo; | 
|    NODE node; | 
   NODE node; | 
|          struct order_spec *ord; | 
   struct order_spec *ord; | 
|   | 
  | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|          nd_rref2 = 0; | 
   nd_rref2 = 0; | 
|    retdp = 0; | 
   retdp = 0; | 
|    if ( (ac = argc(arg)) == 4 ) { | 
   if ( (ac = argc(arg)) == 4 ) { | 
|            asir_assert(ARG0(arg),O_LIST,"nd_f4"); | 
     asir_assert(ARG0(arg),O_LIST,"nd_f4"); | 
|            asir_assert(ARG1(arg),O_LIST,"nd_f4"); | 
     asir_assert(ARG1(arg),O_LIST,"nd_f4"); | 
|            asir_assert(ARG2(arg),O_N,"nd_f4"); | 
     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) ) { | 
|                    *rp = f; return; | 
       *rp = f; return; | 
|            } | 
     } | 
|        mq = (Q)ARG2(arg); | 
       mq = (Q)ARG2(arg); | 
|        if ( mq && (PL(NM(mq)) > 1 || BD(NM(mq))[0] >= (1<<31)) ) { | 
       if ( mq && (PL(NM(mq)) > 1 || BD(NM(mq))[0] >= (1<<31)) ) { | 
|          node = mknode(1,mq); | 
         node = mknode(1,mq); | 
| Line 2327  void Pnd_f4(NODE arg,LIST *rp) | 
 
  | 
| Line 2327  void Pnd_f4(NODE arg,LIST *rp) | 
 
 
 | 
|          m = -2; | 
         m = -2; | 
|      } else | 
     } else | 
|        m = QTOS(mq); | 
       m = QTOS(mq); | 
|            create_order_spec(0,ARG3(arg),&ord); | 
     create_order_spec(0,ARG3(arg),&ord); | 
|            homo = 0; | 
     homo = 0; | 
|            if ( get_opt("homo",&val) && val ) homo = 1; | 
     if ( get_opt("homo",&val) && val ) homo = 1; | 
|            if ( get_opt("dp",&val) && val ) retdp = 1; | 
     if ( get_opt("dp",&val) && val ) retdp = 1; | 
|            if ( get_opt("rref2",&val) && val ) nd_rref2 = 1; | 
     if ( get_opt("rref2",&val) && val ) nd_rref2 = 1; | 
|    } else if ( ac == 1 ) { | 
   } else if ( ac == 1 ) { | 
|            f = (LIST)ARG0(arg); | 
     f = (LIST)ARG0(arg); | 
|                  parse_gr_option(f,current_option,&v,&nhomo,&m,&ord); | 
     parse_gr_option(f,current_option,&v,&nhomo,&m,&ord); | 
|      homo = QTOS((Q)nhomo); | 
     homo = QTOS((Q)nhomo); | 
|            if ( get_opt("dp",&val) && val ) retdp = 1; | 
     if ( get_opt("dp",&val) && val ) retdp = 1; | 
|            if ( get_opt("rref2",&val) && val ) nd_rref2 = 1; | 
     if ( get_opt("rref2",&val) && val ) nd_rref2 = 1; | 
|    } else | 
   } else | 
|      error("nd_f4 : invalid argument"); | 
     error("nd_f4 : invalid argument"); | 
|          nd_gr(f,v,m,homo,retdp,1,ord,rp); | 
   nd_gr(f,v,m,homo,retdp,1,ord,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pnd_gr(NODE arg,LIST *rp) | 
 void Pnd_gr(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          LIST f,v; | 
   LIST f,v; | 
|          int m,homo,retdp,ac; | 
   int m,homo,retdp,ac; | 
|          Obj val; | 
   Obj val; | 
|    Q mq; | 
   Q mq; | 
|    Num nhomo; | 
   Num nhomo; | 
|    NODE node; | 
   NODE node; | 
|          struct order_spec *ord; | 
   struct order_spec *ord; | 
|   | 
  | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|    retdp = 0; | 
   retdp = 0; | 
|    if ( (ac=argc(arg)) == 4 ) { | 
   if ( (ac=argc(arg)) == 4 ) { | 
|            asir_assert(ARG0(arg),O_LIST,"nd_gr"); | 
     asir_assert(ARG0(arg),O_LIST,"nd_gr"); | 
|            asir_assert(ARG1(arg),O_LIST,"nd_gr"); | 
     asir_assert(ARG1(arg),O_LIST,"nd_gr"); | 
|            asir_assert(ARG2(arg),O_N,"nd_gr"); | 
     asir_assert(ARG2(arg),O_N,"nd_gr"); | 
|            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; return; | 
|            } | 
     } | 
|        mq = (Q)ARG2(arg); | 
       mq = (Q)ARG2(arg); | 
|        if ( mq && (PL(NM(mq)) > 1 || BD(NM(mq))[0] >= (1<<30)) ) { | 
       if ( mq && (PL(NM(mq)) > 1 || BD(NM(mq))[0] >= (1<<30)) ) { | 
|          node = mknode(1,mq); | 
         node = mknode(1,mq); | 
| Line 2371  void Pnd_gr(NODE arg,LIST *rp) | 
 
  | 
| Line 2371  void Pnd_gr(NODE arg,LIST *rp) | 
 
 
 | 
|          m = -2; | 
         m = -2; | 
|        } else | 
       } else | 
|          m = QTOS(mq); | 
         m = QTOS(mq); | 
|            create_order_spec(0,ARG3(arg),&ord); | 
     create_order_spec(0,ARG3(arg),&ord); | 
|            homo = 0; | 
     homo = 0; | 
|            if ( get_opt("homo",&val) && val ) homo = 1; | 
     if ( get_opt("homo",&val) && val ) homo = 1; | 
|            if ( get_opt("dp",&val) && val ) retdp = 1; | 
     if ( get_opt("dp",&val) && val ) retdp = 1; | 
|          } else if ( ac == 1 ) { | 
   } else if ( ac == 1 ) { | 
|            f = (LIST)ARG0(arg); | 
     f = (LIST)ARG0(arg); | 
|                  parse_gr_option(f,current_option,&v,&nhomo,&m,&ord); | 
     parse_gr_option(f,current_option,&v,&nhomo,&m,&ord); | 
|      homo = QTOS((Q)nhomo); | 
     homo = QTOS((Q)nhomo); | 
|            if ( get_opt("dp",&val) && val ) retdp = 1; | 
     if ( get_opt("dp",&val) && val ) retdp = 1; | 
|    } else | 
   } else | 
|      error("nd_gr : invalid argument"); | 
     error("nd_gr : invalid argument"); | 
|          nd_gr(f,v,m,homo,retdp,0,ord,rp); | 
   nd_gr(f,v,m,homo,retdp,0,ord,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pnd_gr_postproc(NODE arg,LIST *rp) | 
 void Pnd_gr_postproc(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          LIST f,v; | 
   LIST f,v; | 
|          int m,do_check; | 
   int m,do_check; | 
|      Q mq; | 
     Q mq; | 
|      Obj val; | 
     Obj val; | 
|      NODE node; | 
     NODE node; | 
|          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_gr"); | 
|          asir_assert(ARG1(arg),O_LIST,"nd_gr"); | 
   asir_assert(ARG1(arg),O_LIST,"nd_gr"); | 
|          asir_assert(ARG2(arg),O_N,"nd_gr"); | 
   asir_assert(ARG2(arg),O_N,"nd_gr"); | 
|          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; return; | 
|          } | 
   } | 
|      mq = (Q)ARG2(arg); | 
     mq = (Q)ARG2(arg); | 
|      if ( mq && (PL(NM(mq)) > 1 || BD(NM(mq))[0] >= (1<<30)) ) { | 
     if ( mq && (PL(NM(mq)) > 1 || BD(NM(mq))[0] >= (1<<30)) ) { | 
|        node = mknode(1,mq); | 
       node = mknode(1,mq); | 
| Line 2410  void Pnd_gr_postproc(NODE arg,LIST *rp) | 
 
  | 
| Line 2410  void Pnd_gr_postproc(NODE arg,LIST *rp) | 
 
 
 | 
|        m = -2; | 
       m = -2; | 
|      } else | 
     } else | 
|        m = QTOS(mq); | 
       m = QTOS(mq); | 
|          create_order_spec(0,ARG3(arg),&ord); | 
   create_order_spec(0,ARG3(arg),&ord); | 
|          do_check = ARG4(arg) ? 1 : 0; | 
   do_check = ARG4(arg) ? 1 : 0; | 
|          nd_gr_postproc(f,v,m,ord,do_check,rp); | 
   nd_gr_postproc(f,v,m,ord,do_check,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pnd_gr_recompute_trace(NODE arg,LIST *rp) | 
 void Pnd_gr_recompute_trace(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          LIST f,v,tlist; | 
   LIST f,v,tlist; | 
|          int m; | 
   int m; | 
|          struct order_spec *ord; | 
   struct order_spec *ord; | 
|   | 
  | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|          asir_assert(ARG0(arg),O_LIST,"nd_gr_recompute_trace"); | 
   asir_assert(ARG0(arg),O_LIST,"nd_gr_recompute_trace"); | 
|          asir_assert(ARG1(arg),O_LIST,"nd_gr_recompute_trace"); | 
   asir_assert(ARG1(arg),O_LIST,"nd_gr_recompute_trace"); | 
|          asir_assert(ARG2(arg),O_N,"nd_gr_recompute_trace"); | 
   asir_assert(ARG2(arg),O_N,"nd_gr_recompute_trace"); | 
|          f = (LIST)ARG0(arg); v = (LIST)ARG1(arg); | 
   f = (LIST)ARG0(arg); v = (LIST)ARG1(arg); | 
|          m = QTOS((Q)ARG2(arg)); | 
   m = QTOS((Q)ARG2(arg)); | 
|          create_order_spec(0,ARG3(arg),&ord); | 
   create_order_spec(0,ARG3(arg),&ord); | 
|          tlist = (LIST)ARG4(arg); | 
   tlist = (LIST)ARG4(arg); | 
|          nd_gr_recompute_trace(f,v,m,ord,tlist,rp); | 
   nd_gr_recompute_trace(f,v,m,ord,tlist,rp); | 
|  } | 
 } | 
|   | 
  | 
|  Obj nd_btog_one(LIST f,LIST v,int m,struct order_spec *ord,LIST tlist,int pos); | 
 Obj nd_btog_one(LIST f,LIST v,int m,struct order_spec *ord,LIST tlist,int pos); | 
| Line 2437  Obj nd_btog(LIST f,LIST v,int m,struct order_spec *ord | 
 
  | 
| Line 2437  Obj nd_btog(LIST f,LIST v,int m,struct order_spec *ord | 
 
 
 | 
|   | 
  | 
|  void Pnd_btog(NODE arg,Obj *rp) | 
 void Pnd_btog(NODE arg,Obj *rp) | 
|  { | 
 { | 
|          LIST f,v,tlist; | 
   LIST f,v,tlist; | 
|          int m,ac,pos; | 
   int m,ac,pos; | 
|          struct order_spec *ord; | 
   struct order_spec *ord; | 
|   | 
  | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|          asir_assert(ARG0(arg),O_LIST,"nd_btog"); | 
   asir_assert(ARG0(arg),O_LIST,"nd_btog"); | 
|          asir_assert(ARG1(arg),O_LIST,"nd_btog"); | 
   asir_assert(ARG1(arg),O_LIST,"nd_btog"); | 
|          asir_assert(ARG2(arg),O_N,"nd_btog"); | 
   asir_assert(ARG2(arg),O_N,"nd_btog"); | 
|          f = (LIST)ARG0(arg); v = (LIST)ARG1(arg); | 
   f = (LIST)ARG0(arg); v = (LIST)ARG1(arg); | 
|          m = QTOS((Q)ARG2(arg)); | 
   m = QTOS((Q)ARG2(arg)); | 
|          create_order_spec(0,ARG3(arg),&ord); | 
   create_order_spec(0,ARG3(arg),&ord); | 
|          tlist = (LIST)ARG4(arg); | 
   tlist = (LIST)ARG4(arg); | 
|          if ( (ac = argc(arg)) == 6 ) { | 
   if ( (ac = argc(arg)) == 6 ) { | 
|                  asir_assert(ARG5(arg),O_N,"nd_btog"); | 
     asir_assert(ARG5(arg),O_N,"nd_btog"); | 
|                  pos = QTOS((Q)ARG5(arg)); | 
     pos = QTOS((Q)ARG5(arg)); | 
|                  *rp = nd_btog_one(f,v,m,ord,tlist,pos); | 
     *rp = nd_btog_one(f,v,m,ord,tlist,pos); | 
|          } else if ( ac == 5 ) | 
   } else if ( ac == 5 ) | 
|                  *rp = nd_btog(f,v,m,ord,tlist); | 
     *rp = nd_btog(f,v,m,ord,tlist); | 
|          else | 
   else | 
|                  error("nd_btog : argument mismatch"); | 
     error("nd_btog : argument mismatch"); | 
|  } | 
 } | 
|   | 
  | 
|  void Pnd_weyl_gr_postproc(NODE arg,LIST *rp) | 
 void Pnd_weyl_gr_postproc(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          LIST f,v; | 
   LIST f,v; | 
|          int m,do_check; | 
   int m,do_check; | 
|          struct order_spec *ord; | 
   struct order_spec *ord; | 
|   | 
  | 
|          do_weyl = 1; | 
   do_weyl = 1; | 
|          asir_assert(ARG0(arg),O_LIST,"nd_gr"); | 
   asir_assert(ARG0(arg),O_LIST,"nd_gr"); | 
|          asir_assert(ARG1(arg),O_LIST,"nd_gr"); | 
   asir_assert(ARG1(arg),O_LIST,"nd_gr"); | 
|          asir_assert(ARG2(arg),O_N,"nd_gr"); | 
   asir_assert(ARG2(arg),O_N,"nd_gr"); | 
|          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; do_weyl = 0; 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); | 
|          do_check = ARG4(arg) ? 1 : 0; | 
   do_check = ARG4(arg) ? 1 : 0; | 
|          nd_gr_postproc(f,v,m,ord,do_check,rp); | 
   nd_gr_postproc(f,v,m,ord,do_check,rp); | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|  } | 
 } | 
|   | 
  | 
|  void Pnd_gr_trace(NODE arg,LIST *rp) | 
 void Pnd_gr_trace(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          LIST f,v; | 
   LIST f,v; | 
|          int m,homo,ac; | 
   int m,homo,ac; | 
|    Num nhomo; | 
   Num nhomo; | 
|          struct order_spec *ord; | 
   struct order_spec *ord; | 
|   | 
  | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|    if ( (ac = argc(arg)) == 5 ) { | 
   if ( (ac = argc(arg)) == 5 ) { | 
|            asir_assert(ARG0(arg),O_LIST,"nd_gr_trace"); | 
     asir_assert(ARG0(arg),O_LIST,"nd_gr_trace"); | 
|            asir_assert(ARG1(arg),O_LIST,"nd_gr_trace"); | 
     asir_assert(ARG1(arg),O_LIST,"nd_gr_trace"); | 
|            asir_assert(ARG2(arg),O_N,"nd_gr_trace"); | 
     asir_assert(ARG2(arg),O_N,"nd_gr_trace"); | 
|            asir_assert(ARG3(arg),O_N,"nd_gr_trace"); | 
     asir_assert(ARG3(arg),O_N,"nd_gr_trace"); | 
|            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; 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); | 
|    } else if ( ac == 1 ) { | 
   } else if ( ac == 1 ) { | 
|            f = (LIST)ARG0(arg); | 
     f = (LIST)ARG0(arg); | 
|                  parse_gr_option(f,current_option,&v,&nhomo,&m,&ord); | 
     parse_gr_option(f,current_option,&v,&nhomo,&m,&ord); | 
|      homo = QTOS((Q)nhomo); | 
     homo = QTOS((Q)nhomo); | 
|    } else | 
   } else | 
|      error("nd_gr_trace : invalid argument"); | 
     error("nd_gr_trace : invalid argument"); | 
|          nd_gr_trace(f,v,m,homo,0,ord,rp); | 
   nd_gr_trace(f,v,m,homo,0,ord,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pnd_f4_trace(NODE arg,LIST *rp) | 
 void Pnd_f4_trace(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          LIST f,v; | 
   LIST f,v; | 
|          int m,homo,ac; | 
   int m,homo,ac; | 
|    Num nhomo; | 
   Num nhomo; | 
|          struct order_spec *ord; | 
   struct order_spec *ord; | 
|   | 
  | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|    if ( (ac = argc(arg))==5 ) { | 
   if ( (ac = argc(arg))==5 ) { | 
|            asir_assert(ARG0(arg),O_LIST,"nd_f4_trace"); | 
     asir_assert(ARG0(arg),O_LIST,"nd_f4_trace"); | 
|            asir_assert(ARG1(arg),O_LIST,"nd_f4_trace"); | 
     asir_assert(ARG1(arg),O_LIST,"nd_f4_trace"); | 
|            asir_assert(ARG2(arg),O_N,"nd_f4_trace"); | 
     asir_assert(ARG2(arg),O_N,"nd_f4_trace"); | 
|            asir_assert(ARG3(arg),O_N,"nd_f4_trace"); | 
     asir_assert(ARG3(arg),O_N,"nd_f4_trace"); | 
|            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; 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); | 
|    } else if ( ac == 1 ) { | 
   } else if ( ac == 1 ) { | 
|            f = (LIST)ARG0(arg); | 
     f = (LIST)ARG0(arg); | 
|                  parse_gr_option(f,current_option,&v,&nhomo,&m,&ord); | 
     parse_gr_option(f,current_option,&v,&nhomo,&m,&ord); | 
|      homo = QTOS((Q)nhomo); | 
     homo = QTOS((Q)nhomo); | 
|    } else | 
   } else | 
|      error("nd_gr_trace : invalid argument"); | 
     error("nd_gr_trace : invalid argument"); | 
|          nd_gr_trace(f,v,m,homo,1,ord,rp); | 
   nd_gr_trace(f,v,m,homo,1,ord,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pnd_weyl_gr(NODE arg,LIST *rp) | 
 void Pnd_weyl_gr(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          LIST f,v; | 
   LIST f,v; | 
|          int m,homo,retdp,ac; | 
   int m,homo,retdp,ac; | 
|          Obj val; | 
   Obj val; | 
|    Num nhomo; | 
   Num nhomo; | 
|          struct order_spec *ord; | 
   struct order_spec *ord; | 
|   | 
  | 
|          do_weyl = 1; | 
   do_weyl = 1; | 
|    retdp = 0; | 
   retdp = 0; | 
|    if ( (ac = argc(arg)) == 4 ) { | 
   if ( (ac = argc(arg)) == 4 ) { | 
|            asir_assert(ARG0(arg),O_LIST,"nd_weyl_gr"); | 
     asir_assert(ARG0(arg),O_LIST,"nd_weyl_gr"); | 
|            asir_assert(ARG1(arg),O_LIST,"nd_weyl_gr"); | 
     asir_assert(ARG1(arg),O_LIST,"nd_weyl_gr"); | 
|            asir_assert(ARG2(arg),O_N,"nd_weyl_gr"); | 
     asir_assert(ARG2(arg),O_N,"nd_weyl_gr"); | 
|            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; do_weyl = 0; 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); | 
|            homo = 0; | 
     homo = 0; | 
|            if ( get_opt("homo",&val) && val ) homo = 1; | 
     if ( get_opt("homo",&val) && val ) homo = 1; | 
|            if ( get_opt("dp",&val) && val ) retdp = 1; | 
     if ( get_opt("dp",&val) && val ) retdp = 1; | 
|    } else if ( ac == 1 ) { | 
   } else if ( ac == 1 ) { | 
|            f = (LIST)ARG0(arg); | 
     f = (LIST)ARG0(arg); | 
|                  parse_gr_option(f,current_option,&v,&nhomo,&m,&ord); | 
     parse_gr_option(f,current_option,&v,&nhomo,&m,&ord); | 
|      homo = QTOS((Q)nhomo); | 
     homo = QTOS((Q)nhomo); | 
|            if ( get_opt("dp",&val) && val ) retdp = 1; | 
     if ( get_opt("dp",&val) && val ) retdp = 1; | 
|    } else | 
   } else | 
|      error("nd_weyl_gr : invalid argument"); | 
     error("nd_weyl_gr : invalid argument"); | 
|          nd_gr(f,v,m,homo,retdp,0,ord,rp); | 
   nd_gr(f,v,m,homo,retdp,0,ord,rp); | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|  } | 
 } | 
|   | 
  | 
|  void Pnd_weyl_gr_trace(NODE arg,LIST *rp) | 
 void Pnd_weyl_gr_trace(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          LIST f,v; | 
   LIST f,v; | 
|          int m,homo,ac; | 
   int m,homo,ac; | 
|    Num nhomo; | 
   Num nhomo; | 
|          struct order_spec *ord; | 
   struct order_spec *ord; | 
|   | 
  | 
|          do_weyl = 1; | 
   do_weyl = 1; | 
|    if ( (ac = argc(arg)) == 5 ) { | 
   if ( (ac = argc(arg)) == 5 ) { | 
|            asir_assert(ARG0(arg),O_LIST,"nd_weyl_gr_trace"); | 
     asir_assert(ARG0(arg),O_LIST,"nd_weyl_gr_trace"); | 
|            asir_assert(ARG1(arg),O_LIST,"nd_weyl_gr_trace"); | 
     asir_assert(ARG1(arg),O_LIST,"nd_weyl_gr_trace"); | 
|            asir_assert(ARG2(arg),O_N,"nd_weyl_gr_trace"); | 
     asir_assert(ARG2(arg),O_N,"nd_weyl_gr_trace"); | 
|            asir_assert(ARG3(arg),O_N,"nd_weyl_gr_trace"); | 
     asir_assert(ARG3(arg),O_N,"nd_weyl_gr_trace"); | 
|            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; do_weyl = 0; 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); | 
|    } else if ( ac == 1 ) { | 
   } else if ( ac == 1 ) { | 
|            f = (LIST)ARG0(arg); | 
     f = (LIST)ARG0(arg); | 
|                  parse_gr_option(f,current_option,&v,&nhomo,&m,&ord); | 
     parse_gr_option(f,current_option,&v,&nhomo,&m,&ord); | 
|      homo = QTOS((Q)nhomo); | 
     homo = QTOS((Q)nhomo); | 
|    } else | 
   } else | 
|      error("nd_weyl_gr_trace : invalid argument"); | 
     error("nd_weyl_gr_trace : invalid argument"); | 
|          nd_gr_trace(f,v,m,homo,0,ord,rp); | 
   nd_gr_trace(f,v,m,homo,0,ord,rp); | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|  } | 
 } | 
|   | 
  | 
|  void Pnd_nf(NODE arg,Obj *rp) | 
 void Pnd_nf(NODE arg,Obj *rp) | 
|  { | 
 { | 
|          Obj f; | 
   Obj f; | 
|          LIST g,v; | 
   LIST g,v; | 
|          struct order_spec *ord; | 
   struct order_spec *ord; | 
|   | 
  | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|          asir_assert(ARG1(arg),O_LIST,"nd_nf"); | 
   asir_assert(ARG1(arg),O_LIST,"nd_nf"); | 
|          asir_assert(ARG2(arg),O_LIST,"nd_nf"); | 
   asir_assert(ARG2(arg),O_LIST,"nd_nf"); | 
|          asir_assert(ARG4(arg),O_N,"nd_nf"); | 
   asir_assert(ARG4(arg),O_N,"nd_nf"); | 
|          f = (Obj)ARG0(arg); | 
   f = (Obj)ARG0(arg); | 
|          g = (LIST)ARG1(arg); g = remove_zero_from_list(g); | 
   g = (LIST)ARG1(arg); g = remove_zero_from_list(g); | 
|          if ( !BDY(g) ) { | 
   if ( !BDY(g) ) { | 
|                  *rp = f; return; | 
     *rp = f; return; | 
|          } | 
   } | 
|          v = (LIST)ARG2(arg); | 
   v = (LIST)ARG2(arg); | 
|          create_order_spec(0,ARG3(arg),&ord); | 
   create_order_spec(0,ARG3(arg),&ord); | 
|          nd_nf_p(f,g,v,QTOS((Q)ARG4(arg)),ord,rp); | 
   nd_nf_p(f,g,v,QTOS((Q)ARG4(arg)),ord,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pnd_weyl_nf(NODE arg,Obj *rp) | 
 void Pnd_weyl_nf(NODE arg,Obj *rp) | 
|  { | 
 { | 
|          Obj f; | 
   Obj f; | 
|          LIST g,v; | 
   LIST g,v; | 
|          struct order_spec *ord; | 
   struct order_spec *ord; | 
|   | 
  | 
|          do_weyl = 1; | 
   do_weyl = 1; | 
|          asir_assert(ARG1(arg),O_LIST,"nd_weyl_nf"); | 
   asir_assert(ARG1(arg),O_LIST,"nd_weyl_nf"); | 
|          asir_assert(ARG2(arg),O_LIST,"nd_weyl_nf"); | 
   asir_assert(ARG2(arg),O_LIST,"nd_weyl_nf"); | 
|          asir_assert(ARG4(arg),O_N,"nd_weyl_nf"); | 
   asir_assert(ARG4(arg),O_N,"nd_weyl_nf"); | 
|          f = (Obj)ARG0(arg); | 
   f = (Obj)ARG0(arg); | 
|          g = (LIST)ARG1(arg); g = remove_zero_from_list(g); | 
   g = (LIST)ARG1(arg); g = remove_zero_from_list(g); | 
|          if ( !BDY(g) ) { | 
   if ( !BDY(g) ) { | 
|                  *rp = f; return; | 
     *rp = f; return; | 
|          } | 
   } | 
|          v = (LIST)ARG2(arg); | 
   v = (LIST)ARG2(arg); | 
|          create_order_spec(0,ARG3(arg),&ord); | 
   create_order_spec(0,ARG3(arg),&ord); | 
|          nd_nf_p(f,g,v,QTOS((Q)ARG4(arg)),ord,rp); | 
   nd_nf_p(f,g,v,QTOS((Q)ARG4(arg)),ord,rp); | 
|  } | 
 } | 
|   | 
  | 
|  /* for Weyl algebra */ | 
 /* for Weyl algebra */ | 
|   | 
  | 
|  void Pdp_weyl_gr_main(NODE arg,LIST *rp) | 
 void Pdp_weyl_gr_main(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          LIST f,v; | 
   LIST f,v; | 
|          Num homo; | 
   Num homo; | 
|          Q m; | 
   Q m; | 
|          int modular,ac; | 
   int modular,ac; | 
|          struct order_spec *ord; | 
   struct order_spec *ord; | 
|   | 
  | 
|   | 
  | 
|          asir_assert(ARG0(arg),O_LIST,"dp_weyl_gr_main"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_weyl_gr_main"); | 
|          f = (LIST)ARG0(arg); | 
   f = (LIST)ARG0(arg); | 
|          f = remove_zero_from_list(f); | 
   f = remove_zero_from_list(f); | 
|          if ( !BDY(f) ) { | 
   if ( !BDY(f) ) { | 
|                  *rp = f; return; | 
     *rp = f; return; | 
|          } | 
   } | 
|          if ( (ac = argc(arg)) == 5 ) { | 
   if ( (ac = argc(arg)) == 5 ) { | 
|                  asir_assert(ARG1(arg),O_LIST,"dp_weyl_gr_main"); | 
     asir_assert(ARG1(arg),O_LIST,"dp_weyl_gr_main"); | 
|                  asir_assert(ARG2(arg),O_N,"dp_weyl_gr_main"); | 
     asir_assert(ARG2(arg),O_N,"dp_weyl_gr_main"); | 
|                  asir_assert(ARG3(arg),O_N,"dp_weyl_gr_main"); | 
     asir_assert(ARG3(arg),O_N,"dp_weyl_gr_main"); | 
|                  v = (LIST)ARG1(arg); | 
     v = (LIST)ARG1(arg); | 
|                  homo = (Num)ARG2(arg); | 
     homo = (Num)ARG2(arg); | 
|                  m = (Q)ARG3(arg); | 
     m = (Q)ARG3(arg); | 
|                  if ( !m ) | 
     if ( !m ) | 
|                          modular = 0; | 
       modular = 0; | 
|                  else if ( PL(NM(m))>1 || (PL(NM(m)) == 1 && BD(NM(m))[0] >= 0x80000000) ) | 
     else if ( PL(NM(m))>1 || (PL(NM(m)) == 1 && BD(NM(m))[0] >= 0x80000000) ) | 
|                          error("dp_weyl_gr_main : too large modulus"); | 
       error("dp_weyl_gr_main : too large modulus"); | 
|                  else | 
     else | 
|                          modular = QTOS(m); | 
       modular = QTOS(m); | 
|                  create_order_spec(0,ARG4(arg),&ord); | 
     create_order_spec(0,ARG4(arg),&ord); | 
|          } else if ( current_option ) | 
   } else if ( current_option ) | 
|                  parse_gr_option(f,current_option,&v,&homo,&modular,&ord); | 
     parse_gr_option(f,current_option,&v,&homo,&modular,&ord); | 
|          else if ( ac == 1 ) | 
   else if ( ac == 1 ) | 
|                  parse_gr_option(f,0,&v,&homo,&modular,&ord); | 
     parse_gr_option(f,0,&v,&homo,&modular,&ord); | 
|          else | 
   else | 
|                  error("dp_weyl_gr_main : invalid argument"); | 
     error("dp_weyl_gr_main : invalid argument"); | 
|          do_weyl = 1; | 
   do_weyl = 1; | 
|          dp_gr_main(f,v,homo,modular,0,ord,rp); | 
   dp_gr_main(f,v,homo,modular,0,ord,rp); | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_weyl_gr_f_main(NODE arg,LIST *rp) | 
 void Pdp_weyl_gr_f_main(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          LIST f,v; | 
   LIST f,v; | 
|          Num homo; | 
   Num homo; | 
|          struct order_spec *ord; | 
   struct order_spec *ord; | 
|   | 
  | 
|          asir_assert(ARG0(arg),O_LIST,"dp_weyl_gr_main"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_weyl_gr_main"); | 
|          asir_assert(ARG1(arg),O_LIST,"dp_weyl_gr_main"); | 
   asir_assert(ARG1(arg),O_LIST,"dp_weyl_gr_main"); | 
|          asir_assert(ARG2(arg),O_N,"dp_weyl_gr_main"); | 
   asir_assert(ARG2(arg),O_N,"dp_weyl_gr_main"); | 
|          asir_assert(ARG3(arg),O_N,"dp_weyl_gr_main"); | 
   asir_assert(ARG3(arg),O_N,"dp_weyl_gr_main"); | 
|          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; return; | 
|          } | 
   } | 
|          homo = (Num)ARG2(arg); | 
   homo = (Num)ARG2(arg); | 
|          create_order_spec(0,ARG3(arg),&ord); | 
   create_order_spec(0,ARG3(arg),&ord); | 
|          do_weyl = 1; | 
   do_weyl = 1; | 
|          dp_gr_main(f,v,homo,0,1,ord,rp); | 
   dp_gr_main(f,v,homo,0,1,ord,rp); | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_weyl_f4_main(NODE arg,LIST *rp) | 
 void Pdp_weyl_f4_main(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          LIST f,v; | 
   LIST f,v; | 
|          struct order_spec *ord; | 
   struct order_spec *ord; | 
|   | 
  | 
|          asir_assert(ARG0(arg),O_LIST,"dp_weyl_f4_main"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_weyl_f4_main"); | 
|          asir_assert(ARG1(arg),O_LIST,"dp_weyl_f4_main"); | 
   asir_assert(ARG1(arg),O_LIST,"dp_weyl_f4_main"); | 
|          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; return; | 
|          } | 
   } | 
|          create_order_spec(0,ARG2(arg),&ord); | 
   create_order_spec(0,ARG2(arg),&ord); | 
|          do_weyl = 1; | 
   do_weyl = 1; | 
|          dp_f4_main(f,v,ord,rp); | 
   dp_f4_main(f,v,ord,rp); | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_weyl_f4_mod_main(NODE arg,LIST *rp) | 
 void Pdp_weyl_f4_mod_main(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          LIST f,v; | 
   LIST f,v; | 
|          int m; | 
   int m; | 
|          struct order_spec *ord; | 
   struct order_spec *ord; | 
|   | 
  | 
|          asir_assert(ARG0(arg),O_LIST,"dp_weyl_f4_main"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_weyl_f4_main"); | 
|          asir_assert(ARG1(arg),O_LIST,"dp_weyl_f4_main"); | 
   asir_assert(ARG1(arg),O_LIST,"dp_weyl_f4_main"); | 
|          asir_assert(ARG2(arg),O_N,"dp_f4_main"); | 
   asir_assert(ARG2(arg),O_N,"dp_f4_main"); | 
|          f = (LIST)ARG0(arg); v = (LIST)ARG1(arg); m = QTOS((Q)ARG2(arg)); | 
   f = (LIST)ARG0(arg); v = (LIST)ARG1(arg); m = QTOS((Q)ARG2(arg)); | 
|          f = remove_zero_from_list(f); | 
   f = remove_zero_from_list(f); | 
|          if ( !BDY(f) ) { | 
   if ( !BDY(f) ) { | 
|                  *rp = f; return; | 
     *rp = f; return; | 
|          } | 
   } | 
|          if ( !m ) | 
   if ( !m ) | 
|                  error("dp_weyl_f4_mod_main : invalid argument"); | 
     error("dp_weyl_f4_mod_main : invalid argument"); | 
|          create_order_spec(0,ARG3(arg),&ord); | 
   create_order_spec(0,ARG3(arg),&ord); | 
|          do_weyl = 1; | 
   do_weyl = 1; | 
|          dp_f4_mod_main(f,v,m,ord,rp); | 
   dp_f4_mod_main(f,v,m,ord,rp); | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_weyl_gr_mod_main(NODE arg,LIST *rp) | 
 void Pdp_weyl_gr_mod_main(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          LIST f,v; | 
   LIST f,v; | 
|          Num homo; | 
   Num homo; | 
|          int m; | 
   int m; | 
|          struct order_spec *ord; | 
   struct order_spec *ord; | 
|   | 
  | 
|          asir_assert(ARG0(arg),O_LIST,"dp_weyl_gr_mod_main"); | 
   asir_assert(ARG0(arg),O_LIST,"dp_weyl_gr_mod_main"); | 
|          asir_assert(ARG1(arg),O_LIST,"dp_weyl_gr_mod_main"); | 
   asir_assert(ARG1(arg),O_LIST,"dp_weyl_gr_mod_main"); | 
|          asir_assert(ARG2(arg),O_N,"dp_weyl_gr_mod_main"); | 
   asir_assert(ARG2(arg),O_N,"dp_weyl_gr_mod_main"); | 
|          asir_assert(ARG3(arg),O_N,"dp_weyl_gr_mod_main"); | 
   asir_assert(ARG3(arg),O_N,"dp_weyl_gr_mod_main"); | 
|          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; return; | 
|          } | 
   } | 
|          homo = (Num)ARG2(arg); m = QTOS((Q)ARG3(arg)); | 
   homo = (Num)ARG2(arg); m = QTOS((Q)ARG3(arg)); | 
|          if ( !m ) | 
   if ( !m ) | 
|                  error("dp_weyl_gr_mod_main : invalid argument"); | 
     error("dp_weyl_gr_mod_main : invalid argument"); | 
|          create_order_spec(0,ARG4(arg),&ord); | 
   create_order_spec(0,ARG4(arg),&ord); | 
|          do_weyl = 1; | 
   do_weyl = 1; | 
|          dp_gr_mod_main(f,v,homo,m,ord,rp); | 
   dp_gr_mod_main(f,v,homo,m,ord,rp); | 
|          do_weyl = 0; | 
   do_weyl = 0; | 
|  } | 
 } | 
|   | 
  | 
|  VECT current_dl_weight_vector_obj; | 
 VECT current_dl_weight_vector_obj; | 
| Line 2782  int dp_negative_weight; | 
 
  | 
| Line 2782  int dp_negative_weight; | 
 
 
 | 
|   | 
  | 
|  void Pdp_set_weight(NODE arg,VECT *rp) | 
 void Pdp_set_weight(NODE arg,VECT *rp) | 
|  { | 
 { | 
|          VECT v; | 
   VECT v; | 
|          int i,n; | 
   int i,n; | 
|          NODE node; | 
   NODE node; | 
|   | 
  | 
|          if ( !arg ) | 
   if ( !arg ) | 
|                  *rp = current_dl_weight_vector_obj; | 
     *rp = current_dl_weight_vector_obj; | 
|          else if ( !ARG0(arg) ) { | 
   else if ( !ARG0(arg) ) { | 
|                  current_dl_weight_vector_obj = 0; | 
     current_dl_weight_vector_obj = 0; | 
|                  current_dl_weight_vector = 0; | 
     current_dl_weight_vector = 0; | 
|          dp_negative_weight = 0; | 
         dp_negative_weight = 0; | 
|                  *rp = 0; | 
     *rp = 0; | 
|          } else { | 
   } else { | 
|                  if ( OID(ARG0(arg)) != O_VECT && OID(ARG0(arg)) != O_LIST ) | 
     if ( OID(ARG0(arg)) != O_VECT && OID(ARG0(arg)) != O_LIST ) | 
|                          error("dp_set_weight : invalid argument"); | 
       error("dp_set_weight : invalid argument"); | 
|                  if ( OID(ARG0(arg)) == O_VECT ) | 
     if ( OID(ARG0(arg)) == O_VECT ) | 
|                          v = (VECT)ARG0(arg); | 
       v = (VECT)ARG0(arg); | 
|                  else { | 
     else { | 
|                          node = (NODE)BDY((LIST)ARG0(arg)); | 
       node = (NODE)BDY((LIST)ARG0(arg)); | 
|                          n = length(node); | 
       n = length(node); | 
|                          MKVECT(v,n); | 
       MKVECT(v,n); | 
|                          for ( i = 0; i < n; i++, node = NEXT(node) ) | 
       for ( i = 0; i < n; i++, node = NEXT(node) ) | 
|                                  BDY(v)[i] = BDY(node); | 
         BDY(v)[i] = BDY(node); | 
|                  } | 
     } | 
|                  current_dl_weight_vector_obj = v; | 
     current_dl_weight_vector_obj = v; | 
|                  n = v->len; | 
     n = v->len; | 
|                  current_dl_weight_vector = (int *)CALLOC(n,sizeof(int)); | 
     current_dl_weight_vector = (int *)CALLOC(n,sizeof(int)); | 
|                  for ( i = 0; i < n; i++ ) | 
     for ( i = 0; i < n; i++ ) | 
|                          current_dl_weight_vector[i] = QTOS((Q)v->body[i]); | 
       current_dl_weight_vector[i] = QTOS((Q)v->body[i]); | 
|          for ( i = 0; i < n; i++ ) | 
         for ( i = 0; i < n; i++ ) | 
|              if ( current_dl_weight_vector[i] < 0 ) break; | 
             if ( current_dl_weight_vector[i] < 0 ) break; | 
|          if ( i < n ) | 
         if ( i < n ) | 
|              dp_negative_weight = 1; | 
             dp_negative_weight = 1; | 
|          else | 
         else | 
|              dp_negative_weight = 0; | 
             dp_negative_weight = 0; | 
|                  *rp = v; | 
     *rp = v; | 
|          } | 
   } | 
|  } | 
 } | 
|   | 
  | 
|  VECT current_module_weight_vector_obj; | 
 VECT current_module_weight_vector_obj; | 
| Line 2825  int *current_module_weight_vector; | 
 
  | 
| Line 2825  int *current_module_weight_vector; | 
 
 
 | 
|   | 
  | 
|  void Pdp_set_module_weight(NODE arg,VECT *rp) | 
 void Pdp_set_module_weight(NODE arg,VECT *rp) | 
|  { | 
 { | 
|          VECT v; | 
   VECT v; | 
|          int i,n; | 
   int i,n; | 
|          NODE node; | 
   NODE node; | 
|   | 
  | 
|          if ( !arg ) | 
   if ( !arg ) | 
|                  *rp = current_module_weight_vector_obj; | 
     *rp = current_module_weight_vector_obj; | 
|          else if ( !ARG0(arg) ) { | 
   else if ( !ARG0(arg) ) { | 
|                  current_module_weight_vector_obj = 0; | 
     current_module_weight_vector_obj = 0; | 
|                  current_module_weight_vector = 0; | 
     current_module_weight_vector = 0; | 
|                  *rp = 0; | 
     *rp = 0; | 
|          } else { | 
   } else { | 
|                  if ( OID(ARG0(arg)) != O_VECT && OID(ARG0(arg)) != O_LIST ) | 
     if ( OID(ARG0(arg)) != O_VECT && OID(ARG0(arg)) != O_LIST ) | 
|                          error("dp_module_set_weight : invalid argument"); | 
       error("dp_module_set_weight : invalid argument"); | 
|                  if ( OID(ARG0(arg)) == O_VECT ) | 
     if ( OID(ARG0(arg)) == O_VECT ) | 
|                          v = (VECT)ARG0(arg); | 
       v = (VECT)ARG0(arg); | 
|                  else { | 
     else { | 
|                          node = (NODE)BDY((LIST)ARG0(arg)); | 
       node = (NODE)BDY((LIST)ARG0(arg)); | 
|                          n = length(node); | 
       n = length(node); | 
|                          MKVECT(v,n); | 
       MKVECT(v,n); | 
|                          for ( i = 0; i < n; i++, node = NEXT(node) ) | 
       for ( i = 0; i < n; i++, node = NEXT(node) ) | 
|                                  BDY(v)[i] = BDY(node); | 
         BDY(v)[i] = BDY(node); | 
|                  } | 
     } | 
|                  current_module_weight_vector_obj = v; | 
     current_module_weight_vector_obj = v; | 
|                  n = v->len; | 
     n = v->len; | 
|                  current_module_weight_vector = (int *)CALLOC(n,sizeof(int)); | 
     current_module_weight_vector = (int *)CALLOC(n,sizeof(int)); | 
|                  for ( i = 0; i < n; i++ ) | 
     for ( i = 0; i < n; i++ ) | 
|                          current_module_weight_vector[i] = QTOS((Q)v->body[i]); | 
       current_module_weight_vector[i] = QTOS((Q)v->body[i]); | 
|                  *rp = v; | 
     *rp = v; | 
|          } | 
   } | 
|  } | 
 } | 
|   | 
  | 
|  extern Obj current_top_weight; | 
 extern Obj current_top_weight; | 
| Line 2861  extern Obj nd_top_weight; | 
 
  | 
| Line 2861  extern Obj nd_top_weight; | 
 
 
 | 
|   | 
  | 
|  void Pdp_set_top_weight(NODE arg,Obj *rp) | 
 void Pdp_set_top_weight(NODE arg,Obj *rp) | 
|  { | 
 { | 
|          VECT v; | 
   VECT v; | 
|          MAT m; | 
   MAT m; | 
|          Obj obj; | 
   Obj obj; | 
|          int i,j,n,id,row,col; | 
   int i,j,n,id,row,col; | 
|          Q *mi; | 
   Q *mi; | 
|          NODE node; | 
   NODE node; | 
|   | 
  | 
|          if ( !arg ) | 
   if ( !arg ) | 
|                  *rp = current_top_weight; | 
     *rp = current_top_weight; | 
|          else if ( !ARG0(arg) ) { | 
   else if ( !ARG0(arg) ) { | 
|                  reset_top_weight(); | 
     reset_top_weight(); | 
|                  *rp = 0; | 
     *rp = 0; | 
|          } else { | 
   } else { | 
|                  id = OID(ARG0(arg)); | 
     id = OID(ARG0(arg)); | 
|                  if ( id != O_VECT && id != O_MAT && id != O_LIST ) | 
     if ( id != O_VECT && id != O_MAT && id != O_LIST ) | 
|                          error("dp_set_top_weight : invalid argument"); | 
       error("dp_set_top_weight : invalid argument"); | 
|                  if ( id == O_LIST ) { | 
     if ( id == O_LIST ) { | 
|                          node = (NODE)BDY((LIST)ARG0(arg)); | 
       node = (NODE)BDY((LIST)ARG0(arg)); | 
|                          n = length(node); | 
       n = length(node); | 
|                          MKVECT(v,n); | 
       MKVECT(v,n); | 
|                          for ( i = 0; i < n; i++, node = NEXT(node) ) | 
       for ( i = 0; i < n; i++, node = NEXT(node) ) | 
|                                  BDY(v)[i] = BDY(node); | 
         BDY(v)[i] = BDY(node); | 
|                      obj = (Obj)v; | 
         obj = (Obj)v; | 
|                  } else | 
     } else | 
|                      obj = ARG0(arg); | 
         obj = ARG0(arg); | 
|                  if ( OID(obj) == O_VECT ) { | 
     if ( OID(obj) == O_VECT ) { | 
|                          v = (VECT)obj; | 
       v = (VECT)obj; | 
|                      for ( i = 0; i < v->len; i++ ) | 
         for ( i = 0; i < v->len; i++ ) | 
|                              if ( !INT(BDY(v)[i]) || (BDY(v)[i] && SGN((Q)BDY(v)[i]) < 0) ) | 
           if ( !INT(BDY(v)[i]) || (BDY(v)[i] && SGN((Q)BDY(v)[i]) < 0) ) | 
|                                      error("dp_set_top_weight : each element must be a non-negative integer"); | 
             error("dp_set_top_weight : each element must be a non-negative integer"); | 
|                  } else { | 
     } else { | 
|                          m = (MAT)obj; row = m->row; col = m->col; | 
       m = (MAT)obj; row = m->row; col = m->col; | 
|                      for ( i = 0; i < row; i++ ) | 
         for ( i = 0; i < row; i++ ) | 
|                                  for ( j = 0, mi = (Q *)BDY(m)[i]; j < col; j++ ) | 
         for ( j = 0, mi = (Q *)BDY(m)[i]; j < col; j++ ) | 
|                                  if ( !INT(mi[j]) || (mi[j] && SGN((Q)mi[j]) < 0) ) | 
               if ( !INT(mi[j]) || (mi[j] && SGN((Q)mi[j]) < 0) ) | 
|                                          error("dp_set_top_weight : each element must be a non-negative integer"); | 
                 error("dp_set_top_weight : each element must be a non-negative integer"); | 
|                  } | 
     } | 
|          current_top_weight = obj; | 
         current_top_weight = obj; | 
|                  nd_top_weight = obj; | 
     nd_top_weight = obj; | 
|                  *rp = current_top_weight; | 
     *rp = current_top_weight; | 
|          } | 
   } | 
|  } | 
 } | 
|   | 
  | 
|  LIST get_denomlist(); | 
 LIST get_denomlist(); | 
|   | 
  | 
|  void Pdp_get_denomlist(LIST *rp) | 
 void Pdp_get_denomlist(LIST *rp) | 
|  { | 
 { | 
|          *rp = get_denomlist(); | 
   *rp = get_denomlist(); | 
|  } | 
 } | 
|   | 
  | 
|  static VECT current_weyl_weight_vector_obj; | 
 static VECT current_weyl_weight_vector_obj; | 
| Line 2916  int *current_weyl_weight_vector; | 
 
  | 
| Line 2916  int *current_weyl_weight_vector; | 
 
 
 | 
|   | 
  | 
|  void Pdp_weyl_set_weight(NODE arg,VECT *rp) | 
 void Pdp_weyl_set_weight(NODE arg,VECT *rp) | 
|  { | 
 { | 
|          VECT v; | 
   VECT v; | 
|          NODE node; | 
   NODE node; | 
|          int i,n; | 
   int i,n; | 
|   | 
  | 
|          if ( !arg ) | 
   if ( !arg ) | 
|                  *rp = current_weyl_weight_vector_obj; | 
     *rp = current_weyl_weight_vector_obj; | 
|          else if ( !ARG0(arg) ) { | 
   else if ( !ARG0(arg) ) { | 
|                  current_weyl_weight_vector_obj = 0; | 
     current_weyl_weight_vector_obj = 0; | 
|                  current_weyl_weight_vector = 0; | 
     current_weyl_weight_vector = 0; | 
|                  *rp = 0; | 
     *rp = 0; | 
|          } else { | 
   } else { | 
|                  if ( OID(ARG0(arg)) != O_VECT && OID(ARG0(arg)) != O_LIST ) | 
     if ( OID(ARG0(arg)) != O_VECT && OID(ARG0(arg)) != O_LIST ) | 
|                          error("dp_weyl_set_weight : invalid argument"); | 
       error("dp_weyl_set_weight : invalid argument"); | 
|                  if ( OID(ARG0(arg)) == O_VECT ) | 
     if ( OID(ARG0(arg)) == O_VECT ) | 
|                          v = (VECT)ARG0(arg); | 
       v = (VECT)ARG0(arg); | 
|                  else { | 
     else { | 
|                          node = (NODE)BDY((LIST)ARG0(arg)); | 
       node = (NODE)BDY((LIST)ARG0(arg)); | 
|                          n = length(node); | 
       n = length(node); | 
|                          MKVECT(v,n); | 
       MKVECT(v,n); | 
|                          for ( i = 0; i < n; i++, node = NEXT(node) ) | 
       for ( i = 0; i < n; i++, node = NEXT(node) ) | 
|                                  BDY(v)[i] = BDY(node); | 
         BDY(v)[i] = BDY(node); | 
|                  } | 
     } | 
|                  current_weyl_weight_vector_obj = v; | 
     current_weyl_weight_vector_obj = v; | 
|                  n = v->len; | 
     n = v->len; | 
|                  current_weyl_weight_vector = (int *)CALLOC(n,sizeof(int)); | 
     current_weyl_weight_vector = (int *)CALLOC(n,sizeof(int)); | 
|                  for ( i = 0; i < n; i++ ) | 
     for ( i = 0; i < n; i++ ) | 
|                          current_weyl_weight_vector[i] = QTOS((Q)v->body[i]); | 
       current_weyl_weight_vector[i] = QTOS((Q)v->body[i]); | 
|                  *rp = v; | 
     *rp = v; | 
|          } | 
   } | 
|  } | 
 } | 
|   | 
  | 
|  NODE mono_raddec(NODE ideal); | 
 NODE mono_raddec(NODE ideal); | 
|   | 
  | 
|  void Pdp_mono_raddec(NODE arg,LIST *rp) | 
 void Pdp_mono_raddec(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          NODE ideal,rd,t,t1,r,r1,u; | 
   NODE ideal,rd,t,t1,r,r1,u; | 
|          VL vl0,vl; | 
   VL vl0,vl; | 
|          int nv,i,bpi; | 
   int nv,i,bpi; | 
|          int *s; | 
   int *s; | 
|          DP dp; | 
   DP dp; | 
|          P *v; | 
   P *v; | 
|          LIST l; | 
   LIST l; | 
|   | 
  | 
|          ideal = BDY((LIST)ARG0(arg)); | 
   ideal = BDY((LIST)ARG0(arg)); | 
|          if ( !ideal ) *rp = (LIST)ARG0(arg); | 
   if ( !ideal ) *rp = (LIST)ARG0(arg); | 
|          else { | 
   else { | 
|                  t = BDY((LIST)ARG1(arg)); | 
     t = BDY((LIST)ARG1(arg)); | 
|                  nv = length(t); | 
     nv = length(t); | 
|                  v = (P *)MALLOC(nv*sizeof(P)); | 
     v = (P *)MALLOC(nv*sizeof(P)); | 
|                  for ( vl0 = 0, i = 0; t; t = NEXT(t), i++ ) { | 
     for ( vl0 = 0, i = 0; t; t = NEXT(t), i++ ) { | 
|                          NEXTVL(vl0,vl); VR(vl) = VR((P)BDY(t)); | 
       NEXTVL(vl0,vl); VR(vl) = VR((P)BDY(t)); | 
|                          MKV(VR(vl),v[i]); | 
       MKV(VR(vl),v[i]); | 
|                  } | 
     } | 
|                  if ( vl0 ) NEXT(vl) = 0; | 
     if ( vl0 ) NEXT(vl) = 0; | 
|                  for ( t = 0, r = ideal; r; r = NEXT(r) ) { | 
     for ( t = 0, r = ideal; r; r = NEXT(r) ) { | 
|                          ptod(CO,vl0,BDY(r),&dp); MKNODE(t1,dp,t); t = t1; | 
       ptod(CO,vl0,BDY(r),&dp); MKNODE(t1,dp,t); t = t1; | 
|                  } | 
     } | 
|                  rd = mono_raddec(t); | 
     rd = mono_raddec(t); | 
|                  r = 0; | 
     r = 0; | 
|                  bpi = (sizeof(int)/sizeof(char))*8; | 
     bpi = (sizeof(int)/sizeof(char))*8; | 
|                  for ( u = rd; u; u = NEXT(u) ) { | 
     for ( u = rd; u; u = NEXT(u) ) { | 
|                          s = (int *)BDY(u); | 
       s = (int *)BDY(u); | 
|                          for ( i = nv-1, t = 0; i >= 0; i-- ) | 
       for ( i = nv-1, t = 0; i >= 0; i-- ) | 
|                                  if ( s[i/bpi]&(1<<(i%bpi)) ) { | 
         if ( s[i/bpi]&(1<<(i%bpi)) ) { | 
|                                          MKNODE(t1,v[i],t); t = t1; | 
           MKNODE(t1,v[i],t); t = t1; | 
|                                  } | 
         } | 
|                          MKLIST(l,t); MKNODE(r1,l,r); r = r1; | 
       MKLIST(l,t); MKNODE(r1,l,r); r = r1; | 
|                  } | 
     } | 
|                  MKLIST(*rp,r); | 
     MKLIST(*rp,r); | 
|          } | 
   } | 
|  } | 
 } | 
|   | 
  | 
|  void Pdp_mono_reduce(NODE arg,LIST *rp) | 
 void Pdp_mono_reduce(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          NODE t,t0,t1,r0,r; | 
   NODE t,t0,t1,r0,r; | 
|          int i,n; | 
   int i,n; | 
|          DP m; | 
   DP m; | 
|          DP *a; | 
   DP *a; | 
|   | 
  | 
|          t0 = BDY((LIST)ARG0(arg)); | 
   t0 = BDY((LIST)ARG0(arg)); | 
|          t1 = BDY((LIST)ARG1(arg)); | 
   t1 = BDY((LIST)ARG1(arg)); | 
|          n = length(t0); | 
   n = length(t0); | 
|          a = (DP *)MALLOC(n*sizeof(DP)); | 
   a = (DP *)MALLOC(n*sizeof(DP)); | 
|          for ( i = 0; i < n; i++, t0 = NEXT(t0) ) a[i] = (DP)BDY(t0); | 
   for ( i = 0; i < n; i++, t0 = NEXT(t0) ) a[i] = (DP)BDY(t0); | 
|          for ( t = t1; t; t = NEXT(t) ) { | 
   for ( t = t1; t; t = NEXT(t) ) { | 
|                  m = (DP)BDY(t); | 
     m = (DP)BDY(t); | 
|                  for ( i = 0; i < n; i++ ) | 
     for ( i = 0; i < n; i++ ) | 
|                          if ( a[i] && dp_redble(a[i],m) ) a[i] = 0; | 
       if ( a[i] && dp_redble(a[i],m) ) a[i] = 0; | 
|          } | 
   } | 
|          for ( i = n-1, r0 = 0; i >= 0; i-- ) | 
   for ( i = n-1, r0 = 0; i >= 0; i-- ) | 
|                  if ( a[i] ) { NEXTNODE(r0,r); BDY(r) = a[i]; } | 
     if ( a[i] ) { NEXTNODE(r0,r); BDY(r) = a[i]; } | 
|          if ( r0 ) NEXT(r) = 0; | 
   if ( r0 ) NEXT(r) = 0; | 
|          MKLIST(*rp,r0); | 
   MKLIST(*rp,r0); | 
|  } | 
 } | 
|   | 
  | 
|  #define BLEN (8*sizeof(unsigned long)) | 
 #define BLEN (8*sizeof(unsigned long)) | 
| Line 3019  void showmat2(unsigned long **a,int row,int col) | 
 
  | 
| Line 3019  void showmat2(unsigned long **a,int row,int col) | 
 
 
 | 
|   | 
  | 
|    for ( i = 0; i < row; i++, putchar('\n') ) | 
   for ( i = 0; i < row; i++, putchar('\n') ) | 
|      for ( j = 0; j < col; j++ ) | 
     for ( j = 0; j < col; j++ ) | 
|              if ( a[i][j/BLEN] & (1L<<(j%BLEN)) ) putchar('1'); | 
       if ( a[i][j/BLEN] & (1L<<(j%BLEN)) ) putchar('1'); | 
|        else putchar('0'); | 
       else putchar('0'); | 
|  } | 
 } | 
|   | 
  | 
| Line 3034  int rref2(unsigned long **a,int row,int col) | 
 
  | 
| Line 3034  int rref2(unsigned long **a,int row,int col) | 
 
 
 | 
|    pivot = (int *)MALLOC_ATOMIC(row*sizeof(int)); | 
   pivot = (int *)MALLOC_ATOMIC(row*sizeof(int)); | 
|    i = 0; | 
   i = 0; | 
|    for ( j = 0; j < col; j++ ) { | 
   for ( j = 0; j < col; j++ ) { | 
|            wj = j/BLEN; bj = 1L<<(j%BLEN); | 
     wj = j/BLEN; bj = 1L<<(j%BLEN); | 
|      for ( k = i; k < row; k++ ) | 
     for ( k = i; k < row; k++ ) | 
|            if ( a[k][wj] & bj ) break; | 
       if ( a[k][wj] & bj ) break; | 
|      if ( k == row ) continue; | 
     if ( k == row ) continue; | 
|      pivot[i] = j; | 
     pivot[i] = j; | 
|      if ( k != i ) { | 
     if ( k != i ) { | 
|       t = a[i]; a[i] = a[k]; a[k] = t; | 
      t = a[i]; a[i] = a[k]; a[k] = t; | 
|            } | 
     } | 
|            ai = a[i]; | 
     ai = a[i]; | 
|      for ( k = i+1; k < row; k++ ) { | 
     for ( k = i+1; k < row; k++ ) { | 
|              ak = a[k]; | 
       ak = a[k]; | 
|              if ( ak[wj] & bj ) { | 
       if ( ak[wj] & bj ) { | 
|                for ( l = wj; l < wcol; l++ ) | 
         for ( l = wj; l < wcol; l++ ) | 
|                        ak[l] ^= ai[l]; | 
           ak[l] ^= ai[l]; | 
|              } | 
       } | 
|            } | 
     } | 
|          i++; | 
     i++; | 
|    } | 
   } | 
|    for ( k = i-1; k >= 0; k-- ) { | 
   for ( k = i-1; k >= 0; k-- ) { | 
|      j = pivot[k]; wj = j/BLEN; bj = 1L<<(j%BLEN); | 
     j = pivot[k]; wj = j/BLEN; bj = 1L<<(j%BLEN); | 
|            ak = a[k]; | 
     ak = a[k]; | 
|      for ( s = 0; s < k; s++ ) { | 
     for ( s = 0; s < k; s++ ) { | 
|              as = a[s]; | 
       as = a[s]; | 
|        if ( as[wj] & bj ) { | 
       if ( as[wj] & bj ) { | 
|          for ( l = wj; l < wcol; l++ ) | 
         for ( l = wj; l < wcol; l++ ) | 
|                        as[l] ^= ak[l]; | 
           as[l] ^= ak[l]; | 
|              } | 
       } | 
|            } | 
     } | 
|    } | 
   } | 
|    return i; | 
   return i; | 
|  } | 
 } | 
| Line 3088  void Pdp_rref2(NODE arg,VECT *rp) | 
 
  | 
| Line 3088  void Pdp_rref2(NODE arg,VECT *rp) | 
 
 
 | 
|    for ( i = 0; i < col; i++ ) t[i] = BDY((DP)BDY(term)[i])->dl; | 
   for ( i = 0; i < col; i++ ) t[i] = BDY((DP)BDY(term)[i])->dl; | 
|    for ( i = 0; i < row; i++ ) { | 
   for ( i = 0; i < row; i++ ) { | 
|      v = mat[i] = (unsigned long *)MALLOC_ATOMIC_IGNORE_OFF_PAGE(size); | 
     v = mat[i] = (unsigned long *)MALLOC_ATOMIC_IGNORE_OFF_PAGE(size); | 
|          bzero(v,size); | 
   bzero(v,size); | 
|          for ( j = 0, m = BDY((DP)BDY(f)[i]); m; m = NEXT(m) ) { | 
   for ( j = 0, m = BDY((DP)BDY(f)[i]); m; m = NEXT(m) ) { | 
|            d = m->dl; | 
     d = m->dl; | 
|            for ( ; !dl_equal(nv,d,t[j]); j++ ); | 
     for ( ; !dl_equal(nv,d,t[j]); j++ ); | 
|            v[j/BLEN] |= 1L <<(j%BLEN); | 
     v[j/BLEN] |= 1L <<(j%BLEN); | 
|          } | 
  | 
|    } | 
   } | 
|   | 
   } | 
|    rank = rref2(mat,row,col); | 
   rank = rref2(mat,row,col); | 
|    MKVECT(ret,rank); | 
   MKVECT(ret,rank); | 
|    *rp = ret; | 
   *rp = ret; | 
|    for ( i = 0; i < rank; i++ ) { | 
   for ( i = 0; i < rank; i++ ) { | 
|      v = mat[i]; | 
     v = mat[i]; | 
|          m0 = 0; | 
   m0 = 0; | 
|          td = 0; | 
   td = 0; | 
|      for ( j = 0; j < col; j++ ) { | 
     for ( j = 0; j < col; j++ ) { | 
|            if ( v[j/BLEN] & (1L<<(j%BLEN)) ) { | 
     if ( v[j/BLEN] & (1L<<(j%BLEN)) ) { | 
|              NEXTMP(m0,m); | 
       NEXTMP(m0,m); | 
|                  m->dl = t[j]; | 
     m->dl = t[j]; | 
|                  m->c = (Obj)ONE; | 
     m->c = (Obj)ONE; | 
|              td = MAX(td,m->dl->td); | 
       td = MAX(td,m->dl->td); | 
|            } | 
     } | 
|          } | 
   } | 
|          NEXT(m) = 0; | 
   NEXT(m) = 0; | 
|          MKDP(nv,m0,dp); | 
   MKDP(nv,m0,dp); | 
|          dp->sugar = td; | 
   dp->sugar = td; | 
|      BDY(ret)[i] = (pointer)dp; | 
     BDY(ret)[i] = (pointer)dp; | 
|    } | 
   } | 
|  } | 
 } | 
| Line 3129  NODE sumi_criB(int nv,NODE d,DP *f,int m) | 
 
  | 
| Line 3129  NODE sumi_criB(int nv,NODE d,DP *f,int m) | 
 
 
 | 
|   NEWDL(lcm,nv); | 
  NEWDL(lcm,nv); | 
|   r0 = 0; | 
  r0 = 0; | 
|   for ( ; d; d = NEXT(d) ) { | 
  for ( ; d; d = NEXT(d) ) { | 
|          p = (LIST)BDY(d); | 
   p = (LIST)BDY(d); | 
|          p0 = QTOS((Q)ARG0(BDY(p))); | 
   p0 = QTOS((Q)ARG0(BDY(p))); | 
|          p1 = QTOS((Q)ARG1(BDY(p))); | 
   p1 = QTOS((Q)ARG1(BDY(p))); | 
|          p2 = HDL((DP)ARG2(BDY(p))); | 
   p2 = HDL((DP)ARG2(BDY(p))); | 
|      if(!_dl_redble(HDL((DP)f[m]),p2,nv) || | 
     if(!_dl_redble(HDL((DP)f[m]),p2,nv) || | 
|       dl_equal(nv,lcm_of_DL(nv,HDL(f[p0]),HDL(f[m]),lcm),p2) || | 
      dl_equal(nv,lcm_of_DL(nv,HDL(f[p0]),HDL(f[m]),lcm),p2) || | 
|       dl_equal(nv,lcm_of_DL(nv,HDL(f[p1]),HDL(f[m]),lcm),p2) ) { | 
      dl_equal(nv,lcm_of_DL(nv,HDL(f[p1]),HDL(f[m]),lcm),p2) ) { | 
|            NEXTNODE(r0,r); | 
     NEXTNODE(r0,r); | 
|            BDY(r) = p; | 
     BDY(r) = p; | 
|          } | 
   } | 
|   } | 
  } | 
|   if ( r0 ) NEXT(r) = 0; | 
  if ( r0 ) NEXT(r) = 0; | 
|   return r0; | 
  return r0; | 
| Line 3169  NODE sumi_criFMD(int nv,DP *f,int m) | 
 
  | 
| Line 3169  NODE sumi_criFMD(int nv,DP *f,int m) | 
 
 
 | 
|       if( dl_equal(nv,l1,a[k]) ) break; | 
      if( dl_equal(nv,l1,a[k]) ) break; | 
|     if( k == i ){ | 
    if( k == i ){ | 
|       /* Tk|Tim && Tkm != Tim (k<m) */ | 
      /* Tk|Tim && Tkm != Tim (k<m) */ | 
|           for ( k2 = 0; k2 < m; k2++ ) | 
    for ( k2 = 0; k2 < m; k2++ ) | 
|             if ( _dl_redble(HDL(f[k2]),l1,nv) && | 
      if ( _dl_redble(HDL(f[k2]),l1,nv) && | 
|               !dl_equal(nv,l1,a[k2]) ) break; | 
        !dl_equal(nv,l1,a[k2]) ) break; | 
|           if ( k2 == m ) { | 
    if ( k2 == m ) { | 
|         dl1 = HDL(f[i]); dl2 = HDL(f[m]); | 
        dl1 = HDL(f[i]); dl2 = HDL(f[m]); | 
|         for ( k2 = 0; k2 < nv; k2++ ) | 
        for ( k2 = 0; k2 < nv; k2++ ) | 
|           if ( dl1->d[k2] && dl2->d[k2] ) break; | 
          if ( dl1->d[k2] && dl2->d[k2] ) break; | 
|         if ( k2 < nv ) { | 
        if ( k2 < nv ) { | 
|           NEWMP(mp); mp->dl = l1; C(mp) = (Obj)ONE; | 
          NEWMP(mp); mp->dl = l1; C(mp) = (Obj)ONE; | 
|           NEXT(mp) = 0; MKDP(nv,mp,u); u->sugar = l1->td; | 
          NEXT(mp) = 0; MKDP(nv,mp,u); u->sugar = l1->td; | 
|               STOQ(i,iq); STOQ(m,mq); | 
        STOQ(i,iq); STOQ(m,mq); | 
|               nd = mknode(3,iq,mq,u); | 
        nd = mknode(3,iq,mq,u); | 
|               MKLIST(list,nd); | 
        MKLIST(list,nd); | 
|               MKNODE(r1,list,r); | 
        MKNODE(r1,list,r); | 
|               r = r1; | 
        r = r1; | 
|            } | 
     } | 
|          } | 
   } | 
|     } | 
    } | 
|   } | 
  } | 
|   return r; | 
  return r; | 
| Line 3203  LIST sumi_updatepairs(LIST d,DP *f,int m) | 
 
  | 
| Line 3203  LIST sumi_updatepairs(LIST d,DP *f,int m) | 
 
 
 | 
|    if ( !new ) new = old; | 
   if ( !new ) new = old; | 
|    else { | 
   else { | 
|      for ( t = new ; NEXT(t); t = NEXT(t) ); | 
     for ( t = new ; NEXT(t); t = NEXT(t) ); | 
|          NEXT(t) = old; | 
   NEXT(t) = old; | 
|    } | 
   } | 
|    MKLIST(l,new); | 
   MKLIST(l,new); | 
|    return l; | 
   return l; | 
| Line 3265  LIST sumi_simplify(int nv,DL t,DP p,NODE f2,int simp) | 
 
  | 
| Line 3265  LIST sumi_simplify(int nv,DL t,DP p,NODE f2,int simp) | 
 
 
 | 
|      for ( r = f2, i = 0; r; r = NEXT(r), i++ ) v[n-i-1] = BDY(r); | 
     for ( r = f2, i = 0; r; r = NEXT(r), i++ ) v[n-i-1] = BDY(r); | 
|      for ( i = 0; i < last; i++ ) { | 
     for ( i = 0; i < last; i++ ) { | 
|        for ( s = BDY((LIST)v[i]); s; s = NEXT(s) ) { | 
       for ( s = BDY((LIST)v[i]); s; s = NEXT(s) ) { | 
|              w = (DP)BDY(s); hw = HDL(w); | 
       w = (DP)BDY(s); hw = HDL(w); | 
|          if ( _dl_redble(hw,h,nv) ) { | 
         if ( _dl_redble(hw,h,nv) ) { | 
|                    u = w; | 
       u = w; | 
|                    d = subdl(nv,h,hw); | 
       d = subdl(nv,h,hw); | 
|                    goto fin; | 
       goto fin; | 
|              } | 
  | 
|        } | 
       } | 
|   | 
       } | 
|      } | 
     } | 
|    } | 
   } | 
|  fin: | 
 fin: | 
| Line 3303  LIST sumi_symbolic(NODE l,int q,NODE f2,DP *g,int simp | 
 
  | 
| Line 3303  LIST sumi_symbolic(NODE l,int q,NODE f2,DP *g,int simp | 
 
 
 | 
|     } | 
    } | 
|   | 
  | 
|     while ( t ) { | 
    while ( t ) { | 
|           h = (DL)BDY(t); | 
    h = (DL)BDY(t); | 
|           NEXTNODE(done0,done); BDY(done) = dltodp(nv,h); | 
    NEXTNODE(done0,done); BDY(done) = dltodp(nv,h); | 
|           t = NEXT(t); | 
    t = NEXT(t); | 
|       for(m = 0; m < q; m++) | 
      for(m = 0; m < q; m++) | 
|             if ( _dl_redble(HDL(g[m]),h,nv) ) break; | 
      if ( _dl_redble(HDL(g[m]),h,nv) ) break; | 
|       if ( m == q ) { | 
      if ( m == q ) { | 
|       } else { | 
      } else { | 
|             d = subdl(nv,h,HDL(g[m])); | 
      d = subdl(nv,h,HDL(g[m])); | 
|         tp = sumi_simplify(nv,d,g[m],f2,simp); | 
        tp = sumi_simplify(nv,d,g[m],f2,simp); | 
|   | 
  | 
|             muldm(CO,ARG1(BDY(tp)),BDY((DP)ARG0(BDY(tp))),&mul); | 
      muldm(CO,ARG1(BDY(tp)),BDY((DP)ARG0(BDY(tp))),&mul); | 
|         t = symb_merge(t,NEXT(dp_dllist(mul)),nv); | 
        t = symb_merge(t,NEXT(dp_dllist(mul)),nv); | 
|   | 
  | 
|             NEXTNODE(f0,f); BDY(f) = tp; | 
      NEXTNODE(f0,f); BDY(f) = tp; | 
|             NEXTNODE(fd0,fd); BDY(fd) = mul; | 
      NEXTNODE(fd0,fd); BDY(fd) = mul; | 
|             NEXTNODE(red0,red); BDY(red) = mul; | 
      NEXTNODE(red0,red); BDY(red) = mul; | 
|       } | 
      } | 
|     } | 
    } | 
|     if ( fd0 ) NEXT(fd) = 0; MKLIST(l0,fd0); | 
    if ( fd0 ) NEXT(fd) = 0; MKLIST(l0,fd0); | 
| Line 3362  void Psumi_updatepairs(NODE arg,LIST *rp) | 
 
  | 
| Line 3362  void Psumi_updatepairs(NODE arg,LIST *rp) | 
 
 
 | 
|   | 
  | 
|  LIST remove_zero_from_list(LIST l) | 
 LIST remove_zero_from_list(LIST l) | 
|  { | 
 { | 
|          NODE n,r0,r; | 
   NODE n,r0,r; | 
|          LIST rl; | 
   LIST rl; | 
|   | 
  | 
|          asir_assert(l,O_LIST,"remove_zero_from_list"); | 
   asir_assert(l,O_LIST,"remove_zero_from_list"); | 
|          n = BDY(l); | 
   n = BDY(l); | 
|          for ( r0 = 0; n; n = NEXT(n) ) | 
   for ( r0 = 0; n; n = NEXT(n) ) | 
|                  if ( BDY(n) ) { | 
     if ( BDY(n) ) { | 
|                          NEXTNODE(r0,r); | 
       NEXTNODE(r0,r); | 
|                          BDY(r) = BDY(n); | 
       BDY(r) = BDY(n); | 
|                  } | 
     } | 
|          if ( r0 ) | 
   if ( r0 ) | 
|                  NEXT(r) = 0; | 
     NEXT(r) = 0; | 
|          MKLIST(rl,r0); | 
   MKLIST(rl,r0); | 
|          return rl; | 
   return rl; | 
|  } | 
 } | 
|   | 
  | 
|  int get_field_type(P p) | 
 int get_field_type(P p) | 
|  { | 
 { | 
|          int type,t; | 
   int type,t; | 
|          DCP dc; | 
   DCP dc; | 
|   | 
  | 
|          if ( !p ) | 
   if ( !p ) | 
|                  return 0; | 
     return 0; | 
|          else if ( NUM(p) ) | 
   else if ( NUM(p) ) | 
|                  return NID((Num)p); | 
     return NID((Num)p); | 
|          else { | 
   else { | 
|                  type = 0; | 
     type = 0; | 
|                  for ( dc = DC(p); dc; dc = NEXT(dc) ) { | 
     for ( dc = DC(p); dc; dc = NEXT(dc) ) { | 
|                          t = get_field_type(COEF(dc)); | 
       t = get_field_type(COEF(dc)); | 
|                          if ( !t ) | 
       if ( !t ) | 
|                                  continue; | 
         continue; | 
|                          if ( t < 0 ) | 
       if ( t < 0 ) | 
|                                  return t; | 
         return t; | 
|                          if ( !type ) | 
       if ( !type ) | 
|                                  type = t; | 
         type = t; | 
|                          else if ( t != type ) | 
       else if ( t != type ) | 
|                                  return -1; | 
         return -1; | 
|                  } | 
     } | 
|                  return type; | 
     return type; | 
|          } | 
   } | 
|  } | 
 } | 
|   | 
  | 
|  void Pdpv_ord(NODE arg,Obj *rp) | 
 void Pdpv_ord(NODE arg,Obj *rp) | 
|  { | 
 { | 
|          int ac,id; | 
   int ac,id; | 
|          LIST shift; | 
   LIST shift; | 
|   | 
  | 
|          ac = argc(arg); | 
   ac = argc(arg); | 
|          if ( ac ) { | 
   if ( ac ) { | 
|                  id = QTOS((Q)ARG0(arg)); | 
     id = QTOS((Q)ARG0(arg)); | 
|                  if ( ac > 1 && ARG1(arg) && OID((Obj)ARG1(arg))==O_LIST ) | 
     if ( ac > 1 && ARG1(arg) && OID((Obj)ARG1(arg))==O_LIST ) | 
|                          shift = (LIST)ARG1(arg); | 
       shift = (LIST)ARG1(arg); | 
|                  else | 
     else | 
|                          shift = 0; | 
       shift = 0; | 
|                  create_modorder_spec(id,shift,&dp_current_modspec); | 
     create_modorder_spec(id,shift,&dp_current_modspec); | 
|          } | 
   } | 
|          *rp = dp_current_modspec->obj; | 
   *rp = dp_current_modspec->obj; | 
|  } | 
 } | 
|   | 
  | 
|  extern int dpm_ispot; | 
 extern int dpm_ispot; | 
| Line 3427  void Pdpm_ord(NODE arg,LIST *rp) | 
 
  | 
| Line 3427  void Pdpm_ord(NODE arg,LIST *rp) | 
 
 
 | 
|  { | 
 { | 
|    Q q; | 
   Q q; | 
|    NODE nd; | 
   NODE nd; | 
|          struct order_spec *spec; | 
   struct order_spec *spec; | 
|   | 
  | 
|          if ( arg ) { | 
   if ( arg ) { | 
|      nd = BDY((LIST)ARG0(arg)); | 
     nd = BDY((LIST)ARG0(arg)); | 
|                  if ( !create_order_spec(0,(Obj)ARG1(nd),&spec) ) | 
     if ( !create_order_spec(0,(Obj)ARG1(nd),&spec) ) | 
|                          error("dpm_ord : invalid order specification"); | 
       error("dpm_ord : invalid order specification"); | 
|                  initdpm(spec,QTOS((Q)ARG0(nd))); | 
     initdpm(spec,QTOS((Q)ARG0(nd))); | 
|          } | 
   } | 
|    STOQ(dpm_ispot,q); | 
   STOQ(dpm_ispot,q); | 
|    nd = mknode(2,q,dp_current_spec->obj); | 
   nd = mknode(2,q,dp_current_spec->obj); | 
|    MKLIST(*rp,nd); | 
   MKLIST(*rp,nd); | 
| Line 3442  void Pdpm_ord(NODE arg,LIST *rp) | 
 
  | 
| Line 3442  void Pdpm_ord(NODE arg,LIST *rp) | 
 
 
 | 
|   | 
  | 
|  void Pdpm_hm(NODE arg,DPM *rp) | 
 void Pdpm_hm(NODE arg,DPM *rp) | 
|  { | 
 { | 
|          DPM p; | 
   DPM p; | 
|   | 
  | 
|          p = (DPM)ARG0(arg); asir_assert(p,O_DPM,"dpm_hm"); | 
   p = (DPM)ARG0(arg); asir_assert(p,O_DPM,"dpm_hm"); | 
|          dpm_hm(p,rp); | 
   dpm_hm(p,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdpm_ht(NODE arg,DPM *rp) | 
 void Pdpm_ht(NODE arg,DPM *rp) | 
|  { | 
 { | 
|          DPM p; | 
   DPM p; | 
|   | 
  | 
|          p = (DPM)ARG0(arg); asir_assert(p,O_DPM,"dp_ht"); | 
   p = (DPM)ARG0(arg); asir_assert(p,O_DPM,"dp_ht"); | 
|          dpm_ht(p,rp); | 
   dpm_ht(p,rp); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdpm_hc(NODE arg,Obj *rp) | 
 void Pdpm_hc(NODE arg,Obj *rp) | 
|  { | 
 { | 
|          asir_assert(ARG0(arg),O_DPM,"dpm_hc"); | 
   asir_assert(ARG0(arg),O_DPM,"dpm_hc"); | 
|          if ( !ARG0(arg) ) | 
   if ( !ARG0(arg) ) | 
|                  *rp = 0; | 
     *rp = 0; | 
|          else | 
   else | 
|                  *rp = BDY((DPM)ARG0(arg))->c; | 
     *rp = BDY((DPM)ARG0(arg))->c; | 
|  } | 
 } | 
|   | 
  | 
|   | 
  | 
|  void Pdpv_ht(NODE arg,LIST *rp) | 
 void Pdpv_ht(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          NODE n; | 
   NODE n; | 
|          DP ht; | 
   DP ht; | 
|          int pos; | 
   int pos; | 
|          DPV p; | 
   DPV p; | 
|          Q q; | 
   Q q; | 
|   | 
  | 
|          asir_assert(ARG0(arg),O_DPV,"dpv_ht"); | 
   asir_assert(ARG0(arg),O_DPV,"dpv_ht"); | 
|          p = (DPV)ARG0(arg); | 
   p = (DPV)ARG0(arg); | 
|          pos = dpv_hp(p); | 
   pos = dpv_hp(p); | 
|          if ( pos < 0 ) | 
   if ( pos < 0 ) | 
|                  ht = 0; | 
     ht = 0; | 
|          else | 
   else | 
|                  dp_ht(BDY(p)[pos],&ht); | 
     dp_ht(BDY(p)[pos],&ht); | 
|          STOQ(pos,q); | 
   STOQ(pos,q); | 
|          n = mknode(2,q,ht); | 
   n = mknode(2,q,ht); | 
|          MKLIST(*rp,n); | 
   MKLIST(*rp,n); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdpv_hm(NODE arg,LIST *rp) | 
 void Pdpv_hm(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          NODE n; | 
   NODE n; | 
|          DP ht; | 
   DP ht; | 
|          int pos; | 
   int pos; | 
|          DPV p; | 
   DPV p; | 
|          Q q; | 
   Q q; | 
|   | 
  | 
|          asir_assert(ARG0(arg),O_DPV,"dpv_hm"); | 
   asir_assert(ARG0(arg),O_DPV,"dpv_hm"); | 
|          p = (DPV)ARG0(arg); | 
   p = (DPV)ARG0(arg); | 
|          pos = dpv_hp(p); | 
   pos = dpv_hp(p); | 
|          if ( pos < 0 ) | 
   if ( pos < 0 ) | 
|                  ht = 0; | 
     ht = 0; | 
|          else | 
   else | 
|                  dp_hm(BDY(p)[pos],&ht); | 
     dp_hm(BDY(p)[pos],&ht); | 
|          STOQ(pos,q); | 
   STOQ(pos,q); | 
|          n = mknode(2,q,ht); | 
   n = mknode(2,q,ht); | 
|          MKLIST(*rp,n); | 
   MKLIST(*rp,n); | 
|  } | 
 } | 
|   | 
  | 
|  void Pdpv_hc(NODE arg,LIST *rp) | 
 void Pdpv_hc(NODE arg,LIST *rp) | 
|  { | 
 { | 
|          NODE n; | 
   NODE n; | 
|          P hc; | 
   P hc; | 
|          int pos; | 
   int pos; | 
|          DPV p; | 
   DPV p; | 
|          Q q; | 
   Q q; | 
|   | 
  | 
|          asir_assert(ARG0(arg),O_DPV,"dpv_hc"); | 
   asir_assert(ARG0(arg),O_DPV,"dpv_hc"); | 
|          p = (DPV)ARG0(arg); | 
   p = (DPV)ARG0(arg); | 
|          pos = dpv_hp(p); | 
   pos = dpv_hp(p); | 
|          if ( pos < 0 ) | 
   if ( pos < 0 ) | 
|                  hc = 0; | 
     hc = 0; | 
|          else | 
   else | 
|                  hc = (P)BDY(BDY(p)[pos])->c; | 
     hc = (P)BDY(BDY(p)[pos])->c; | 
|          STOQ(pos,q); | 
   STOQ(pos,q); | 
|          n = mknode(2,q,hc); | 
   n = mknode(2,q,hc); | 
|          MKLIST(*rp,n); | 
   MKLIST(*rp,n); | 
|  } | 
 } | 
|   | 
  | 
|  int dpv_hp(DPV p) | 
 int dpv_hp(DPV p) | 
|  { | 
 { | 
|          int len,i,maxp,maxw,w,slen; | 
   int len,i,maxp,maxw,w,slen; | 
|          int *shift; | 
   int *shift; | 
|          DP *e; | 
   DP *e; | 
|   | 
  | 
|          len = p->len; | 
   len = p->len; | 
|          e = p->body; | 
   e = p->body; | 
|          slen = dp_current_modspec->len; | 
   slen = dp_current_modspec->len; | 
|          shift = dp_current_modspec->degree_shift; | 
   shift = dp_current_modspec->degree_shift; | 
|          switch ( dp_current_modspec->id ) { | 
   switch ( dp_current_modspec->id ) { | 
|                  case ORD_REVGRADLEX: | 
     case ORD_REVGRADLEX: | 
|                          for ( maxp = -1, i = 0; i < len; i++ ) | 
       for ( maxp = -1, i = 0; i < len; i++ ) | 
|                                  if ( !e[i] ) continue; | 
         if ( !e[i] ) continue; | 
|                                  else if ( maxp < 0 ) { | 
         else if ( maxp < 0 ) { | 
|                                          maxw = BDY(e[i])->dl->td+(i<slen?shift[i]:0); maxp = i; | 
           maxw = BDY(e[i])->dl->td+(i<slen?shift[i]:0); maxp = i; | 
|                                  } else { | 
         } else { | 
|                                          w = BDY(e[i])->dl->td+(i<slen?shift[i]:0); | 
           w = BDY(e[i])->dl->td+(i<slen?shift[i]:0); | 
|                                          if ( w >= maxw ) { | 
           if ( w >= maxw ) { | 
|                                                  maxw = w; maxp = i; | 
             maxw = w; maxp = i; | 
|                                          } | 
           } | 
|                                  } | 
         } | 
|                          return maxp; | 
       return maxp; | 
|                  case ORD_GRADLEX: | 
     case ORD_GRADLEX: | 
|                          for ( maxp = -1, i = 0; i < len; i++ ) | 
       for ( maxp = -1, i = 0; i < len; i++ ) | 
|                                  if ( !e[i] ) continue; | 
         if ( !e[i] ) continue; | 
|                                  else if ( maxp < 0 ) { | 
         else if ( maxp < 0 ) { | 
|                                          maxw = BDY(e[i])->dl->td+(i<slen?shift[i]:0); maxp = i; | 
           maxw = BDY(e[i])->dl->td+(i<slen?shift[i]:0); maxp = i; | 
|                                  } else { | 
         } else { | 
|                                          w = BDY(e[i])->dl->td+(i<slen?shift[i]:0); | 
           w = BDY(e[i])->dl->td+(i<slen?shift[i]:0); | 
|                                          if ( w > maxw ) { | 
           if ( w > maxw ) { | 
|                                                  maxw = w; maxp = i; | 
             maxw = w; maxp = i; | 
|                                          } | 
           } | 
|                                  } | 
         } | 
|                          return maxp; | 
       return maxp; | 
|                          break; | 
       break; | 
|                  case ORD_LEX: | 
     case ORD_LEX: | 
|                          for ( i = 0; i < len; i++ ) | 
       for ( i = 0; i < len; i++ ) | 
|                                  if ( e[i] ) return i; | 
         if ( e[i] ) return i; | 
|                          return -1; | 
       return -1; | 
|                          break; | 
       break; | 
|          } | 
   } | 
|  } | 
 } | 
|   | 
  | 
|  int get_opt(char *key0,Obj *r) { | 
 int get_opt(char *key0,Obj *r) { | 
| Line 3580  int get_opt(char *key0,Obj *r) { | 
 
  | 
| Line 3580  int get_opt(char *key0,Obj *r) { | 
 
 
 | 
|         key = BDY((STRING)BDY(p)); | 
        key = BDY((STRING)BDY(p)); | 
|         /*  value = (Obj)BDY(NEXT(p)); */ | 
        /*  value = (Obj)BDY(NEXT(p)); */ | 
|         if ( !strcmp(key,key0) )  { | 
        if ( !strcmp(key,key0) )  { | 
|               *r = (Obj)BDY(NEXT(p)); | 
        *r = (Obj)BDY(NEXT(p)); | 
|               return 1; | 
        return 1; | 
|             } | 
      } | 
|       } | 
      } | 
|     } | 
    } | 
|     return 0; | 
    return 0; |