\begin{ccRefConcept}{PolynomialTraits_d::SquareFreeFactorize}

\ccDefinition

This \ccc{AdaptableFunctor} computes a square-free factorization 
of a \ccc{PolynomialTraits_d::Polynomial_d}. 

A polynomial $p$ is factored into square-free and pairwise coprime non-constant
factors $g_i$ with multiplicities $m_i$ and a constant factor $a$, such that 
$p = a  \cdot  g_1m_1  \cdot  ...  \cdot  g_nm_n$.

The provided operator returns the number of factors $n$.
The factors $g_i$ and multiplicities $m_i$ are written through 
the respective output iterators.\\

          
\ccRefines 

\ccTypes
\ccTypedef{typedef int   result_type;}{}

\ccOperations

\ccSetThreeColumns{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}{xxx}{}
\ccCreationVariable{square_free_factorization}

\ccMethod{template<class OutputIterator_1, class OutputIterator_2>
int operator()(PolynomialTraits_d::Polynomial_d  p,
               OutputIterator_1 it_1,
               OutputIterator_2 it_2);}
{ computes square-free factorization of $p$.\\
  \ccPrecond \ccc{OutputIterator_1} must allow the value type 
  \ccc{PolynomialTraits_d::Polynomial_d}. 
  \ccPrecond \ccc{OutputIterator_2} must allow the value type int.
}

\ccMethod{template<class OutputIterator_1, class OutputIterator_2>
int operator()(PolynomialTraits_d::Polynomial_d  p,
               OutputIterator_1 it_1,
               OutputIterator_2 it_2, 
               PolynomialTraits_d::Innermost_coefficient& a);}
{ computes square-free factorization of $p$.\\
  \ccPrecond \ccc{OutputIterator_1} must allow the value type 
  \ccc{PolynomialTraits_d::Polynomial_d}. 
  \ccPrecond \ccc{OutputIterator_2} must allow the value type int.
}

%\ccHasModels

\ccSeeAlso

\ccRefIdfierPage{Polynomial_d}\\
\ccRefIdfierPage{PolynomialTraits_d}\\
\ccRefIdfierPage{PolynomialTraits_d::SquareFreeFactorizeUpToConstantFactor}\\
\ccRefIdfierPage{PolynomialTraits_d::MakeSquareFree}\\

\end{ccRefConcept}
