From 8a314d30769c9d15363057bed8a4f974e8a71992 Mon Sep 17 00:00:00 2001 From: Insun35 Date: Mon, 20 May 2024 19:12:30 +0900 Subject: [PATCH] feat(zk): implement MultiLookupCircuit Introduce MultiLookupCircuit for testing LogUp scheme. See https://github.com/scroll-tech/halo2/blob/1070391642dd64b2d68b47ec246cba9e35bd3c15/halo2_proofs/tests/plonk_api.rs --- tachyon/zk/plonk/examples/BUILD.bazel | 25 + tachyon/zk/plonk/examples/circuit_test.cc | 16 + .../plonk/examples/circuit_test_type_traits.h | 5 + .../zk/plonk/examples/multi_lookup_circuit.h | 381 ++++++++ .../examples/multi_lookup_circuit_test.cc | 33 + .../examples/multi_lookup_circuit_test_data.h | 882 ++++++++++++++++++ 6 files changed, 1342 insertions(+) create mode 100644 tachyon/zk/plonk/examples/multi_lookup_circuit.h create mode 100644 tachyon/zk/plonk/examples/multi_lookup_circuit_test.cc create mode 100644 tachyon/zk/plonk/examples/multi_lookup_circuit_test_data.h diff --git a/tachyon/zk/plonk/examples/BUILD.bazel b/tachyon/zk/plonk/examples/BUILD.bazel index a9a2bb2461..2b556cf26e 100644 --- a/tachyon/zk/plonk/examples/BUILD.bazel +++ b/tachyon/zk/plonk/examples/BUILD.bazel @@ -32,6 +32,7 @@ tachyon_cc_library( "//tachyon/zk/base/commitments:gwc_extension", "//tachyon/zk/base/commitments:shplonk_extension", "//tachyon/zk/lookup/halo2:scheme", + "//tachyon/zk/lookup/logup:scheme", "//tachyon/zk/plonk/examples/fibonacci:fibonacci1_circuit", "//tachyon/zk/plonk/examples/fibonacci:fibonacci2_circuit", "//tachyon/zk/plonk/examples/fibonacci:fibonacci3_circuit", @@ -46,6 +47,8 @@ tachyon_cc_library( srcs = ["circuit_test.cc"], hdrs = ["circuit_test.h"], deps = [ + ":multi_lookup_circuit", + ":multi_lookup_circuit_test_data", ":point", ":shuffle_circuit", ":shuffle_circuit_test_data", @@ -76,6 +79,19 @@ tachyon_cc_library( hdrs = ["point.h"], ) +tachyon_cc_library( + name = "multi_lookup_circuit", + hdrs = ["multi_lookup_circuit.h"], + deps = ["//tachyon/zk/plonk/constraint_system:circuit"], +) + +tachyon_cc_library( + name = "multi_lookup_circuit_test_data", + testonly = True, + hdrs = ["multi_lookup_circuit_test_data.h"], + deps = COMMON_TEST_DATA_DEPS, +) + tachyon_cc_library( name = "shuffle_circuit", hdrs = ["shuffle_circuit.h"], @@ -118,6 +134,15 @@ tachyon_cc_library( deps = COMMON_TEST_DATA_DEPS + ["//tachyon/base:range"], ) +tachyon_cc_unittest( + name = "multi_lookup_circuit_test", + srcs = ["multi_lookup_circuit_test.cc"], + deps = COMMON_TEST_DEPS + [ + ":multi_lookup_circuit", + ":multi_lookup_circuit_test_data", + ], +) + tachyon_cc_unittest( name = "shuffle_circuit_test", srcs = ["shuffle_circuit_test.cc"], diff --git a/tachyon/zk/plonk/examples/circuit_test.cc b/tachyon/zk/plonk/examples/circuit_test.cc index e609d35e4d..79cde90976 100644 --- a/tachyon/zk/plonk/examples/circuit_test.cc +++ b/tachyon/zk/plonk/examples/circuit_test.cc @@ -13,6 +13,8 @@ #include "tachyon/zk/plonk/examples/fibonacci/fibonacci2_circuit_test_data.h" #include "tachyon/zk/plonk/examples/fibonacci/fibonacci3_circuit.h" #include "tachyon/zk/plonk/examples/fibonacci/fibonacci3_circuit_test_data.h" +#include "tachyon/zk/plonk/examples/multi_lookup_circuit.h" +#include "tachyon/zk/plonk/examples/multi_lookup_circuit_test_data.h" #include "tachyon/zk/plonk/examples/shuffle_circuit.h" #include "tachyon/zk/plonk/examples/shuffle_circuit_test_data.h" #include "tachyon/zk/plonk/examples/simple_circuit.h" @@ -597,4 +599,18 @@ template class CircuitTest< Fibonacci3TestData, BN254SHPlonk, BN254Halo2LS>>; +template class CircuitTest< + TestArguments, + BN254SHPlonk, BN254LogUpLS>, + MultiLookupTestData< + MultiLookupCircuit, + BN254SHPlonk, BN254LogUpLS>>; + +template class CircuitTest< + TestArguments, + BN254GWC, BN254LogUpLS>, + MultiLookupTestData< + MultiLookupCircuit, BN254GWC, + BN254LogUpLS>>; + } // namespace tachyon::zk::plonk diff --git a/tachyon/zk/plonk/examples/circuit_test_type_traits.h b/tachyon/zk/plonk/examples/circuit_test_type_traits.h index 61bfa0666b..7b4ffca1de 100644 --- a/tachyon/zk/plonk/examples/circuit_test_type_traits.h +++ b/tachyon/zk/plonk/examples/circuit_test_type_traits.h @@ -7,6 +7,7 @@ #include "tachyon/zk/base/commitments/gwc_extension.h" #include "tachyon/zk/base/commitments/shplonk_extension.h" #include "tachyon/zk/lookup/halo2/scheme.h" +#include "tachyon/zk/lookup/logup/scheme.h" #include "tachyon/zk/plonk/examples/fibonacci/fibonacci1_circuit.h" #include "tachyon/zk/plonk/examples/fibonacci/fibonacci2_circuit.h" #include "tachyon/zk/plonk/examples/fibonacci/fibonacci3_circuit.h" @@ -25,6 +26,10 @@ using BN254Halo2LS = lookup::halo2::Scheme; +using BN254LogUpLS = lookup::logup::Scheme; + template constexpr bool IsSimpleFloorPlanner = std::is_same_v>; diff --git a/tachyon/zk/plonk/examples/multi_lookup_circuit.h b/tachyon/zk/plonk/examples/multi_lookup_circuit.h new file mode 100644 index 0000000000..1a0ad54dd6 --- /dev/null +++ b/tachyon/zk/plonk/examples/multi_lookup_circuit.h @@ -0,0 +1,381 @@ +#ifndef TACHYON_ZK_PLONK_EXAMPLES_MULTI_LOOKUP_CIRCUIT_H_ +#define TACHYON_ZK_PLONK_EXAMPLES_MULTI_LOOKUP_CIRCUIT_H_ + +#include +#include +#include + +#include "tachyon/zk/plonk/constraint_system/circuit.h" + +namespace tachyon::zk::plonk { + +template +class MultiLookupCircuitConfig { + public: + using Field = F; + + MultiLookupCircuitConfig() = default; + MultiLookupCircuitConfig(const AdviceColumnKey& a, const AdviceColumnKey& b, + const AdviceColumnKey& c, const AdviceColumnKey& d, + const AdviceColumnKey& e, const FixedColumnKey& sa, + const FixedColumnKey& sb, const FixedColumnKey& sc, + const FixedColumnKey& sf, const FixedColumnKey& sm, + const FixedColumnKey& sp, + const LookupTableColumn& sl) + : a_(a), + b_(b), + c_(c), + d_(d), + e_(e), + sa_(sa), + sb_(sb), + sc_(sc), + sf_(sf), + sm_(sm), + sp_(sp), + sl_(sl) {} + + MultiLookupCircuitConfig Clone() const { + return MultiLookupCircuitConfig(a_, b_, c_, d_, e_, sa_, sb_, sc_, sf_, sm_, + sp_, sl_); + } + + const AdviceColumnKey& a() const { return a_; } + const AdviceColumnKey& b() const { return b_; } + const AdviceColumnKey& c() const { return c_; } + const AdviceColumnKey& d() const { return d_; } + const AdviceColumnKey& e() const { return e_; } + const FixedColumnKey& sa() const { return sa_; } + const FixedColumnKey& sb() const { return sb_; } + const FixedColumnKey& sc() const { return sc_; } + const FixedColumnKey& sf() const { return sf_; } + const FixedColumnKey& sm() const { return sm_; } + const FixedColumnKey& sp() const { return sp_; } + const LookupTableColumn& sl() const { return sl_; } + + static MultiLookupCircuitConfig Configure(ConstraintSystem& meta) { + AdviceColumnKey e = meta.CreateAdviceColumn(); + AdviceColumnKey a = meta.CreateAdviceColumn(); + AdviceColumnKey b = meta.CreateAdviceColumn(); + FixedColumnKey sf = meta.CreateFixedColumn(); + AdviceColumnKey c = meta.CreateAdviceColumn(); + AdviceColumnKey d = meta.CreateAdviceColumn(); + InstanceColumnKey p = meta.CreateInstanceColumn(); + + meta.EnableEquality(a); + meta.EnableEquality(b); + meta.EnableEquality(c); + + FixedColumnKey sm = meta.CreateFixedColumn(); + FixedColumnKey sa = meta.CreateFixedColumn(); + FixedColumnKey sb = meta.CreateFixedColumn(); + FixedColumnKey sc = meta.CreateFixedColumn(); + FixedColumnKey sp = meta.CreateFixedColumn(); + LookupTableColumn sl = meta.CreateLookupTableColumn(); + + Selector dummy = meta.CreateComplexSelector(); + Selector dummy_2 = meta.CreateComplexSelector(); + Selector dummy_3 = meta.CreateComplexSelector(); + + LookupTableColumn dummy_table = meta.CreateLookupTableColumn(); + + // + // A B ... sl + // [ + // instance 0 ... 0 + // a a ... 0 + // a a^2 ... 0 + // a a ... 0 + // a a^2 ... 0 + // ... ... ... ... + // ... ... ... instance + // ... ... ... a + // ... ... ... a + // ... ... ... 0 + // ] + // + + meta.Lookup("lookup", [&a, &sl](VirtualCells meta) { + std::unique_ptr> a_expr = meta.QueryAny(a, Rotation::Cur()); + lookup::Pairs>, LookupTableColumn> + lookup_pairs; + lookup_pairs.emplace_back(std::move(a_expr), sl); + return lookup_pairs; + }); + + meta.Lookup("lookup_same", [&a, &sl](VirtualCells meta) { + std::unique_ptr> a_expr = meta.QueryAny(a, Rotation::Cur()); + lookup::Pairs>, LookupTableColumn> + lookup_pairs; + lookup_pairs.emplace_back(std::move(a_expr), sl); + return lookup_pairs; + }); + + meta.Lookup("lookup_same", [&b, &dummy, &dummy_2, &dummy_3, + &dummy_table](VirtualCells meta) { + std::unique_ptr> b_expr = meta.QueryAny(b, Rotation::Cur()); + std::unique_ptr> dummy_expr = meta.QuerySelector(dummy); + std::unique_ptr> dummy_2_expr = meta.QuerySelector(dummy_2); + std::unique_ptr> dummy_3_expr = meta.QuerySelector(dummy_3); + + lookup::Pairs>, LookupTableColumn> + lookup_pairs; + lookup_pairs.emplace_back(std::move(dummy_expr) * + std::move(dummy_2_expr) * + std::move(dummy_3_expr) * std::move(b_expr), + dummy_table); + return lookup_pairs; + }); + + meta.CreateGate("Combined add-mult", [&](VirtualCells meta) { + std::unique_ptr> d_expr = + meta.QueryAdvice(d, Rotation::Next()); + std::unique_ptr> a_expr = + meta.QueryAdvice(a, Rotation::Cur()); + std::unique_ptr> sf_expr = + meta.QueryFixed(sf, Rotation::Cur()); + std::unique_ptr> e_expr = + meta.QueryAdvice(e, Rotation::Prev()); + std::unique_ptr> b_expr = + meta.QueryAdvice(b, Rotation::Cur()); + std::unique_ptr> c_expr = + meta.QueryAdvice(c, Rotation::Cur()); + + std::unique_ptr> sa_expr = + meta.QueryFixed(sa, Rotation::Cur()); + std::unique_ptr> sb_expr = + meta.QueryFixed(sb, Rotation::Cur()); + std::unique_ptr> sc_expr = + meta.QueryFixed(sc, Rotation::Cur()); + std::unique_ptr> sm_expr = + meta.QueryFixed(sm, Rotation::Cur()); + + std::unique_ptr> a_clone = a_expr.get()->Clone(); + std::unique_ptr> b_clone = b_expr.get()->Clone(); + + std::vector> constraints; + constraints.emplace_back( + std::move(a_clone) * std::move(sa_expr) + + std::move(b_clone) * std::move(sb_expr) + + std::move(a_expr) * std::move(b_expr) * std::move(sm_expr) - + (std::move(c_expr) * std::move(sc_expr)) + + std::move(sf_expr) * (std::move(d_expr) * std::move(e_expr))); + + return constraints; + }); + + meta.CreateGate("Public input", [&](VirtualCells meta) { + std::unique_ptr> a_expr = + meta.QueryAdvice(a, Rotation::Cur()); + std::unique_ptr> p_expr = + meta.QueryInstance(p, Rotation::Cur()); + std::unique_ptr> sp_expr = + meta.QueryFixed(sp, Rotation::Cur()); + std::vector> constraints; + constraints.emplace_back(std::move(sp_expr) * + (std::move(a_expr) - std::move(p_expr))); + return constraints; + }); + + meta.EnableEquality(sf); + meta.EnableEquality(e); + meta.EnableEquality(d); + meta.EnableEquality(p); + meta.EnableEquality(sm); + meta.EnableEquality(sa); + meta.EnableEquality(sb); + meta.EnableEquality(sc); + meta.EnableEquality(sp); + + return {a, b, c, d, e, sa, sb, sc, sf, sm, sp, sl}; + } + + private: + AdviceColumnKey a_; + AdviceColumnKey b_; + AdviceColumnKey c_; + AdviceColumnKey d_; + AdviceColumnKey e_; + FixedColumnKey sa_; + FixedColumnKey sb_; + FixedColumnKey sc_; + FixedColumnKey sf_; + FixedColumnKey sm_; + FixedColumnKey sp_; + LookupTableColumn sl_; +}; + +template +class StandardPlonkChip { + public: + explicit StandardPlonkChip(MultiLookupCircuitConfig&& config) + : config_(std::move(config)) {} + + void PublicInput(Layouter* layouter, const Value& value) { + layouter->AssignRegion("public_input", [this, &value](Region& region) { + region.AssignAdvice("value", config_.a(), 0, + [&value]() { return value; }); + region.AssignFixed("public", config_.sp(), 0, + []() { return Value::Known(F::One()); }); + }); + } + + std::vector> RawMultiply( + Layouter* layouter, const std::vector>& values) { + std::vector> ret; + ret.reserve(3); + + layouter->AssignRegion( + "raw_multiply", [this, &values, &ret](Region& region) { + AssignedCell lhs = region.AssignAdvice( + "lhs", config_.a(), 0, [&values]() { return values[0]; }); + ret.push_back(lhs); + + region.AssignAdvice("lhs^4", config_.d(), 0, [&values]() { + return values[0].SquareImpl().SquareImpl(); + }); + + AssignedCell rhs = region.AssignAdvice( + "rhs", config_.b(), 0, [&values]() { return values[1]; }); + ret.push_back(rhs); + + region.AssignAdvice("rhs^4", config_.e(), 0, [&values]() { + return values[1].SquareImpl().SquareImpl(); + }); + + AssignedCell out = region.AssignAdvice( + "out", config_.c(), 0, [&values]() { return values[2]; }); + ret.push_back(out); + + region.AssignFixed("a", config_.sa(), 0, + []() { return Value::Known(F::Zero()); }); + region.AssignFixed("b", config_.sb(), 0, + []() { return Value::Known(F::Zero()); }); + region.AssignFixed("c", config_.sc(), 0, + []() { return Value::Known(F::One()); }); + region.AssignFixed("a * b", config_.sm(), 0, + []() { return Value::Known(F::One()); }); + }); + + return ret; + } + + std::vector> RawAdd(Layouter* layouter, + const std::vector>& values) { + std::vector> ret; + ret.reserve(3); + + layouter->AssignRegion("raw_add", [this, &values, &ret](Region& region) { + AssignedCell lhs = region.AssignAdvice( + "lhs", config_.a(), 0, [&values]() { return values[0]; }); + ret.push_back(lhs); + + region.AssignAdvice("lhs^4", config_.d(), 0, [&values]() { + return values[0].SquareImpl().SquareImpl(); + }); + + AssignedCell rhs = region.AssignAdvice( + "rhs", config_.b(), 0, [&values]() { return values[1]; }); + ret.push_back(rhs); + + region.AssignAdvice("rhs^4", config_.e(), 0, [&values]() { + return values[1].SquareImpl().SquareImpl(); + }); + + AssignedCell out = region.AssignAdvice( + "out", config_.c(), 0, [&values]() { return values[2]; }); + ret.push_back(out); + + region.AssignFixed("a", config_.sa(), 0, + []() { return Value::Known(F::One()); }); + region.AssignFixed("b", config_.sb(), 0, + []() { return Value::Known(F::One()); }); + region.AssignFixed("c", config_.sc(), 0, + []() { return Value::Known(F::One()); }); + region.AssignFixed("a * b", config_.sm(), 0, + []() { return Value::Known(F::Zero()); }); + }); + + return ret; + } + + void Copy(Layouter* layouter, const Cell& left, const Cell& right) { + layouter->AssignRegion("copy", [&left, &right](Region& region) { + region.ConstrainEqual(left, right); + region.ConstrainEqual(left, right); + }); + } + + void LookupTableFromValues(Layouter* layouter, + const std::vector& values) { + layouter->AssignLookupTable("", [this, &values](LookupTable& table) { + for (size_t i = 0; i < values.size(); ++i) { + if (!table.AssignCell("table col", config_.sl(), i, [&values, i]() { + return Value::Known(values[i]); + })) + return false; + } + return true; + }); + } + + private: + MultiLookupCircuitConfig config_; +}; + +template class _FloorPlanner> +class MultiLookupCircuit : public Circuit> { + public: + using FloorPlanner = _FloorPlanner>; + + MultiLookupCircuit() = default; + MultiLookupCircuit(const F& a, const std::vector& lookup_table) + : a_(Value::Known(a)), lookup_table_(lookup_table) {} + + std::unique_ptr>> WithoutWitness() + const override { + return std::make_unique(); + } + + static MultiLookupCircuitConfig Configure(ConstraintSystem& meta) { + return MultiLookupCircuitConfig::Configure(meta); + } + + void Synthesize(MultiLookupCircuitConfig&& config, + Layouter* layouter) const override { + StandardPlonkChip cs(std::move(config)); + + cs.PublicInput(layouter, Value::Known(F::One() + F::One())); + + for (size_t i = 0; i < 10; ++i) { + Value a_squared = a_.SquareImpl(); + std::vector> mul_values; + mul_values.reserve(3); + mul_values.push_back(a_); + mul_values.push_back(a_); + mul_values.push_back(a_squared); + std::vector> mul_cells = + cs.RawMultiply(layouter, mul_values); + + Value fin = a_squared.Add(a_); + std::vector> add_values; + add_values.reserve(3); + add_values.push_back(a_); + add_values.push_back(a_squared); + add_values.push_back(fin); + std::vector> add_cells = cs.RawAdd(layouter, add_values); + + cs.Copy(layouter, mul_cells[0].cell(), add_cells[0].cell()); + cs.Copy(layouter, add_cells[1].cell(), mul_cells[2].cell()); + } + + cs.LookupTableFromValues(layouter, lookup_table_); + } + + private: + Value a_; + std::vector lookup_table_; +}; +} // namespace tachyon::zk::plonk + +#endif // TACHYON_ZK_PLONK_EXAMPLES_MULTI_LOOKUP_CIRCUIT_H_ diff --git a/tachyon/zk/plonk/examples/multi_lookup_circuit_test.cc b/tachyon/zk/plonk/examples/multi_lookup_circuit_test.cc new file mode 100644 index 0000000000..a5f0ee3111 --- /dev/null +++ b/tachyon/zk/plonk/examples/multi_lookup_circuit_test.cc @@ -0,0 +1,33 @@ +#include "tachyon/zk/plonk/examples/multi_lookup_circuit.h" + +#include "gtest/gtest.h" + +#include "tachyon/zk/plonk/examples/circuit_test.h" +#include "tachyon/zk/plonk/examples/multi_lookup_circuit_test_data.h" +#include "tachyon/zk/plonk/layout/floor_planner/simple_floor_planner.h" + +namespace tachyon::zk::plonk { + +namespace { + +template +class MultiLookupCircuitTest + : public CircuitTest> {}; + +} // namespace + +// clang-format off +using MultiLookupTestArgumentsList = testing::Types< + TestArguments, BN254SHPlonk, BN254LogUpLS>, + TestArguments, BN254GWC, BN254LogUpLS>>; +// clang-format on + +TYPED_TEST_SUITE(MultiLookupCircuitTest, MultiLookupTestArgumentsList); + +TYPED_TEST(MultiLookupCircuitTest, CreateProof) { this->CreateProofTest(); } +TYPED_TEST(MultiLookupCircuitTest, VerifyProof) { this->VerifyProofTest(); } + +} // namespace tachyon::zk::plonk diff --git a/tachyon/zk/plonk/examples/multi_lookup_circuit_test_data.h b/tachyon/zk/plonk/examples/multi_lookup_circuit_test_data.h new file mode 100644 index 0000000000..bc655d4815 --- /dev/null +++ b/tachyon/zk/plonk/examples/multi_lookup_circuit_test_data.h @@ -0,0 +1,882 @@ +#ifndef TACHYON_ZK_PLONK_EXAMPLES_MULTI_LOOKUP_CIRCUIT_TEST_DATA_H_ +#define TACHYON_ZK_PLONK_EXAMPLES_MULTI_LOOKUP_CIRCUIT_TEST_DATA_H_ + +#include + +#include +#include +#include + +#include "tachyon/zk/plonk/examples/circuit_test_data.h" +#include "tachyon/zk/plonk/examples/circuit_test_type_traits.h" + +namespace tachyon::zk::plonk { + +template +class MultiLookupTestData : public CircuitTestData {}; + +// PCS = SHPlonk +template +class MultiLookupTestData>> + : public CircuitTestData { + public: + using F = typename PCS::Field; + using Evals = typename PCS::Evals; + + // Set flags of values to be used as true + constexpr static bool kAdviceCommitmentsFlag = true; + constexpr static bool kLookupMPolyCommitmentsFlag = true; + constexpr static bool kPermutationProductCommitmentsFlag = true; + constexpr static bool kLookupSumCommitmentsFlag = true; + constexpr static bool kVanishingHPolyCommitmentsFlag = true; + constexpr static bool kAdviceEvalsFlag = true; + constexpr static bool kFixedEvalsFlag = true; + constexpr static bool kCommonPermutationEvalsFlag = true; + constexpr static bool kPermutationProductEvalsFlag = true; + constexpr static bool kPermutationProductNextEvalsFlag = true; + constexpr static bool kLookupSumEvalsFlag = true; + constexpr static bool kLookupSumNextEvalsFlag = true; + constexpr static bool kPermutationProductLastEvalsFlag = true; + constexpr static bool kLookupMEvalsFlag = true; + + constexpr static size_t kN = 32; + + constexpr static std::string_view kPinnedConstraintSystem = ""; + + constexpr static bool kCycleStoreSelectors[][kN] = {{}}; + + constexpr static std::string_view kPinnedVerifyingKey = ""; + + constexpr static std::string_view kTranscriptRepr = ""; + + constexpr static std::string_view kLFirst[] = {}; + + constexpr static uint8_t kProof[] = { + 176, 39, 119, 154, 232, 230, 108, 49, 145, 63, 70, 98, 95, 39, 79, + 60, 158, 217, 82, 29, 203, 144, 111, 78, 192, 88, 4, 136, 239, 87, + 182, 33, 111, 96, 195, 90, 244, 247, 129, 190, 245, 7, 134, 122, 7, + 38, 111, 134, 98, 219, 109, 209, 22, 189, 233, 94, 254, 37, 168, 159, + 176, 235, 222, 156, 235, 153, 242, 158, 111, 46, 218, 237, 137, 157, 79, + 236, 121, 54, 239, 149, 20, 6, 230, 238, 214, 254, 55, 128, 121, 203, + 148, 43, 205, 237, 34, 148, 104, 119, 235, 159, 27, 152, 52, 194, 129, + 28, 241, 142, 82, 119, 54, 218, 65, 98, 24, 12, 186, 15, 178, 46, + 117, 129, 0, 141, 246, 154, 214, 166, 53, 198, 144, 126, 19, 184, 239, + 70, 130, 205, 109, 242, 43, 222, 115, 252, 25, 135, 221, 140, 138, 27, + 149, 217, 0, 210, 118, 86, 211, 115, 60, 19, 176, 39, 119, 154, 232, + 230, 108, 49, 145, 63, 70, 98, 95, 39, 79, 60, 158, 217, 82, 29, + 203, 144, 111, 78, 192, 88, 4, 136, 239, 87, 182, 33, 111, 96, 195, + 90, 244, 247, 129, 190, 245, 7, 134, 122, 7, 38, 111, 134, 98, 219, + 109, 209, 22, 189, 233, 94, 254, 37, 168, 159, 176, 235, 222, 156, 235, + 153, 242, 158, 111, 46, 218, 237, 137, 157, 79, 236, 121, 54, 239, 149, + 20, 6, 230, 238, 214, 254, 55, 128, 121, 203, 148, 43, 205, 237, 34, + 148, 104, 119, 235, 159, 27, 152, 52, 194, 129, 28, 241, 142, 82, 119, + 54, 218, 65, 98, 24, 12, 186, 15, 178, 46, 117, 129, 0, 141, 246, + 154, 214, 166, 53, 198, 144, 126, 19, 184, 239, 70, 130, 205, 109, 242, + 43, 222, 115, 252, 25, 135, 221, 140, 138, 27, 149, 217, 0, 210, 118, + 86, 211, 115, 60, 19, 145, 11, 16, 94, 46, 101, 142, 37, 118, 114, + 58, 190, 136, 96, 8, 61, 6, 213, 125, 92, 211, 101, 55, 204, 155, + 29, 133, 108, 190, 25, 83, 150, 90, 227, 86, 26, 180, 249, 141, 120, + 87, 113, 90, 65, 7, 201, 135, 234, 41, 9, 21, 93, 186, 61, 39, + 165, 252, 1, 242, 111, 112, 19, 0, 14, 145, 11, 16, 94, 46, 101, + 142, 37, 118, 114, 58, 190, 136, 96, 8, 61, 6, 213, 125, 92, 211, + 101, 55, 204, 155, 29, 133, 108, 190, 25, 83, 150, 90, 227, 86, 26, + 180, 249, 141, 120, 87, 113, 90, 65, 7, 201, 135, 234, 41, 9, 21, + 93, 186, 61, 39, 165, 252, 1, 242, 111, 112, 19, 0, 14, 155, 165, + 248, 100, 41, 224, 41, 35, 85, 160, 141, 0, 172, 104, 248, 164, 115, + 134, 63, 207, 100, 178, 35, 212, 177, 76, 73, 8, 101, 138, 251, 7, + 30, 251, 146, 72, 211, 253, 167, 86, 140, 141, 154, 48, 105, 237, 92, + 122, 34, 156, 8, 27, 211, 92, 16, 45, 250, 207, 19, 210, 128, 168, + 98, 2, 120, 31, 176, 86, 71, 4, 30, 66, 25, 108, 222, 115, 38, + 2, 7, 242, 135, 97, 218, 61, 118, 30, 145, 245, 93, 164, 157, 179, + 138, 82, 199, 5, 95, 241, 47, 41, 128, 154, 204, 17, 131, 53, 251, + 100, 244, 193, 22, 7, 77, 38, 44, 83, 35, 42, 192, 245, 37, 227, + 171, 161, 29, 45, 233, 132, 1, 235, 241, 217, 238, 242, 39, 164, 220, + 139, 138, 246, 128, 254, 46, 238, 162, 228, 146, 57, 175, 129, 74, 217, + 94, 231, 11, 62, 243, 193, 217, 153, 217, 101, 114, 90, 125, 95, 126, + 59, 206, 223, 208, 230, 184, 121, 26, 128, 153, 166, 193, 110, 232, 78, + 227, 70, 123, 34, 231, 31, 89, 154, 67, 130, 178, 247, 11, 85, 116, + 152, 69, 225, 160, 33, 248, 222, 213, 213, 89, 119, 57, 14, 82, 140, + 173, 223, 245, 115, 29, 123, 129, 15, 119, 113, 158, 154, 204, 78, 182, + 163, 33, 176, 65, 234, 201, 204, 121, 144, 117, 39, 180, 44, 198, 173, + 75, 71, 108, 69, 193, 47, 16, 225, 209, 172, 186, 78, 145, 32, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 171, 163, 18, 44, 236, 214, 176, 8, 42, 149, 148, 101, 140, 216, + 250, 46, 74, 251, 145, 57, 171, 9, 72, 128, 143, 70, 220, 195, 8, + 90, 86, 162, 47, 61, 29, 105, 107, 34, 46, 122, 241, 59, 118, 168, + 36, 103, 6, 46, 47, 185, 15, 150, 128, 141, 202, 102, 120, 105, 113, + 32, 199, 51, 118, 155, 232, 123, 232, 236, 146, 51, 220, 43, 39, 72, + 9, 150, 197, 81, 250, 92, 109, 74, 160, 34, 245, 106, 223, 184, 134, + 16, 182, 164, 45, 158, 64, 164, 13, 93, 110, 74, 239, 114, 7, 172, + 203, 26, 184, 131, 53, 242, 56, 242, 184, 0, 251, 0, 128, 4, 150, + 149, 253, 82, 85, 33, 219, 39, 49, 154, 71, 122, 196, 110, 60, 111, + 250, 190, 133, 38, 216, 236, 13, 32, 37, 132, 74, 14, 116, 228, 223, + 176, 213, 104, 19, 84, 187, 210, 135, 161, 5, 45, 167, 77, 253, 43, + 155, 191, 13, 227, 18, 165, 149, 148, 227, 169, 234, 202, 125, 197, 168, + 217, 23, 250, 162, 241, 213, 107, 168, 140, 184, 94, 175, 155, 147, 70, + 133, 172, 115, 99, 92, 199, 201, 243, 66, 150, 7, 11, 84, 219, 153, + 49, 7, 219, 185, 13, 191, 80, 133, 188, 249, 88, 223, 202, 42, 131, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 46, 139, 162, 97, 214, 188, 151, 158, 251, 213, 67, 148, + 179, 186, 222, 67, 236, 62, 199, 204, 128, 85, 111, 18, 212, 227, 211, + 140, 87, 199, 3, 150, 244, 101, 124, 240, 57, 152, 226, 181, 39, 180, + 183, 170, 209, 176, 247, 155, 215, 31, 172, 249, 98, 41, 118, 221, 241, + 26, 128, 71, 191, 5, 48, 95, 109, 72, 114, 20, 21, 242, 19, 161, + 152, 129, 124, 203, 0, 8, 223, 164, 182, 171, 78, 56, 205, 7, 161, + 118, 106, 163, 9, 89, 55, 137, 31, 120, 253, 221, 171, 251, 130, 152, + 255, 31, 10, 201, 144, 202, 224, 0, 219, 46, 119, 52, 26, 9, 229, + 187, 174, 111, 23, 44, 225, 33, 241, 150, 7, 111, 242, 22, 24, 158, + 23, 17, 112, 98, 105, 135, 58, 84, 69, 199, 62, 46, 140, 124, 58, + 240, 80, 254, 208, 157, 185, 208, 175, 195, 115, 53, 2, 38, 209, 99, + 72, 138, 100, 12, 86, 22, 87, 31, 182, 175, 200, 118, 20, 133, 61, + 139, 246, 249, 227, 34, 109, 79, 40, 36, 90, 162, 206, 195, 42, 35, + 60, 122, 164, 21, 97, 222, 248, 52, 77, 210, 133, 17, 135, 78, 133, + 192, 241, 161, 50, 38, 191, 67, 34, 147, 70, 0, 118, 252, 57, 186, + 7, 3, 46, 139, 162, 97, 214, 188, 151, 158, 251, 213, 67, 148, 179, + 186, 222, 67, 236, 62, 199, 204, 128, 85, 111, 18, 212, 227, 211, 140, + 87, 199, 3, 150, 244, 101, 124, 240, 57, 152, 226, 181, 39, 180, 183, + 170, 209, 176, 247, 155, 215, 31, 172, 249, 98, 41, 118, 221, 241, 26, + 128, 71, 191, 5, 48, 95, 109, 72, 114, 20, 21, 242, 19, 161, 152, + 129, 124, 203, 0, 8, 223, 164, 182, 171, 78, 56, 205, 7, 161, 118, + 106, 163, 9, 89, 55, 137, 31, 120, 253, 221, 171, 251, 130, 152, 255, + 31, 10, 201, 144, 202, 224, 0, 219, 46, 119, 52, 26, 9, 229, 187, + 174, 111, 23, 44, 225, 33, 241, 150, 7, 111, 242, 22, 24, 158, 23, + 17, 112, 98, 105, 135, 58, 84, 69, 199, 62, 46, 140, 124, 58, 240, + 80, 254, 208, 157, 185, 208, 175, 195, 115, 53, 2, 38, 209, 99, 72, + 138, 100, 12, 86, 22, 87, 31, 182, 175, 200, 118, 20, 133, 61, 139, + 246, 249, 227, 34, 109, 79, 40, 36, 90, 162, 206, 195, 42, 35, 60, + 122, 164, 21, 97, 222, 248, 52, 77, 210, 133, 17, 135, 78, 133, 192, + 241, 161, 50, 38, 191, 67, 34, 147, 70, 0, 118, 252, 57, 186, 7, + 56, 231, 229, 242, 185, 175, 200, 156, 253, 43, 67, 207, 230, 177, 121, + 198, 162, 103, 195, 97, 0, 197, 79, 188, 203, 15, 228, 152, 11, 118, + 91, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 144, 191, 159, 129, 255, 19, 229, 180, 21, + 128, 221, 88, 237, 181, 191, 245, 200, 218, 39, 108, 73, 26, 200, 6, + 80, 226, 216, 33, 190, 58, 160, 9, 144, 191, 159, 129, 255, 19, 229, + 180, 21, 128, 221, 88, 237, 181, 191, 245, 200, 218, 39, 108, 73, 26, + 200, 6, 80, 226, 216, 33, 190, 58, 160, 9, 215, 2, 154, 154, 18, + 42, 54, 182, 221, 129, 94, 208, 175, 169, 193, 227, 217, 235, 46, 212, + 91, 194, 2, 125, 168, 110, 30, 115, 229, 223, 110, 19, 71, 67, 250, + 24, 19, 22, 81, 1, 200, 1, 129, 119, 194, 243, 1, 238, 16, 17, + 7, 104, 18, 168, 58, 118, 88, 140, 69, 81, 39, 165, 206, 9, 249, + 219, 104, 153, 95, 17, 159, 159, 34, 198, 238, 138, 182, 109, 136, 155, + 90, 244, 171, 28, 71, 93, 237, 86, 167, 22, 47, 78, 190, 229, 96, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 32, 246, 84, 205, 195, + 239, 224, 59, 175, 2, 76, 87, 156, 0, 14, 146, 215, 27, 47, 189, + 100, 77, 7, 8, 15, 240, 35, 175, 39, 166, 37, 139, 169, 20, 46, + 200, 206, 90, 216, 90, 175, 204, 25, 98, 16, 6, 17, 137, 152, 188, + 57, 105, 8, 184, 44, 200, 42, 143, 177, 246, 47, 75, 43, 122, 197, + 163, 124, 226, 228, 140, 213, 114, 236, 7, 49, 93, 2, 197, 9, 9, + 137, 74, 215, 119, 251, 11, 163, 187, 66, 190, 1, 28, 226, 147, 8, + 19, 52, 24, 192, 251, 21, 1, 184, 42, 50, 241, 177, 199, 126, 106, + 208, 5, 165, 41, 80, 205, 160, 193, 173, 143, 253, 73, 45, 211, 236, + 112, 6, 216, 159, 62, 162, 105, 135, 1, 76, 21, 18, 205, 102, 131, + 59, 45, 53, 229, 1, 199, 132, 116, 114, 12, 244, 216, 245, 233, 42, + 19, 82, 138, 16, 117, 91, 168, 36, 131, 29, 149, 90, 139, 41, 78, + 51, 252, 143, 240, 62, 190, 12, 153, 199, 16, 8, 74, 254, 205, 173, + 48, 116, 119, 236, 154, 10, 164, 97, 161, 85, 101, 41, 143, 14, 152, + 194, 201, 53, 245, 36, 191, 58, 13, 175, 218, 194, 95, 41, 171, 78, + 107, 56, 81, 145, 202, 207, 156, 33, 252, 200, 87, 59, 21, 112, 94, + 21, 147, 114, 242, 141, 130, 151, 217, 249, 97, 244, 209, 28, 93, 15, + 63, 83, 230, 81, 180, 97, 231, 39, 139, 0, 86, 117, 221, 179, 217, + 169, 108, 239, 121, 33, 230, 176, 50, 148, 253, 29, 12, 233, 136, 178, + 20, 166, 4, 164, 44, 86, 193, 212, 184, 183, 116, 5, 20, 122, 29, + 65, 234, 84, 14, 204, 82, 131, 35, 225, 154, 128, 34, 80, 192, 243, + 42, 228, 182, 111, 27, 96, 130, 170, 248, 47, 144, 0, 232, 17, 202, + 82, 230, 180, 117, 208, 130, 127, 62, 123, 76, 21, 167, 161, 37, 192, + 166, 183, 78, 108, 202, 114, 36, 198, 145, 147, 210, 14, 150, 227, 143, + 37, 23, 127, 171, 234, 43, 152, 59, 191, 22, 126, 216, 168, 65, 86, + 145, 239, 110, 157, 188, 246, 84, 32, 115, 127, 128, 155, 81, 99, 159, + 60, 150, 26, 211, 130, 63, 160, 182, 249, 186, 127, 173, 87, 30, 163, + 242, 142, 220, 80, 98, 174, 18, 202, 66, 181, 148, 124, 22, 117, 46, + 180, 4, 66, 26, 18, 129, 35, 155, 27, 211, 56, 218, 80, 85, 133, + 253, 110, 36, 38, 232, 149, 10, 233, 176, 120, 33, 33, 212, 29, 202, + 106, 198, 234, 96, 53, 51, 39, 138, 133, 167, 240, 99, 184, 204, 168, + 123, 57, 62, 7, 200, 164, 31, 41, 127, 108, 135, 143, 244, 93, 225, + 6, 34, 108, 155, 25, 139, 112, 66, 8, 237, 23, 246, 90, 105, 170, + 247, 89, 252, 7, 176, 196, 221, 142, 199, 247, 143, 25, 192, 125, 25, + 85, 216, 163, 134, 199, 143, 201, 242, 130, 228, 22, 149, 59, 202, 233, + 168, 117, 237, 123, 177, 135, 164, 93, 106, 213, 212, 3, 225, 128, 157, + 107, 152, 133, 87, 162, 113, 34, 235, 130, 150, 197, 143, 8, 164, 152, + 180, 143, 250, 8, 101, 146, 40, 156, 17, 123, 198, 255, 132, 201, 1, + 241, 201, 195, 108, 138, 189, 234, 89, 57, 58, 230, 24, 75, 165, 9, + 187, 5, 176, 85, 101, 182, 202, 185, 180, 106, 40, 158, 53, 45, 8, + 72, 231, 92, 154, 131, 60, 104, 160, 129, 177, 82, 247, 221, 183, 170, + 104, 7, 56, 50, 10, 15, 101, 4, 240, 123, 202, 154, 136, 53, 126, + 214, 26, 237, 80, 136, 83, 63, 177, 86, 119, 29, 17, 27, 45, 131, + 134, 93, 202, 38, 58, 248, 109, 153, 145, 53, 186, 45, 147, 138, 35, + 142, 159, 24, 221, 157, 183, 101, 22, 115, 127, 253, 250, 139, 91, 230, + 26, 87, 134, 36, 123, 18, 195, 221, 118, 206, 14, 9, 1, 240, 248, + 67, 64, 235, 223, 215, 35, 219, 195, 216, 220, 221, 243, 13, 144, 166, + 87, 206, 43, 76, 54, 197, 158, 45, 108, 21, 46, 50, 162, 44, 166, + 53, 80, 210, 194, 88, 90, 183, 154, 180, 9, 221, 188, 10, 14, 255, + 60, 181, 34, 237, 200, 13, 55, 203, 139, 38, 27, 20, 20, 245, 202, + 28, 149, 126, 97, 200, 238, 125, 238, 202, 95, 33, 194, 134, 16, 171, + 171, 19, 183, 11, 186, 97, 214, 19, 41, 205, 141, 5, 185, 223, 244, + 177, 24, 194, 205, 156, 153, 128, 110, 174, 150, 247, 228, 69, 168, 48, + 67, 221, 202, 223, 22, 126, 38, 132, 117, 47, 34, 216, 204, 25, 250, + 224, 62, 84, 189, 28, 50, 136, 189, 167, 242, 146, 133, 124, 10, 226, + 81, 103, 73, 28, 6, 53, 54, 23, 201, 149, 150, 254, 172, 119, 125, + 14, 229, 179, 241, 131, 49, 176, 77, 194, 127, 23, 15, 33, 66, 66, + 247, 15, 7, 254, 131, 229, 239, 161, 251, 179, 98, 162, 2, 104, 105, + 32, 187, 46, 71, 87, 166, 196, 249, 226, 129, 106, 208, 205, 19, 175, + 176, 107, 63, 83, 28, 200, 242, 100, 21, 168, 42, 171, 129, 108, 51, + 77, 251, 105, 170, 20, 163, 241, 80, 105, 3, 16, 186, 18, 112, 20, + 153, 182, 39, 116, 244, 158, 220, 204, 203, 24, 192, 57, 185, 17, 51, + 33, 30, 247, 108, 89, 109, 6, 83, 249, 51, 193, 249, 1, 249, 186, + 243, 226, 63, 72, 59, 38, 141, 217, 218, 180, 98, 72, 194, 20, 145, + 224, 47, 142, 216, 134, 103, 23, 116, 3, 185, 223, 244, 177, 24, 194, + 205, 156, 153, 128, 110, 174, 150, 247, 228, 69, 168, 48, 67, 221, 202, + 223, 22, 126, 38, 132, 117, 47, 34, 216, 204, 25, 52, 46, 161, 208, + 98, 185, 155, 12, 161, 41, 153, 92, 211, 18, 65, 7, 41, 157, 26, + 153, 50, 39, 174, 204, 124, 17, 185, 20, 228, 212, 229, 38, 149, 167, + 214, 229, 94, 67, 48, 54, 60, 124, 30, 183, 79, 74, 161, 188, 38, + 157, 65, 210, 133, 187, 246, 18, 114, 33, 242, 113, 220, 203, 115, 20, + 71, 87, 166, 196, 249, 226, 129, 106, 208, 205, 19, 175, 176, 107, 63, + 83, 28, 200, 242, 100, 21, 168, 42, 171, 129, 108, 51, 77, 251, 105, + 170, 20, 38, 79, 195, 27, 199, 164, 64, 73, 125, 105, 102, 24, 1, + 170, 71, 31, 191, 14, 20, 93, 11, 45, 47, 249, 38, 153, 192, 114, + 251, 82, 90, 159, 149, 96, 16, 126, 218, 194, 35, 223, 75, 211, 253, + 177, 110, 17, 5, 131, 14, 171, 56, 249, 250, 122, 195, 39, 52, 44, + 114, 154, 14, 14, 221, 13}; + + constexpr static Point kAdviceCommitments[][5] = { + {{"0x21b657ef880458c04e6f90cb1d52d99e3c4f275f62463f91316ce6e89a7727b0", + "0x018e7e556102c958d925644e9fdec38e1b6c88572a98ce9871485937ff5c9aa4"}, + {"0x1cdeebb09fa825fe5ee9bd16d16ddb62866f26077a8607f5be81f7f45ac3606f", + "0x0dd225bfadd39c83ca40e0a578ae098e3dce0b62b8bbf3445e63fe035c71ce09"}, + {"0x1422edcd2b94cb798037fed6eee6061495ef3679ec4f9d89edda2e6f9ef299eb", + "0x07aff8c1c8c754b022575c2e7e2f98483f08111f3dc0a9d7e2b119c5063c97b9"}, + {"0x26d69af68d0081752eb20fba0c186241da3677528ef11c81c234981b9feb7768", + "0x0cb675234a966e9b7fe6f87c6da86e5b3d534330dd6ebc08302da54ccee2352f"}, + {"0x133c73d35676d200d9951b8a8cdd8719fc73de2bf26dcd8246efb8137e90c635", + "0x1eb2849fbface2516b2dfa0d9ed2ec2b397a04ae228a2541d32bc83bb429de30"}}, + {{"0x21b657ef880458c04e6f90cb1d52d99e3c4f275f62463f91316ce6e89a7727b0", + "0x018e7e556102c958d925644e9fdec38e1b6c88572a98ce9871485937ff5c9aa4"}, + {"0x1cdeebb09fa825fe5ee9bd16d16ddb62866f26077a8607f5be81f7f45ac3606f", + "0x0dd225bfadd39c83ca40e0a578ae098e3dce0b62b8bbf3445e63fe035c71ce09"}, + {"0x1422edcd2b94cb798037fed6eee6061495ef3679ec4f9d89edda2e6f9ef299eb", + "0x07aff8c1c8c754b022575c2e7e2f98483f08111f3dc0a9d7e2b119c5063c97b9"}, + {"0x26d69af68d0081752eb20fba0c186241da3677528ef11c81c234981b9feb7768", + "0x0cb675234a966e9b7fe6f87c6da86e5b3d534330dd6ebc08302da54ccee2352f"}, + {"0x133c73d35676d200d9951b8a8cdd8719fc73de2bf26dcd8246efb8137e90c635", + "0x1eb2849fbface2516b2dfa0d9ed2ec2b397a04ae228a2541d32bc83bb429de30"}}, + }; + + constexpr static std::string_view kTheta = + "0x1def3cccec9613b680e85b2aec2964d537bf3f8f37c252ec6259cc42c5e4edf8"; + + constexpr static Point kLookupMPolyCommitments[][2] = { + {{"0x165319be6c851d9bcc3765d35c7dd5063d086088be3a7276258e652e5e100b91", + "0x18d64c0b3f9bbd9906c18a8c4fd25e0e257359724c94dadc36d6fbab29225117"}, + {"0x0e0013706ff201fca5273dba5d150929ea87c907415a7157788df9b41a56e35a", + "0x1ee1ec24db5cd1a84ff590c7a4b3f936f0d92990d1b3fa21169af793b9978bae"}}, + {{"0x165319be6c851d9bcc3765d35c7dd5063d086088be3a7276258e652e5e100b91", + "0x18d64c0b3f9bbd9906c18a8c4fd25e0e257359724c94dadc36d6fbab29225117"}, + {"0x0e0013706ff201fca5273dba5d150929ea87c907415a7157788df9b41a56e35a", + "0x1ee1ec24db5cd1a84ff590c7a4b3f936f0d92990d1b3fa21169af793b9978bae"}}}; + + constexpr static std::string_view kBeta = + "0x3046300190b95e3915054db9d14dc6c94bd8d5525563d0007c7db20ea4c7ab58"; + + constexpr static std::string_view kGamma = + "0x27e62392a6714c061bf2908ac317749c79783076d2814fa1369c9cf1a9038844"; + + constexpr static Point kPermutationProductCommitments[][2] = { + {{"0x07fb8a6508494cb1d423b264cf3f8673a4f868ac008da0552329e02964f8a59b", + "0x08c97f9753387d763f47a74e89ced2c6609bdaa4b35d00389b9a2f5eb0952cb8"}, + {"0x0262a880d213cffa2d105cd31b089c227a5ced69309a8d8c56a7fdd34892fb1e", + "0x2853361cd32d728b82f8707b858c329db9030303f2f19a96f13f578a11e86288"}}, + {{"0x05c7528ab39da45df5911e763dda6187f207022673de6c19421e044756b01f78", + "0x05c30b4d4620a47ea313535c08a3970c8a09e7136f0e5c865aff40092a7ff318"}, + {"0x04e92d1da1abe325f5c02a23532c264d0716c1f464fb358311cc9a80292ff15f", + "0x1413f36166810082edec8b75bb4394035e805bdd7c55081f4daf484176907039"}}}; + + constexpr static Point kLookupSumCommitments[][2] = { + {{"0x19d9c1f33e0be75ed94a81af3992e4a2ee2efe80f68a8bdca427f2eed9f1eb01", + "0x11117061498a35721a826cc06c0c17011f8869e123a9b748f0b49d891d19acb7"}, + {"0x02439a591fe7227b46e34ee86ec1a699801a79b8e6d0dfce3b7e5f7d5a7265d9", + "0x2000e3dc8295988f3f7a30c87cf15c2edcc0e5fa06a47943bb0f4ca3d79daf45"}}, + {{"0x1a9e71770f817b1d73f5dfad8c520e397759d5d5def821a0e1459874550bf7b2", + "0x21f7fca9bfb7accb8f3ad13b335fe15e9df49ddcb0e69b4fc8d9b3e3cad64321"}, + {"0x20914ebaacd1e1102fc1456c474badc62cb427759079ccc9ea41b021a3b64ecc", + "0x2c943fe02c3e142ff8e0b47804832718a682ac4a7e284cd04da8c21a14f0149a"}}}; + + constexpr static std::string_view kY = + "0x258baabf980fe1cff150d5594d36ede2f15e3b6dbdcb802a4aecb02fccf18bca"; + + constexpr static Point kVanishingHPolyCommitments[] = { + {"0x22565a08c3dc468f804809ab3991fb4a2efad88c6594952a08b0d6ec2c12a3ab", + "0x1ee398fea86ce8a5c0f7b49b2a42ffaab0b882b0441342b0f6efc3553bec3fe9"}, + {"0x1b7633c72071697866ca8d80960fb92f2e066724a8763bf17a2e226b691d3d2f", + "0x2729c1474a52a5100ad1bb7adea68878548e5d793e4f40b918c478f083c982bd"}, + {"0x24409e2da4b61086b8df6af522a04a6d5cfa51c5960948272bdc3392ece87be8", + "0x0cacb7daa3a626477f27d1037ce6e587a19c24ed02de2236dc32c2d29b36000f"}, + {"0x1a3127db215552fd9596048000fb00b8f238f23583b81acbac0772ef4a6e5d0d", + "0x1225f5dae543b2436bfc9e43b65fadba5dcca0575f6f5327efa83142880d8787"}, + {"0x2d05a187d2bb541368d5b0dfe4740e4a8425200decd82685befa6f3c6ec47a47", + "0x2a9710283a74b8325f4e2e4b4a972834ca374bcfe070602fd0b74b3415ea4dea"}, + {"0x1baf5eb88ca86bd5f1a2fa17d9a8c57dcaeaa9e39495a512e30dbf9b2bfd4da7", + "0x10c0b46a073b6760fbe55ade17726a676cfa34ed23fdb9495df531e741cfabbf"}, + {"0x032acadf58f9bc8550bf0db9db073199db540b079642f3c9c75c6373ac854693", + "0x2e8e7b7c3a49d5f5e933e4219e664515bf4bd8acea1f2a7b655370db11952901"}, + {"0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000"}, + }; + + constexpr static std::string_view kX = + "0x19ec88a8d1011e1b6ee38def9851b9f1cc97981b4d56dc58fd8ae7399eae472c"; + + constexpr static std::string_view kAdviceEvals[][7] = { + {"0x03c7578cd3e3d4126f5580ccc73eec43debab39443d5fb9e97bcd661a28b2e03", + "0x3005bf47801af1dd762962f9ac1fd79bf7b0d1aab7b427b5e29839f07c65f496", + "0x1f89375909a36a76a107cd384eabb6a4df0800cb7c8198a113f2151472486d5f", + "0x0796f121e12c176faebbe5091a34772edb00e0ca90c90a1fff9882fbabddfd78", + "0x023573c3afd0b99dd0fe50f03a7c8c2e3ec745543a8769627011179e1816f26f", + "0x2ac3cea25a24284f6d22e3f9f68b3d851476c8afb61f5716560c648a4863d126", + "0x07ba39fc760046932243bf2632a1f1c0854e871185d24d34f8de6115a47a3c23"}, + {"0x03c7578cd3e3d4126f5580ccc73eec43debab39443d5fb9e97bcd661a28b2e03", + "0x3005bf47801af1dd762962f9ac1fd79bf7b0d1aab7b427b5e29839f07c65f496", + "0x1f89375909a36a76a107cd384eabb6a4df0800cb7c8198a113f2151472486d5f", + "0x0796f121e12c176faebbe5091a34772edb00e0ca90c90a1fff9882fbabddfd78", + "0x023573c3afd0b99dd0fe50f03a7c8c2e3ec745543a8769627011179e1816f26f", + "0x2ac3cea25a24284f6d22e3f9f68b3d851476c8afb61f5716560c648a4863d126", + "0x07ba39fc760046932243bf2632a1f1c0854e871185d24d34f8de6115a47a3c23"}}; + + constexpr static std::string_view kFixedEvals[] = { + "0x225b760b98e40fcbbc4fc50061c367a2c679b1e6cf432bfd9cc8afb9f2e5e738", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x09a03abe21d8e25006c81a496c27dac8f5bfb5ed58dd8015b4e513ff819fbf90", + "0x09a03abe21d8e25006c81a496c27dac8f5bfb5ed58dd8015b4e513ff819fbf90", + "0x136edfe5731e6ea87d02c25bd42eebd9e3c1a9afd05e81ddb6362a129a9a02d7", + "0x09cea52751458c58763aa81268071110ee01f3c2778101c80151161318fa4347", + "0x0660e5be4e2f16a756ed5d471cabf45a9b886db68aeec6229f9f115f9968dbf9", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000"}; + + constexpr static std::string_view kCommonPermutationEvals[] = { + "0x25a627af23f00f08074d64bd2f1bd7920e009c574c02af3be0efc3cd54f62034", + "0x2b4b2ff6b18f2ac82cb8086939bc98891106106219ccaf5ad85acec82e14a98b", + "0x0893e21c01be42bba30bfb77d74a890909c5025d3107ec72d58ce4e27ca3c57a", + "0x0670ecd32d49fd8fadc1a0cd5029a505d06a7ec7b1f1322ab80115fbc0183413", + "0x108a52132ae9f5d8f40c727484c701e5352d3b8366cd12154c018769a23e9fd8", + "0x0a9aec777430adcdfe4a0810c7990cbe3ef08ffc334e298b5a951d8324a85b75", + "0x219ccfca9151386b4eab295fc2daaf0d3abf24f535c9c2980e8f296555a161a4", + "0x008b27e761b451e6533f0f5d1cd1f461f9d997828df27293155e70153b57c8fc", + "0x0574b7b8d4c1562ca404a614b288e90c1dfd9432b0e62179ef6ca9d9b3dd7556", + "0x11e800902ff8aa82601b6fb6e42af3c05022809ae1238352cc0e54ea411d7a14", + "0x258fe3960ed29391c62472ca6c4eb7a6c025a1a7154c7b3e7f82d075b4e652ca", + "0x1a963c9f63519b807f732054f6bc9d6eef915641a8d87e16bf3b982beaab7f17"}; + + constexpr static std::string_view kPermutationProductEvals[][2] = { + {"0x121a4204b42e75167c94b542ca12ae6250dc8ef2a31e57ad7fbaf9b6a03f82d3", + "0x16e482f2c98fc786a3d855197dc0198ff7c78eddc4b007fc59f7aa695af617ed"}, + {"0x09a54b18e63a3959eabd8a6cc3c9f101c984ffc67b119c28926508fa8fb498a4", + "0x127b2486571ae65b8bfafd7f731665b79ddd189f8e238a932dba3591996df83a"}}; + + constexpr static std::string_view kLookupSumEvals[][2] = { + {"0x268bcb370dc8ed22b53cff0e0abcdd09b49ab75a58c2d25035a62ca2322e156c", + "0x0e7d77acfe9695c9173635061c496751e20a7c8592f2a7bd88321cbd543ee0fa"}, + {"0x066d596cf71e213311b939c018cbccdc9ef47427b699147012ba10036950f1a3", + "0x26e5d4e414b9117cccae2732991a9d29074112d35c9929a10c9bb962d0a12e34"}}; + + constexpr static std::string_view kPermutationProductNextEvals[][2] = { + {"0x27333560eac66aca1dd4212178b0e90a95e826246efd855550da38d31b9b2381", + "0x088fc59682eb2271a25785986b9d80e103d4d56a5da487b17bed75a8e9ca3b95"}, + {"0x0768aab7ddf752b181a0683c839a5ce748082d359e286ab4b9cab66555b005bb", + "0x2d9ec5364c2bce57a6900df3dddcd8c3db23d7dfeb4043f8f001090ece76ddc3"}}; + + constexpr static std::string_view kLookupSumNextEvals[][2] = { + {"0x058dcd2913d661ba0bb713abab1086c2215fcaee7deec8617e951ccaf514141b", + "0x2ebb20696802a262b3fba1efe583fe070ff74242210f177fc24db03183f1b3e5"}, + {"0x0374176786d88e2fe09114c24862b4dad98d263b483fe2f3baf901f9c133f953", + "0x1473cbdc71f2217212f6bb85d2419d26bca14a4fb71e7c3c3630435ee5d6a795"}}; + + constexpr static std::string_view kPermutationProductLastEvals[][2] = { + {"0x0842708b199b6c2206e15df48f876c7f291fa4c8073e397ba8ccb863f0a7858a", + ""}, + {"0x26ca5d86832d1b111d7756b13f538850ed1ad67e35889aca7bf004650f0a3238", + ""}}; + + constexpr static std::string_view kLookupMEvals[][2] = { + {"0x19ccd8222f7584267e16dfcadd4330a845e4f796ae6e80999ccdc218b1f4dfb9", + "0x14aa69fb4d336c81ab2aa81564f2c81c533f6bb0af13cdd06a81e2f9c4a65747"}, + {"0x19ccd8222f7584267e16dfcadd4330a845e4f796ae6e80999ccdc218b1f4dfb9", + "0x14aa69fb4d336c81ab2aa81564f2c81c533f6bb0af13cdd06a81e2f9c4a65747"}}; + + constexpr static std::string_view kHEval = + "0x1fdf0e433457366df9201b9b14aab986bdc086e32e7c1a63f81cf111d503ba9b"; + + static void TestConfig(MultiLookupCircuitConfig& config) {} + + static Circuit GetCircuit() { + F a = *F::FromHexString( + "0x76a69c75ed45f60e667fb401dd42f877b565f7818b1d94188fb67249"); + F instance = F(2); + std::vector lookup_table = {instance, a, a, F::Zero()}; + return Circuit(std::move(a), std::move(lookup_table)); + } + + static std::vector Get2Circuits() { + Circuit circuit = GetCircuit(); + return {circuit, std::move(circuit)}; + } + + static std::vector GetInstanceColumns() { + F instance = F(2); + std::vector instance_column = {std::move(instance)}; + return {Evals(std::move(instance_column))}; + } +}; + +// PCS = GWC +template +class MultiLookupTestData>> + : public CircuitTestData { + public: + using F = typename PCS::Field; + using Evals = typename PCS::Evals; + + // Set flags of values to be used as true + constexpr static bool kAdviceCommitmentsFlag = true; + constexpr static bool kLookupMPolyCommitmentsFlag = true; + constexpr static bool kPermutationProductCommitmentsFlag = true; + constexpr static bool kLookupSumCommitmentsFlag = true; + constexpr static bool kVanishingHPolyCommitmentsFlag = true; + constexpr static bool kAdviceEvalsFlag = true; + constexpr static bool kFixedEvalsFlag = true; + constexpr static bool kCommonPermutationEvalsFlag = true; + constexpr static bool kPermutationProductEvalsFlag = true; + constexpr static bool kLookupSumEvalsFlag = true; + constexpr static bool kPermutationProductNextEvalsFlag = true; + constexpr static bool kLookupSumNextEvalsFlag = true; + constexpr static bool kPermutationProductLastEvalsFlag = true; + constexpr static bool kLookupMEvalsFlag = true; + + constexpr static size_t kN = 32; + + constexpr static std::string_view kPinnedConstraintSystem = ""; + + constexpr static bool kCycleStoreSelectors[][kN] = {{}}; + + constexpr static std::string_view kPinnedVerifyingKey = ""; + + constexpr static std::string_view kTranscriptRepr = ""; + + constexpr static uint8_t kProof[] = { + 176, 39, 119, 154, 232, 230, 108, 49, 145, 63, 70, 98, 95, 39, 79, + 60, 158, 217, 82, 29, 203, 144, 111, 78, 192, 88, 4, 136, 239, 87, + 182, 33, 111, 96, 195, 90, 244, 247, 129, 190, 245, 7, 134, 122, 7, + 38, 111, 134, 98, 219, 109, 209, 22, 189, 233, 94, 254, 37, 168, 159, + 176, 235, 222, 156, 235, 153, 242, 158, 111, 46, 218, 237, 137, 157, 79, + 236, 121, 54, 239, 149, 20, 6, 230, 238, 214, 254, 55, 128, 121, 203, + 148, 43, 205, 237, 34, 148, 104, 119, 235, 159, 27, 152, 52, 194, 129, + 28, 241, 142, 82, 119, 54, 218, 65, 98, 24, 12, 186, 15, 178, 46, + 117, 129, 0, 141, 246, 154, 214, 166, 53, 198, 144, 126, 19, 184, 239, + 70, 130, 205, 109, 242, 43, 222, 115, 252, 25, 135, 221, 140, 138, 27, + 149, 217, 0, 210, 118, 86, 211, 115, 60, 19, 176, 39, 119, 154, 232, + 230, 108, 49, 145, 63, 70, 98, 95, 39, 79, 60, 158, 217, 82, 29, + 203, 144, 111, 78, 192, 88, 4, 136, 239, 87, 182, 33, 111, 96, 195, + 90, 244, 247, 129, 190, 245, 7, 134, 122, 7, 38, 111, 134, 98, 219, + 109, 209, 22, 189, 233, 94, 254, 37, 168, 159, 176, 235, 222, 156, 235, + 153, 242, 158, 111, 46, 218, 237, 137, 157, 79, 236, 121, 54, 239, 149, + 20, 6, 230, 238, 214, 254, 55, 128, 121, 203, 148, 43, 205, 237, 34, + 148, 104, 119, 235, 159, 27, 152, 52, 194, 129, 28, 241, 142, 82, 119, + 54, 218, 65, 98, 24, 12, 186, 15, 178, 46, 117, 129, 0, 141, 246, + 154, 214, 166, 53, 198, 144, 126, 19, 184, 239, 70, 130, 205, 109, 242, + 43, 222, 115, 252, 25, 135, 221, 140, 138, 27, 149, 217, 0, 210, 118, + 86, 211, 115, 60, 19, 145, 11, 16, 94, 46, 101, 142, 37, 118, 114, + 58, 190, 136, 96, 8, 61, 6, 213, 125, 92, 211, 101, 55, 204, 155, + 29, 133, 108, 190, 25, 83, 150, 90, 227, 86, 26, 180, 249, 141, 120, + 87, 113, 90, 65, 7, 201, 135, 234, 41, 9, 21, 93, 186, 61, 39, + 165, 252, 1, 242, 111, 112, 19, 0, 14, 145, 11, 16, 94, 46, 101, + 142, 37, 118, 114, 58, 190, 136, 96, 8, 61, 6, 213, 125, 92, 211, + 101, 55, 204, 155, 29, 133, 108, 190, 25, 83, 150, 90, 227, 86, 26, + 180, 249, 141, 120, 87, 113, 90, 65, 7, 201, 135, 234, 41, 9, 21, + 93, 186, 61, 39, 165, 252, 1, 242, 111, 112, 19, 0, 14, 132, 115, + 189, 133, 64, 18, 27, 140, 223, 110, 19, 38, 241, 130, 119, 16, 106, + 224, 106, 84, 177, 254, 111, 140, 5, 235, 61, 108, 131, 55, 205, 30, + 30, 251, 146, 72, 211, 253, 167, 86, 140, 141, 154, 48, 105, 237, 92, + 122, 34, 156, 8, 27, 211, 92, 16, 45, 250, 207, 19, 210, 128, 168, + 98, 2, 165, 181, 214, 240, 124, 142, 34, 61, 162, 252, 113, 210, 98, + 252, 101, 20, 72, 239, 196, 84, 53, 143, 58, 159, 179, 97, 30, 246, + 90, 138, 247, 128, 95, 241, 47, 41, 128, 154, 204, 17, 131, 53, 251, + 100, 244, 193, 22, 7, 77, 38, 44, 83, 35, 42, 192, 245, 37, 227, + 171, 161, 29, 45, 233, 132, 178, 26, 140, 203, 203, 181, 235, 41, 44, + 0, 97, 58, 205, 228, 63, 125, 147, 167, 152, 255, 151, 12, 53, 5, + 226, 236, 200, 79, 159, 149, 127, 25, 78, 149, 15, 77, 81, 165, 150, + 6, 159, 163, 119, 174, 27, 56, 200, 68, 12, 215, 63, 168, 60, 60, + 103, 221, 230, 134, 35, 198, 220, 150, 131, 169, 171, 29, 4, 46, 54, + 83, 49, 122, 141, 77, 236, 133, 127, 30, 136, 56, 70, 246, 218, 221, + 210, 52, 105, 139, 190, 228, 83, 183, 215, 8, 34, 136, 221, 245, 164, + 37, 19, 224, 16, 120, 5, 92, 135, 75, 24, 102, 217, 203, 137, 160, + 20, 155, 177, 81, 50, 101, 127, 112, 247, 100, 6, 255, 241, 144, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 253, 201, 191, 13, 127, 235, 118, 250, 13, 251, 120, 240, 60, 14, + 171, 5, 13, 197, 2, 134, 207, 85, 243, 188, 161, 175, 88, 136, 210, + 118, 110, 31, 178, 213, 75, 243, 59, 215, 193, 215, 220, 156, 220, 143, + 144, 61, 160, 73, 171, 78, 114, 217, 97, 74, 152, 27, 81, 187, 60, + 126, 162, 8, 113, 161, 125, 238, 51, 144, 232, 254, 136, 48, 49, 2, + 241, 47, 161, 224, 6, 70, 191, 20, 145, 153, 80, 153, 29, 97, 152, + 200, 163, 215, 171, 119, 125, 161, 75, 202, 189, 41, 120, 41, 162, 3, + 210, 214, 147, 141, 1, 151, 137, 122, 221, 152, 209, 204, 248, 21, 70, + 231, 97, 199, 78, 225, 212, 47, 204, 149, 223, 123, 37, 37, 80, 185, + 225, 231, 78, 183, 208, 107, 76, 229, 176, 114, 89, 128, 167, 177, 221, + 55, 136, 172, 227, 90, 4, 92, 158, 215, 36, 133, 117, 149, 204, 63, + 42, 255, 240, 30, 157, 95, 227, 153, 212, 43, 246, 206, 0, 26, 69, + 2, 149, 0, 234, 247, 109, 207, 100, 33, 12, 105, 134, 4, 88, 187, + 235, 176, 83, 215, 210, 241, 30, 58, 125, 224, 162, 128, 8, 46, 27, + 95, 70, 3, 219, 62, 221, 165, 104, 80, 87, 251, 186, 248, 110, 142, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 104, 229, 79, 122, 27, 131, 115, 122, 163, 229, 91, 12, 188, + 150, 88, 242, 22, 66, 185, 167, 6, 47, 38, 227, 165, 133, 27, 52, + 39, 6, 8, 37, 104, 229, 79, 122, 27, 131, 115, 122, 163, 229, 91, + 12, 188, 150, 88, 242, 22, 66, 185, 167, 6, 47, 38, 227, 165, 133, + 27, 52, 39, 6, 8, 37, 60, 249, 158, 169, 160, 103, 99, 174, 184, + 234, 53, 3, 113, 249, 227, 59, 104, 227, 18, 210, 22, 217, 65, 236, + 106, 181, 49, 243, 176, 208, 24, 11, 33, 121, 75, 159, 125, 152, 82, + 122, 196, 109, 235, 44, 236, 4, 6, 85, 16, 110, 149, 57, 158, 137, + 74, 101, 217, 160, 83, 148, 151, 192, 214, 15, 250, 11, 101, 176, 192, + 118, 15, 88, 221, 15, 121, 109, 60, 80, 55, 42, 206, 224, 64, 52, + 255, 150, 84, 45, 218, 62, 247, 217, 202, 8, 28, 2, 54, 92, 34, + 225, 103, 65, 55, 165, 149, 199, 84, 192, 76, 229, 48, 177, 246, 126, + 108, 204, 141, 171, 127, 254, 22, 42, 228, 199, 238, 110, 255, 26, 78, + 234, 79, 77, 165, 113, 32, 156, 243, 79, 84, 94, 127, 160, 205, 225, + 63, 187, 84, 67, 180, 31, 21, 100, 103, 219, 148, 90, 177, 204, 124, + 38, 159, 164, 167, 30, 91, 177, 250, 232, 72, 132, 91, 229, 10, 237, + 243, 0, 38, 55, 58, 107, 159, 34, 182, 46, 21, 199, 93, 226, 91, + 106, 179, 35, 254, 19, 62, 87, 115, 190, 171, 21, 18, 190, 6, 33, + 0, 32, 27, 188, 52, 192, 130, 148, 232, 35, 210, 214, 136, 110, 112, + 19, 13, 4, 205, 31, 60, 249, 158, 169, 160, 103, 99, 174, 184, 234, + 53, 3, 113, 249, 227, 59, 104, 227, 18, 210, 22, 217, 65, 236, 106, + 181, 49, 243, 176, 208, 24, 11, 33, 121, 75, 159, 125, 152, 82, 122, + 196, 109, 235, 44, 236, 4, 6, 85, 16, 110, 149, 57, 158, 137, 74, + 101, 217, 160, 83, 148, 151, 192, 214, 15, 250, 11, 101, 176, 192, 118, + 15, 88, 221, 15, 121, 109, 60, 80, 55, 42, 206, 224, 64, 52, 255, + 150, 84, 45, 218, 62, 247, 217, 202, 8, 28, 2, 54, 92, 34, 225, + 103, 65, 55, 165, 149, 199, 84, 192, 76, 229, 48, 177, 246, 126, 108, + 204, 141, 171, 127, 254, 22, 42, 228, 199, 238, 110, 255, 26, 78, 234, + 79, 77, 165, 113, 32, 156, 243, 79, 84, 94, 127, 160, 205, 225, 63, + 187, 84, 67, 180, 31, 21, 100, 103, 219, 148, 90, 177, 204, 124, 38, + 159, 164, 167, 30, 91, 177, 250, 232, 72, 132, 91, 229, 10, 237, 243, + 0, 38, 55, 58, 107, 159, 34, 182, 46, 21, 199, 93, 226, 91, 106, + 179, 35, 254, 19, 62, 87, 115, 190, 171, 21, 18, 190, 6, 33, 0, + 32, 27, 188, 52, 192, 130, 148, 232, 35, 210, 214, 136, 110, 112, 19, + 13, 4, 205, 31, 92, 175, 172, 229, 53, 158, 56, 164, 48, 245, 13, + 192, 53, 239, 17, 95, 200, 155, 84, 29, 222, 228, 159, 157, 245, 169, + 246, 128, 26, 83, 11, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, 163, 148, 244, 59, + 178, 132, 226, 186, 63, 205, 255, 22, 245, 201, 192, 9, 147, 186, 147, + 215, 147, 72, 146, 209, 178, 178, 254, 16, 22, 208, 3, 200, 163, 148, + 244, 59, 178, 132, 226, 186, 63, 205, 255, 22, 245, 201, 192, 9, 147, + 186, 147, 215, 147, 72, 146, 209, 178, 178, 254, 16, 22, 208, 3, 38, + 152, 160, 113, 80, 164, 112, 40, 224, 205, 173, 192, 238, 247, 191, 12, + 115, 140, 197, 45, 165, 244, 180, 142, 254, 89, 16, 180, 46, 141, 10, + 15, 94, 244, 11, 125, 20, 242, 235, 69, 37, 142, 224, 192, 215, 2, + 246, 75, 105, 249, 10, 154, 205, 96, 108, 252, 44, 167, 93, 181, 29, + 119, 58, 11, 180, 242, 39, 189, 141, 193, 57, 189, 209, 242, 45, 6, + 94, 75, 44, 121, 11, 161, 220, 83, 131, 23, 147, 241, 210, 194, 13, + 154, 19, 3, 132, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 209, + 249, 39, 40, 14, 250, 223, 128, 154, 103, 254, 123, 30, 164, 204, 90, + 127, 249, 14, 224, 171, 161, 148, 97, 46, 247, 159, 47, 162, 158, 27, + 18, 0, 16, 51, 145, 127, 176, 160, 74, 162, 248, 192, 40, 160, 50, + 109, 228, 248, 118, 83, 58, 148, 93, 130, 214, 128, 251, 173, 169, 220, + 17, 34, 38, 192, 31, 20, 239, 62, 246, 207, 50, 199, 190, 28, 39, + 99, 140, 18, 94, 180, 230, 234, 53, 196, 47, 66, 223, 93, 123, 63, + 221, 209, 116, 45, 101, 87, 224, 44, 77, 94, 20, 199, 56, 144, 198, + 234, 21, 88, 41, 59, 10, 63, 146, 207, 95, 148, 81, 107, 67, 163, + 61, 184, 41, 240, 131, 43, 101, 76, 57, 154, 130, 237, 142, 180, 33, + 243, 236, 67, 147, 159, 227, 161, 21, 243, 183, 143, 139, 249, 0, 82, + 151, 83, 70, 130, 241, 232, 189, 18, 73, 172, 217, 172, 159, 125, 116, + 224, 69, 134, 105, 139, 212, 106, 48, 217, 24, 69, 63, 41, 194, 48, + 15, 47, 88, 36, 43, 177, 114, 34, 135, 46, 56, 112, 145, 120, 109, + 127, 124, 95, 181, 200, 1, 236, 185, 10, 109, 138, 144, 57, 113, 243, + 253, 104, 33, 35, 11, 244, 217, 156, 215, 96, 111, 14, 73, 38, 125, + 62, 223, 153, 68, 39, 124, 152, 62, 3, 149, 12, 0, 146, 27, 45, + 181, 240, 136, 32, 239, 69, 85, 136, 212, 54, 11, 38, 175, 24, 183, + 236, 251, 194, 17, 31, 230, 19, 23, 140, 67, 32, 143, 117, 193, 175, + 105, 123, 48, 132, 155, 237, 244, 113, 145, 150, 232, 171, 246, 255, 186, + 10, 182, 128, 202, 55, 27, 164, 240, 141, 163, 195, 228, 137, 32, 48, + 94, 103, 217, 184, 231, 190, 188, 73, 84, 50, 86, 87, 141, 58, 155, + 95, 165, 6, 181, 248, 124, 211, 252, 222, 184, 151, 250, 42, 114, 85, + 174, 25, 141, 187, 242, 90, 50, 75, 64, 56, 193, 208, 72, 237, 194, + 139, 67, 232, 150, 44, 175, 9, 216, 228, 112, 199, 228, 165, 152, 246, + 71, 255, 225, 163, 197, 101, 103, 192, 88, 89, 148, 180, 112, 162, 235, + 170, 127, 119, 116, 169, 149, 17, 241, 192, 232, 67, 83, 118, 153, 140, + 252, 234, 47, 126, 83, 31, 189, 29, 162, 122, 39, 152, 166, 184, 125, + 175, 103, 173, 123, 147, 200, 29, 66, 19, 34, 66, 134, 51, 164, 131, + 115, 39, 50, 187, 164, 149, 18, 119, 211, 118, 116, 199, 137, 175, 8, + 245, 152, 120, 171, 38, 101, 232, 96, 161, 253, 33, 249, 249, 241, 215, + 253, 250, 96, 250, 108, 202, 133, 119, 34, 160, 32, 76, 55, 170, 202, + 186, 111, 49, 152, 152, 129, 231, 188, 117, 84, 27, 161, 10, 0, 88, + 101, 188, 79, 146, 117, 247, 132, 237, 182, 156, 133, 193, 29, 95, 183, + 201, 142, 199, 52, 153, 131, 13, 122, 138, 73, 136, 247, 218, 32, 14, + 39, 15, 95, 129, 82, 164, 177, 15, 5, 219, 134, 159, 209, 225, 246, + 132, 199, 86, 217, 26, 108, 243, 90, 89, 94, 130, 175, 239, 8, 20, + 253, 45, 91, 187, 73, 145, 58, 50, 37, 218, 166, 77, 138, 208, 55, + 191, 154, 218, 250, 163, 71, 250, 23, 228, 228, 109, 108, 104, 156, 120, + 16, 206, 212, 10, 176, 163, 59, 101, 66, 65, 113, 133, 115, 120, 81, + 86, 179, 136, 92, 46, 127, 231, 190, 99, 20, 252, 54, 27, 161, 197, + 154, 164, 126, 164, 7, 26, 153, 187, 201, 166, 19, 62, 229, 183, 169, + 27, 182, 194, 238, 32, 176, 97, 221, 78, 249, 176, 211, 220, 159, 20, + 123, 61, 137, 61, 129, 215, 53, 24, 145, 173, 124, 173, 15, 138, 242, + 237, 48, 184, 230, 48, 156, 74, 78, 252, 142, 141, 10, 67, 213, 120, + 183, 163, 233, 226, 249, 128, 23, 108, 60, 16, 127, 23, 171, 16, 98, + 170, 188, 51, 179, 48, 28, 162, 22, 128, 216, 4, 45, 140, 7, 120, + 239, 26, 122, 116, 217, 180, 76, 178, 3, 172, 133, 15, 176, 64, 220, + 18, 43, 110, 165, 252, 230, 167, 167, 204, 148, 185, 28, 32, 187, 28, + 188, 0, 110, 45, 181, 202, 243, 103, 71, 68, 6, 226, 125, 39, 42, + 198, 74, 149, 6, 184, 247, 196, 23, 63, 47, 233, 150, 213, 167, 85, + 220, 14, 176, 33, 202, 45, 177, 255, 0, 154, 172, 5, 78, 52, 61, + 12, 249, 181, 86, 190, 142, 157, 134, 50, 208, 67, 245, 217, 155, 59, + 229, 68, 65, 230, 111, 106, 179, 183, 251, 33, 55, 172, 168, 134, 180, + 131, 102, 13, 147, 131, 218, 173, 50, 142, 195, 218, 49, 61, 59, 88, + 146, 143, 233, 51, 84, 118, 166, 105, 245, 254, 65, 78, 87, 148, 181, + 169, 193, 102, 176, 13, 91, 216, 53, 168, 240, 151, 190, 104, 4, 135, + 71, 116, 232, 37, 21, 124, 53, 68, 30, 25, 149, 206, 184, 130, 119, + 83, 127, 92, 188, 168, 162, 37, 63, 166, 14, 198, 49, 6, 236, 212, + 49, 180, 37, 89, 0, 125, 172, 228, 227, 63, 220, 246, 235, 239, 29, + 14, 245, 39, 167, 186, 243, 141, 225, 45, 52, 44, 103, 174, 202, 56, + 248, 248, 154, 97, 108, 245, 2, 175, 62, 214, 210, 102, 0, 189, 234, + 214, 240, 213, 45, 173, 83, 100, 104, 92, 127, 46, 54, 192, 206, 157, + 235, 244, 66, 56, 147, 72, 136, 121, 122, 177, 19, 134, 15, 170, 40, + 7, 54, 244, 127, 221, 32, 208, 44, 142, 186, 96, 121, 22, 249, 181, + 86, 190, 142, 157, 134, 50, 208, 67, 245, 217, 155, 59, 229, 68, 65, + 230, 111, 106, 179, 183, 251, 33, 55, 172, 168, 134, 180, 131, 102, 13, + 182, 146, 152, 152, 32, 16, 130, 12, 254, 109, 204, 46, 181, 162, 119, + 215, 83, 150, 5, 215, 52, 75, 29, 233, 67, 25, 128, 87, 24, 21, + 29, 23, 204, 8, 193, 60, 31, 210, 117, 157, 185, 35, 65, 85, 176, + 243, 126, 199, 177, 10, 70, 19, 191, 24, 11, 195, 13, 69, 145, 165, + 10, 15, 173, 47, 63, 166, 14, 198, 49, 6, 236, 212, 49, 180, 37, + 89, 0, 125, 172, 228, 227, 63, 220, 246, 235, 239, 29, 14, 245, 39, + 167, 186, 243, 141, 225, 45, 215, 176, 145, 51, 93, 196, 185, 135, 62, + 28, 52, 79, 252, 246, 22, 215, 56, 191, 229, 99, 134, 186, 203, 60, + 235, 15, 0, 31, 219, 192, 169, 25, 151, 233, 239, 221, 135, 88, 129, + 245, 133, 221, 246, 240, 156, 225, 161, 78, 81, 122, 217, 114, 14, 118, + 124, 9, 46, 137, 118, 220, 219, 205, 255, 154, 248, 185, 232, 218, 253, + 38, 108, 9, 21, 161, 67, 61, 191, 137, 79, 43, 61, 75, 160, 82, + 159, 221, 36, 61, 70, 116, 137, 165, 125, 34, 200, 148, 180, 208, 31, + 197, 214, 136, 51, 205, 191, 14, 90, 254, 243, 103, 211, 208, 178, 150, + 55, 45, 192, 12, 7, 24, 111, 219, 172, 2, 5, 83, 16, 31}; + + constexpr static Point kAdviceCommitments[][5] = { + {{"0x21b657ef880458c04e6f90cb1d52d99e3c4f275f62463f91316ce6e89a7727b0", + "0x018e7e556102c958d925644e9fdec38e1b6c88572a98ce9871485937ff5c9aa4"}, + {"0x1cdeebb09fa825fe5ee9bd16d16ddb62866f26077a8607f5be81f7f45ac3606f", + "0x0dd225bfadd39c83ca40e0a578ae098e3dce0b62b8bbf3445e63fe035c71ce09"}, + {"0x1422edcd2b94cb798037fed6eee6061495ef3679ec4f9d89edda2e6f9ef299eb", + "0x07aff8c1c8c754b022575c2e7e2f98483f08111f3dc0a9d7e2b119c5063c97b9"}, + {"0x26d69af68d0081752eb20fba0c186241da3677528ef11c81c234981b9feb7768", + "0x0cb675234a966e9b7fe6f87c6da86e5b3d534330dd6ebc08302da54ccee2352f"}, + {"0x133c73d35676d200d9951b8a8cdd8719fc73de2bf26dcd8246efb8137e90c635", + "0x1eb2849fbface2516b2dfa0d9ed2ec2b397a04ae228a2541d32bc83bb429de30"}}, + {{"0x21b657ef880458c04e6f90cb1d52d99e3c4f275f62463f91316ce6e89a7727b0", + "0x018e7e556102c958d925644e9fdec38e1b6c88572a98ce9871485937ff5c9aa4"}, + {"0x1cdeebb09fa825fe5ee9bd16d16ddb62866f26077a8607f5be81f7f45ac3606f", + "0x0dd225bfadd39c83ca40e0a578ae098e3dce0b62b8bbf3445e63fe035c71ce09"}, + {"0x1422edcd2b94cb798037fed6eee6061495ef3679ec4f9d89edda2e6f9ef299eb", + "0x07aff8c1c8c754b022575c2e7e2f98483f08111f3dc0a9d7e2b119c5063c97b9"}, + {"0x26d69af68d0081752eb20fba0c186241da3677528ef11c81c234981b9feb7768", + "0x0cb675234a966e9b7fe6f87c6da86e5b3d534330dd6ebc08302da54ccee2352f"}, + {"0x133c73d35676d200d9951b8a8cdd8719fc73de2bf26dcd8246efb8137e90c635", + "0x1eb2849fbface2516b2dfa0d9ed2ec2b397a04ae228a2541d32bc83bb429de30"}}}; + + constexpr static std::string_view kTheta = + "0x1950defb9d8f3478e0462ac34605c6e7e42bd2b2b7b3fba3f26ccf52d8cdd3d9"; + + constexpr static Point kLookupMPolyCommitments[][2] = { + {{"0x165319be6c851d9bcc3765d35c7dd5063d086088be3a7276258e652e5e100b91", + "0x18d64c0b3f9bbd9906c18a8c4fd25e0e257359724c94dadc36d6fbab29225117"}, + {"0x0e0013706ff201fca5273dba5d150929ea87c907415a7157788df9b41a56e35a", + "0x1ee1ec24db5cd1a84ff590c7a4b3f936f0d92990d1b3fa21169af793b9978bae"}}, + {{"0x165319be6c851d9bcc3765d35c7dd5063d086088be3a7276258e652e5e100b91", + "0x18d64c0b3f9bbd9906c18a8c4fd25e0e257359724c94dadc36d6fbab29225117"}, + {"0x0e0013706ff201fca5273dba5d150929ea87c907415a7157788df9b41a56e35a", + "0x1ee1ec24db5cd1a84ff590c7a4b3f936f0d92990d1b3fa21169af793b9978bae"}}}; + + constexpr static std::string_view kBeta = + "0x0f63aa1175758f8860731643303628149e13dff0afca73d6854d3263792efd5a"; + + constexpr static std::string_view kGamma = + "0x2214b125b25195392893950172ca1b85c0f638fef7082090d7b5bbe565793e6a"; + + constexpr static Point kPermutationProductCommitments[][2] = { + {{"0x1ecd37836c3deb058c6ffeb1546ae06a107782f126136edf8c1b124085bd7384", + "0x2d6d03ac1064d31369491def11ad221bde0b1630ff50f3866bf32cdfab546822"}, + {"0x0262a880d213cffa2d105cd31b089c227a5ced69309a8d8c56a7fdd34892fb1e", + "0x2853361cd32d728b82f8707b858c329db9030303f2f19a96f13f578a11e86288"}}, + {{"0x00f78a5af61e61b39f3a8f3554c4ef481465fc62d271fca23d228e7cf0d6b5a5", + "0x2e2c19a37285b58ad34448f5fe2979b50e9a9c1afccbef52e358f2fd6a004c55"}, + {"0x04e92d1da1abe325f5c02a23532c264d0716c1f464fb358311cc9a80292ff15f", + "0x1413f36166810082edec8b75bb4394035e805bdd7c55081f4daf484176907039"}}}; + + constexpr static Point kLookupSumCommitments[][2] = { + {{"0x197f959f4fc8ece205350c97ff98a7937d3fe4cd3a61002c29ebb5cbcb8c1ab2", + "0x2fa7f6f0e752d47f88e44cf932bbcf4be268e60d16c74f0451cc14cfc0ff8020"}, + {"0x298396dcc62386e6dd673c3ca83fd70c44c8381bae77a39f0696a5514d0f954e", + "0x1633dbbd5085b270fb62de0dc5b3e7c23202cea1057826eba0686c58bc0b0ba3"}}, + {{"0x082208d7b753e4be8b6934d2dddaf64638881e7f85ec4d8d7a3153362e041dab", + "0x11b6c21f7e1d7ef4f204a47e25a4f2027e42f5a702ed3eae0db0d9a47f29ef79"}, + {"0x10f1ff0664f7707f653251b19b14a089cbd966184b875c057810e01325a4f5dd", + "0x18fe8991dbd39becc3d3e151eeaf8a02382161abaad8528e2f4feb729e2e80ff"}}}; + + constexpr static std::string_view kY = + "0x17f09e75bbdda634ba1f3084782616a1af252ec305a5e25fcb9c4bac7fa00957"; + + constexpr static Point kVanishingHPolyCommitments[] = { + {"0x1f6e76d28858afa1bcf355cf8602c50d05ab0e3cf078fb0dfa76eb7f0dbfc9fd", + "0x2bef3821ad876ad4cc33ff7971b13ee6d0f11d58bd2071474127bc5f4b24d7cc"}, + {"0x217108a27e3cbb511b984a61d9724eab49a03d908fdc9cdcd7c1d73bf34bd5b2", + "0x16cb902d56471d8297e90d8fc813eab9f63d9882d944caf01cd50ca7c5c92d1d"}, + {"0x217d77abd7a3c898611d9950999114bf4606e0a12ff102313088fee89033ee7d", + "0x0a159762a1c3a2026785784a68513b8db6186846a0537884e813fe0fcc3d570f"}, + {"0x15cc2fd4e14ec761e74615f8ccd198dd7a8997018d93d6d203a2297829bdca4b", + "0x0c6100dc4aec1f2966f40d59f18ebd1883f061c54d625e639ddd23a6da5ed17f"}, + {"0x0524d79e5c045ae3ac8837ddb1a7805972b0e54c6bd0b74ee7e1b95025257bdf", + "0x19ae6058d29f676fab89c28d51528aceeb5f82bfe31bed6fdba6bf41a070d2ad"}, + {"0x0486690c2164cf6df7ea009502451a00cef62bd499e35f9d1ef0ff2a3fcc9575", + "0x2fb70cd06f5f15dac1222e7f980b070a139882b0778b52f1a97365f5ee0853a4"}, + {"0x0e6ef8bafb575068a5dd3edb03465f1b2e0880a2e07d3a1ef1d2d753b0ebbb58", + "0x27739628280c63e876678bb4748f8163227cfa616d4081fc3d28fb82c8e1b497"}, + {"0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000"}}; + + constexpr static std::string_view kX = + "0x005118528b6986c6a4475c358360e6857b66bb345d72f50817ededea7667cfcb"; + + constexpr static std::string_view kAdviceEvals[][7] = { + {"0x0b18d0b0f331b56aec41d916d212e3683be3f9710335eab8ae6367a0a99ef93c", + "0x0fd6c0979453a0d9654a899e39956e10550604ec2ceb6dc47a52987d9f4b7921", + "0x021c08cad9f73eda2d5496ff3440e0ce2a37503c6d790fdd580f76c0b0650bfa", + "0x1aff6eeec7e42a16fe7fab8dcc6c7ef6b130e54cc054c795a5374167e1225c36", + "0x267cccb15a94db6764151fb44354bb3fe1cda07f5e544ff39c2071a54d4fea4e", + "0x23b36a5be25dc7152eb6229f6b3a372600f3ed0ae55b8448e8fab15b1ea7a49f", + "0x1fcd040d13706e88d6d223e89482c034bc1b20002106be1215abbe73573e13fe"}, + {"0x0b18d0b0f331b56aec41d916d212e3683be3f9710335eab8ae6367a0a99ef93c", + "0x0fd6c0979453a0d9654a899e39956e10550604ec2ceb6dc47a52987d9f4b7921", + "0x021c08cad9f73eda2d5496ff3440e0ce2a37503c6d790fdd580f76c0b0650bfa", + "0x1aff6eeec7e42a16fe7fab8dcc6c7ef6b130e54cc054c795a5374167e1225c36", + "0x267cccb15a94db6764151fb44354bb3fe1cda07f5e544ff39c2071a54d4fea4e", + "0x23b36a5be25dc7152eb6229f6b3a372600f3ed0ae55b8448e8fab15b1ea7a49f", + "0x1fcd040d13706e88d6d223e89482c034bc1b20002106be1215abbe73573e13fe"}}; + + constexpr static std::string_view kFixedEvals[] = { + "0x290b531a80f6a9f59d9fe4de1d549bc85f11ef35c00df530a4389e35e5acaf5c", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x03d01610feb2b2d1924893d793ba9309c0c9f516ffcd3fbae284b23bf494a3c8", + "0x03d01610feb2b2d1924893d793ba9309c0c9f516ffcd3fbae284b23bf494a3c8", + "0x0f0a8d2eb41059fe8eb4f4a52dc58c730cbff7eec0adcde02870a45071a09826", + "0x0b3a771db55da72cfc6c60cd9a0af9694bf602d7c0e08e2545ebf2147d0bf45e", + "0x128403139a0dc2d2f193178353dca10b792c4b5e062df2d1bd39c18dbd27f2b4", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000"}; + + constexpr static std::string_view kCommonPermutationEvals[] = { + "0x1b9ea22f9ff72e6194a1abe00ef97f5acca41e7bfe679a80dffa0e2827f9d1b9", + "0x2211dca9adfb80d6825d943a5376f8e46d32a028c0f8a24aa0b07f9133100012", + "0x2d74d1dd3f7b5ddf422fc435eae6b45e128c63271cbec732cff63eef141fc026", + "0x2b83f029b83da3436b51945fcf923f0a3b295815eac69038c7145e4d2ce05765", + "0x12bde8f1824653975200f98b8fb7f315a1e39f9343ecf321b48eed829a394c65", + "0x2e872272b12b24582f0f30c2293f4518d9306ad48b698645e0747d9facd9ac49", + "0x0e6f60d79cd9f40b232168fdf37139908a6d0ab9ec01c8b55f7c7f6d78917038", + "0x18af260b36d4885545ef2088f0b52d1b92000c95033e987c274499df3e7d2649", + "0x0abafff6abe8969171f4ed9b84307b69afc1758f20438c1713e61f11c2fbecb7", + "0x06a55f9b3a8d5756325449bcbee7b8d9675e302089e4c3a38df0a41b37ca80b6", + "0x2c96e8438bc2ed48d0c138404b325af2bb8d19ae55722afa97b8defcd37cf8b5", + "0x1195a974777faaeba270b4945958c06765c5a3e1ff47f698a5e4c770e4d809af"}; + + constexpr static std::string_view kPermutationProductEvals[][2] = { + {"0x13421dc8937bad67af7db8a698277aa21dbd1f537e2feafc8c99765343e8c0f1", + "0x0e20daf788498a7a0d839934c78ec9b75f1dc1859cb6ed84f775924fbc65580" + "0"}, + {"0x0ad4ce10789c686c6de4e417fa47a3fada9abf37d08a4da6da25323a9149bb5b", + "0x103c6c1780f9e2e9a3b778d5430a8d8efc4e4a9c30e6b830edf28a0fad7cad9" + "1"}}; + + constexpr static std::string_view kLookupSumEvals[][2] = { + {"0x277de206444767f3cab52d6e00bc1cbb201cb994cca7a7e6fca56e2b12dc40b0", + "0x0db066c1a9b594574e41fef569a6765433e98f92583b3d31dac38e32adda8393"}, + {"0x2e7f5c686453ad2dd5f0d6eabd0066d2d63eaf02f56c619af8f838caae672c34", + "0x171d151857801943e91d4b34d7059653d777a2b52ecc6dfe0c821020989892b6"}}; + + constexpr static std::string_view kPermutationProductNextEvals[][2] = { + {"0x21fda160e86526ab7898f508af89c77476d3771295a4bb32277383a433864222", + "0x2dfd1408efaf825e595af36c1ad956c784f6e1d19f86db050fb1a452815f0f27"}, + {"0x1a07a47ea49ac5a11b36fc1463bee77f2e5c88b35651787385714142653ba3b0", + "0x0f85ac03b24cb4d9747a1aef78078c2d04d88016a21c30b333bcaa6210ab177f"}}; + + constexpr static std::string_view kLookupSumNextEvals[][2] = { + {"0x0c3d344e05ac9a00ffb12dca21b00edc55a7d596e92f3f17c4f7b806954ac62a", + "0x25a2a8bc5c7f537782b8ce95191e44357c1525e87447870468be97f0a835d85b"}, + {"0x167960ba8e2cd020dd7ff4360728aa0f8613b17a798848933842f4eb9dcec036", + "0x2fad0f0aa591450dc30b18bf13460ab1c77ef3b0554123b99d75d21f3cc108cc"}}; + + constexpr static std::string_view kPermutationProductLastEvals[][2] = { + {"0x0aa11b5475bce7819898316fbacaaa374c20a0227785ca6cfa60fafdd7f1f9f9", + ""}, + {"0x1835d7813d893d7b149fdcd3b0f94edd61b020eec2b61ba9b7e53e13a6c9bb99", + ""}}; + + constexpr static std::string_view kLookupMEvals[][2] = { + {"0x0d6683b486a8ac3721fbb7b36a6fe64144e53b9bd9f543d032869d8ebe56b5f9", + "0x2de18df3baa727f50e1defebf6dc3fe3e4ac7d005925b431d4ec0631c60ea63f"}, + {"0x0d6683b486a8ac3721fbb7b36a6fe64144e53b9bd9f543d032869d8ebe56b5f9", + "0x2de18df3baa727f50e1defebf6dc3fe3e4ac7d005925b431d4ec0631c60ea63f"}}; + + constexpr static std::string_view kHEval = + "0x2d550144a43bb1bfa81c2695c1e74389cf95312fe479503d1910c1912c2bae9c"; + + static void TestConfig(MultiLookupCircuitConfig& config) {} + + static Circuit GetCircuit() { + F a = *F::FromHexString( + "0x76a69c75ed45f60e667fb401dd42f877b565f7818b1d94188fb67249"); + F instance = F(2); + std::vector lookup_table = {instance, a, a, F::Zero()}; + return Circuit(std::move(a), std::move(lookup_table)); + } + + static std::vector Get2Circuits() { + Circuit circuit = GetCircuit(); + return {circuit, std::move(circuit)}; + } + + static std::vector GetInstanceColumns() { + F instance = F(2); + std::vector instance_column = {std::move(instance)}; + return {Evals(std::move(instance_column))}; + } +}; + +} // namespace tachyon::zk::plonk + +#endif // TACHYON_ZK_PLONK_EXAMPLES_MULTI_LOOKUP_CIRCUIT_TEST_DATA_H_