\begin{ccRefConcept}{PolynomialTraits_d}

\ccDefinition
A model of \ccc{PolynomialTraits_d} is associated to an type 
\ccc{Polynomial_d}, representing a multivariate polynomial
\footnote{Univariate polynomials are not excluded by this concept.}. 
The number of variables is denoted as the dimension $d$ of the polynomial,
it is arbitrary but fixed for a certain model of this concept.  

\ccc{PolynomialTraits_d} provides two different views on the 
multivariate polynomial. 

\begin{itemize}
\item A recursive view, that sees the polynomial as an element of 
$R[x_0,\dots,x_{d-2}][x_{d-1}]$. In this view, the polynomial is handled as
an univariate polynomial over the ring $R[x_0,\dots,x_{d-2}]$. 
\item A symmetric view, which is symmetric with respect to all variables,
seeing the polynomials as element of $R[x_0,\dots,x_{d-1}]$.
\end{itemize}


The default view is the recursive view, therefore all functors are 
designed such that there default version performs the operation 
with respect to this view. 

\ccRefines

\ccConstants
 
\ccVariable{const int d;}{The dimension and the number of variables respectively.}

\ccTypes

\ccNestedType{Polynomial_d}{ Type representing $R[x_0,\dots,x_{d-1}]$.}\ccGlue
\ccNestedType{Coefficient }{ Type representing $R[x_0,\dots,x_{d-2}]$.}\ccGlue
\ccNestedType{Innermost_coefficient}{ Type representing the base ring $R$.}

\ccHeading{Functors}

In case a functor is not provided it is set to \ccc{CGAL::Null_functor}.
%,e.g., \ccc{Sign_at} if \ccc{Innermost_coefficient} is not \ccc{RealEmbeddable}. 
\ccSetTwoColumns{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}{}

\ccNestedType{Construct_polynomial}
        {A model of \ccc{PolynomialTraits_d::ConstructPolynomial}.}
\ccNestedType{Get_coefficient}
        {A model of \ccc{PolynomialTraits_d::GetCoefficient}.}
\ccNestedType{Get_innermost_coefficient}
        {A model of \ccc{PolynomialTraits_d::GetInnermostCoefficient}.}

\ccNestedType{Swap}
        { A model of \ccc{PolynomialTraits_d::Swap}.}
\ccNestedType{Move}
        { A model of \ccc{PolynomialTraits_d::Move}.}


\ccNestedType{Degree}
        { A model of \ccc{PolynomialTraits_d::Degree}.}
\ccNestedType{Total_degree}
        { A model of \ccc{PolynomialTraits_d::TotalDegree}.}
\ccNestedType{Leading_coefficient}
        { A model of \ccc{PolynomialTraits_d::LeadingCoefficient}.}
\ccNestedType{Innermost_leading_coefficient}
        {A model of \ccc{PolynomialTraits_d::InnermostLeadingCoefficient}.}


\ccNestedType{Canonicalize}
        { A model of \ccc{PolynomialTraits_d::Canonicalize}.}
\ccNestedType{Differentiate}    
        { A model of \ccc{PolynomialTraits_d::Differentiate}.}


%Evaluation
\ccNestedType{Evaluate}
        { A model of \ccc{PolynomialTraits_d::Evaluate}.}
\ccNestedType{Evaluate_homogeneous}
        { A model of \ccc{PolynomialTraits_d::EvaluateHomogeneous}.}

\ccNestedType{Is_zero_at}
        { A model of \ccc{PolynomialTraits_d::IsZeroAt}.}
\ccNestedType{Is_zero_at_homogeneous}
        { A model of \ccc{PolynomialTraits_d::IsZeroAtHomogeneous}.}

\ccNestedType{Sign_at}{
        A model of \ccc{PolynomialTraits_d::SignAt}.
        In case \ccc{Innermost_coefficient} is not \ccc{RealEmbeddable} this 
        is \ccc{CGAL::Null_functor}.}
\ccNestedType{Sign_at_homogeneous}{ 
        A model of \ccc{PolynomialTraits_d::SignHomogeneous}.
        In case \ccc{Innermost_coefficient} is not \ccc{RealEmbeddable} this 
        is \ccc{CGAL::Null_functor}.}

