# NAME

` Math::Cephes::Complex - Perl interface to the cephes complex number routines`

# SYNOPSIS

```
use Math::Cephes::Complex qw(cmplx);
my $z1 = cmplx(2,3); # $z1 = 2 + 3 i
my $z2 = cmplx(3,4); # $z2 = 3 + 4 i
my $z3 = $z1->radd($z2); # $z3 = $z1 + $z2
```

# DESCRIPTION

This module is a layer on top of the basic routines in the cephes math library to handle complex numbers. A complex number is created via any of the following syntaxes:

```
my $f = Math::Cephes::Complex->new(3, 2); # $f = 3 + 2 i
my $g = new Math::Cephes::Complex(5, 3); # $g = 5 + 3 i
my $h = cmplx(7, 5); # $h = 7 + 5 i
```

the last one being available by importing *cmplx*. If no arguments are specified, as in

` my $h = cmplx();`

then the defaults $z = 0 + 0 i are assumed. The real and imaginary part of a complex number are represented respectively by

` $f->{r}; $f->{i};`

or, as methods,

` $f->r; $f->i;`

and can be set according to

` $f->{r} = 4; $f->{i} = 9;`

or, again, as methods,

` $f->r(4); $f->i(9);`

The complex number can be printed out as

` print $f->as_string;`

A summary of the usage is as follows.

*csin*: Complex circular sine-
`SYNOPSIS: # void csin(); # cmplx z, w; $z = cmplx(2, 3); # $z = 2 + 3 i $w = $z->csin; print $w->{r}, ' ', $w->{i}; # prints real and imaginary parts of $w print $w->as_string; # prints $w as Re($w) + i Im($w) DESCRIPTION: If z = x + iy, then w = sin x cosh y + i cos x sinh y.`

*ccos*: Complex circular cosine-
`SYNOPSIS: # void ccos(); # cmplx z, w; $z = cmplx(2, 3); # $z = 2 + 3 i $w = $z->ccos; print $w->{r}, ' ', $w->{i}; # prints real and imaginary parts of $w print $w->as_string; # prints $w as Re($w) + i Im($w) DESCRIPTION: If z = x + iy, then w = cos x cosh y - i sin x sinh y.`

*ctan*: Complex circular tangent-
`SYNOPSIS: # void ctan(); # cmplx z, w; $z = cmplx(2, 3); # $z = 2 + 3 i $w = $z->ctan; print $w->{r}, ' ', $w->{i}; # prints real and imaginary parts of $w print $w->as_string; # prints $w as Re($w) + i Im($w) DESCRIPTION: If z = x + iy, then sin 2x + i sinh 2y w = --------------------. cos 2x + cosh 2y On the real axis the denominator is zero at odd multiples of PI/2. The denominator is evaluated by its Taylor series near these points.`

*ccot*: Complex circular cotangent-
`SYNOPSIS: # void ccot(); # cmplx z, w; $z = cmplx(2, 3); # $z = 2 + 3 i $w = $z->ccot; print $w->{r}, ' ', $w->{i}; # prints real and imaginary parts of $w print $w->as_string; # prints $w as Re($w) + i Im($w) DESCRIPTION: If z = x + iy, then sin 2x - i sinh 2y w = --------------------. cosh 2y - cos 2x On the real axis, the denominator has zeros at even multiples of PI/2. Near these points it is evaluated by a Taylor series.`

*casin*: Complex circular arc sine-
`SYNOPSIS: # void casin(); # cmplx z, w; $z = cmplx(2, 3); # $z = 2 + 3 i $w = $z->casin; print $w->{r}, ' ', $w->{i}; # prints real and imaginary parts of $w print $w->as_string; # prints $w as Re($w) + i Im($w) DESCRIPTION: Inverse complex sine: 2 w = -i clog( iz + csqrt( 1 - z ) ).`

*cacos*: Complex circular arc cosine-
`SYNOPSIS: # void cacos(); # cmplx z, w; $z = cmplx(2, 3); # $z = 2 + 3 i $w = $z->cacos; print $w->{r}, ' ', $w->{i}; # prints real and imaginary parts of $w print $w->as_string; # prints $w as Re($w) + i Im($w) DESCRIPTION: w = arccos z = PI/2 - arcsin z.`

*catan*: Complex circular arc tangent-
`SYNOPSIS: # void catan(); # cmplx z, w; $z = cmplx(2, 3); # $z = 2 + 3 i $w = $z->catan; print $w->{r}, ' ', $w->{i}; # prints real and imaginary parts of $w print $w->as_string; # prints $w as Re($w) + i Im($w) DESCRIPTION: If z = x + iy, then 1 ( 2x ) Re w = - arctan(-----------) + k PI 2 ( 2 2) (1 - x - y ) ( 2 2) 1 (x + (y+1) ) Im w = - log(------------) 4 ( 2 2) (x + (y-1) ) Where k is an arbitrary integer.`

*csinh*: Complex hyperbolic sine-
`SYNOPSIS: # void csinh(); # cmplx z, w; $z = cmplx(2, 3); # $z = 2 + 3 i $w = $z->csinh; print $w->{r}, ' ', $w->{i}; # prints real and imaginary parts of $w print $w->as_string; # prints $w as Re($w) + i Im($w) DESCRIPTION: csinh z = (cexp(z) - cexp(-z))/2 = sinh x * cos y + i cosh x * sin y .`

