realroot_doc 0.1.1
/Users/mourrain/Devel/mmx/realroot/include/realroot/polynomial_dual_glue.hpp
Go to the documentation of this file.
00001 #ifndef realroot_sparse_dual_glue_hpp
00002 #define realroot_sparse_dual_glue_hpp
00003 #include <basix/mmx_syntax.hpp>
00004 #include <realroot/polynomial_dual.hpp>
00005 #define TMPL template <class C>
00006 #define RING       ring<C, Dual,DegRevLex>
00007 #define RING_POL   ring<C, Sparse,DegRevLex>
00008 #define Polynomial polynomial<C, with<Dual,DegRevLex> >
00009 //======================================================================
00010 namespace mmx {
00011   TMPL unsigned hash(const RING& p){ return 1;}
00012   TMPL unsigned exact_hash(const RING& p){ return 1;}
00013   TMPL unsigned soft_hash(const RING& p){ return 1;}
00014   TMPL bool exact_eq (const RING& p, const RING& q){ return true;}
00015   TMPL bool exact_neq(const RING& p, const RING& q){ return false;}
00016 
00017   TMPL bool operator ==(const RING& p, const RING& q){ return true;}
00018   TMPL bool operator !=(const RING& p, const RING& q){ return false;}
00019   
00020   TMPL syntactic flatten(const RING& Rg) { 
00021     syntactic CF= flatten(scalar_set<C>());
00022     vector<syntactic> rg; rg <<CF;
00023     vector<syntactic> Lv; 
00024     for(int i=0;i<Rg.nbvar();i++)
00025       Lv<<syntactic(string("d")<<RING_POL::var[i].data());
00026     rg << apply(GEN_SQTUPLE,Lv);
00027     return apply (GEN_ACCESS, rg);
00028   }
00029 
00030   TMPL RING dual_of(const RING_POL& rg) { 
00031     return RING();
00032   }
00033 
00034   TMPL RING dual_of(const RING_POL& rg, const generic& x) { 
00035     return RING();
00036   }
00037 
00038   TMPL syntactic flatten(const Polynomial& p) {
00039     typedef typename Polynomial::const_iterator iterator;
00040     syntactic r(0);
00041     for(iterator it=p.begin(); it!=p.end();it++)
00042       {
00043         syntactic m= flatten(it->coeff());
00044         for(unsigned i=0;i<it->nbvar();i++)
00045           {
00046             syntactic v = string("d")<<RING_POL::var[i].data();
00047             m = m*pow(v,syntactic(-(*it)[i]));
00048           }
00049         r+=m;
00050       }
00051     return r;
00052   }
00053 
00054   TMPL Polynomial 
00055   polynomial_dual(const RING& rg, const C& c) {
00056     return Polynomial(c);
00057   }
00058 
00059   TMPL Polynomial 
00060   polynomial_dual(const RING& rg, const C& c, int d, int v) {
00061     return Polynomial(c,v,d);
00062   }
00063 
00064   TMPL Polynomial 
00065   polynomial_dual(const RING& rg, const string& s) {
00066     return Polynomial(as_charp(s));
00067   }
00068   TMPL Polynomial 
00069   polynomial_dual(const RING& r, const generic& s) {
00070     return Polynomial(as_charp(as_mmx(s)));
00071   }
00072 
00073   TMPL vector<generic>
00074   polynomial_dual_coefficients(const Polynomial& f, const int & v) {
00075     Seq<Polynomial> l = coefficients(f,v);
00076     vector<generic> r;
00077     for(unsigned i=0; i< l.size(); i++)
00078       r<< as<generic>(l[i]);
00079     return r;
00080   }
00081   
00082   TMPL vector<generic>
00083   polynomial_dual_coefficients(const Polynomial& p) {
00084     typedef typename Polynomial::const_iterator const_iterator;
00085     vector<generic> r;
00086     for(const_iterator it=p.begin(); it!=p.end();it++)
00087      r<< as<generic>(it->coeff());
00088     return r;
00089   }
00090 } //namespace mmx
00091 //======================================================================
00092 #undef TMPL
00093 #undef RING
00094 #undef RING_POL
00095 #undef Polynomial
00096 #endif //realroot_sparse_dual_glue_hpp