22#define CP_ALGO_MATH_CVECTOR_HPP
33#include " ../util/complex.hpp"
44#include " ../util/checkpoint.hpp"
5+ #include " ../util/new_big.hpp"
56#include < experimental/simd>
67#include < ranges>
78
@@ -17,12 +18,28 @@ namespace cp_algo::math::fft {
1718 static constexpr vpoint vi = {vz, vz + 1 };
1819
1920 struct cvector {
20- std::vector<vpoint> r;
21+ vpoint *r;
22+ size_t sz;
2123 cvector (size_t n) {
22- n = std::max (flen, std::bit_ceil (n));
23- r. resize (n / flen);
24+ sz = std::max (flen, std::bit_ceil (n));
25+ r = new_big<vpoint>(sz / flen);
2426 checkpoint (" cvector create" );
2527 }
28+ cvector (cvector const & t) {
29+ sz = t.sz ;
30+ r = new_big<vpoint>(sz / flen);
31+ memcpy (r, t.r , (sz / flen) * sizeof (vpoint));
32+ checkpoint (" cvector copy" );
33+ }
34+ cvector (cvector&& t) noexcept {
35+ sz = t.sz ;
36+ r = std::exchange (t.r , nullptr );
37+ }
38+ ~cvector () noexcept {
39+ if (r) {
40+ delete_big (r, sz / flen);
41+ }
42+ }
2643
2744 vpoint& at (size_t k) {return r[k / flen];}
2845 vpoint at (size_t k) const {return r[k / flen];}
@@ -45,7 +62,7 @@ namespace cp_algo::math::fft {
4562 }
4663
4764 size_t size () const {
48- return flen * std::size (r) ;
65+ return sz ;
4966 }
5067 static size_t eval_arg (size_t n) {
5168 if (n < pre_roots) {
@@ -93,13 +110,12 @@ namespace cp_algo::math::fft {
93110 }
94111 auto [Ax, Ay] = A.at (k);
95112 auto Bv = B.at (k);
96- vpoint res = {vz, vz} ;
113+ vpoint res = vz ;
97114 for (size_t i = 0 ; i < flen; i++) {
98115 res += vpoint (vz + Ax[i], vz + Ay[i]) * Bv;
99116 real (Bv) = __builtin_shufflevector (real (Bv), real (Bv), 3 , 0 , 1 , 2 );
100117 imag (Bv) = __builtin_shufflevector (imag (Bv), imag (Bv), 3 , 0 , 1 , 2 );
101- auto x = real (Bv)[0 ];
102- auto y = imag (Bv)[0 ];
118+ auto x = real (Bv)[0 ], y = imag (Bv)[0 ];
103119 real (Bv)[0 ] = x * real (rt) - y * imag (rt);
104120 imag (Bv)[0 ] = x * imag (rt) + y * real (rt);
105121 }
0 commit comments