80 inline static void accumulate(ContainerOverSubrelations& accumulators,
81 const AllEntities& in,
83 const FF& scaling_factor)
86 using CoefficientAccumulator =
typename Accumulator::CoefficientAccumulator;
87 auto x_3_m = CoefficientAccumulator(in.w_r_shift);
88 auto y_1_m = CoefficientAccumulator(in.w_o);
89 auto y_2_m = CoefficientAccumulator(in.w_4_shift);
91 auto x_1_m = CoefficientAccumulator(in.w_r);
92 auto x_2_m = CoefficientAccumulator(in.w_l_shift);
93 auto y_3_m = CoefficientAccumulator(in.w_o_shift);
94 auto q_elliptic_m = CoefficientAccumulator(in.q_elliptic);
95 auto q_is_double_m = CoefficientAccumulator(in.q_m);
96 auto q_sign_m = CoefficientAccumulator(in.q_l);
99 auto x2_sub_x1_m = (x_2_m - x_1_m);
100 auto x1_mul_3_m = (x_1_m + x_1_m + x_1_m);
101 auto x3_sub_x1_m = x_3_m - x_1_m;
102 auto x3_plus_two_x1_m = x3_sub_x1_m + x1_mul_3_m;
103 auto x3_plus_x2_plus_x1_m = x3_plus_two_x1_m + x2_sub_x1_m;
104 Accumulator x3_plus_x2_plus_x1(x3_plus_x2_plus_x1_m);
105 Accumulator x3_sub_x1(x3_sub_x1_m);
106 Accumulator x1_mul_3(x1_mul_3_m);
107 Accumulator x3_plus_two_x1(x3_plus_two_x1_m);
111 auto y2_sqr_m = y_2_m.sqr();
112 auto y1_sqr_m = y_1_m.sqr();
113 auto y2_mul_q_sign_m = y_2_m * q_sign_m;
114 auto x_add_identity = x3_plus_x2_plus_x1 * Accumulator(x2_sub_x1_m.sqr()) - Accumulator(y2_sqr_m + y1_sqr_m) +
115 Accumulator(y2_mul_q_sign_m + y2_mul_q_sign_m) * Accumulator(y_1_m);
117 auto q_elliptic_by_scaling_m = q_elliptic_m * scaling_factor;
118 auto q_elliptic_q_double_scaling_m = (q_elliptic_by_scaling_m * q_is_double_m);
119 Accumulator q_elliptic_q_double_scaling(q_elliptic_q_double_scaling_m);
121 auto neg_q_elliptic_not_double_scaling = Accumulator(q_elliptic_q_double_scaling_m - q_elliptic_by_scaling_m);
122 std::get<0>(accumulators) -= x_add_identity * neg_q_elliptic_not_double_scaling;
126 auto y1_plus_y3_m = y_1_m + y_3_m;
127 auto y_diff_m = y2_mul_q_sign_m - y_1_m;
128 auto y_diff = Accumulator(y_diff_m);
129 auto y_add_identity = Accumulator(y1_plus_y3_m * x2_sub_x1_m) + (x3_sub_x1)*y_diff;
130 std::get<1>(accumulators) -= y_add_identity * neg_q_elliptic_not_double_scaling;
136 auto x_pow_4_mul_3 = (Accumulator(y1_sqr_m - curve_b)) * x1_mul_3;
137 auto y1_sqr_mul_4_m = y1_sqr_m + y1_sqr_m;
138 y1_sqr_mul_4_m += y1_sqr_mul_4_m;
139 auto x1_pow_4_mul_9 = x_pow_4_mul_3 + x_pow_4_mul_3 + x_pow_4_mul_3;
140 auto x_double_identity = x3_plus_two_x1 * Accumulator(y1_sqr_mul_4_m) - x1_pow_4_mul_9;
141 std::get<0>(accumulators) += x_double_identity * q_elliptic_q_double_scaling;
145 auto x1_sqr_mul_3 = Accumulator(x1_mul_3_m * x_1_m);
146 auto neg_y_double_identity = x1_sqr_mul_3 * (x3_sub_x1) + Accumulator((y_1_m + y_1_m) * (y1_plus_y3_m));
147 std::get<1>(accumulators) -= neg_y_double_identity * q_elliptic_q_double_scaling;