SmartDecimal[,] PrepareProblem(int places)
    {
        SmartDecimal.Places = places;
        var res = new SmartDecimal[original.GetLength(0), original.GetLength(1)];

        for (int i = 0; i < original.GetLength(0); i++)
        {
            for (int j = 0; j < original.GetLength(1); j++)
            {
                res[i, j] = new SmartDecimal((decimal)original[i, j]);
            }
        }
        return(res);
    }
    SmartDecimal[,] LU_Decomposition(SmartDecimal[,] a)
    {
        int n = a.GetLength(0);
        var d = new SmartDecimal[n, n + 1];

        for (int j = 0; j < n; j++)
        {
            for (int i = j; i < n; i++)
            {
                d[i, j] = a[i, j] - Enumerable.Range(0, j).Aggregate(new SmartDecimal(0), (acc, k) => acc + d[i, k] * d[k, j]);
            }

            for (int i = j + 1; i < n + 1; i++)
            {
                d[j, i] = (a[j, i] - Enumerable.Range(0, j).Aggregate(new SmartDecimal(0), (acc, k) => acc + d[j, k] * d[k, i])) / d[j, j];
            }
        }
        return(d);
    }