48 std::vector<Fr> scalars;
53 "biggroup mask_points: masking_scalar must ≤ 128 bits");
56 const typename G::affine_element native_offset_generator = element::compute_table_offset_generator();
57 C*
builder = validate_context<C>(validate_context<C>(_points), validate_context<C>(_scalars));
58 const element offset_generator_element = element::from_witness(
builder, native_offset_generator);
67 Fr running_scalar =
Fr(1);
68 Fr last_scalar =
Fr(0);
71 for (
size_t i = 0; i < _points.size(); i++) {
72 scalars.push_back(_scalars[i]);
75 points.push_back(_points[i].add_internal(running_point));
78 last_scalar += _scalars[i] * running_scalar;
81 running_scalar += running_scalar;
86 const uint32_t n =
static_cast<uint32_t
>(_points.size());
87 const Fr two_power_n =
Fr(2).
pow(n);
88 const Fr two_power_n_inverse = two_power_n.
invert();
89 last_scalar *= two_power_n_inverse;
90 scalars.push_back(-last_scalar);
91 if constexpr (Fr::is_composite) {
92 scalars.back().self_reduce();
95 points.push_back(running_point);
97 return { points, scalars };
108 C*
builder = validate_context<C>(validate_context<C>(_points), validate_context<C>(_scalars));
110 std::vector<Fr> scalars;
113 for (
auto [_point, _scalar] :
zip_view(_points, _scalars)) {
114 bool_ct is_point_at_infinity = _point.is_point_at_infinity();
115 if (is_point_at_infinity.
get_value() &&
static_cast<bool>(is_point_at_infinity.
is_constant())) {
119 if (_scalar.get_value() == 0 && _scalar.is_constant()) {
128 if constexpr (!Fr::is_composite) {
130 scalar = Fr::conditional_assign_internal(is_point_at_infinity, 0, _scalar);
133 scalar = Fr::conditional_assign(is_point_at_infinity, 0, _scalar);
137 points.push_back(point);
138 scalars.push_back(scalar);
141 return { points, scalars };