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 '/' => \÷, 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 1949