64 static void accumulate(ContainerOverSubrelations& accumulators,
65 const AllEntities& in,
67 const FF& scaling_factor)
73 using CoefficientAccumulator =
typename Accumulator::CoefficientAccumulator;
75 auto w_1_m = CoefficientAccumulator(in.w_l);
76 auto w_2_m = CoefficientAccumulator(in.w_r);
77 auto w_3_m = CoefficientAccumulator(in.w_o);
78 auto w_4_m = CoefficientAccumulator(in.w_4);
79 auto w_1_shift_m = CoefficientAccumulator(in.w_l_shift);
80 auto w_2_shift_m = CoefficientAccumulator(in.w_r_shift);
81 auto w_3_shift_m = CoefficientAccumulator(in.w_o_shift);
82 auto w_4_shift_m = CoefficientAccumulator(in.w_4_shift);
84 auto q_2_m = CoefficientAccumulator(in.q_r);
85 auto q_3_m = CoefficientAccumulator(in.q_o);
86 auto q_4_m = CoefficientAccumulator(in.q_4);
87 auto q_m_m = CoefficientAccumulator(in.q_m);
89 auto q_nnf_m = CoefficientAccumulator(in.q_nnf);
97 auto limb_subproduct = w_1_m * w_2_shift_m + w_1_shift_m * w_2_m;
98 auto non_native_field_gate_2_m = (w_1_m * w_4_m + w_2_m * w_3_m - w_3_shift_m);
99 non_native_field_gate_2_m *= LIMB_SIZE;
100 non_native_field_gate_2_m -= w_4_shift_m;
101 non_native_field_gate_2_m += limb_subproduct;
102 auto non_native_field_gate_2 = Accumulator(non_native_field_gate_2_m) * Accumulator(q_4_m);
107 limb_subproduct *= LIMB_SIZE;
108 limb_subproduct += (w_1_shift_m * w_2_shift_m);
109 auto non_native_field_gate_1_m = limb_subproduct;
110 non_native_field_gate_1_m -= (w_3_m + w_4_m);
112 auto non_native_field_gate_1 = Accumulator(non_native_field_gate_1_m) * Accumulator(q_3_m);
117 auto non_native_field_gate_3_m = limb_subproduct;
118 non_native_field_gate_3_m += w_4_m;
119 non_native_field_gate_3_m -= (w_3_shift_m + w_4_shift_m);
120 auto non_native_field_gate_3 = Accumulator(non_native_field_gate_3_m) * Accumulator(q_m_m);
122 auto non_native_field_identity = non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3;
123 non_native_field_identity *= Accumulator(q_2_m);
129 auto limb_accumulator_1_m = w_2_shift_m * SUBLIMB_SHIFT;
130 limb_accumulator_1_m += w_1_shift_m;
131 limb_accumulator_1_m *= SUBLIMB_SHIFT;
132 limb_accumulator_1_m += w_3_m;
133 limb_accumulator_1_m *= SUBLIMB_SHIFT;
134 limb_accumulator_1_m += w_2_m;
135 limb_accumulator_1_m *= SUBLIMB_SHIFT;
136 limb_accumulator_1_m += w_1_m;
137 limb_accumulator_1_m -= w_4_m;
138 auto limb_accumulator_1_m_full = limb_accumulator_1_m * q_4_m;
144 auto limb_accumulator_2_m = w_3_shift_m * SUBLIMB_SHIFT;
145 limb_accumulator_2_m += w_2_shift_m;
146 limb_accumulator_2_m *= SUBLIMB_SHIFT;
147 limb_accumulator_2_m += w_1_shift_m;
148 limb_accumulator_2_m *= SUBLIMB_SHIFT;
149 limb_accumulator_2_m += w_4_m;
150 limb_accumulator_2_m *= SUBLIMB_SHIFT;
151 limb_accumulator_2_m += w_3_m;
152 limb_accumulator_2_m -= w_4_shift_m;
153 auto limb_accumulator_2_m_full = limb_accumulator_2_m * q_m_m;
155 auto limb_accumulator_identity_m = limb_accumulator_1_m_full + limb_accumulator_2_m_full;
156 Accumulator limb_accumulator_identity(limb_accumulator_identity_m);
157 limb_accumulator_identity *= q_3_m;
159 auto q_nnf_by_scaling_m = q_nnf_m * scaling_factor;
160 auto q_nnf_by_scaling = Accumulator(q_nnf_by_scaling_m);
162 auto nnf_identity = non_native_field_identity + limb_accumulator_identity;
163 nnf_identity *= q_nnf_by_scaling;