29 lines
1021 B
C#
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);
|
|
} |