3#include "cplib/conv/fft.hpp"
29 const std::vector<std::size_t>& shape) {
30 using usize = std::size_t;
31 std::vector<usize> squeezed_shape;
33 for (usize dim : shape) {
36 squeezed_shape.push_back(dim);
39 assert(n == a.size() && n == b.size());
40 usize ndims = squeezed_shape.size();
44 for (usize d = ndims - 1; d > 0; d--) {
45 squeezed_shape[d - 1] *= squeezed_shape[d];
47 usize padded_out_size = port::bit_ceil(n * 2 - 1);
48 std::vector<std::vector<T>> a_ranked(ndims, std::vector<T>(padded_out_size, T(0)));
49 std::vector<std::vector<T>> b_ranked(ndims, std::vector<T>(padded_out_size, T(0)));
50 for (usize i = 0; i < n; i++) {
52 for (usize d = ndims - 1; d > 0; d--) {
53 rank += i / squeezed_shape[d];
56 a_ranked[rank][i] = a[i];
57 b_ranked[rank][i] = b[i];
59 for (usize r = 0; r < ndims; r++) {
63 std::vector<T> prod(ndims);
64 for (usize i = 0; i < padded_out_size; i++) {
65 fill(prod.begin(), prod.end(), T(0));
66 for (usize r1 = 0; r1 < ndims; r1++) {
67 for (usize r2 = 0; r2 < ndims; r2++) {
72 prod[r] += a_ranked[r1][i] * b_ranked[r2][i];
75 for (usize r = 0; r < ndims; r++) {
76 a_ranked[r][i] = prod[r];
79 for (usize r = 0; r < ndims; r++) {
83 std::vector<T> out(n, T(0));
84 for (usize i = 0; i < n; i++) {
86 for (usize d = ndims - 1; d > 0; d--) {
87 rank += i / squeezed_shape[d];
90 out[i] = a_ranked[rank][i];
void ifft_inplace(RandomIt first, RandomIt last)
In-place inverse fast Fourier transform (IFFT).
Definition: fft.hpp:146
std::vector< T > multiply_multivar_fps(const std::vector< T > &a, const std::vector< T > &b, const std::vector< std::size_t > &shape)
Multiply two multivariate formal power series (FPS).
Definition: multivar.hpp:28
void fft_inplace(RandomIt first, RandomIt last)
In-place fast Fourier transform (FFT).
Definition: fft.hpp:108