public void PrimitiveRootTest()
 {
     for (int i = 0; i < 1000; i++)
     {
         int x = int.MaxValue - i;
         if (!InternalMath.IsPrime(x))
         {
             continue;
         }
         MathUtil.IsPrimitiveRoot(x, mods[x].PrimitiveRoot()).Should().BeTrue();
     }
 }
        public void IsPrime()
        {
            InternalMath.IsPrime(121).Should().BeFalse();
            InternalMath.IsPrime(11 * 13).Should().BeFalse();
            InternalMath.IsPrime(1_000_000_007).Should().BeTrue();
            InternalMath.IsPrime(1_000_000_008).Should().BeFalse();
            InternalMath.IsPrime(1_000_000_009).Should().BeTrue();

            for (int i = 0; i <= 10000; i++)
            {
                InternalMath.IsPrime(i).Should().Be(IsPrimeNaive(i));
            }
            for (int i = 0; i <= 10000; i++)
            {
                int x = int.MaxValue - i;
                InternalMath.IsPrime(x).Should().Be(IsPrimeNaive(x));
            }
        }
 public void PrimitiveRootTestNaive()
 {
     for (int m = 2; m <= 10000; m++)
     {
         if (!InternalMath.IsPrime(m))
         {
             continue;
         }
         //int n = InternalMath.PrimitiveRoot(m);
         int n = mods[m].PrimitiveRoot();
         n.Should().BeGreaterOrEqualTo(1);
         m.Should().BeGreaterThan(n);
         int x = 1;
         for (int i = 1; i <= m - 2; i++)
         {
             x = (int)((long)x * n % m);
             // x == n^i
             x.Should().NotBe(1);
         }
         x = (int)((long)x * n % m);
         x.Should().Be(1);
     }
 }