public void CarlsonScaling()
        {
            foreach (double x in TestUtilities.GenerateRealValues(1.0E-3, 1.0E1, 2))
            {
                foreach (double y in TestUtilities.GenerateRealValues(1.0E-2, 1.0E2, 2))
                {
                    foreach (double z in TestUtilities.GenerateRealValues(1.0E-1, 1.0E3, 2))
                    {
                        foreach (double lambda in TestUtilities.GenerateRealValues(1.0E-2, 1.0E2, 4))
                        {
                            Assert.IsTrue(TestUtilities.IsNearlyEqual(
                                              AdvancedMath.CarlsonF(lambda * x, lambda * y, lambda * z),
                                              AdvancedMath.CarlsonF(x, y, z) / Math.Sqrt(lambda)
                                              ));

                            Assert.IsTrue(TestUtilities.IsNearlyEqual(
                                              AdvancedMath.CarlsonG(lambda * x, lambda * y, lambda * z),
                                              AdvancedMath.CarlsonG(x, y, z) * Math.Sqrt(lambda)
                                              ));

                            Assert.IsTrue(TestUtilities.IsNearlyEqual(
                                              AdvancedMath.CarlsonD(lambda * x, lambda * y, lambda * z),
                                              AdvancedMath.CarlsonD(x, y, z) * Math.Pow(lambda, -1.5)
                                              ));
                        }
                    }
                }
            }
        }
        public void CarlsonNormalization()
        {
            // All Carlson integrals are normalized so that they are 1 when all arguments are 1.

            Assert.IsTrue(AdvancedMath.CarlsonF(1.0, 1.0, 1.0) == 1.0);
            Assert.IsTrue(AdvancedMath.CarlsonG(1.0, 1.0, 1.0) == 1.0);
            Assert.IsTrue(AdvancedMath.CarlsonD(1.0, 1.0, 1.0) == 1.0);
        }
        public void CarlsonFInequality()
        {
            // DLMF 19.24.10
            // \frac{3}{\sqrt{x} + \sqrt{y} + \sqrt{z}} \le R_F(x, y, z) \le \frac{1}{(x y z)^{1/6}}

            foreach (double x in TestUtilities.GenerateRealValues(1.0E-3, 1.0E3, 4))
            {
                foreach (double y in TestUtilities.GenerateRealValues(1.0E-2, 1.0E4, 4))
                {
                    foreach (double z in TestUtilities.GenerateRealValues(1.0E-1, 1.0E5, 4))
                    {
                        double min = 3.0 / (Math.Sqrt(x) + Math.Sqrt(y) + Math.Sqrt(z));
                        double R_F = AdvancedMath.CarlsonF(x, y, z);
                        double max = 1.0 / Math.Pow(x * y * z, 1.0 / 6.0);

                        Assert.IsTrue(min <= R_F && R_F <= max);
                    }
                }
            }
        }
        public void CarlsonFSpecialCases()
        {
            foreach (double x in TestUtilities.GenerateRealValues(1.0E-2, 1.0E4, 8))
            {
                // DLMF 19.20.1
                // R_F(x, x, x) = 1 / \sqrt{x}
                // R_F(0, x, x) = \frac{\pi}{2} \frac{1}{\sqrt{x}}
                // R_F(0, 0, x) = \infty


                Assert.IsTrue(TestUtilities.IsNearlyEqual(
                                  AdvancedMath.CarlsonF(x, x, x),
                                  1.0 / Math.Sqrt(x)
                                  ));

                Assert.IsTrue(TestUtilities.IsNearlyEqual(
                                  AdvancedMath.CarlsonF(0, x, x),
                                  Math.PI / 2.0 / Math.Sqrt(x)
                                  ));
            }
        }