00001 #ifndef realroot_polynomial_hpp
00002 #define realroot_polynomial_hpp
00003
00019
00020 #include <realroot/shared_object.hpp>
00021 #include <realroot/texp_sup.hpp>
00022 #include <realroot/variables.hpp>
00023 #include <realroot/monomial.hpp>
00024 #include <realroot/ring.hpp>
00025
00026 #define TMPL template <class C, class Rep, class Ord>
00027 #define VARIANT with<Rep,Ord>
00028 #define SELF polynomial<C, VARIANT>
00029
00030
00031 namespace mmx {
00032
00033 template<class A, class B> struct use;
00034 struct operators_of;
00035
00036 template<class C, class V> struct polynomial;
00037 #ifndef DECL_WITH
00038 #define DECL_WITH
00039 template<class V, class W=V> struct with;
00040 #endif //DECL_WITH
00041
00042 struct polynomial_of {};
00046 TMPL
00047 struct polynomial<C,VARIANT>
00048 {
00049 typedef polynomial<C,VARIANT> self_t;
00050 typedef use<polynomial_of,self_t> Def;
00051 typedef typename Def::Ring Ring;
00052 typedef Ring V;
00053 typedef typename Def::rep_t R;
00054 typedef typename Def::rep_t rep_t;
00055 typedef use<operators_of,R> Op;
00056 typedef C scalar_t;
00057 typedef C Scalar;
00058 typedef C value_type;
00059 typedef C coeff_t;
00060 typedef typename R::size_type size_type;
00061 typedef R rep_type;
00062 typedef Ord order_t;
00063 typedef typename R::iterator iterator;
00064 typedef typename R::const_iterator const_iterator;
00065 typedef typename R::reverse_iterator reverse_iterator;
00066 typedef typename R::const_reverse_iterator const_reverse_iterator;
00067
00068 typedef typename Def::Monomial Monomial;
00069
00070
00071 shared_object<R> data;
00072 R & rep() { return (*data);}
00073 const R & rep() const { return (*data);}
00074
00075
00076 polynomial(): data() {};
00077
00078 polynomial( int c) : data() { rep()= R((Scalar)c); }
00079 polynomial( const C& c): data() { rep() = R(c); }
00080 polynomial( const C& c, int d, unsigned v=0) : data() { rep()=R(c,d,v); }
00081 polynomial( const Monomial & m): data() { rep()=R(m);}
00082 polynomial( const self_t & P): data(P.data) {}
00083 ~polynomial() {}
00084
00085 template<class S, class VECT>
00086 polynomial( const char * s, const VECT& bx);
00087
00088 template<class S, class W, class VECT>
00089 polynomial( const polynomial<S,W>& pol, const VECT& bx);
00090
00091 polynomial( const char * s, variables& vars = Ring::vars());
00092 polynomial( const char * s, const variables& vars) {
00093 variables v(vars);
00094 *this= self_t(s,v);
00095 }
00096
00097
00098 bool operator==( const C& c ) const;
00099 bool operator!=( const C& c ) const;
00100 bool operator==( const self_t& mp ) const;
00101
00102
00103 self_t & operator = ( const C& );
00104 self_t & operator = ( const self_t & x ) { data=x.data; return *this;}
00105
00106 template<class S>
00107 polynomial& operator = ( const polynomial<S,VARIANT>& pol );
00108
00109 template<class X>
00110 polynomial& operator+= ( const X & x ) { *this = *this + x; return *this; };
00111 polynomial& operator+= ( const self_t& p ) { Op::add(rep(),p.rep()); return *this;}
00112 polynomial& operator+= ( const C& c ) { Op::add(rep(),c); return *this; }
00113
00114 template<class X>
00115 polynomial& operator-= ( const X & x ) { *this = *this - x; return *this; };
00116 polynomial& operator-= ( const self_t& p ) { Op::sub(rep(),p.rep()); return *this;}
00117 polynomial& operator-= ( const C& c ) { Op::sub(rep(),c); return *this; }
00118
00119 template<class X>
00120 polynomial& operator*= ( const X & x ) { *this = *this * x; return *this; };
00121 polynomial& operator*= ( const C& c) { Op::mul(rep(),c); return *this; }
00122 polynomial& operator*= ( const Monomial& m) { Op::mul(rep(),m); return *this; }
00123 polynomial& operator*= ( const self_t& p) { Op::mul(rep(),p.rep()); return *this; }
00124
00125
00126 polynomial& operator/= ( const C& c) { Op::div(rep(),c); return *this; }
00127 polynomial& operator/= ( const self_t& p) { Op::div(rep(),p.rep()); return *this; }
00128
00129
00130 iterator begin() {return rep().begin();}
00131 const_iterator begin() const {return rep().begin();}
00132 iterator end() {return rep().end();}
00133 const_iterator end() const {return rep().end();}
00134
00135 reverse_iterator rbegin() {return rep().rbegin();}
00136 const_reverse_iterator rbegin() const {return rep().rbegin();}
00137 reverse_iterator rend() {return rep().rend();}
00138 const_reverse_iterator rend() const {return rep().rend();}
00139
00141 unsigned size() const {return rep().size();}
00142
00144 int nbvar() const {return rep().nbvar();}
00145
00147 const C coefof(int * deg) {return rep().entry(deg);}
00148
00149 const C operator[]( int i ) const;
00150 C& operator[]( int i ) ;
00151
00152
00153
00154 C operator()(const C& x) const {
00155 assert(rep().nbvar()<=1);
00156 C r; eval(r,rep(),x); return r;
00157 }
00158
00159 template<class T>
00160 T operator()(const T& x) const {
00161
00162 T r; eval(r,rep(),x); return r;
00163 }
00164
00165 template<class T>
00166 T operator()(const T& x, const T& y) const {
00167 T p[2]={x,y};
00168 T r; eval(r,rep(),p,2); return r;
00169
00170 }
00171
00172 template<class T>
00173 T operator()(const T& x, const T& y, const T& z) const {
00174 T p[3]={x,y,z};
00175 T r; eval(r,rep(),p,3); return r;
00176
00177 }
00178
00179 template<class T>
00180 T operator()(const T& x, unsigned n) const {
00181 T r; eval(r,rep(), x, n); return r;
00182 }
00183
00185 template<class T>
00186 typename T::value_type at(const T& x) const {
00187 typename T::value_type r; eval_at(r,rep(), x); return r;
00188 }
00189 };
00190 }
00191
00192 # undef TMPL
00193 # undef SELF
00194 # undef VARIANT
00195
00196 # include <realroot/polynomial_mthd.hpp>
00197 # include <realroot/polynomial_fcts.hpp>
00198 # include <realroot/polynomial_operators.hpp>
00199
00200 #endif //realroot_polynomial_hpp