@cindex complex numbers

The functions described in this chapter provide support for complex
numbers.  The algorithms take care to avoid unnecessary intermediate
underflows and overflows, allowing the functions to be evaluated over 
as much of the complex plane as possible. 

@comment FIXME: this still needs to be
@comment done for the csc,sec,cot,csch,sech,coth functions

For multiple-valued functions the branch cuts have been chosen to follow
the conventions of Abramowitz and Stegun in the @cite{Handbook of
Mathematical Functions}. The functions return principal values which are
the same as those in GNU Calc, which in turn are the same as those in
@cite{Common Lisp, The Language (Second Edition)}@footnote{Note that the
first edition uses different definitions.} and the HP-28/48 series of
calculators.

The complex types are defined in the header file @file{gsl_complex.h},
while the corresponding complex functions and arithmetic operations are
defined in @file{gsl_complex_math.h}.

@menu
* Complex numbers::             
* Properties of complex numbers::  
* Complex arithmetic operators::  
* Elementary Complex Functions::  
* Complex Trigonometric Functions::  
* Inverse Complex Trigonometric Functions::  
* Complex Hyperbolic Functions::  
* Inverse Complex Hyperbolic Functions::  
* Complex Number References and Further Reading::  
@end menu

@node Complex numbers
@section Complex numbers
@cindex representations of complex numbers
@cindex polar form of complex numbers
@tpindex gsl_complex

Complex numbers are represented using the type @code{gsl_complex}. The
internal representation of this type may vary across platforms and
should not be accessed directly. The functions and macros described
below allow complex numbers to be manipulated in a portable way.

For reference, the default form of the @code{gsl_complex} type is
given by the following struct,

@example
typedef struct
@{
  double dat[2];
@} gsl_complex;
@end example

@noindent
The real and imaginary part are stored in contiguous elements of a two
element array. This eliminates any padding between the real and
imaginary parts, @code{dat[0]} and @code{dat[1]}, allowing the struct to
be mapped correctly onto packed complex arrays.

@deftypefun gsl_complex gsl_complex_rect (double @var{x}, double @var{y})
This function uses the rectangular cartesian components
(@var{x},@var{y}) to return the complex number @math{z = x + i y}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_polar (double @var{r}, double @var{theta})
This function returns the complex number @math{z = r \exp(i \theta) = r
(\cos(\theta) + i \sin(\theta))} from the polar representation
(@var{r},@var{theta}).
@end deftypefun

@defmac GSL_REAL (@var{z})
@defmacx GSL_IMAG (@var{z})
These macros return the real and imaginary parts of the complex number
@var{z}.
@end defmac

@defmac GSL_SET_COMPLEX (@var{zp}, @var{x}, @var{y})
This macro uses the cartesian components (@var{x},@var{y}) to set the
real and imaginary parts of the complex number pointed to by @var{zp}.
For example,

@example
GSL_SET_COMPLEX(&z, 3, 4)
@end example

@noindent
sets @var{z} to be @math{3 + 4i}.
@end defmac

@defmac GSL_SET_REAL (@var{zp},@var{x})
@defmacx GSL_SET_IMAG (@var{zp},@var{y})
These macros allow the real and imaginary parts of the complex number
pointed to by @var{zp} to be set independently.
@end defmac

@node Properties of complex numbers
@section Properties of complex numbers

@deftypefun double gsl_complex_arg (gsl_complex @var{z})
@cindex argument of complex number 
This function returns the argument of the complex number @var{z},
@math{\arg(z)}, where @c{$-\pi < \arg(z) \leq \pi$}
@math{-\pi < \arg(z) <= \pi}.
@end deftypefun

@deftypefun double gsl_complex_abs (gsl_complex @var{z})
@cindex magnitude of complex number 
This function returns the magnitude of the complex number @var{z}, @math{|z|}.
@end deftypefun

@deftypefun double gsl_complex_abs2 (gsl_complex @var{z})
This function returns the squared magnitude of the complex number
@var{z}, @math{|z|^2}.
@end deftypefun

@deftypefun double gsl_complex_logabs (gsl_complex @var{z})
This function returns the natural logarithm of the magnitude of the
complex number @var{z}, @math{\log|z|}.  It allows an accurate
evaluation of @math{\log|z|} when @math{|z|} is close to one. The direct
evaluation of @code{log(gsl_complex_abs(z))} would lead to a loss of
precision in this case.
@end deftypefun


@node Complex arithmetic operators
@section Complex arithmetic operators
@cindex complex arithmetic

