Skip to content

Commit 17222cc

Browse files
committed
Try reusing vector<base> in mul
1 parent dcb6e27 commit 17222cc

File tree

1 file changed

+14
-9
lines changed

1 file changed

+14
-9
lines changed

cp-algo/math/fft.hpp

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -231,11 +231,12 @@ namespace cp_algo::math::fft {
231231
}
232232
}
233233

234-
std::vector<base> mul(auto &&C, auto &&D) {
234+
void mul(auto &&C, auto &&D, auto &res) {
235235
assert(A.size() == C.size());
236236
size_t n = A.size();
237237
if(!n) {
238-
return std::vector<base>();
238+
res = {};
239+
return;
239240
}
240241
for(size_t i = 0; i < n; i += flen) {
241242
auto tmp = A.vget(i) * D.vget(i) + B.vget(i) * C.vget(i);
@@ -246,7 +247,7 @@ namespace cp_algo::math::fft {
246247
A.ifft();
247248
B.ifft();
248249
C.ifft();
249-
std::vector<base> res(2 * n);
250+
res.resize(2 * n);
250251
cvector::exec_on_roots(2 * n, n, [&](size_t i, point rt) {
251252
rt = conj(rt);
252253
auto Ai = A.get(i) * rt;
@@ -261,10 +262,14 @@ namespace cp_algo::math::fft {
261262
base B2 = llround(imag(Bi));
262263
res[n + i] = B0 + B1 * split + B2 * split * split;
263264
});
264-
return res;
265+
}
266+
void mul(auto &&B, auto& res) {
267+
mul(B.A, B.B, res);
265268
}
266269
std::vector<base> operator *= (auto &&B) {
267-
return mul(B.A, B.B);
270+
std::vector<base> res;
271+
mul(B.A, B.B, res);
272+
return res;
268273
}
269274

270275
auto operator * (dft const& B) const {
@@ -290,19 +295,19 @@ namespace cp_algo::math::fft {
290295
auto n = com_size(a.size(), b.size());
291296
auto A = dft<base>(a, n);
292297
if(a == b) {
293-
a = A *= dft<base>(A);
298+
A.mul(dft<base>(A), a);
294299
} else {
295-
a = A *= dft<base>(b, n);
300+
A.mul(dft<base>(b, n), a);
296301
}
297302
}
298303
template<typename base>
299304
void circular_mul(std::vector<base> &a, std::vector<base> const& b) {
300305
auto n = std::max(flen, std::bit_ceil(max(a.size(), b.size())) / 2);
301306
auto A = dft<base>(a, n);
302307
if(a == b) {
303-
a = A *= dft<base>(A);
308+
A.mul(dft<base>(A), a);
304309
} else {
305-
a = A *= dft<base>(b, n);
310+
A.mul(dft<base>(b, n), a);
306311
}
307312
}
308313
}

0 commit comments

Comments
 (0)