FastRng/FastRng/Distributions/ChiSquareK4.cs
2023-10-25 15:21:16 +02:00

29 lines
1021 B
C#

using System.Numerics;
namespace FastRng.Distributions;
public sealed class ChiSquareK4<TNum> : Distribution<TNum> where TNum : IFloatingPointIeee754<TNum>
{
private static readonly TNum HALF = TNum.CreateChecked(0.5f);
private static readonly TNum TWO = TNum.CreateChecked(2f);
private static readonly TNum K = TNum.CreateChecked(4f);
private static readonly TNum K_HALF = K * HALF;
private static readonly TNum K_HALF_MINUS_ONE = K_HALF - TNum.One;
private static readonly TNum CONSTANT = TNum.CreateChecked(0.252f);
private static readonly TNum DIVISOR;
static ChiSquareK4()
{
var twoToTheKHalf = TNum.Pow(TWO, K_HALF);
var gammaKHalf = MathToolsFloatingPoint<TNum>.Gamma(K_HALF);
DIVISOR = twoToTheKHalf * gammaKHalf;
}
public ChiSquareK4(IRandom<TNum> rng) : base(rng)
{
}
/// <inheritdoc />
public override TNum ShapeFunction(TNum x) => CONSTANT * ((TNum.Pow(x, K_HALF_MINUS_ONE) * TNum.Exp(-x * HALF)) / DIVISOR);
}