2 # Complex numbers and associated mathematical functions
3 # -- Raphael Manfredi Since Sep 1996
4 # -- Jarkko Hietaniemi Since Mar 1997
5 # -- Daniel S. Lewart Since Sep 1997
12 our($VERSION, @ISA, @EXPORT, %EXPORT_TAGS, $Inf);
15 unless ($^O eq 'unicosmk') {
17 # We do want an arithmetic overflow.
18 eval '$Inf = CORE::exp(CORE::exp(30))';
19 $! = $e; # Clear ERANGE.
20 undef $Inf unless $Inf =~ /^inf(?:inity)?$/i; # Inf INF inf Infinity
22 $Inf = "Inf" if !defined $Inf || !($Inf > 0); # Desperation.
37 csc cosec sec cot cotan
39 acsc acosec asec acot acotan
41 csch cosech sech coth cotanh
43 acsch acosech asech acoth acotanh
82 my %DISPLAY_FORMAT = ('style' => 'cartesian',
83 'polar_pretty_print' => 1);
84 my $eps = 1e-14; # Epsilon
87 # Object attributes (internal):
88 # cartesian [real, imaginary] -- cartesian form
89 # polar [rho, theta] -- polar form
90 # c_dirty cartesian form not up-to-date
91 # p_dirty polar form not up-to-date
92 # display display format (package's global when not set)
95 # Die on bad *make() arguments.
98 die "@{[(caller(1))[3]]}: Cannot take $_[0] of $_[1].\n";
104 # Create a new complex number (cartesian form)
107 my $self = bless {}, shift;
111 if ( $rre eq ref $self ) {
114 _cannot_make("real part", $rre);
119 if ( $rim eq ref $self ) {
122 _cannot_make("imaginary part", $rim);
125 $self->{'cartesian'} = [ $re, $im ];
126 $self->{c_dirty} = 0;
127 $self->{p_dirty} = 1;
128 $self->display_format('cartesian');
135 # Create a new complex number (exponential form)
138 my $self = bless {}, shift;
139 my ($rho, $theta) = @_;
142 if ( $rrh eq ref $self ) {
145 _cannot_make("rho", $rrh);
148 my $rth = ref $theta;
150 if ( $rth eq ref $self ) {
151 $theta = theta($theta);
153 _cannot_make("theta", $rth);
158 $theta = ($theta <= 0) ? $theta + pi() : $theta - pi();
160 $self->{'polar'} = [$rho, $theta];
161 $self->{p_dirty} = 0;
162 $self->{c_dirty} = 1;
163 $self->display_format('polar');
167 sub new { &make } # For backward compatibility only.
172 # Creates a complex number from a (re, im) tuple.
173 # This avoids the burden of writing Math::Complex->make(re, im).
177 return __PACKAGE__->make($re, defined $im ? $im : 0);
183 # Creates a complex number from a (rho, theta) tuple.
184 # This avoids the burden of writing Math::Complex->emake(rho, theta).
187 my ($rho, $theta) = @_;
188 return __PACKAGE__->emake($rho, defined $theta ? $theta : 0);
194 # The number defined as pi = 180 degrees
196 sub pi () { 4 * CORE::atan2(1, 1) }
203 sub pit2 () { 2 * pi }
210 sub pip2 () { pi / 2 }
215 # One degree in radians, used in stringify_polar.
218 sub deg1 () { pi / 180 }
225 sub uplog10 () { 1 / CORE::log(10) }
230 # The number defined as i*i = -1;
235 $i->{'cartesian'} = [0, 1];
236 $i->{'polar'} = [1, pip2];
250 # Attribute access/set routines
253 sub cartesian {$_[0]->{c_dirty} ?
254 $_[0]->update_cartesian : $_[0]->{'cartesian'}}
255 sub polar {$_[0]->{p_dirty} ?
256 $_[0]->update_polar : $_[0]->{'polar'}}
258 sub set_cartesian { $_[0]->{p_dirty}++; $_[0]->{'cartesian'} = $_[1] }
259 sub set_polar { $_[0]->{c_dirty}++; $_[0]->{'polar'} = $_[1] }
264 # Recompute and return the cartesian form, given accurate polar form.
266 sub update_cartesian {
268 my ($r, $t) = @{$self->{'polar'}};
269 $self->{c_dirty} = 0;
270 return $self->{'cartesian'} = [$r * CORE::cos($t), $r * CORE::sin($t)];
277 # Recompute and return the polar form, given accurate cartesian form.
281 my ($x, $y) = @{$self->{'cartesian'}};
282 $self->{p_dirty} = 0;
283 return $self->{'polar'} = [0, 0] if $x == 0 && $y == 0;
284 return $self->{'polar'} = [CORE::sqrt($x*$x + $y*$y),
285 CORE::atan2($y, $x)];
294 my ($z1, $z2, $regular) = @_;
295 my ($re1, $im1) = @{$z1->cartesian};
296 $z2 = cplx($z2) unless ref $z2;
297 my ($re2, $im2) = ref $z2 ? @{$z2->cartesian} : ($z2, 0);
298 unless (defined $regular) {
299 $z1->set_cartesian([$re1 + $re2, $im1 + $im2]);
302 return (ref $z1)->make($re1 + $re2, $im1 + $im2);
311 my ($z1, $z2, $inverted) = @_;
312 my ($re1, $im1) = @{$z1->cartesian};
313 $z2 = cplx($z2) unless ref $z2;
314 my ($re2, $im2) = @{$z2->cartesian};
315 unless (defined $inverted) {
316 $z1->set_cartesian([$re1 - $re2, $im1 - $im2]);
320 (ref $z1)->make($re2 - $re1, $im2 - $im1) :
321 (ref $z1)->make($re1 - $re2, $im1 - $im2);
331 my ($z1, $z2, $regular) = @_;
332 if ($z1->{p_dirty} == 0 and ref $z2 and $z2->{p_dirty} == 0) {
333 # if both polar better use polar to avoid rounding errors
334 my ($r1, $t1) = @{$z1->polar};
335 my ($r2, $t2) = @{$z2->polar};
337 if ($t > pi()) { $t -= pit2 }
338 elsif ($t <= -pi()) { $t += pit2 }
339 unless (defined $regular) {
340 $z1->set_polar([$r1 * $r2, $t]);
343 return (ref $z1)->emake($r1 * $r2, $t);
345 my ($x1, $y1) = @{$z1->cartesian};
347 my ($x2, $y2) = @{$z2->cartesian};
348 return (ref $z1)->make($x1*$x2-$y1*$y2, $x1*$y2+$y1*$x2);
350 return (ref $z1)->make($x1*$z2, $y1*$z2);
358 # Die on division by zero.
361 my $mess = "$_[0]: Division by zero.\n";
364 $mess .= "(Because in the definition of $_[0], the divisor ";
365 $mess .= "$_[1] " unless ("$_[1]" eq '0');
371 $mess .= "Died at $up[1] line $up[2].\n";
382 my ($z1, $z2, $inverted) = @_;
383 if ($z1->{p_dirty} == 0 and ref $z2 and $z2->{p_dirty} == 0) {
384 # if both polar better use polar to avoid rounding errors
385 my ($r1, $t1) = @{$z1->polar};
386 my ($r2, $t2) = @{$z2->polar};
389 _divbyzero "$z2/0" if ($r1 == 0);
391 if ($t > pi()) { $t -= pit2 }
392 elsif ($t <= -pi()) { $t += pit2 }
393 return (ref $z1)->emake($r2 / $r1, $t);
395 _divbyzero "$z1/0" if ($r2 == 0);
397 if ($t > pi()) { $t -= pit2 }
398 elsif ($t <= -pi()) { $t += pit2 }
399 return (ref $z1)->emake($r1 / $r2, $t);
404 ($x2, $y2) = @{$z1->cartesian};
405 $d = $x2*$x2 + $y2*$y2;
406 _divbyzero "$z2/0" if $d == 0;
407 return (ref $z1)->make(($x2*$z2)/$d, -($y2*$z2)/$d);
409 my ($x1, $y1) = @{$z1->cartesian};
411 ($x2, $y2) = @{$z2->cartesian};
412 $d = $x2*$x2 + $y2*$y2;
413 _divbyzero "$z1/0" if $d == 0;
414 my $u = ($x1*$x2 + $y1*$y2)/$d;
415 my $v = ($y1*$x2 - $x1*$y2)/$d;
416 return (ref $z1)->make($u, $v);
418 _divbyzero "$z1/0" if $z2 == 0;
419 return (ref $z1)->make($x1/$z2, $y1/$z2);
428 # Computes z1**z2 = exp(z2 * log z1)).
431 my ($z1, $z2, $inverted) = @_;
433 return 1 if $z1 == 0 || $z2 == 1;
434 return 0 if $z2 == 0 && Re($z1) > 0;
436 return 1 if $z2 == 0 || $z1 == 1;
437 return 0 if $z1 == 0 && Re($z2) > 0;
439 my $w = $inverted ? &exp($z1 * &log($z2))
440 : &exp($z2 * &log($z1));
441 # If both arguments cartesian, return cartesian, else polar.
442 return $z1->{c_dirty} == 0 &&
443 (not ref $z2 or $z2->{c_dirty} == 0) ?
444 cplx(@{$w->cartesian}) : $w;
450 # Computes z1 <=> z2.
451 # Sorts on the real part first, then on the imaginary part. Thus 2-4i < 3+8i.
454 my ($z1, $z2, $inverted) = @_;
455 my ($re1, $im1) = ref $z1 ? @{$z1->cartesian} : ($z1, 0);
456 my ($re2, $im2) = ref $z2 ? @{$z2->cartesian} : ($z2, 0);
457 my $sgn = $inverted ? -1 : 1;
458 return $sgn * ($re1 <=> $re2) if $re1 != $re2;
459 return $sgn * ($im1 <=> $im2);
467 # (Required in addition to spaceship() because of NaNs.)
469 my ($z1, $z2, $inverted) = @_;
470 my ($re1, $im1) = ref $z1 ? @{$z1->cartesian} : ($z1, 0);
471 my ($re2, $im2) = ref $z2 ? @{$z2->cartesian} : ($z2, 0);
472 return $re1 == $re2 && $im1 == $im2 ? 1 : 0;
483 my ($r, $t) = @{$z->polar};
484 $t = ($t <= 0) ? $t + pi : $t - pi;
485 return (ref $z)->emake($r, $t);
487 my ($re, $im) = @{$z->cartesian};
488 return (ref $z)->make(-$re, -$im);
494 # Compute complex's conjugate.
499 my ($r, $t) = @{$z->polar};
500 return (ref $z)->emake($r, -$t);
502 my ($re, $im) = @{$z->cartesian};
503 return (ref $z)->make($re, -$im);
509 # Compute or set complex's norm (rho).
517 return CORE::abs($z);
521 $z->{'polar'} = [ $rho, ${$z->polar}[1] ];
526 return ${$z->polar}[0];
533 if ($$theta > pi()) { $$theta -= pit2 }
534 elsif ($$theta <= -pi()) { $$theta += pit2 }
540 # Compute or set complex's argument (theta).
543 my ($z, $theta) = @_;
544 return $z unless ref $z;
545 if (defined $theta) {
547 $z->{'polar'} = [ ${$z->polar}[0], $theta ];
551 $theta = ${$z->polar}[1];
562 # It is quite tempting to use wantarray here so that in list context
563 # sqrt() would return the two solutions. This, however, would
566 # print "sqrt(z) = ", sqrt($z), "\n";
568 # The two values would be printed side by side without no intervening
569 # whitespace, quite confusing.
570 # Therefore if you want the two solutions use the root().
574 my ($re, $im) = ref $z ? @{$z->cartesian} : ($z, 0);
575 return $re < 0 ? cplx(0, CORE::sqrt(-$re)) : CORE::sqrt($re)
577 my ($r, $t) = @{$z->polar};
578 return (ref $z)->emake(CORE::sqrt($r), $t/2);
584 # Compute cbrt(z) (cubic root).
586 # Why are we not returning three values? The same answer as for sqrt().
591 -CORE::exp(CORE::log(-$z)/3) :
592 ($z > 0 ? CORE::exp(CORE::log($z)/3): 0)
594 my ($r, $t) = @{$z->polar};
596 return (ref $z)->emake(CORE::exp(CORE::log($r)/3), $t/3);
605 my $mess = "Root $_[0] illegal, root rank must be positive integer.\n";
609 $mess .= "Died at $up[1] line $up[2].\n";
617 # Computes all nth root for z, returning an array whose size is n.
618 # `n' must be a positive integer.
620 # The roots are given by (for k = 0..n-1):
622 # z^(1/n) = r^(1/n) (cos ((t+2 k pi)/n) + i sin ((t+2 k pi)/n))
626 _rootbad($n) if ($n < 1 or int($n) != $n);
627 my ($r, $t) = ref $z ?
628 @{$z->polar} : (CORE::abs($z), $z >= 0 ? 0 : pi);
631 my $theta_inc = pit2 / $n;
632 my $rho = $r ** (1/$n);
634 my $cartesian = ref $z && $z->{c_dirty} == 0;
635 for ($k = 0, $theta = $t / $n; $k < $n; $k++, $theta += $theta_inc) {
636 my $w = cplxe($rho, $theta);
637 # Yes, $cartesian is loop invariant.
638 push @root, $cartesian ? cplx(@{$w->cartesian}) : $w;
646 # Return or set Re(z).
650 return $z unless ref $z;
652 $z->{'cartesian'} = [ $Re, ${$z->cartesian}[1] ];
656 return ${$z->cartesian}[0];
663 # Return or set Im(z).
667 return $z unless ref $z;
669 $z->{'cartesian'} = [ ${$z->cartesian}[0], $Im ];
673 return ${$z->cartesian}[1];
680 # Return or set rho(w).
683 Math::Complex::abs(@_);
689 # Return or set theta(w).
692 Math::Complex::arg(@_);
702 my ($x, $y) = @{$z->cartesian};
703 return (ref $z)->emake(CORE::exp($x), $y);
709 # Die on logarithm of zero.
712 my $mess = "$_[0]: Logarithm of zero.\n";
715 $mess .= "(Because in the definition of $_[0], the argument ";
716 $mess .= "$_[1] " unless ($_[1] eq '0');
722 $mess .= "Died at $up[1] line $up[2].\n";
735 _logofzero("log") if $z == 0;
736 return $z > 0 ? CORE::log($z) : cplx(CORE::log(-$z), pi);
738 my ($r, $t) = @{$z->polar};
739 _logofzero("log") if $r == 0;
740 if ($t > pi()) { $t -= pit2 }
741 elsif ($t <= -pi()) { $t += pit2 }
742 return (ref $z)->make(CORE::log($r), $t);
750 sub ln { Math::Complex::log(@_) }
759 return Math::Complex::log($_[0]) * uplog10;
765 # Compute logn(z,n) = log(z) / log(n)
769 $z = cplx($z, 0) unless ref $z;
770 my $logn = $LOGN{$n};
771 $logn = $LOGN{$n} = CORE::log($n) unless defined $logn; # Cache log(n)
772 return &log($z) / $logn;
778 # Compute cos(z) = (exp(iz) + exp(-iz))/2.
782 return CORE::cos($z) unless ref $z;
783 my ($x, $y) = @{$z->cartesian};
784 my $ey = CORE::exp($y);
785 my $sx = CORE::sin($x);
786 my $cx = CORE::cos($x);
787 my $ey_1 = $ey ? 1 / $ey : $Inf;
788 return (ref $z)->make($cx * ($ey + $ey_1)/2,
789 $sx * ($ey_1 - $ey)/2);
795 # Compute sin(z) = (exp(iz) - exp(-iz))/2.
799 return CORE::sin($z) unless ref $z;
800 my ($x, $y) = @{$z->cartesian};
801 my $ey = CORE::exp($y);
802 my $sx = CORE::sin($x);
803 my $cx = CORE::cos($x);
804 my $ey_1 = $ey ? 1 / $ey : $Inf;
805 return (ref $z)->make($sx * ($ey + $ey_1)/2,
806 $cx * ($ey - $ey_1)/2);
812 # Compute tan(z) = sin(z) / cos(z).
817 _divbyzero "tan($z)", "cos($z)" if $cz == 0;
818 return &sin($z) / $cz;
824 # Computes the secant sec(z) = 1 / cos(z).
829 _divbyzero "sec($z)", "cos($z)" if ($cz == 0);
836 # Computes the cosecant csc(z) = 1 / sin(z).
841 _divbyzero "csc($z)", "sin($z)" if ($sz == 0);
850 sub cosec { Math::Complex::csc(@_) }
855 # Computes cot(z) = cos(z) / sin(z).
860 _divbyzero "cot($z)", "sin($z)" if ($sz == 0);
861 return &cos($z) / $sz;
869 sub cotan { Math::Complex::cot(@_) }
874 # Computes the arc cosine acos(z) = -i log(z + sqrt(z*z-1)).
878 return CORE::atan2(CORE::sqrt(1-$z*$z), $z)
879 if (! ref $z) && CORE::abs($z) <= 1;
880 $z = cplx($z, 0) unless ref $z;
881 my ($x, $y) = @{$z->cartesian};
882 return 0 if $x == 1 && $y == 0;
883 my $t1 = CORE::sqrt(($x+1)*($x+1) + $y*$y);
884 my $t2 = CORE::sqrt(($x-1)*($x-1) + $y*$y);
885 my $alpha = ($t1 + $t2)/2;
886 my $beta = ($t1 - $t2)/2;
887 $alpha = 1 if $alpha < 1;
888 if ($beta > 1) { $beta = 1 }
889 elsif ($beta < -1) { $beta = -1 }
890 my $u = CORE::atan2(CORE::sqrt(1-$beta*$beta), $beta);
891 my $v = CORE::log($alpha + CORE::sqrt($alpha*$alpha-1));
892 $v = -$v if $y > 0 || ($y == 0 && $x < -1);
893 return (ref $z)->make($u, $v);
899 # Computes the arc sine asin(z) = -i log(iz + sqrt(1-z*z)).
903 return CORE::atan2($z, CORE::sqrt(1-$z*$z))
904 if (! ref $z) && CORE::abs($z) <= 1;
905 $z = cplx($z, 0) unless ref $z;
906 my ($x, $y) = @{$z->cartesian};
907 return 0 if $x == 0 && $y == 0;
908 my $t1 = CORE::sqrt(($x+1)*($x+1) + $y*$y);
909 my $t2 = CORE::sqrt(($x-1)*($x-1) + $y*$y);
910 my $alpha = ($t1 + $t2)/2;
911 my $beta = ($t1 - $t2)/2;
912 $alpha = 1 if $alpha < 1;
913 if ($beta > 1) { $beta = 1 }
914 elsif ($beta < -1) { $beta = -1 }
915 my $u = CORE::atan2($beta, CORE::sqrt(1-$beta*$beta));
916 my $v = -CORE::log($alpha + CORE::sqrt($alpha*$alpha-1));
917 $v = -$v if $y > 0 || ($y == 0 && $x < -1);
918 return (ref $z)->make($u, $v);
924 # Computes the arc tangent atan(z) = i/2 log((i+z) / (i-z)).
928 return CORE::atan2($z, 1) unless ref $z;
929 my ($x, $y) = ref $z ? @{$z->cartesian} : ($z, 0);
930 return 0 if $x == 0 && $y == 0;
931 _divbyzero "atan(i)" if ( $z == i);
932 _logofzero "atan(-i)" if (-$z == i); # -i is a bad file test...
933 my $log = &log((i + $z) / (i - $z));
940 # Computes the arc secant asec(z) = acos(1 / z).
944 _divbyzero "asec($z)", $z if ($z == 0);
951 # Computes the arc cosecant acsc(z) = asin(1 / z).
955 _divbyzero "acsc($z)", $z if ($z == 0);
964 sub acosec { Math::Complex::acsc(@_) }
969 # Computes the arc cotangent acot(z) = atan(1 / z)
973 _divbyzero "acot(0)" if $z == 0;
974 return ($z >= 0) ? CORE::atan2(1, $z) : CORE::atan2(-1, -$z)
976 _divbyzero "acot(i)" if ($z - i == 0);
977 _logofzero "acot(-i)" if ($z + i == 0);
986 sub acotan { Math::Complex::acot(@_) }
991 # Computes the hyperbolic cosine cosh(z) = (exp(z) + exp(-z))/2.
998 return $ex ? ($ex + 1/$ex)/2 : $Inf;
1000 my ($x, $y) = @{$z->cartesian};
1001 $ex = CORE::exp($x);
1002 my $ex_1 = $ex ? 1 / $ex : $Inf;
1003 return (ref $z)->make(CORE::cos($y) * ($ex + $ex_1)/2,
1004 CORE::sin($y) * ($ex - $ex_1)/2);
1010 # Computes the hyperbolic sine sinh(z) = (exp(z) - exp(-z))/2.
1016 return 0 if $z == 0;
1017 $ex = CORE::exp($z);
1018 return $ex ? ($ex - 1/$ex)/2 : "-$Inf";
1020 my ($x, $y) = @{$z->cartesian};
1021 my $cy = CORE::cos($y);
1022 my $sy = CORE::sin($y);
1023 $ex = CORE::exp($x);
1024 my $ex_1 = $ex ? 1 / $ex : $Inf;
1025 return (ref $z)->make(CORE::cos($y) * ($ex - $ex_1)/2,
1026 CORE::sin($y) * ($ex + $ex_1)/2);
1032 # Computes the hyperbolic tangent tanh(z) = sinh(z) / cosh(z).
1037 _divbyzero "tanh($z)", "cosh($z)" if ($cz == 0);
1038 return sinh($z) / $cz;
1044 # Computes the hyperbolic secant sech(z) = 1 / cosh(z).
1049 _divbyzero "sech($z)", "cosh($z)" if ($cz == 0);
1056 # Computes the hyperbolic cosecant csch(z) = 1 / sinh(z).
1061 _divbyzero "csch($z)", "sinh($z)" if ($sz == 0);
1070 sub cosech { Math::Complex::csch(@_) }
1075 # Computes the hyperbolic cotangent coth(z) = cosh(z) / sinh(z).
1080 _divbyzero "coth($z)", "sinh($z)" if $sz == 0;
1081 return cosh($z) / $sz;
1089 sub cotanh { Math::Complex::coth(@_) }
1094 # Computes the arc hyperbolic cosine acosh(z) = log(z + sqrt(z*z-1)).
1101 my ($re, $im) = @{$z->cartesian};
1103 return CORE::log($re + CORE::sqrt($re*$re - 1))
1105 return cplx(0, CORE::atan2(CORE::sqrt(1 - $re*$re), $re))
1106 if CORE::abs($re) < 1;
1108 my $t = &sqrt($z * $z - 1) + $z;
1109 # Try Taylor if looking bad (this usually means that
1110 # $z was large negative, therefore the sqrt is really
1111 # close to abs(z), summing that with z...)
1112 $t = 1/(2 * $z) - 1/(8 * $z**3) + 1/(16 * $z**5) - 5/(128 * $z**7)
1115 $u->Im(-$u->Im) if $re < 0 && $im == 0;
1116 return $re < 0 ? -$u : $u;
1122 # Computes the arc hyperbolic sine asinh(z) = log(z + sqrt(z*z+1))
1127 my $t = $z + CORE::sqrt($z*$z + 1);
1128 return CORE::log($t) if $t;
1130 my $t = &sqrt($z * $z + 1) + $z;
1131 # Try Taylor if looking bad (this usually means that
1132 # $z was large negative, therefore the sqrt is really
1133 # close to abs(z), summing that with z...)
1134 $t = 1/(2 * $z) - 1/(8 * $z**3) + 1/(16 * $z**5) - 5/(128 * $z**7)
1142 # Computes the arc hyperbolic tangent atanh(z) = 1/2 log((1+z) / (1-z)).
1147 return CORE::log((1 + $z)/(1 - $z))/2 if CORE::abs($z) < 1;
1150 _divbyzero 'atanh(1)', "1 - $z" if (1 - $z == 0);
1151 _logofzero 'atanh(-1)' if (1 + $z == 0);
1152 return 0.5 * &log((1 + $z) / (1 - $z));
1158 # Computes the hyperbolic arc secant asech(z) = acosh(1 / z).
1162 _divbyzero 'asech(0)', "$z" if ($z == 0);
1163 return acosh(1 / $z);
1169 # Computes the hyperbolic arc cosecant acsch(z) = asinh(1 / z).
1173 _divbyzero 'acsch(0)', $z if ($z == 0);
1174 return asinh(1 / $z);
1180 # Alias for acosh().
1182 sub acosech { Math::Complex::acsch(@_) }
1187 # Computes the arc hyperbolic cotangent acoth(z) = 1/2 log((1+z) / (z-1)).
1191 _divbyzero 'acoth(0)' if ($z == 0);
1193 return CORE::log(($z + 1)/($z - 1))/2 if CORE::abs($z) > 1;
1196 _divbyzero 'acoth(1)', "$z - 1" if ($z - 1 == 0);
1197 _logofzero 'acoth(-1)', "1 + $z" if (1 + $z == 0);
1198 return &log((1 + $z) / ($z - 1)) / 2;
1206 sub acotanh { Math::Complex::acoth(@_) }
1211 # Compute atan(z1/z2).
1214 my ($z1, $z2, $inverted) = @_;
1215 my ($re1, $im1, $re2, $im2);
1217 ($re1, $im1) = ref $z2 ? @{$z2->cartesian} : ($z2, 0);
1218 ($re2, $im2) = @{$z1->cartesian};
1220 ($re1, $im1) = @{$z1->cartesian};
1221 ($re2, $im2) = ref $z2 ? @{$z2->cartesian} : ($z2, 0);
1224 return CORE::atan2($re1, $re2) if $im1 == 0;
1225 return ($im1<=>0) * pip2 if $re2 == 0;
1227 my $w = atan($z1/$z2);
1228 my ($u, $v) = ref $w ? @{$w->cartesian} : ($w, 0);
1229 $u += pi if $re2 < 0;
1230 $u -= pit2 if $u > pi;
1231 return cplx($u, $v);
1238 # Set (get if no argument) the display format for all complex numbers that
1239 # don't happen to have overridden it via ->display_format
1241 # When called as an object method, this actually sets the display format for
1242 # the current object.
1244 # Valid object formats are 'c' and 'p' for cartesian and polar. The first
1245 # letter is used actually, so the type can be fully spelled out for clarity.
1247 sub display_format {
1249 my %display_format = %DISPLAY_FORMAT;
1251 if (ref $self) { # Called as an object method
1252 if (exists $self->{display_format}) {
1253 my %obj = %{$self->{display_format}};
1254 @display_format{keys %obj} = values %obj;
1257 $display_format{style} = shift;
1260 @display_format{keys %new} = values %new;
1262 } else { # Called as a class method
1264 $display_format{style} = $self;
1267 @display_format{keys %new} = values %new;
1272 if (defined $self) {
1273 $self->{display_format} = { %display_format };
1276 %{$self->{display_format}} :
1277 $self->{display_format}->{style};
1280 %DISPLAY_FORMAT = %display_format;
1284 $DISPLAY_FORMAT{style};
1290 # Show nicely formatted complex number under its cartesian or polar form,
1291 # depending on the current display format:
1293 # . If a specific display format has been recorded for this object, use it.
1294 # . Otherwise, use the generic current default for all complex numbers,
1295 # which is a package global variable.
1300 my $style = $z->display_format;
1302 $style = $DISPLAY_FORMAT{style} unless defined $style;
1304 return $z->stringify_polar if $style =~ /^p/i;
1305 return $z->stringify_cartesian;
1309 # ->stringify_cartesian
1311 # Stringify as a cartesian representation 'a+bi'.
1313 sub stringify_cartesian {
1315 my ($x, $y) = @{$z->cartesian};
1318 my %format = $z->display_format;
1319 my $format = $format{format};
1322 if ($x =~ /^NaN[QS]?$/i) {
1325 if ($x =~ /^-?$Inf$/oi) {
1328 $re = defined $format ? sprintf($format, $x) : $x;
1336 if ($y =~ /^(NaN[QS]?)$/i) {
1339 if ($y =~ /^-?$Inf$/oi) {
1344 sprintf($format, $y) :
1345 ($y == 1 ? "" : ($y == -1 ? "-" : $y));
1358 } elsif ($y > 0 || $im =~ /^NaN[QS]?i$/i) {
1359 $str .= "+" if defined $re;
1362 } elsif (!defined $re) {
1373 # Stringify as a polar representation '[r,t]'.
1375 sub stringify_polar {
1377 my ($r, $t) = @{$z->polar};
1380 my %format = $z->display_format;
1381 my $format = $format{format};
1383 if ($t =~ /^NaN[QS]?$/i || $t =~ /^-?$Inf$/oi) {
1385 } elsif ($t == pi) {
1387 } elsif ($r == 0 || $t == 0) {
1388 $theta = defined $format ? sprintf($format, $t) : $t;
1391 return "[$r,$theta]" if defined $theta;
1394 # Try to identify pi/n and friends.
1397 $t -= int(CORE::abs($t) / pit2) * pit2;
1399 if ($format{polar_pretty_print} && $t) {
1403 if ($b =~ /^-?\d+$/) {
1404 $b = $b < 0 ? "-" : "" if CORE::abs($b) == 1;
1405 $theta = "${b}pi/$a";
1411 if (defined $format) {
1412 $r = sprintf($format, $r);
1413 $theta = sprintf($format, $theta) unless defined $theta;
1415 $theta = $t unless defined $theta;
1418 return "[$r,$theta]";
1426 Math::Complex - complex numbers and associated mathematical functions
1432 $z = Math::Complex->make(5, 6);
1434 $j = cplxe(1, 2*pi/3);
1438 This package lets you create and manipulate complex numbers. By default,
1439 I<Perl> limits itself to real numbers, but an extra C<use> statement brings
1440 full complex support, along with a full set of mathematical functions
1441 typically associated with and/or extended to complex numbers.
1443 If you wonder what complex numbers are, they were invented to be able to solve
1444 the following equation:
1448 and by definition, the solution is noted I<i> (engineers use I<j> instead since
1449 I<i> usually denotes an intensity, but the name does not matter). The number
1450 I<i> is a pure I<imaginary> number.
1452 The arithmetics with pure imaginary numbers works just like you would expect
1453 it with real numbers... you just have to remember that
1459 5i + 7i = i * (5 + 7) = 12i
1460 4i - 3i = i * (4 - 3) = i
1465 Complex numbers are numbers that have both a real part and an imaginary
1466 part, and are usually noted:
1470 where C<a> is the I<real> part and C<b> is the I<imaginary> part. The
1471 arithmetic with complex numbers is straightforward. You have to
1472 keep track of the real and the imaginary parts, but otherwise the
1473 rules used for real numbers just apply:
1475 (4 + 3i) + (5 - 2i) = (4 + 5) + i(3 - 2) = 9 + i
1476 (2 + i) * (4 - i) = 2*4 + 4i -2i -i*i = 8 + 2i + 1 = 9 + 2i
1478 A graphical representation of complex numbers is possible in a plane
1479 (also called the I<complex plane>, but it's really a 2D plane).
1484 is the point whose coordinates are (a, b). Actually, it would
1485 be the vector originating from (0, 0) to (a, b). It follows that the addition
1486 of two complex numbers is a vectorial addition.
1488 Since there is a bijection between a point in the 2D plane and a complex
1489 number (i.e. the mapping is unique and reciprocal), a complex number
1490 can also be uniquely identified with polar coordinates:
1494 where C<rho> is the distance to the origin, and C<theta> the angle between
1495 the vector and the I<x> axis. There is a notation for this using the
1496 exponential form, which is:
1498 rho * exp(i * theta)
1500 where I<i> is the famous imaginary number introduced above. Conversion
1501 between this form and the cartesian form C<a + bi> is immediate:
1503 a = rho * cos(theta)
1504 b = rho * sin(theta)
1506 which is also expressed by this formula:
1508 z = rho * exp(i * theta) = rho * (cos theta + i * sin theta)
1510 In other words, it's the projection of the vector onto the I<x> and I<y>
1511 axes. Mathematicians call I<rho> the I<norm> or I<modulus> and I<theta>
1512 the I<argument> of the complex number. The I<norm> of C<z> will be
1515 The polar notation (also known as the trigonometric
1516 representation) is much more handy for performing multiplications and
1517 divisions of complex numbers, whilst the cartesian notation is better
1518 suited for additions and subtractions. Real numbers are on the I<x>
1519 axis, and therefore I<theta> is zero or I<pi>.
1521 All the common operations that can be performed on a real number have
1522 been defined to work on complex numbers as well, and are merely
1523 I<extensions> of the operations defined on real numbers. This means
1524 they keep their natural meaning when there is no imaginary part, provided
1525 the number is within their definition set.
1527 For instance, the C<sqrt> routine which computes the square root of
1528 its argument is only defined for non-negative real numbers and yields a
1529 non-negative real number (it is an application from B<R+> to B<R+>).
1530 If we allow it to return a complex number, then it can be extended to
1531 negative real numbers to become an application from B<R> to B<C> (the
1532 set of complex numbers):
1534 sqrt(x) = x >= 0 ? sqrt(x) : sqrt(-x)*i
1536 It can also be extended to be an application from B<C> to B<C>,
1537 whilst its restriction to B<R> behaves as defined above by using
1538 the following definition:
1540 sqrt(z = [r,t]) = sqrt(r) * exp(i * t/2)
1542 Indeed, a negative real number can be noted C<[x,pi]> (the modulus
1543 I<x> is always non-negative, so C<[x,pi]> is really C<-x>, a negative
1544 number) and the above definition states that
1546 sqrt([x,pi]) = sqrt(x) * exp(i*pi/2) = [sqrt(x),pi/2] = sqrt(x)*i
1548 which is exactly what we had defined for negative real numbers above.
1549 The C<sqrt> returns only one of the solutions: if you want the both,
1550 use the C<root> function.
1552 All the common mathematical functions defined on real numbers that
1553 are extended to complex numbers share that same property of working
1554 I<as usual> when the imaginary part is zero (otherwise, it would not
1555 be called an extension, would it?).
1557 A I<new> operation possible on a complex number that is
1558 the identity for real numbers is called the I<conjugate>, and is noted
1559 with an horizontal bar above the number, or C<~z> here.
1566 z * ~z = (a + bi) * (a - bi) = a*a + b*b
1568 We saw that the norm of C<z> was noted C<abs(z)> and was defined as the
1569 distance to the origin, also known as:
1571 rho = abs(z) = sqrt(a*a + b*b)
1575 z * ~z = abs(z) ** 2
1577 If z is a pure real number (i.e. C<b == 0>), then the above yields:
1581 which is true (C<abs> has the regular meaning for real number, i.e. stands
1582 for the absolute value). This example explains why the norm of C<z> is
1583 noted C<abs(z)>: it extends the C<abs> function to complex numbers, yet
1584 is the regular C<abs> we know when the complex number actually has no
1585 imaginary part... This justifies I<a posteriori> our use of the C<abs>
1586 notation for the norm.
1590 Given the following notations:
1592 z1 = a + bi = r1 * exp(i * t1)
1593 z2 = c + di = r2 * exp(i * t2)
1594 z = <any complex or real number>
1596 the following (overloaded) operations are supported on complex numbers:
1598 z1 + z2 = (a + c) + i(b + d)
1599 z1 - z2 = (a - c) + i(b - d)
1600 z1 * z2 = (r1 * r2) * exp(i * (t1 + t2))
1601 z1 / z2 = (r1 / r2) * exp(i * (t1 - t2))
1602 z1 ** z2 = exp(z2 * log z1)
1604 abs(z) = r1 = sqrt(a*a + b*b)
1605 sqrt(z) = sqrt(r1) * exp(i * t/2)
1606 exp(z) = exp(a) * exp(i * b)
1607 log(z) = log(r1) + i*t
1608 sin(z) = 1/2i (exp(i * z1) - exp(-i * z))
1609 cos(z) = 1/2 (exp(i * z1) + exp(-i * z))
1610 atan2(z1, z2) = atan(z1/z2)
1612 The following extra operations are supported on both real and complex
1620 cbrt(z) = z ** (1/3)
1621 log10(z) = log(z) / log(10)
1622 logn(z, n) = log(z) / log(n)
1624 tan(z) = sin(z) / cos(z)
1630 asin(z) = -i * log(i*z + sqrt(1-z*z))
1631 acos(z) = -i * log(z + i*sqrt(1-z*z))
1632 atan(z) = i/2 * log((i+z) / (i-z))
1634 acsc(z) = asin(1 / z)
1635 asec(z) = acos(1 / z)
1636 acot(z) = atan(1 / z) = -i/2 * log((i+z) / (z-i))
1638 sinh(z) = 1/2 (exp(z) - exp(-z))
1639 cosh(z) = 1/2 (exp(z) + exp(-z))
1640 tanh(z) = sinh(z) / cosh(z) = (exp(z) - exp(-z)) / (exp(z) + exp(-z))
1642 csch(z) = 1 / sinh(z)
1643 sech(z) = 1 / cosh(z)
1644 coth(z) = 1 / tanh(z)
1646 asinh(z) = log(z + sqrt(z*z+1))
1647 acosh(z) = log(z + sqrt(z*z-1))
1648 atanh(z) = 1/2 * log((1+z) / (1-z))
1650 acsch(z) = asinh(1 / z)
1651 asech(z) = acosh(1 / z)
1652 acoth(z) = atanh(1 / z) = 1/2 * log((1+z) / (z-1))
1654 I<arg>, I<abs>, I<log>, I<csc>, I<cot>, I<acsc>, I<acot>, I<csch>,
1655 I<coth>, I<acosech>, I<acotanh>, have aliases I<rho>, I<theta>, I<ln>,
1656 I<cosec>, I<cotan>, I<acosec>, I<acotan>, I<cosech>, I<cotanh>,
1657 I<acosech>, I<acotanh>, respectively. C<Re>, C<Im>, C<arg>, C<abs>,
1658 C<rho>, and C<theta> can be used also also mutators. The C<cbrt>
1659 returns only one of the solutions: if you want all three, use the
1662 The I<root> function is available to compute all the I<n>
1663 roots of some complex, where I<n> is a strictly positive integer.
1664 There are exactly I<n> such roots, returned as a list. Getting the
1665 number mathematicians call C<j> such that:
1669 is a simple matter of writing:
1671 $j = ((root(1, 3))[1];
1673 The I<k>th root for C<z = [r,t]> is given by:
1675 (root(z, n))[k] = r**(1/n) * exp(i * (t + 2*k*pi)/n)
1677 The I<spaceship> comparison operator, E<lt>=E<gt>, is also defined. In
1678 order to ensure its restriction to real numbers is conform to what you
1679 would expect, the comparison is run on the real part of the complex
1680 number first, and imaginary parts are compared only when the real
1685 To create a complex number, use either:
1687 $z = Math::Complex->make(3, 4);
1690 if you know the cartesian form of the number, or
1694 if you like. To create a number using the polar form, use either:
1696 $z = Math::Complex->emake(5, pi/3);
1697 $x = cplxe(5, pi/3);
1699 instead. The first argument is the modulus, the second is the angle
1700 (in radians, the full circle is 2*pi). (Mnemonic: C<e> is used as a
1701 notation for complex numbers in the polar form).
1703 It is possible to write:
1705 $x = cplxe(-3, pi/4);
1707 but that will be silently converted into C<[3,-3pi/4]>, since the
1708 modulus must be non-negative (it represents the distance to the origin
1709 in the complex plane).
1711 It is also possible to have a complex number as either argument of
1712 either the C<make> or C<emake>: the appropriate component of
1713 the argument will be used.
1718 =head1 STRINGIFICATION
1720 When printed, a complex number is usually shown under its cartesian
1721 style I<a+bi>, but there are legitimate cases where the polar style
1722 I<[r,t]> is more appropriate.
1724 By calling the class method C<Math::Complex::display_format> and
1725 supplying either C<"polar"> or C<"cartesian"> as an argument, you
1726 override the default display style, which is C<"cartesian">. Not
1727 supplying any argument returns the current settings.
1729 This default can be overridden on a per-number basis by calling the
1730 C<display_format> method instead. As before, not supplying any argument
1731 returns the current display style for this number. Otherwise whatever you
1732 specify will be the new display style for I<this> particular number.
1738 Math::Complex::display_format('polar');
1739 $j = (root(1, 3))[1];
1740 print "j = $j\n"; # Prints "j = [1,2pi/3]"
1741 $j->display_format('cartesian');
1742 print "j = $j\n"; # Prints "j = -0.5+0.866025403784439i"
1744 The polar style attempts to emphasize arguments like I<k*pi/n>
1745 (where I<n> is a positive integer and I<k> an integer within [-9, +9]),
1746 this is called I<polar pretty-printing>.
1748 =head2 CHANGED IN PERL 5.6
1750 The C<display_format> class method and the corresponding
1751 C<display_format> object method can now be called using
1752 a parameter hash instead of just a one parameter.
1754 The old display format style, which can have values C<"cartesian"> or
1755 C<"polar">, can be changed using the C<"style"> parameter.
1757 $j->display_format(style => "polar");
1759 The one parameter calling convention also still works.
1761 $j->display_format("polar");
1763 There are two new display parameters.
1765 The first one is C<"format">, which is a sprintf()-style format string
1766 to be used for both numeric parts of the complex number(s). The is
1767 somewhat system-dependent but most often it corresponds to C<"%.15g">.
1768 You can revert to the default by setting the C<format> to C<undef>.
1770 # the $j from the above example
1772 $j->display_format('format' => '%.5f');
1773 print "j = $j\n"; # Prints "j = -0.50000+0.86603i"
1774 $j->display_format('format' => undef);
1775 print "j = $j\n"; # Prints "j = -0.5+0.86603i"
1777 Notice that this affects also the return values of the
1778 C<display_format> methods: in list context the whole parameter hash
1779 will be returned, as opposed to only the style parameter value.
1780 This is a potential incompatibility with earlier versions if you
1781 have been calling the C<display_format> method in list context.
1783 The second new display parameter is C<"polar_pretty_print">, which can
1784 be set to true or false, the default being true. See the previous
1785 section for what this means.
1789 Thanks to overloading, the handling of arithmetics with complex numbers
1790 is simple and almost transparent.
1792 Here are some examples:
1796 $j = cplxe(1, 2*pi/3); # $j ** 3 == 1
1797 print "j = $j, j**3 = ", $j ** 3, "\n";
1798 print "1 + j + j**2 = ", 1 + $j + $j**2, "\n";
1800 $z = -16 + 0*i; # Force it to be a complex
1801 print "sqrt($z) = ", sqrt($z), "\n";
1803 $k = exp(i * 2*pi/3);
1804 print "$j - $k = ", $j - $k, "\n";
1806 $z->Re(3); # Re, Im, arg, abs,
1807 $j->arg(2); # (the last two aka rho, theta)
1808 # can be used also as mutators.
1810 =head1 ERRORS DUE TO DIVISION BY ZERO OR LOGARITHM OF ZERO
1812 The division (/) and the following functions
1818 atanh asech acsch acoth
1820 cannot be computed for all arguments because that would mean dividing
1821 by zero or taking logarithm of zero. These situations cause fatal
1822 runtime errors looking like this
1824 cot(0): Division by zero.
1825 (Because in the definition of cot(0), the divisor sin(0) is 0)
1830 atanh(-1): Logarithm of zero.
1833 For the C<csc>, C<cot>, C<asec>, C<acsc>, C<acot>, C<csch>, C<coth>,
1834 C<asech>, C<acsch>, the argument cannot be C<0> (zero). For the the
1835 logarithmic functions and the C<atanh>, C<acoth>, the argument cannot
1836 be C<1> (one). For the C<atanh>, C<acoth>, the argument cannot be
1837 C<-1> (minus one). For the C<atan>, C<acot>, the argument cannot be
1838 C<i> (the imaginary unit). For the C<atan>, C<acoth>, the argument
1839 cannot be C<-i> (the negative imaginary unit). For the C<tan>,
1840 C<sec>, C<tanh>, the argument cannot be I<pi/2 + k * pi>, where I<k>
1843 Note that because we are operating on approximations of real numbers,
1844 these errors can happen when merely `too close' to the singularities
1847 =head1 ERRORS DUE TO INDIGESTIBLE ARGUMENTS
1849 The C<make> and C<emake> accept both real and complex arguments.
1850 When they cannot recognize the arguments they will die with error
1851 messages like the following
1853 Math::Complex::make: Cannot take real part of ...
1854 Math::Complex::make: Cannot take real part of ...
1855 Math::Complex::emake: Cannot take rho of ...
1856 Math::Complex::emake: Cannot take theta of ...
1860 Saying C<use Math::Complex;> exports many mathematical routines in the
1861 caller environment and even overrides some (C<sqrt>, C<log>).
1862 This is construed as a feature by the Authors, actually... ;-)
1864 All routines expect to be given real or complex numbers. Don't attempt to
1865 use BigFloat, since Perl has currently no rule to disambiguate a '+'
1866 operation (for instance) between two overloaded entities.
1868 In Cray UNICOS there is some strange numerical instability that results
1869 in root(), cos(), sin(), cosh(), sinh(), losing accuracy fast. Beware.
1870 The bug may be in UNICOS math libs, in UNICOS C compiler, in Math::Complex.
1871 Whatever it is, it does not manifest itself anywhere else where Perl runs.
1875 Raphael Manfredi <F<Raphael_Manfredi@pobox.com>> and
1876 Jarkko Hietaniemi <F<jhi@iki.fi>>.
1878 Extensive patches by Daniel S. Lewart <F<d-lewart@uiuc.edu>>.