00001 #ifndef realroot_sparse_dual_glue_hpp
00002 #define realroot_sparse_dual_glue_hpp
00003 #include <basix/mmx_syntax.hpp>
00004 #include <realroot/ring_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 }
00091
00092 #undef TMPL
00093 #undef RING
00094 #undef RING_POL
00095 #undef Polynomial
00096 #endif //realroot_sparse_dual_glue_hpp