\begin{ccRefConcept}{PolynomialTraits_d::SquareFreeFactorize}

\ccDefinition

This \ccc{Functor} 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 pairs $(g_i,m_i)$ are written into the given output iterator.\\

This functor is well defined if \ccc{PolynomialTraits_d::Polynomial_d} is a 
\ccc{UniqueFactorizationDomain}. 
        
\ccRefines 

Assignable\\
CopyConstructible\\
DefaultConstructible\\

%\ccTypes

\ccOperations

\ccSetThreeColumns{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}{xxx}{}
\ccCreationVariable{sqff}

\ccMethod{template<class OutputIterator>
OutputIterator operator()(PolynomialTraits_d::Polynomial_d  p,
                          OutputIterator                    it,
                          PolynomialTraits_d::Innermost_coefficient& a);}
{ computes square-free factorization of $p$.\\
  The \ccc{OutputIterator} must allow the value type  
   \ccc{std::pair<PolynomialTraits_d::Polynomial_d,int>}.
}

\ccMethod{template<class OutputIterator>
OutputIterator operator()(PolynomialTraits_d::Polynomial_d  p,
                          OutputIterator                   it,
                          PolynomialTraits_d::Innermost_coefficient& a);}
{ As the first operator, just not computing the factor $a$. }

%\ccHasModels

\ccSeeAlso

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

\end{ccRefConcept}
