[/ Copyright 2019, Nick Thompson Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt). ] [section:gegenbauer Gegenbauer Polynomials] [h4 Synopsis] `` #include `` namespace boost{ namespace math{ template Real gegenbauer(unsigned n, Real lambda, Real x); template Real gegenbauer_prime(unsigned n, Real lambda, Real x); template Real gegenbauer_derivative(unsigned n, Real lambda, Real x, unsigned k); }} // namespaces Gegenbauer polynomials are a family of orthogonal polynomials. A basic usage is as follows: using boost::math::gegenbauer; double x = 0.5; double lambda = 0.5; unsigned n = 3; double y = gegenbauer(n, lambda, x); All derivatives of the Gegenbauer polynomials are available. The /k/-th derivative of the /n/-th Gegenbauer polynomial is given by using boost::math::gegenbauer_derivative; double x = 0.5; double lambda = 0.5; unsigned n = 3; unsigned k = 2; double y = gegenbauer_derivative(n, lambda, x, k); For consistency with the rest of the library, `gegenbauer_prime` is provided which simply returns `gegenbauer_derivative(n, lambda, x,1 )`. [$../graphs/gegenbauer.svg] [h3 Implementation] The implementation uses the 3-term recurrence for the Gegenbauer polynomials, rising. [h3 Performance] Double precision timing on a consumer x86 laptop is shown below. Included is the time to generate a random number argument in the interval \[-1, 1\] (which takes 11.5ns). `` Run on (16 X 4300 MHz CPU s) CPU Caches: L1 Data 32K (x8) L1 Instruction 32K (x8) L2 Unified 1024K (x8) L3 Unified 11264K (x1) Load Average: 0.21, 0.33, 0.29 ----------------------------------------- Benchmark Time ----------------------------------------- Gegenbauer/1 12.5 ns Gegenbauer/2 13.5 ns Gegenbauer/3 14.6 ns Gegenbauer/4 16.0 ns Gegenbauer/5 17.5 ns Gegenbauer/6 19.2 ns Gegenbauer/7 20.7 ns Gegenbauer/8 22.2 ns Gegenbauer/9 23.6 ns Gegenbauer/10 25.2 ns Gegenbauer/11 26.9 ns Gegenbauer/12 28.7 ns Gegenbauer/13 30.5 ns Gegenbauer/14 32.5 ns Gegenbauer/15 34.3 ns Gegenbauer/16 36.3 ns Gegenbauer/17 38.0 ns Gegenbauer/18 39.9 ns Gegenbauer/19 41.8 ns Gegenbauer/20 43.8 ns UniformReal 11.5 ns `` [h3 Accuracy] Some representative ULP plots are shown below. The relative accuracy cannot be controlled at the roots of the polynomial, as is to be expected. [$../graphs/gegenbauer_ulp_3.svg] [$../graphs/gegenbauer_ulp_5.svg] [$../graphs/gegenbauer_ulp_9.svg] [h3 Caveats] Some programs define the Gegenbauer polynomial with \u03BB = 0 via renormalization (which makes them Chebyshev polynomials). We do not follow this convention: In this case, only the zeroth Gegenbauer polynomial is nonzero. [endsect]