Пример #1
0
        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));
        }
Пример #2
0
        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]);
                }
            }
        }