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