This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
400366ce757c9a0ee629ca7225ed4c83b9fe1631
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 our(\$VERSION, @ISA, @EXPORT, %EXPORT_TAGS, \$Inf);
12 \$VERSION = 1.34;
14 BEGIN {
15     unless (\$^O eq 'unicosmk') {
16         my \$e = \$!;
17         # We do want an arithmetic overflow, Inf INF inf Infinity:.
18         undef \$Inf unless eval <<'EOE' and \$Inf =~ /^inf(?:inity)?\$/i;
19           local \$SIG{FPE} = sub {die};
20           my \$t = CORE::exp 30;
21           \$Inf = CORE::exp \$t;
22 EOE
23         if (!defined \$Inf) {            # Try a different method
24           undef \$Inf unless eval <<'EOE' and \$Inf =~ /^inf(?:inity)?\$/i;
25             local \$SIG{FPE} = sub {die};
26             my \$t = 1;
27             \$Inf = \$t + "1e99999999999999999999999999999999";
28 EOE
29         }
30         \$! = \$e; # Clear ERANGE.
31     }
32     \$Inf = "Inf" if !defined \$Inf || !(\$Inf > 0); # Desperation.
33 }
35 use strict;
37 my \$i;
38 my %LOGN;
40 # Regular expression for floating point numbers.
41 my \$gre = qr'\s*([\+\-]?(?:(?:(?:\d+(?:_\d+)*(?:\.\d*(?:_\d+)*)?|\.\d+(?:_\d+)*)(?:[eE][\+\-]?\d+(?:_\d+)*)?)))';
43 require Exporter;
45 @ISA = qw(Exporter);
47 my @trig = qw(
48               pi
49               tan
50               csc cosec sec cot cotan
51               asin acos atan
52               acsc acosec asec acot acotan
53               sinh cosh tanh
54               csch cosech sech coth cotanh
55               asinh acosh atanh
56               acsch acosech asech acoth acotanh
57              );
59 @EXPORT = (qw(
60              i Re Im rho theta arg
61              sqrt log ln
62              log10 logn cbrt root
63              cplx cplxe
64              ),
65            @trig);
67 %EXPORT_TAGS = (
68     'trig' => [@trig],
69 );
72         '+'     => \&plus,
73         '-'     => \&minus,
74         '*'     => \&multiply,
75         '/'     => \&divide,
76         '**'    => \&power,
77         '=='    => \&numeq,
78         '<=>'   => \&spaceship,
79         'neg'   => \&negate,
80         '~'     => \&conjugate,
81         'abs'   => \&abs,
82         'sqrt'  => \&sqrt,
83         'exp'   => \&exp,
84         'log'   => \&log,
85         'sin'   => \&sin,
86         'cos'   => \&cos,
87         'tan'   => \&tan,
88         'atan2' => \&atan2,
89         qw("" stringify);
91 #
92 # Package "privates"
93 #
95 my %DISPLAY_FORMAT = ('style' => 'cartesian',
96                       'polar_pretty_print' => 1);
97 my \$eps            = 1e-14;             # Epsilon
99 #
100 # Object attributes (internal):
101 #       cartesian       [real, imaginary] -- cartesian form
102 #       polar           [rho, theta] -- polar form
103 #       c_dirty         cartesian form not up-to-date
104 #       p_dirty         polar form not up-to-date
105 #       display         display format (package's global when not set)
106 #
108 # Die on bad *make() arguments.
110 sub _cannot_make {
111     die "@{[(caller(1))]}: Cannot take \$_ of \$_.\n";
112 }
114 sub _remake {
115     my \$arg = shift;
116     my (\$made, \$p, \$q);
118     if (\$arg =~ /^(?:\$gre)?\$gre\s*i\s*\$/) {
119         (\$p, \$q) = (\$1 || 0, \$2);
120         \$made = 'cart';
121     } elsif (\$arg =~ /^\s*\[\s*\$gre\s*(?:,\s*\$gre\s*)?\]\s*\$/) {
122         (\$p, \$q) = (\$1, \$2 || 0);
123         \$made = 'exp';
124     }
126     if (\$made) {
127         \$p =~ s/^\+//;
128         \$q =~ s/^\+//;
129     }
131     return (\$made, \$p, \$q);
132 }
134 #
135 # ->make
136 #
137 # Create a new complex number (cartesian form)
138 #
139 sub make {
140         my \$self = bless {}, shift;
141         my (\$re, \$im) = @_;
142         if (@_ == 1) {
143             my (\$remade, \$p, \$q) = _remake(\$re);
144             if (\$remade) {
145                 if (\$remade eq 'cart') {
146                     (\$re, \$im) = (\$p, \$q);
147                 } else {
148                     return (ref \$self)->emake(\$p, \$q);
149                 }
150             }
151         }
152         my \$rre = ref \$re;
153         if ( \$rre ) {
154             if ( \$rre eq ref \$self ) {
155                 \$re = Re(\$re);
156             } else {
157                 _cannot_make("real part", \$rre);
158             }
159         }
160         my \$rim = ref \$im;
161         if ( \$rim ) {
162             if ( \$rim eq ref \$self ) {
163                 \$im = Im(\$im);
164             } else {
165                 _cannot_make("imaginary part", \$rim);
166             }
167         }
168         _cannot_make("real part",      \$re) unless \$re =~ /^\$gre\$/;
169         \$im ||= 0;
170         _cannot_make("imaginary part", \$im) unless \$im =~ /^\$gre\$/;
171         \$self->{'cartesian'} = [ \$re, \$im ];
172         \$self->{c_dirty} = 0;
173         \$self->{p_dirty} = 1;
174         \$self->display_format('cartesian');
175         return \$self;
176 }
178 #
179 # ->emake
180 #
181 # Create a new complex number (exponential form)
182 #
183 sub emake {
184         my \$self = bless {}, shift;
185         my (\$rho, \$theta) = @_;
186         if (@_ == 1) {
187             my (\$remade, \$p, \$q) = _remake(\$rho);
188             if (\$remade) {
189                 if (\$remade eq 'exp') {
190                     (\$rho, \$theta) = (\$p, \$q);
191                 } else {
192                     return (ref \$self)->make(\$p, \$q);
193                 }
194             }
195         }
196         my \$rrh = ref \$rho;
197         if ( \$rrh ) {
198             if ( \$rrh eq ref \$self ) {
199                 \$rho = rho(\$rho);
200             } else {
201                 _cannot_make("rho", \$rrh);
202             }
203         }
204         my \$rth = ref \$theta;
205         if ( \$rth ) {
206             if ( \$rth eq ref \$self ) {
207                 \$theta = theta(\$theta);
208             } else {
209                 _cannot_make("theta", \$rth);
210             }
211         }
212         if (\$rho < 0) {
213             \$rho   = -\$rho;
214             \$theta = (\$theta <= 0) ? \$theta + pi() : \$theta - pi();
215         }
216         _cannot_make("rho",   \$rho)   unless \$rho   =~ /^\$gre\$/;
217         \$theta ||= 0;
218         _cannot_make("theta", \$theta) unless \$theta =~ /^\$gre\$/;
219         \$self->{'polar'} = [\$rho, \$theta];
220         \$self->{p_dirty} = 0;
221         \$self->{c_dirty} = 1;
222         \$self->display_format('polar');
223         return \$self;
224 }
226 sub new { &make }               # For backward compatibility only.
228 #
229 # cplx
230 #
231 # Creates a complex number from a (re, im) tuple.
232 # This avoids the burden of writing Math::Complex->make(re, im).
233 #
234 sub cplx {
235         return __PACKAGE__->make(@_);
236 }
238 #
239 # cplxe
240 #
241 # Creates a complex number from a (rho, theta) tuple.
242 # This avoids the burden of writing Math::Complex->emake(rho, theta).
243 #
244 sub cplxe {
245         return __PACKAGE__->emake(@_);
246 }
248 #
249 # pi
250 #
251 # The number defined as pi = 180 degrees
252 #
253 sub pi () { 4 * CORE::atan2(1, 1) }
255 #
256 # pit2
257 #
258 # The full circle
259 #
260 sub pit2 () { 2 * pi }
262 #
263 # pip2
264 #
265 # The quarter circle
266 #
267 sub pip2 () { pi / 2 }
269 #
270 # deg1
271 #
272 # One degree in radians, used in stringify_polar.
273 #
275 sub deg1 () { pi / 180 }
277 #
278 # uplog10
279 #
280 # Used in log10().
281 #
282 sub uplog10 () { 1 / CORE::log(10) }
284 #
285 # i
286 #
287 # The number defined as i*i = -1;
288 #
289 sub i () {
290         return \$i if (\$i);
291         \$i = bless {};
292         \$i->{'cartesian'} = [0, 1];
293         \$i->{'polar'}     = [1, pip2];
294         \$i->{c_dirty} = 0;
295         \$i->{p_dirty} = 0;
296         return \$i;
297 }
299 #
300 # ip2
301 #
302 # Half of i.
303 #
304 sub ip2 () { i / 2 }
306 #
307 # Attribute access/set routines
308 #
310 sub cartesian {\$_->{c_dirty} ?
311                    \$_->update_cartesian : \$_->{'cartesian'}}
312 sub polar     {\$_->{p_dirty} ?
313                    \$_->update_polar : \$_->{'polar'}}
315 sub set_cartesian { \$_->{p_dirty}++; \$_->{'cartesian'} = \$_ }
316 sub set_polar     { \$_->{c_dirty}++; \$_->{'polar'} = \$_ }
318 #
319 # ->update_cartesian
320 #
321 # Recompute and return the cartesian form, given accurate polar form.
322 #
323 sub update_cartesian {
324         my \$self = shift;
325         my (\$r, \$t) = @{\$self->{'polar'}};
326         \$self->{c_dirty} = 0;
327         return \$self->{'cartesian'} = [\$r * CORE::cos(\$t), \$r * CORE::sin(\$t)];
328 }
330 #
331 #
332 # ->update_polar
333 #
334 # Recompute and return the polar form, given accurate cartesian form.
335 #
336 sub update_polar {
337         my \$self = shift;
338         my (\$x, \$y) = @{\$self->{'cartesian'}};
339         \$self->{p_dirty} = 0;
340         return \$self->{'polar'} = [0, 0] if \$x == 0 && \$y == 0;
341         return \$self->{'polar'} = [CORE::sqrt(\$x*\$x + \$y*\$y),
342                                    CORE::atan2(\$y, \$x)];
343 }
345 #
346 # (plus)
347 #
348 # Computes z1+z2.
349 #
350 sub plus {
351         my (\$z1, \$z2, \$regular) = @_;
352         my (\$re1, \$im1) = @{\$z1->cartesian};
353         \$z2 = cplx(\$z2) unless ref \$z2;
354         my (\$re2, \$im2) = ref \$z2 ? @{\$z2->cartesian} : (\$z2, 0);
355         unless (defined \$regular) {
356                 \$z1->set_cartesian([\$re1 + \$re2, \$im1 + \$im2]);
357                 return \$z1;
358         }
359         return (ref \$z1)->make(\$re1 + \$re2, \$im1 + \$im2);
360 }
362 #
363 # (minus)
364 #
365 # Computes z1-z2.
366 #
367 sub minus {
368         my (\$z1, \$z2, \$inverted) = @_;
369         my (\$re1, \$im1) = @{\$z1->cartesian};
370         \$z2 = cplx(\$z2) unless ref \$z2;
371         my (\$re2, \$im2) = @{\$z2->cartesian};
372         unless (defined \$inverted) {
373                 \$z1->set_cartesian([\$re1 - \$re2, \$im1 - \$im2]);
374                 return \$z1;
375         }
376         return \$inverted ?
377                 (ref \$z1)->make(\$re2 - \$re1, \$im2 - \$im1) :
378                 (ref \$z1)->make(\$re1 - \$re2, \$im1 - \$im2);
380 }
382 #
383 # (multiply)
384 #
385 # Computes z1*z2.
386 #
387 sub multiply {
388         my (\$z1, \$z2, \$regular) = @_;
389         if (\$z1->{p_dirty} == 0 and ref \$z2 and \$z2->{p_dirty} == 0) {
390             # if both polar better use polar to avoid rounding errors
391             my (\$r1, \$t1) = @{\$z1->polar};
392             my (\$r2, \$t2) = @{\$z2->polar};
393             my \$t = \$t1 + \$t2;
394             if    (\$t >   pi()) { \$t -= pit2 }
395             elsif (\$t <= -pi()) { \$t += pit2 }
396             unless (defined \$regular) {
397                 \$z1->set_polar([\$r1 * \$r2, \$t]);
398                 return \$z1;
399             }
400             return (ref \$z1)->emake(\$r1 * \$r2, \$t);
401         } else {
402             my (\$x1, \$y1) = @{\$z1->cartesian};
403             if (ref \$z2) {
404                 my (\$x2, \$y2) = @{\$z2->cartesian};
405                 return (ref \$z1)->make(\$x1*\$x2-\$y1*\$y2, \$x1*\$y2+\$y1*\$x2);
406             } else {
407                 return (ref \$z1)->make(\$x1*\$z2, \$y1*\$z2);
408             }
409         }
410 }
412 #
413 # _divbyzero
414 #
415 # Die on division by zero.
416 #
417 sub _divbyzero {
418     my \$mess = "\$_: Division by zero.\n";
420     if (defined \$_) {
421         \$mess .= "(Because in the definition of \$_, the divisor ";
422         \$mess .= "\$_ " unless ("\$_" eq '0');
423         \$mess .= "is 0)\n";
424     }
426     my @up = caller(1);
428     \$mess .= "Died at \$up line \$up.\n";
430     die \$mess;
431 }
433 #
434 # (divide)
435 #
436 # Computes z1/z2.
437 #
438 sub divide {
439         my (\$z1, \$z2, \$inverted) = @_;
440         if (\$z1->{p_dirty} == 0 and ref \$z2 and \$z2->{p_dirty} == 0) {
441             # if both polar better use polar to avoid rounding errors
442             my (\$r1, \$t1) = @{\$z1->polar};
443             my (\$r2, \$t2) = @{\$z2->polar};
444             my \$t;
445             if (\$inverted) {
446                 _divbyzero "\$z2/0" if (\$r1 == 0);
447                 \$t = \$t2 - \$t1;
448                 if    (\$t >   pi()) { \$t -= pit2 }
449                 elsif (\$t <= -pi()) { \$t += pit2 }
450                 return (ref \$z1)->emake(\$r2 / \$r1, \$t);
451             } else {
452                 _divbyzero "\$z1/0" if (\$r2 == 0);
453                 \$t = \$t1 - \$t2;
454                 if    (\$t >   pi()) { \$t -= pit2 }
455                 elsif (\$t <= -pi()) { \$t += pit2 }
456                 return (ref \$z1)->emake(\$r1 / \$r2, \$t);
457             }
458         } else {
459             my (\$d, \$x2, \$y2);
460             if (\$inverted) {
461                 (\$x2, \$y2) = @{\$z1->cartesian};
462                 \$d = \$x2*\$x2 + \$y2*\$y2;
463                 _divbyzero "\$z2/0" if \$d == 0;
464                 return (ref \$z1)->make((\$x2*\$z2)/\$d, -(\$y2*\$z2)/\$d);
465             } else {
466                 my (\$x1, \$y1) = @{\$z1->cartesian};
467                 if (ref \$z2) {
468                     (\$x2, \$y2) = @{\$z2->cartesian};
469                     \$d = \$x2*\$x2 + \$y2*\$y2;
470                     _divbyzero "\$z1/0" if \$d == 0;
471                     my \$u = (\$x1*\$x2 + \$y1*\$y2)/\$d;
472                     my \$v = (\$y1*\$x2 - \$x1*\$y2)/\$d;
473                     return (ref \$z1)->make(\$u, \$v);
474                 } else {
475                     _divbyzero "\$z1/0" if \$z2 == 0;
476                     return (ref \$z1)->make(\$x1/\$z2, \$y1/\$z2);
477                 }
478             }
479         }
480 }
482 #
483 # (power)
484 #
485 # Computes z1**z2 = exp(z2 * log z1)).
486 #
487 sub power {
488         my (\$z1, \$z2, \$inverted) = @_;
489         if (\$inverted) {
490             return 1 if \$z1 == 0 || \$z2 == 1;
491             return 0 if \$z2 == 0 && Re(\$z1) > 0;
492         } else {
493             return 1 if \$z2 == 0 || \$z1 == 1;
494             return 0 if \$z1 == 0 && Re(\$z2) > 0;
495         }
496         my \$w = \$inverted ? &exp(\$z1 * &log(\$z2))
497                           : &exp(\$z2 * &log(\$z1));
498         # If both arguments cartesian, return cartesian, else polar.
499         return \$z1->{c_dirty} == 0 &&
500                (not ref \$z2 or \$z2->{c_dirty} == 0) ?
501                cplx(@{\$w->cartesian}) : \$w;
502 }
504 #
505 # (spaceship)
506 #
507 # Computes z1 <=> z2.
508 # Sorts on the real part first, then on the imaginary part. Thus 2-4i < 3+8i.
509 #
510 sub spaceship {
511         my (\$z1, \$z2, \$inverted) = @_;
512         my (\$re1, \$im1) = ref \$z1 ? @{\$z1->cartesian} : (\$z1, 0);
513         my (\$re2, \$im2) = ref \$z2 ? @{\$z2->cartesian} : (\$z2, 0);
514         my \$sgn = \$inverted ? -1 : 1;
515         return \$sgn * (\$re1 <=> \$re2) if \$re1 != \$re2;
516         return \$sgn * (\$im1 <=> \$im2);
517 }
519 #
520 # (numeq)
521 #
522 # Computes z1 == z2.
523 #
524 # (Required in addition to spaceship() because of NaNs.)
525 sub numeq {
526         my (\$z1, \$z2, \$inverted) = @_;
527         my (\$re1, \$im1) = ref \$z1 ? @{\$z1->cartesian} : (\$z1, 0);
528         my (\$re2, \$im2) = ref \$z2 ? @{\$z2->cartesian} : (\$z2, 0);
529         return \$re1 == \$re2 && \$im1 == \$im2 ? 1 : 0;
530 }
532 #
533 # (negate)
534 #
535 # Computes -z.
536 #
537 sub negate {
538         my (\$z) = @_;
539         if (\$z->{c_dirty}) {
540                 my (\$r, \$t) = @{\$z->polar};
541                 \$t = (\$t <= 0) ? \$t + pi : \$t - pi;
542                 return (ref \$z)->emake(\$r, \$t);
543         }
544         my (\$re, \$im) = @{\$z->cartesian};
545         return (ref \$z)->make(-\$re, -\$im);
546 }
548 #
549 # (conjugate)
550 #
551 # Compute complex's conjugate.
552 #
553 sub conjugate {
554         my (\$z) = @_;
555         if (\$z->{c_dirty}) {
556                 my (\$r, \$t) = @{\$z->polar};
557                 return (ref \$z)->emake(\$r, -\$t);
558         }
559         my (\$re, \$im) = @{\$z->cartesian};
560         return (ref \$z)->make(\$re, -\$im);
561 }
563 #
564 # (abs)
565 #
566 # Compute or set complex's norm (rho).
567 #
568 sub abs {
569         my (\$z, \$rho) = @_;
570         unless (ref \$z) {
571             if (@_ == 2) {
572                 \$_ = \$_;
573             } else {
574                 return CORE::abs(\$z);
575             }
576         }
577         if (defined \$rho) {
578             \$z->{'polar'} = [ \$rho, \${\$z->polar} ];
579             \$z->{p_dirty} = 0;
580             \$z->{c_dirty} = 1;
581             return \$rho;
582         } else {
583             return \${\$z->polar};
584         }
585 }
587 sub _theta {
588     my \$theta = \$_;
590     if    (\$\$theta >   pi()) { \$\$theta -= pit2 }
591     elsif (\$\$theta <= -pi()) { \$\$theta += pit2 }
592 }
594 #
595 # arg
596 #
597 # Compute or set complex's argument (theta).
598 #
599 sub arg {
600         my (\$z, \$theta) = @_;
601         return \$z unless ref \$z;
602         if (defined \$theta) {
603             _theta(\\$theta);
604             \$z->{'polar'} = [ \${\$z->polar}, \$theta ];
605             \$z->{p_dirty} = 0;
606             \$z->{c_dirty} = 1;
607         } else {
608             \$theta = \${\$z->polar};
609             _theta(\\$theta);
610         }
611         return \$theta;
612 }
614 #
615 # (sqrt)
616 #
617 # Compute sqrt(z).
618 #
619 # It is quite tempting to use wantarray here so that in list context
620 # sqrt() would return the two solutions.  This, however, would
621 # break things like
622 #
623 #       print "sqrt(z) = ", sqrt(\$z), "\n";
624 #
625 # The two values would be printed side by side without no intervening
626 # whitespace, quite confusing.
627 # Therefore if you want the two solutions use the root().
628 #
629 sub sqrt {
630         my (\$z) = @_;
631         my (\$re, \$im) = ref \$z ? @{\$z->cartesian} : (\$z, 0);
632         return \$re < 0 ? cplx(0, CORE::sqrt(-\$re)) : CORE::sqrt(\$re)
633             if \$im == 0;
634         my (\$r, \$t) = @{\$z->polar};
635         return (ref \$z)->emake(CORE::sqrt(\$r), \$t/2);
636 }
638 #
639 # cbrt
640 #
641 # Compute cbrt(z) (cubic root).
642 #
643 # Why are we not returning three values?  The same answer as for sqrt().
644 #
645 sub cbrt {
646         my (\$z) = @_;
647         return \$z < 0 ?
648             -CORE::exp(CORE::log(-\$z)/3) :
649                 (\$z > 0 ? CORE::exp(CORE::log(\$z)/3): 0)
650             unless ref \$z;
651         my (\$r, \$t) = @{\$z->polar};
652         return 0 if \$r == 0;
653         return (ref \$z)->emake(CORE::exp(CORE::log(\$r)/3), \$t/3);
654 }
656 #
658 #
659 # Die on bad root.
660 #
661 sub _rootbad {
662     my \$mess = "Root \$_ illegal, root rank must be positive integer.\n";
664     my @up = caller(1);
666     \$mess .= "Died at \$up line \$up.\n";
668     die \$mess;
669 }
671 #
672 # root
673 #
674 # Computes all nth root for z, returning an array whose size is n.
675 # `n' must be a positive integer.
676 #
677 # The roots are given by (for k = 0..n-1):
678 #
679 # z^(1/n) = r^(1/n) (cos ((t+2 k pi)/n) + i sin ((t+2 k pi)/n))
680 #
681 sub root {
682         my (\$z, \$n) = @_;
683         _rootbad(\$n) if (\$n < 1 or int(\$n) != \$n);
684         my (\$r, \$t) = ref \$z ?
685             @{\$z->polar} : (CORE::abs(\$z), \$z >= 0 ? 0 : pi);
686         my @root;
687         my \$k;
688         my \$theta_inc = pit2 / \$n;
689         my \$rho = \$r ** (1/\$n);
690         my \$theta;
691         my \$cartesian = ref \$z && \$z->{c_dirty} == 0;
692         for (\$k = 0, \$theta = \$t / \$n; \$k < \$n; \$k++, \$theta += \$theta_inc) {
693             my \$w = cplxe(\$rho, \$theta);
694             # Yes, \$cartesian is loop invariant.
695             push @root, \$cartesian ? cplx(@{\$w->cartesian}) : \$w;
696         }
697         return @root;
698 }
700 #
701 # Re
702 #
703 # Return or set Re(z).
704 #
705 sub Re {
706         my (\$z, \$Re) = @_;
707         return \$z unless ref \$z;
708         if (defined \$Re) {
709             \$z->{'cartesian'} = [ \$Re, \${\$z->cartesian} ];
710             \$z->{c_dirty} = 0;
711             \$z->{p_dirty} = 1;
712         } else {
713             return \${\$z->cartesian};
714         }
715 }
717 #
718 # Im
719 #
720 # Return or set Im(z).
721 #
722 sub Im {
723         my (\$z, \$Im) = @_;
724         return 0 unless ref \$z;
725         if (defined \$Im) {
726             \$z->{'cartesian'} = [ \${\$z->cartesian}, \$Im ];
727             \$z->{c_dirty} = 0;
728             \$z->{p_dirty} = 1;
729         } else {
730             return \${\$z->cartesian};
731         }
732 }
734 #
735 # rho
736 #
737 # Return or set rho(w).
738 #
739 sub rho {
740     Math::Complex::abs(@_);
741 }
743 #
744 # theta
745 #
746 # Return or set theta(w).
747 #
748 sub theta {
749     Math::Complex::arg(@_);
750 }
752 #
753 # (exp)
754 #
755 # Computes exp(z).
756 #
757 sub exp {
758         my (\$z) = @_;
759         my (\$x, \$y) = @{\$z->cartesian};
760         return (ref \$z)->emake(CORE::exp(\$x), \$y);
761 }
763 #
764 # _logofzero
765 #
766 # Die on logarithm of zero.
767 #
768 sub _logofzero {
769     my \$mess = "\$_: Logarithm of zero.\n";
771     if (defined \$_) {
772         \$mess .= "(Because in the definition of \$_, the argument ";
773         \$mess .= "\$_ " unless (\$_ eq '0');
774         \$mess .= "is 0)\n";
775     }
777     my @up = caller(1);
779     \$mess .= "Died at \$up line \$up.\n";
781     die \$mess;
782 }
784 #
785 # (log)
786 #
787 # Compute log(z).
788 #
789 sub log {
790         my (\$z) = @_;
791         unless (ref \$z) {
792             _logofzero("log") if \$z == 0;
793             return \$z > 0 ? CORE::log(\$z) : cplx(CORE::log(-\$z), pi);
794         }
795         my (\$r, \$t) = @{\$z->polar};
796         _logofzero("log") if \$r == 0;
797         if    (\$t >   pi()) { \$t -= pit2 }
798         elsif (\$t <= -pi()) { \$t += pit2 }
799         return (ref \$z)->make(CORE::log(\$r), \$t);
800 }
802 #
803 # ln
804 #
805 # Alias for log().
806 #
807 sub ln { Math::Complex::log(@_) }
809 #
810 # log10
811 #
812 # Compute log10(z).
813 #
815 sub log10 {
816         return Math::Complex::log(\$_) * uplog10;
817 }
819 #
820 # logn
821 #
822 # Compute logn(z,n) = log(z) / log(n)
823 #
824 sub logn {
825         my (\$z, \$n) = @_;
826         \$z = cplx(\$z, 0) unless ref \$z;
827         my \$logn = \$LOGN{\$n};
828         \$logn = \$LOGN{\$n} = CORE::log(\$n) unless defined \$logn; # Cache log(n)
829         return &log(\$z) / \$logn;
830 }
832 #
833 # (cos)
834 #
835 # Compute cos(z) = (exp(iz) + exp(-iz))/2.
836 #
837 sub cos {
838         my (\$z) = @_;
839         return CORE::cos(\$z) unless ref \$z;
840         my (\$x, \$y) = @{\$z->cartesian};
841         my \$ey = CORE::exp(\$y);
842         my \$sx = CORE::sin(\$x);
843         my \$cx = CORE::cos(\$x);
844         my \$ey_1 = \$ey ? 1 / \$ey : \$Inf;
845         return (ref \$z)->make(\$cx * (\$ey + \$ey_1)/2,
846                               \$sx * (\$ey_1 - \$ey)/2);
847 }
849 #
850 # (sin)
851 #
852 # Compute sin(z) = (exp(iz) - exp(-iz))/2.
853 #
854 sub sin {
855         my (\$z) = @_;
856         return CORE::sin(\$z) unless ref \$z;
857         my (\$x, \$y) = @{\$z->cartesian};
858         my \$ey = CORE::exp(\$y);
859         my \$sx = CORE::sin(\$x);
860         my \$cx = CORE::cos(\$x);
861         my \$ey_1 = \$ey ? 1 / \$ey : \$Inf;
862         return (ref \$z)->make(\$sx * (\$ey + \$ey_1)/2,
863                               \$cx * (\$ey - \$ey_1)/2);
864 }
866 #
867 # tan
868 #
869 # Compute tan(z) = sin(z) / cos(z).
870 #
871 sub tan {
872         my (\$z) = @_;
873         my \$cz = &cos(\$z);
874         _divbyzero "tan(\$z)", "cos(\$z)" if \$cz == 0;
875         return &sin(\$z) / \$cz;
876 }
878 #
879 # sec
880 #
881 # Computes the secant sec(z) = 1 / cos(z).
882 #
883 sub sec {
884         my (\$z) = @_;
885         my \$cz = &cos(\$z);
886         _divbyzero "sec(\$z)", "cos(\$z)" if (\$cz == 0);
887         return 1 / \$cz;
888 }
890 #
891 # csc
892 #
893 # Computes the cosecant csc(z) = 1 / sin(z).
894 #
895 sub csc {
896         my (\$z) = @_;
897         my \$sz = &sin(\$z);
898         _divbyzero "csc(\$z)", "sin(\$z)" if (\$sz == 0);
899         return 1 / \$sz;
900 }
902 #
903 # cosec
904 #
905 # Alias for csc().
906 #
907 sub cosec { Math::Complex::csc(@_) }
909 #
910 # cot
911 #
912 # Computes cot(z) = cos(z) / sin(z).
913 #
914 sub cot {
915         my (\$z) = @_;
916         my \$sz = &sin(\$z);
917         _divbyzero "cot(\$z)", "sin(\$z)" if (\$sz == 0);
918         return &cos(\$z) / \$sz;
919 }
921 #
922 # cotan
923 #
924 # Alias for cot().
925 #
926 sub cotan { Math::Complex::cot(@_) }
928 #
929 # acos
930 #
931 # Computes the arc cosine acos(z) = -i log(z + sqrt(z*z-1)).
932 #
933 sub acos {
934         my \$z = \$_;
935         return CORE::atan2(CORE::sqrt(1-\$z*\$z), \$z)
936             if (! ref \$z) && CORE::abs(\$z) <= 1;
937         \$z = cplx(\$z, 0) unless ref \$z;
938         my (\$x, \$y) = @{\$z->cartesian};
939         return 0 if \$x == 1 && \$y == 0;
940         my \$t1 = CORE::sqrt((\$x+1)*(\$x+1) + \$y*\$y);
941         my \$t2 = CORE::sqrt((\$x-1)*(\$x-1) + \$y*\$y);
942         my \$alpha = (\$t1 + \$t2)/2;
943         my \$beta  = (\$t1 - \$t2)/2;
944         \$alpha = 1 if \$alpha < 1;
945         if    (\$beta >  1) { \$beta =  1 }
946         elsif (\$beta < -1) { \$beta = -1 }
947         my \$u = CORE::atan2(CORE::sqrt(1-\$beta*\$beta), \$beta);
948         my \$v = CORE::log(\$alpha + CORE::sqrt(\$alpha*\$alpha-1));
949         \$v = -\$v if \$y > 0 || (\$y == 0 && \$x < -1);
950         return (ref \$z)->make(\$u, \$v);
951 }
953 #
954 # asin
955 #
956 # Computes the arc sine asin(z) = -i log(iz + sqrt(1-z*z)).
957 #
958 sub asin {
959         my \$z = \$_;
960         return CORE::atan2(\$z, CORE::sqrt(1-\$z*\$z))
961             if (! ref \$z) && CORE::abs(\$z) <= 1;
962         \$z = cplx(\$z, 0) unless ref \$z;
963         my (\$x, \$y) = @{\$z->cartesian};
964         return 0 if \$x == 0 && \$y == 0;
965         my \$t1 = CORE::sqrt((\$x+1)*(\$x+1) + \$y*\$y);
966         my \$t2 = CORE::sqrt((\$x-1)*(\$x-1) + \$y*\$y);
967         my \$alpha = (\$t1 + \$t2)/2;
968         my \$beta  = (\$t1 - \$t2)/2;
969         \$alpha = 1 if \$alpha < 1;
970         if    (\$beta >  1) { \$beta =  1 }
971         elsif (\$beta < -1) { \$beta = -1 }
972         my \$u =  CORE::atan2(\$beta, CORE::sqrt(1-\$beta*\$beta));
973         my \$v = -CORE::log(\$alpha + CORE::sqrt(\$alpha*\$alpha-1));
974         \$v = -\$v if \$y > 0 || (\$y == 0 && \$x < -1);
975         return (ref \$z)->make(\$u, \$v);
976 }
978 #
979 # atan
980 #
981 # Computes the arc tangent atan(z) = i/2 log((i+z) / (i-z)).
982 #
983 sub atan {
984         my (\$z) = @_;
985         return CORE::atan2(\$z, 1) unless ref \$z;
986         my (\$x, \$y) = ref \$z ? @{\$z->cartesian} : (\$z, 0);
987         return 0 if \$x == 0 && \$y == 0;
988         _divbyzero "atan(i)"  if ( \$z == i);
989         _logofzero "atan(-i)" if (-\$z == i); # -i is a bad file test...
990         my \$log = &log((i + \$z) / (i - \$z));
991         return ip2 * \$log;
992 }
994 #
995 # asec
996 #
997 # Computes the arc secant asec(z) = acos(1 / z).
998 #
999 sub asec {
1000         my (\$z) = @_;
1001         _divbyzero "asec(\$z)", \$z if (\$z == 0);
1002         return acos(1 / \$z);
1003 }
1005 #
1006 # acsc
1007 #
1008 # Computes the arc cosecant acsc(z) = asin(1 / z).
1009 #
1010 sub acsc {
1011         my (\$z) = @_;
1012         _divbyzero "acsc(\$z)", \$z if (\$z == 0);
1013         return asin(1 / \$z);
1014 }
1016 #
1017 # acosec
1018 #
1019 # Alias for acsc().
1020 #
1021 sub acosec { Math::Complex::acsc(@_) }
1023 #
1024 # acot
1025 #
1026 # Computes the arc cotangent acot(z) = atan(1 / z)
1027 #
1028 sub acot {
1029         my (\$z) = @_;
1030         _divbyzero "acot(0)"  if \$z == 0;
1031         return (\$z >= 0) ? CORE::atan2(1, \$z) : CORE::atan2(-1, -\$z)
1032             unless ref \$z;
1033         _divbyzero "acot(i)"  if (\$z - i == 0);
1034         _logofzero "acot(-i)" if (\$z + i == 0);
1035         return atan(1 / \$z);
1036 }
1038 #
1039 # acotan
1040 #
1041 # Alias for acot().
1042 #
1043 sub acotan { Math::Complex::acot(@_) }
1045 #
1046 # cosh
1047 #
1048 # Computes the hyperbolic cosine cosh(z) = (exp(z) + exp(-z))/2.
1049 #
1050 sub cosh {
1051         my (\$z) = @_;
1052         my \$ex;
1053         unless (ref \$z) {
1054             \$ex = CORE::exp(\$z);
1055             return \$ex ? (\$ex + 1/\$ex)/2 : \$Inf;
1056         }
1057         my (\$x, \$y) = @{\$z->cartesian};
1058         \$ex = CORE::exp(\$x);
1059         my \$ex_1 = \$ex ? 1 / \$ex : \$Inf;
1060         return (ref \$z)->make(CORE::cos(\$y) * (\$ex + \$ex_1)/2,
1061                               CORE::sin(\$y) * (\$ex - \$ex_1)/2);
1062 }
1064 #
1065 # sinh
1066 #
1067 # Computes the hyperbolic sine sinh(z) = (exp(z) - exp(-z))/2.
1068 #
1069 sub sinh {
1070         my (\$z) = @_;
1071         my \$ex;
1072         unless (ref \$z) {
1073             return 0 if \$z == 0;
1074             \$ex = CORE::exp(\$z);
1075             return \$ex ? (\$ex - 1/\$ex)/2 : "-\$Inf";
1076         }
1077         my (\$x, \$y) = @{\$z->cartesian};
1078         my \$cy = CORE::cos(\$y);
1079         my \$sy = CORE::sin(\$y);
1080         \$ex = CORE::exp(\$x);
1081         my \$ex_1 = \$ex ? 1 / \$ex : \$Inf;
1082         return (ref \$z)->make(CORE::cos(\$y) * (\$ex - \$ex_1)/2,
1083                               CORE::sin(\$y) * (\$ex + \$ex_1)/2);
1084 }
1086 #
1087 # tanh
1088 #
1089 # Computes the hyperbolic tangent tanh(z) = sinh(z) / cosh(z).
1090 #
1091 sub tanh {
1092         my (\$z) = @_;
1093         my \$cz = cosh(\$z);
1094         _divbyzero "tanh(\$z)", "cosh(\$z)" if (\$cz == 0);
1095         return sinh(\$z) / \$cz;
1096 }
1098 #
1099 # sech
1100 #
1101 # Computes the hyperbolic secant sech(z) = 1 / cosh(z).
1102 #
1103 sub sech {
1104         my (\$z) = @_;
1105         my \$cz = cosh(\$z);
1106         _divbyzero "sech(\$z)", "cosh(\$z)" if (\$cz == 0);
1107         return 1 / \$cz;
1108 }
1110 #
1111 # csch
1112 #
1113 # Computes the hyperbolic cosecant csch(z) = 1 / sinh(z).
1114 #
1115 sub csch {
1116         my (\$z) = @_;
1117         my \$sz = sinh(\$z);
1118         _divbyzero "csch(\$z)", "sinh(\$z)" if (\$sz == 0);
1119         return 1 / \$sz;
1120 }
1122 #
1123 # cosech
1124 #
1125 # Alias for csch().
1126 #
1127 sub cosech { Math::Complex::csch(@_) }
1129 #
1130 # coth
1131 #
1132 # Computes the hyperbolic cotangent coth(z) = cosh(z) / sinh(z).
1133 #
1134 sub coth {
1135         my (\$z) = @_;
1136         my \$sz = sinh(\$z);
1137         _divbyzero "coth(\$z)", "sinh(\$z)" if \$sz == 0;
1138         return cosh(\$z) / \$sz;
1139 }
1141 #
1142 # cotanh
1143 #
1144 # Alias for coth().
1145 #
1146 sub cotanh { Math::Complex::coth(@_) }
1148 #
1149 # acosh
1150 #
1151 # Computes the arc hyperbolic cosine acosh(z) = log(z + sqrt(z*z-1)).
1152 #
1153 sub acosh {
1154         my (\$z) = @_;
1155         unless (ref \$z) {
1156             \$z = cplx(\$z, 0);
1157         }
1158         my (\$re, \$im) = @{\$z->cartesian};
1159         if (\$im == 0) {
1160             return CORE::log(\$re + CORE::sqrt(\$re*\$re - 1))
1161                 if \$re >= 1;
1162             return cplx(0, CORE::atan2(CORE::sqrt(1 - \$re*\$re), \$re))
1163                 if CORE::abs(\$re) < 1;
1164         }
1165         my \$t = &sqrt(\$z * \$z - 1) + \$z;
1166         # Try Taylor if looking bad (this usually means that
1167         # \$z was large negative, therefore the sqrt is really
1168         # close to abs(z), summing that with z...)
1169         \$t = 1/(2 * \$z) - 1/(8 * \$z**3) + 1/(16 * \$z**5) - 5/(128 * \$z**7)
1170             if \$t == 0;
1171         my \$u = &log(\$t);
1172         \$u->Im(-\$u->Im) if \$re < 0 && \$im == 0;
1173         return \$re < 0 ? -\$u : \$u;
1174 }
1176 #
1177 # asinh
1178 #
1179 # Computes the arc hyperbolic sine asinh(z) = log(z + sqrt(z*z+1))
1180 #
1181 sub asinh {
1182         my (\$z) = @_;
1183         unless (ref \$z) {
1184             my \$t = \$z + CORE::sqrt(\$z*\$z + 1);
1185             return CORE::log(\$t) if \$t;
1186         }
1187         my \$t = &sqrt(\$z * \$z + 1) + \$z;
1188         # Try Taylor if looking bad (this usually means that
1189         # \$z was large negative, therefore the sqrt is really
1190         # close to abs(z), summing that with z...)
1191         \$t = 1/(2 * \$z) - 1/(8 * \$z**3) + 1/(16 * \$z**5) - 5/(128 * \$z**7)
1192             if \$t == 0;
1193         return &log(\$t);
1194 }
1196 #
1197 # atanh
1198 #
1199 # Computes the arc hyperbolic tangent atanh(z) = 1/2 log((1+z) / (1-z)).
1200 #
1201 sub atanh {
1202         my (\$z) = @_;
1203         unless (ref \$z) {
1204             return CORE::log((1 + \$z)/(1 - \$z))/2 if CORE::abs(\$z) < 1;
1205             \$z = cplx(\$z, 0);
1206         }
1207         _divbyzero 'atanh(1)',  "1 - \$z" if (1 - \$z == 0);
1208         _logofzero 'atanh(-1)'           if (1 + \$z == 0);
1209         return 0.5 * &log((1 + \$z) / (1 - \$z));
1210 }
1212 #
1213 # asech
1214 #
1215 # Computes the hyperbolic arc secant asech(z) = acosh(1 / z).
1216 #
1217 sub asech {
1218         my (\$z) = @_;
1219         _divbyzero 'asech(0)', "\$z" if (\$z == 0);
1220         return acosh(1 / \$z);
1221 }
1223 #
1224 # acsch
1225 #
1226 # Computes the hyperbolic arc cosecant acsch(z) = asinh(1 / z).
1227 #
1228 sub acsch {
1229         my (\$z) = @_;
1230         _divbyzero 'acsch(0)', \$z if (\$z == 0);
1231         return asinh(1 / \$z);
1232 }
1234 #
1235 # acosech
1236 #
1237 # Alias for acosh().
1238 #
1239 sub acosech { Math::Complex::acsch(@_) }
1241 #
1242 # acoth
1243 #
1244 # Computes the arc hyperbolic cotangent acoth(z) = 1/2 log((1+z) / (z-1)).
1245 #
1246 sub acoth {
1247         my (\$z) = @_;
1248         _divbyzero 'acoth(0)'            if (\$z == 0);
1249         unless (ref \$z) {
1250             return CORE::log((\$z + 1)/(\$z - 1))/2 if CORE::abs(\$z) > 1;
1251             \$z = cplx(\$z, 0);
1252         }
1253         _divbyzero 'acoth(1)',  "\$z - 1" if (\$z - 1 == 0);
1254         _logofzero 'acoth(-1)', "1 + \$z" if (1 + \$z == 0);
1255         return &log((1 + \$z) / (\$z - 1)) / 2;
1256 }
1258 #
1259 # acotanh
1260 #
1261 # Alias for acot().
1262 #
1263 sub acotanh { Math::Complex::acoth(@_) }
1265 #
1266 # (atan2)
1267 #
1268 # Compute atan(z1/z2).
1269 #
1270 sub atan2 {
1271         my (\$z1, \$z2, \$inverted) = @_;
1272         my (\$re1, \$im1, \$re2, \$im2);
1273         if (\$inverted) {
1274             (\$re1, \$im1) = ref \$z2 ? @{\$z2->cartesian} : (\$z2, 0);
1275             (\$re2, \$im2) = @{\$z1->cartesian};
1276         } else {
1277             (\$re1, \$im1) = @{\$z1->cartesian};
1278             (\$re2, \$im2) = ref \$z2 ? @{\$z2->cartesian} : (\$z2, 0);
1279         }
1280         if (\$im2 == 0) {
1281             return CORE::atan2(\$re1, \$re2) if \$im1 == 0;
1282             return (\$im1<=>0) * pip2 if \$re2 == 0;
1283         }
1284         my \$w = atan(\$z1/\$z2);
1285         my (\$u, \$v) = ref \$w ? @{\$w->cartesian} : (\$w, 0);
1286         \$u += pi   if \$re2 < 0;
1287         \$u -= pit2 if \$u > pi;
1288         return cplx(\$u, \$v);
1289 }
1291 #
1292 # display_format
1293 # ->display_format
1294 #
1295 # Set (get if no argument) the display format for all complex numbers that
1296 # don't happen to have overridden it via ->display_format
1297 #
1298 # When called as an object method, this actually sets the display format for
1299 # the current object.
1300 #
1301 # Valid object formats are 'c' and 'p' for cartesian and polar. The first
1302 # letter is used actually, so the type can be fully spelled out for clarity.
1303 #
1304 sub display_format {
1305         my \$self  = shift;
1306         my %display_format = %DISPLAY_FORMAT;
1308         if (ref \$self) {                        # Called as an object method
1309             if (exists \$self->{display_format}) {
1310                 my %obj = %{\$self->{display_format}};
1311                 @display_format{keys %obj} = values %obj;
1312             }
1313         }
1314         if (@_ == 1) {
1315             \$display_format{style} = shift;
1316         } else {
1317             my %new = @_;
1318             @display_format{keys %new} = values %new;
1319         }
1321         if (ref \$self) { # Called as an object method
1322             \$self->{display_format} = { %display_format };
1323             return
1324                 wantarray ?
1325                     %{\$self->{display_format}} :
1326                     \$self->{display_format}->{style};
1327         }
1329         # Called as a class method
1330         %DISPLAY_FORMAT = %display_format;
1331         return
1332             wantarray ?
1333                 %DISPLAY_FORMAT :
1334                     \$DISPLAY_FORMAT{style};
1335 }
1337 #
1338 # (stringify)
1339 #
1340 # Show nicely formatted complex number under its cartesian or polar form,
1341 # depending on the current display format:
1342 #
1343 # . If a specific display format has been recorded for this object, use it.
1344 # . Otherwise, use the generic current default for all complex numbers,
1345 #   which is a package global variable.
1346 #
1347 sub stringify {
1348         my (\$z) = shift;
1350         my \$style = \$z->display_format;
1352         \$style = \$DISPLAY_FORMAT{style} unless defined \$style;
1354         return \$z->stringify_polar if \$style =~ /^p/i;
1355         return \$z->stringify_cartesian;
1356 }
1358 #
1359 # ->stringify_cartesian
1360 #
1361 # Stringify as a cartesian representation 'a+bi'.
1362 #
1363 sub stringify_cartesian {
1364         my \$z  = shift;
1365         my (\$x, \$y) = @{\$z->cartesian};
1366         my (\$re, \$im);
1368         my %format = \$z->display_format;
1369         my \$format = \$format{format};
1371         if (\$x) {
1372             if (\$x =~ /^NaN[QS]?\$/i) {
1373                 \$re = \$x;
1374             } else {
1375                 if (\$x =~ /^-?\$Inf\$/oi) {
1376                     \$re = \$x;
1377                 } else {
1378                     \$re = defined \$format ? sprintf(\$format, \$x) : \$x;
1379                 }
1380             }
1381         } else {
1382             undef \$re;
1383         }
1385         if (\$y) {
1386             if (\$y =~ /^(NaN[QS]?)\$/i) {
1387                 \$im = \$y;
1388             } else {
1389                 if (\$y =~ /^-?\$Inf\$/oi) {
1390                     \$im = \$y;
1391                 } else {
1392                     \$im =
1393                         defined \$format ?
1394                             sprintf(\$format, \$y) :
1395                             (\$y == 1 ? "" : (\$y == -1 ? "-" : \$y));
1396                 }
1397             }
1398             \$im .= "i";
1399         } else {
1400             undef \$im;
1401         }
1403         my \$str = \$re;
1405         if (defined \$im) {
1406             if (\$y < 0) {
1407                 \$str .= \$im;
1408             } elsif (\$y > 0 || \$im =~ /^NaN[QS]?i\$/i)  {
1409                 \$str .= "+" if defined \$re;
1410                 \$str .= \$im;
1411             }
1412         } elsif (!defined \$re) {
1413             \$str = "0";
1414         }
1416         return \$str;
1417 }
1420 #
1421 # ->stringify_polar
1422 #
1423 # Stringify as a polar representation '[r,t]'.
1424 #
1425 sub stringify_polar {
1426         my \$z  = shift;
1427         my (\$r, \$t) = @{\$z->polar};
1428         my \$theta;
1430         my %format = \$z->display_format;
1431         my \$format = \$format{format};
1433         if (\$t =~ /^NaN[QS]?\$/i || \$t =~ /^-?\$Inf\$/oi) {
1434             \$theta = \$t;
1435         } elsif (\$t == pi) {
1436             \$theta = "pi";
1437         } elsif (\$r == 0 || \$t == 0) {
1438             \$theta = defined \$format ? sprintf(\$format, \$t) : \$t;
1439         }
1441         return "[\$r,\$theta]" if defined \$theta;
1443         #
1444         # Try to identify pi/n and friends.
1445         #
1447         \$t -= int(CORE::abs(\$t) / pit2) * pit2;
1449         if (\$format{polar_pretty_print} && \$t) {
1450             my (\$a, \$b);
1451             for \$a (2..9) {
1452                 \$b = \$t * \$a / pi;
1453                 if (\$b =~ /^-?\d+\$/) {
1454                     \$b = \$b < 0 ? "-" : "" if CORE::abs(\$b) == 1;
1455                     \$theta = "\${b}pi/\$a";
1456                     last;
1457                 }
1458             }
1459         }
1461         if (defined \$format) {
1462             \$r     = sprintf(\$format, \$r);
1463             \$theta = sprintf(\$format, \$theta) unless defined \$theta;
1464         } else {
1465             \$theta = \$t unless defined \$theta;
1466         }
1468         return "[\$r,\$theta]";
1469 }
1471 1;
1472 __END__
1474 =pod
1478 Math::Complex - complex numbers and associated mathematical functions
1482         use Math::Complex;
1484         \$z = Math::Complex->make(5, 6);
1485         \$t = 4 - 3*i + \$z;
1486         \$j = cplxe(1, 2*pi/3);
1490 This package lets you create and manipulate complex numbers. By default,
1491 I<Perl> limits itself to real numbers, but an extra C<use> statement brings
1492 full complex support, along with a full set of mathematical functions
1493 typically associated with and/or extended to complex numbers.
1495 If you wonder what complex numbers are, they were invented to be able to solve
1496 the following equation:
1498         x*x = -1
1500 and by definition, the solution is noted I<i> (engineers use I<j> instead since
1501 I<i> usually denotes an intensity, but the name does not matter). The number
1502 I<i> is a pure I<imaginary> number.
1504 The arithmetics with pure imaginary numbers works just like you would expect
1505 it with real numbers... you just have to remember that
1507         i*i = -1
1509 so you have:
1511         5i + 7i = i * (5 + 7) = 12i
1512         4i - 3i = i * (4 - 3) = i
1513         4i * 2i = -8
1514         6i / 2i = 3
1515         1 / i = -i
1517 Complex numbers are numbers that have both a real part and an imaginary
1518 part, and are usually noted:
1520         a + bi
1522 where C<a> is the I<real> part and C<b> is the I<imaginary> part. The
1523 arithmetic with complex numbers is straightforward. You have to
1524 keep track of the real and the imaginary parts, but otherwise the
1525 rules used for real numbers just apply:
1527         (4 + 3i) + (5 - 2i) = (4 + 5) + i(3 - 2) = 9 + i
1528         (2 + i) * (4 - i) = 2*4 + 4i -2i -i*i = 8 + 2i + 1 = 9 + 2i
1530 A graphical representation of complex numbers is possible in a plane
1531 (also called the I<complex plane>, but it's really a 2D plane).
1532 The number
1534         z = a + bi
1536 is the point whose coordinates are (a, b). Actually, it would
1537 be the vector originating from (0, 0) to (a, b). It follows that the addition
1538 of two complex numbers is a vectorial addition.
1540 Since there is a bijection between a point in the 2D plane and a complex
1541 number (i.e. the mapping is unique and reciprocal), a complex number
1542 can also be uniquely identified with polar coordinates:
1544         [rho, theta]
1546 where C<rho> is the distance to the origin, and C<theta> the angle between
1547 the vector and the I<x> axis. There is a notation for this using the
1548 exponential form, which is:
1550         rho * exp(i * theta)
1552 where I<i> is the famous imaginary number introduced above. Conversion
1553 between this form and the cartesian form C<a + bi> is immediate:
1555         a = rho * cos(theta)
1556         b = rho * sin(theta)
1558 which is also expressed by this formula:
1560         z = rho * exp(i * theta) = rho * (cos theta + i * sin theta)
1562 In other words, it's the projection of the vector onto the I<x> and I<y>
1563 axes. Mathematicians call I<rho> the I<norm> or I<modulus> and I<theta>
1564 the I<argument> of the complex number. The I<norm> of C<z> will be
1565 noted C<abs(z)>.
1567 The polar notation (also known as the trigonometric
1568 representation) is much more handy for performing multiplications and
1569 divisions of complex numbers, whilst the cartesian notation is better
1570 suited for additions and subtractions. Real numbers are on the I<x>
1571 axis, and therefore I<theta> is zero or I<pi>.
1573 All the common operations that can be performed on a real number have
1574 been defined to work on complex numbers as well, and are merely
1575 I<extensions> of the operations defined on real numbers. This means
1576 they keep their natural meaning when there is no imaginary part, provided
1577 the number is within their definition set.
1579 For instance, the C<sqrt> routine which computes the square root of
1580 its argument is only defined for non-negative real numbers and yields a
1581 non-negative real number (it is an application from B<R+> to B<R+>).
1582 If we allow it to return a complex number, then it can be extended to
1583 negative real numbers to become an application from B<R> to B<C> (the
1584 set of complex numbers):
1586         sqrt(x) = x >= 0 ? sqrt(x) : sqrt(-x)*i
1588 It can also be extended to be an application from B<C> to B<C>,
1589 whilst its restriction to B<R> behaves as defined above by using
1590 the following definition:
1592         sqrt(z = [r,t]) = sqrt(r) * exp(i * t/2)
1594 Indeed, a negative real number can be noted C<[x,pi]> (the modulus
1595 I<x> is always non-negative, so C<[x,pi]> is really C<-x>, a negative
1596 number) and the above definition states that
1598         sqrt([x,pi]) = sqrt(x) * exp(i*pi/2) = [sqrt(x),pi/2] = sqrt(x)*i
1600 which is exactly what we had defined for negative real numbers above.
1601 The C<sqrt> returns only one of the solutions: if you want the both,
1602 use the C<root> function.
1604 All the common mathematical functions defined on real numbers that
1605 are extended to complex numbers share that same property of working
1606 I<as usual> when the imaginary part is zero (otherwise, it would not
1607 be called an extension, would it?).
1609 A I<new> operation possible on a complex number that is
1610 the identity for real numbers is called the I<conjugate>, and is noted
1611 with a horizontal bar above the number, or C<~z> here.
1613          z = a + bi
1614         ~z = a - bi
1616 Simple... Now look:
1618         z * ~z = (a + bi) * (a - bi) = a*a + b*b
1620 We saw that the norm of C<z> was noted C<abs(z)> and was defined as the
1621 distance to the origin, also known as:
1623         rho = abs(z) = sqrt(a*a + b*b)
1625 so
1627         z * ~z = abs(z) ** 2
1629 If z is a pure real number (i.e. C<b == 0>), then the above yields:
1631         a * a = abs(a) ** 2
1633 which is true (C<abs> has the regular meaning for real number, i.e. stands
1634 for the absolute value). This example explains why the norm of C<z> is
1635 noted C<abs(z)>: it extends the C<abs> function to complex numbers, yet
1636 is the regular C<abs> we know when the complex number actually has no
1637 imaginary part... This justifies I<a posteriori> our use of the C<abs>
1638 notation for the norm.
1642 Given the following notations:
1644         z1 = a + bi = r1 * exp(i * t1)
1645         z2 = c + di = r2 * exp(i * t2)
1646         z = <any complex or real number>
1648 the following (overloaded) operations are supported on complex numbers:
1650         z1 + z2 = (a + c) + i(b + d)
1651         z1 - z2 = (a - c) + i(b - d)
1652         z1 * z2 = (r1 * r2) * exp(i * (t1 + t2))
1653         z1 / z2 = (r1 / r2) * exp(i * (t1 - t2))
1654         z1 ** z2 = exp(z2 * log z1)
1655         ~z = a - bi
1656         abs(z) = r1 = sqrt(a*a + b*b)
1657         sqrt(z) = sqrt(r1) * exp(i * t/2)
1658         exp(z) = exp(a) * exp(i * b)
1659         log(z) = log(r1) + i*t
1660         sin(z) = 1/2i (exp(i * z1) - exp(-i * z))
1661         cos(z) = 1/2 (exp(i * z1) + exp(-i * z))
1662         atan2(z1, z2) = atan(z1/z2)
1664 The following extra operations are supported on both real and complex
1665 numbers:
1667         Re(z) = a
1668         Im(z) = b
1669         arg(z) = t
1670         abs(z) = r
1672         cbrt(z) = z ** (1/3)
1673         log10(z) = log(z) / log(10)
1674         logn(z, n) = log(z) / log(n)
1676         tan(z) = sin(z) / cos(z)
1678         csc(z) = 1 / sin(z)
1679         sec(z) = 1 / cos(z)
1680         cot(z) = 1 / tan(z)
1682         asin(z) = -i * log(i*z + sqrt(1-z*z))
1683         acos(z) = -i * log(z + i*sqrt(1-z*z))
1684         atan(z) = i/2 * log((i+z) / (i-z))
1686         acsc(z) = asin(1 / z)
1687         asec(z) = acos(1 / z)
1688         acot(z) = atan(1 / z) = -i/2 * log((i+z) / (z-i))
1690         sinh(z) = 1/2 (exp(z) - exp(-z))
1691         cosh(z) = 1/2 (exp(z) + exp(-z))
1692         tanh(z) = sinh(z) / cosh(z) = (exp(z) - exp(-z)) / (exp(z) + exp(-z))
1694         csch(z) = 1 / sinh(z)
1695         sech(z) = 1 / cosh(z)
1696         coth(z) = 1 / tanh(z)
1698         asinh(z) = log(z + sqrt(z*z+1))
1699         acosh(z) = log(z + sqrt(z*z-1))
1700         atanh(z) = 1/2 * log((1+z) / (1-z))
1702         acsch(z) = asinh(1 / z)
1703         asech(z) = acosh(1 / z)
1704         acoth(z) = atanh(1 / z) = 1/2 * log((1+z) / (z-1))
1706 I<arg>, I<abs>, I<log>, I<csc>, I<cot>, I<acsc>, I<acot>, I<csch>,
1707 I<coth>, I<acosech>, I<acotanh>, have aliases I<rho>, I<theta>, I<ln>,
1708 I<cosec>, I<cotan>, I<acosec>, I<acotan>, I<cosech>, I<cotanh>,
1709 I<acosech>, I<acotanh>, respectively.  C<Re>, C<Im>, C<arg>, C<abs>,
1710 C<rho>, and C<theta> can be used also as mutators.  The C<cbrt>
1711 returns only one of the solutions: if you want all three, use the
1712 C<root> function.
1714 The I<root> function is available to compute all the I<n>
1715 roots of some complex, where I<n> is a strictly positive integer.
1716 There are exactly I<n> such roots, returned as a list. Getting the
1717 number mathematicians call C<j> such that:
1719         1 + j + j*j = 0;
1721 is a simple matter of writing:
1723         \$j = ((root(1, 3));
1725 The I<k>th root for C<z = [r,t]> is given by:
1727         (root(z, n))[k] = r**(1/n) * exp(i * (t + 2*k*pi)/n)
1729 The I<spaceship> comparison operator, E<lt>=E<gt>, is also defined. In
1730 order to ensure its restriction to real numbers is conform to what you
1731 would expect, the comparison is run on the real part of the complex
1732 number first, and imaginary parts are compared only when the real
1733 parts match.
1737 To create a complex number, use either:
1739         \$z = Math::Complex->make(3, 4);
1740         \$z = cplx(3, 4);
1742 if you know the cartesian form of the number, or
1744         \$z = 3 + 4*i;
1746 if you like. To create a number using the polar form, use either:
1748         \$z = Math::Complex->emake(5, pi/3);
1749         \$x = cplxe(5, pi/3);
1751 instead. The first argument is the modulus, the second is the angle
1752 (in radians, the full circle is 2*pi).  (Mnemonic: C<e> is used as a
1753 notation for complex numbers in the polar form).
1755 It is possible to write:
1757         \$x = cplxe(-3, pi/4);
1759 but that will be silently converted into C<[3,-3pi/4]>, since the
1760 modulus must be non-negative (it represents the distance to the origin
1761 in the complex plane).
1763 It is also possible to have a complex number as either argument of the
1764 C<make>, C<emake>, C<cplx>, and C<cplxe>: the appropriate component of
1765 the argument will be used.
1767         \$z1 = cplx(-2,  1);
1768         \$z2 = cplx(\$z1, 4);
1770 The C<new>, C<make>, C<emake>, C<cplx>, and C<cplxe> will also
1771 understand a single (string) argument of the forms
1773         2-3i
1774         -3i
1775         [2,3]
1776         
1778 in which case the appropriate cartesian and exponential components
1779 will be parsed from the string and used to create new complex numbers.
1780 The imaginary component and the theta, respectively, will default to zero.
1784 When printed, a complex number is usually shown under its cartesian
1785 style I<a+bi>, but there are legitimate cases where the polar style
1786 I<[r,t]> is more appropriate.
1788 By calling the class method C<Math::Complex::display_format> and
1789 supplying either C<"polar"> or C<"cartesian"> as an argument, you
1790 override the default display style, which is C<"cartesian">. Not
1791 supplying any argument returns the current settings.
1793 This default can be overridden on a per-number basis by calling the
1794 C<display_format> method instead. As before, not supplying any argument
1795 returns the current display style for this number. Otherwise whatever you
1796 specify will be the new display style for I<this> particular number.
1798 For instance:
1800         use Math::Complex;
1802         Math::Complex::display_format('polar');
1803         \$j = (root(1, 3));
1804         print "j = \$j\n";               # Prints "j = [1,2pi/3]"
1805         \$j->display_format('cartesian');
1806         print "j = \$j\n";               # Prints "j = -0.5+0.866025403784439i"
1808 The polar style attempts to emphasize arguments like I<k*pi/n>
1809 (where I<n> is a positive integer and I<k> an integer within [-9, +9]),
1810 this is called I<polar pretty-printing>.
1812 =head2 CHANGED IN PERL 5.6
1814 The C<display_format> class method and the corresponding
1815 C<display_format> object method can now be called using
1816 a parameter hash instead of just a one parameter.
1818 The old display format style, which can have values C<"cartesian"> or
1819 C<"polar">, can be changed using the C<"style"> parameter.
1821         \$j->display_format(style => "polar");
1823 The one parameter calling convention also still works.
1825         \$j->display_format("polar");
1827 There are two new display parameters.
1829 The first one is C<"format">, which is a sprintf()-style format string
1830 to be used for both numeric parts of the complex number(s).  The is
1831 somewhat system-dependent but most often it corresponds to C<"%.15g">.
1832 You can revert to the default by setting the C<format> to C<undef>.
1834         # the \$j from the above example
1836         \$j->display_format('format' => '%.5f');
1837         print "j = \$j\n";               # Prints "j = -0.50000+0.86603i"
1838         \$j->display_format('format' => undef);
1839         print "j = \$j\n";               # Prints "j = -0.5+0.86603i"
1841 Notice that this affects also the return values of the
1842 C<display_format> methods: in list context the whole parameter hash
1843 will be returned, as opposed to only the style parameter value.
1844 This is a potential incompatibility with earlier versions if you
1845 have been calling the C<display_format> method in list context.
1847 The second new display parameter is C<"polar_pretty_print">, which can
1848 be set to true or false, the default being true.  See the previous
1849 section for what this means.
1853 Thanks to overloading, the handling of arithmetics with complex numbers
1854 is simple and almost transparent.
1856 Here are some examples:
1858         use Math::Complex;
1860         \$j = cplxe(1, 2*pi/3);  # \$j ** 3 == 1
1861         print "j = \$j, j**3 = ", \$j ** 3, "\n";
1862         print "1 + j + j**2 = ", 1 + \$j + \$j**2, "\n";
1864         \$z = -16 + 0*i;                 # Force it to be a complex
1865         print "sqrt(\$z) = ", sqrt(\$z), "\n";
1867         \$k = exp(i * 2*pi/3);
1868         print "\$j - \$k = ", \$j - \$k, "\n";
1870         \$z->Re(3);                      # Re, Im, arg, abs,
1871         \$j->arg(2);                     # (the last two aka rho, theta)
1872                                         # can be used also as mutators.
1874 =head1 ERRORS DUE TO DIVISION BY ZERO OR LOGARITHM OF ZERO
1876 The division (/) and the following functions
1878         log     ln      log10   logn
1879         tan     sec     csc     cot
1880         atan    asec    acsc    acot
1881         tanh    sech    csch    coth
1882         atanh   asech   acsch   acoth
1884 cannot be computed for all arguments because that would mean dividing
1885 by zero or taking logarithm of zero. These situations cause fatal
1886 runtime errors looking like this
1888         cot(0): Division by zero.
1889         (Because in the definition of cot(0), the divisor sin(0) is 0)
1890         Died at ...
1892 or
1894         atanh(-1): Logarithm of zero.
1895         Died at...
1897 For the C<csc>, C<cot>, C<asec>, C<acsc>, C<acot>, C<csch>, C<coth>,
1898 C<asech>, C<acsch>, the argument cannot be C<0> (zero).  For the
1899 logarithmic functions and the C<atanh>, C<acoth>, the argument cannot
1900 be C<1> (one).  For the C<atanh>, C<acoth>, the argument cannot be
1901 C<-1> (minus one).  For the C<atan>, C<acot>, the argument cannot be
1902 C<i> (the imaginary unit).  For the C<atan>, C<acoth>, the argument
1903 cannot be C<-i> (the negative imaginary unit).  For the C<tan>,
1904 C<sec>, C<tanh>, the argument cannot be I<pi/2 + k * pi>, where I<k>
1905 is any integer.
1907 Note that because we are operating on approximations of real numbers,
1908 these errors can happen when merely `too close' to the singularities
1909 listed above.
1911 =head1 ERRORS DUE TO INDIGESTIBLE ARGUMENTS
1913 The C<make> and C<emake> accept both real and complex arguments.
1914 When they cannot recognize the arguments they will die with error
1915 messages like the following
1917     Math::Complex::make: Cannot take real part of ...
1918     Math::Complex::make: Cannot take real part of ...
1919     Math::Complex::emake: Cannot take rho of ...
1920     Math::Complex::emake: Cannot take theta of ...
1924 Saying C<use Math::Complex;> exports many mathematical routines in the
1925 caller environment and even overrides some (C<sqrt>, C<log>).
1926 This is construed as a feature by the Authors, actually... ;-)
1928 All routines expect to be given real or complex numbers. Don't attempt to
1929 use BigFloat, since Perl has currently no rule to disambiguate a '+'
1930 operation (for instance) between two overloaded entities.
1932 In Cray UNICOS there is some strange numerical instability that results
1933 in root(), cos(), sin(), cosh(), sinh(), losing accuracy fast.  Beware.
1934 The bug may be in UNICOS math libs, in UNICOS C compiler, in Math::Complex.
1935 Whatever it is, it does not manifest itself anywhere else where Perl runs.