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