@deftypefun gsl_complex gsl_complex_add (gsl_complex @var{a}, gsl_complex @var{b})
This function returns the sum of the complex numbers @var{a} and
@var{b}, @math{z=a+b}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_sub (gsl_complex @var{a}, gsl_complex @var{b})
This function returns the difference of the complex numbers @var{a} and
@var{b}, @math{z=a-b}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_mul (gsl_complex @var{a}, gsl_complex @var{b})
This function returns the product of the complex numbers @var{a} and
@var{b}, @math{z=ab}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_div (gsl_complex @var{a}, gsl_complex @var{b})
This function returns the quotient of the complex numbers @var{a} and
@var{b}, @math{z=a/b}.
@end deftypefun


@deftypefun gsl_complex gsl_complex_add_real (gsl_complex @var{a}, double @var{x})
This function returns the sum of the complex number @var{a} and the
real number @var{x}, @math{z=a+x}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_sub_real (gsl_complex @var{a}, double @var{x})
This function returns the difference of the complex number @var{a} and the
real number @var{x}, @math{z=a-x}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_mul_real (gsl_complex @var{a}, double @var{x})
This function returns the product of the complex number @var{a} and the
real number @var{x}, @math{z=ax}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_div_real (gsl_complex @var{a}, double @var{x})
This function returns the quotient of the complex number @var{a} and the
real number @var{x}, @math{z=a/x}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_add_imag (gsl_complex @var{a}, double @var{y})
This function returns the sum of the complex number @var{a} and the
imaginary number @math{i}@var{y}, @math{z=a+iy}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_sub_imag (gsl_complex @var{a}, double @var{y})
This function returns the difference of the complex number @var{a} and the
imaginary number @math{i}@var{y}, @math{z=a-iy}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_mul_imag (gsl_complex @var{a}, double @var{y})
This function returns the product of the complex number @var{a} and the
imaginary number @math{i}@var{y}, @math{z=a*(iy)}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_div_imag (gsl_complex @var{a}, double @var{y})
This function returns the quotient of the complex number @var{a} and the
imaginary number @math{i}@var{y}, @math{z=a/(iy)}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_conjugate (gsl_complex @var{z})
@cindex conjugate of complex number
This function returns the complex conjugate of the complex number
@var{z}, @math{z^* = x - i y}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_inverse (gsl_complex @var{z})
This function returns the inverse, or reciprocal, of the complex number
@var{z}, @math{1/z = (x - i y)/(x^2 + y^2)}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_negative (gsl_complex @var{z})
This function returns the negative of the complex number
@var{z}, @math{-z = (-x) + i(-y)}.
@end deftypefun


@node Elementary Complex Functions
@section Elementary Complex Functions

@deftypefun gsl_complex gsl_complex_sqrt (gsl_complex @var{z})
@cindex square root of complex number
This function returns the square root of the complex number @var{z},
@math{\sqrt z}. The branch cut is the negative real axis. The result
always lies in the right half of the complex plane.
@end deftypefun

@deftypefun gsl_complex gsl_complex_sqrt_real (double @var{x})
This function returns the complex square root of the real number
@var{x}, where @var{x} may be negative.
@end deftypefun


@deftypefun gsl_complex gsl_complex_pow (gsl_complex @var{z}, gsl_complex @var{a})
@cindex power of complex number
@cindex exponentiation of complex number
The function returns the complex number @var{z} raised to the complex
power @var{a}, @math{z^a}. This is computed as @math{\exp(\log(z)*a)}
using complex logarithms and complex exponentials.
@end deftypefun

@deftypefun gsl_complex gsl_complex_pow_real (gsl_complex @var{z}, double @var{x})
This function returns the complex number @var{z} raised to the real
power @var{x}, @math{z^x}.
@end deftypefun


@deftypefun gsl_complex gsl_complex_exp (gsl_complex @var{z})
This function returns the complex exponential of the complex number
@var{z}, @math{\exp(z)}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_log (gsl_complex @var{z})
@cindex logarithm of complex number
This function returns the complex natural logarithm (base @math{e}) of
the complex number @var{z}, @math{\log(z)}.  The branch cut is the
negative real axis. 
@end deftypefun

@deftypefun gsl_complex gsl_complex_log10 (gsl_complex @var{z})
This function returns the complex base-10 logarithm of
the complex number @var{z}, @c{$\log_{10}(z)$}
@math{\log_10 (z)}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_log_b (gsl_complex @var{z}, gsl_complex @var{b})
This function returns the complex base-@var{b} logarithm of the complex
number @var{z}, @math{\log_b(z)}. This quantity is computed as the ratio
@math{\log(z)/\log(b)}.
@end deftypefun


