00001 #ifndef realroot_sparse_monomial_glue_hpp
00002 #define realroot_sparse_monomial_glue_hpp
00003 #include <basix/mmx_syntax.hpp>
00004 #include <numerix/kernel.hpp>
00005 #include <realroot/ring_sparse.hpp>
00006 #include <realroot/polynomial_glue.hpp>
00007 #define TMPL template <class C>
00008 #define RING ring<C, Sparse,DegRevLex >
00009 #define Polynomial polynomial< C, with<Sparse,DegRevLex> >
00010
00011 #define SparseDegRevLex with<Sparse,DegRevLex>
00012
00013 namespace mmx {
00014 TMPL unsigned hash(const RING& p){ return 1;}
00015 TMPL unsigned exact_hash(const RING& p){ return 1;}
00016 TMPL unsigned soft_hash(const RING& p){ return 1;}
00017 TMPL bool exact_eq(const RING& p, const RING& q){ return true;}
00018 TMPL bool exact_neq(const RING& p, const RING& q){ return false;}
00019
00020 TMPL bool operator ==(const RING& p, const RING& q){ return true;}
00021 TMPL bool operator !=(const RING& p, const RING& q){ return false;}
00022
00023 TMPL syntactic flatten(const RING& rg) {
00024 syntactic CF= flatten(scalar_set<C>());
00025 vector<syntactic> Lv; Lv <<CF;
00026 for(int i=0;i<rg.nbvar();i++)
00027 Lv<<syntactic(RING::var[i].data());
00028 return apply (GEN_ACCESS, Lv);
00029 }
00030
00031 TMPL RING
00032 ring_sparse_string(const scalar_set<C>& rg, const vector<string>& s) {
00033 string v;
00034 for(nat i=0;i<N(s);i++) v <<" "<<s[i];
00035 return RING(as_charp(v));
00036 }
00037
00038 TMPL RING
00039 ring_sparse_generic(const scalar_set<C>& rg, const vector<generic>& s) {
00040 string v;
00041 for(nat i=0;i<N(s);i++) v <<" "<<as_mmx(s[i]);
00042 return RING(as_charp(v));
00043 }
00044
00045 TMPL RING ring_sparse_extend_generic(const RING& R, const vector<generic>& s) {
00046 int nv= RING::nbvar();
00047 for(nat j=0;j<N(s);j++)
00048 R[nv+j] = Polynomial(as_charp(as_mmx(s[j])));
00049 return R;
00050 }
00051
00052 TMPL syntactic flatten(const Polynomial& p) {
00053 typedef typename Polynomial::const_iterator iterator;
00054 typedef typename Polynomial::Ring Ring;
00055 syntactic r(0);
00056 for(iterator it=p.begin(); it!=p.end();it++) {
00057 syntactic m= flatten(it->coeff());
00058 for(unsigned i=0;i<it->nbvar();i++) {
00059 syntactic v = Ring::var[i].data();
00060 m = m*pow(v,syntactic((*it)[i]));
00061 }
00062 r+=m;
00063 }
00064 return r;
00065 }
00066
00067 TMPL Polynomial
00068 polynomial_sparse(const RING& r, const C& c) {
00069 return Polynomial(c);
00070 }
00071
00072 TMPL Polynomial
00073 polynomial_sparse(const RING& r, const C& c, const int& d, const int& v) {
00074 return Polynomial(c,d,v);
00075 }
00076 TMPL Polynomial
00077 polynomial_sparse(const RING& r, const string& s) {
00078 return Polynomial(as_charp(s));
00079 }
00080
00081 TMPL Polynomial
00082 polynomial_sparse(const RING& r, const generic& s) {
00083 return Polynomial(as_charp(as_mmx(s)));
00084 }
00085
00086 TMPL vector<generic>
00087 polynomial_sparse_coefficients(const Polynomial& f, const int & v) {
00088 Seq<Polynomial> l = coefficients(f,v);
00089 vector<generic> r;
00090 for(unsigned i=0; i< l.size(); i++)
00091 r<< as<generic>(l[i]);
00092 return r;
00093 }
00094
00095 TMPL vector<generic>
00096 polynomial_sparse_coefficients(const Polynomial& p) {
00097 typedef typename Polynomial::const_iterator const_iterator;
00098 vector<generic> r;
00099 for(const_iterator it=p.begin(); it!=p.end();it++)
00100 r<< as<generic>(it->coeff());
00101 return r;
00102 }
00103
00104 TMPL vector<generic>
00105 polynomial_sparse_monomials(const Polynomial& p) {
00106 typedef typename Polynomial::const_iterator const_iterator;
00107 typedef typename Polynomial::Monomial Monomial;
00108 vector<generic> r;
00109 for(const_iterator it=p.begin(); it!=p.end();it++){
00110 Monomial m(*it);
00111 m.coeff()= C(1);
00112 r<< as<generic>(Polynomial(m));
00113 }
00114 return r;
00115 }
00116
00117 TMPL generic
00118 polynomial_sparse_eval_generic(const Polynomial& p, const vector<generic>& v) {
00119 return sparse::eval<generic>(p.rep(),v);
00120 }
00121
00122 }
00123
00124 #undef TMPL
00125 #undef RING
00126 #undef Polynomial
00127 #endif //realroot_sparse_monomial_glue_hpp