ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/staticperl/perl/lib/Math/Complex.pm
Revision: 1.1
Committed: Thu Jun 30 14:27:13 2005 UTC (21 years, 3 months ago) by root
Branch: MAIN
CVS Tags: PERL-5-8-7, HEAD
Branch point for: PERL
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.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     #
7    
8     package Math::Complex;
9    
10     our($VERSION, @ISA, @EXPORT, %EXPORT_TAGS, $Inf);
11    
12     $VERSION = 1.34;
13    
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     }
34    
35     use strict;
36    
37     my $i;
38     my %LOGN;
39    
40     # Regular expression for floating point numbers.
41     my $gre = qr'\s*([\+\-]?(?:(?:(?:\d+(?:_\d+)*(?:\.\d*(?:_\d+)*)?|\.\d+(?:_\d+)*)(?:[eE][\+\-]?\d+(?:_\d+)*)?)))';
42    
43     require Exporter;
44    
45     @ISA = qw(Exporter);
46    
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     );
58    
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);
66    
67     %EXPORT_TAGS = (
68     'trig' => [@trig],
69     );
70    
71     use overload
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);
90    
91     #
92     # Package "privates"
93     #
94    
95     my %DISPLAY_FORMAT = ('style' => 'cartesian',
96     'polar_pretty_print' => 1);
97     my $eps = 1e-14; # Epsilon
98    
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     #
107    
108     # Die on bad *make() arguments.
109    
110     sub _cannot_make {
111     die "@{[(caller(1))[3]]}: Cannot take $_[0] of $_[1].\n";
112     }
113    
114     sub _remake {
115     my $arg = shift;
116     my ($made, $p, $q);
117    
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     }
125    
126     if ($made) {
127     $p =~ s/^\+//;
128     $q =~ s/^\+//;
129     }
130    
131     return ($made, $p, $q);
132     }
133    
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     }
177    
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     }
225    
226     sub new { &make } # For backward compatibility only.
227    
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     }
237    
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     }
247    
248     #
249     # pi
250     #
251     # The number defined as pi = 180 degrees
252     #
253     sub pi () { 4 * CORE::atan2(1, 1) }
254    
255     #
256     # pit2
257     #
258     # The full circle
259     #
260     sub pit2 () { 2 * pi }
261    
262     #
263     # pip2
264     #
265     # The quarter circle
266     #
267     sub pip2 () { pi / 2 }
268    
269     #
270     # deg1
271     #
272     # One degree in radians, used in stringify_polar.
273     #
274    
275     sub deg1 () { pi / 180 }
276    
277     #
278     # uplog10
279     #
280     # Used in log10().
281     #
282     sub uplog10 () { 1 / CORE::log(10) }
283    
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     }
298    
299     #
300     # ip2
301     #
302     # Half of i.
303     #
304     sub ip2 () { i / 2 }
305    
306     #
307     # Attribute access/set routines
308     #
309    
310     sub cartesian {$_[0]->{c_dirty} ?
311     $_[0]->update_cartesian : $_[0]->{'cartesian'}}
312     sub polar {$_[0]->{p_dirty} ?
313     $_[0]->update_polar : $_[0]->{'polar'}}
314    
315     sub set_cartesian { $_[0]->{p_dirty}++; $_[0]->{'cartesian'} = $_[1] }
316     sub set_polar { $_[0]->{c_dirty}++; $_[0]->{'polar'} = $_[1] }
317    
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     }
329    
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     }
344    
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     }
361    
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);
379    
380     }
381    
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     }
411    
412     #
413     # _divbyzero
414     #
415     # Die on division by zero.
416     #
417     sub _divbyzero {
418     my $mess = "$_[0]: Division by zero.\n";
419    
420     if (defined $_[1]) {
421     $mess .= "(Because in the definition of $_[0], the divisor ";
422     $mess .= "$_[1] " unless ("$_[1]" eq '0');
423     $mess .= "is 0)\n";
424     }
425    
426     my @up = caller(1);
427    
428     $mess .= "Died at $up[1] line $up[2].\n";
429    
430     die $mess;
431     }
432    
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     }
481    
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     }
503    
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     }
518    
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     }
531    
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     }
547    
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     }
562    
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     $_[0] = $_[1];
573     } else {
574     return CORE::abs($z);
575     }
576     }
577     if (defined $rho) {
578     $z->{'polar'} = [ $rho, ${$z->polar}[1] ];
579     $z->{p_dirty} = 0;
580     $z->{c_dirty} = 1;
581     return $rho;
582     } else {
583     return ${$z->polar}[0];
584     }
585     }
586    
587     sub _theta {
588     my $theta = $_[0];
589    
590     if ($$theta > pi()) { $$theta -= pit2 }
591     elsif ($$theta <= -pi()) { $$theta += pit2 }
592     }
593    
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}[0], $theta ];
605     $z->{p_dirty} = 0;
606     $z->{c_dirty} = 1;
607     } else {
608     $theta = ${$z->polar}[1];
609     _theta(\$theta);
610     }
611     return $theta;
612     }
613    
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     }
637    
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     }
655    
656     #
657     # _rootbad
658     #
659     # Die on bad root.
660     #
661     sub _rootbad {
662     my $mess = "Root $_[0] illegal, root rank must be positive integer.\n";
663    
664     my @up = caller(1);
665    
666     $mess .= "Died at $up[1] line $up[2].\n";
667    
668     die $mess;
669     }
670    
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     }
699    
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}[1] ];
710     $z->{c_dirty} = 0;
711     $z->{p_dirty} = 1;
712     } else {
713     return ${$z->cartesian}[0];
714     }
715     }
716    
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}[0], $Im ];
727     $z->{c_dirty} = 0;
728     $z->{p_dirty} = 1;
729     } else {
730     return ${$z->cartesian}[1];
731     }
732     }
733    
734     #
735     # rho
736     #
737     # Return or set rho(w).
738     #
739     sub rho {
740     Math::Complex::abs(@_);
741     }
742    
743     #
744     # theta
745     #
746     # Return or set theta(w).
747     #
748     sub theta {
749     Math::Complex::arg(@_);
750     }
751    
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     }
762    
763     #
764     # _logofzero
765     #
766     # Die on logarithm of zero.
767     #
768     sub _logofzero {
769     my $mess = "$_[0]: Logarithm of zero.\n";
770    
771     if (defined $_[1]) {
772     $mess .= "(Because in the definition of $_[0], the argument ";
773     $mess .= "$_[1] " unless ($_[1] eq '0');
774     $mess .= "is 0)\n";
775     }
776    
777     my @up = caller(1);
778    
779     $mess .= "Died at $up[1] line $up[2].\n";
780    
781     die $mess;
782     }
783    
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     }
801    
802     #
803     # ln
804     #
805     # Alias for log().
806     #
807     sub ln { Math::Complex::log(@_) }
808    
809     #
810     # log10
811     #
812     # Compute log10(z).
813     #
814    
815     sub log10 {
816     return Math::Complex::log($_[0]) * uplog10;
817     }
818    
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     }
831    
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     }
848    
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     }
865    
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     }
877    
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     }
889    
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     }
901    
902     #
903     # cosec
904     #
905     # Alias for csc().
906     #
907     sub cosec { Math::Complex::csc(@_) }
908    
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     }
920    
921     #
922     # cotan
923     #
924     # Alias for cot().
925     #
926     sub cotan { Math::Complex::cot(@_) }
927    
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 = $_[0];
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     }
952    
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 = $_[0];
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     }
977    
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     }
993    
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     }
1004    
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     }
1015    
1016     #
1017     # acosec
1018     #
1019     # Alias for acsc().
1020     #
1021     sub acosec { Math::Complex::acsc(@_) }
1022    
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     }
1037    
1038     #
1039     # acotan
1040     #
1041     # Alias for acot().
1042     #
1043     sub acotan { Math::Complex::acot(@_) }
1044    
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     }
1063    
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     }
1085    
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     }
1097    
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     }
1109    
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     }
1121    
1122     #
1123     # cosech
1124     #
1125     # Alias for csch().
1126     #
1127     sub cosech { Math::Complex::csch(@_) }
1128    
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     }
1140    
1141     #
1142     # cotanh
1143     #
1144     # Alias for coth().
1145     #
1146     sub cotanh { Math::Complex::coth(@_) }
1147    
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     }
1175    
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     }
1195    
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     }
1211    
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     }
1222    
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     }
1233    
1234     #
1235     # acosech
1236     #
1237     # Alias for acosh().
1238     #
1239     sub acosech { Math::Complex::acsch(@_) }
1240    
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     }
1257    
1258     #
1259     # acotanh
1260     #
1261     # Alias for acot().
1262     #
1263     sub acotanh { Math::Complex::acoth(@_) }
1264    
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     }
1290    
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;
1307    
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     }
1320    
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     }
1328    
1329     # Called as a class method
1330     %DISPLAY_FORMAT = %display_format;
1331     return
1332     wantarray ?
1333     %DISPLAY_FORMAT :
1334     $DISPLAY_FORMAT{style};
1335     }
1336    
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;
1349    
1350     my $style = $z->display_format;
1351    
1352     $style = $DISPLAY_FORMAT{style} unless defined $style;
1353    
1354     return $z->stringify_polar if $style =~ /^p/i;
1355     return $z->stringify_cartesian;
1356     }
1357    
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);
1367    
1368     my %format = $z->display_format;
1369     my $format = $format{format};
1370    
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     }
1384    
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     }
1402    
1403     my $str = $re;
1404    
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     }
1415    
1416     return $str;
1417     }
1418    
1419    
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;
1429    
1430     my %format = $z->display_format;
1431     my $format = $format{format};
1432    
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     }
1440    
1441     return "[$r,$theta]" if defined $theta;
1442    
1443     #
1444     # Try to identify pi/n and friends.
1445     #
1446    
1447     $t -= int(CORE::abs($t) / pit2) * pit2;
1448    
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     }
1460    
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     }
1467    
1468     return "[$r,$theta]";
1469     }
1470    
1471     1;
1472     __END__
1473    
1474     =pod
1475    
1476     =head1 NAME
1477    
1478     Math::Complex - complex numbers and associated mathematical functions
1479    
1480     =head1 SYNOPSIS
1481    
1482     use Math::Complex;
1483    
1484     $z = Math::Complex->make(5, 6);
1485     $t = 4 - 3*i + $z;
1486     $j = cplxe(1, 2*pi/3);
1487    
1488     =head1 DESCRIPTION
1489    
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.
1494    
1495     If you wonder what complex numbers are, they were invented to be able to solve
1496     the following equation:
1497    
1498     x*x = -1
1499    
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.
1503    
1504     The arithmetics with pure imaginary numbers works just like you would expect
1505     it with real numbers... you just have to remember that
1506    
1507     i*i = -1
1508    
1509     so you have:
1510    
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
1516    
1517     Complex numbers are numbers that have both a real part and an imaginary
1518     part, and are usually noted:
1519    
1520     a + bi
1521    
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:
1526    
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
1529    
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
1533    
1534     z = a + bi
1535    
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.
1539    
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:
1543    
1544     [rho, theta]
1545    
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:
1549    
1550     rho * exp(i * theta)
1551    
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:
1554    
1555     a = rho * cos(theta)
1556     b = rho * sin(theta)
1557    
1558     which is also expressed by this formula:
1559    
1560     z = rho * exp(i * theta) = rho * (cos theta + i * sin theta)
1561    
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)>.
1566    
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>.
1572    
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.
1578    
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):
1585    
1586     sqrt(x) = x >= 0 ? sqrt(x) : sqrt(-x)*i
1587    
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:
1591    
1592     sqrt(z = [r,t]) = sqrt(r) * exp(i * t/2)
1593    
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
1597    
1598     sqrt([x,pi]) = sqrt(x) * exp(i*pi/2) = [sqrt(x),pi/2] = sqrt(x)*i
1599    
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.
1603    
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?).
1608    
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.
1612    
1613     z = a + bi
1614     ~z = a - bi
1615    
1616     Simple... Now look:
1617    
1618     z * ~z = (a + bi) * (a - bi) = a*a + b*b
1619    
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:
1622    
1623     rho = abs(z) = sqrt(a*a + b*b)
1624    
1625     so
1626    
1627     z * ~z = abs(z) ** 2
1628    
1629     If z is a pure real number (i.e. C<b == 0>), then the above yields:
1630    
1631     a * a = abs(a) ** 2
1632    
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.
1639    
1640     =head1 OPERATIONS
1641    
1642     Given the following notations:
1643    
1644     z1 = a + bi = r1 * exp(i * t1)
1645     z2 = c + di = r2 * exp(i * t2)
1646     z = <any complex or real number>
1647    
1648     the following (overloaded) operations are supported on complex numbers:
1649    
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)
1663    
1664     The following extra operations are supported on both real and complex
1665     numbers:
1666    
1667     Re(z) = a
1668     Im(z) = b
1669     arg(z) = t
1670     abs(z) = r
1671    
1672     cbrt(z) = z ** (1/3)
1673     log10(z) = log(z) / log(10)
1674     logn(z, n) = log(z) / log(n)
1675    
1676     tan(z) = sin(z) / cos(z)
1677    
1678     csc(z) = 1 / sin(z)
1679     sec(z) = 1 / cos(z)
1680     cot(z) = 1 / tan(z)
1681    
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))
1685    
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))
1689    
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))
1693    
1694     csch(z) = 1 / sinh(z)
1695     sech(z) = 1 / cosh(z)
1696     coth(z) = 1 / tanh(z)
1697    
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))
1701    
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))
1705    
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.
1713    
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:
1718    
1719     1 + j + j*j = 0;
1720    
1721     is a simple matter of writing:
1722    
1723     $j = ((root(1, 3))[1];
1724    
1725     The I<k>th root for C<z = [r,t]> is given by:
1726    
1727     (root(z, n))[k] = r**(1/n) * exp(i * (t + 2*k*pi)/n)
1728    
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.
1734    
1735     =head1 CREATION
1736    
1737     To create a complex number, use either:
1738    
1739     $z = Math::Complex->make(3, 4);
1740     $z = cplx(3, 4);
1741    
1742     if you know the cartesian form of the number, or
1743    
1744     $z = 3 + 4*i;
1745    
1746     if you like. To create a number using the polar form, use either:
1747    
1748     $z = Math::Complex->emake(5, pi/3);
1749     $x = cplxe(5, pi/3);
1750    
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).
1754    
1755     It is possible to write:
1756    
1757     $x = cplxe(-3, pi/4);
1758    
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).
1762    
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.
1766    
1767     $z1 = cplx(-2, 1);
1768     $z2 = cplx($z1, 4);
1769    
1770     The C<new>, C<make>, C<emake>, C<cplx>, and C<cplxe> will also
1771     understand a single (string) argument of the forms
1772    
1773     2-3i
1774     -3i
1775     [2,3]
1776     [2]
1777    
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.
1781    
1782     =head1 STRINGIFICATION
1783    
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.
1787    
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.
1792    
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.
1797    
1798     For instance:
1799    
1800     use Math::Complex;
1801    
1802     Math::Complex::display_format('polar');
1803     $j = (root(1, 3))[1];
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"
1807    
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>.
1811    
1812     =head2 CHANGED IN PERL 5.6
1813    
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.
1817    
1818     The old display format style, which can have values C<"cartesian"> or
1819     C<"polar">, can be changed using the C<"style"> parameter.
1820    
1821     $j->display_format(style => "polar");
1822    
1823     The one parameter calling convention also still works.
1824    
1825     $j->display_format("polar");
1826    
1827     There are two new display parameters.
1828    
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>.
1833    
1834     # the $j from the above example
1835    
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"
1840    
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.
1846    
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.
1850    
1851     =head1 USAGE
1852    
1853     Thanks to overloading, the handling of arithmetics with complex numbers
1854     is simple and almost transparent.
1855    
1856     Here are some examples:
1857    
1858     use Math::Complex;
1859    
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";
1863    
1864     $z = -16 + 0*i; # Force it to be a complex
1865     print "sqrt($z) = ", sqrt($z), "\n";
1866    
1867     $k = exp(i * 2*pi/3);
1868     print "$j - $k = ", $j - $k, "\n";
1869    
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.
1873    
1874     =head1 ERRORS DUE TO DIVISION BY ZERO OR LOGARITHM OF ZERO
1875    
1876     The division (/) and the following functions
1877    
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
1883    
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
1887    
1888     cot(0): Division by zero.
1889     (Because in the definition of cot(0), the divisor sin(0) is 0)
1890     Died at ...
1891    
1892     or
1893    
1894     atanh(-1): Logarithm of zero.
1895     Died at...
1896    
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.
1906    
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.
1910    
1911     =head1 ERRORS DUE TO INDIGESTIBLE ARGUMENTS
1912    
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
1916    
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 ...
1921    
1922     =head1 BUGS
1923    
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... ;-)
1927    
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.
1931    
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.
1936    
1937     =head1 AUTHORS
1938    
1939     Daniel S. Lewart <F<d-lewart@uiuc.edu>>
1940    
1941     Original authors Raphael Manfredi <F<Raphael_Manfredi@pobox.com>> and
1942     Jarkko Hietaniemi <F<jhi@iki.fi>>
1943    
1944     =cut
1945    
1946     1;
1947    
1948     # eof