89 const AllEntities& in,
91 const FF& scaling_factor)
94 using CoeffAcc =
typename Accumulator::CoefficientAccumulator;
98 const auto w_l = CoeffAcc(in.w_l);
99 const auto w_r = CoeffAcc(in.w_r);
100 const auto w_o = CoeffAcc(in.w_o);
101 const auto w_4 = CoeffAcc(in.w_4);
104 const auto w_l_shift = CoeffAcc(in.w_l_shift);
105 const auto w_r_shift = CoeffAcc(in.w_r_shift);
106 const auto w_o_shift = CoeffAcc(in.w_o_shift);
107 const auto w_4_shift = CoeffAcc(in.w_4_shift);
110 const auto q_l = CoeffAcc(in.q_l);
111 const auto q_r = CoeffAcc(in.q_r);
112 const auto q_o = CoeffAcc(in.q_o);
113 const auto q_4 = CoeffAcc(in.q_4);
117 const auto q_m = CoeffAcc(in.q_m);
118 const auto q_c = CoeffAcc(in.q_c);
119 const auto q_5 = CoeffAcc(in.q_5);
121 const auto q_sel = CoeffAcc(in.q_poseidon2_quad_internal);
124 auto pow5 = [](
const Accumulator& x) -> Accumulator {
126 auto quart = sq.sqr();
132 auto u_0 = pow5(Accumulator(w_l + q_l));
133 auto u_1 = pow5(Accumulator(w_r + q_r));
134 auto u_2 = pow5(Accumulator(w_o + q_o));
135 auto u_3 = pow5(Accumulator(w_4 + q_4));
141 auto u_0_next = pow5(Accumulator(w_l_shift + q_m));
142 auto u_1_next = pow5(Accumulator(w_r_shift + q_c));
143 auto u_2_next = pow5(Accumulator(w_o_shift + q_5));
144 auto u_0_next_D1 = u_0_next *
D1;
163 auto wp0_full = w_r * cf0[0] + w_o * cf0[1] + w_4 * cf0[2] - w_l_shift;
164 auto wp1_full = w_r * l0[0] + w_o * l0[1] + w_4 * l0[2] - w_r_shift;
165 auto wp2_full = w_r * l1[0] + w_o * l1[1] + w_4 * l1[2] - w_o_shift + w_r_shift + w_r_shift;
166 auto wp3_full = w_r * l2[0] + w_o * l2[1] + w_4 * l2[2] - w_4_shift + w_o_shift + w_r_shift *
SIGMA_PLUS_2;
168 const auto q_times_scaling_m = q_sel * scaling_factor;
169 const auto q_times_scaling = Accumulator(q_times_scaling_m);
172 auto a0_body = u_0 * cf0[3] + u_1 * cf0[4] + u_2 * cf0[5] + u_3 * cf0[6] + Accumulator(wp0_full);
176 auto a1_body = u_0 * l0[3] + u_1 * l0[4] + u_2 * l0[5] + u_3 * l0[6] + u_0_next_D1 + Accumulator(wp1_full);
180 auto a2_body = u_0 * l1[3] + u_1 * l1[4] + u_2 * l1[5] + u_3 * l1[6] - (u_0_next_D1 + u_0_next_D1) +
181 (u_0_next + u_0_next + u_0_next) + u_1_next *
D1 + Accumulator(wp2_full);
185 auto a3_body = u_0 * l2[3] + u_1 * l2[4] + u_2 * l2[5] + u_3 * l2[6] - u_0_next *
B3_U0_COEF -
186 u_1_next *
D1_MINUS_3 + u_2_next *
D1 + Accumulator(wp3_full);