public void BernoulliNumbers()
 {
     Assert.IsTrue(AdvancedIntegerMath.BernoulliNumber(0) == 1.0);
     Assert.IsTrue(AdvancedIntegerMath.BernoulliNumber(1) == -1.0 / 2.0);
     Assert.IsTrue(AdvancedIntegerMath.BernoulliNumber(2) == 1.0 / 6.0);
     Assert.IsTrue(AdvancedIntegerMath.BernoulliNumber(3) == 0.0);
     Assert.IsTrue(AdvancedIntegerMath.BernoulliNumber(4) == -1.0 / 30.0);
 }
 //[TestMethod]
 // Cancellation too bad to be useful
 public void BernoulliStirlingRelationship()
 {
     // This involves significant cancellation, so don't pick n too high
     foreach (int n in TestUtilities.GenerateIntegerValues(2, 16, 4))
     {
         double S = 0.0;
         for (int k = 0; k <= n; k++)
         {
             double dS = AdvancedIntegerMath.Factorial(k) / (k + 1) * AdvancedIntegerMath.StirlingNumber2(n, k);
             if (k % 2 != 0)
             {
                 dS = -dS;
             }
             S += dS;
         }
         Assert.IsTrue(TestUtilities.IsNearlyEqual(S, AdvancedIntegerMath.BernoulliNumber(n)));
     }
 }
Example #3
0
 /// <inheritdoc />
 public override double Cumulant(int r)
 {
     if (r < 0)
     {
         throw new ArgumentOutOfRangeException("r");
     }
     else if (r == 0)
     {
         return(0.0);
     }
     else if (r == 1)
     {
         return(Mean);
     }
     else if (r % 2 != 0)
     {
         return(0.0);
     }
     else
     {
         return(AdvancedIntegerMath.BernoulliNumber(r) / r * (MoreMath.Pow(n, r) - 1.0));
     }
 }
 /// <inheritdoc />
 public override double Cumulant(int r)
 {
     if (r < 0)
     {
         throw new ArgumentOutOfRangeException(nameof(r));
     }
     else if (r == 0)
     {
         return(0.0);
     }
     else if (r == 1)
     {
         return(range.Midpoint);
     }
     else if (r % 2 != 0)
     {
         // This isn't strictly necessary since BernoulliNumber(r) will return 0, but there is no reason to compute (b-a)^r
         return(0.0);
     }
     else
     {
         return(MoreMath.Pow(range.Width, r) * AdvancedIntegerMath.BernoulliNumber(r) / r);
     }
 }