@node Complex Trigonometric Functions
@section Complex Trigonometric Functions
@cindex trigonometric functions of complex numbers

@deftypefun gsl_complex gsl_complex_sin (gsl_complex @var{z})
@cindex sin, of complex number
This function returns the complex sine of the complex number @var{z},
@math{\sin(z) = (\exp(iz) - \exp(-iz))/(2i)}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_cos (gsl_complex @var{z})
@cindex cosine of complex number
This function returns the complex cosine of the complex number @var{z},
@math{\cos(z) = (\exp(iz) + \exp(-iz))/2}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_tan (gsl_complex @var{z})
@cindex tangent of complex number
This function returns the complex tangent of the complex number @var{z},
@math{\tan(z) = \sin(z)/\cos(z)}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_sec (gsl_complex @var{z})
This function returns the complex secant of the complex number @var{z},
@math{\sec(z) = 1/\cos(z)}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_csc (gsl_complex @var{z})
This function returns the complex cosecant of the complex number @var{z},
@math{\csc(z) = 1/\sin(z)}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_cot (gsl_complex @var{z})
This function returns the complex cotangent of the complex number @var{z},
@math{\cot(z) = 1/\tan(z)}.
@end deftypefun


@node Inverse Complex Trigonometric Functions
@section Inverse Complex Trigonometric Functions
@cindex inverse complex trigonometric functions

@deftypefun gsl_complex gsl_complex_arcsin (gsl_complex @var{z})
This function returns the complex arcsine of the complex number @var{z},
@math{\arcsin(z)}. The branch cuts are on the real axis, less than @math{-1}
and greater than @math{1}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_arcsin_real (double @var{z})
This function returns the complex arcsine of the real number @var{z},
@math{\arcsin(z)}. For @math{z} between @math{-1} and @math{1}, the
function returns a real value in the range @math{[-\pi/2,\pi/2]}. For
@math{z} less than @math{-1} the result has a real part of @math{-\pi/2}
and a positive imaginary part.  For @math{z} greater than @math{1} the
result has a real part of @math{\pi/2} and a negative imaginary part.
@end deftypefun

@deftypefun gsl_complex gsl_complex_arccos (gsl_complex @var{z})
This function returns the complex arccosine of the complex number @var{z},
@math{\arccos(z)}. The branch cuts are on the real axis, less than @math{-1}
and greater than @math{1}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_arccos_real (double @var{z})
This function returns the complex arccosine of the real number @var{z},
@math{\arccos(z)}. For @math{z} between @math{-1} and @math{1}, the
function returns a real value in the range @math{[0,\pi]}. For @math{z}
less than @math{-1} the result has a real part of @math{\pi} and a
negative imaginary part.  For @math{z} greater than @math{1} the result
is purely imaginary and positive.
@end deftypefun

@deftypefun gsl_complex gsl_complex_arctan (gsl_complex @var{z})
This function returns the complex arctangent of the complex number
@var{z}, @math{\arctan(z)}. The branch cuts are on the imaginary axis,
below @math{-i} and above @math{i}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_arcsec (gsl_complex @var{z})
This function returns the complex arcsecant of the complex number @var{z},
@math{\arcsec(z) = \arccos(1/z)}. 
@end deftypefun

@deftypefun gsl_complex gsl_complex_arcsec_real (double @var{z})
This function returns the complex arcsecant of the real number @var{z},
@math{\arcsec(z) = \arccos(1/z)}. 
@end deftypefun

@deftypefun gsl_complex gsl_complex_arccsc (gsl_complex @var{z})
This function returns the complex arccosecant of the complex number @var{z},
@math{\arccsc(z) = \arcsin(1/z)}. 
@end deftypefun

@deftypefun gsl_complex gsl_complex_arccsc_real (double @var{z})
This function returns the complex arccosecant of the real number @var{z},
@math{\arccsc(z) = \arcsin(1/z)}. 
@end deftypefun

@deftypefun gsl_complex gsl_complex_arccot (gsl_complex @var{z})
This function returns the complex arccotangent of the complex number @var{z},
@math{\arccot(z) = \arctan(1/z)}. 
@end deftypefun


@node Complex Hyperbolic Functions
@section Complex Hyperbolic Functions
@cindex hyperbolic functions, complex numbers

