\begin{ccRefConcept}{PolynomialTraits_d::Permute}

\ccDefinition

This \ccc{AdaptableFunctor} permutes the variables of the given polynomial
with respect to a permutation $\sigma$. $\sigma$ is given by the iterator 
range of length \ccc{PolynomialTraits_d::d}, containing the second row of the permutation. 

For instance, let $p$ be a polynomial in 4 variables and it is intended to 
change the order of the variables such that 
$x_0 \mapsto x_2$, $x_1 \mapsto x_0$, $x_2 \mapsto x_1$ and $x_3 \mapsto x_3$. 
In this case the iterator range should contain the sequence $[2,0,1,3]$. 


\ccRefines 

\ccc{AdaptableFunctor}

\ccTypes

\ccSetThreeColumns{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}{xxx}{}
\ccTypedef{typedef PolynomialTraits_d::Polynomial_d   result_type;}{}\ccGlue

\ccOperations

\ccCreationVariable{fo}

\ccOperations
\ccMethod{
template<class Input_iterator>        
result_type  operator()(PolynomialTraits_d::Polynomial_d  p,
                       Input_iterator begin, Input_iterator end);}{ 
Returns $p$ with interchanged variables as defined by the iterator range. 
%Change order of variables in $p$ as defined by the iterator range. 
\ccPrecond{(end-begin == \ccc{PolynomialTraits_d::d})}  
\ccPrecond{\ccc{std::iterator_traits< InputIterator >::value_type} is convertible to int.}
\ccPrecond{The iterator range contains each value in $\{0,\dots,d-1\}$ exactly once. }
}





%\ccHasModels

\ccSeeAlso

\ccRefIdfierPage{Polynomial_d}\\
\ccRefIdfierPage{PolynomialTraits_d}\\

\end{ccRefConcept}