213 const fr input_lo =
static_cast<uint256_t>(input_value).
slice(0, plookup::fixed_base::table::BITS_PER_LO_SCALAR);
214 const auto input_lo_index = circuit_builder.add_variable(input_lo);
218 const auto lookup_witnesses = circuit_builder.create_gates_from_plookup_accumulators(
219 plookup::MultiTableId::FIXED_BASE_LEFT_LO, sequence_data_lo, input_lo_index);
221 const size_t num_lookups = plookup::fixed_base::table::NUM_TABLES_PER_LO_MULTITABLE;
223 EXPECT_EQ(num_lookups, lookup_witnesses[plookup::ColumnIdx::C1].size());
226 const auto mask = plookup::fixed_base::table::MAX_TABLE_SIZE - 1;
229 std::vector<uint8_t> input_buf;
230 write(input_buf, base_point);
231 const auto offset_generators =
236 const auto table_bits = plookup::fixed_base::table::BITS_PER_TABLE;
237 const auto num_tables = plookup::fixed_base::table::NUM_TABLES_PER_LO_MULTITABLE;
238 for (
size_t i = 0; i < num_tables; ++i) {
240 auto round_scalar = circuit_builder.get_variable(lookup_witnesses[plookup::ColumnIdx::C1][i]);
241 auto round_x = circuit_builder.get_variable(lookup_witnesses[plookup::ColumnIdx::C2][i]);
242 auto round_y = circuit_builder.get_variable(lookup_witnesses[plookup::ColumnIdx::C3][i]);
244 EXPECT_EQ(
uint256_t(round_scalar), expected_scalar);
246 auto next_scalar =
static_cast<uint256_t>(
247 (i == num_tables - 1) ?
fr(0)
248 : circuit_builder.get_variable(lookup_witnesses[plookup::ColumnIdx::C1][i + 1]));
251 EXPECT_EQ(
slice, (
uint256_t(input_lo) >> (i * table_bits)) & mask);
254 offset_generators[i]);
256 EXPECT_EQ(round_x, expected_point.
x);
257 EXPECT_EQ(round_y, expected_point.
y);
258 for (
size_t j = 0; j < table_bits; ++j) {
259 accumulator = accumulator.
dbl();
261 expected_scalar >>= table_bits;
264 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
266 TestFixture::prove_and_verify(circuit_builder,
true);
277 auto construct_circuit_with_lookups = [
this]() {
282 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(
builder);
289 auto builder = construct_circuit_with_lookups();
291 TestFixture::prove_and_verify(
builder,
true);
296 auto builder = construct_circuit_with_lookups();
299 auto& polynomials = proving_key->polynomials;
307 polynomials.lookup_inverses = polynomials.lookup_inverses.full();
308 polynomials.lookup_read_counts = polynomials.lookup_read_counts.full();
309 polynomials.lookup_read_counts.at(25) = 1;
310 polynomials.lookup_read_tags = polynomials.lookup_read_tags.full();
311 polynomials.lookup_read_tags.at(25) = 1;
313 TestFixture::prove_and_verify(proving_key,
false);
318 auto builder = construct_circuit_with_lookups();
321 auto& polynomials = proving_key->polynomials;
323 bool altered =
false;
325 for (
auto [i, q_lookup] : polynomials.q_lookup.indexed_values()) {
326 if (!q_lookup.is_zero() && polynomials.q_lookup.is_valid_set_index(i)) {
327 polynomials.w_o.at(i) += 1;
332 EXPECT_TRUE(altered);
333 TestFixture::prove_and_verify(proving_key,
false);
338 auto builder = construct_circuit_with_lookups();
341 auto& polynomials = proving_key->polynomials;
344 polynomials.lookup_inverses = polynomials.lookup_inverses.full();
345 polynomials.q_lookup = polynomials.q_lookup.full();
346 EXPECT_TRUE(polynomials.q_lookup[25] != 1);
347 polynomials.q_lookup.at(25) = 1;
349 TestFixture::prove_and_verify(proving_key,
false);
387 uint32_t x1 = circuit_builder.add_variable(p1.
x);
388 uint32_t y1 = circuit_builder.add_variable(p1.
y);
389 uint32_t x2 = circuit_builder.add_variable(p2.
x);
390 uint32_t y2 = circuit_builder.add_variable(p2.
y);
391 uint32_t x3 = circuit_builder.add_variable(p3.
x);
392 uint32_t y3 = circuit_builder.add_variable(p3.
y);
394 circuit_builder.create_ecc_add_gate({ x1, y1, x2, y2, x3, y3, 1 });
397 x3 = circuit_builder.add_variable(p3.
x);
398 y3 = circuit_builder.add_variable(p3.
y);
399 circuit_builder.create_ecc_add_gate({ x1, y1, x2, y2, x3, y3, 1 });
402 x3 = circuit_builder.add_variable(p3.
x);
403 y3 = circuit_builder.add_variable(p3.
y);
404 circuit_builder.create_ecc_add_gate({ x1, y1, x2, y2, x3, y3, -1 });
406 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
408 TestFixture::prove_and_verify(circuit_builder,
true);
417 auto a_idx = circuit_builder.add_variable(
a);
418 auto b_idx = circuit_builder.add_variable(
b);
419 auto c_idx = circuit_builder.add_variable(
b);
420 auto d_idx = circuit_builder.add_variable(
a);
422 circuit_builder.create_add_gate(
424 circuit_builder.create_add_gate(
427 circuit_builder.create_tag(1, 2);
428 circuit_builder.create_tag(2, 1);
430 circuit_builder.assign_tag(a_idx, 1);
431 circuit_builder.assign_tag(b_idx, 1);
432 circuit_builder.assign_tag(c_idx, 2);
433 circuit_builder.assign_tag(d_idx, 2);
434 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
436 TestFixture::prove_and_verify(circuit_builder,
true);
445 auto a_idx = circuit_builder.add_variable(
a);
446 auto b_idx = circuit_builder.add_variable(
a);
447 circuit_builder.assert_equal(a_idx, b_idx);
448 auto c_idx = circuit_builder.add_variable(c);
449 auto d_idx = circuit_builder.add_variable(c);
450 circuit_builder.assert_equal(c_idx, d_idx);
451 auto e_idx = circuit_builder.add_variable(
a);
452 auto f_idx = circuit_builder.add_variable(
a);
453 circuit_builder.assert_equal(e_idx, f_idx);
454 auto g_idx = circuit_builder.add_variable(c);
455 auto h_idx = circuit_builder.add_variable(c);
456 circuit_builder.assert_equal(g_idx, h_idx);
458 circuit_builder.create_tag(1, 2);
459 circuit_builder.create_tag(2, 1);
461 circuit_builder.assign_tag(a_idx, 1);
462 circuit_builder.assign_tag(c_idx, 1);
463 circuit_builder.assign_tag(e_idx, 2);
464 circuit_builder.assign_tag(g_idx, 2);
466 circuit_builder.create_add_gate(
468 circuit_builder.create_add_gate(
470 circuit_builder.create_add_gate(
472 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
474 TestFixture::prove_and_verify(circuit_builder,
true);
484 auto a_idx = circuit_builder.add_variable(
a);
485 auto b_idx = circuit_builder.add_variable(
b);
486 auto c_idx = circuit_builder.add_variable(
b);
487 auto d_idx = circuit_builder.add_variable(
a + 1);
489 circuit_builder.create_add_gate({ a_idx, b_idx, circuit_builder.zero_idx, 1, 1, 0, 0 });
490 circuit_builder.create_add_gate({ c_idx, d_idx, circuit_builder.zero_idx, 1, 1, 0, -1 });
492 circuit_builder.create_tag(1, 2);
493 circuit_builder.create_tag(2, 1);
495 circuit_builder.assign_tag(a_idx, 1);
496 circuit_builder.assign_tag(b_idx, 1);
497 circuit_builder.assign_tag(c_idx, 2);
498 circuit_builder.assign_tag(d_idx, 2);
499 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
501 TestFixture::prove_and_verify(circuit_builder,
false);
509 auto a_idx = circuit_builder.add_variable(
a);
510 auto b_idx = circuit_builder.add_variable(
b);
511 auto c_idx = circuit_builder.add_variable(
b);
512 auto d_idx = circuit_builder.add_variable(
a + 1);
514 circuit_builder.create_add_gate({ a_idx, b_idx, circuit_builder.zero_idx, 1, 1, 0, 0 });
515 circuit_builder.create_add_gate({ c_idx, d_idx, circuit_builder.zero_idx, 1, 1, 0, -1 });
516 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
518 TestFixture::prove_and_verify(circuit_builder,
true);
554 auto a_idx = circuit_builder.add_variable(
a);
555 auto b_idx = circuit_builder.add_variable(
b);
556 auto c_idx = circuit_builder.add_variable(c);
557 auto d_idx = circuit_builder.add_variable(d);
558 auto e_idx = circuit_builder.add_variable(e);
559 auto f_idx = circuit_builder.add_variable(f);
560 auto g_idx = circuit_builder.add_variable(g);
561 auto h_idx = circuit_builder.add_variable(h);
562 circuit_builder.create_sort_constraint_with_edges(
563 { a_idx, b_idx, c_idx, d_idx, e_idx, f_idx, g_idx, h_idx },
a, h);
565 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
567 TestFixture::prove_and_verify(circuit_builder,
true);
572 auto a_idx = circuit_builder.add_variable(
a);
573 auto b_idx = circuit_builder.add_variable(
b);
574 auto c_idx = circuit_builder.add_variable(c);
575 auto d_idx = circuit_builder.add_variable(d);
576 auto e_idx = circuit_builder.add_variable(e);
577 auto f_idx = circuit_builder.add_variable(f);
578 auto g_idx = circuit_builder.add_variable(g);
579 auto h_idx = circuit_builder.add_variable(h);
580 circuit_builder.create_sort_constraint_with_edges(
581 { a_idx, b_idx, c_idx, d_idx, e_idx, f_idx, g_idx, h_idx },
a, g);
583 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
585 TestFixture::prove_and_verify(circuit_builder,
false);
589 auto a_idx = circuit_builder.add_variable(
a);
590 auto b_idx = circuit_builder.add_variable(
b);
591 auto c_idx = circuit_builder.add_variable(c);
592 auto d_idx = circuit_builder.add_variable(d);
593 auto e_idx = circuit_builder.add_variable(e);
594 auto f_idx = circuit_builder.add_variable(f);
595 auto g_idx = circuit_builder.add_variable(g);
596 auto h_idx = circuit_builder.add_variable(h);
597 circuit_builder.create_sort_constraint_with_edges(
598 { a_idx, b_idx, c_idx, d_idx, e_idx, f_idx, g_idx, h_idx },
b, h);
600 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
602 TestFixture::prove_and_verify(circuit_builder,
false);
606 auto a_idx = circuit_builder.add_variable(
a);
607 auto c_idx = circuit_builder.add_variable(c);
608 auto d_idx = circuit_builder.add_variable(d);
609 auto e_idx = circuit_builder.add_variable(e);
610 auto f_idx = circuit_builder.add_variable(f);
611 auto g_idx = circuit_builder.add_variable(g);
612 auto h_idx = circuit_builder.add_variable(h);
613 auto b2_idx = circuit_builder.add_variable(
fr(15));
614 circuit_builder.create_sort_constraint_with_edges(
615 { a_idx, b2_idx, c_idx, d_idx, e_idx, f_idx, g_idx, h_idx },
b, h);
617 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
619 TestFixture::prove_and_verify(circuit_builder,
false);
624 TestFixture::add_variables(circuit_builder, { 1, 2, 5, 6, 7, 10, 11, 13, 16, 17, 20, 22, 22, 25,
625 26, 29, 29, 32, 32, 33, 35, 38, 39, 39, 42, 42, 43, 45 });
626 circuit_builder.create_sort_constraint_with_edges(idx, 1, 45);
628 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
630 TestFixture::prove_and_verify(circuit_builder,
true);
635 TestFixture::add_variables(circuit_builder, { 1, 2, 5, 6, 7, 10, 11, 13, 16, 17, 20, 22, 22, 25,
636 26, 29, 29, 32, 32, 33, 35, 38, 39, 39, 42, 42, 43, 45 });
637 circuit_builder.create_sort_constraint_with_edges(idx, 1, 29);
639 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
641 TestFixture::prove_and_verify(circuit_builder,
false);
649 auto indices = TestFixture::add_variables(circuit_builder, { 1, 2, 3, 4, 5, 6, 7, 8 });
650 for (
size_t i = 0; i < indices.size(); i++) {
651 circuit_builder.create_new_range_constraint(indices[i], 8);
654 circuit_builder.create_sort_constraint(indices);
656 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
658 TestFixture::prove_and_verify(circuit_builder,
true);
662 auto indices = TestFixture::add_variables(circuit_builder, { 3 });
663 for (
size_t i = 0; i < indices.size(); i++) {
664 circuit_builder.create_new_range_constraint(indices[i], 3);
667 circuit_builder.create_dummy_constraints(indices);
669 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
671 TestFixture::prove_and_verify(circuit_builder,
true);
675 auto indices = TestFixture::add_variables(circuit_builder, { 1, 2, 3, 4, 5, 6, 8, 25 });
676 for (
size_t i = 0; i < indices.size(); i++) {
677 circuit_builder.create_new_range_constraint(indices[i], 8);
679 circuit_builder.create_sort_constraint(indices);
681 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
683 TestFixture::prove_and_verify(circuit_builder,
false);
687 auto indices = TestFixture::add_variables(
688 circuit_builder, { 1, 2, 3, 4, 5, 6, 10, 8, 15, 11, 32, 21, 42, 79, 16, 10, 3, 26, 19, 51 });
689 for (
size_t i = 0; i < indices.size(); i++) {
690 circuit_builder.create_new_range_constraint(indices[i], 128);
692 circuit_builder.create_dummy_constraints(indices);
694 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
696 TestFixture::prove_and_verify(circuit_builder,
true);
700 auto indices = TestFixture::add_variables(
701 circuit_builder, { 1, 2, 3, 80, 5, 6, 29, 8, 15, 11, 32, 21, 42, 79, 16, 10, 3, 26, 13, 14 });
702 for (
size_t i = 0; i < indices.size(); i++) {
703 circuit_builder.create_new_range_constraint(indices[i], 79);
705 circuit_builder.create_dummy_constraints(indices);
707 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
709 TestFixture::prove_and_verify(circuit_builder,
false);
713 auto indices = TestFixture::add_variables(
714 circuit_builder, { 1, 0, 3, 80, 5, 6, 29, 8, 15, 11, 32, 21, 42, 79, 16, 10, 3, 26, 13, 14 });
715 for (
size_t i = 0; i < indices.size(); i++) {
716 circuit_builder.create_new_range_constraint(indices[i], 79);
718 circuit_builder.create_dummy_constraints(indices);
720 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
722 TestFixture::prove_and_verify(circuit_builder,
false);
729 auto idx = TestFixture::add_variables(circuit_builder, { 1, 2, 3, 4, 5, 6, 7, 8 });
730 for (
size_t i = 0; i < idx.size(); i++) {
731 circuit_builder.create_new_range_constraint(idx[i], 8);
734 circuit_builder.create_add_gate({ idx[0], idx[1], circuit_builder.zero_idx,
fr::one(),
fr::one(),
fr::zero(), -3 });
735 circuit_builder.create_add_gate({ idx[2], idx[3], circuit_builder.zero_idx,
fr::one(),
fr::one(),
fr::zero(), -7 });
736 circuit_builder.create_add_gate(
738 circuit_builder.create_add_gate(
741 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
743 TestFixture::prove_and_verify(circuit_builder,
true);
749 auto idx = TestFixture::add_variables(circuit_builder, { 1, 2, 3, 4, 5, 6, 7, 8 });
750 for (
size_t i = 0; i < idx.size(); i++) {
751 circuit_builder.create_new_range_constraint(idx[i], 12);
754 circuit_builder.create_add_gate({ idx[0], idx[1], circuit_builder.zero_idx,
fr::one(),
fr::one(),
fr::zero(), -3 });
755 circuit_builder.create_add_gate({ idx[2], idx[3], circuit_builder.zero_idx,
fr::one(),
fr::one(),
fr::zero(), -7 });
756 circuit_builder.create_add_gate(
758 circuit_builder.create_add_gate(
761 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
763 TestFixture::prove_and_verify(circuit_builder,
true);
771 std::vector<fr>
a = { 1, 3, 4, 7, 7, 8, 11, 14, 15, 15, 18, 19, 21, 21, 24, 25, 26, 27, 30, 32 };
772 std::vector<uint32_t> ind;
773 for (
const fr& val :
a)
774 ind.emplace_back(circuit_builder.add_variable(val));
775 circuit_builder.create_sort_constraint(ind);
777 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
779 TestFixture::prove_and_verify(circuit_builder,
true);
784 std::vector<fr>
a = { 1, 3, 4, 7, 7, 8, 16, 14, 15, 15, 18, 19, 21, 21, 24, 25, 26, 27, 30, 32 };
785 std::vector<uint32_t> ind;
786 for (
const fr& val :
a)
787 ind.emplace_back(circuit_builder.add_variable(val));
788 circuit_builder.create_sort_constraint(ind);
790 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
792 TestFixture::prove_and_verify(circuit_builder,
false);
849 const auto split_into_limbs = [&](
const uint512_t& input) {
850 constexpr size_t NUM_BITS = 68;
852 limbs[0] = input.slice(0, NUM_BITS).lo;
853 limbs[1] = input.slice(NUM_BITS * 1, NUM_BITS * 2).lo;
854 limbs[2] = input.slice(NUM_BITS * 2, NUM_BITS * 3).lo;
855 limbs[3] = input.slice(NUM_BITS * 3, NUM_BITS * 4).lo;
860 std::array<uint32_t, 4> limb_indices;
861 limb_indices[0] = circuit_builder.add_variable(limbs[0]);
862 limb_indices[1] = circuit_builder.add_variable(limbs[1]);
863 limb_indices[2] = circuit_builder.add_variable(limbs[2]);
864 limb_indices[3] = circuit_builder.add_variable(limbs[3]);
868 auto modulus_limbs = split_into_limbs(BINARY_BASIS_MODULUS -
uint512_t(modulus));
870 const auto a_indices = get_limb_witness_indices(split_into_limbs(
uint256_t(
a)));
871 const auto b_indices = get_limb_witness_indices(split_into_limbs(
uint256_t(
b)));
872 const auto q_indices = get_limb_witness_indices(split_into_limbs(
uint256_t(q)));
873 const auto r_indices = get_limb_witness_indices(split_into_limbs(
uint256_t(r)));
876 a_indices, b_indices, q_indices, r_indices, modulus_limbs,
878 const auto [lo_1_idx, hi_1_idx] = circuit_builder.evaluate_non_native_field_multiplication(inputs);
879 circuit_builder.range_constrain_two_limbs(lo_1_idx, hi_1_idx, 70, 70);
881 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
883 TestFixture::prove_and_verify(circuit_builder,
true);
890 uint32_t rom_values[8]{
897 size_t rom_id = circuit_builder.create_ROM_array(8);
899 for (
size_t i = 0; i < 8; ++i) {
900 circuit_builder.set_ROM_element(rom_id, i, rom_values[i]);
903 uint32_t a_idx = circuit_builder.read_ROM_array(rom_id, circuit_builder.add_variable(5));
904 EXPECT_EQ(a_idx != rom_values[5],
true);
905 uint32_t b_idx = circuit_builder.read_ROM_array(rom_id, circuit_builder.add_variable(4));
906 uint32_t c_idx = circuit_builder.read_ROM_array(rom_id, circuit_builder.add_variable(1));
909 circuit_builder.get_variable(a_idx) + circuit_builder.get_variable(b_idx) + circuit_builder.get_variable(c_idx);
910 uint32_t d_idx = circuit_builder.add_variable(d_value);
912 circuit_builder.create_big_add_gate({
923 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
925 TestFixture::prove_and_verify(circuit_builder,
true);
932 uint32_t ram_values[8]{
939 size_t ram_id = circuit_builder.create_RAM_array(8);
941 for (
size_t i = 0; i < 8; ++i) {
942 circuit_builder.init_RAM_element(ram_id, i, ram_values[i]);
945 uint32_t a_idx = circuit_builder.read_RAM_array(ram_id, circuit_builder.add_variable(5));
946 EXPECT_EQ(a_idx != ram_values[5],
true);
948 uint32_t b_idx = circuit_builder.read_RAM_array(ram_id, circuit_builder.add_variable(4));
949 uint32_t c_idx = circuit_builder.read_RAM_array(ram_id, circuit_builder.add_variable(1));
951 circuit_builder.write_RAM_array(ram_id, circuit_builder.add_variable(4), circuit_builder.add_variable(500));
952 uint32_t d_idx = circuit_builder.read_RAM_array(ram_id, circuit_builder.add_variable(4));
954 EXPECT_EQ(circuit_builder.get_variable(d_idx), 500);
957 const auto e_value = circuit_builder.get_variable(a_idx) + circuit_builder.get_variable(b_idx) +
958 circuit_builder.get_variable(c_idx) + circuit_builder.get_variable(d_idx);
959 uint32_t e_idx = circuit_builder.add_variable(e_value);
961 circuit_builder.create_big_add_gate(
974 circuit_builder.create_big_add_gate(
976 circuit_builder.zero_idx,
977 circuit_builder.zero_idx,
978 circuit_builder.zero_idx,
988 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
990 TestFixture::prove_and_verify(circuit_builder,
true);