00001 #ifndef realroot_tensor_monomial_hpp
00002 #define realroot_tensor_monomial_hpp
00003
00004 #include <vector>
00005 #include <iterator>
00006 #include <realroot/shared_object.hpp>
00007 #include <realroot/sparse_monomials.hpp>
00008 #include <realroot/tensor_eenv.hpp>
00009 #include <realroot/binomials.hpp>
00010
00011 namespace mmx {
00012
00014 namespace tensor
00015 {
00016
00017 template<class C>
00018 struct monomials
00019 {
00020 typedef C coeff_t;
00021 typedef std::vector<C> vector_type;
00022
00023 typedef C * iterator;
00024
00025 typedef const C * const_iterator;
00026 typedef std::reverse_iterator<iterator> reverse_iterator;
00027 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
00028 typedef typename vector_type::size_type size_type;
00029 typedef coeff_t value_type;
00030 static binomials<C> binoms;
00031 eenv env;
00032 vector_type data;
00033
00034
00035
00036 monomials();
00037 monomials( const C& x);
00038 monomials( const C& c, int d, unsigned v);
00039 monomials( int v, int d);
00040 template<class X, class O>
00041 monomials( const sparse::monomial_seq<X,O>& );
00042 monomials( const eenv & e);
00043 monomials( const eenv& e, const C& c );
00044 monomials( int nvr, const int * szs, const int * vrs = 0 );
00045
00046 void resize(int l) {};
00047 C * begin() { return &(data[0]); };
00048 C * end () { return &(data[0])+esz(); };
00049
00050 const_iterator begin() const { return &(data[0]); };
00051 const_iterator end() const { return &(data[esz()]); };
00052
00053 reverse_iterator
00054 rbegin() {
00055 return reverse_iterator(&(data[0])+esz());
00056 }
00057 const_reverse_iterator
00058 rbegin() const {
00059 return const_reverse_iterator(&(data[0])+esz());
00060 }
00061 reverse_iterator
00062 rend() {
00063 return reverse_iterator(&(data[0]));
00064 }
00065 const_reverse_iterator
00066 rend() const {
00067 return const_reverse_iterator(&(data[0]));
00068 }
00069
00070
00071 int esz() const { return env.sz(); };
00072 int size() const { return env.sz(); };
00073 int nbvar() const { return env.nvr(); };
00074 int nvr() const { return env.nvr(); };
00075 int * szs() { return env.szs(); };
00076 int * vrs() { return env.vrs(); };
00077 int * str() { return env.str(); };
00078 const int * szs() const { return env.szs(); };
00079 const int * vrs() const { return env.vrs(); };
00080 const int * str() const { return env.str(); };
00081
00082 const C & operator[]( int i ) const { return data[i]; };
00083 C & operator[]( int i ) { return data[i]; };
00084 bool hasvar( int& lv, int gv ) const;
00085 bool operator==( const C& c ) const {
00086 return esz() == 1 && data[0] == c; }
00087 bool operator==( const monomials& mpl ) const ;
00088 void swap( monomials<C>& a ) { std::swap(env,a.env); data.swap(a.data); };
00089
00090 const C entry(std::vector<int> deg);
00091 };
00092
00093 };
00094
00095
00096 }
00097
00098 #include "realroot/tensor_monomials_fcts.hpp"
00099
00100
00101
00102 namespace mmx {
00103 # define Polynomial tensor::monomials<C>
00104 # define TMPL template<class C>
00105
00106 template<class A, class B> struct use;
00107 struct operators_of;
00108
00109 TMPL struct use<operators_of,Polynomial> {
00110
00111 static inline void
00112 add (Polynomial &r, const Polynomial &a ) {
00113 tensor::add (r, a);
00114 }
00115 static inline void
00116 add (Polynomial &r, const Polynomial &a, const Polynomial &b) {
00117 tensor::add (r, a, b);
00118 }
00119 static inline void
00120 add (Polynomial &r, const Polynomial &a, const C & b) {
00121 tensor::add (r, a, b);
00122 }
00123 static inline void
00124 add (Polynomial &r, const C & a, const Polynomial &b) {
00125 tensor::add (r, b, a);
00126 }
00127 static inline void
00128 sub (Polynomial &r, const Polynomial &a ) {
00129 tensor::sub (r, a );
00130 }
00131 static inline void
00132 sub (Polynomial &r, const Polynomial &a, const Polynomial &b) {
00133 tensor::sub (r, a, b);
00134 }
00135 static inline void
00136 sub (Polynomial &r, const C & a, const Polynomial &b) {
00137 tensor::sub (r, a, b);
00138 }
00139 static inline void
00140 sub (Polynomial &r, const Polynomial &a, const C & b) {
00141 tensor::sub (r, a, b);
00142 }
00143 static inline void
00144 mul (Polynomial &r, const Polynomial &a ) {
00145 tensor::mul (r, a );
00146 }
00147 static inline void
00148 mul (Polynomial &r, const Polynomial &a, const Polynomial &b) {
00149 tensor::mul (r, a, b);
00150 }
00151 static inline void
00152 mul (Polynomial &r, const Polynomial &a, const C & b) {
00153 tensor::mul (r, a, b); }
00154 static inline void
00155 mul (Polynomial &r, const C & a, const Polynomial &b) {
00156 tensor::mul (r, b, a);
00157 }
00158 static inline void
00159 div (Polynomial &r, const Polynomial &a, const Polynomial &b) {
00160 tensor::div (r, a, b);
00161 }
00162 static inline void
00163 div (Polynomial &r, const Polynomial &a, const C & b) {
00164 tensor::div (r, a, b);
00165 }
00166
00167
00168
00169
00170 };
00171 # undef Polynomial
00172 # undef TMPL
00173
00174 }
00175 #endif