Upgrade to Math-Complex-1.43
[p5sagit/p5-mst-13.2.git] / lib / Math / Complex.pm
CommitLineData
66730be0 1#
2# Complex numbers and associated mathematical functions
b42d0ec9 3# -- Raphael Manfredi Since Sep 1996
4# -- Jarkko Hietaniemi Since Mar 1997
5# -- Daniel S. Lewart Since Sep 1997
fb73857a 6#
a0d0e21e 7
5aabfad6 8package Math::Complex;
a0d0e21e 9
bf5f1b4c 10use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $Inf);
9fbe1b12 11
036846d3 12$VERSION = 1.43;
476757f7 13
9fbe1b12 14BEGIN {
036846d3 15 # For 64-bit doubles, anyway.
1515bec6 16 my $IEEE_DBL_MAX = eval "1.7976931348623157e+308";
17 if ($^O eq 'unicosmk') {
18 $Inf = $IEEE_DBL_MAX;
19 } else {
618e05e9 20 local $!;
830ec763 21 # We do want an arithmetic overflow, Inf INF inf Infinity:.
1515bec6 22 for my $t (
23 'exp(999)',
24 '9**9**9',
25 '1e999',
26 'inf',
27 'Inf',
28 'INF',
29 'infinity',
30 'Infinity',
31 'INFINITY',
32 ) {
33 local $SIG{FPE} = { };
34 local $^W = 0;
35 my $i = eval "$t+1.0";
36 if ($i =~ /inf/i && $i > 1e+99) {
37 $Inf = $i;
38 last;
39 }
830ec763 40 }
1515bec6 41 $Inf = $IEEE_DBL_MAX unless defined $Inf; # Oh well, close enough.
42 die "Could not get Infinity" unless $Inf > 1e99;
ffb4440d 43 }
9fbe1b12 44}
fb73857a 45
9fbe1b12 46use strict;
fb73857a 47
9fbe1b12 48my $i;
49my %LOGN;
0c721ce2 50
91cb744f 51# Regular expression for floating point numbers.
bf5f1b4c 52# These days we could use Scalar::Util::lln(), I guess.
53my $gre = qr'\s*([\+\-]?(?:(?:(?:\d+(?:_\d+)*(?:\.\d*(?:_\d+)*)?|\.\d+(?:_\d+)*)(?:[eE][\+\-]?\d+(?:_\d+)*)?))|inf)'i;
91cb744f 54
9fbe1b12 55require Exporter;
0c721ce2 56
5aabfad6 57@ISA = qw(Exporter);
58
5aabfad6 59my @trig = qw(
60 pi
fb73857a 61 tan
5aabfad6 62 csc cosec sec cot cotan
63 asin acos atan
64 acsc acosec asec acot acotan
65 sinh cosh tanh
66 csch cosech sech coth cotanh
67 asinh acosh atanh
68 acsch acosech asech acoth acotanh
69 );
70
71@EXPORT = (qw(
b42d0ec9 72 i Re Im rho theta arg
fb73857a 73 sqrt log ln
5aabfad6 74 log10 logn cbrt root
75 cplx cplxe
bf5f1b4c 76 atan2
5aabfad6 77 ),
78 @trig);
79
1515bec6 80my @pi = qw(pi pi2 pi4 pip2 pip4 Inf);
affad850 81
82@EXPORT_OK = @pi;
bf5f1b4c 83
5aabfad6 84%EXPORT_TAGS = (
85 'trig' => [@trig],
affad850 86 'pi' => [@pi],
66730be0 87);
a0d0e21e 88
a5f75d66 89use overload
affad850 90 '+' => \&_plus,
91 '-' => \&_minus,
92 '*' => \&_multiply,
93 '/' => \&_divide,
94 '**' => \&_power,
95 '==' => \&_numeq,
96 '<=>' => \&_spaceship,
97 'neg' => \&_negate,
98 '~' => \&_conjugate,
66730be0 99 'abs' => \&abs,
100 'sqrt' => \&sqrt,
101 'exp' => \&exp,
102 'log' => \&log,
103 'sin' => \&sin,
104 'cos' => \&cos,
0c721ce2 105 'tan' => \&tan,
66730be0 106 'atan2' => \&atan2,
affad850 107 '""' => \&_stringify;
66730be0 108
109#
b42d0ec9 110# Package "privates"
66730be0 111#
112
16357284 113my %DISPLAY_FORMAT = ('style' => 'cartesian',
114 'polar_pretty_print' => 1);
115my $eps = 1e-14; # Epsilon
66730be0 116
117#
118# Object attributes (internal):
119# cartesian [real, imaginary] -- cartesian form
120# polar [rho, theta] -- polar form
121# c_dirty cartesian form not up-to-date
122# p_dirty polar form not up-to-date
123# display display format (package's global when not set)
124#
125
b42d0ec9 126# Die on bad *make() arguments.
127
128sub _cannot_make {
bf5f1b4c 129 die "@{[(caller(1))[3]]}: Cannot take $_[0] of '$_[1]'.\n";
b42d0ec9 130}
131
bf5f1b4c 132sub _make {
91cb744f 133 my $arg = shift;
bf5f1b4c 134 my ($p, $q);
91cb744f 135
bf5f1b4c 136 if ($arg =~ /^$gre$/) {
137 ($p, $q) = ($1, 0);
138 } elsif ($arg =~ /^(?:$gre)?$gre\s*i\s*$/) {
91cb744f 139 ($p, $q) = ($1 || 0, $2);
bf5f1b4c 140 } elsif ($arg =~ /^\s*\(\s*$gre\s*(?:,\s*$gre\s*)?\)\s*$/) {
91cb744f 141 ($p, $q) = ($1, $2 || 0);
91cb744f 142 }
143
bf5f1b4c 144 if (defined $p) {
91cb744f 145 $p =~ s/^\+//;
bf5f1b4c 146 $p =~ s/^(-?)inf$/"${1}9**9**9"/e;
91cb744f 147 $q =~ s/^\+//;
bf5f1b4c 148 $q =~ s/^(-?)inf$/"${1}9**9**9"/e;
91cb744f 149 }
150
bf5f1b4c 151 return ($p, $q);
152}
153
154sub _emake {
155 my $arg = shift;
156 my ($p, $q);
157
158 if ($arg =~ /^\s*\[\s*$gre\s*(?:,\s*$gre\s*)?\]\s*$/) {
159 ($p, $q) = ($1, $2 || 0);
160 } elsif ($arg =~ m!^\s*\[\s*$gre\s*(?:,\s*([-+]?\d*\s*)?pi(?:/\s*(\d+))?\s*)?\]\s*$!) {
161 ($p, $q) = ($1, ($2 eq '-' ? -1 : ($2 || 1)) * pi() / ($3 || 1));
162 } elsif ($arg =~ /^\s*\[\s*$gre\s*\]\s*$/) {
163 ($p, $q) = ($1, 0);
164 } elsif ($arg =~ /^\s*$gre\s*$/) {
165 ($p, $q) = ($1, 0);
166 }
167
168 if (defined $p) {
169 $p =~ s/^\+//;
170 $q =~ s/^\+//;
171 $p =~ s/^(-?)inf$/"${1}9**9**9"/e;
172 $q =~ s/^(-?)inf$/"${1}9**9**9"/e;
173 }
174
175 return ($p, $q);
91cb744f 176}
177
66730be0 178#
179# ->make
180#
181# Create a new complex number (cartesian form)
182#
183sub make {
bf5f1b4c 184 my $self = bless {}, shift;
185 my ($re, $im);
186 if (@_ == 0) {
187 ($re, $im) = (0, 0);
188 } elsif (@_ == 1) {
189 return (ref $self)->emake($_[0])
190 if ($_[0] =~ /^\s*\[/);
191 ($re, $im) = _make($_[0]);
192 } elsif (@_ == 2) {
193 ($re, $im) = @_;
194 }
195 if (defined $re) {
91cb744f 196 _cannot_make("real part", $re) unless $re =~ /^$gre$/;
bf5f1b4c 197 }
198 $im ||= 0;
199 _cannot_make("imaginary part", $im) unless $im =~ /^$gre$/;
affad850 200 $self->_set_cartesian([$re, $im ]);
bf5f1b4c 201 $self->display_format('cartesian');
202
203 return $self;
66730be0 204}
205
206#
207# ->emake
208#
209# Create a new complex number (exponential form)
210#
211sub emake {
bf5f1b4c 212 my $self = bless {}, shift;
213 my ($rho, $theta);
214 if (@_ == 0) {
215 ($rho, $theta) = (0, 0);
216 } elsif (@_ == 1) {
217 return (ref $self)->make($_[0])
218 if ($_[0] =~ /^\s*\(/ || $_[0] =~ /i\s*$/);
219 ($rho, $theta) = _emake($_[0]);
220 } elsif (@_ == 2) {
221 ($rho, $theta) = @_;
222 }
223 if (defined $rho && defined $theta) {
fb73857a 224 if ($rho < 0) {
225 $rho = -$rho;
226 $theta = ($theta <= 0) ? $theta + pi() : $theta - pi();
227 }
bf5f1b4c 228 }
229 if (defined $rho) {
91cb744f 230 _cannot_make("rho", $rho) unless $rho =~ /^$gre$/;
bf5f1b4c 231 }
232 $theta ||= 0;
233 _cannot_make("theta", $theta) unless $theta =~ /^$gre$/;
affad850 234 $self->_set_polar([$rho, $theta]);
bf5f1b4c 235 $self->display_format('polar');
236
237 return $self;
66730be0 238}
239
240sub new { &make } # For backward compatibility only.
241
242#
243# cplx
244#
245# Creates a complex number from a (re, im) tuple.
246# This avoids the burden of writing Math::Complex->make(re, im).
247#
248sub cplx {
91cb744f 249 return __PACKAGE__->make(@_);
66730be0 250}
251
252#
253# cplxe
254#
255# Creates a complex number from a (rho, theta) tuple.
256# This avoids the burden of writing Math::Complex->emake(rho, theta).
257#
258sub cplxe {
91cb744f 259 return __PACKAGE__->emake(@_);
66730be0 260}
261
262#
263# pi
264#
fb73857a 265# The number defined as pi = 180 degrees
66730be0 266#
6570f784 267sub pi () { 4 * CORE::atan2(1, 1) }
5cd24f17 268
269#
affad850 270# pi2
5cd24f17 271#
fb73857a 272# The full circle
273#
affad850 274sub pi2 () { 2 * pi }
275
276#
277# pi4
278#
279# The full circle twice.
280#
281sub pi4 () { 4 * pi }
fb73857a 282
5cd24f17 283#
fb73857a 284# pip2
285#
286# The quarter circle
287#
6570f784 288sub pip2 () { pi / 2 }
5cd24f17 289
fb73857a 290#
affad850 291# pip4
d09ae4e6 292#
affad850 293# The eighth circle.
d09ae4e6 294#
affad850 295sub pip4 () { pi / 4 }
d09ae4e6 296
297#
affad850 298# _uplog10
fb73857a 299#
300# Used in log10().
301#
affad850 302sub _uplog10 () { 1 / CORE::log(10) }
66730be0 303
304#
305# i
306#
307# The number defined as i*i = -1;
308#
309sub i () {
5cd24f17 310 return $i if ($i);
311 $i = bless {};
40da2db3 312 $i->{'cartesian'} = [0, 1];
fb73857a 313 $i->{'polar'} = [1, pip2];
66730be0 314 $i->{c_dirty} = 0;
315 $i->{p_dirty} = 0;
316 return $i;
317}
318
319#
affad850 320# _ip2
1fa12f56 321#
322# Half of i.
323#
affad850 324sub _ip2 () { i / 2 }
1fa12f56 325
326#
66730be0 327# Attribute access/set routines
328#
329
affad850 330sub _cartesian {$_[0]->{c_dirty} ?
331 $_[0]->_update_cartesian : $_[0]->{'cartesian'}}
332sub _polar {$_[0]->{p_dirty} ?
333 $_[0]->_update_polar : $_[0]->{'polar'}}
66730be0 334
affad850 335sub _set_cartesian { $_[0]->{p_dirty}++; $_[0]->{c_dirty} = 0;
336 $_[0]->{'cartesian'} = $_[1] }
337sub _set_polar { $_[0]->{c_dirty}++; $_[0]->{p_dirty} = 0;
338 $_[0]->{'polar'} = $_[1] }
66730be0 339
340#
affad850 341# ->_update_cartesian
66730be0 342#
343# Recompute and return the cartesian form, given accurate polar form.
344#
affad850 345sub _update_cartesian {
66730be0 346 my $self = shift;
40da2db3 347 my ($r, $t) = @{$self->{'polar'}};
66730be0 348 $self->{c_dirty} = 0;
a8693bd3 349 return $self->{'cartesian'} = [$r * CORE::cos($t), $r * CORE::sin($t)];
66730be0 350}
351
352#
353#
affad850 354# ->_update_polar
66730be0 355#
356# Recompute and return the polar form, given accurate cartesian form.
357#
affad850 358sub _update_polar {
66730be0 359 my $self = shift;
40da2db3 360 my ($x, $y) = @{$self->{'cartesian'}};
66730be0 361 $self->{p_dirty} = 0;
40da2db3 362 return $self->{'polar'} = [0, 0] if $x == 0 && $y == 0;
1fa12f56 363 return $self->{'polar'} = [CORE::sqrt($x*$x + $y*$y),
364 CORE::atan2($y, $x)];
66730be0 365}
366
367#
affad850 368# (_plus)
66730be0 369#
370# Computes z1+z2.
371#
affad850 372sub _plus {
66730be0 373 my ($z1, $z2, $regular) = @_;
affad850 374 my ($re1, $im1) = @{$z1->_cartesian};
0e505df1 375 $z2 = cplx($z2) unless ref $z2;
affad850 376 my ($re2, $im2) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0);
66730be0 377 unless (defined $regular) {
affad850 378 $z1->_set_cartesian([$re1 + $re2, $im1 + $im2]);
66730be0 379 return $z1;
380 }
381 return (ref $z1)->make($re1 + $re2, $im1 + $im2);
382}
383
384#
affad850 385# (_minus)
66730be0 386#
387# Computes z1-z2.
388#
affad850 389sub _minus {
66730be0 390 my ($z1, $z2, $inverted) = @_;
affad850 391 my ($re1, $im1) = @{$z1->_cartesian};
0e505df1 392 $z2 = cplx($z2) unless ref $z2;
affad850 393 my ($re2, $im2) = @{$z2->_cartesian};
66730be0 394 unless (defined $inverted) {
affad850 395 $z1->_set_cartesian([$re1 - $re2, $im1 - $im2]);
66730be0 396 return $z1;
397 }
398 return $inverted ?
399 (ref $z1)->make($re2 - $re1, $im2 - $im1) :
400 (ref $z1)->make($re1 - $re2, $im1 - $im2);
0e505df1 401
66730be0 402}
403
404#
affad850 405# (_multiply)
66730be0 406#
407# Computes z1*z2.
408#
affad850 409sub _multiply {
fb73857a 410 my ($z1, $z2, $regular) = @_;
411 if ($z1->{p_dirty} == 0 and ref $z2 and $z2->{p_dirty} == 0) {
412 # if both polar better use polar to avoid rounding errors
affad850 413 my ($r1, $t1) = @{$z1->_polar};
414 my ($r2, $t2) = @{$z2->_polar};
fb73857a 415 my $t = $t1 + $t2;
affad850 416 if ($t > pi()) { $t -= pi2 }
417 elsif ($t <= -pi()) { $t += pi2 }
fb73857a 418 unless (defined $regular) {
affad850 419 $z1->_set_polar([$r1 * $r2, $t]);
66730be0 420 return $z1;
fb73857a 421 }
422 return (ref $z1)->emake($r1 * $r2, $t);
423 } else {
affad850 424 my ($x1, $y1) = @{$z1->_cartesian};
fb73857a 425 if (ref $z2) {
affad850 426 my ($x2, $y2) = @{$z2->_cartesian};
fb73857a 427 return (ref $z1)->make($x1*$x2-$y1*$y2, $x1*$y2+$y1*$x2);
428 } else {
429 return (ref $z1)->make($x1*$z2, $y1*$z2);
430 }
66730be0 431 }
66730be0 432}
433
434#
0e505df1 435# _divbyzero
0c721ce2 436#
437# Die on division by zero.
438#
0e505df1 439sub _divbyzero {
5cd24f17 440 my $mess = "$_[0]: Division by zero.\n";
441
442 if (defined $_[1]) {
443 $mess .= "(Because in the definition of $_[0], the divisor ";
1fa12f56 444 $mess .= "$_[1] " unless ("$_[1]" eq '0');
5cd24f17 445 $mess .= "is 0)\n";
446 }
447
0c721ce2 448 my @up = caller(1);
fb73857a 449
5cd24f17 450 $mess .= "Died at $up[1] line $up[2].\n";
451
452 die $mess;
0c721ce2 453}
454
455#
affad850 456# (_divide)
66730be0 457#
458# Computes z1/z2.
459#
affad850 460sub _divide {
66730be0 461 my ($z1, $z2, $inverted) = @_;
fb73857a 462 if ($z1->{p_dirty} == 0 and ref $z2 and $z2->{p_dirty} == 0) {
463 # if both polar better use polar to avoid rounding errors
affad850 464 my ($r1, $t1) = @{$z1->_polar};
465 my ($r2, $t2) = @{$z2->_polar};
fb73857a 466 my $t;
467 if ($inverted) {
0e505df1 468 _divbyzero "$z2/0" if ($r1 == 0);
fb73857a 469 $t = $t2 - $t1;
affad850 470 if ($t > pi()) { $t -= pi2 }
471 elsif ($t <= -pi()) { $t += pi2 }
fb73857a 472 return (ref $z1)->emake($r2 / $r1, $t);
473 } else {
0e505df1 474 _divbyzero "$z1/0" if ($r2 == 0);
fb73857a 475 $t = $t1 - $t2;
affad850 476 if ($t > pi()) { $t -= pi2 }
477 elsif ($t <= -pi()) { $t += pi2 }
fb73857a 478 return (ref $z1)->emake($r1 / $r2, $t);
479 }
480 } else {
481 my ($d, $x2, $y2);
482 if ($inverted) {
affad850 483 ($x2, $y2) = @{$z1->_cartesian};
fb73857a 484 $d = $x2*$x2 + $y2*$y2;
485 _divbyzero "$z2/0" if $d == 0;
486 return (ref $z1)->make(($x2*$z2)/$d, -($y2*$z2)/$d);
487 } else {
affad850 488 my ($x1, $y1) = @{$z1->_cartesian};
fb73857a 489 if (ref $z2) {
affad850 490 ($x2, $y2) = @{$z2->_cartesian};
fb73857a 491 $d = $x2*$x2 + $y2*$y2;
492 _divbyzero "$z1/0" if $d == 0;
493 my $u = ($x1*$x2 + $y1*$y2)/$d;
494 my $v = ($y1*$x2 - $x1*$y2)/$d;
495 return (ref $z1)->make($u, $v);
496 } else {
497 _divbyzero "$z1/0" if $z2 == 0;
498 return (ref $z1)->make($x1/$z2, $y1/$z2);
499 }
500 }
0c721ce2 501 }
66730be0 502}
503
504#
affad850 505# (_power)
66730be0 506#
507# Computes z1**z2 = exp(z2 * log z1)).
508#
affad850 509sub _power {
66730be0 510 my ($z1, $z2, $inverted) = @_;
ace5de91 511 if ($inverted) {
2820d885 512 return 1 if $z1 == 0 || $z2 == 1;
513 return 0 if $z2 == 0 && Re($z1) > 0;
ace5de91 514 } else {
2820d885 515 return 1 if $z2 == 0 || $z1 == 1;
516 return 0 if $z1 == 0 && Re($z2) > 0;
ace5de91 517 }
1fa12f56 518 my $w = $inverted ? &exp($z1 * &log($z2))
519 : &exp($z2 * &log($z1));
d09ae4e6 520 # If both arguments cartesian, return cartesian, else polar.
521 return $z1->{c_dirty} == 0 &&
522 (not ref $z2 or $z2->{c_dirty} == 0) ?
affad850 523 cplx(@{$w->_cartesian}) : $w;
66730be0 524}
525
526#
affad850 527# (_spaceship)
66730be0 528#
529# Computes z1 <=> z2.
2820d885 530# Sorts on the real part first, then on the imaginary part. Thus 2-4i < 3+8i.
66730be0 531#
affad850 532sub _spaceship {
66730be0 533 my ($z1, $z2, $inverted) = @_;
affad850 534 my ($re1, $im1) = ref $z1 ? @{$z1->_cartesian} : ($z1, 0);
535 my ($re2, $im2) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0);
66730be0 536 my $sgn = $inverted ? -1 : 1;
537 return $sgn * ($re1 <=> $re2) if $re1 != $re2;
538 return $sgn * ($im1 <=> $im2);
539}
540
541#
affad850 542# (_numeq)
1fa12f56 543#
544# Computes z1 == z2.
545#
affad850 546# (Required in addition to _spaceship() because of NaNs.)
547sub _numeq {
1fa12f56 548 my ($z1, $z2, $inverted) = @_;
affad850 549 my ($re1, $im1) = ref $z1 ? @{$z1->_cartesian} : ($z1, 0);
550 my ($re2, $im2) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0);
1fa12f56 551 return $re1 == $re2 && $im1 == $im2 ? 1 : 0;
552}
553
554#
affad850 555# (_negate)
66730be0 556#
557# Computes -z.
558#
affad850 559sub _negate {
66730be0 560 my ($z) = @_;
561 if ($z->{c_dirty}) {
affad850 562 my ($r, $t) = @{$z->_polar};
fb73857a 563 $t = ($t <= 0) ? $t + pi : $t - pi;
564 return (ref $z)->emake($r, $t);
66730be0 565 }
affad850 566 my ($re, $im) = @{$z->_cartesian};
66730be0 567 return (ref $z)->make(-$re, -$im);
568}
569
570#
affad850 571# (_conjugate)
66730be0 572#
affad850 573# Compute complex's _conjugate.
66730be0 574#
affad850 575sub _conjugate {
66730be0 576 my ($z) = @_;
577 if ($z->{c_dirty}) {
affad850 578 my ($r, $t) = @{$z->_polar};
66730be0 579 return (ref $z)->emake($r, -$t);
580 }
affad850 581 my ($re, $im) = @{$z->_cartesian};
66730be0 582 return (ref $z)->make($re, -$im);
583}
584
585#
586# (abs)
587#
b42d0ec9 588# Compute or set complex's norm (rho).
66730be0 589#
590sub abs {
b42d0ec9 591 my ($z, $rho) = @_;
1fa12f56 592 unless (ref $z) {
593 if (@_ == 2) {
594 $_[0] = $_[1];
595 } else {
596 return CORE::abs($z);
597 }
598 }
b42d0ec9 599 if (defined $rho) {
affad850 600 $z->{'polar'} = [ $rho, ${$z->_polar}[1] ];
b42d0ec9 601 $z->{p_dirty} = 0;
602 $z->{c_dirty} = 1;
603 return $rho;
604 } else {
affad850 605 return ${$z->_polar}[0];
b42d0ec9 606 }
607}
608
609sub _theta {
610 my $theta = $_[0];
611
affad850 612 if ($$theta > pi()) { $$theta -= pi2 }
613 elsif ($$theta <= -pi()) { $$theta += pi2 }
66730be0 614}
615
616#
617# arg
618#
b42d0ec9 619# Compute or set complex's argument (theta).
66730be0 620#
621sub arg {
b42d0ec9 622 my ($z, $theta) = @_;
623 return $z unless ref $z;
624 if (defined $theta) {
625 _theta(\$theta);
affad850 626 $z->{'polar'} = [ ${$z->_polar}[0], $theta ];
b42d0ec9 627 $z->{p_dirty} = 0;
628 $z->{c_dirty} = 1;
629 } else {
affad850 630 $theta = ${$z->_polar}[1];
b42d0ec9 631 _theta(\$theta);
632 }
633 return $theta;
66730be0 634}
635
636#
637# (sqrt)
638#
0c721ce2 639# Compute sqrt(z).
66730be0 640#
b42d0ec9 641# It is quite tempting to use wantarray here so that in list context
642# sqrt() would return the two solutions. This, however, would
643# break things like
644#
645# print "sqrt(z) = ", sqrt($z), "\n";
646#
647# The two values would be printed side by side without no intervening
648# whitespace, quite confusing.
649# Therefore if you want the two solutions use the root().
650#
66730be0 651sub sqrt {
652 my ($z) = @_;
affad850 653 my ($re, $im) = ref $z ? @{$z->_cartesian} : ($z, 0);
1fa12f56 654 return $re < 0 ? cplx(0, CORE::sqrt(-$re)) : CORE::sqrt($re)
655 if $im == 0;
affad850 656 my ($r, $t) = @{$z->_polar};
a8693bd3 657 return (ref $z)->emake(CORE::sqrt($r), $t/2);
66730be0 658}
659
660#
661# cbrt
662#
0c721ce2 663# Compute cbrt(z) (cubic root).
66730be0 664#
b42d0ec9 665# Why are we not returning three values? The same answer as for sqrt().
666#
66730be0 667sub cbrt {
668 my ($z) = @_;
1fa12f56 669 return $z < 0 ?
670 -CORE::exp(CORE::log(-$z)/3) :
671 ($z > 0 ? CORE::exp(CORE::log($z)/3): 0)
fb73857a 672 unless ref $z;
affad850 673 my ($r, $t) = @{$z->_polar};
1fa12f56 674 return 0 if $r == 0;
a8693bd3 675 return (ref $z)->emake(CORE::exp(CORE::log($r)/3), $t/3);
66730be0 676}
677
678#
0e505df1 679# _rootbad
680#
681# Die on bad root.
682#
683sub _rootbad {
bf5f1b4c 684 my $mess = "Root '$_[0]' illegal, root rank must be positive integer.\n";
0e505df1 685
686 my @up = caller(1);
fb73857a 687
0e505df1 688 $mess .= "Died at $up[1] line $up[2].\n";
689
690 die $mess;
691}
692
693#
66730be0 694# root
695#
696# Computes all nth root for z, returning an array whose size is n.
697# `n' must be a positive integer.
698#
699# The roots are given by (for k = 0..n-1):
700#
701# z^(1/n) = r^(1/n) (cos ((t+2 k pi)/n) + i sin ((t+2 k pi)/n))
702#
703sub root {
bf5f1b4c 704 my ($z, $n, $k) = @_;
0e505df1 705 _rootbad($n) if ($n < 1 or int($n) != $n);
1fa12f56 706 my ($r, $t) = ref $z ?
affad850 707 @{$z->_polar} : (CORE::abs($z), $z >= 0 ? 0 : pi);
708 my $theta_inc = pi2 / $n;
66730be0 709 my $rho = $r ** (1/$n);
d09ae4e6 710 my $cartesian = ref $z && $z->{c_dirty} == 0;
bf5f1b4c 711 if (@_ == 2) {
712 my @root;
713 for (my $i = 0, my $theta = $t / $n;
714 $i < $n;
715 $i++, $theta += $theta_inc) {
716 my $w = cplxe($rho, $theta);
717 # Yes, $cartesian is loop invariant.
affad850 718 push @root, $cartesian ? cplx(@{$w->_cartesian}) : $w;
bf5f1b4c 719 }
720 return @root;
721 } elsif (@_ == 3) {
722 my $w = cplxe($rho, $t / $n + $k * $theta_inc);
affad850 723 return $cartesian ? cplx(@{$w->_cartesian}) : $w;
a0d0e21e 724 }
a0d0e21e 725}
726
66730be0 727#
728# Re
729#
b42d0ec9 730# Return or set Re(z).
66730be0 731#
a0d0e21e 732sub Re {
b42d0ec9 733 my ($z, $Re) = @_;
66730be0 734 return $z unless ref $z;
b42d0ec9 735 if (defined $Re) {
affad850 736 $z->{'cartesian'} = [ $Re, ${$z->_cartesian}[1] ];
b42d0ec9 737 $z->{c_dirty} = 0;
738 $z->{p_dirty} = 1;
739 } else {
affad850 740 return ${$z->_cartesian}[0];
b42d0ec9 741 }
a0d0e21e 742}
743
66730be0 744#
745# Im
746#
b42d0ec9 747# Return or set Im(z).
66730be0 748#
a0d0e21e 749sub Im {
b42d0ec9 750 my ($z, $Im) = @_;
178326e7 751 return 0 unless ref $z;
b42d0ec9 752 if (defined $Im) {
affad850 753 $z->{'cartesian'} = [ ${$z->_cartesian}[0], $Im ];
b42d0ec9 754 $z->{c_dirty} = 0;
755 $z->{p_dirty} = 1;
756 } else {
affad850 757 return ${$z->_cartesian}[1];
b42d0ec9 758 }
759}
760
761#
762# rho
763#
764# Return or set rho(w).
765#
766sub rho {
767 Math::Complex::abs(@_);
768}
769
770#
771# theta
772#
773# Return or set theta(w).
774#
775sub theta {
776 Math::Complex::arg(@_);
a0d0e21e 777}
778
66730be0 779#
780# (exp)
781#
782# Computes exp(z).
783#
784sub exp {
785 my ($z) = @_;
affad850 786 my ($x, $y) = @{$z->_cartesian};
a8693bd3 787 return (ref $z)->emake(CORE::exp($x), $y);
66730be0 788}
789
790#
8c03c583 791# _logofzero
792#
fb73857a 793# Die on logarithm of zero.
8c03c583 794#
795sub _logofzero {
796 my $mess = "$_[0]: Logarithm of zero.\n";
797
798 if (defined $_[1]) {
799 $mess .= "(Because in the definition of $_[0], the argument ";
800 $mess .= "$_[1] " unless ($_[1] eq '0');
801 $mess .= "is 0)\n";
802 }
803
804 my @up = caller(1);
fb73857a 805
8c03c583 806 $mess .= "Died at $up[1] line $up[2].\n";
807
808 die $mess;
809}
810
811#
66730be0 812# (log)
813#
814# Compute log(z).
815#
816sub log {
817 my ($z) = @_;
fb73857a 818 unless (ref $z) {
819 _logofzero("log") if $z == 0;
a8693bd3 820 return $z > 0 ? CORE::log($z) : cplx(CORE::log(-$z), pi);
fb73857a 821 }
affad850 822 my ($r, $t) = @{$z->_polar};
fb73857a 823 _logofzero("log") if $r == 0;
affad850 824 if ($t > pi()) { $t -= pi2 }
825 elsif ($t <= -pi()) { $t += pi2 }
a8693bd3 826 return (ref $z)->make(CORE::log($r), $t);
66730be0 827}
828
829#
0c721ce2 830# ln
831#
832# Alias for log().
833#
834sub ln { Math::Complex::log(@_) }
835
836#
66730be0 837# log10
838#
839# Compute log10(z).
840#
5cd24f17 841
66730be0 842sub log10 {
affad850 843 return Math::Complex::log($_[0]) * _uplog10;
66730be0 844}
845
846#
847# logn
848#
849# Compute logn(z,n) = log(z) / log(n)
850#
851sub logn {
852 my ($z, $n) = @_;
0c721ce2 853 $z = cplx($z, 0) unless ref $z;
9fbe1b12 854 my $logn = $LOGN{$n};
855 $logn = $LOGN{$n} = CORE::log($n) unless defined $logn; # Cache log(n)
1fa12f56 856 return &log($z) / $logn;
66730be0 857}
858
859#
860# (cos)
861#
862# Compute cos(z) = (exp(iz) + exp(-iz))/2.
863#
864sub cos {
865 my ($z) = @_;
1fa12f56 866 return CORE::cos($z) unless ref $z;
affad850 867 my ($x, $y) = @{$z->_cartesian};
a8693bd3 868 my $ey = CORE::exp($y);
1fa12f56 869 my $sx = CORE::sin($x);
870 my $cx = CORE::cos($x);
1515bec6 871 my $ey_1 = $ey ? 1 / $ey : Inf();
1fa12f56 872 return (ref $z)->make($cx * ($ey + $ey_1)/2,
873 $sx * ($ey_1 - $ey)/2);
66730be0 874}
875
876#
877# (sin)
878#
879# Compute sin(z) = (exp(iz) - exp(-iz))/2.
880#
881sub sin {
882 my ($z) = @_;
1fa12f56 883 return CORE::sin($z) unless ref $z;
affad850 884 my ($x, $y) = @{$z->_cartesian};
a8693bd3 885 my $ey = CORE::exp($y);
1fa12f56 886 my $sx = CORE::sin($x);
887 my $cx = CORE::cos($x);
1515bec6 888 my $ey_1 = $ey ? 1 / $ey : Inf();
1fa12f56 889 return (ref $z)->make($sx * ($ey + $ey_1)/2,
890 $cx * ($ey - $ey_1)/2);
66730be0 891}
892
893#
894# tan
895#
896# Compute tan(z) = sin(z) / cos(z).
897#
898sub tan {
899 my ($z) = @_;
1fa12f56 900 my $cz = &cos($z);
901 _divbyzero "tan($z)", "cos($z)" if $cz == 0;
902 return &sin($z) / $cz;
66730be0 903}
904
905#
0c721ce2 906# sec
907#
908# Computes the secant sec(z) = 1 / cos(z).
909#
910sub sec {
911 my ($z) = @_;
1fa12f56 912 my $cz = &cos($z);
0e505df1 913 _divbyzero "sec($z)", "cos($z)" if ($cz == 0);
0c721ce2 914 return 1 / $cz;
915}
916
917#
918# csc
919#
920# Computes the cosecant csc(z) = 1 / sin(z).
921#
922sub csc {
923 my ($z) = @_;
1fa12f56 924 my $sz = &sin($z);
0e505df1 925 _divbyzero "csc($z)", "sin($z)" if ($sz == 0);
0c721ce2 926 return 1 / $sz;
927}
928
66730be0 929#
0c721ce2 930# cosec
66730be0 931#
0c721ce2 932# Alias for csc().
933#
934sub cosec { Math::Complex::csc(@_) }
935
936#
937# cot
938#
fb73857a 939# Computes cot(z) = cos(z) / sin(z).
0c721ce2 940#
941sub cot {
66730be0 942 my ($z) = @_;
1fa12f56 943 my $sz = &sin($z);
0e505df1 944 _divbyzero "cot($z)", "sin($z)" if ($sz == 0);
1fa12f56 945 return &cos($z) / $sz;
66730be0 946}
947
948#
0c721ce2 949# cotan
950#
951# Alias for cot().
952#
953sub cotan { Math::Complex::cot(@_) }
954
955#
66730be0 956# acos
957#
958# Computes the arc cosine acos(z) = -i log(z + sqrt(z*z-1)).
959#
960sub acos {
fb73857a 961 my $z = $_[0];
1fa12f56 962 return CORE::atan2(CORE::sqrt(1-$z*$z), $z)
963 if (! ref $z) && CORE::abs($z) <= 1;
40b904b7 964 $z = cplx($z, 0) unless ref $z;
affad850 965 my ($x, $y) = @{$z->_cartesian};
1fa12f56 966 return 0 if $x == 1 && $y == 0;
a8693bd3 967 my $t1 = CORE::sqrt(($x+1)*($x+1) + $y*$y);
968 my $t2 = CORE::sqrt(($x-1)*($x-1) + $y*$y);
fb73857a 969 my $alpha = ($t1 + $t2)/2;
970 my $beta = ($t1 - $t2)/2;
971 $alpha = 1 if $alpha < 1;
972 if ($beta > 1) { $beta = 1 }
973 elsif ($beta < -1) { $beta = -1 }
a8693bd3 974 my $u = CORE::atan2(CORE::sqrt(1-$beta*$beta), $beta);
975 my $v = CORE::log($alpha + CORE::sqrt($alpha*$alpha-1));
fb73857a 976 $v = -$v if $y > 0 || ($y == 0 && $x < -1);
40b904b7 977 return (ref $z)->make($u, $v);
66730be0 978}
979
980#
981# asin
982#
983# Computes the arc sine asin(z) = -i log(iz + sqrt(1-z*z)).
984#
985sub asin {
fb73857a 986 my $z = $_[0];
1fa12f56 987 return CORE::atan2($z, CORE::sqrt(1-$z*$z))
988 if (! ref $z) && CORE::abs($z) <= 1;
40b904b7 989 $z = cplx($z, 0) unless ref $z;
affad850 990 my ($x, $y) = @{$z->_cartesian};
1fa12f56 991 return 0 if $x == 0 && $y == 0;
a8693bd3 992 my $t1 = CORE::sqrt(($x+1)*($x+1) + $y*$y);
993 my $t2 = CORE::sqrt(($x-1)*($x-1) + $y*$y);
fb73857a 994 my $alpha = ($t1 + $t2)/2;
995 my $beta = ($t1 - $t2)/2;
996 $alpha = 1 if $alpha < 1;
997 if ($beta > 1) { $beta = 1 }
998 elsif ($beta < -1) { $beta = -1 }
a8693bd3 999 my $u = CORE::atan2($beta, CORE::sqrt(1-$beta*$beta));
1000 my $v = -CORE::log($alpha + CORE::sqrt($alpha*$alpha-1));
fb73857a 1001 $v = -$v if $y > 0 || ($y == 0 && $x < -1);
40b904b7 1002 return (ref $z)->make($u, $v);
66730be0 1003}
1004
1005#
1006# atan
1007#
0c721ce2 1008# Computes the arc tangent atan(z) = i/2 log((i+z) / (i-z)).
66730be0 1009#
1010sub atan {
1011 my ($z) = @_;
a8693bd3 1012 return CORE::atan2($z, 1) unless ref $z;
affad850 1013 my ($x, $y) = ref $z ? @{$z->_cartesian} : ($z, 0);
1fa12f56 1014 return 0 if $x == 0 && $y == 0;
8c03c583 1015 _divbyzero "atan(i)" if ( $z == i);
1fa12f56 1016 _logofzero "atan(-i)" if (-$z == i); # -i is a bad file test...
1017 my $log = &log((i + $z) / (i - $z));
affad850 1018 return _ip2 * $log;
a0d0e21e 1019}
1020
66730be0 1021#
0c721ce2 1022# asec
1023#
1024# Computes the arc secant asec(z) = acos(1 / z).
1025#
1026sub asec {
1027 my ($z) = @_;
0e505df1 1028 _divbyzero "asec($z)", $z if ($z == 0);
fb73857a 1029 return acos(1 / $z);
0c721ce2 1030}
1031
1032#
5cd24f17 1033# acsc
0c721ce2 1034#
8c03c583 1035# Computes the arc cosecant acsc(z) = asin(1 / z).
0c721ce2 1036#
5cd24f17 1037sub acsc {
0c721ce2 1038 my ($z) = @_;
0e505df1 1039 _divbyzero "acsc($z)", $z if ($z == 0);
fb73857a 1040 return asin(1 / $z);
0c721ce2 1041}
1042
1043#
5cd24f17 1044# acosec
66730be0 1045#
5cd24f17 1046# Alias for acsc().
0c721ce2 1047#
5cd24f17 1048sub acosec { Math::Complex::acsc(@_) }
0c721ce2 1049
66730be0 1050#
0c721ce2 1051# acot
1052#
8c03c583 1053# Computes the arc cotangent acot(z) = atan(1 / z)
0c721ce2 1054#
1055sub acot {
66730be0 1056 my ($z) = @_;
1fa12f56 1057 _divbyzero "acot(0)" if $z == 0;
1058 return ($z >= 0) ? CORE::atan2(1, $z) : CORE::atan2(-1, -$z)
1059 unless ref $z;
1060 _divbyzero "acot(i)" if ($z - i == 0);
1061 _logofzero "acot(-i)" if ($z + i == 0);
8c03c583 1062 return atan(1 / $z);
66730be0 1063}
1064
1065#
0c721ce2 1066# acotan
1067#
1068# Alias for acot().
1069#
1070sub acotan { Math::Complex::acot(@_) }
1071
1072#
66730be0 1073# cosh
1074#
1075# Computes the hyperbolic cosine cosh(z) = (exp(z) + exp(-z))/2.
1076#
1077sub cosh {
1078 my ($z) = @_;
fb73857a 1079 my $ex;
0e505df1 1080 unless (ref $z) {
a8693bd3 1081 $ex = CORE::exp($z);
1515bec6 1082 return $ex ? ($ex + 1/$ex)/2 : Inf();
0e505df1 1083 }
affad850 1084 my ($x, $y) = @{$z->_cartesian};
a8693bd3 1085 $ex = CORE::exp($x);
1515bec6 1086 my $ex_1 = $ex ? 1 / $ex : Inf();
a8693bd3 1087 return (ref $z)->make(CORE::cos($y) * ($ex + $ex_1)/2,
1088 CORE::sin($y) * ($ex - $ex_1)/2);
66730be0 1089}
1090
1091#
1092# sinh
1093#
1094# Computes the hyperbolic sine sinh(z) = (exp(z) - exp(-z))/2.
1095#
1096sub sinh {
1097 my ($z) = @_;
fb73857a 1098 my $ex;
0e505df1 1099 unless (ref $z) {
1fa12f56 1100 return 0 if $z == 0;
a8693bd3 1101 $ex = CORE::exp($z);
1515bec6 1102 return $ex ? ($ex - 1/$ex)/2 : -Inf();
0e505df1 1103 }
affad850 1104 my ($x, $y) = @{$z->_cartesian};
1fa12f56 1105 my $cy = CORE::cos($y);
1106 my $sy = CORE::sin($y);
a8693bd3 1107 $ex = CORE::exp($x);
1515bec6 1108 my $ex_1 = $ex ? 1 / $ex : Inf();
5240e574 1109 return (ref $z)->make(CORE::cos($y) * ($ex - $ex_1)/2,
1110 CORE::sin($y) * ($ex + $ex_1)/2);
66730be0 1111}
1112
1113#
1114# tanh
1115#
1116# Computes the hyperbolic tangent tanh(z) = sinh(z) / cosh(z).
1117#
1118sub tanh {
1119 my ($z) = @_;
0c721ce2 1120 my $cz = cosh($z);
0e505df1 1121 _divbyzero "tanh($z)", "cosh($z)" if ($cz == 0);
1515bec6 1122 my $sz = sinh($z);
1123 return 1 if $cz == $sz;
1124 return -1 if $cz == -$sz;
1125 return $sz / $cz;
66730be0 1126}
1127
1128#
0c721ce2 1129# sech
1130#
1131# Computes the hyperbolic secant sech(z) = 1 / cosh(z).
1132#
1133sub sech {
1134 my ($z) = @_;
1135 my $cz = cosh($z);
0e505df1 1136 _divbyzero "sech($z)", "cosh($z)" if ($cz == 0);
0c721ce2 1137 return 1 / $cz;
1138}
1139
1140#
1141# csch
1142#
1143# Computes the hyperbolic cosecant csch(z) = 1 / sinh(z).
66730be0 1144#
0c721ce2 1145sub csch {
1146 my ($z) = @_;
1147 my $sz = sinh($z);
0e505df1 1148 _divbyzero "csch($z)", "sinh($z)" if ($sz == 0);
0c721ce2 1149 return 1 / $sz;
1150}
1151
1152#
1153# cosech
1154#
1155# Alias for csch().
1156#
1157sub cosech { Math::Complex::csch(@_) }
1158
66730be0 1159#
0c721ce2 1160# coth
1161#
1162# Computes the hyperbolic cotangent coth(z) = cosh(z) / sinh(z).
1163#
1164sub coth {
66730be0 1165 my ($z) = @_;
0c721ce2 1166 my $sz = sinh($z);
1fa12f56 1167 _divbyzero "coth($z)", "sinh($z)" if $sz == 0;
1515bec6 1168 my $cz = cosh($z);
1169 return 1 if $cz == $sz;
1170 return -1 if $cz == -$sz;
1171 return $cz / $sz;
66730be0 1172}
1173
1174#
0c721ce2 1175# cotanh
1176#
1177# Alias for coth().
1178#
1179sub cotanh { Math::Complex::coth(@_) }
1180
1181#
66730be0 1182# acosh
1183#
fb73857a 1184# Computes the arc hyperbolic cosine acosh(z) = log(z + sqrt(z*z-1)).
66730be0 1185#
1186sub acosh {
1187 my ($z) = @_;
fb73857a 1188 unless (ref $z) {
fb73857a 1189 $z = cplx($z, 0);
1190 }
affad850 1191 my ($re, $im) = @{$z->_cartesian};
fb73857a 1192 if ($im == 0) {
1fa12f56 1193 return CORE::log($re + CORE::sqrt($re*$re - 1))
1194 if $re >= 1;
1195 return cplx(0, CORE::atan2(CORE::sqrt(1 - $re*$re), $re))
1196 if CORE::abs($re) < 1;
fb73857a 1197 }
9bc5fa8d 1198 my $t = &sqrt($z * $z - 1) + $z;
40b904b7 1199 # Try Taylor if looking bad (this usually means that
1200 # $z was large negative, therefore the sqrt is really
1201 # close to abs(z), summing that with z...)
9bc5fa8d 1202 $t = 1/(2 * $z) - 1/(8 * $z**3) + 1/(16 * $z**5) - 5/(128 * $z**7)
1203 if $t == 0;
1204 my $u = &log($t);
40b904b7 1205 $u->Im(-$u->Im) if $re < 0 && $im == 0;
9bc5fa8d 1206 return $re < 0 ? -$u : $u;
66730be0 1207}
1208
1209#
1210# asinh
1211#
1fa12f56 1212# Computes the arc hyperbolic sine asinh(z) = log(z + sqrt(z*z+1))
66730be0 1213#
1214sub asinh {
1215 my ($z) = @_;
1fa12f56 1216 unless (ref $z) {
1217 my $t = $z + CORE::sqrt($z*$z + 1);
1218 return CORE::log($t) if $t;
1219 }
9bc5fa8d 1220 my $t = &sqrt($z * $z + 1) + $z;
40b904b7 1221 # Try Taylor if looking bad (this usually means that
1222 # $z was large negative, therefore the sqrt is really
1223 # close to abs(z), summing that with z...)
9bc5fa8d 1224 $t = 1/(2 * $z) - 1/(8 * $z**3) + 1/(16 * $z**5) - 5/(128 * $z**7)
1225 if $t == 0;
1fa12f56 1226 return &log($t);
66730be0 1227}
1228
1229#
1230# atanh
1231#
1232# Computes the arc hyperbolic tangent atanh(z) = 1/2 log((1+z) / (1-z)).
1233#
1234sub atanh {
1235 my ($z) = @_;
fb73857a 1236 unless (ref $z) {
a8693bd3 1237 return CORE::log((1 + $z)/(1 - $z))/2 if CORE::abs($z) < 1;
fb73857a 1238 $z = cplx($z, 0);
1239 }
1fa12f56 1240 _divbyzero 'atanh(1)', "1 - $z" if (1 - $z == 0);
1241 _logofzero 'atanh(-1)' if (1 + $z == 0);
1242 return 0.5 * &log((1 + $z) / (1 - $z));
66730be0 1243}
1244
1245#
0c721ce2 1246# asech
1247#
1248# Computes the hyperbolic arc secant asech(z) = acosh(1 / z).
1249#
1250sub asech {
1251 my ($z) = @_;
1fa12f56 1252 _divbyzero 'asech(0)', "$z" if ($z == 0);
0c721ce2 1253 return acosh(1 / $z);
1254}
1255
1256#
1257# acsch
66730be0 1258#
0c721ce2 1259# Computes the hyperbolic arc cosecant acsch(z) = asinh(1 / z).
66730be0 1260#
0c721ce2 1261sub acsch {
66730be0 1262 my ($z) = @_;
0e505df1 1263 _divbyzero 'acsch(0)', $z if ($z == 0);
0c721ce2 1264 return asinh(1 / $z);
1265}
1266
1267#
1268# acosech
1269#
1270# Alias for acosh().
1271#
1272sub acosech { Math::Complex::acsch(@_) }
1273
1274#
1275# acoth
1276#
1277# Computes the arc hyperbolic cotangent acoth(z) = 1/2 log((1+z) / (z-1)).
1278#
1279sub acoth {
1280 my ($z) = @_;
1fa12f56 1281 _divbyzero 'acoth(0)' if ($z == 0);
fb73857a 1282 unless (ref $z) {
a8693bd3 1283 return CORE::log(($z + 1)/($z - 1))/2 if CORE::abs($z) > 1;
fb73857a 1284 $z = cplx($z, 0);
1285 }
1fa12f56 1286 _divbyzero 'acoth(1)', "$z - 1" if ($z - 1 == 0);
1287 _logofzero 'acoth(-1)', "1 + $z" if (1 + $z == 0);
1288 return &log((1 + $z) / ($z - 1)) / 2;
66730be0 1289}
1290
1291#
0c721ce2 1292# acotanh
1293#
1294# Alias for acot().
1295#
1296sub acotanh { Math::Complex::acoth(@_) }
1297
1298#
66730be0 1299# (atan2)
1300#
bf5f1b4c 1301# Compute atan(z1/z2), minding the right quadrant.
66730be0 1302#
1303sub atan2 {
1304 my ($z1, $z2, $inverted) = @_;
fb73857a 1305 my ($re1, $im1, $re2, $im2);
1306 if ($inverted) {
affad850 1307 ($re1, $im1) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0);
1308 ($re2, $im2) = ref $z1 ? @{$z1->_cartesian} : ($z1, 0);
66730be0 1309 } else {
affad850 1310 ($re1, $im1) = ref $z1 ? @{$z1->_cartesian} : ($z1, 0);
1311 ($re2, $im2) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0);
fb73857a 1312 }
bf5f1b4c 1313 if ($im1 || $im2) {
1314 # In MATLAB the imaginary parts are ignored.
1315 # warn "atan2: Imaginary parts ignored";
1316 # http://documents.wolfram.com/mathematica/functions/ArcTan
1317 # NOTE: Mathematica ArcTan[x,y] while atan2(y,x)
1318 my $s = $z1 * $z1 + $z2 * $z2;
1319 _divbyzero("atan2") if $s == 0;
1320 my $i = &i;
1321 my $r = $z2 + $z1 * $i;
1322 return -$i * &log($r / &sqrt( $s ));
66730be0 1323 }
bf5f1b4c 1324 return CORE::atan2($re1, $re2);
66730be0 1325}
1326
1327#
1328# display_format
1329# ->display_format
1330#
16357284 1331# Set (get if no argument) the display format for all complex numbers that
fb73857a 1332# don't happen to have overridden it via ->display_format
66730be0 1333#
16357284 1334# When called as an object method, this actually sets the display format for
66730be0 1335# the current object.
1336#
1337# Valid object formats are 'c' and 'p' for cartesian and polar. The first
1338# letter is used actually, so the type can be fully spelled out for clarity.
1339#
1340sub display_format {
16357284 1341 my $self = shift;
1342 my %display_format = %DISPLAY_FORMAT;
66730be0 1343
16357284 1344 if (ref $self) { # Called as an object method
1345 if (exists $self->{display_format}) {
1346 my %obj = %{$self->{display_format}};
1347 @display_format{keys %obj} = values %obj;
1348 }
476757f7 1349 }
1350 if (@_ == 1) {
1351 $display_format{style} = shift;
1352 } else {
1353 my %new = @_;
1354 @display_format{keys %new} = values %new;
66730be0 1355 }
1356
476757f7 1357 if (ref $self) { # Called as an object method
16357284 1358 $self->{display_format} = { %display_format };
1359 return
1360 wantarray ?
1361 %{$self->{display_format}} :
1362 $self->{display_format}->{style};
66730be0 1363 }
1364
476757f7 1365 # Called as a class method
16357284 1366 %DISPLAY_FORMAT = %display_format;
1367 return
1368 wantarray ?
1369 %DISPLAY_FORMAT :
1370 $DISPLAY_FORMAT{style};
66730be0 1371}
1372
1373#
affad850 1374# (_stringify)
66730be0 1375#
1376# Show nicely formatted complex number under its cartesian or polar form,
1377# depending on the current display format:
1378#
1379# . If a specific display format has been recorded for this object, use it.
1380# . Otherwise, use the generic current default for all complex numbers,
1381# which is a package global variable.
1382#
affad850 1383sub _stringify {
66730be0 1384 my ($z) = shift;
66730be0 1385
16357284 1386 my $style = $z->display_format;
1387
1388 $style = $DISPLAY_FORMAT{style} unless defined $style;
66730be0 1389
affad850 1390 return $z->_stringify_polar if $style =~ /^p/i;
1391 return $z->_stringify_cartesian;
66730be0 1392}
1393
1394#
affad850 1395# ->_stringify_cartesian
66730be0 1396#
1397# Stringify as a cartesian representation 'a+bi'.
1398#
affad850 1399sub _stringify_cartesian {
66730be0 1400 my $z = shift;
affad850 1401 my ($x, $y) = @{$z->_cartesian};
66730be0 1402 my ($re, $im);
1403
16357284 1404 my %format = $z->display_format;
1405 my $format = $format{format};
1406
1fa12f56 1407 if ($x) {
1408 if ($x =~ /^NaN[QS]?$/i) {
1409 $re = $x;
1410 } else {
1411 if ($x =~ /^-?$Inf$/oi) {
1412 $re = $x;
1413 } else {
1414 $re = defined $format ? sprintf($format, $x) : $x;
1415 }
1416 }
1417 } else {
1418 undef $re;
1419 }
1420
1421 if ($y) {
40b904b7 1422 if ($y =~ /^(NaN[QS]?)$/i) {
1fa12f56 1423 $im = $y;
1424 } else {
1425 if ($y =~ /^-?$Inf$/oi) {
1426 $im = $y;
1427 } else {
40b904b7 1428 $im =
1429 defined $format ?
1430 sprintf($format, $y) :
1431 ($y == 1 ? "" : ($y == -1 ? "-" : $y));
1fa12f56 1432 }
1433 }
1434 $im .= "i";
1435 } else {
1436 undef $im;
16357284 1437 }
66730be0 1438
1fa12f56 1439 my $str = $re;
1440
16357284 1441 if (defined $im) {
1442 if ($y < 0) {
1443 $str .= $im;
1fa12f56 1444 } elsif ($y > 0 || $im =~ /^NaN[QS]?i$/i) {
16357284 1445 $str .= "+" if defined $re;
1446 $str .= $im;
1447 }
1fa12f56 1448 } elsif (!defined $re) {
1449 $str = "0";
16357284 1450 }
66730be0 1451
1452 return $str;
1453}
1454
d09ae4e6 1455
66730be0 1456#
affad850 1457# ->_stringify_polar
66730be0 1458#
1459# Stringify as a polar representation '[r,t]'.
1460#
affad850 1461sub _stringify_polar {
66730be0 1462 my $z = shift;
affad850 1463 my ($r, $t) = @{$z->_polar};
66730be0 1464 my $theta;
1465
16357284 1466 my %format = $z->display_format;
1fa12f56 1467 my $format = $format{format};
16357284 1468
1fa12f56 1469 if ($t =~ /^NaN[QS]?$/i || $t =~ /^-?$Inf$/oi) {
1470 $theta = $t;
1471 } elsif ($t == pi) {
1472 $theta = "pi";
1473 } elsif ($r == 0 || $t == 0) {
1474 $theta = defined $format ? sprintf($format, $t) : $t;
55497cff 1475 }
66730be0 1476
1fa12f56 1477 return "[$r,$theta]" if defined $theta;
1478
66730be0 1479 #
1fa12f56 1480 # Try to identify pi/n and friends.
66730be0 1481 #
1482
affad850 1483 $t -= int(CORE::abs($t) / pi2) * pi2;
1fa12f56 1484
e97e26fa 1485 if ($format{polar_pretty_print} && $t) {
1fa12f56 1486 my ($a, $b);
9bc5fa8d 1487 for $a (2..9) {
1fa12f56 1488 $b = $t * $a / pi;
e97e26fa 1489 if ($b =~ /^-?\d+$/) {
1fa12f56 1490 $b = $b < 0 ? "-" : "" if CORE::abs($b) == 1;
1491 $theta = "${b}pi/$a";
d09ae4e6 1492 last;
66730be0 1493 }
d09ae4e6 1494 }
66730be0 1495 }
1496
16357284 1497 if (defined $format) {
1498 $r = sprintf($format, $r);
1fa12f56 1499 $theta = sprintf($format, $theta) unless defined $theta;
1500 } else {
1501 $theta = $t unless defined $theta;
16357284 1502 }
1503
1fa12f56 1504 return "[$r,$theta]";
a0d0e21e 1505}
a5f75d66 1506
1515bec6 1507sub Inf {
1508 return $Inf;
1509}
1510
a5f75d66 15111;
1512__END__
1513
1cf6bcb8 1514=pod
1515
a5f75d66 1516=head1 NAME
1517
66730be0 1518Math::Complex - complex numbers and associated mathematical functions
a5f75d66 1519
1520=head1 SYNOPSIS
1521
66730be0 1522 use Math::Complex;
fb73857a 1523
66730be0 1524 $z = Math::Complex->make(5, 6);
1525 $t = 4 - 3*i + $z;
1526 $j = cplxe(1, 2*pi/3);
a5f75d66 1527
1528=head1 DESCRIPTION
1529
66730be0 1530This package lets you create and manipulate complex numbers. By default,
1531I<Perl> limits itself to real numbers, but an extra C<use> statement brings
1532full complex support, along with a full set of mathematical functions
1533typically associated with and/or extended to complex numbers.
1534
1535If you wonder what complex numbers are, they were invented to be able to solve
1536the following equation:
1537
1538 x*x = -1
1539
1540and by definition, the solution is noted I<i> (engineers use I<j> instead since
1541I<i> usually denotes an intensity, but the name does not matter). The number
1542I<i> is a pure I<imaginary> number.
1543
1544The arithmetics with pure imaginary numbers works just like you would expect
1545it with real numbers... you just have to remember that
1546
1547 i*i = -1
1548
1549so you have:
1550
1551 5i + 7i = i * (5 + 7) = 12i
1552 4i - 3i = i * (4 - 3) = i
1553 4i * 2i = -8
1554 6i / 2i = 3
1555 1 / i = -i
1556
1557Complex numbers are numbers that have both a real part and an imaginary
1558part, and are usually noted:
1559
1560 a + bi
1561
1562where C<a> is the I<real> part and C<b> is the I<imaginary> part. The
1563arithmetic with complex numbers is straightforward. You have to
1564keep track of the real and the imaginary parts, but otherwise the
1565rules used for real numbers just apply:
1566
1567 (4 + 3i) + (5 - 2i) = (4 + 5) + i(3 - 2) = 9 + i
1568 (2 + i) * (4 - i) = 2*4 + 4i -2i -i*i = 8 + 2i + 1 = 9 + 2i
1569
1570A graphical representation of complex numbers is possible in a plane
1571(also called the I<complex plane>, but it's really a 2D plane).
1572The number
1573
1574 z = a + bi
1575
1576is the point whose coordinates are (a, b). Actually, it would
1577be the vector originating from (0, 0) to (a, b). It follows that the addition
1578of two complex numbers is a vectorial addition.
1579
1580Since there is a bijection between a point in the 2D plane and a complex
1581number (i.e. the mapping is unique and reciprocal), a complex number
1582can also be uniquely identified with polar coordinates:
1583
1584 [rho, theta]
1585
1586where C<rho> is the distance to the origin, and C<theta> the angle between
1587the vector and the I<x> axis. There is a notation for this using the
1588exponential form, which is:
1589
1590 rho * exp(i * theta)
1591
1592where I<i> is the famous imaginary number introduced above. Conversion
1593between this form and the cartesian form C<a + bi> is immediate:
1594
1595 a = rho * cos(theta)
1596 b = rho * sin(theta)
1597
1598which is also expressed by this formula:
1599
fb73857a 1600 z = rho * exp(i * theta) = rho * (cos theta + i * sin theta)
66730be0 1601
1602In other words, it's the projection of the vector onto the I<x> and I<y>
1603axes. Mathematicians call I<rho> the I<norm> or I<modulus> and I<theta>
affad850 1604the I<argument> of the complex number. The I<norm> of C<z> is
1605marked here as C<abs(z)>.
66730be0 1606
affad850 1607The polar notation (also known as the trigonometric representation) is
1608much more handy for performing multiplications and divisions of
1609complex numbers, whilst the cartesian notation is better suited for
1610additions and subtractions. Real numbers are on the I<x> axis, and
1611therefore I<y> or I<theta> is zero or I<pi>.
66730be0 1612
1613All the common operations that can be performed on a real number have
1614been defined to work on complex numbers as well, and are merely
1615I<extensions> of the operations defined on real numbers. This means
1616they keep their natural meaning when there is no imaginary part, provided
1617the number is within their definition set.
1618
1619For instance, the C<sqrt> routine which computes the square root of
fb73857a 1620its argument is only defined for non-negative real numbers and yields a
1621non-negative real number (it is an application from B<R+> to B<R+>).
66730be0 1622If we allow it to return a complex number, then it can be extended to
1623negative real numbers to become an application from B<R> to B<C> (the
1624set of complex numbers):
1625
1626 sqrt(x) = x >= 0 ? sqrt(x) : sqrt(-x)*i
1627
1628It can also be extended to be an application from B<C> to B<C>,
1629whilst its restriction to B<R> behaves as defined above by using
1630the following definition:
1631
1632 sqrt(z = [r,t]) = sqrt(r) * exp(i * t/2)
1633
fb73857a 1634Indeed, a negative real number can be noted C<[x,pi]> (the modulus
1635I<x> is always non-negative, so C<[x,pi]> is really C<-x>, a negative
1636number) and the above definition states that
66730be0 1637
1638 sqrt([x,pi]) = sqrt(x) * exp(i*pi/2) = [sqrt(x),pi/2] = sqrt(x)*i
1639
1640which is exactly what we had defined for negative real numbers above.
b42d0ec9 1641The C<sqrt> returns only one of the solutions: if you want the both,
1642use the C<root> function.
a5f75d66 1643
66730be0 1644All the common mathematical functions defined on real numbers that
1645are extended to complex numbers share that same property of working
1646I<as usual> when the imaginary part is zero (otherwise, it would not
1647be called an extension, would it?).
a5f75d66 1648
66730be0 1649A I<new> operation possible on a complex number that is
1650the identity for real numbers is called the I<conjugate>, and is noted
d1be9408 1651with a horizontal bar above the number, or C<~z> here.
a5f75d66 1652
66730be0 1653 z = a + bi
1654 ~z = a - bi
a5f75d66 1655
66730be0 1656Simple... Now look:
a5f75d66 1657
66730be0 1658 z * ~z = (a + bi) * (a - bi) = a*a + b*b
a5f75d66 1659
66730be0 1660We saw that the norm of C<z> was noted C<abs(z)> and was defined as the
1661distance to the origin, also known as:
a5f75d66 1662
66730be0 1663 rho = abs(z) = sqrt(a*a + b*b)
a5f75d66 1664
66730be0 1665so
1666
1667 z * ~z = abs(z) ** 2
1668
1669If z is a pure real number (i.e. C<b == 0>), then the above yields:
1670
1671 a * a = abs(a) ** 2
1672
1673which is true (C<abs> has the regular meaning for real number, i.e. stands
1674for the absolute value). This example explains why the norm of C<z> is
1675noted C<abs(z)>: it extends the C<abs> function to complex numbers, yet
1676is the regular C<abs> we know when the complex number actually has no
1677imaginary part... This justifies I<a posteriori> our use of the C<abs>
1678notation for the norm.
1679
1680=head1 OPERATIONS
1681
1682Given the following notations:
1683
1684 z1 = a + bi = r1 * exp(i * t1)
1685 z2 = c + di = r2 * exp(i * t2)
1686 z = <any complex or real number>
1687
1688the following (overloaded) operations are supported on complex numbers:
1689
1690 z1 + z2 = (a + c) + i(b + d)
1691 z1 - z2 = (a - c) + i(b - d)
1692 z1 * z2 = (r1 * r2) * exp(i * (t1 + t2))
1693 z1 / z2 = (r1 / r2) * exp(i * (t1 - t2))
1694 z1 ** z2 = exp(z2 * log z1)
b42d0ec9 1695 ~z = a - bi
1696 abs(z) = r1 = sqrt(a*a + b*b)
1697 sqrt(z) = sqrt(r1) * exp(i * t/2)
1698 exp(z) = exp(a) * exp(i * b)
1699 log(z) = log(r1) + i*t
1700 sin(z) = 1/2i (exp(i * z1) - exp(-i * z))
1701 cos(z) = 1/2 (exp(i * z1) + exp(-i * z))
bf5f1b4c 1702 atan2(y, x) = atan(y / x) # Minding the right quadrant, note the order.
1703
1704The definition used for complex arguments of atan2() is
1705
1706 -i log((x + iy)/sqrt(x*x+y*y))
66730be0 1707
affad850 1708Note that atan2(0, 0) is not well-defined.
1709
66730be0 1710The following extra operations are supported on both real and complex
1711numbers:
1712
1713 Re(z) = a
1714 Im(z) = b
1715 arg(z) = t
b42d0ec9 1716 abs(z) = r
66730be0 1717
1718 cbrt(z) = z ** (1/3)
1719 log10(z) = log(z) / log(10)
1720 logn(z, n) = log(z) / log(n)
1721
1722 tan(z) = sin(z) / cos(z)
0c721ce2 1723
5aabfad6 1724 csc(z) = 1 / sin(z)
1725 sec(z) = 1 / cos(z)
0c721ce2 1726 cot(z) = 1 / tan(z)
66730be0 1727
1728 asin(z) = -i * log(i*z + sqrt(1-z*z))
fb73857a 1729 acos(z) = -i * log(z + i*sqrt(1-z*z))
66730be0 1730 atan(z) = i/2 * log((i+z) / (i-z))
0c721ce2 1731
5aabfad6 1732 acsc(z) = asin(1 / z)
1733 asec(z) = acos(1 / z)
8c03c583 1734 acot(z) = atan(1 / z) = -i/2 * log((i+z) / (z-i))
66730be0 1735
1736 sinh(z) = 1/2 (exp(z) - exp(-z))
1737 cosh(z) = 1/2 (exp(z) + exp(-z))
0c721ce2 1738 tanh(z) = sinh(z) / cosh(z) = (exp(z) - exp(-z)) / (exp(z) + exp(-z))
1739
5aabfad6 1740 csch(z) = 1 / sinh(z)
1741 sech(z) = 1 / cosh(z)
0c721ce2 1742 coth(z) = 1 / tanh(z)
fb73857a 1743
66730be0 1744 asinh(z) = log(z + sqrt(z*z+1))
1745 acosh(z) = log(z + sqrt(z*z-1))
1746 atanh(z) = 1/2 * log((1+z) / (1-z))
66730be0 1747
5aabfad6 1748 acsch(z) = asinh(1 / z)
1749 asech(z) = acosh(1 / z)
0c721ce2 1750 acoth(z) = atanh(1 / z) = 1/2 * log((1+z) / (z-1))
1751
b42d0ec9 1752I<arg>, I<abs>, I<log>, I<csc>, I<cot>, I<acsc>, I<acot>, I<csch>,
1753I<coth>, I<acosech>, I<acotanh>, have aliases I<rho>, I<theta>, I<ln>,
1754I<cosec>, I<cotan>, I<acosec>, I<acotan>, I<cosech>, I<cotanh>,
1755I<acosech>, I<acotanh>, respectively. C<Re>, C<Im>, C<arg>, C<abs>,
d1be9408 1756C<rho>, and C<theta> can be used also as mutators. The C<cbrt>
b42d0ec9 1757returns only one of the solutions: if you want all three, use the
1758C<root> function.
0c721ce2 1759
1760The I<root> function is available to compute all the I<n>
66730be0 1761roots of some complex, where I<n> is a strictly positive integer.
1762There are exactly I<n> such roots, returned as a list. Getting the
1763number mathematicians call C<j> such that:
1764
1765 1 + j + j*j = 0;
1766
1767is a simple matter of writing:
1768
1769 $j = ((root(1, 3))[1];
1770
1771The I<k>th root for C<z = [r,t]> is given by:
1772
1773 (root(z, n))[k] = r**(1/n) * exp(i * (t + 2*k*pi)/n)
1774
bf5f1b4c 1775You can return the I<k>th root directly by C<root(z, n, k)>,
1776indexing starting from I<zero> and ending at I<n - 1>.
1777
1515bec6 1778The I<spaceship> numeric comparison operator, E<lt>=E<gt>, is also
1779defined. In order to ensure its restriction to real numbers is conform
1780to what you would expect, the comparison is run on the real part of
1781the complex number first, and imaginary parts are compared only when
1782the real parts match.
66730be0 1783
1784=head1 CREATION
1785
1786To create a complex number, use either:
1787
1788 $z = Math::Complex->make(3, 4);
1789 $z = cplx(3, 4);
1790
1791if you know the cartesian form of the number, or
1792
1793 $z = 3 + 4*i;
1794
fb73857a 1795if you like. To create a number using the polar form, use either:
66730be0 1796
1797 $z = Math::Complex->emake(5, pi/3);
1798 $x = cplxe(5, pi/3);
1799
0c721ce2 1800instead. The first argument is the modulus, the second is the angle
fb73857a 1801(in radians, the full circle is 2*pi). (Mnemonic: C<e> is used as a
1802notation for complex numbers in the polar form).
66730be0 1803
1804It is possible to write:
1805
1806 $x = cplxe(-3, pi/4);
1807
16357284 1808but that will be silently converted into C<[3,-3pi/4]>, since the
1809modulus must be non-negative (it represents the distance to the origin
1810in the complex plane).
66730be0 1811
91cb744f 1812It is also possible to have a complex number as either argument of the
1813C<make>, C<emake>, C<cplx>, and C<cplxe>: the appropriate component of
b42d0ec9 1814the argument will be used.
1815
1816 $z1 = cplx(-2, 1);
1817 $z2 = cplx($z1, 4);
1818
91cb744f 1819The C<new>, C<make>, C<emake>, C<cplx>, and C<cplxe> will also
1820understand a single (string) argument of the forms
1821
1822 2-3i
1823 -3i
1824 [2,3]
bf5f1b4c 1825 [2,-3pi/4]
91cb744f 1826 [2]
1827
1828in which case the appropriate cartesian and exponential components
1829will be parsed from the string and used to create new complex numbers.
1830The imaginary component and the theta, respectively, will default to zero.
1831
bf5f1b4c 1832The C<new>, C<make>, C<emake>, C<cplx>, and C<cplxe> will also
1833understand the case of no arguments: this means plain zero or (0, 0).
1834
1835=head1 DISPLAYING
66730be0 1836
1837When printed, a complex number is usually shown under its cartesian
16357284 1838style I<a+bi>, but there are legitimate cases where the polar style
bf5f1b4c 1839I<[r,t]> is more appropriate. The process of converting the complex
1840number into a string that can be displayed is known as I<stringification>.
66730be0 1841
16357284 1842By calling the class method C<Math::Complex::display_format> and
1843supplying either C<"polar"> or C<"cartesian"> as an argument, you
5287f86b 1844override the default display style, which is C<"cartesian">. Not
16357284 1845supplying any argument returns the current settings.
66730be0 1846
1847This default can be overridden on a per-number basis by calling the
1848C<display_format> method instead. As before, not supplying any argument
5287f86b 1849returns the current display style for this number. Otherwise whatever you
1850specify will be the new display style for I<this> particular number.
66730be0 1851
1852For instance:
1853
1854 use Math::Complex;
1855
1856 Math::Complex::display_format('polar');
16357284 1857 $j = (root(1, 3))[1];
1858 print "j = $j\n"; # Prints "j = [1,2pi/3]"
66730be0 1859 $j->display_format('cartesian');
1860 print "j = $j\n"; # Prints "j = -0.5+0.866025403784439i"
1861
5287f86b 1862The polar style attempts to emphasize arguments like I<k*pi/n>
9bc5fa8d 1863(where I<n> is a positive integer and I<k> an integer within [-9, +9]),
5287f86b 1864this is called I<polar pretty-printing>.
66730be0 1865
bf5f1b4c 1866For the reverse of stringifying, see the C<make> and C<emake>.
1867
16357284 1868=head2 CHANGED IN PERL 5.6
1869
1870The C<display_format> class method and the corresponding
1871C<display_format> object method can now be called using
1872a parameter hash instead of just a one parameter.
1873
1874The old display format style, which can have values C<"cartesian"> or
40b904b7 1875C<"polar">, can be changed using the C<"style"> parameter.
1876
1877 $j->display_format(style => "polar");
1878
1879The one parameter calling convention also still works.
1880
1881 $j->display_format("polar");
16357284 1882
1883There are two new display parameters.
1884
40b904b7 1885The first one is C<"format">, which is a sprintf()-style format string
1886to be used for both numeric parts of the complex number(s). The is
1887somewhat system-dependent but most often it corresponds to C<"%.15g">.
1888You can revert to the default by setting the C<format> to C<undef>.
16357284 1889
1890 # the $j from the above example
1891
1892 $j->display_format('format' => '%.5f');
1893 print "j = $j\n"; # Prints "j = -0.50000+0.86603i"
40b904b7 1894 $j->display_format('format' => undef);
16357284 1895 print "j = $j\n"; # Prints "j = -0.5+0.86603i"
1896
1897Notice that this affects also the return values of the
1898C<display_format> methods: in list context the whole parameter hash
40b904b7 1899will be returned, as opposed to only the style parameter value.
1900This is a potential incompatibility with earlier versions if you
1901have been calling the C<display_format> method in list context.
16357284 1902
5287f86b 1903The second new display parameter is C<"polar_pretty_print">, which can
1904be set to true or false, the default being true. See the previous
1905section for what this means.
16357284 1906
66730be0 1907=head1 USAGE
1908
1909Thanks to overloading, the handling of arithmetics with complex numbers
1910is simple and almost transparent.
1911
1912Here are some examples:
1913
1914 use Math::Complex;
1915
1916 $j = cplxe(1, 2*pi/3); # $j ** 3 == 1
1917 print "j = $j, j**3 = ", $j ** 3, "\n";
1918 print "1 + j + j**2 = ", 1 + $j + $j**2, "\n";
1919
1920 $z = -16 + 0*i; # Force it to be a complex
1921 print "sqrt($z) = ", sqrt($z), "\n";
1922
1923 $k = exp(i * 2*pi/3);
1924 print "$j - $k = ", $j - $k, "\n";
a5f75d66 1925
b42d0ec9 1926 $z->Re(3); # Re, Im, arg, abs,
1927 $j->arg(2); # (the last two aka rho, theta)
1928 # can be used also as mutators.
1929
affad850 1930=head2 PI
1931
1932The constant C<pi> and some handy multiples of it (pi2, pi4,
1933and pip2 (pi/2) and pip4 (pi/4)) are also available if separately
1934exported:
1935
1936 use Math::Complex ':pi';
1937 $third_of_circle = pi2 / 3;
1938
1515bec6 1939=head2 Inf
1940
1941The floating point infinity can be exported as a subroutine Inf():
1942
1943 use Math::Complex qw(Inf sinh);
1944 my $AlsoInf = Inf() + 42;
1945 my $AnotherInf = sinh(1e42);
1946 print "$AlsoInf is $AnotherInf\n" if $AlsoInf == $AnotherInf;
1947
1948Note that the stringified form of infinity varies between platforms:
1949it can be for example any of
1950
1951 inf
1952 infinity
1953 INF
1954 1.#INF
1955
1956or it can be something else.
1957
b42d0ec9 1958=head1 ERRORS DUE TO DIVISION BY ZERO OR LOGARITHM OF ZERO
5aabfad6 1959
1960The division (/) and the following functions
1961
b42d0ec9 1962 log ln log10 logn
2820d885 1963 tan sec csc cot
b42d0ec9 1964 atan asec acsc acot
1965 tanh sech csch coth
1966 atanh asech acsch acoth
5aabfad6 1967
1968cannot be computed for all arguments because that would mean dividing
8c03c583 1969by zero or taking logarithm of zero. These situations cause fatal
1970runtime errors looking like this
5aabfad6 1971
1972 cot(0): Division by zero.
5cd24f17 1973 (Because in the definition of cot(0), the divisor sin(0) is 0)
5aabfad6 1974 Died at ...
1975
8c03c583 1976or
1977
1978 atanh(-1): Logarithm of zero.
1979 Died at...
1980
1981For the C<csc>, C<cot>, C<asec>, C<acsc>, C<acot>, C<csch>, C<coth>,
d1be9408 1982C<asech>, C<acsch>, the argument cannot be C<0> (zero). For the
b42d0ec9 1983logarithmic functions and the C<atanh>, C<acoth>, the argument cannot
1984be C<1> (one). For the C<atanh>, C<acoth>, the argument cannot be
1985C<-1> (minus one). For the C<atan>, C<acot>, the argument cannot be
1986C<i> (the imaginary unit). For the C<atan>, C<acoth>, the argument
1987cannot be C<-i> (the negative imaginary unit). For the C<tan>,
1988C<sec>, C<tanh>, the argument cannot be I<pi/2 + k * pi>, where I<k>
bf5f1b4c 1989is any integer. atan2(0, 0) is undefined, and if the complex arguments
1990are used for atan2(), a division by zero will happen if z1**2+z2**2 == 0.
b42d0ec9 1991
1992Note that because we are operating on approximations of real numbers,
1993these errors can happen when merely `too close' to the singularities
40b904b7 1994listed above.
b42d0ec9 1995
1996=head1 ERRORS DUE TO INDIGESTIBLE ARGUMENTS
1997
1998The C<make> and C<emake> accept both real and complex arguments.
1999When they cannot recognize the arguments they will die with error
2000messages like the following
2001
2002 Math::Complex::make: Cannot take real part of ...
2003 Math::Complex::make: Cannot take real part of ...
2004 Math::Complex::emake: Cannot take rho of ...
2005 Math::Complex::emake: Cannot take theta of ...
5cd24f17 2006
a5f75d66 2007=head1 BUGS
2008
5cd24f17 2009Saying C<use Math::Complex;> exports many mathematical routines in the
bf5f1b4c 2010caller environment and even overrides some (C<sqrt>, C<log>, C<atan2>).
fb73857a 2011This is construed as a feature by the Authors, actually... ;-)
a5f75d66 2012
66730be0 2013All routines expect to be given real or complex numbers. Don't attempt to
2014use BigFloat, since Perl has currently no rule to disambiguate a '+'
2015operation (for instance) between two overloaded entities.
a5f75d66 2016
d09ae4e6 2017In Cray UNICOS there is some strange numerical instability that results
2018in root(), cos(), sin(), cosh(), sinh(), losing accuracy fast. Beware.
2019The bug may be in UNICOS math libs, in UNICOS C compiler, in Math::Complex.
2020Whatever it is, it does not manifest itself anywhere else where Perl runs.
2021
0c721ce2 2022=head1 AUTHORS
a5f75d66 2023
affad850 2024Daniel S. Lewart <F<lewart!at!uiuc.edu>>
2025Jarkko Hietaniemi <F<jhi!at!iki.fi>>
2026Raphael Manfredi <F<Raphael_Manfredi!at!pobox.com>>
fb73857a 2027
1515bec6 2028=head1 LICENSE
2029
2030This library is free software; you can redistribute it and/or modify
2031it under the same terms as Perl itself.
2032
5cd24f17 2033=cut
2034
b42d0ec9 20351;
2036
5cd24f17 2037# eof