00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include <mblad/bad.hpp>
00014 #include <bad.h>
00015
00017 namespace mmx {
00018 #define M vector<nat>
00019 #define Monomial monomial<M>
00020 #define Sparse_polynomial_Z sparse_polynomial<integer>
00021 #define Sparse_polynomial sparse_polynomial<rational>
00022 #define Coordinate multivariate_coordinate<>
00023 #define Coordinates multivariate_coordinates<>
00024 #define Polynomial_Z multivariate<Sparse_polynomial_Z>
00025 #define Polynomial multivariate<Sparse_polynomial>
00026 #define Regular_chain regular_chain<Polynomial>
00027
00028 vector<Regular_chain>
00029 bad_rosenfeld_groebner (const vector<Polynomial>& eqns,
00030 const vector<Polynomial>& ineqns,
00031 const vector<Coordinate>& indeps,
00032 const vector<Coordinate>& deps) {
00033 blad_session* blad = new blad_session (indeps, deps);
00034 vector<void*> indep_vars= blad -> bav_indeps;
00035 vector<void*> dep_vars= blad -> bav_deps;
00036
00037 bap_tableof_polynom_mpz* bad_eqns=
00038 (bap_tableof_polynom_mpz*) ba0_new_table ();
00039 bap_tableof_polynom_mpz* bad_ineqns=
00040 (bap_tableof_polynom_mpz*) ba0_new_table ();
00041
00042 bap_polynom_mpq* pol;
00043 bap_polynom_mpz* pol_mpz;
00044 mpz_t den; mpz_init (den);
00045 for (nat i= 0; i < N(eqns); i++) {
00046 pol= (bap_polynom_mpq*) to_bap_polynomial_mpq (blad, eqns[i]);
00047 pol_mpz= bap_new_polynom_mpz ();
00048 bap_numer_polynom_mpq (pol_mpz, den, pol);
00049 ba0_insert_table ((ba0_table*) bad_eqns, i, (void*) pol_mpz);
00050 }
00051 for (nat i= 0; i < N(ineqns); i++) {
00052 pol= (bap_polynom_mpq*) to_bap_polynomial_mpq (blad, ineqns[i]);
00053 pol_mpz= bap_new_polynom_mpz ();
00054 bap_numer_polynom_mpq (pol_mpz, den, pol);
00055 ba0_insert_table ((ba0_table*) bad_ineqns, i, (void*) pol_mpz);
00056 }
00057
00058 bad_intersectof_regchain* bad_sol= bad_new_intersectof_regchain ();
00059 ba0_sscanf2 ((char*) "intersectof_regchain ([], \
00060 [differential, squarefree, coherent, primitive, autoreduced])",
00061 (char*) "%intersectof_regchain", bad_sol);
00062 bad_Rosenfeld_Groebner (bad_sol, bad_eqns, bad_ineqns,
00063 (bad_base_field*) 0, (bad_splitting_control*) 0);
00064 vector<Regular_chain> sol;
00065 for (nat i= 0; i < (bad_sol -> inter).size; i++) {
00066 bad_regchain* bad_chain= (bad_sol -> inter).tab[i];
00067 vector<Polynomial> chain;
00068 for (nat j= 0; j < (bad_chain -> decision_system).size; j++) {
00069 Polynomial_Z p= from_bap_polynomial_mpz
00070 (blad, (bad_chain -> decision_system).tab[j]);
00071 chain << as<Polynomial> (p);
00072 }
00073 bad_attchain* bad_att= &(bad_chain -> attrib);
00074 vector<generic> att;
00075 if (bad_has_structural_property_attchain
00076 (bad_att, bad_differential_structural_property))
00077 att << lit ("differential");
00078 if (bad_has_structural_property_attchain
00079 (bad_att, bad_prime_structural_property))
00080 att << lit ("prime");
00081 if (bad_has_desired_property_attchain
00082 (bad_att, bad_coherence_desired_property))
00083 att << lit ("coherence");
00084 if (bad_has_desired_property_attchain
00085 (bad_att, bad_autoreduced_desired_property))
00086 att << lit ("autoreduced");
00087 if (bad_has_desired_property_attchain
00088 (bad_att, bad_squarefree_desired_property))
00089 att << lit ("squarefree");
00090 if (bad_has_desired_property_attchain
00091 (bad_att, bad_primitive_desired_property))
00092 att << lit ("primitive");
00093 if (bad_has_desired_property_attchain
00094 (bad_att, bad_normalized_desired_property))
00095 att << lit ("normalized");
00096 sol << Regular_chain (chain, att);
00097 }
00098
00099 return sol;
00100 }
00101
00102 }
00103