GCC Code Coverage Report


Directory: src/
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 89.8% 546 / 0 / 608
Functions: 100.0% 129 / 0 / 129
Branches: 99.5% 405 / 0 / 407

fft/engines/algebras.hpp
Line Branch Exec Source
1 #pragma once
2
3 #include <array>
4 #include <concepts>
5 #include <cstddef>
6 #include <span>
7 #include <utility>
8
9 #include "fft/engine.hpp"
10
11 namespace ecnerwala::fft::engines {
12
13 // Small NxN matrix over num, row-major
14 // ==== wrapper engines ====
15
16 template <typename num, int N> struct mat {
17 2826 std::array<num, size_t(N) * N> a{};
18 1277580 num& operator[](std::array<int, 2> rc) { return a[size_t(rc[0]) * N + rc[1]]; }
19 2439792 const num& operator[](std::array<int, 2> rc) const { return a[size_t(rc[0]) * N + rc[1]]; }
20 31152 num* data() { return a.data(); }
21 23908 const num* data() const { return a.data(); }
22
6/6
ecnerwala::fft::engines::mat<modnum<1000000007>, 2>::operator+=(ecnerwala::fft::engines::mat<modnum<1000000007>, 2> const&):
✓ Branch 15 → 3 taken 24840 times.
✓ Branch 15 → 16 taken 6210 times.
ecnerwala::fft::engines::mat<modnum<1000000007>, 3>::operator+=(ecnerwala::fft::engines::mat<modnum<1000000007>, 3> const&):
✓ Branch 15 → 3 taken 61650 times.
✓ Branch 15 → 16 taken 6850 times.
ecnerwala::fft::engines::mat<modnum<998244353>, 3>::operator+=(ecnerwala::fft::engines::mat<modnum<998244353>, 3> const&):
✓ Branch 15 → 3 taken 61650 times.
✓ Branch 15 → 16 taken 6850 times.
168050 mat& operator+=(const mat& o) { for (int i = 0; i < N*N; i++) a[i] += o.a[i]; return *this; }
23 340 friend mat operator+(mat x, const mat& y) { x += y; return x; }
24
6/6
ecnerwala::fft::engines::mat<modnum<1000000007>, 2>::operator-=(ecnerwala::fft::engines::mat<modnum<1000000007>, 2> const&):
✓ Branch 15 → 3 taken 80 times.
✓ Branch 15 → 16 taken 20 times.
ecnerwala::fft::engines::mat<modnum<1000000007>, 3>::operator-=(ecnerwala::fft::engines::mat<modnum<1000000007>, 3> const&):
✓ Branch 15 → 3 taken 450 times.
✓ Branch 15 → 16 taken 50 times.
ecnerwala::fft::engines::mat<modnum<998244353>, 3>::operator-=(ecnerwala::fft::engines::mat<modnum<998244353>, 3> const&):
✓ Branch 15 → 3 taken 450 times.
✓ Branch 15 → 16 taken 50 times.
1100 mat& operator-=(const mat& o) { for (int i = 0; i < N*N; i++) a[i] -= o.a[i]; return *this; }
25 120 friend mat operator-(mat x, const mat& y) { x -= y; return x; }
26 19460 friend mat operator*(const mat& x, const mat& y) {
27 19460 mat r;
28
18/18
ecnerwala::fft::engines::operator*(ecnerwala::fft::engines::mat<modnum<1000000007>, 2> const&, ecnerwala::fft::engines::mat<modnum<1000000007>, 2> const&):
✓ Branch 56 → 5 taken 50016 times.
✓ Branch 56 → 57 taken 25008 times.
✓ Branch 58 → 59 taken 25008 times.
✓ Branch 58 → 60 taken 12504 times.
✓ Branch 61 → 62 taken 12504 times.
✓ Branch 61 → 63 taken 6252 times.
ecnerwala::fft::engines::operator*(ecnerwala::fft::engines::mat<modnum<1000000007>, 3> const&, ecnerwala::fft::engines::mat<modnum<1000000007>, 3> const&):
✓ Branch 55 → 4 taken 178308 times.
✓ Branch 55 → 56 taken 59436 times.
✓ Branch 57 → 58 taken 59436 times.
✓ Branch 57 → 59 taken 19812 times.
✓ Branch 60 → 61 taken 19812 times.
✓ Branch 60 → 62 taken 6604 times.
ecnerwala::fft::engines::operator*(ecnerwala::fft::engines::mat<modnum<998244353>, 3> const&, ecnerwala::fft::engines::mat<modnum<998244353>, 3> const&):
✓ Branch 55 → 4 taken 178308 times.
✓ Branch 55 → 56 taken 59436 times.
✓ Branch 57 → 58 taken 59436 times.
✓ Branch 57 → 59 taken 19812 times.
✓ Branch 60 → 61 taken 19812 times.
✓ Branch 60 → 62 taken 6604 times.
622100 for (int i = 0; i < N; i++) for (int k = 0; k < N; k++) for (int j = 0; j < N; j++)
29 1626528 r[{i, j}] += x[{i, k}] * y[{k, j}];
30 19460 return r;
31 }
32 mat& operator*=(const mat& o) { return *this = *this * o; }
33
1/2
✓ Branch 20 → 21 taken 2694 times.
✗ Branch 20 → 25 not taken.
5652 friend bool operator==(const mat&, const mat&) = default;
34 };
35
36 // Truncated polynomial mod x^N over num
37 template <typename num, int N> struct trunc_series {
38 2304 std::array<num, size_t(N)> a{};
39 67544 num& operator[](int i) { return a[size_t(i)]; }
40 122160 const num& operator[](int i) const { return a[size_t(i)]; }
41 7856 num* data() { return a.data(); }
42 6464 const num* data() const { return a.data(); }
43
6/6
ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>::operator+=(ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2> const&):
✓ Branch 15 → 3 taken 8064 times.
✓ Branch 15 → 16 taken 4032 times.
ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>::operator+=(ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3> const&):
✓ Branch 15 → 3 taken 12096 times.
✓ Branch 15 → 16 taken 4032 times.
ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>::operator+=(ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3> const&):
✓ Branch 15 → 3 taken 12096 times.
✓ Branch 15 → 16 taken 4032 times.
44352 trunc_series& operator+=(const trunc_series& o) { for (int i = 0; i < N; i++) a[i] += o.a[i]; return *this; }
44 friend trunc_series operator+(trunc_series x, const trunc_series& y) { x += y; return x; }
45
6/6
ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>::operator-=(ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2> const&):
✓ Branch 15 → 3 taken 36 times.
✓ Branch 15 → 16 taken 18 times.
ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>::operator-=(ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3> const&):
✓ Branch 15 → 3 taken 54 times.
✓ Branch 15 → 16 taken 18 times.
ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>::operator-=(ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3> const&):
✓ Branch 15 → 3 taken 54 times.
✓ Branch 15 → 16 taken 18 times.
198 trunc_series& operator-=(const trunc_series& o) { for (int i = 0; i < N; i++) a[i] -= o.a[i]; return *this; }
46 54 friend trunc_series operator-(trunc_series x, const trunc_series& y) { x -= y; return x; }
47 12216 friend trunc_series operator*(const trunc_series& x, const trunc_series& y) {
48 12216 trunc_series r;
49
12/12
ecnerwala::fft::engines::operator*(ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2> const&, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2> const&):
✓ Branch 29 → 5 taken 12216 times.
✓ Branch 29 → 30 taken 8144 times.
✓ Branch 31 → 32 taken 8144 times.
✓ Branch 31 → 33 taken 4072 times.
ecnerwala::fft::engines::operator*(ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3> const&, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3> const&):
✓ Branch 29 → 5 taken 24432 times.
✓ Branch 29 → 30 taken 12216 times.
✓ Branch 31 → 32 taken 12216 times.
✓ Branch 31 → 33 taken 4072 times.
ecnerwala::fft::engines::operator*(ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3> const&, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3> const&):
✓ Branch 29 → 5 taken 24432 times.
✓ Branch 29 → 30 taken 12216 times.
✓ Branch 31 → 32 taken 12216 times.
✓ Branch 31 → 33 taken 4072 times.
228032 for (int i = 0; i < N; i++) for (int j = 0; j < N - i; j++) r[i + j] += x[i] * y[j];
50 12216 return r;
51 }
52 trunc_series& operator*=(const trunc_series& o) { return *this = *this * o; }
53
1/2
✓ Branch 20 → 21 taken 2304 times.
✗ Branch 20 → 25 not taken.
4608 friend bool operator==(const trunc_series&, const trunc_series&) = default;
54 };
55
56 // componentwise
57
58 // These are "componentwise engines" which model free modules/algebras over the underlying ring.
59 // Matrices are the canonical example: we can take entry-wise transforms, then multiply/add in transformed space.
60 //
61 // We start with a shared `componentwise` base class which handles all linear ops, i.e. not mul.
62 //
63 // If the underlying has unit_scale = 1, we may need to avoid accumulation of sums in transformed space;
64 // then, the product and the transformed data may have different dimensions.
65 // We'll represent this by an array Ofs of prefix offsets mapping each input/transform-space dimension to a range of product-space dimensions.
66 // Specifically, out[c] = sum prod[Ofs[c]:Ofs[c+1]]
67
68 template <int L> constexpr std::array<int, size_t(L) + 1> componentwise_iota = [] {
69 std::array<int, size_t(L) + 1> r{};
70 for (int i = 0; i <= L; i++) r[size_t(i)] = i;
71 return r;
72 }();
73
74 template <engine E, typename V, int L, std::array<int, size_t(L) + 1> Ofs = componentwise_iota<L>>
75 struct componentwise {
76 using S = typename E::value_type;
77 using value_type = V;
78 static constexpr int P = Ofs[size_t(L)]; // total product components
79 static constexpr int unit_scale = E::unit_scale;
80 534 template <int A = unit_scale> struct transformed_t {
81 std::array<typename E::template transformed_t<A>, size_t(L)> t;
82 1736 int size() const { return t[0].size(); }
83 20 transformed_t() = default;
84 template <int A2> requires (A2 != A) explicit(A2 > A) transformed_t(transformed_t<A2>&& o) {
85 for (int c = 0; c < L; c++)
86 t[c] = typename E::template transformed_t<A>(std::move(o.t[c]));
87 }
88 };
89 using transformed = transformed_t<>;
90 // TODO: if E::product_t == E::transformed_t, mirror that here
91 478 template <int K> struct product_t {
92 std::array<typename E::template product_t<K>, size_t(P)> t;
93 int size() const { return t[0].size(); }
94 product_t() = default;
95 template <int K2> requires (K2 != K) explicit(K2 > K) product_t(product_t<K2>&& o) {
96 for (int c = 0; c < P; c++)
97 t[c] = typename E::template product_t<K>(std::move(o.t[c]));
98 }
99 };
100
101 486 static transformed transform(std::span<const V> a, int n) {
102
20/20
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3> const, 18446744073709551615ul>, int):
✓ Branch 17 → 18 taken 40 times.
✓ Branch 17 → 19 taken 40 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 2> const, 18446744073709551615ul>, int):
✓ Branch 17 → 18 taken 82 times.
✓ Branch 17 → 19 taken 41 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3> const, 18446744073709551615ul>, int):
✓ Branch 17 → 18 taken 287 times.
✓ Branch 17 → 19 taken 41 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 2, 3}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3> const, 18446744073709551615ul>, int):
✓ Branch 11 → 12 taken 40 times.
✓ Branch 11 → 13 taken 40 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3> const, 18446744073709551615ul>, int):
✓ Branch 11 → 12 taken 40 times.
✓ Branch 11 → 13 taken 40 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3> const, 18446744073709551615ul>, int):
✓ Branch 11 → 12 taken 287 times.
✓ Branch 11 → 13 taken 41 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3> const, 18446744073709551615ul>, int):
✓ Branch 11 → 12 taken 287 times.
✓ Branch 11 → 13 taken 41 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3> const, 18446744073709551615ul>, int):
✓ Branch 11 → 12 taken 40 times.
✓ Branch 11 → 13 taken 40 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 2> const, 18446744073709551615ul>, int):
✓ Branch 11 → 12 taken 82 times.
✓ Branch 11 → 13 taken 41 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3> const, 18446744073709551615ul>, int):
✓ Branch 11 → 12 taken 287 times.
✓ Branch 11 → 13 taken 41 times.
1958 transformed r;
103
12/12
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2> const, 18446744073709551615ul>, int):
✓ Branch 18 → 59 taken 40 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3> const, 18446744073709551615ul>, int):
✓ Branch 21 → 62 taken 40 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 2> const, 18446744073709551615ul>, int):
✓ Branch 21 → 62 taken 41 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3> const, 18446744073709551615ul>, int):
✓ Branch 21 → 62 taken 41 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 2, 3}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3> const, 18446744073709551615ul>, int):
✓ Branch 15 → 77 taken 40 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3> const, 18446744073709551615ul>, int):
✓ Branch 15 → 77 taken 40 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3> const, 18446744073709551615ul>, int):
✓ Branch 15 → 77 taken 41 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3> const, 18446744073709551615ul>, int):
✓ Branch 15 → 77 taken 41 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2> const, 18446744073709551615ul>, int):
✓ Branch 12 → 74 taken 40 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3> const, 18446744073709551615ul>, int):
✓ Branch 15 → 77 taken 40 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 2> const, 18446744073709551615ul>, int):
✓ Branch 15 → 77 taken 41 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3> const, 18446744073709551615ul>, int):
✓ Branch 15 → 77 taken 41 times.
486 auto buf = buffer_pool<S>::get(sz(a));
104
24/24
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2> const, 18446744073709551615ul>, int):
✓ Branch 59 → 36 taken 80 times.
✓ Branch 59 → 60 taken 40 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3> const, 18446744073709551615ul>, int):
✓ Branch 62 → 39 taken 120 times.
✓ Branch 62 → 63 taken 40 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 2> const, 18446744073709551615ul>, int):
✓ Branch 62 → 39 taken 164 times.
✓ Branch 62 → 63 taken 41 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3> const, 18446744073709551615ul>, int):
✓ Branch 62 → 39 taken 369 times.
✓ Branch 62 → 63 taken 41 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 2, 3}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3> const, 18446744073709551615ul>, int):
✓ Branch 77 → 33 taken 120 times.
✓ Branch 77 → 78 taken 40 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3> const, 18446744073709551615ul>, int):
✓ Branch 77 → 33 taken 120 times.
✓ Branch 77 → 78 taken 40 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3> const, 18446744073709551615ul>, int):
✓ Branch 77 → 33 taken 369 times.
✓ Branch 77 → 78 taken 41 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3> const, 18446744073709551615ul>, int):
✓ Branch 77 → 33 taken 369 times.
✓ Branch 77 → 78 taken 41 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2> const, 18446744073709551615ul>, int):
✓ Branch 74 → 30 taken 80 times.
✓ Branch 74 → 75 taken 40 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3> const, 18446744073709551615ul>, int):
✓ Branch 77 → 33 taken 120 times.
✓ Branch 77 → 78 taken 40 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 2> const, 18446744073709551615ul>, int):
✓ Branch 77 → 33 taken 164 times.
✓ Branch 77 → 78 taken 41 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3> const, 18446744073709551615ul>, int):
✓ Branch 77 → 33 taken 369 times.
✓ Branch 77 → 78 taken 41 times.
2930 for (int c = 0; c < L; c++) {
105
24/24
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2> const, 18446744073709551615ul>, int):
✓ Branch 37 → 19 taken 808 times.
✓ Branch 37 → 38 taken 80 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3> const, 18446744073709551615ul>, int):
✓ Branch 40 → 22 taken 1212 times.
✓ Branch 40 → 41 taken 120 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 2> const, 18446744073709551615ul>, int):
✓ Branch 40 → 22 taken 1748 times.
✓ Branch 40 → 41 taken 164 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3> const, 18446744073709551615ul>, int):
✓ Branch 40 → 22 taken 3933 times.
✓ Branch 40 → 41 taken 369 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 2, 3}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3> const, 18446744073709551615ul>, int):
✓ Branch 34 → 16 taken 1212 times.
✓ Branch 34 → 35 taken 120 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3> const, 18446744073709551615ul>, int):
✓ Branch 34 → 16 taken 1212 times.
✓ Branch 34 → 35 taken 120 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3> const, 18446744073709551615ul>, int):
✓ Branch 34 → 16 taken 3933 times.
✓ Branch 34 → 35 taken 369 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3> const, 18446744073709551615ul>, int):
✓ Branch 34 → 16 taken 3933 times.
✓ Branch 34 → 35 taken 369 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2> const, 18446744073709551615ul>, int):
✓ Branch 31 → 13 taken 808 times.
✓ Branch 31 → 32 taken 80 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3> const, 18446744073709551615ul>, int):
✓ Branch 34 → 16 taken 1212 times.
✓ Branch 34 → 35 taken 120 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 2> const, 18446744073709551615ul>, int):
✓ Branch 34 → 16 taken 1748 times.
✓ Branch 34 → 35 taken 164 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3> const, 18446744073709551615ul>, int):
✓ Branch 34 → 16 taken 3933 times.
✓ Branch 34 → 35 taken 369 times.
53828 for (int i = 0; i < sz(a); i++) buf[i] = a[i].data()[c];
106
12/12
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2> const, 18446744073709551615ul>, int):
✓ Branch 48 → 49 taken 80 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3> const, 18446744073709551615ul>, int):
✓ Branch 51 → 52 taken 120 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 2> const, 18446744073709551615ul>, int):
✓ Branch 51 → 52 taken 164 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3> const, 18446744073709551615ul>, int):
✓ Branch 51 → 52 taken 369 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 2, 3}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3> const, 18446744073709551615ul>, int):
✓ Branch 45 → 46 taken 120 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3> const, 18446744073709551615ul>, int):
✓ Branch 45 → 46 taken 120 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3> const, 18446744073709551615ul>, int):
✓ Branch 45 → 46 taken 369 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3> const, 18446744073709551615ul>, int):
✓ Branch 45 → 46 taken 369 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2> const, 18446744073709551615ul>, int):
✓ Branch 42 → 43 taken 80 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transform(std::span<ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3> const, 18446744073709551615ul>, int):
✓ Branch 45 → 46 taken 120 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 2> const, 18446744073709551615ul>, int):
✓ Branch 45 → 46 taken 164 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transform(std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3> const, 18446744073709551615ul>, int):
✓ Branch 45 → 46 taken 369 times.
8310 r.t[c] = E::transform(std::span<const S>(buf.span()), n);
107 }
108 486 return r;
109 486 }
110 868 static void extend_to(transformed& t, int m, std::span<const V> coeffs) {
111
8/8
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::extend_to(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1>&, int, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3> const, 18446744073709551615ul>):
✓ Branch 18 → 19 taken 159 times.
✓ Branch 18 → 20 taken 58 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::extend_to(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0>&, int, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3> const, 18446744073709551615ul>):
✓ Branch 15 → 16 taken 159 times.
✓ Branch 15 → 17 taken 58 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::extend_to(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<0>&, int, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3> const, 18446744073709551615ul>):
✓ Branch 15 → 16 taken 159 times.
✓ Branch 15 → 17 taken 58 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::extend_to(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1>&, int, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3> const, 18446744073709551615ul>):
✓ Branch 15 → 16 taken 159 times.
✓ Branch 15 → 17 taken 58 times.
1736 if (t.size() >= m) return;
112
4/4
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::extend_to(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1>&, int, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3> const, 18446744073709551615ul>):
✓ Branch 22 → 59 taken 58 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::extend_to(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0>&, int, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3> const, 18446744073709551615ul>):
✓ Branch 19 → 56 taken 58 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::extend_to(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<0>&, int, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3> const, 18446744073709551615ul>):
✓ Branch 19 → 56 taken 58 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::extend_to(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1>&, int, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3> const, 18446744073709551615ul>):
✓ Branch 19 → 56 taken 58 times.
232 auto buf = buffer_pool<S>::get(sz(coeffs));
113
8/8
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::extend_to(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1>&, int, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3> const, 18446744073709551615ul>):
✓ Branch 59 → 40 taken 522 times.
✓ Branch 59 → 60 taken 58 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::extend_to(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0>&, int, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3> const, 18446744073709551615ul>):
✓ Branch 56 → 37 taken 522 times.
✓ Branch 56 → 57 taken 58 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::extend_to(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<0>&, int, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3> const, 18446744073709551615ul>):
✓ Branch 56 → 37 taken 522 times.
✓ Branch 56 → 57 taken 58 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::extend_to(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1>&, int, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3> const, 18446744073709551615ul>):
✓ Branch 56 → 37 taken 522 times.
✓ Branch 56 → 57 taken 58 times.
2320 for (int c = 0; c < L; c++) {
114
8/8
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::extend_to(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1>&, int, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3> const, 18446744073709551615ul>):
✓ Branch 41 → 23 taken 1170 times.
✓ Branch 41 → 42 taken 522 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::extend_to(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0>&, int, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3> const, 18446744073709551615ul>):
✓ Branch 38 → 20 taken 1170 times.
✓ Branch 38 → 39 taken 522 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::extend_to(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<0>&, int, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3> const, 18446744073709551615ul>):
✓ Branch 38 → 20 taken 1170 times.
✓ Branch 38 → 39 taken 522 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::extend_to(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1>&, int, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3> const, 18446744073709551615ul>):
✓ Branch 38 → 20 taken 1170 times.
✓ Branch 38 → 39 taken 522 times.
11448 for (int i = 0; i < sz(coeffs); i++) buf[i] = coeffs[i].data()[c];
115
4/4
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::extend_to(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1>&, int, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3> const, 18446744073709551615ul>):
✓ Branch 55 → 56 taken 522 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::extend_to(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0>&, int, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3> const, 18446744073709551615ul>):
✓ Branch 52 → 53 taken 522 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::extend_to(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<0>&, int, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3> const, 18446744073709551615ul>):
✓ Branch 52 → 53 taken 522 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::extend_to(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1>&, int, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3> const, 18446744073709551615ul>):
✓ Branch 52 → 53 taken 522 times.
4176 E::extend_to(t.t[c], m, std::span<const S>(buf.span()));
116 }
117 232 }
118 template <int A> static transformed_t<A> downsample(const transformed_t<A>& t, int n, bool odd) {
119 transformed_t<A> r;
120 for (int c = 0; c < L; c++) r.t[c] = E::downsample(t.t[c], n, odd);
121 return r;
122 }
123 template <int K> static product_t<K> downsample(const product_t<K>& p, int n, bool odd) {
124 product_t<K> r;
125 for (int c = 0; c < P; c++) r.t[c] = E::downsample(p.t[c], n, odd);
126 return r;
127 }
128 template <int A> static transformed_t<A> negate_arg(const transformed_t<A>& t, int n) {
129 transformed_t<A> r;
130 for (int c = 0; c < L; c++) r.t[c] = E::negate_arg(t.t[c], n);
131 return r;
132 }
133 template <int A, int B> static transformed_t<A + B> add(transformed_t<A>&& a, const transformed_t<B>& b) {
134 transformed_t<A + B> r;
135 for (int c = 0; c < L; c++) r.t[c] = E::add(std::move(a.t[c]), b.t[c]);
136 return r;
137 }
138 template <int K1, int K2> static product_t<K1 + K2> add(product_t<K1>&& a, product_t<K2>&& b) {
139 product_t<K1 + K2> r;
140 for (int c = 0; c < P; c++) r.t[c] = E::add(std::move(a.t[c]), std::move(b.t[c]));
141 return r;
142 }
143 478 template <int K, typename Op = assign_op> static void finish(product_t<K>&& p, std::span<V> out, Op op = {}) {
144
24/24
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::finish<2, ecnerwala::fft::assign_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::product_t<2>&&, std::span<ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 18446744073709551615ul>, ecnerwala::fft::assign_op):
✓ Branch 4 → 5 taken 20 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::finish<1, ecnerwala::fft::assign_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::product_t<1>&&, std::span<ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::assign_op):
✓ Branch 4 → 5 taken 20 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::finish<2, ecnerwala::fft::assign_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::product_t<2>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 18446744073709551615ul>, ecnerwala::fft::assign_op):
✓ Branch 4 → 5 taken 21 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<1, ecnerwala::fft::add_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<1>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::add_op):
✓ Branch 4 → 5 taken 4 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<1, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op> >(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<1>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op>):
✓ Branch 4 → 5 taken 1 time.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<1, ecnerwala::fft::assign_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<1>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::assign_op):
✓ Branch 4 → 5 taken 21 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<2, ecnerwala::fft::add_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<2>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::add_op):
✓ Branch 4 → 5 taken 39 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<2, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op> >(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<2>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op>):
✓ Branch 4 → 5 taken 14 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 2, 3}}>::finish<0, ecnerwala::fft::assign_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 2, 3}}>::product_t<0>&&, std::span<ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 18446744073709551615ul>, ecnerwala::fft::assign_op):
✓ Branch 4 → 5 taken 20 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::finish<0, ecnerwala::fft::assign_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::product_t<0>&&, std::span<ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 18446744073709551615ul>, ecnerwala::fft::assign_op):
✓ Branch 4 → 5 taken 20 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::finish<0, ecnerwala::fft::add_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::product_t<0>&&, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 18446744073709551615ul>, ecnerwala::fft::add_op):
✓ Branch 4 → 5 taken 43 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::finish<0, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, ecnerwala::fft::add_op> >(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::product_t<0>&&, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 18446744073709551615ul>, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, ecnerwala::fft::add_op>):
✓ Branch 4 → 5 taken 15 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::finish<0, ecnerwala::fft::assign_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::product_t<0>&&, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 18446744073709551615ul>, ecnerwala::fft::assign_op):
✓ Branch 4 → 5 taken 21 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<0, ecnerwala::fft::add_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<0>&&, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 18446744073709551615ul>, ecnerwala::fft::add_op):
✓ Branch 4 → 5 taken 43 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<0, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, ecnerwala::fft::add_op> >(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<0>&&, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 18446744073709551615ul>, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, ecnerwala::fft::add_op>):
✓ Branch 4 → 5 taken 15 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<0, ecnerwala::fft::assign_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<0>&&, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 18446744073709551615ul>, ecnerwala::fft::assign_op):
✓ Branch 4 → 5 taken 21 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::finish<2, ecnerwala::fft::assign_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::product_t<2>&&, std::span<ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 18446744073709551615ul>, ecnerwala::fft::assign_op):
✓ Branch 4 → 5 taken 20 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::finish<1, ecnerwala::fft::assign_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::product_t<1>&&, std::span<ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::assign_op):
✓ Branch 4 → 5 taken 20 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::finish<2, ecnerwala::fft::assign_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::product_t<2>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 18446744073709551615ul>, ecnerwala::fft::assign_op):
✓ Branch 4 → 5 taken 21 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<1, ecnerwala::fft::add_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<1>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::add_op):
✓ Branch 4 → 5 taken 4 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<1, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op> >(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<1>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op>):
✓ Branch 4 → 5 taken 1 time.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<1, ecnerwala::fft::assign_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<1>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::assign_op):
✓ Branch 4 → 5 taken 21 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<2, ecnerwala::fft::add_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<2>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::add_op):
✓ Branch 4 → 5 taken 39 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<2, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op> >(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<2>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op>):
✓ Branch 4 → 5 taken 14 times.
478 auto buf = buffer_pool<S>::get(sz(out));
145 1434 auto emit = [&](std::span<V> dst) {
146
2/2
✓ Branch 70 → 3 taken 3332 times.
✓ Branch 70 → 71 taken 478 times.
3810 for (int c = 0; c < L; c++) {
147 6664 E::finish(std::move(p.t[Ofs[size_t(c)]]), buf.span());
148
2/2
✓ Branch 46 → 26 taken 4446 times.
✓ Branch 46 → 67 taken 3332 times.
7778 for (int j = Ofs[size_t(c)] + 1; j < Ofs[size_t(c) + 1]; j++)
149 8892 E::finish(std::move(p.t[j]), buf.span(), add_op{});
150
2/2
✓ Branch 68 → 47 taken 39008 times.
✓ Branch 68 → 69 taken 3332 times.
81348 for (int i = 0; i < sz(dst); i++) dst[i].data()[c] = buf[i];
151 }
152 };
153 // Op must see each out element whole, exactly once, so compose
154 // non-assign ops through an element buffer.
155 if constexpr (std::same_as<Op, assign_op>) {
156
12/12
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::finish<2, ecnerwala::fft::assign_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::product_t<2>&&, std::span<ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 18446744073709551615ul>, ecnerwala::fft::assign_op):
✓ Branch 7 → 8 taken 20 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::finish<1, ecnerwala::fft::assign_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::product_t<1>&&, std::span<ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::assign_op):
✓ Branch 7 → 8 taken 20 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::finish<2, ecnerwala::fft::assign_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::product_t<2>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 18446744073709551615ul>, ecnerwala::fft::assign_op):
✓ Branch 7 → 8 taken 21 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<1, ecnerwala::fft::assign_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<1>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::assign_op):
✓ Branch 7 → 8 taken 21 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 2, 3}}>::finish<0, ecnerwala::fft::assign_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 2, 3}}>::product_t<0>&&, std::span<ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 18446744073709551615ul>, ecnerwala::fft::assign_op):
✓ Branch 7 → 8 taken 20 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::finish<0, ecnerwala::fft::assign_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::product_t<0>&&, std::span<ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 18446744073709551615ul>, ecnerwala::fft::assign_op):
✓ Branch 7 → 8 taken 20 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::finish<0, ecnerwala::fft::assign_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::product_t<0>&&, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 18446744073709551615ul>, ecnerwala::fft::assign_op):
✓ Branch 7 → 8 taken 21 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<0, ecnerwala::fft::assign_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<0>&&, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 18446744073709551615ul>, ecnerwala::fft::assign_op):
✓ Branch 7 → 8 taken 21 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::finish<2, ecnerwala::fft::assign_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::product_t<2>&&, std::span<ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 18446744073709551615ul>, ecnerwala::fft::assign_op):
✓ Branch 7 → 8 taken 20 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::finish<1, ecnerwala::fft::assign_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::product_t<1>&&, std::span<ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::assign_op):
✓ Branch 7 → 8 taken 20 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::finish<2, ecnerwala::fft::assign_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::product_t<2>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 18446744073709551615ul>, ecnerwala::fft::assign_op):
✓ Branch 7 → 8 taken 21 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<1, ecnerwala::fft::assign_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<1>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::assign_op):
✓ Branch 7 → 8 taken 21 times.
246 emit(out);
157 } else {
158
12/12
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<1, ecnerwala::fft::add_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<1>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::add_op):
✓ Branch 9 → 10 taken 4 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<1, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op> >(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<1>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op>):
✓ Branch 9 → 10 taken 1 time.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<2, ecnerwala::fft::add_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<2>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::add_op):
✓ Branch 9 → 10 taken 39 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<2, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op> >(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<2>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op>):
✓ Branch 9 → 10 taken 14 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::finish<0, ecnerwala::fft::add_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::product_t<0>&&, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 18446744073709551615ul>, ecnerwala::fft::add_op):
✓ Branch 9 → 10 taken 43 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::finish<0, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, ecnerwala::fft::add_op> >(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::product_t<0>&&, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 18446744073709551615ul>, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, ecnerwala::fft::add_op>):
✓ Branch 9 → 10 taken 15 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<0, ecnerwala::fft::add_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<0>&&, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 18446744073709551615ul>, ecnerwala::fft::add_op):
✓ Branch 9 → 10 taken 43 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<0, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, ecnerwala::fft::add_op> >(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<0>&&, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 18446744073709551615ul>, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, ecnerwala::fft::add_op>):
✓ Branch 9 → 10 taken 15 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<1, ecnerwala::fft::add_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<1>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::add_op):
✓ Branch 9 → 10 taken 4 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<1, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op> >(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<1>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op>):
✓ Branch 9 → 10 taken 1 time.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<2, ecnerwala::fft::add_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<2>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::add_op):
✓ Branch 9 → 10 taken 39 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<2, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op> >(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<2>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op>):
✓ Branch 9 → 10 taken 14 times.
232 auto vbuf = buffer_pool<V>::get(sz(out));
159
12/12
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<1, ecnerwala::fft::add_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<1>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::add_op):
✓ Branch 15 → 33 taken 4 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<1, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op> >(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<1>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op>):
✓ Branch 15 → 32 taken 1 time.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<2, ecnerwala::fft::add_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<2>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::add_op):
✓ Branch 15 → 33 taken 39 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<2, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op> >(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<2>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op>):
✓ Branch 15 → 32 taken 14 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::finish<0, ecnerwala::fft::add_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::product_t<0>&&, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 18446744073709551615ul>, ecnerwala::fft::add_op):
✓ Branch 15 → 33 taken 43 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::finish<0, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, ecnerwala::fft::add_op> >(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::product_t<0>&&, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 18446744073709551615ul>, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, ecnerwala::fft::add_op>):
✓ Branch 15 → 32 taken 15 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<0, ecnerwala::fft::add_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<0>&&, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 18446744073709551615ul>, ecnerwala::fft::add_op):
✓ Branch 15 → 33 taken 43 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<0, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, ecnerwala::fft::add_op> >(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<0>&&, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 18446744073709551615ul>, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, ecnerwala::fft::add_op>):
✓ Branch 15 → 32 taken 15 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<1, ecnerwala::fft::add_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<1>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::add_op):
✓ Branch 15 → 33 taken 4 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<1, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op> >(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<1>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op>):
✓ Branch 15 → 32 taken 1 time.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<2, ecnerwala::fft::add_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<2>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::add_op):
✓ Branch 15 → 33 taken 39 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<2, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op> >(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<2>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op>):
✓ Branch 15 → 32 taken 14 times.
232 emit(vbuf.span());
160
24/24
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<1, ecnerwala::fft::add_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<1>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::add_op):
✓ Branch 34 → 16 taken 54 times.
✓ Branch 34 → 35 taken 4 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<1, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op> >(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<1>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op>):
✓ Branch 33 → 16 taken 2 times.
✓ Branch 33 → 34 taken 1 time.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<2, ecnerwala::fft::add_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<2>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::add_op):
✓ Branch 34 → 16 taken 103 times.
✓ Branch 34 → 35 taken 39 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<2, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op> >(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<2>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op>):
✓ Branch 33 → 16 taken 28 times.
✓ Branch 33 → 34 taken 14 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::finish<0, ecnerwala::fft::add_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::product_t<0>&&, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 18446744073709551615ul>, ecnerwala::fft::add_op):
✓ Branch 34 → 16 taken 157 times.
✓ Branch 34 → 35 taken 43 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::finish<0, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, ecnerwala::fft::add_op> >(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::product_t<0>&&, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 18446744073709551615ul>, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, ecnerwala::fft::add_op>):
✓ Branch 33 → 16 taken 30 times.
✓ Branch 33 → 34 taken 15 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<0, ecnerwala::fft::add_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<0>&&, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 18446744073709551615ul>, ecnerwala::fft::add_op):
✓ Branch 34 → 16 taken 157 times.
✓ Branch 34 → 35 taken 43 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<0, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, ecnerwala::fft::add_op> >(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<0>&&, std::span<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 18446744073709551615ul>, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<998244353>, 3>, ecnerwala::fft::add_op>):
✓ Branch 33 → 16 taken 30 times.
✓ Branch 33 → 34 taken 15 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<1, ecnerwala::fft::add_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<1>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::add_op):
✓ Branch 34 → 16 taken 54 times.
✓ Branch 34 → 35 taken 4 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<1, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op> >(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<1>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op>):
✓ Branch 33 → 16 taken 2 times.
✓ Branch 33 → 34 taken 1 time.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<2, ecnerwala::fft::add_op>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<2>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::add_op):
✓ Branch 34 → 16 taken 103 times.
✓ Branch 34 → 35 taken 39 times.
void ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::finish<2, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op> >(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<2>&&, std::span<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 18446744073709551615ul>, ecnerwala::fft::detail::cut_op<ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, ecnerwala::fft::add_op>):
✓ Branch 33 → 16 taken 28 times.
✓ Branch 33 → 34 taken 14 times.
1608 for (int i = 0; i < sz(out); i++) op(out[i], vbuf.span()[i]);
161 232 }
162 956 }
163 };
164
165 // Convolve mat<N> (NxN matrices), with accumulation in product space
166 template <engine E, int N>
167 struct matrix : componentwise<E, mat<typename E::value_type, N>, N * N> {
168 using base = componentwise<E, mat<typename E::value_type, N>, N * N>;
169 static constexpr bool commutative = false;
170 static constexpr int unit_scale = base::unit_scale;
171 template <int A = unit_scale> using transformed_t = typename base::template transformed_t<A>;
172 template <int K> using product_t = typename base::template product_t<K * N>;
173 using transformed = typename base::transformed;
174 using product = product_t<unit_scale * unit_scale>;
175
176 // right fold over k so a tracked inner engine's per-addend types line up
177 template <int A, int B, int k = 0>
178 1038 static auto entry(const transformed_t<A>& a, const transformed_t<B>& b, int r, int c, int n) {
179
4/4
auto ecnerwala::fft::engines::matrix<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, 2>::entry<1, 1, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transformed_t<1> const&, int, int, int):
✓ Branch 13 → 14 taken 84 times.
auto ecnerwala::fft::engines::matrix<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::entry<0, 0, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, int, int, int):
✓ Branch 13 → 14 taken 234 times.
auto ecnerwala::fft::engines::matrix<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::entry<0, 0, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, int, int, int):
✓ Branch 13 → 14 taken 234 times.
auto ecnerwala::fft::engines::matrix<ecnerwala::fft::engines::split<modnum<1000000007> >, 2>::entry<1, 1, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transformed_t<1> const&, int, int, int):
✓ Branch 13 → 14 taken 84 times.
1038 auto e = E::mul(a.t[size_t(r) * N + k], b.t[size_t(k) * N + c], n);
180 402 if constexpr (k + 1 == N) return e;
181
4/4
auto ecnerwala::fft::engines::matrix<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, 2>::entry<1, 1, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transformed_t<1> const&, int, int, int):
✓ Branch 15 → 16 taken 84 times.
auto ecnerwala::fft::engines::matrix<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::entry<0, 0, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, int, int, int):
✓ Branch 15 → 16 taken 234 times.
auto ecnerwala::fft::engines::matrix<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::entry<0, 0, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, int, int, int):
✓ Branch 15 → 16 taken 234 times.
auto ecnerwala::fft::engines::matrix<ecnerwala::fft::engines::split<modnum<1000000007> >, 2>::entry<1, 1, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transformed_t<1> const&, int, int, int):
✓ Branch 15 → 16 taken 84 times.
1740 else return E::add(std::move(e), entry<A, B, k + 1>(a, b, r, c, n));
182 636 }
183 template <int A, int B>
184 68 static product_t<A * B> mul(const transformed_t<A>& a, const transformed_t<B>& b, int n) {
185
6/6
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::product_t<((1)*(1))*(2)> ecnerwala::fft::engines::matrix<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, 2>::mul<1, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transformed_t<1> const&, int):
✓ Branch 17 → 18 taken 42 times.
✓ Branch 17 → 31 taken 21 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::product_t<((0)*(0))*(3)> ecnerwala::fft::engines::matrix<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::mul<0, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, int):
✓ Branch 11 → 12 taken 182 times.
✓ Branch 11 → 46 taken 26 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::product_t<((1)*(1))*(2)> ecnerwala::fft::engines::matrix<ecnerwala::fft::engines::split<modnum<1000000007> >, 2>::mul<1, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transformed_t<1> const&, int):
✓ Branch 17 → 18 taken 42 times.
✓ Branch 17 → 31 taken 21 times.
334 product_t<A * B> p;
186
12/12
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::product_t<((1)*(1))*(2)> ecnerwala::fft::engines::matrix<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, 2>::mul<1, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transformed_t<1> const&, int):
✓ Branch 29 → 19 taken 84 times.
✓ Branch 29 → 30 taken 42 times.
✓ Branch 31 → 29 taken 42 times.
✓ Branch 31 → 32 taken 21 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::product_t<((0)*(0))*(3)> ecnerwala::fft::engines::matrix<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::mul<0, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, int):
✓ Branch 44 → 13 taken 234 times.
✓ Branch 44 → 45 taken 78 times.
✓ Branch 46 → 44 taken 78 times.
✓ Branch 46 → 47 taken 26 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::product_t<((1)*(1))*(2)> ecnerwala::fft::engines::matrix<ecnerwala::fft::engines::split<modnum<1000000007> >, 2>::mul<1, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transformed_t<1> const&, int):
✓ Branch 29 → 19 taken 84 times.
✓ Branch 29 → 30 taken 42 times.
✓ Branch 31 → 29 taken 42 times.
✓ Branch 31 → 32 taken 21 times.
632 for (int r = 0; r < N; r++) for (int c = 0; c < N; c++)
187
3/3
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::product_t<((1)*(1))*(2)> ecnerwala::fft::engines::matrix<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, 2>::mul<1, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transformed_t<1> const&, int):
✓ Branch 20 → 21 taken 84 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::product_t<((0)*(0))*(3)> ecnerwala::fft::engines::matrix<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::mul<0, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, int):
✓ Branch 14 → 15 taken 234 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::product_t<((1)*(1))*(2)> ecnerwala::fft::engines::matrix<ecnerwala::fft::engines::split<modnum<1000000007> >, 2>::mul<1, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 2>, 4, std::array<int, 5ul>{int [5]{0, 1, 2, 3, 4}}>::transformed_t<1> const&, int):
✓ Branch 20 → 21 taken 84 times.
870 p.t[size_t(r) * N + c] = entry<A, B>(a, b, r, c, n);
188 68 return p;
189 }
190 8 template <int A> static auto sq(const transformed_t<A>& a, int n) { return mul(a, a, n); }
191 template <int A1, int B1, int A2, int B2, int k = 0>
192 1431 static auto entry2(
193 const transformed_t<A1>& a1, const transformed_t<B1>& b1,
194 const transformed_t<A2>& a2, const transformed_t<B2>& b2,
195 int r, int c, int n
196 ) {
197
2/2
auto ecnerwala::fft::engines::matrix<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::entry2<0, 0, 0, 0, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, int, int, int):
✓ Branch 23 → 24 taken 477 times.
auto ecnerwala::fft::engines::matrix<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::entry2<0, 0, 0, 0, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, int, int, int):
✓ Branch 23 → 24 taken 477 times.
6678 auto e = E::mul2(
198 2862 a1.t[size_t(r) * N + k], b1.t[size_t(k) * N + c],
199 2862 a2.t[size_t(r) * N + k], b2.t[size_t(k) * N + c],
200 n
201 );
202 477 if constexpr (k + 1 == N) return e;
203
2/2
auto ecnerwala::fft::engines::matrix<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::entry2<0, 0, 0, 0, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, int, int, int):
✓ Branch 25 → 26 taken 477 times.
auto ecnerwala::fft::engines::matrix<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::entry2<0, 0, 0, 0, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}>::transformed_t<0> const&, int, int, int):
✓ Branch 25 → 26 taken 477 times.
2862 else return E::add(std::move(e), entry2<A1, B1, A2, B2, k + 1>(a1, b1, a2, b2, r, c, n));
204 954 }
205 template <int A1, int B1, int A2, int B2>
206 53 static product_t<A1 * B1 + A2 * B2> mul2(
207 const transformed_t<A1>& a1, const transformed_t<B1>& b1,
208 const transformed_t<A2>& a2, const transformed_t<B2>& b2,
209 int n
210 ) {
211
2/2
✓ Branch 11 → 12 taken 371 times.
✓ Branch 11 → 46 taken 53 times.
424 product_t<A1 * B1 + A2 * B2> p;
212
4/4
✓ Branch 44 → 13 taken 477 times.
✓ Branch 44 → 45 taken 159 times.
✓ Branch 46 → 44 taken 159 times.
✓ Branch 46 → 47 taken 53 times.
689 for (int r = 0; r < N; r++) for (int c = 0; c < N; c++)
213
1/1
✓ Branch 14 → 15 taken 477 times.
1431 p.t[size_t(r) * N + c] = entry2<A1, B1, A2, B2>(a1, b1, a2, b2, r, c, n);
214 53 return p;
215 }
216 };
217
218 // Convolve trunc_series<num, N> (power series truncated at N), with accumulation in product space
219 template <engine E, int N>
220 struct trunc : componentwise<E, trunc_series<typename E::value_type, N>, N> {
221 using base = componentwise<E, trunc_series<typename E::value_type, N>, N>;
222 static constexpr bool commutative = E::commutative;
223 static constexpr int unit_scale = base::unit_scale;
224 template <int A = unit_scale> using transformed_t = typename base::template transformed_t<A>;
225 template <int K> using product_t = typename base::template product_t<K * N>;
226 using transformed = typename base::transformed;
227 using product = product_t<unit_scale * unit_scale>;
228
229 template <int A, int B, int s, int i = 0>
230 240 static auto entry(const transformed_t<A>& a, const transformed_t<B>& b, int n) {
231
5/5
auto ecnerwala::fft::engines::trunc<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, 2>::entry<1, 1, 1, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::transformed_t<1> const&, int):
✓ Branch 21 → 22 taken 20 times.
auto ecnerwala::fft::engines::trunc<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::entry<0, 0, 1, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 2, 3}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 2, 3}}>::transformed_t<0> const&, int):
✓ Branch 21 → 22 taken 20 times.
auto ecnerwala::fft::engines::trunc<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::entry<0, 0, 2, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 2, 3}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 2, 3}}>::transformed_t<0> const&, int):
✓ Branch 21 → 22 taken 20 times.
auto ecnerwala::fft::engines::trunc<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::entry<0, 0, 2, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 2, 3}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 2, 3}}>::transformed_t<0> const&, int):
✓ Branch 23 → 24 taken 20 times.
auto ecnerwala::fft::engines::trunc<ecnerwala::fft::engines::split<modnum<1000000007> >, 2>::entry<1, 1, 1, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::transformed_t<1> const&, int):
✓ Branch 21 → 22 taken 20 times.
720 auto e = E::mul(a.t[size_t(i)], b.t[size_t(s - i)], n);
232 140 if constexpr (i == s) return e;
233
5/5
auto ecnerwala::fft::engines::trunc<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, 2>::entry<1, 1, 1, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::transformed_t<1> const&, int):
✓ Branch 23 → 24 taken 20 times.
auto ecnerwala::fft::engines::trunc<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::entry<0, 0, 1, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 2, 3}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 2, 3}}>::transformed_t<0> const&, int):
✓ Branch 23 → 24 taken 20 times.
auto ecnerwala::fft::engines::trunc<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::entry<0, 0, 2, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 2, 3}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 2, 3}}>::transformed_t<0> const&, int):
✓ Branch 23 → 24 taken 20 times.
auto ecnerwala::fft::engines::trunc<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::entry<0, 0, 2, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 2, 3}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 2, 3}}>::transformed_t<0> const&, int):
✓ Branch 25 → 26 taken 20 times.
auto ecnerwala::fft::engines::trunc<ecnerwala::fft::engines::split<modnum<1000000007> >, 2>::entry<1, 1, 1, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::transformed_t<1> const&, int):
✓ Branch 23 → 24 taken 20 times.
260 else return E::add(std::move(e), entry<A, B, s, i + 1>(a, b, n));
234 100 }
235 template <int A, int B>
236 60 static product_t<A * B> mul(const transformed_t<A>& a, const transformed_t<B>& b, int n) {
237
2/2
✓ Branch 11 → 12 taken 20 times.
✓ Branch 11 → 13 taken 20 times.
80 product_t<A * B> p;
238 120 [&]<size_t... s_>(std::index_sequence<s_...>) {
239
5/5
✓ Branch 14 → 15 taken 20 times.
✓ Branch 15 → 16 taken 40 times.
✓ Branch 40 → 41 taken 40 times.
✓ Branch 42 → 43 taken 20 times.
✓ Branch 71 → 72 taken 20 times.
320 ((p.t[s_] = entry<A, B, int(s_)>(a, b, n)), ...);
240
3/3
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::product_t<((1)*(1))*(2)> ecnerwala::fft::engines::trunc<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, 2>::mul<1, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::transformed_t<1> const&, int):
✓ Branch 18 → 19 taken 20 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 2, 3}}>::product_t<((0)*(0))*(3)> ecnerwala::fft::engines::trunc<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::mul<0, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 2, 3}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 2, 3}}>::transformed_t<0> const&, int):
✓ Branch 15 → 16 taken 20 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::product_t<((1)*(1))*(2)> ecnerwala::fft::engines::trunc<ecnerwala::fft::engines::split<modnum<1000000007> >, 2>::mul<1, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 2>, 2, std::array<int, 3ul>{int [3]{0, 1, 2}}>::transformed_t<1> const&, int):
✓ Branch 18 → 19 taken 20 times.
60 }(std::make_index_sequence<size_t(N)>{});
241 60 return p;
242 }
243 template <int A> static auto sq(const transformed_t<A>& a, int n) { return mul(a, a, n); }
244 template <int A1, int B1, int A2, int B2, int s, int i = 0>
245 static auto entry2(
246 const transformed_t<A1>& a1, const transformed_t<B1>& b1,
247 const transformed_t<A2>& a2, const transformed_t<B2>& b2,
248 int n
249 ) {
250 auto e = E::mul2(a1.t[size_t(i)], b1.t[size_t(s - i)], a2.t[size_t(i)], b2.t[size_t(s - i)], n);
251 if constexpr (i == s) return e;
252 else return E::add(std::move(e), entry2<A1, B1, A2, B2, s, i + 1>(a1, b1, a2, b2, n));
253 }
254 template <int A1, int B1, int A2, int B2>
255 static product_t<A1 * B1 + A2 * B2> mul2(
256 const transformed_t<A1>& a1, const transformed_t<B1>& b1,
257 const transformed_t<A2>& a2, const transformed_t<B2>& b2,
258 int n
259 ) {
260 product_t<A1 * B1 + A2 * B2> p;
261 [&]<size_t... s_>(std::index_sequence<s_...>) {
262 ((p.t[s_] = entry2<A1, B1, A2, B2, int(s_)>(a1, b1, a2, b2, n)), ...);
263 }(std::make_index_sequence<size_t(N)>{});
264 return p;
265 }
266 };
267
268 // Stable variants of the wrapper engines: do not accumulate in product space.
269 // This costs an extra log factor.
270
271 template <int N> constexpr std::array<int, size_t(N) * N + 1> matrix_stable_ofs = [] {
272 std::array<int, size_t(N) * N + 1> r{};
273 for (int i = 0; i <= N * N; i++) r[size_t(i)] = i * N;
274 return r;
275 }();
276
277 template <engine E, int N>
278 struct matrix_stable
279 : componentwise<E, mat<typename E::value_type, N>, N * N, matrix_stable_ofs<N>> {
280 using base = componentwise<E, mat<typename E::value_type, N>, N * N, matrix_stable_ofs<N>>;
281 static constexpr bool commutative = false;
282 static constexpr int unit_scale = base::unit_scale;
283 template <int A = unit_scale> using transformed_t = typename base::template transformed_t<A>;
284 template <int K> using product_t = typename base::template product_t<K>;
285 using transformed = typename base::transformed;
286 using product = product_t<unit_scale * unit_scale>;
287
288 template <int A, int B>
289 78 static product_t<A * B> mul(const transformed_t<A>& a, const transformed_t<B>& b, int n) {
290
6/6
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<(1)*(1)> ecnerwala::fft::engines::matrix_stable<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, 3>::mul<1, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, int):
✓ Branch 17 → 18 taken 650 times.
✓ Branch 17 → 43 taken 26 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<(0)*(0)> ecnerwala::fft::engines::matrix_stable<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::mul<0, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<0> const&, int):
✓ Branch 11 → 12 taken 650 times.
✓ Branch 11 → 58 taken 26 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<(1)*(1)> ecnerwala::fft::engines::matrix_stable<ecnerwala::fft::engines::split<modnum<1000000007> >, 3>::mul<1, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, int):
✓ Branch 17 → 18 taken 650 times.
✓ Branch 17 → 43 taken 26 times.
2028 product_t<A * B> p;
291 // entry (r, c)'s k-th addend a(r,k)*b(k,c), grouped per the offsets
292
18/18
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<(1)*(1)> ecnerwala::fft::engines::matrix_stable<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, 3>::mul<1, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, int):
✓ Branch 39 → 19 taken 702 times.
✓ Branch 39 → 40 taken 234 times.
✓ Branch 41 → 39 taken 234 times.
✓ Branch 41 → 42 taken 78 times.
✓ Branch 43 → 41 taken 78 times.
✓ Branch 43 → 44 taken 26 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<(0)*(0)> ecnerwala::fft::engines::matrix_stable<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::mul<0, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<0> const&, int):
✓ Branch 54 → 13 taken 702 times.
✓ Branch 54 → 55 taken 234 times.
✓ Branch 56 → 54 taken 234 times.
✓ Branch 56 → 57 taken 78 times.
✓ Branch 58 → 56 taken 78 times.
✓ Branch 58 → 59 taken 26 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<(1)*(1)> ecnerwala::fft::engines::matrix_stable<ecnerwala::fft::engines::split<modnum<1000000007> >, 3>::mul<1, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, int):
✓ Branch 39 → 19 taken 702 times.
✓ Branch 39 → 40 taken 234 times.
✓ Branch 41 → 39 taken 234 times.
✓ Branch 41 → 42 taken 78 times.
✓ Branch 43 → 41 taken 78 times.
✓ Branch 43 → 44 taken 26 times.
3120 for (int r = 0; r < N; r++) for (int c = 0; c < N; c++) for (int k = 0; k < N; k++)
293
3/3
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<(1)*(1)> ecnerwala::fft::engines::matrix_stable<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, 3>::mul<1, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, int):
✓ Branch 30 → 31 taken 702 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<(0)*(0)> ecnerwala::fft::engines::matrix_stable<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::mul<0, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<0> const&, int):
✓ Branch 24 → 25 taken 702 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<(1)*(1)> ecnerwala::fft::engines::matrix_stable<ecnerwala::fft::engines::split<modnum<1000000007> >, 3>::mul<1, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, int):
✓ Branch 30 → 31 taken 702 times.
3510 p.t[(size_t(r) * N + c) * N + k] = E::mul(a.t[size_t(r) * N + k], b.t[size_t(k) * N + c], n);
294 78 return p;
295 }
296 18 template <int A> static auto sq(const transformed_t<A>& a, int n) { return mul(a, a, n); }
297 template <int A1, int B1, int A2, int B2>
298 159 static product_t<A1 * B1 + A2 * B2> mul2(
299 const transformed_t<A1>& a1, const transformed_t<B1>& b1,
300 const transformed_t<A2>& a2, const transformed_t<B2>& b2,
301 int n
302 ) {
303
6/6
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<((1)*(1))+((1)*(1))> ecnerwala::fft::engines::matrix_stable<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, 3>::mul2<1, 1, 1, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, int):
✓ Branch 17 → 18 taken 1325 times.
✓ Branch 17 → 53 taken 53 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<((0)*(0))+((0)*(0))> ecnerwala::fft::engines::matrix_stable<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::mul2<0, 0, 0, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<0> const&, int):
✓ Branch 11 → 12 taken 1325 times.
✓ Branch 11 → 68 taken 53 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<((1)*(1))+((1)*(1))> ecnerwala::fft::engines::matrix_stable<ecnerwala::fft::engines::split<modnum<1000000007> >, 3>::mul2<1, 1, 1, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, int):
✓ Branch 17 → 18 taken 1325 times.
✓ Branch 17 → 53 taken 53 times.
4134 product_t<A1 * B1 + A2 * B2> p;
304
18/18
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<((1)*(1))+((1)*(1))> ecnerwala::fft::engines::matrix_stable<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, 3>::mul2<1, 1, 1, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, int):
✓ Branch 49 → 19 taken 1431 times.
✓ Branch 49 → 50 taken 477 times.
✓ Branch 51 → 49 taken 477 times.
✓ Branch 51 → 52 taken 159 times.
✓ Branch 53 → 51 taken 159 times.
✓ Branch 53 → 54 taken 53 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<((0)*(0))+((0)*(0))> ecnerwala::fft::engines::matrix_stable<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::mul2<0, 0, 0, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<0> const&, int):
✓ Branch 64 → 13 taken 1431 times.
✓ Branch 64 → 65 taken 477 times.
✓ Branch 66 → 64 taken 477 times.
✓ Branch 66 → 67 taken 159 times.
✓ Branch 68 → 66 taken 159 times.
✓ Branch 68 → 69 taken 53 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<((1)*(1))+((1)*(1))> ecnerwala::fft::engines::matrix_stable<ecnerwala::fft::engines::split<modnum<1000000007> >, 3>::mul2<1, 1, 1, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, int):
✓ Branch 49 → 19 taken 1431 times.
✓ Branch 49 → 50 taken 477 times.
✓ Branch 51 → 49 taken 477 times.
✓ Branch 51 → 52 taken 159 times.
✓ Branch 53 → 51 taken 159 times.
✓ Branch 53 → 54 taken 53 times.
6360 for (int r = 0; r < N; r++) for (int c = 0; c < N; c++) for (int k = 0; k < N; k++)
305
3/3
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<((1)*(1))+((1)*(1))> ecnerwala::fft::engines::matrix_stable<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, 3>::mul2<1, 1, 1, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, int):
✓ Branch 40 → 41 taken 1431 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<((0)*(0))+((0)*(0))> ecnerwala::fft::engines::matrix_stable<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::mul2<0, 0, 0, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::mat<modnum<998244353>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<0> const&, int):
✓ Branch 34 → 35 taken 1431 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::product_t<((1)*(1))+((1)*(1))> ecnerwala::fft::engines::matrix_stable<ecnerwala::fft::engines::split<modnum<1000000007> >, 3>::mul2<1, 1, 1, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::mat<modnum<1000000007>, 3>, 9, std::array<int, 10ul>{int [10]{0, 3, 6, 9, 12, 15, 18, 21, 24, 27}}>::transformed_t<1> const&, int):
✓ Branch 40 → 41 taken 1431 times.
24327 p.t[(size_t(r) * N + c) * N + k] = E::mul2(
306 8586 a1.t[size_t(r) * N + k], b1.t[size_t(k) * N + c],
307 8586 a2.t[size_t(r) * N + k], b2.t[size_t(k) * N + c],
308 n
309 );
310 159 return p;
311 }
312 };
313
314 template <int N> constexpr std::array<int, size_t(N) + 1> trunc_series_stable_ofs = [] {
315 std::array<int, size_t(N) + 1> r{};
316 for (int i = 0; i <= N; i++) r[size_t(i)] = i * (i + 1) / 2;
317 return r;
318 }();
319
320 template <engine E, int N>
321 struct trunc_stable
322 : componentwise<E, trunc_series<typename E::value_type, N>, N, trunc_series_stable_ofs<N>> {
323 using base = componentwise<E, trunc_series<typename E::value_type, N>, N, trunc_series_stable_ofs<N>>;
324 static constexpr bool commutative = E::commutative;
325 static constexpr int unit_scale = base::unit_scale;
326 template <int A = unit_scale> using transformed_t = typename base::template transformed_t<A>;
327 template <int K> using product_t = typename base::template product_t<K>;
328 using transformed = typename base::transformed;
329 using product = product_t<unit_scale * unit_scale>;
330
331 template <int A, int B>
332 60 static product_t<A * B> mul(const transformed_t<A>& a, const transformed_t<B>& b, int n) {
333
6/6
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::product_t<(1)*(1)> ecnerwala::fft::engines::trunc_stable<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, 3>::mul<1, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transformed_t<1> const&, int):
✓ Branch 17 → 18 taken 80 times.
✓ Branch 17 → 45 taken 20 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::product_t<(0)*(0)> ecnerwala::fft::engines::trunc_stable<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::mul<0, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transformed_t<0> const&, int):
✓ Branch 11 → 12 taken 80 times.
✓ Branch 11 → 60 taken 20 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::product_t<(1)*(1)> ecnerwala::fft::engines::trunc_stable<ecnerwala::fft::engines::split<modnum<1000000007> >, 3>::mul<1, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transformed_t<1> const&, int):
✓ Branch 17 → 18 taken 80 times.
✓ Branch 17 → 45 taken 20 times.
300 product_t<A * B> p;
334
12/12
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::product_t<(1)*(1)> ecnerwala::fft::engines::trunc_stable<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, 3>::mul<1, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transformed_t<1> const&, int):
✓ Branch 43 → 19 taken 120 times.
✓ Branch 43 → 44 taken 60 times.
✓ Branch 45 → 43 taken 60 times.
✓ Branch 45 → 46 taken 20 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::product_t<(0)*(0)> ecnerwala::fft::engines::trunc_stable<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::mul<0, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transformed_t<0> const&, int):
✓ Branch 58 → 13 taken 120 times.
✓ Branch 58 → 59 taken 60 times.
✓ Branch 60 → 58 taken 60 times.
✓ Branch 60 → 61 taken 20 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::product_t<(1)*(1)> ecnerwala::fft::engines::trunc_stable<ecnerwala::fft::engines::split<modnum<1000000007> >, 3>::mul<1, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transformed_t<1> const&, int):
✓ Branch 43 → 19 taken 120 times.
✓ Branch 43 → 44 taken 60 times.
✓ Branch 45 → 43 taken 60 times.
✓ Branch 45 → 46 taken 20 times.
600 for (int s = 0; s < N; s++) for (int i = 0; i <= s; i++)
335
3/3
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::product_t<(1)*(1)> ecnerwala::fft::engines::trunc_stable<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, 3>::mul<1, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::crt<modnum<1000000007>, mod_goldilocks, modnum<2013265921> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transformed_t<1> const&, int):
✓ Branch 30 → 31 taken 120 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::product_t<(0)*(0)> ecnerwala::fft::engines::trunc_stable<ecnerwala::fft::engines::ntt<modnum<998244353> >, 3>::mul<0, 0>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transformed_t<0> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::ntt<modnum<998244353> >, ecnerwala::fft::engines::trunc_series<modnum<998244353>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transformed_t<0> const&, int):
✓ Branch 24 → 25 taken 120 times.
ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::product_t<(1)*(1)> ecnerwala::fft::engines::trunc_stable<ecnerwala::fft::engines::split<modnum<1000000007> >, 3>::mul<1, 1>(ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transformed_t<1> const&, ecnerwala::fft::engines::componentwise<ecnerwala::fft::engines::split<modnum<1000000007> >, ecnerwala::fft::engines::trunc_series<modnum<1000000007>, 3>, 3, std::array<int, 4ul>{int [4]{0, 1, 3, 6}}>::transformed_t<1> const&, int):
✓ Branch 30 → 31 taken 120 times.
600 p.t[size_t(trunc_series_stable_ofs<N>[size_t(s)] + i)] = E::mul(a.t[size_t(i)], b.t[size_t(s - i)], n);
336 60 return p;
337 }
338 template <int A> static auto sq(const transformed_t<A>& a, int n) { return mul(a, a, n); }
339 template <int A1, int B1, int A2, int B2>
340 static product_t<A1 * B1 + A2 * B2> mul2(
341 const transformed_t<A1>& a1, const transformed_t<B1>& b1,
342 const transformed_t<A2>& a2, const transformed_t<B2>& b2,
343 int n
344 ) {
345 product_t<A1 * B1 + A2 * B2> p;
346 for (int s = 0; s < N; s++) for (int i = 0; i <= s; i++)
347 p.t[size_t(trunc_series_stable_ofs<N>[size_t(s)] + i)] = E::mul2(
348 a1.t[size_t(i)], b1.t[size_t(s - i)],
349 a2.t[size_t(i)], b2.t[size_t(s - i)],
350 n
351 );
352 return p;
353 }
354 };
355
356 /* namespace ecnerwala::fft::engines */ }
357