你如何在 c# 中以 surd 形式留下根?

How do you leave roots in surd form in c#?

例子a: √12 =2√3

例b:√16=4

我正在尝试两者兼得。

虽然我当然可以使用 Math.Sqrt(4) 来实现结果 b,但我不知道如何实现 a ,或进一步如何让两者同时工作,这是目标。我如何在 C# 中实现这种类型的简化?

我尝试了几个库,包括 MathNet、Symbolics 和 NCalc,但都没有成功。 This post 可能已经用 c++ 解决了,虽然我不确定。我尝试转换该解决方案以查看它是否有效的尝试非常失败:

var outside_root = 1;
var inside_root = 800;
var d = 2;
while (d * d <= inside_root)
    if (inside_root % (d * d) == 0)  //# inside_root evenly divisible by d * d
    {
        inside_root = inside_root / (d * d);
        outside_root = (outside_root * d);
    }
while (d * d > inside_root) { 
d = (d + 1);}

感谢您的帮助

可以将给定的 C++ 翻译成 C#,而无需进行大量更改。还可以对原始算法进行一些修改,以减少乘法次数并提高整体性能:

    static (int, int) Sqrt2(int n)
    {
        int m = 1, d = 2;

        int dSquared;
        while ((dSquared = d * d) <= n)
        {
            while ((n % dSquared) == 0)
            {
                n /= dSquared;
                m *= d;
            }
            d++;
        }

        return (m, n);
    }

    static void Main(string[] args)
    {
        Console.WriteLine(Sqrt2(12)); // prints (2, 3)
        Console.WriteLine(Sqrt2(16)); // prints (4, 1)
        Console.WriteLine(Sqrt2(13)); // prints (1, 13)
    }