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/6ecnerwala::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/6ecnerwala::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/18ecnerwala::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/6ecnerwala::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/6ecnerwala::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/12ecnerwala::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/20ecnerwala::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/12ecnerwala::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/24ecnerwala::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/24ecnerwala::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/12ecnerwala::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/8ecnerwala::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/4ecnerwala::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/8ecnerwala::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/8ecnerwala::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/4ecnerwala::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/24void 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/12void 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/12void 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/12void 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/24void 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/4auto 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/4auto 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/6ecnerwala::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/12ecnerwala::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/3ecnerwala::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/2auto 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/2auto 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/5auto 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/5auto 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/3ecnerwala::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/6ecnerwala::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/18ecnerwala::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/3ecnerwala::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/6ecnerwala::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/18ecnerwala::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/3ecnerwala::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/6ecnerwala::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/12ecnerwala::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/3ecnerwala::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 |