@@ -14,6 +14,39 @@ namespace cp_algo::math::fft {
1414 static constexpr size_t flen = vftype::size();
1515
1616 struct cvector {
17+ std::vector<vftype> x, y;
18+ cvector (size_t n) {
19+ n = std::max (flen, std::bit_ceil (n));
20+ x.resize (n / flen);
21+ y.resize (n / flen);
22+ checkpoint (" cvector create" );
23+ }
24+ template <class pt = point>
25+ void set (size_t k, pt t) {
26+ if constexpr (std::is_same_v<pt, point>) {
27+ x[k / flen][k % flen] = real (t);
28+ y[k / flen][k % flen] = imag (t);
29+ } else {
30+ x[k / flen] = real (t);
31+ y[k / flen] = imag (t);
32+ }
33+ }
34+ template <class pt = point>
35+ pt get (size_t k) const {
36+ if constexpr (std::is_same_v<pt, point>) {
37+ return {x[k / flen][k % flen], y[k / flen][k % flen]};
38+ } else {
39+ return {x[k / flen], y[k / flen]};
40+ }
41+ }
42+ vpoint vget (size_t k) const {
43+ return get<vpoint>(k);
44+ }
45+
46+ size_t size () const {
47+ return flen * std::size (x);
48+ }
49+
1750 static constexpr size_t pre_roots = 1 << 16 ;
1851 static constexpr std::array<point, pre_roots> roots = []() {
1952 std::array<point, pre_roots> res = {};
@@ -77,40 +110,6 @@ namespace cp_algo::math::fft {
77110 callback (i, eval_point (i));
78111 }
79112 }
80- std::vector<vftype> x, y;
81- cvector (size_t n) {
82- n = std::max (flen, std::bit_ceil (n));
83- x.resize (n / flen);
84- y.resize (n / flen);
85- checkpoint (" cvector create" );
86- }
87- template <class pt = point>
88- void set (size_t k, pt t) {
89- if constexpr (std::is_same_v<pt, point>) {
90- x[k / flen][k % flen] = real (t);
91- y[k / flen][k % flen] = imag (t);
92- } else {
93- x[k / flen] = real (t);
94- y[k / flen] = imag (t);
95- }
96- }
97- template <class pt = point>
98- pt get (size_t k) const {
99- if constexpr (std::is_same_v<pt, point>) {
100- return {x[k / flen][k % flen], y[k / flen][k % flen]};
101- } else {
102- return {x[k / flen], y[k / flen]};
103- }
104- }
105- vpoint vget (size_t k) const {
106- return get<vpoint>(k);
107- }
108-
109- size_t size () const {
110- return flen * std::size (x);
111- }
112-
113-
114113 static auto dot_block (size_t k, cvector const & A, cvector const & B) {
115114 auto rt = eval_point (k / flen / 2 );
116115 if (k / flen % 2 ) {
0 commit comments