Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中求复数的所有n根#_C#_.net_Numeric - Fatal编程技术网

C# 在C中求复数的所有n根#

C# 在C中求复数的所有n根#,c#,.net,numeric,C#,.net,Numeric,考虑一个通用复数: System.Numerics.Complex z = new System.Numerics.Complex(0,1); // z = i 现在考虑第n根提取操作 z < /代码>。大家都知道,当遇到像z^n=w(有z和w复数和n一个正的非空整数)这样的问题时,方程返回n位于复数圆上的不同复数,其半径等于z(|z) 在System.Numerics名称空间中,我找不到这样的方法。我显然需要这样的方法: Complex[] NRoot(Complex number); 我

考虑一个通用复数:

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

现在考虑第n根提取操作<代码> z < /代码>。大家都知道,当遇到像

z^n=w
(有
z
w
复数和
n
一个正的非空整数)这样的问题时,方程返回
n
位于复数圆上的不同复数,其半径等于
z
|z

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

Complex[] NRoot(Complex number);
我怎样才能找到这个方法。我真的需要自己实施吗

我怎样才能找到这个方法

你不能,它没有内置到框架中

我真的需要自己实施吗

对不起,如果这让人觉得有点意外,我不是故意的,但我怀疑你已经知道这就是答案

也就是说,它没有魔力:

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

大部分工作都转移到框架中。我相信他们已经正确地实现了
复数.Phase
复数.magnity
(复数)=>Math.Sqrt(Complex.Real*Complex.Real+Complex.virtual*Complex.virtual)
是坏的,坏的,坏的)和
数学.Pow
正确地实现了。

是否可以通过极坐标获得/设置复数?这将使任务变得更简单。PolarCoordinates()中有一个
静态复合体。
我也要这么说。。。然而,真的没有一种通用方法来提取复数的第n个根吗?我知道写这样一种方法并不困难,但我假设存在一种优化的实现,使用数学定义可能不是最好的解决方案!确实有人编辑了我的文章标题,删除了其中的“C”。我不同意这一点,因为这是我问题的本质。正如我所解释的,我不是在寻找一种算法来寻找根,我需要知道.NET框架(特别是C#库)是否已经实现了一种方法来实现这一点。如果.NET的实现结果是“坏的,坏的,坏的”,你有没有一个链接到一个正确的复杂程度的实现?@Gabe:没有,但这是众所周知的。问题是幼稚的
|x+yi |=Sqrt(x^2+y^2)
可能会在它应该溢出之前溢出。如果| x |>=| y |,则使用
|x+yi |=|x | Sqrt(1+(y/x)^2)非常容易避免,否则| y |*Sqrt(1+(x/y)^2)如果| x |<| y |
(这仍然会溢出)。我怀疑它在某处,但我现在手边没有我的副本。正如我所说,我相信这个框架是正确的。这可能是个错误,考虑到Java中臭名昭著的二进制搜索溢出错误,这是他们应该知道的。@Gabe:我刚刚在
newcomplex(Math.Sqrt(Double.MaxValue),Math.Sqrt(DoubleMaxValue))上测试了(有权访问代码反编译器的人可以做得更好)
框架正确无误,而naive则会溢出并出错。快速查看ILSpy中的一个实现,如您所述(显然添加了对0的检查)。我猜这没什么帮助。谢谢你的努力,杰森,谢谢你发布代码!