\ccNestedType{Compare}{ 
        A model of \ccc{PolynomialTraits_d::Compare}. 
        In case \ccc{Innermost_coefficient} is not \ccc{LessThanComparable} this 
        is \ccc{CGAL::Null_functor}.}


\ccHeading{For \ccc{PolynomialToolBox}: }

\ccNestedType{Univariate_content}{ 
        In case \ccc{PolynomialTraits_d::Coefficient} is {\bf not} a model of 
        \ccc{UFDomain}, this is \ccc{CGAL::Null_type}, otherwise this is 
        a model of \ccc{PolynomialTraits_d::UnivariateContent}.}
\begin{ccAdvanced}
\ccNestedType{Multivariate_content}{ 
        In case \ccc{PolynomialTraits_d::Innermost_coefficient} is {\bf not} 
        a model of \ccc{UFDomain}, this is \ccc{CGAL::Null_type}, 
        otherwise this is a model of 
        \ccc{PolynomialTraits_d::MultivariateContent}.}
\end{ccAdvanced}

%Manipulation
\ccNestedType{Shift}{ A model of \ccc{PolynomialTraits_d::Shift}.}
\ccNestedType{Negate}{ A model of \ccc{PolynomialTraits_d::Negate}.}
\ccNestedType{Invert}{ A model of \ccc{PolynomialTraits_d::Invert}.}

\ccNestedType{Translate}{ A model of \ccc{PolynomialTraits_d::Translate}.}
\ccNestedType{Translate_homogeneous}{ A model of \ccc{PolynomialTraits_d::TranslateHomogeneous}.}

\ccNestedType{Scale}{ A model of \ccc{PolynomialTraits_d::Scale}.}
\ccNestedType{Scale_homogeneous}{ A model of \ccc{PolynomialTraits_d::ScaleHomogeneous}.}
\begin{ccAdvanced}
//\ccNestedType{Scale_up}{ A model of \ccc{PolynomialTraits_d::ScaleUp, return $p(a*x)$}.}
//\ccNestedType{Scale_down}{ A model of \ccc{PolynomialTraits_d::ScaleDown, return $b^{degree}*p(x/b)$}.}
\end{ccAdvanced}

%unary operations
\ccNestedType{Make_square_free}{ A model of \ccc{PolynomialTraits_d::MakeSquareFree}.}

\ccNestedType{Square_free_factorization}{ In case \ccc{PolynomialTraits::Polynomial_d} 
        is not a model of \ccc{UFDomain}, this is of type \ccc{CGAL::Null_type},
        otherwise this is a model of \ccc{PolynomialTraits_d::SquareFreeFactorization}.}


%pseudo division
\ccNestedType{Pseudo_division          }{ A model of \ccc{PolynomialTraits_d::Pseudo_division}.}
\ccNestedType{Pseudo_division_remainder}{ A model of \ccc{PolynomialTraits_d::Pseudo_division_remainder}.}
\ccNestedType{Pseudo_division_quotient }{ A model of \ccc{PolynomialTraits_d::Pseudo_division_quotient}.}

%utcf
\ccNestedType{Gcd_up_to_constant_factor}{ A model of \ccc{PolynomialTraits_d::GcdUpToConstantFactor}.}
\ccNestedType{Integral_division_up_to_constant_factor}{ A model of \ccc{PolynomialTraits_d::IntegralDivisionUpToConstantFactor}.}
\ccNestedType{Content_up_to_constant_factor}{ A model of \ccc{PolynomialTraits_d::ContentUpToConstantFactor}.}
\ccNestedType{Square_free_factorization_up_to_constant_factor}{ A model of \ccc{PolynomialTraits_d::SquareFreeFactorizationUpToConstantFactor}.}

%resultant
\ccNestedType{Resultant}{ A model of \ccc{PolynomialTraits_d::Resultant}.}

\ccSeeAlso 

\ccRefIdfierPage{AlgebraicStructureTraits}\\
\ccRefIdfierPage{Polynomial_d}\\

\end{ccRefConcept}