*casinh*: Complex inverse hyperbolic sine-
`SYNOPSIS: # void casinh(); # cmplx z, w; $z = cmplx(2, 3); # $z = 2 + 3 i $w = $z->casinh; print $w->{r}, ' ', $w->{i}; # prints real and imaginary parts of $w print $w->as_string; # prints $w as Re($w) + i Im($w) DESCRIPTION: casinh z = -i casin iz .`

*ccosh*: Complex hyperbolic cosine-
`SYNOPSIS: # void ccosh(); # cmplx z, w; $z = cmplx(2, 3); # $z = 2 + 3 i $w = $z->ccosh; print $w->{r}, ' ', $w->{i}; # prints real and imaginary parts of $w print $w->as_string; # prints $w as Re($w) + i Im($w) DESCRIPTION: ccosh(z) = cosh x cos y + i sinh x sin y .`

*cacosh*: Complex inverse hyperbolic cosine-
`SYNOPSIS: # void cacosh(); # cmplx z, w; $z = cmplx(2, 3); # $z = 2 + 3 i $w = $z->cacosh; print $w->{r}, ' ', $w->{i}; # prints real and imaginary parts of $w print $w->as_string; # prints $w as Re($w) + i Im($w) DESCRIPTION: acosh z = i acos z .`

*ctanh*: Complex hyperbolic tangent-
`SYNOPSIS: # void ctanh(); # cmplx z, w; $z = cmplx(2, 3); # $z = 2 + 3 i $w = $z->ctanh; print $w->{r}, ' ', $w->{i}; # prints real and imaginary parts of $w print $w->as_string; # prints $w as Re($w) + i Im($w) DESCRIPTION: tanh z = (sinh 2x + i sin 2y) / (cosh 2x + cos 2y) .`

*catanh*: Complex inverse hyperbolic tangent-
`SYNOPSIS: # void catanh(); # cmplx z, w; $z = cmplx(2, 3); # $z = 2 + 3 i $w = $z->catanh; print $w->{r}, ' ', $w->{i}; # prints real and imaginary parts of $w print $w->as_string; # prints $w as Re($w) + i Im($w) DESCRIPTION: Inverse tanh, equal to -i catan (iz);`

*cpow*: Complex power function-
`SYNOPSIS: # void cpow(); # cmplx a, z, w; $a = cmplx(5, 6); # $z = 5 + 6 i $z = cmplx(2, 3); # $z = 2 + 3 i $w = $a->cpow($z); print $w->{r}, ' ', $w->{i}; # prints real and imaginary parts of $w print $w->as_string; # prints $w as Re($w) + i Im($w) DESCRIPTION: Raises complex A to the complex Zth power. Definition is per AMS55 # 4.2.8, analytically equivalent to cpow(a,z) = cexp(z clog(a)).`

*cmplx*: Complex number arithmetic-
`SYNOPSIS: # typedef struct { # double r; real part # double i; imaginary part # }cmplx; # cmplx *a, *b, *c; $a = cmplx(3, 5); # $a = 3 + 5 i $b = cmplx(2, 3); # $b = 2 + 3 i $c = $a->cadd( $b ); # c = a + b $c = $a->csub( $b ); # c = a - b $c = $a->cmul( $b ); # c = a * b $c = $a->cdiv( $b ); # c = a / b $c = $a->cneg; # c = -a $c = $a->cmov; # c = a print $c->{r}, ' ', $c->{i}; # prints real and imaginary parts of $c print $c->as_string; # prints $c as Re($c) + i Im($c) DESCRIPTION: Addition: c.r = b.r + a.r c.i = b.i + a.i Subtraction: c.r = b.r - a.r c.i = b.i - a.i Multiplication: c.r = b.r * a.r - b.i * a.i c.i = b.r * a.i + b.i * a.r Division: d = a.r * a.r + a.i * a.i c.r = (b.r * a.r + b.i * a.i)/d c.i = (b.i * a.r - b.r * a.i)/d`

*cabs*: Complex absolute value-
`SYNOPSIS: # double a, cabs(); # cmplx z; $z = cmplx(2, 3); # $z = 2 + 3 i $a = cabs( $z ); DESCRIPTION: If z = x + iy then a = sqrt( x**2 + y**2 ). Overflow and underflow are avoided by testing the magnitudes of x and y before squaring. If either is outside half of the floating point full scale range, both are rescaled.`

*csqrt*: Complex square root-
`SYNOPSIS: # void csqrt(); # cmplx z, w; $z = cmplx(2, 3); # $z = 2 + 3 i $w = $z->csqrt; print $w->{r}, ' ', $w->{i}; # prints real and imaginary parts of $w print $w->as_string; # prints $w as Re($w) + i Im($w) DESCRIPTION: If z = x + iy, r = |z|, then 1/2 Im w = [ (r - x)/2 ] , Re w = y / 2 Im w. Note that -w is also a square root of z. The root chosen is always in the upper half plane. Because of the potential for cancellation error in r - x, the result is sharpened by doing a Heron iteration (see sqrt.c) in complex arithmetic.`

# BUGS

` Please report any to Randy Kobes <randy@theoryx5.uwinnipeg.ca>`

# SEE ALSO

For the basic interface to the cephes complex number routines, see Math::Cephes. See also Math::Complex for a more extensive interface to complex number routines.

# COPYRIGHT

The C code for the Cephes Math Library is Copyright 1984, 1987, 1989, 2002 by Stephen L. Moshier, and is available at http://www.netlib.org/cephes/. Direct inquiries to 30 Frost Street, Cambridge, MA 02140.

The perl interface is copyright 2000, 2002 by Randy Kobes. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.