realroot_doc 0.1.1
|
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