public void ComplexReimannZetaPrimesTest()
 {
     // pick high enough values so that p^-x == 1 within double precision before we reach the end of our list of primes
     foreach (Complex z in TestUtilities.GenerateComplexValues(1.0, 100.0, 8))
     {
         Complex zz = z;
         if (zz.Re < 0.0)
         {
             zz = -zz;
         }
         zz += 10.0;
         Console.WriteLine(zz);
         Complex f = 1.0;
         for (int p = 2; p < 100; p++)
         {
             if (!AdvancedIntegerMath.IsPrime(p))
             {
                 continue;
             }
             Complex t = Complex.One - ComplexMath.Pow(p, -zz);
             if (t == Complex.One)
             {
                 break;
             }
             f = f * t;
         }
         Assert.IsTrue(TestUtilities.IsNearlyEqual(1.0 / AdvancedComplexMath.RiemannZeta(zz), f));
     }
 }
        private int CountPrimes(int n)
        {
            int count = 0;

            for (int k = 1; k <= n; k++)
            {
                if (AdvancedIntegerMath.IsPrime(k))
                {
                    count++;
                }
            }
            return(count);
        }
        public void PrimeSpecialCases()
        {
            // small numbers
            Assert.IsFalse(AdvancedIntegerMath.IsPrime(1));
            Assert.IsTrue(AdvancedIntegerMath.IsPrime(2));
            Assert.IsTrue(AdvancedIntegerMath.IsPrime(3));
            Assert.IsFalse(AdvancedIntegerMath.IsPrime(4));
            Assert.IsTrue(AdvancedIntegerMath.IsPrime(5));
            Assert.IsFalse(AdvancedIntegerMath.IsPrime(6));
            Assert.IsTrue(AdvancedIntegerMath.IsPrime(7));
            Assert.IsFalse(AdvancedIntegerMath.IsPrime(8));
            Assert.IsFalse(AdvancedIntegerMath.IsPrime(9));
            Assert.IsFalse(AdvancedIntegerMath.IsPrime(10));

            // Mersene prime candidates
            Assert.IsTrue(AdvancedIntegerMath.IsPrime(3));          // 2^2 - 1
            Assert.IsTrue(AdvancedIntegerMath.IsPrime(7));          // 2^3 - 1
            Assert.IsTrue(AdvancedIntegerMath.IsPrime(31));         // 2^5 - 1
            Assert.IsTrue(AdvancedIntegerMath.IsPrime(127));        // 2^7 - 1
            Assert.IsFalse(AdvancedIntegerMath.IsPrime(2047));      // 2^11 - 1
            Assert.IsTrue(AdvancedIntegerMath.IsPrime(8191));       // 2^13 - 1
            Assert.IsTrue(AdvancedIntegerMath.IsPrime(131071));     // 2^17 - 1
            Assert.IsTrue(AdvancedIntegerMath.IsPrime(524287));     // 2^19 - 1
            Assert.IsFalse(AdvancedIntegerMath.IsPrime(8388607));   // 2^23 - 1
            Assert.IsFalse(AdvancedIntegerMath.IsPrime(536870911)); // 2^29 - 1
            Assert.IsTrue(AdvancedIntegerMath.IsPrime(2147483647)); // 2^31 - 1

            // Pseudoprimes
            Assert.IsFalse(AdvancedIntegerMath.IsPrime(2047));
            Assert.IsFalse(AdvancedIntegerMath.IsPrime(3277));
            Assert.IsFalse(AdvancedIntegerMath.IsPrime(4033));
            Assert.IsFalse(AdvancedIntegerMath.IsPrime(121));
            Assert.IsFalse(AdvancedIntegerMath.IsPrime(703));
            Assert.IsFalse(AdvancedIntegerMath.IsPrime(1891));
            Assert.IsFalse(AdvancedIntegerMath.IsPrime(781));
            Assert.IsFalse(AdvancedIntegerMath.IsPrime(1541));

            // Fermat primes
            Assert.IsTrue(AdvancedIntegerMath.IsPrime(5));     // 2^2 + 1
            Assert.IsTrue(AdvancedIntegerMath.IsPrime(17));    // 2^4 + 1
            Assert.IsTrue(AdvancedIntegerMath.IsPrime(257));   // 2^8 + 1
            Assert.IsTrue(AdvancedIntegerMath.IsPrime(65537)); // 2^16 + 1

            // Euler's nonprime
            Assert.IsFalse(AdvancedIntegerMath.IsPrime(1000009)); // 1000009 = 293 * 3413
        }