realroot_doc 0.1.1
/Users/mourrain/Devel/mmx/realroot/include/realroot/polynomial_sparse_glue.hpp
Go to the documentation of this file.
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/polynomial_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 } //namespace mmx
00123 //======================================================================
00124 #undef TMPL
00125 #undef RING
00126 #undef Polynomial
00127 #endif //realroot_sparse_monomial_glue_hpp