public void TestMatrixInt() { const int p = 10007; var lhs = new MatrixInt(new int[, ] { { 15, -30, 180 }, { 8350, 7, -1234 }, { 5000, -1, 3 } }, p); var rhs = new MatrixInt(new int[, ] { { 3234 }, { 4836 }, { 5274 } }, p); var aug = lhs.GetAugmentedMatrix(rhs); var res = aug.SolveLinearEquation(); Assert.AreEqual(3, res.Length); Assert.AreEqual(73, res[0]); Assert.AreEqual(20, res[1]); Assert.AreEqual(182, res[2]); var inverse = lhs.GetInverse(); Assert.AreEqual(lhs * inverse, MatrixInt.CreateIdentity(3, p)); }
public void TestMatrixIntRand() { Random r = new Random(0); List <int> largePrimes = new List <int>(); int cp = 2000000000; while (largePrimes.Count < 100) { bool bad = false; for (int i = 2; i *i <= cp && !bad; i++) { if (cp % i == 0) { bad = true; } } if (!bad) { largePrimes.Add(cp); } cp++; } foreach (int p in largePrimes) { int size = r.Next(2, 75); int[] expectedRes = new int[size]; for (int i = 0; i < size; i++) { expectedRes[i] = r.Next(p); } MatrixInt lhs = new MatrixInt(size, size, p); MatrixInt rhs = new MatrixInt(size, 1, p); for (int y = 0; y < size; y++) { long sum = 0; for (int x = 0; x < size; x++) { int v = r.Next(p); lhs[y, x] = v; sum += (long)v * expectedRes[x]; sum %= p; } rhs[y, 0] = (int)sum; } var determinant = lhs.GetDeterminant(); Assert.IsTrue(determinant != 0); MatrixInt aug = lhs.GetAugmentedMatrix(rhs); var res = aug.SolveLinearEquation(); Assert.IsNotNull(res); for (int i = 0; i < size; i++) { Assert.AreEqual(expectedRes[i], res[i]); } } }