internal override double[] CentralMoments(int rMax) { // This is just a recursive formulation of the direct formula. double[] C = new double[rMax + 1]; C[0] = 1.0; double t = 1.0; // Keep track of r! s^r for (int r = 2; r <= rMax; r += 2) { t *= r * (r - 1) * (s * s); C[r] = 2.0 * t * AdvancedMath.DirichletEta(r); } return(C); }
/* * public override double Variance { * get { * return (Global.HalfPI * (Math.PI / 6.0 - Global.LogTwo * Global.LogTwo) - Global.SqrtHalfPI * Global.LogTwo / 12.0 / Math.Sqrt(n)); * } * } */ public override double Moment(int r) { if (r < 0) { throw new ArgumentOutOfRangeException("r"); } else if (r == 0) { return(1.0); } else { // we can get these expressions just by integrating Q_0' and Q_1' term by term double M0 = AdvancedMath.DirichletEta(r) * AdvancedMath.Gamma(r / 2.0 + 1.0) / Math.Pow(2.0, r / 2.0 - 1.0); double M1 = -2.0 / 3.0 * AdvancedMath.DirichletEta(r - 1) * AdvancedMath.Gamma((r + 1) / 2.0) / Math.Pow(2.0, (r + 1) / 2.0) * r; return(M0 + M1 / Math.Sqrt(n)); } }
/// <inheritdoc /> public override double CentralMoment(int r) { if (r < 0) { throw new ArgumentOutOfRangeException(nameof(r)); } else if (r == 0) { return(1.0); } else if (r % 2 != 0) { return(0.0); } else { return(2.0 * AdvancedIntegerMath.Factorial(r) * AdvancedMath.DirichletEta(r) * MoreMath.Pow(s, r)); } }
/// <inheritdoc /> public override double RawMoment(int r) { if (r < 0) { throw new ArgumentOutOfRangeException(nameof(r)); } else if (r == 0) { return(1.0); } else if (r == 1) { return(Mean); } else { return(AdvancedMath.Gamma(r / 2.0 + 1.0) * AdvancedMath.DirichletEta(r) / Math.Pow(2.0, r / 2.0 - 1.0)); } }
// The P-series expression for p(x) can be multiplied by x^r and integrated term-by term to give expressions // for <x^r> involving powers of 1/k, i.e. zeta series. public override double RawMoment(int r) { if (r < 0) { throw new ArgumentOutOfRangeException(nameof(r)); } else if (r == 0) { return(1.0); } else { double q = Math.Pow(2.0, r / 2.0); double d0 = AdvancedMath.DirichletEta(r); double d1 = AdvancedMath.DirichletEta(r - 1); double g0 = AdvancedMath.Gamma(r / 2.0 + 1.0); double m0 = 2.0 / q * g0 * d0; double m1 = -Global.SqrtTwo / 3.0 / q * AdvancedMath.Gamma(r / 2.0 + 1.0 / 2.0) * d1 * r; // The O(1/N) expression has some canceling infinities for r = 1 so we form the limit by hand for that cases double m2; if (r == 1) { m2 = Global.SqrtHalfPI / 36.0 * (3.0 * Global.LogTwo - 1.0); } else { m2 = -1.0 / 18.0 / q * g0 * ( r * (r - 4) * d0 - 2 * (r - 1) * AdvancedMath.DirichletEta(r - 2) + 2 * (r - 1) * (1.0 - MoreMath.Pow(2, -r)) / (1.0 - MoreMath.Pow(2, 1 - r)) * d0 ); } return(m0 + m1 / Math.Sqrt(n) + m2 / n); } }