Tracks
/
Factor
Factor
/
Exercises
/
Complex Numbers
Complex Numbers

Complex Numbers

Medium

Instructions

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.

Operations on Complex Numbers

Conjugate

The conjugate of the complex number z = a + b * i is given by:

zc = a - b * i

Absolute Value

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

Addition

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

Subtraction

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

Multiplication

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

Reciprocal

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

Division

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

Exponentiation

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))

Implementation Requirements

Given that you should not use built-in support for complex numbers, implement the following operations:

  • addition of two complex numbers
  • subtraction of two complex numbers
  • multiplication of two complex numbers
  • division of two complex numbers
  • conjugate of a complex number
  • absolute value of a complex number
  • exponentiation of e (the base of the natural logarithm) to a complex number

Words

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.


Source

WikipediaThe link opens in a new window or tab
Edit via GitHub The link opens in a new window or tab
Factor Exercism

Ready to start Complex Numbers?

Sign up to Exercism to learn and master Factor with 47 concepts163 exercises, and real human mentoring, all for free.