@@ -13,13 +13,17 @@ namespace cp_algo::math::fft {
1313
1414 dft (auto const & a, size_t n): A(n), B(n) {
1515 split = int (std::sqrt (base::mod ())) + 1 ;
16- cvector::exec_on_roots (2 * n, size (a), [&](size_t i, point rt) {
17- size_t ti = std::min (i, i - n);
18- auto rem = std::remainder (a[i].rem (), split);
19- auto quo = (ftype (a[i].rem ()) - rem) / split;
20- A.set (ti, A.get (ti) + rem * rt);
21- B.set (ti, B.get (ti) + quo * rt);
22-
16+ cvector::exec_on_roots (2 * n, std::min (n, size (a)), [&](size_t i, auto rt) {
17+ auto splt = [&](size_t i) {
18+ ftype ai = i < size (a) ? a[i].rem () : 0 ;
19+ auto rem = std::remainder (ai, split);
20+ auto quo = (ai - rem) / split;
21+ return std::pair{rem, quo};
22+ };
23+ auto [rai, qai] = splt (i);
24+ auto [rani, qani] = splt (n + i);
25+ A.set (i, point (rai, rani) * rt);
26+ B.set (i, point (qai, qani) * rt);
2327 });
2428 checkpoint (" dft init" );
2529 if (n) {
@@ -154,8 +158,9 @@ namespace cp_algo::math::fft {
154158 auto n = std::max (flen, std::bit_ceil (
155159 std::min (k, size (a)) + std::min (k, size (b)) - 1
156160 ) / 2 );
157- a.resize (k);
158161 auto A = dft<base>(a, n);
162+ a.resize (k);
163+ checkpoint (" resize a" );
159164 if (&a == &b) {
160165 A.mul (A, a, k);
161166 } else {
0 commit comments