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