Andry
Andry

Reputation: 16885

Finding all nth roots of a complex number in C#

Consider a generic complex number:

System.Numerics.Complex z = new System.Numerics.Complex(0,1); // z = i

And now consider the n-th root extraction operation of z. As you all know, when having a problem like z^n = w (having z and w complex numbers and n a positive not null integer) the equation returns n different complex numbers all residing on the complex circle having its radius equal to the module of z (|z|).

In the System.Numerics namespace I could not find such a method. I obviousle need some sort of method like this:

Complex[] NRoot(Complex number);

How can I find this method. Do I really need to implement it myself?

Upvotes: 0

Views: 1187

Answers (1)

jason
jason

Reputation: 241789

How can I find this method.

You can't, it's not built into the Framework.

Do I really need to implement it myself?

Yes.

Sorry if this comes across as a tad flip, I don't mean to, but I suspect that you already knew this would be the answer.

That said, there's no magic to it:

public static class ComplexExtensions {
    public static Complex[] NthRoot(this Complex complex, int n) {
        Contract.Requires(n > 0);
        var phase = complex.Phase;
        var magnitude = complex.Magnitude;
        var nthRootOfMagnitude = Math.Pow(magnitude, 1.0 / n);
        return
            Enumerable.Range(0, n)
                      .Select(k => Complex.FromPolarCoordinates(
                          nthRootOfMagnitude,
                          phase / n + k * 2 * Math.PI / n)
                      )
                      .ToArray();
    }
}

Most of the work is offloaded to the Framework. I trust that they've implemented Complex.Phase, Complex.Magnitude correctly ((Complex complex) => Math.Sqrt(complex.Real * complex.Real + complex.Imaginary * complex.Imaginary) is bad, Bad, BAD) and Math.Pow correctly.

Upvotes: 1

Related Questions