67 static void accumulate(ContainerOverSubrelations& accumulators,
70 const FF& scaling_factor)
76 using CoefficientAccumulator =
typename Accumulator::CoefficientAccumulator;
100 auto limb_subproduct = w_1_m * w_2_shift_m + w_1_shift_m * w_2_m;
101 auto non_native_field_gate_2_m = (w_1_m * w_4_m + w_2_m * w_3_m - w_3_shift_m);
102 non_native_field_gate_2_m *= LIMB_SIZE;
103 non_native_field_gate_2_m -= w_4_shift_m;
104 non_native_field_gate_2_m += limb_subproduct;
110 limb_subproduct *= LIMB_SIZE;
111 limb_subproduct += (w_1_shift_m * w_2_shift_m);
112 auto non_native_field_gate_1_m = limb_subproduct;
113 non_native_field_gate_1_m -= (w_3_m + w_4_m);
120 auto non_native_field_gate_3_m = limb_subproduct;
121 non_native_field_gate_3_m += w_4_m;
122 non_native_field_gate_3_m -= (w_3_shift_m + w_4_shift_m);
125 auto non_native_field_identity = non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3;
132 auto limb_accumulator_1_m = w_2_shift_m * SUBLIMB_SHIFT;
133 limb_accumulator_1_m += w_1_shift_m;
134 limb_accumulator_1_m *= SUBLIMB_SHIFT;
135 limb_accumulator_1_m += w_3_m;
136 limb_accumulator_1_m *= SUBLIMB_SHIFT;
137 limb_accumulator_1_m += w_2_m;
138 limb_accumulator_1_m *= SUBLIMB_SHIFT;
139 limb_accumulator_1_m += w_1_m;
140 limb_accumulator_1_m -= w_4_m;
141 auto limb_accumulator_1_m_full = limb_accumulator_1_m * q_4_m;
147 auto limb_accumulator_2_m = w_3_shift_m * SUBLIMB_SHIFT;
148 limb_accumulator_2_m += w_2_shift_m;
149 limb_accumulator_2_m *= SUBLIMB_SHIFT;
150 limb_accumulator_2_m += w_1_shift_m;
151 limb_accumulator_2_m *= SUBLIMB_SHIFT;
152 limb_accumulator_2_m += w_4_m;
153 limb_accumulator_2_m *= SUBLIMB_SHIFT;
154 limb_accumulator_2_m += w_3_m;
155 limb_accumulator_2_m -= w_4_shift_m;
156 auto limb_accumulator_2_m_full = limb_accumulator_2_m * q_m_m;
158 auto limb_accumulator_identity_m = limb_accumulator_1_m_full + limb_accumulator_2_m_full;
159 Accumulator limb_accumulator_identity(limb_accumulator_identity_m);
160 limb_accumulator_identity *= q_3_m;
162 auto q_nnf_by_scaling_m = q_nnf_m * scaling_factor;
163 auto q_nnf_by_scaling =
Accumulator(q_nnf_by_scaling_m);
165 auto nnf_identity = non_native_field_identity + limb_accumulator_identity;
166 nnf_identity *= q_nnf_by_scaling;