213 assert(std::abs(theta) <= std::numbers::pi);
221 std::vector<double> D(N * (1 + N) * (4 * N - 1) / 6);
225 bool isnegative = theta < 0;
226 theta = std::abs(theta);
228 bool closetopi =
false;
229 if (theta > std::numbers::pi / 2)
231 theta = std::numbers::pi - theta;
235 if (fabs(theta) < 1e-3)
237 int idx0, idx1, idx2;
238 for (
int n = 0; n < N; ++n)
240 idx0 = n * (1 + n) * (4 * n - 1) / 6 + n;
242 for (
int m = 0; m <= n; ++m)
244 idx2 = idx0 + idx1 * m;
252 int idx0, idx1, idx2, idx3;
253 double s = sin(theta);
254 double c = 1.0 + cos(theta);
256 std::vector<double> sn(2 * N), cn(2 * N);
258 for (
int i = 1; i < N; ++i)
260 sn[N + i] = sn[N + i - 1] * s;
261 sn[N - i] = sn[N - i + 1] / s;
262 cn[N + i] = cn[N + i - 1] * c;
263 cn[N - i] = cn[N - i + 1] / c;
268 for (
int n = 0; n < N; ++n)
270 idx0 = n * (1 + n) * (4 * n - 1) / 6 + 2 * n;
272 for (
int m = 0; m <= n; ++m)
274 D[idx0 + m * idx1] =
ni(n+m) * g[n * (n + 1) / 2 + m] * cn[N + m] * sn[N + n - m];
279 for (
int n = 0; n < N; ++n)
281 idx0 = n * (1 + n) * (4 * n - 1) / 6 + n * (2 * n + 1) + n;
282 for (
int m = n; m > -n; --m)
284 D[idx0 + m - 1] = (n + m) / sqrt(n * (n + 1.) - m * (m - 1.)) * f * D[idx0 + m];
289 for (
int n = 0; n < N; ++n)
291 idx0 = n * (1 + n) * (4 * n - 1) / 6 + n;
293 for (
int m = n - 1; m >= 0; --m)
296 idx3 = (m + 1) * idx1;
297 for (
int k = n; k > -n; --k)
299 D[idx0 + idx2 + k - 1] = sqrt((n * (n + 1.) - m * (m + 1.)) / (n * (n + 1.) - k * (k - 1.))) * D[idx0 + idx3 + k] +
300 (m + k) / sqrt(n * (n + 1.) - k * (k - 1.)) * f * D[idx0 + idx2 + k];
307 int idx0, idx1, idx2;
311 for (
int n = 1; n < N; ++n)
313 idx0 = n * (1 + n) * (4 * n - 1) / 6;
315 for (
int m = 0; m <= n; ++m)
317 idx2 = idx0 + idx1 * m + n;
318 for (
int k = -n; k <= n; ++k)
320 D[idx2 + k] =
ni(n + m) * Dcopy[idx2 - k];
326 for (
int n = 1; n < N; ++n)
328 idx0 = n * (1 + n) * (4 * n - 1) / 6;
330 for (
int m = 0; m <= n; ++m)
332 idx2 = idx0 + idx1 * m + n;
333 for (
int k = -n; k <= n; ++k)
342 D[idx2 + k] *=
ni((k - std::abs(k)) / 2);
345 D[idx2 + k] *=
ni(m - k);