# ifndef CPPAD_POW_INT_INCLUDED # define CPPAD_POW_INT_INCLUDED /* -------------------------------------------------------------------------- CppAD: C++ Algorithmic Differentiation: Copyright (C) 2003-07 Bradley M. Bell CppAD is distributed under multiple licenses. This distribution is under the terms of the Common Public License Version 1.0. A copy of this license is included in the COPYING file of this distribution. Please visit http://www.coin-or.org/CppAD/ for information on other licenses. -------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------------- $begin pow_int$$ $spell cppad.hpp CppAD namespace const $$ $index pow, integer$$ $index exponent, integer$$ $index integer, pow$$ $section The Integer Power Function$$ $head Syntax$$ $code # include $$ $pre $$ $syntax%%z% = pow(%x%, %y%)%$$ $head Purpose$$ Determines the value of the power function $latex \[ {\rm pow} (x, y) = x^y \] $$ for integer exponents $italic n$$ using multiplication and possibly division to compute the value. The other CppAD $cref/pow/$$ function may use logarithms and exponentiation to compute derivatives of the same value (which will not work if $italic x$$ is less than or equal zero). $head Include$$ The file $code cppad/pow_int.h$$ is included by $code cppad/cppad.hpp$$ but it can also be included separately with out the rest of the $code CppAD$$ routines. Including this file defines this version of the $code pow$$ within the $code CppAD$$ namespace. $head x$$ The argument $italic x$$ has prototype $syntax% const %Type% &%x% %$$ $head y$$ The argument $italic y$$ has prototype $syntax% int %y% %$$ $head z$$ The result $italic z$$ has prototype $syntax% %Type% %z% %$$ $head Type$$ The type $italic Type$$ must support the following operations where $italic a$$ and $italic b$$ are $italic Type$$ objects and $italic i$$ is an $code int$$: $table $bold Operation$$ $pre $$ $cnext $bold Description$$ $cnext $bold Result Type$$ $rnext $syntax%%Type% %a%(%i%)%$$ $cnext construction of a $italic Type$$ object from an $code int$$ $cnext $italic Type$$ $rnext $syntax%%a% * %b%$$ $cnext binary multiplication of $italic Type$$ objects $cnext $italic Type$$ $rnext $syntax%%a% / %b%$$ $cnext binary division of $italic Type$$ objects $cnext $italic Type$$ $tend $head Operation Sequence$$ The $italic Type$$ operation sequence used to calculate $italic z$$ is $xref/glossary/Operation/Independent/independent/1/$$ of $italic x$$. $end ------------------------------------------------------------------------------- */ namespace CppAD { template inline Type pow (const Type &x, const int &n) { Type p(1); int n2 = n / 2; if( n == 0 ) return p; if( n < 0 ) return p / pow(x, -n); if( n == 1 ) return x; // p = (x^2)^(n/2) p = pow( x * x , n2 ); // n is even case if( n % 2 == 0 ) return p; // n is odd case return p * x; } } # endif