Browse Source

functions: Binomial, BinomialLn

Signed-off-by: Christoph Ruegg <git@cdrnet.ch>
pull/36/head
Christoph Ruegg 17 years ago
parent
commit
7d80e506da
  1. 32
      src/Numerics/SpecialFunctions/Factorial.cs
  2. 24
      src/UnitTests/SpecialFunctionsTests/FactorialTest.cs

32
src/Numerics/SpecialFunctions/Factorial.cs

@ -93,6 +93,38 @@ namespace MathNet.Numerics
return GammaLn(x + 1.0);
}
/// <summary>
/// Computes the binomial coefficient: n choose k.
/// </summary>
/// <param name="n">A nonnegative value n.</param>
/// <param name="k">A nonnegative value h.</param>
/// <returns>The binomial coefficient: n choose k.</returns>
public static double Binomial(int n, int k)
{
if (k < 0 || n < 0 || k > n)
{
return 0.0;
}
return Math.Floor(0.5 + Math.Exp(FactorialLn(n) - FactorialLn(k) - FactorialLn(n - k)));
}
/// <summary>
/// Computes the natural logarithm of the binomial coefficient: ln(n choose k).
/// </summary>
/// <param name="n">A nonnegative value n.</param>
/// <param name="k">A nonnegative value h.</param>
/// <returns>The logarithmic binomial coefficient: ln(n choose k).</returns>
public static double BinomialLn(int n, int k)
{
if (k < 0 || n < 0 || k > n)
{
return Double.NegativeInfinity;
}
return FactorialLn(n) - FactorialLn(k) - FactorialLn(n - k);
}
private static double[] GenerateFactorials(int max)
{
var cache = new double[max + 1];

24
src/UnitTests/SpecialFunctionsTests/FactorialTest.cs

@ -78,5 +78,29 @@ namespace MathNet.Numerics.UnitTests.SpecialFunctionsTests
AssertHelpers.AlmostEqual(307933.81973375485425, SpecialFunctions.FactorialLn(1 << 15), 14);
AssertHelpers.AlmostEqual(1413421.9939462073242, SpecialFunctions.FactorialLn(1 << 17), 14);
}
[Test]
public void CanComputeBinomial()
{
AssertHelpers.AlmostEqual(1, SpecialFunctions.Binomial(1, 1), 14);
AssertHelpers.AlmostEqual(10, SpecialFunctions.Binomial(5, 2), 14);
AssertHelpers.AlmostEqual(35, SpecialFunctions.Binomial(7, 3), 14);
AssertHelpers.AlmostEqual(1, SpecialFunctions.Binomial(1, 0), 14);
AssertHelpers.AlmostEqual(0, SpecialFunctions.Binomial(0, 1), 14);
AssertHelpers.AlmostEqual(0, SpecialFunctions.Binomial(5, 7), 14);
AssertHelpers.AlmostEqual(0, SpecialFunctions.Binomial(5, -7), 14);
}
[Test]
public void CanComputeBinomialLn()
{
AssertHelpers.AlmostEqual(Math.Log(1), SpecialFunctions.BinomialLn(1, 1), 14);
AssertHelpers.AlmostEqual(Math.Log(10), SpecialFunctions.BinomialLn(5, 2), 14);
AssertHelpers.AlmostEqual(Math.Log(35), SpecialFunctions.BinomialLn(7, 3), 14);
AssertHelpers.AlmostEqual(Math.Log(1), SpecialFunctions.BinomialLn(1, 0), 14);
AssertHelpers.AlmostEqual(Math.Log(0), SpecialFunctions.BinomialLn(0, 1), 14);
AssertHelpers.AlmostEqual(Math.Log(0), SpecialFunctions.BinomialLn(5, 7), 14);
AssertHelpers.AlmostEqual(Math.Log(0), SpecialFunctions.BinomialLn(5, -7), 14);
}
}
}
Loading…
Cancel
Save