在c#中求一个复数的所有n个根

本文关键字:个根 一个 | 更新日期: 2023-09-27 18:15:39

考虑一个一般复数:

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

现在考虑z的第n次根提取操作。大家都知道,当遇到z^n = w(有zw复数,n是正非空整数)这样的问题时,方程返回n个不同的复数,它们都位于复圆上,其半径等于z (|z|)的模。

System.Numerics命名空间中,我找不到这样的方法。我显然需要这样的方法:

Complex[] NRoot(Complex number);

我怎样才能找到这个方法。我真的需要自己实现它吗?

在c#中求一个复数的所有n个根

我怎样才能找到这个方法。

你不能,它不是内置于框架。

我真的需要自己实现它吗?

是的。

对不起,如果这是一个小翻转,我不是故意的,但我怀疑你已经知道这将是答案。

也就是说,没有什么神奇的:

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();
    }
}

大部分工作被卸载给框架。我相信他们已经正确地实现了Complex.Phase, Complex.Magnitude ((Complex complex) => Math.Sqrt(complex.Real * complex.Real + complex.Imaginary * complex.Imaginary)是坏的,坏的,坏的)和Math.Pow