42inline double compute_gram_polynomial(
const int i,
const int m,
const int k,
const int s) {
44 return (4. * k - 2.) / (k * (2. * m - k + 1.)) *
45 (i * compute_gram_polynomial(i, m, k - 1, s) +
46 s * compute_gram_polynomial(i, m, k - 1, s - 1)) -
47 ((k - 1.) * (2. * m + k)) / (k * (2. * m - k + 1.)) *
48 compute_gram_polynomial(i, m, k - 2, s);
51 if (k == 0 && s == 0) {
58inline double compute_generalized_factorial(
const int a,
const int b) {
61 for (
int j = (a - b) + 1; j <= a; j++) {
67inline double compute_weight(
const int i,
const int t,
const int m,
const int n,
const int s) {
69 for (
int k = 0; k <= n; ++k) {
71 (compute_generalized_factorial(2 * m, k) /
72 compute_generalized_factorial(2 * m + k + 1, k + 1)) *
73 compute_gram_polynomial(i, m, k, 0) * compute_gram_polynomial(t, m, k, s);
78inline std::vector<double> compute_weights(
const int m,
const int t,
const int n,
const int s) {
79 std::vector<double> weights(2 *
static_cast<size_t>(m) + 1);
81 for (
int i = 0; i < 2 * m + 1; ++i) {
82 weights[
static_cast<size_t>(i)] = compute_weight(i - m, t, m, n, s);