MathTL
|
00001 // -*- c++ -*- 00002 00003 // +--------------------------------------------------------------------+ 00004 // | This file is part of MathTL - the Mathematical Template Library | 00005 // | | 00006 // | Copyright (c) 2002-2009 | 00007 // | Thorsten Raasch, Manuel Werner | 00008 // +--------------------------------------------------------------------+ 00009 00010 #ifndef _MATHTL_MULTI_LAURENT_POLYNOMIAL_H 00011 #define _MATHTL_MULTI_LAURENT_POLYNOMIAL_H 00012 00013 #include <cassert> 00014 #include <utils/function.h> 00015 #include <algebra/infinite_vector.h> 00016 #include <algebra/polynomial.h> 00017 #include <algebra/laurent_polynomial.h> 00018 #include <geometry/point.h> 00019 #include <utils/multiindex.h> 00020 00021 namespace MathTL 00022 { 00031 template <class R, unsigned int DIMENSION> 00032 class MultivariateLaurentPolynomial 00033 : protected InfiniteVector<R, MultiIndex<int, DIMENSION> >, 00034 public Function<DIMENSION, R> 00035 { 00036 public: 00040 typedef typename InfiniteVector<R, MultiIndex<int, DIMENSION> >::const_iterator 00041 const_iterator; 00042 00046 typedef typename InfiniteVector<R, MultiIndex<int, DIMENSION> >::const_reverse_iterator 00047 const_reverse_iterator; 00048 00052 MultivariateLaurentPolynomial(); 00053 00057 MultivariateLaurentPolynomial(const MultivariateLaurentPolynomial<R, DIMENSION>& p); 00058 00062 explicit MultivariateLaurentPolynomial(const R c); 00063 00068 MultivariateLaurentPolynomial(const LaurentPolynomial<R>& p, const unsigned int n = 0); 00069 00073 virtual ~MultivariateLaurentPolynomial(); 00074 00078 MultivariateLaurentPolynomial<R, DIMENSION>& operator = 00079 (const MultivariateLaurentPolynomial<R, DIMENSION>& p); 00080 00084 MultivariateLaurentPolynomial<R, DIMENSION>& operator = (const R c); 00085 00089 R get_coefficient(const MultiIndex<int, DIMENSION>& k) const; 00090 00094 void set_coefficient(const MultiIndex<int, DIMENSION>& k, const R coeff); 00095 00099 const_iterator begin() const; 00100 00104 const_iterator end() const; 00105 00109 const_reverse_iterator rbegin() const; 00110 00114 const_reverse_iterator rend() const; 00115 00119 R value(const Point<DIMENSION>& p, 00120 const unsigned int component = 0) const; 00121 00125 void vector_value(const Point<DIMENSION> &p, 00126 Vector<R>& values) const; 00127 00131 void add(const MultivariateLaurentPolynomial<R, DIMENSION>& p); 00132 00136 void add(const R s, const MultivariateLaurentPolynomial<R, DIMENSION>& p); 00137 00141 void sadd(const R s, const MultivariateLaurentPolynomial<R, DIMENSION>& p); 00142 00146 MultivariateLaurentPolynomial<R, DIMENSION>& 00147 operator += (const MultivariateLaurentPolynomial<R, DIMENSION>& p); 00148 00153 MultivariateLaurentPolynomial<R, DIMENSION> 00154 operator + (const MultivariateLaurentPolynomial<R, DIMENSION>& p) const; 00155 00159 void subtract(const MultivariateLaurentPolynomial<R, DIMENSION>& p); 00160 00164 MultivariateLaurentPolynomial<R, DIMENSION>& 00165 operator -= (const MultivariateLaurentPolynomial<R, DIMENSION> &p); 00166 00171 MultivariateLaurentPolynomial<R, DIMENSION> operator - () const; 00172 00177 MultivariateLaurentPolynomial<R, DIMENSION> 00178 operator - (const MultivariateLaurentPolynomial<R, DIMENSION> &p) const; 00179 00183 MultivariateLaurentPolynomial<R, DIMENSION>& operator *= (const R c); 00184 00188 void multiply(const MultivariateLaurentPolynomial<R, DIMENSION>& p); 00189 00193 MultivariateLaurentPolynomial<R, DIMENSION>& operator *= 00194 (const MultivariateLaurentPolynomial<R, DIMENSION>& p); 00195 00199 void dump() const; 00200 }; 00201 00206 template <class R, unsigned int DIMENSION> 00207 MultivariateLaurentPolynomial<R, DIMENSION> operator * 00208 (const R c, const MultivariateLaurentPolynomial<R, DIMENSION>& p); 00209 00213 template <class R, unsigned int DIMENSION> 00214 MultivariateLaurentPolynomial<R, DIMENSION> operator * 00215 (const MultivariateLaurentPolynomial<R, DIMENSION>& p, 00216 const MultivariateLaurentPolynomial<R, DIMENSION>& q); 00217 00222 template <class R, unsigned int DIMENSION> 00223 std::ostream& operator << 00224 (std::ostream& s, const MultivariateLaurentPolynomial<R, DIMENSION> &p); 00225 } 00226 00227 // include implementation 00228 #include <algebra/multi_laurent_polynomial.cpp> 00229 00230 #endif