A complex number is expressed in the form z = a + b * i, where:
a is the real part (a real number),
b is the imaginary part (also a real number), and
i is the imaginary unit satisfying i^2 = -1.
The conjugate of the complex number z = a + b * i is given by:
zc = a - b * i
The absolute value (or modulus) of z is defined as:
|z| = sqrt(a^2 + b^2)
The square of the absolute value is computed as the product of z and its conjugate zc:
|z|^2 = z * zc = a^2 + b^2
The sum of two complex numbers z1 = a + b * i and z2 = c + d * i is computed by adding their real and imaginary parts separately:
z1 + z2 = (a + b * i) + (c + d * i)
= (a + c) + (b + d) * i
The difference of two complex numbers is obtained by subtracting their respective parts:
z1 - z2 = (a + b * i) - (c + d * i)
= (a - c) + (b - d) * i
The product of two complex numbers is defined as:
z1 * z2 = (a + b * i) * (c + d * i)
= (a * c - b * d) + (b * c + a * d) * i
The reciprocal of a non-zero complex number is given by:
1 / z = 1 / (a + b * i)
= a / (a^2 + b^2) - b / (a^2 + b^2) * i
The division of one complex number by another is given by:
z1 / z2 = z1 * (1 / z2)
= (a + b * i) / (c + d * i)
= (a * c + b * d) / (c^2 + d^2) + (b * c - a * d) / (c^2 + d^2) * i
Raising e (the base of the natural logarithm) to a complex exponent can be expressed using Euler's formula:
e^(a + b * i) = e^a * e^(b * i)
= e^a * (cos(b) + i * sin(b))
Given that you should not use built-in support for complex numbers, implement the following operations:
Define a cmplx tuple with slots real and imaginary. The
slot accessors real>> and imaginary>> come for free with the
tuple definition and are what the tests use to read components.
<cmplx> ( real imag -- cmplx ) — construct a complex number.>cmplx ( pair -- cmplx ) — build a cmplx from
{ real imaginary }.cmplx>pair ( cmplx -- pair ) — return { real imaginary }.c+ ( a b -- c ), c- ( a b -- c ), c* ( a b -- c ),
c/ ( a b -- c ) — arithmetic on two complex numbers.c-abs ( a -- |a| ) — absolute value (a real).c-conj ( a -- a* ) — complex conjugate.c-exp ( z -- e^z ) — complex exponential.Factor's MATH: generics (+, -, *, /) only dispatch over
the built-in math hierarchy, so this exercise uses dedicated word
names rather than methods on those generics.
Tests for arithmetic that mixes real numbers with complex numbers
are excluded — every operation here is between two cmplx
values.
Sign up to Exercism to learn and master Factor with 47 concepts163 exercises, and real human mentoring, all for free.