Как вы оставляете корни в сурд форме в c#? - PullRequest
4 голосов
/ 29 февраля 2020

Пример a : √12 = 2√3

Пример b : √16 = 4

Я пытаюсь получить оба.

Хотя я, конечно, могу использовать Math.Sqrt(4) для достижения результата b , я понятия не имею, как добиться a , или как заставить оба работать. одновременно которая является целью. Как мне добиться такого упрощения в C#?

Я пробовал несколько библиотек, включая Mat hNet, Symbolics и NCal c, но безуспешно. Этот пост , возможно, решил это в 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);}

Спасибо за любую помощь

1 Ответ

1 голос
/ 01 марта 2020

Данный 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)
    }
...