49 inline static void accumulate(ContainerOverSubrelations& accumulators,
50 const AllEntities& in,
51 [[maybe_unused]]
const Parameters& params,
52 const FF& scaling_factor)
58 using CoefficientAccumulator =
typename Accumulator::CoefficientAccumulator;
60 auto w_1_m = CoefficientAccumulator(in.w_l);
61 auto w_2_m = CoefficientAccumulator(in.w_r);
62 auto w_3_m = CoefficientAccumulator(in.w_o);
63 auto w_4_m = CoefficientAccumulator(in.w_4);
64 auto w_1_shift_m = CoefficientAccumulator(in.w_l_shift);
65 auto w_2_shift_m = CoefficientAccumulator(in.w_r_shift);
66 auto w_3_shift_m = CoefficientAccumulator(in.w_o_shift);
67 auto w_4_shift_m = CoefficientAccumulator(in.w_4_shift);
69 auto q_2_m = CoefficientAccumulator(in.q_r);
70 auto q_3_m = CoefficientAccumulator(in.q_o);
71 auto q_4_m = CoefficientAccumulator(in.q_4);
72 auto q_m_m = CoefficientAccumulator(in.q_m);
74 auto q_nnf_m = CoefficientAccumulator(in.q_nnf);
88 auto limb_subproduct = w_1_m * w_2_shift_m + w_1_shift_m * w_2_m;
89 auto non_native_field_gate_2_m = (w_1_m * w_4_m + w_2_m * w_3_m - w_3_shift_m);
90 non_native_field_gate_2_m *= LIMB_SIZE;
91 non_native_field_gate_2_m -= w_4_shift_m;
92 non_native_field_gate_2_m += limb_subproduct;
93 auto non_native_field_gate_2 = Accumulator(non_native_field_gate_2_m) * Accumulator(q_4_m);
95 limb_subproduct *= LIMB_SIZE;
96 limb_subproduct += (w_1_shift_m * w_2_shift_m);
97 auto non_native_field_gate_1_m = limb_subproduct;
98 non_native_field_gate_1_m -= (w_3_m + w_4_m);
102 auto non_native_field_gate_1 = Accumulator(non_native_field_gate_1_m) * Accumulator(q_3_m);
104 auto non_native_field_gate_3_m = limb_subproduct;
105 non_native_field_gate_3_m += w_4_m;
106 non_native_field_gate_3_m -= (w_3_shift_m + w_4_shift_m);
107 auto non_native_field_gate_3 = Accumulator(non_native_field_gate_3_m) * Accumulator(q_m_m);
109 auto non_native_field_identity = non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3;
110 non_native_field_identity *= Accumulator(q_2_m);
114 auto limb_accumulator_1_m = w_2_shift_m * SUBLIMB_SHIFT;
115 limb_accumulator_1_m += w_1_shift_m;
116 limb_accumulator_1_m *= SUBLIMB_SHIFT;
117 limb_accumulator_1_m += w_3_m;
118 limb_accumulator_1_m *= SUBLIMB_SHIFT;
119 limb_accumulator_1_m += w_2_m;
120 limb_accumulator_1_m *= SUBLIMB_SHIFT;
121 limb_accumulator_1_m += w_1_m;
122 limb_accumulator_1_m -= w_4_m;
123 auto limb_accumulator_1_m_full = limb_accumulator_1_m * q_4_m;
127 auto limb_accumulator_2_m = w_3_shift_m * SUBLIMB_SHIFT;
128 limb_accumulator_2_m += w_2_shift_m;
129 limb_accumulator_2_m *= SUBLIMB_SHIFT;
130 limb_accumulator_2_m += w_1_shift_m;
131 limb_accumulator_2_m *= SUBLIMB_SHIFT;
132 limb_accumulator_2_m += w_4_m;
133 limb_accumulator_2_m *= SUBLIMB_SHIFT;
134 limb_accumulator_2_m += w_3_m;
135 limb_accumulator_2_m -= w_4_shift_m;
136 auto limb_accumulator_2_m_full = limb_accumulator_2_m * q_m_m;
138 auto limb_accumulator_identity_m = limb_accumulator_1_m_full + limb_accumulator_2_m_full;
139 Accumulator limb_accumulator_identity(limb_accumulator_identity_m);
140 limb_accumulator_identity *= q_3_m;
142 auto q_nnf_by_scaling_m = q_nnf_m * scaling_factor;
143 auto q_nnf_by_scaling = Accumulator(q_nnf_by_scaling_m);
145 auto nnf_identity = non_native_field_identity + limb_accumulator_identity;
146 nnf_identity *= q_nnf_by_scaling;