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的检查)。我猜这没什么帮助。谢谢你的努力,杰森,谢谢你发布代码!