@@ -14,6 +14,39 @@ namespace cp_algo::math::fft {
14
14
static constexpr size_t flen = vftype::size();
15
15
16
16
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
+
17
50
static constexpr size_t pre_roots = 1 << 16 ;
18
51
static constexpr std::array<point, pre_roots> roots = []() {
19
52
std::array<point, pre_roots> res = {};
@@ -77,40 +110,6 @@ namespace cp_algo::math::fft {
77
110
callback (i, eval_point (i));
78
111
}
79
112
}
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
-
114
113
static auto dot_block (size_t k, cvector const & A, cvector const & B) {
115
114
auto rt = eval_point (k / flen / 2 );
116
115
if (k / flen % 2 ) {
0 commit comments