protected override void calculate() { int len = 2 * m - 2; double[] sumXpow = new double[len + 1], sumYpow = new double[m]; sumXpow[0] = length; double x, y, t; for (int i = 0; i < length; i++) { x = X[i]; y = Y[i]; t = 1; for (int pow = 1; pow <= len; pow++) { sumXpow[pow] += (t *= x); } t = 1; for (int pow = m - 1; pow >= 0; pow--) { sumYpow[pow] += y * t; t *= x; } } double[,] sums = new double[m, m]; for (int ix = 0; ix < m; ix++) { for (int iy = 0; iy < m; iy++) { sums[ix, iy] = sumXpow[len - ix - iy]; } } #if DecMatrix var temp = new DecMatrix(change(sums, v => (decimal)v)).Invert() * DecMatrix.Vertical(change(sumYpow, v => (decimal)v)); for (int i = 0; i < m; i++) { values[i + 1] = (double)Round(temp[i, 0], round); } #else var temp = new Matrix(sums).Invert() * Matrix.Vertical(sumYpow); for (int i = 0; i < m; i++) { values[i + 1] = Round(temp[i, 0], round); } #endif a = values[1]; b = values[2]; }
public static bool Like(DecMatrix a, DecMatrix b) => a.n == b.n && a.m == b.m;