Пример #1
0
        public void TestMagicSquares()
        {
            for (int size = 1; size <= 100; size++)
            {
                if (size == 2)
                {
                    continue;
                }
                int[,] a = MathStuff.MagicSquare(size);

                bool[] used = new bool[size * size];
                int    d1sum = 0, d2sum = 0, expSum = 0;
                for (int y = 0; y < size; y++)
                {
                    d1sum += a[y, y];
                    d2sum += a[y, size - y - 1];
                    int rowSum = 0, colSum = 0;
                    for (int x = 0; x < size; x++)
                    {
                        Assert.IsFalse(used[a[y, x] - 1]);
                        used[a[y, x] - 1] = true;
                        rowSum           += a[y, x];
                        colSum           += a[x, y];
                    }
                    if (y == 0)
                    {
                        expSum = rowSum;
                    }
                    Assert.AreEqual(expSum, rowSum);
                    Assert.AreEqual(expSum, colSum);
                }
                Assert.AreEqual(expSum, d1sum);
                Assert.AreEqual(expSum, d2sum);
            }
        }
Пример #2
0
        public void TestChoose()
        {
            var lib = new MathStuff();
            int p = 13, max = 40;

            lib.PrecalcChoose(max, p);
            for (int i = 1; i <= max; i++)
            {
                for (int j = 0; j <= i; j++)
                {
                    int expected = lib.Choose(i, j) % p;
                    int actual   = lib.ChooseMod(i, j, p);
                    Assert.AreEqual(expected, actual);
                }
            }
        }
Пример #3
0
        public void TestChineseRemainderTheorem()
        {
            MathStuff lib = new MathStuff();

            for (int m = 2; m < 100; m++)
            {
                for (int n = 2; n < 100; n++)
                {
                    int limit = Math.Min(1000, lib.LCM(m, n));
                    for (int x = 0; x < limit; x++)
                    {
                        int a = x % m, b = x % n;
                        int y = lib.GCD(m, n) == 1 ? lib.Chinese(a, m, b, n) : lib.ChineseCommon(a, m, b, n);
                        Assert.AreEqual(x, y);
                    }
                }
            }
        }
Пример #4
0
        public void TestModInverse()
        {
            var ml = new MathStuff();

            int prime = 100000007;

            for (int x = 2; x *x <= prime; x++)
            {
                if (prime % x == 0)
                {
                    throw new Exception();
                }
            }

            for (long i = 1; i <= 1000000; i++)
            {
                long j = ml.ModInverse((int)i, prime);
                Assert.AreEqual(1, (i * j) % prime);
            }
        }
Пример #5
0
        public void TestJosephus()
        {
            Random r = new Random(0);

            for (int i = 0; i < 100; i++)
            {
                int N = r.Next(100, 500);
                int K = r.Next(1, 2000);

                // Naive solution
                bool[] gone = new bool[N];
                int    cur  = 0;
                for (int j = 0; j < N - 1; j++)
                {
                    int d = K - 1;
                    while (d > 0)
                    {
                        cur = (cur + 1) % N;
                        if (!gone[cur])
                        {
                            d--;
                        }
                    }
//					Console.WriteLine("Kicked out " + cur);
                    gone[cur] = true;
                    while (gone[cur])
                    {
                        cur = (cur + 1) % N;
                    }
                }
                int expLeft = Array.IndexOf(gone, false);
//				Console.WriteLine(expLeft);

                int actLeft = MathStuff.Josephus(N, K);
//				Console.WriteLine(actLeft - 1);

                Assert.AreEqual(expLeft, actLeft - 1);
            }
        }