19 fr left_fr(left_value);
20 fr right_fr(right_value);
22 uint32_t left_idx = circuit_builder.add_variable(left_fr);
23 uint32_t right_idx = circuit_builder.add_variable(right_fr);
25 const auto lookup_accumulators =
28 EXPECT_EQ(lookup_accumulators[plookup::ColumnIdx::C3][0], left_value ^ right_value);
30 circuit_builder.create_gates_from_plookup_accumulators(
31 plookup::MultiTableId::UINT32_XOR, lookup_accumulators, left_idx, right_idx);
32 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
34 TestFixture::prove_and_verify(circuit_builder,
true);
47 fr left_fr(left_value);
48 fr right_fr(right_value);
50 uint32_t left_idx = circuit_builder.add_variable(left_fr);
51 uint32_t right_idx = circuit_builder.add_variable(right_fr);
53 const auto lookup_accumulators =
56 EXPECT_EQ(lookup_accumulators[plookup::ColumnIdx::C3][0], left_value & right_value);
58 circuit_builder.create_gates_from_plookup_accumulators(
59 plookup::MultiTableId::UINT32_AND, lookup_accumulators, left_idx, right_idx);
60 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
62 TestFixture::prove_and_verify(circuit_builder,
true);
73 const fr input_lo =
static_cast<uint256_t>(input_value).
slice(0, plookup::fixed_base::table::BITS_PER_LO_SCALAR);
74 const auto input_lo_index = circuit_builder.add_variable(input_lo);
78 const auto lookup_witnesses = circuit_builder.create_gates_from_plookup_accumulators(
79 plookup::MultiTableId::FIXED_BASE_LEFT_LO, sequence_data_lo, input_lo_index);
81 const size_t num_lookups = plookup::fixed_base::table::NUM_TABLES_PER_LO_MULTITABLE;
83 EXPECT_EQ(num_lookups, lookup_witnesses[plookup::ColumnIdx::C1].size());
86 const auto mask = plookup::fixed_base::table::MAX_TABLE_SIZE - 1;
89 std::vector<uint8_t> input_buf;
90 write(input_buf, base_point);
91 const auto offset_generators =
96 const auto table_bits = plookup::fixed_base::table::BITS_PER_TABLE;
97 const auto num_tables = plookup::fixed_base::table::NUM_TABLES_PER_LO_MULTITABLE;
98 for (
size_t i = 0; i < num_tables; ++i) {
100 auto round_scalar = circuit_builder.get_variable(lookup_witnesses[plookup::ColumnIdx::C1][i]);
101 auto round_x = circuit_builder.get_variable(lookup_witnesses[plookup::ColumnIdx::C2][i]);
102 auto round_y = circuit_builder.get_variable(lookup_witnesses[plookup::ColumnIdx::C3][i]);
104 EXPECT_EQ(
uint256_t(round_scalar), expected_scalar);
106 auto next_scalar =
static_cast<uint256_t>(
107 (i == num_tables - 1) ?
fr(0)
108 : circuit_builder.get_variable(lookup_witnesses[plookup::ColumnIdx::C1][i + 1]));
111 EXPECT_EQ(
slice, (
uint256_t(input_lo) >> (i * table_bits)) & mask);
114 offset_generators[i]);
116 EXPECT_EQ(round_x, expected_point.
x);
117 EXPECT_EQ(round_y, expected_point.
y);
118 for (
size_t j = 0; j < table_bits; ++j) {
119 accumulator = accumulator.
dbl();
121 expected_scalar >>= table_bits;
124 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
126 TestFixture::prove_and_verify(circuit_builder,
true);
160 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(
builder);
163 auto& polynomials = prover_instance->polynomials;
166 polynomials.lookup_inverses = polynomials.lookup_inverses.full();
167 polynomials.lookup_read_counts = polynomials.lookup_read_counts.full();
168 polynomials.lookup_read_counts.at(25) = 1;
169 polynomials.lookup_read_tags = polynomials.lookup_read_tags.full();
170 polynomials.lookup_read_tags.at(25) = 1;
172 TestFixture::prove_and_verify(prover_instance,
false);
188 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(
builder);
191 auto& polynomials = prover_instance->polynomials;
193 bool altered =
false;
195 for (
auto [i, q_lookup] : polynomials.q_lookup.indexed_values()) {
196 if (!q_lookup.is_zero() && polynomials.q_lookup.is_valid_set_index(i)) {
197 polynomials.w_o.at(i) += 1;
202 ASSERT_TRUE(altered);
204 TestFixture::prove_and_verify(prover_instance,
false);
220 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(
builder);
223 auto& polynomials = prover_instance->polynomials;
226 polynomials.lookup_inverses = polynomials.lookup_inverses.full();
227 polynomials.q_lookup = polynomials.q_lookup.full();
228 ASSERT_TRUE(polynomials.q_lookup[25] != 1);
229 polynomials.q_lookup.at(25) = 1;
231 TestFixture::prove_and_verify(prover_instance,
false);
242 for (
size_t k = 0; k < 5; ++k) {
246 uint32_t left_idx = circuit_builder.add_variable(left_fr);
247 uint32_t right_idx = circuit_builder.add_variable(right_fr);
250 const auto xor_accumulators =
252 circuit_builder.create_gates_from_plookup_accumulators(
253 plookup::MultiTableId::UINT32_XOR, xor_accumulators, left_idx, right_idx);
256 const auto and_accumulators =
258 circuit_builder.create_gates_from_plookup_accumulators(
259 plookup::MultiTableId::UINT32_AND, and_accumulators, left_idx, right_idx);
262 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
263 TestFixture::prove_and_verify(circuit_builder,
true);
static std::vector< affine_element > derive_generators(const std::vector< uint8_t > &domain_separator_bytes, const size_t num_generators, const size_t starting_index=0)
Derives generator points via hash-to-curve.
ReadData< bb::fr > get_lookup_accumulators(const MultiTableId id, const fr &key_a, const fr &key_b, const bool is_2_to_1_lookup)
Given a table ID and the key(s) for a key-value lookup, return the lookup accumulators.