barretenberg
Loading...
Searching...
No Matches
biggroup_batch_mul.hpp
1#pragma once
2
3namespace proof_system::plonk {
4namespace stdlib {
5
11template <typename C, class Fq, class Fr, class G>
12template <size_t max_num_bits>
14 const std::vector<Fr>& scalars)
15{
16 constexpr size_t WNAF_SIZE = 4;
17 ASSERT(points.size() == scalars.size());
18 if constexpr (!HasPlookup<C>) {
19 return batch_mul(points, scalars, max_num_bits);
20 }
21
22 std::vector<four_bit_table_plookup<>> point_tables;
23 for (const auto& point : points) {
24 point_tables.emplace_back(four_bit_table_plookup<>(point));
25 }
26
27 std::vector<std::vector<field_t<C>>> wnaf_entries;
28 for (const auto& scalar : scalars) {
29 wnaf_entries.emplace_back(compute_wnaf<max_num_bits>(scalar));
30 }
31
32 constexpr size_t num_bits = (max_num_bits == 0) ? (Fr::modulus.get_msb() + 1) : (max_num_bits);
33 constexpr size_t num_rounds = ((num_bits + WNAF_SIZE - 1) / WNAF_SIZE);
34 const auto offset_generators = compute_offset_generators(num_rounds * 4 - 3);
35
36 element accumulator = offset_generators.first + point_tables[0][wnaf_entries[0][0]];
37 for (size_t i = 1; i < points.size(); ++i) {
38 accumulator += point_tables[i][wnaf_entries[i][0]];
39 }
40
41 for (size_t i = 1; i < num_rounds; ++i) {
42 accumulator = accumulator.dbl();
43 accumulator = accumulator.dbl();
44 std::vector<element> to_add;
45 for (size_t j = 0; j < points.size(); ++j) {
46 to_add.emplace_back(point_tables[j][wnaf_entries[j][i]]);
47 }
48 accumulator = accumulator.quadruple_and_add(to_add);
49 }
50
51 for (size_t i = 0; i < points.size(); ++i) {
52 element skew = accumulator - points[i];
53 Fq out_x = accumulator.x.conditional_select(skew.x, bool_t<C>(wnaf_entries[i][num_rounds]));
54 Fq out_y = accumulator.y.conditional_select(skew.y, bool_t<C>(wnaf_entries[i][num_rounds]));
55 accumulator = element(out_x, out_y);
56 }
57 accumulator -= offset_generators.second;
58 return accumulator;
59}
60} // namespace stdlib
61} // namespace proof_system::plonk
Definition: biggroup.hpp:22
element quadruple_and_add(const std::vector< element > &to_add) const
Compute 4.P + to_add[0] + ... + to_add[to_add.size() - 1].
Definition: biggroup_impl.hpp:363
Contains all the headers required to adequately compile the types defined in circuit_builders_fwd....
Definition: circuit_builders.hpp:11
Definition: widget.bench.cpp:13