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