GCC Code Coverage Report


Directory: src/
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 87.4% 492 / 0 / 563
Functions: 100.0% 111 / 0 / 111
Branches: 100.0% 349 / 0 / 349

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