60 FFTConvolution(
size_t n,
size_t m,
const Field& f,
const Elt omega,
61 uint64_t omega_order,
const Elt y[])
64 omega_order_(omega_order),
67 padding_(choose_padding(m)),
68 y_fft_(padding_, f_.zero()) {
69 Blas<Field>::copy(m, &y_fft_[0], 1, y, 1);
70 FFT<Field>::fftf(&y_fft_[0], padding_, omega_, omega_order_, f_);
73 Blas<Field>::scale(padding_, &y_fft_[0], 1,
74 f_.invertf(f_.of_scalar(padding_)), f_);
80 void convolution(
const Elt x[], Elt z[])
const {
81 std::vector<Elt> x_fft(padding_, f_.zero());
82 Blas<Field>::copy(n_, &x_fft[0], 1, x, 1);
83 FFT<Field>::fftf(&x_fft[0], padding_, omega_, omega_order_, f_);
85 for (
size_t i = 0; i < padding_; ++i) {
86 f_.mul(x_fft[i], y_fft_[i]);
89 FFT<Field>::fftb(&x_fft[0], padding_, omega_, omega_order_, f_);
90 Blas<Field>::copy(m_, z, 1, &x_fft[0], 1);
96 const uint64_t omega_order_;
105 std::vector<Elt> y_fft_;
109class FFTConvolutionFactory {
114 FFTConvolutionFactory(
const Field& f,
const Elt omega, uint64_t omega_order)
115 : f_(f), omega_(omega), omega_order_(omega_order) {}
117 std::unique_ptr<const Convolver> make(
size_t n,
size_t m,
118 const Elt y[])
const {
119 return std::make_unique<const Convolver>(n, m, f_, omega_, omega_order_, y);
125 const uint64_t omega_order_;
129class FFTExtConvolution {
131 using EltExt =
typename FieldExt::Elt;
134 FFTExtConvolution(
size_t n,
size_t m,
const Field& f,
const FieldExt& f_ext,
135 const EltExt omega, uint64_t omega_order,
140 omega_order_(omega_order),
143 padding_(choose_padding(m)),
144 y_fft_(padding_, f_.zero()) {
145 Blas<Field>::copy(m, &y_fft_[0], 1, y, 1);
146 RFFT<FieldExt>::r2hc(&y_fft_[0], padding_, omega_, omega_order_, f_ext_);
149 Blas<Field>::scale(padding_, &y_fft_[0], 1,
150 f_.invertf(f_.of_scalar(padding_)), f_);
156 void convolution(
const Elt x[], Elt z[])
const {
157 std::vector<Elt> x_fft(padding_, f_.zero());
158 Blas<Field>::copy(n_, &x_fft[0], 1, x, 1);
159 RFFT<FieldExt>::r2hc(&x_fft[0], padding_, omega_, omega_order_, f_ext_);
164 f_.mul(x_fft[0], y_fft_[0]);
165 for (i = 1; i + i < padding_; ++i) {
166 RFFT<FieldExt>::cmul(&x_fft[i], &x_fft[padding_ - i], x_fft[i],
167 x_fft[padding_ - i], y_fft_[i],
168 y_fft_[padding_ - i], f_);
170 f_.mul(x_fft[i], y_fft_[i]);
174 RFFT<FieldExt>::hc2r(&x_fft[0], padding_, omega_, omega_order_, f_ext_);
175 Blas<Field>::copy(m_, z, 1, &x_fft[0], 1);
180 const FieldExt& f_ext_;
182 const uint64_t omega_order_;
191 std::vector<Elt> y_fft_;
195class FFTExtConvolutionFactory {
197 using EltExt =
typename FieldExt::Elt;
202 FFTExtConvolutionFactory(
const Field& f,
const FieldExt& f_ext,
203 const EltExt omega, uint64_t omega_order)
204 : f_(f), f_ext_(f_ext), omega_(omega), omega_order_(omega_order) {}
206 std::unique_ptr<const Convolver> make(
size_t n,
size_t m,
207 const Elt y[])
const {
208 return std::make_unique<const Convolver>(n, m, f_, f_ext_, omega_,
214 const FieldExt& f_ext_;
216 const uint64_t omega_order_;
Definition convolution.h:129