

\begin{ccRefFunctionObjectConcept}{AlgebraicStructureTraits::IsSquare}

\ccDefinition

\ccc{AdaptableBinaryFunction} that computes whether the first argument is a square. 
If the first argument is a square the second argument, which is taken by reference, contains the square root. 
Otherwise, the content of the second argument is undefined. 

A ring element $x$ is said to be a square iff there exists a ring element $y$ such
that $x= y*y$. In case the ring is a \ccc{UniqueFactorizationDomain},
$y$ is uniquely defined up to multiplication by units. \\

%Note that this is an optional functor and not required by any algebraic structure concept. 

\ccRefines 

\ccc{AdaptableBinaryFunction} 

\ccTypes
\ccNestedType{result_type} 
        { Is \ccc{AlgebraicStructureTraits::Boolean}.}
\ccGlue
\ccNestedType{first_argument} 
        { Is \ccc{AlgebraicStructureTraits::Type}.}
\ccGlue
\ccNestedType{second_argument} 
        { Is \ccc{AlgebraicStructureTraits::Type&}.}

\ccOperations
\ccCreationVariable{is_square}
\ccThree{xxxxxxxxxxx}{xxxxxxxxxxx}{}

\ccMethod{result_type operator()(first_argument_type  x, 
                                 second_argument_type y);}
        { returns {\tt true} in case $x$ is a square, i.e. $x = y*y$.
          \ccPostcond $unit\_part(y) == 1$. 
        }
\ccMethod{result_type operator()(first_argument_type  x);}
        { returns {\tt true} in case $x$ is a square.
        }

%\ccHasModels

\ccSeeAlso

\ccRefIdfierPage{AlgebraicStructureTraits}

\end{ccRefFunctionObjectConcept} 
