21 const AllEntities& in,
22 const Parameters& params,
23 const FF& scaling_factor)
25 constexpr size_t NUM_LOOKUP_TERMS = Base::NUM_LOOKUP_TERMS;
26 constexpr size_t NUM_TABLE_TERMS = Base::NUM_TABLE_TERMS;
27 constexpr size_t NUM_TOTAL_TERMS = NUM_LOOKUP_TERMS + NUM_TABLE_TERMS;
31 using ShortTerm =
std::
34 const auto lookup_inverses_short = ShortView(Base::get_inverse_polynomial(in));
35 const auto lookup_inverses = Accumulator(lookup_inverses_short);
41 bb::constexpr_for<0, NUM_LOOKUP_TERMS, 1>([&]<
size_t i>() {
42 lookup_terms_short[i] =
44 lookup_terms[i] = Accumulator(lookup_terms_short[i]);
46 bb::constexpr_for<0, NUM_TABLE_TERMS, 1>([&]<
size_t i>() {
47 lookup_terms_short[i + NUM_LOOKUP_TERMS] =
49 lookup_terms[i + NUM_LOOKUP_TERMS] = Accumulator(lookup_terms_short[i + NUM_LOOKUP_TERMS]);
52 static_assert(NUM_TOTAL_TERMS == 6);
53 denominator_accumulator[0] = lookup_terms[0];
54 denominator_accumulator[1] = Accumulator(lookup_terms_short[0] * lookup_terms_short[1]);
55 denominator_accumulator[2] = denominator_accumulator[1] * lookup_terms[2];
56 denominator_accumulator[3] =
57 denominator_accumulator[1] * Accumulator(lookup_terms_short[2] * lookup_terms_short[3]);
58 denominator_accumulator[4] = denominator_accumulator[3] * lookup_terms[4];
59 denominator_accumulator[5] =
60 denominator_accumulator[3] * Accumulator(lookup_terms_short[4] * lookup_terms_short[5]);
62 auto inverse_accumulator = lookup_inverses;
63 const auto inverse_exists_short =
67 denominator_accumulator[NUM_TOTAL_TERMS - 1] * Accumulator(lookup_inverses_short * scaling_factor) -
68 Accumulator(inverse_exists_short * scaling_factor);
70 for (
size_t i = NUM_TOTAL_TERMS - 1; i > 0; --i) {
71 denominator_accumulator[i] = denominator_accumulator[i - 1] * inverse_accumulator;
72 inverse_accumulator = inverse_accumulator * lookup_terms[i];
74 denominator_accumulator[0] = inverse_accumulator;
76 bb::constexpr_for<0, NUM_LOOKUP_TERMS, 1>([&]<
size_t i>() {
77 const auto lookup_predicate =
79 std::get<1>(accumulator) += Accumulator(lookup_predicate) * denominator_accumulator[i];
82 bb::constexpr_for<0, NUM_TABLE_TERMS, 1>([&]<
size_t i>() {
83 const auto table_predicate =
86 auto to_subtract = Accumulator(table_predicate * read_count) * denominator_accumulator[i + NUM_LOOKUP_TERMS];