@deftypefun gsl_complex gsl_complex_sinh (gsl_complex @var{z})
This function returns the complex hyperbolic sine of the complex number
@var{z}, @math{\sinh(z) = (\exp(z) - \exp(-z))/2}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_cosh (gsl_complex @var{z})
This function returns the complex hyperbolic cosine of the complex number
@var{z}, @math{\cosh(z) = (\exp(z) + \exp(-z))/2}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_tanh (gsl_complex @var{z})
This function returns the complex hyperbolic tangent of the complex number
@var{z}, @math{\tanh(z) = \sinh(z)/\cosh(z)}.
@end deftypefun


@deftypefun gsl_complex gsl_complex_sech (gsl_complex @var{z})
This function returns the complex hyperbolic secant of the complex
number @var{z}, @math{\sech(z) = 1/\cosh(z)}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_csch (gsl_complex @var{z})
This function returns the complex hyperbolic cosecant of the complex
number @var{z}, @math{\csch(z) = 1/\sinh(z)}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_coth (gsl_complex @var{z})
This function returns the complex hyperbolic cotangent of the complex
number @var{z}, @math{\coth(z) = 1/\tanh(z)}.
@end deftypefun


@node Inverse Complex Hyperbolic Functions
@section Inverse Complex Hyperbolic Functions
@cindex inverse hyperbolic functions, complex numbers

@deftypefun gsl_complex gsl_complex_arcsinh (gsl_complex @var{z})
This function returns the complex hyperbolic arcsine of the
complex number @var{z}, @math{\arcsinh(z)}.  The branch cuts are on the
imaginary axis, below @math{-i} and above @math{i}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_arccosh (gsl_complex @var{z})
This function returns the complex hyperbolic arccosine of the complex
number @var{z}, @math{\arccosh(z)}.  The branch cut is on the real
axis, less than @math{1}.  Note that in this case we use the negative
square root in formula 4.6.21 of Abramowitz & Stegun giving
@c{$\arccosh(z)=\log(z-\sqrt{z^2-1})$}
@math{\arccosh(z)=\log(z-\sqrt@{z^2-1@})}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_arccosh_real (double @var{z})
This function returns the complex hyperbolic arccosine of
the real number @var{z}, @math{\arccosh(z)}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_arctanh (gsl_complex @var{z})
This function returns the complex hyperbolic arctangent of the complex
number @var{z}, @math{\arctanh(z)}.  The branch cuts are on the real
axis, less than @math{-1} and greater than @math{1}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_arctanh_real (double @var{z})
This function returns the complex hyperbolic arctangent of the real
number @var{z}, @math{\arctanh(z)}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_arcsech (gsl_complex @var{z})
This function returns the complex hyperbolic arcsecant of the complex
number @var{z}, @math{\arcsech(z) = \arccosh(1/z)}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_arccsch (gsl_complex @var{z})
This function returns the complex hyperbolic arccosecant of the complex
number @var{z}, @math{\arccsch(z) = \arcsin(1/z)}.
@end deftypefun

@deftypefun gsl_complex gsl_complex_arccoth (gsl_complex @var{z})
This function returns the complex hyperbolic arccotangent of the complex
number @var{z}, @math{\arccoth(z) = \arctanh(1/z)}.
@end deftypefun

@node Complex Number References and Further Reading
@section References and Further Reading

The implementations of the elementary and trigonometric functions are
based on the following papers,

@itemize @asis
@item
T. E. Hull, Thomas F. Fairgrieve, Ping Tak Peter Tang,
``Implementing Complex Elementary Functions Using Exception
Handling'', @cite{ACM Transactions on Mathematical Software}, Volume 20
(1994), pp 215--244, Corrigenda, p553

@item
T. E. Hull, Thomas F. Fairgrieve, Ping Tak Peter Tang,
``Implementing the complex arcsin and arccosine functions using exception
handling'', @cite{ACM Transactions on Mathematical Software}, Volume 23
(1997) pp 299--335
@end itemize

@noindent
The general formulas and details of branch cuts can be found in the
following books,

@itemize @asis
@item
Abramowitz and Stegun, @cite{Handbook of Mathematical Functions},
``Circular Functions in Terms of Real and Imaginary Parts'', Formulas
4.3.55--58,
``Inverse Circular Functions in Terms of Real and Imaginary Parts'',
Formulas 4.4.37--39,
``Hyperbolic Functions in Terms of Real and Imaginary Parts'',
Formulas 4.5.49--52,
``Inverse Hyperbolic Functions---relation to Inverse Circular Functions'',
Formulas 4.6.14--19.

@item
Dave Gillespie, @cite{Calc Manual}, Free Software Foundation, ISBN
1-882114-18-3
@end itemize
