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