MathTL
algebra/multi_laurent_polynomial.h
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
 All Classes Functions Variables Typedefs Enumerations