1%%%%%%%%%%%%%%%%%%%
2% XLiFE++ is an extended library of finite elements written in C++
3%     Copyright (C) 2014  Lunéville, Eric; Kielbasiewicz, Nicolas; Lafranche, Yvon; Nguyen, Manh-Ha; Chambeyron, Colin
4%
5%     This program is free software: you can redistribute it and/or modify
6%     it under the terms of the GNU General Public License as published by
7%     the Free Software Foundation, either version 3 of the License, or
8%     (at your option) any later version.
9%     This program is distributed in the hope that it will be useful,
10%     but WITHOUT ANY WARRANTY; without even the implied warranty of
11%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12%     GNU General Public License for more details.
13%     You should have received a copy of the GNU General Public License
14%     along with this program.  If not, see <http://www.gnu.org/licenses/>.
15%%%%%%%%%%%%%%%%%%%
16
17\section{The polynomials classes}
18
19In order to deal with general polynomial spaces (using formal polynomials), \xlifepp provides the following template classes
20\begin{itemize}
21	\item {\class MonomialT} to deal with monomials of the form $x^iy^jz^k$
22	\item {\class PolynomialT} to deal with polynomials as combination of monomials, say
23	$$
24	p(x,y,z)=\sum_{i,j,k\ge 0} \alpha_{ijk}x^iy^jz^k
25	$$
26	\item {\class PolynomialBasisT} to deal with set of polynomials, may be a poynomials basis:
27	$$P[x,y,z]=\text{span}\left\{ P_\ell,\ \ell=1,L \right\}$$
28	\item {\class PolynomialsBasisT} to deal with set of vector polynomials, may be a poynomial basis:
29	$$\mathbf{P}[x,y,z]=\text{span}\left\{ \mathbf{P}_\ell=
30	\left(
31	\begin{array}{c}
32	P^x_\ell \\P^y_\ell\\P^z_\ell
33	\end{array}\right),\ \ell=1,L \right\}
34	$$
35	\item {\class PolyNodeT} to represent a polynomial as tree, useful to evaluate polynomial in a best way (Horner algorithm)
36\end{itemize}
37These classes can manage one, two or three variables and are templated by the type of the variable (K) which is of real\_t type by default.\\
38
39Note that there is no specific class to deal with vector polynomial, they are described as {\cmd std::vector<PolynomialT>}.\\
40
41For users, some useful aliases are available :
42\vspace{.1cm}
43\begin{lstlisting}[]{}
44typedef MonomialT<real_t>  Monomial;
45typedef PolynomialT<real_t> Polynomial;
46typedef PolynomialBasisT<real_t> PolynomialBasis;
47typedef PolynomialsBasisT<real_t> PolynomialsBasis;
48\end{lstlisting}
49\vspace{.3cm}
50Some usual scalar polynomials spaces may be constructed in 1d, 2d or 3d:
51$$
52\begin{array}{lll}
53Pn[x,y,z]  &  :\ \sum a_{ijk} x^iy^jz^k  & i,j,k \ge 0,\   i+j+k \le n \\
54PHn[x,y,z]  & :\ \sum a_{ijk} x^iy^jz^k  & i,j,k \ge 0,\  i+j+k = n \\
55Qn[x,y,z]  &  :\ \sum a_{ijk} x^iy^jz^k  & i,j,k \ge 0,\  i,j,k \le n \\
56Qns[x,y,z]  & :\ \sum a_{ijk} x^iy^jz^k  & i,j,k \ge 0,\  i\le nx, j\le ny, k\le nz
57\end{array}
58$$
59Some particular vector polynomials spaces related to FE space are also provided (see {\class PolynomialsBasisT} class). They can be addressed using the enumeration:
60\vspace{.1cm}
61\begin{lstlisting}[]{}
62enum PolynomialSpace {_Pk,_PHk,_Qk,_Qks,_Rk, _SHk,_Dk,_DQk,_DQ2k};
63\end{lstlisting}
64\vspace{.3cm}
65
66Main algebraic operations are supported and some formal derivative operations too. Polynomials may be evaluated at point $(x,y,z)$ using operator ().\\
67
68Besides, Polynomials may have a tree representation using {\class PolyNodeT} class. It may be useful when evaluating large polynomials.
69
70\subsection{The {\classtitle MonomialT} class}
71This class deals with monomials of the form :
72$$x_1^{a_1}x_2^{a_2}x_3^{a_3}$$
73storing only the three power numbers $a_1,\ a_2,\ a_3$:
74\vspace{.1cm}
75\begin{lstlisting}[]{}
76template <typename K = real_t>
77class MonomialT
78{
79  public:
80    dimen_t a1, a2, a3;
81    ...
82};
83\end{lstlisting}
84\vspace{.3cm}
85Thus, it allows only to deal with monomials of 3 variables of type K. Note that no coefficient is attached to a monomial.\\
86
87{\class MonomialT} class provides only one fundamental constructor,  overloaded operator () to evaluate monomial at a point or a vector of points, product by a monomial, comparison operators and print facilities:
88\vspace{.1cm}
89\begin{lstlisting}[]{}
90MonomialT(dimen_t p1=0, dimen_t p2=0, dimen_t p3=0)
91K operator()(const K& x1, const K& x2 = K(1), const K& x3 = K(1))const
92K operator() (const std::vector<K>& x) const
93MonomialT<K>& operator*=(const MonomialT<K>& m);
94void swapVar(dimen_t v1, dimen_t v2, dimen_t v3);
95string_t asString() const;
96void print(std::ostream& out) const;
97\end{lstlisting}
98\vspace{.3cm}
99\begin{lstlisting}[]{}
100MonomialT<K> operator*(const MonomialT<K>& m1, const MonomialT<K>& m2);
101friend std::ostream& operator<<(std::ostream& out, const MonomialT& m);
102bool operator== (const MonomialT<K>& m1, const MonomialT<K>& m2);
103bool operator!= (const MonomialT<K>& m1, const MonomialT<K>& m2);
104bool operator < (const MonomialT<K>& m1, const MonomialT<K>& m2);
105bool operator > (const MonomialT<K>& m1, const MonomialT<K>& m2);
106\end{lstlisting}
107\vspace{.3cm}
108
109\subsection{The {\classtitle PolynomialT} class}
110The {\class PolynomialT} class deals with polynomial up to 3 variables of value type K stored as a list of pairs of {\class MonomialT} object and a coefficient of type K:
111\vspace{.1cm}
112\begin{lstlisting}[]{}
113template <typename K=real_t>
114class PolynomialT
115{
116  public:
117    std::list<std::pair<MonomialT<K>, K > > monomials;
118    real_t epsilon;
119    mutable PolyNodeT<K> tree;
120    ...
121}
122\end{lstlisting}
123\vspace{.2cm}
124The member data {\var epsilon} is used to round to 0 the very small coefficients of the polynomial. By default its value is 100000*{\var theEpsilon} (about $10^{-10}$ in double precision). The member data {\var tree} may store a tree representation ({\class PolyNode} object) of the polynomial, that is useful to evaluate it at a point in a faster and more stable way (generalized Horner algorithm).\\
125
126The class provides simple constructors from monomials and a copy constructor:
127\vspace{.1cm}
128\begin{lstlisting}[]{}
129PolynomialT();
130PolynomialT(const MonomialT<K>&,const K& =K(1));
131PolynomialT(const MonomialT<K>& ,const K&, const MonomialT<K>&, const K&);
132PolynomialT(const PolynomialT<K>&);
133PolynomialT<K>& operator=(const PolynomialT<K>& p);
134\end{lstlisting}
135\vspace{.2cm}
136There are some useful tools:
137\vspace{.1cm}
138\begin{lstlisting}[]{}
139void push_back(const K&, const MonomialT<K>&);  //add a monomial part
140(const_) iterator begin() (const) ;
141(const_)iterator end()(const) ;
142dimen_t degree() const;
143void clean(real_t asZero);  //remove "zero" part
144void clean();
145void swapVar(dimen_t v1, dimen_t v2, dimen_t v3);
146static PolynomialT<K> zero();
147bool isZero() const;
148\end{lstlisting}
149\vspace{.2cm}
150To evaluate the polynomial two methods are available. One evaluating the polynomial as a linear combination of monomials, the other one using a generalized Horner algorithm based on a tree representation of the polynomial:
151\vspace{.1cm}
152\begin{lstlisting}[]{}
153void buildTree() const;
154K eval (const K& x1, const K& x2 = K(1), const K& x3 = K(1)) const ;
155K evalTree(const K& x1, const K& x2 = K(1), const K& x3 = K(1)) const;
156K operator() (const K& x1, const K& x2 = K(1), const K& x3 = K(1)) const;
157K operator() (const std::vector<K>& x) const;
158\end{lstlisting}
159\vspace{.1cm}
160If tree representation is built, the {\cmd eval} functions used always tree representation.\\
161
162Main algebraic operations are avalaible, either as internal or external functions to the class:
163\vspace{.1cm}
164\begin{lstlisting}[]{}
165PolynomialT<K>& operator *=(const MonomialT<K>&);
166PolynomialT<K>& operator *=(const K&);
167PolynomialT<K>& operator /=(const K& k);
168PolynomialT<K>& operator +=(const MonomialT<K>&);
169PolynomialT<K>& operator -=(const MonomialT<K>&);
170PolynomialT<K>& operator +=(const PolynomialT<K>&);
171PolynomialT<K>& operator -=(const PolynomialT<K>&);
172PolynomialT<K>& operator *=(const PolynomialT<K>&);
173
174//extern operation
175template <typename K>
176PolynomialT<K> operator *(const PolynomialT<K>& ,const MonomialT<K>&);
177PolynomialT<K> operator *(const MonomialT<K>&, const PolynomialT<K>&);
178PolynomialT<K> operator *(const MonomialT<K>&, const K&);
179PolynomialT<K> operator *(const K&, const MonomialT<K>&);
180PolynomialT<K> operator /(const MonomialT<K>&, const K&);
181PolynomialT<K> operator *(const PolynomialT<K>&, const K&);
182PolynomialT<K> operator *(const K&, const PolynomialT<K>&);
183PolynomialT<K> operator /(const PolynomialT<K>&, const K&);
184PolynomialT<K> operator -(const PolynomialT<K>&);
185PolynomialT<K> operator +(const PolynomialT<K>&, const PolynomialT<K>&);
186PolynomialT<K> operator -(const PolynomialT<K>&, const PolynomialT<K>&);
187PolynomialT<K> operator *(const PolynomialT<K>&, const PolynomialT<K>&);
188\end{lstlisting}
189\vspace{.3cm}
190Using the operator \verb|(.)|, polynomials may be chained (say $q(p1(x,y,z),p2(x,y,z), p3(x,y,z)$) :
191\vspace{.1cm}
192\begin{lstlisting}[]{}
193template <typename K>
194PolynomialT<K> operator()(const PolynomialT<K>& px,
195                          const PolynomialT<K>& py=PolynomialT<K>(),
196                          const PolynomialT<K>& pz=PolynomialT<K>()) const;
197PolynomialT<K>& replace(VariableName, const PolynomialT<K>&);
198\end{lstlisting}
199\vspace{.3cm}
200It is also possible to get some derivatives and integrals of polynomials:
201\vspace{.1cm}
202\begin{lstlisting}[]{}
203template <typename K>
204PolynomialT<K> dx(const MonomialT<K>&);
205PolynomialT<K> dy(const MonomialT<K>&);
206PolynomialT<K> dz(const MonomialT<K>&);
207vector<PolynomialT<K> > grad(const MonomialT<K>&, dimen_t =3);
208vector<PolynomialT<K> > curl(const MonomialT<K>&, dimen_t =3);
209PolynomialT<K> derivative(VariableName, const MonomialT<K>&);
210PolynomialT<K> integral(VariableName, const MonomialT<K>&);
211
212PolynomialT<K> dx(const PolynomialT<K>&);
213PolynomialT<K> dy(const PolynomialT<K>&);
214PolynomialT<K> dz(const PolynomialT<K>&);
215vector<PolynomialT<K> > grad(const PolynomialT<K>&, dimen_t =3);
216vector<PolynomialT<K> > curl(const PolynomialT<K>&, dimen_t =3);
217PolynomialT<K> derivative(VariableName, const PolynomialT<K>&);
218PolynomialT<K> integral(VariableName, const PolynomialT<K>&);
219
220vector<PolynomialT<K> > dx(const vector<PolynomialT<K> >&);
221vector<PolynomialT<K> > dy(const vector<PolynomialT<K> >&);
222vector<PolynomialT<K> > dz(const vector<PolynomialT<K> >&);
223vector<PolynomialT<K> > curl(const vector<PolynomialT<K> >&);
224PolynomialT<K> div(const vector<PolynomialT<K> >&);
225PolynomialT<K> dot(const vector<PolynomialT<K> >&, const vector<K>&);
226vector<PolynomialT<K> > derivative(VariableName,const vector<PolynomialT<K> >&)
227vector<PolynomialT<K> > integral(VariableName,const vector<PolynomialT<K> >);
228
229\end{lstlisting}
230\vspace{.3cm}
231Finally, some print facilities are provided:
232\vspace{.1cm}
233\begin{lstlisting}[]{}
234string_t asString() const;
235void print(std::ostream&) const;
236friend std::ostream& operator<<(std::ostream&, const PolynomialT&)
237\end{lstlisting}
238\vspace{.1cm}
239
240\subsection{The {\classtitle PolyNodeT} class}
241In order to be computed in a faster and a more stable way, a polynomial may be represented as a tree and evaluated by traveling this tree. In this tree representation, each node represents one of the factor $1,\ x_1,\ x_2$ or $x_3$. When it is a leaf, the coefficient of the corresponding monomial is stored. For instance the polynomial $2+4x+5xy+xz+3yz+5z^2$ has the following tree :
242\begin{figure}[H]
243\begin{center}
244\includePict[width=17cm]{polynomial_tree}
245\end{center}
246\end{figure}
247Horizontal lines represents addition while vertical lines represent product. Note that the tree representation is not unique.\\
248
249The {\class PolyNodeT} class manages for each node a factor type and a coefficient, and some pointers to travel the tree:
250\vspace{.1cm}
251\begin{lstlisting}[]{}
252template <typename K=real_t>
253class PolyNodeT
254{public:
255    dimen_t type;        // 0: 1, 1: x1, 2:x2, 3:x3
256    K coef;
257    PolyNodeT<K>* parent, * child, * right;
258    ...
259};
260\end{lstlisting}
261\vspace{.3cm}
262It offers only a few member functions to build the polynomial tree:
263\vspace{.1cm}
264\begin{lstlisting}[]{}
265PolyNodeT(dimen_t =0, PolyNodeT<K>* =0, const K& =K(0));
266~PolyNodeT();
267void clear();
268void insert(const MonomialT<K>&, const K&);
269bool rootNode() const;
270bool isZero() const {return (coef==K(0) && child==0);}
271void print(std::ostream&) const;
272void printTree(std::ostream&, std::string&) const;
273string_t varString() const;
274\end{lstlisting}
275\vspace{.3cm}
276The most important function is the operator ():
277\vspace{.1cm}
278\begin{lstlisting}[]{}
279K operator()(const K& x, const K& y=K(1), const K& z=K(1)) const;
280\end{lstlisting}
281\vspace{.1cm}
282that evaluates the polynomial at a point $(x,y,z)$.
283
284\subsection{The {\classtitle PolynomialBasisT} class}
285A space of polynomials (of finite dimension $p$) may be described by one of its basis, say a set of $p$ polynomials.  The {\class PolynomialBasisT} class manages this basis as a list of {\class PolynomialT} objects. In fact it inherits from std::list\verb?<?PolynomialT\verb?<?K\verb?>? \verb?>?:
286\vspace{.1cm}
287\begin{lstlisting}[]{}
288template <typename K=real_t>
289class PolynomialBasisT : public std::list<PolynomialT<K> >
290{public:
291    dimen_t dim;       // number of variables in Polynomials
292    string_t name;     // basis name
293  ...
294};
295\end{lstlisting}
296\vspace{.3cm}
297There exists some basic constructors from monomials and a general constructor for rather standard polynomial spaces identified by the enumerator {\cmd PolynomialSpace}:
298\vspace{.1cm}
299\begin{lstlisting}[]{}
300enum PolynomialSpace {_Pk,_PHk,_Qk,_Qks,_Rk, _SHk,_Dk,_DQk,_DQ2k};
301
302PolynomialBasisT(dimen_t =0, const string_t& ="");
303PolynomialBasisT(dimen_t, const MonomialT<K>&, const string_t& na="");
304PolynomialBasisT(dimen_t, const MonomialT<K>&, const MonomialT<K>&,
305                 const string_t& ="");
306PolynomialBasisT(PolynomialSpace, dimen_t, dimen_t, dimen_t =0, dimen_t =0);
307void buildPk(dimen_t);
308void buildPHk(dimen_t);
309void buildQk(dimen_t);
310void buildQks(dimen_t , dimen_t =0, dimen_t=0);
311void buildTree();
312\end{lstlisting}
313\vspace{.3cm}
314The (scalar) polynomial spaces that can be constructed are ($n$ number of variables, $\alpha$ multi-index):
315$$
316\begin{array}{|l|l|c|}
317\hline
318\text{polynomial space} & \text{dimension}& \text{\xlifepp}\\
319\hline
320 & & \\[-2mm]
321\displaystyle P_k=\left\{\sum_{|a|\leq k}a_\alpha x^\alpha \right\} & \displaystyle C^{n+k}_k=\frac{(n+k)!}{k!\,n!} & \text{\_Pk}\\[6mm]
322\displaystyle\tilde{P}_k=\left\{\sum_{|\alpha|= k}a_\alpha x^\alpha \right\} &
323\begin{array}{l}
324\displaystyle n=2\ :\ k+1\\
325\displaystyle n=3\ :\ \frac{1}{2}(k+2)(k+1)
326\end{array}
327& \text{\_PHk} \\[6mm]
328\displaystyle Q_k=\left\{\sum_{\alpha_1\leq k,\alpha_2\leq k, \alpha_3\leq k }a_\alpha x^\alpha \right\} &\displaystyle (k+1)^n& \text{\_Qk}\\[6mm]
329\displaystyle\tilde{Q}_{lmn}=\left\{\sum_{\alpha_1\leq l,\alpha_2\leq m, \alpha_3\leq n }a_\alpha x^\alpha \right\} &\displaystyle (l+1)(m+1)(n+1)& \text{\_Qks}\\[4mm]
330\hline
331\end{array}
332$$
333
334\vspace{.3cm}
335Several functions are devoted to the managment of the list:
336\vspace{.1cm}
337\begin{lstlisting}[]{}
338void push_back(const PolynomialT<K>&);
339void add(const MonomialT<K>&);
340void add(const PolynomialT<K>&);
341void add(const PolynomialBasisT&);
342iterator begin();
343iterator end();
344const_iterator begin() const;
345const_iterator end() const;
346size_t size() const;
347void resize(size_t n);
348void clean();
349void clean(real_t asZero);
350dimen_t degree() const;
351void swapVar(dimen_t v1, dimen_t v2, dimen_t v3);
352\end{lstlisting}
353\vspace{.3cm}
354\begin{remark}
355	The {\class PolynomialsBasisT} class is intended to deal with polynomial basis but there is no tool to check independance of polynomials!
356\end{remark}\\
357
358It is also possible to evaluate all the polynomials at a point using different ways:
359\vspace{.1cm}
360\begin{lstlisting}[]{}
361std::vector<K>& eval(std::vector<K>& res, const K& x1, const K& x2 = K(1),
362                     const K& x3 = K(1)) const;
363std::vector<K> eval(const K& x1, const K& x2 = K(1), const K& x3 = K(1)) const;
364std::vector<K>& evalTree(std::vector<K>& res, const K& x1, const K& x2 = K(1),
365                         const K& x3 = K(1)) const;
366std::vector<K> evalTree(const K& x1, const K& x2 = K(1),
367                        const K& x3 = K(1)) const;
368std::vector<K> operator()(const K& x1, const K& x2 = K(1),
369                          const K& x3 = K(1)) const;
370std::vector<K>& operator()(std::vector<K>& res, const K& x1, const K& x2 = K(1),
371                           const K& x3 = K(1)) const:
372\end{lstlisting}
373\vspace{.3cm}
374As usual, there are some print facilities:
375\vspace{.1cm}
376\begin{lstlisting}[]{}
377void print(std::ostream&) const;
378friend std::ostream& operator<<(std::ostream&, const PolynomialBasisT<K>& );
379\end{lstlisting}
380\vspace{.3cm}
381
382\subsection{The {\classtitle PolynomialsBasisT} class}
383In finite element approximation, some vector polynomial spaces are required. This is the role of the {\class PolynomialsBasisT} class. There is no class to deal with vector polynomial, they are represented by some {\var vector\verb?<?PolynomialT\verb?>?}. As a consequence, the {\class PolynomialsBasisT} class inherits from {\var list\verb?<?std::vector\verb?<?PolynomialT\verb?<?K\verb?>?\verb?>?\verb?>?}:
384\vspace{.1cm}
385\begin{lstlisting}[]{}
386template <typename K=real_t>
387class PolynomialsBasisT : public std::list<std::vector<PolynomialT<K> > >
388{
389public:
390dimen_t dimVar;            // dimension of Polynomials (number of variables)
391dimen_t dimVec;            // dimension of vectors of Polynomials
392string_t name;             // basis name
393...
394};
395\end{lstlisting}
396\vspace{.3cm}
397Several constructors are available. Some construct product spaces from  {\class PolynomialBasisT} objects. There is a general constructor allowing to get particular vector polynomial spaces enumerated in {\cmd PolynomialSpace}:
398
399
400\vspace{.1cm}
401\begin{lstlisting}[]{}
402PolynomialsBasisT(dimen_t =0, dimen_t =0, const string_t& ="");
403PolynomialsBasisT(const PolynomialBasisT<K>&, dimen_t, const string_t& na="");
404PolynomialsBasisT(const PolynomialBasisT<K>&, const PolynomialBasisT<K>&,
405                  const string_t& ="");
406PolynomialsBasisT(const PolynomialBasisT<K>&, const PolynomialBasisT<K>&,
407                  const PolynomialBasisT<K>&, const string_t& na="");
408PolynomialsBasisT(PolynomialSpace, dimen_t, dimen_t);
409void buildSHk(dimen_t);
410void buildRk(dimen_t);
411void buildDk(dimen_t);
412void buildDQk(dimen_t);
413void buildDQ2k(dimen_t);
414void buildTree();
415\end{lstlisting}
416\vspace{.3cm}
417The following FE spaces are available:
418$$
419\begin{array}{|l|l|c|}
420\hline
421\text{polynomial space} & \text{dimension}& \text{\xlifepp}\\
422\hline
423& & \\[-2mm]
424\displaystyle S_k=\left\{p\in(\tilde{P}_k)^n;\ x.p=0 \right\} & n\dim\tilde{P}_k-\dim\tilde{P}_{k+1}  & \text{\_Sk}\\[2mm]
425\displaystyle D_k=(P_{k-1})^n \oplus \tilde{P}_{k-1}x &
426n\dim P_{k-1}+\dim\tilde{P}_{k-1} &  \text{\_Dk} \\[6mm]
427\displaystyle R_k=(P_{k-1})^n \oplus Sk &  n\dim P_{k-1}+\dim S_{k} &  \text{\_Rk} \\[6mm]
428DQk= Q_{k,k-1,k-1} \times Q_{k-1,k,k-1} \times Q_{k-1,k-1,k} & 3k(k-1)^2& \text{\_DQk} \\[6mm]
429DQ2k_{2d} = (P_k)^2 \oplus \text{span}\left\{ \text{curl}\, x_1^{k+1}x_2, \text{curl}\, x_2^{k+1}x_1 \right\} & 2(\dim P_{k}+1)&  \text{\_DQ2k} \\[6mm]
430\hline
431\end{array}
432$$
433The operator * allows to build tensor polynomials space, say if $P[x_1,x_2]$ and  $Q[x_3]$ are two polynomials sets, $(P*Q)[x_1,x_2,x_3]$ is the set:
434$$
435\left\{ p_i(x_1,x_2)q_j(x_3),\ i=1,m,\ j=1,n\right\},
436$$
437\begin{lstlisting}[]{}
438PolynomialBasisT<K> operator*(const PolynomialBasisT<K>& P,
439                              const PolynomialBasisT<K>& Q)
440\end{lstlisting}
441\vspace{.3cm}
442
443
444Member functions are similar to member functions of the {\class PolynomialBasisT} class:
445\vspace{.1cm}
446\begin{lstlisting}[]{}
447void push_back(const std::vector<PolynomialT<K> >&);
448void add(const PolynomialT<K>&);
449void add(const PolynomialT<K>&, const PolynomialT<K>&);
450void add(const PolynomialT<K>&, const PolynomialT<K>&,
451         const PolynomialT<K>&);
452void add(const std::vector<PolynomialT<K> >&);
453void add(const PolynomialsBasisT&);
454iterator begin();
455iterator end();
456const_iterator begin() const;
457const_iterator end() const;
458size_t size() const;
459void resize(size_t);
460dimen_t degree() const;
461void swapVar(dimen_t, dimen_t, dimen_t);
462void clean();
463void clean(real_t asZero);
464
465//evaluation of basis
466vector<vector<K> >& eval(vector<vector<K> >&, const K&, const K& = K(1),
467                        const K& = K(1)) const;
468vector<vector<K> >  eval(const K&, const K& = K(1), const K& = K(1)) const;
469vector<vector<K> >& evalTree(vector<vector<K> >&, const K&,
470                             const K& = K(1), const K& = K(1)) const;
471vector<vector<K> >  evalTree(const K&, const K& = K(1), const K& = K(1)) const;
472vector<vector<K> >& operator()(vector<vector<K> >&, const K&,
473                               const K& = K(1), const K& = K(1)) const;
474
475//print facilities
476void print(std::ostream&) const;
477friend std::ostream& operator<<(std::ostream&, const PolynomialsBasisT<K>&)
478\end{lstlisting}
479\vspace{.3cm}
480
481\displayInfos{library=utils, header=polynomials.hpp, implementation=polynomials.hpp,
482test=test\_polynomials.cpp, header dep={config.h, utils.h}}
483