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); } }
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); } } }
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); } } } }
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); } }
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); } }