Recipe 2.14 Using Complex Numbers
2.14.1 Problem
Your application must
manipulate complex numbers, as are often needed in engineering,
science, and mathematics.
2.14.2 Solution
Either keep track of the real and imaginary components yourself:
# $c = $a * $b manually
$c_real = ( $a_real * $b_real )  ( $a_imaginary * $b_imaginary );
$c_imaginary = ( $a_real * $b_imaginary ) + ( $b_real * $a_imaginary );
or use the Math::Complex module (part of the standard Perl
distribution):
# $c = $a * $b using Math::Complex
use Math::Complex;
$c = $a * $b;
2.14.3 Discussion
Here's how you'd manually multiply 3+5i and
22i:
$a_real = 3; $a_imaginary = 5; # 3 + 5i;
$b_real = 2; $b_imaginary = 2; # 2  2i;
$c_real = ( $a_real * $b_real )  ( $a_imaginary * $b_imaginary );
$c_imaginary = ( $a_real * $b_imaginary ) + ( $b_real * $a_imaginary );
print "c = ${c_real}+${c_imaginary}i\n";
c = 16+4i
and with Math::Complex:
use Math::Complex;
$a = Math::Complex>new(3,5); # or Math::Complex>new(3,5);
$b = Math::Complex>new(2,2);
$c = $a * $b;
print "c = $c\n";
c = 16+4i
You may create complex numbers via the cplx
constructor or via the exported constant i:
use Math::Complex;
$c = cplx(3,5) * cplx(2,2); # easier on the eye
$d = 3 + 4*i; # 3 + 4i
printf "sqrt($d) = %s\n", sqrt($d);
sqrt(3+4i) = 2+i
The
Math::Trig module uses the Math::Complex module internally because
some functions can break out from the real axis into the complex
plane—for example, the inverse sine of 2.
2.14.4 See Also
The documentation for the standard Math::Complex module (also in
Chapter 32 of Programming Perl)
