From 557af00cd3c9550cb1e64756467747fb5d3e214d Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Mon, 16 Dec 2024 15:49:28 +0000 Subject: [PATCH 01/29] multiprecision: big_uint: clean up wnaf --- .../detail/big_uint/ops/wnaf.hpp | 95 ++++++------------- 1 file changed, 30 insertions(+), 65 deletions(-) diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/wnaf.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/wnaf.hpp index d86ed9228..6a912886b 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/wnaf.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/wnaf.hpp @@ -12,88 +12,53 @@ #include #include -#include #include #include "nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp" -#include "nil/crypto3/multiprecision/detail/big_uint/storage.hpp" namespace nil::crypto3::multiprecision { + namespace detail { + template + constexpr void find_wnaf_impl(T& res, const std::size_t window_size, + big_uint c) noexcept { + std::size_t j = 0; + while (!c.is_zero()) { + long u = 0; + if (c.bit_test(0u)) { + u = static_cast(c & ((1u << (window_size + 1)) - 1)); + if (u > (1 << window_size)) { + u = u - (1 << (window_size + 1)); + } + c -= u; + } + res[j] = u; + ++j; + c >>= 1; + } + } + } // namespace detail + /* Vector version */ template - std::vector find_wnaf(const std::size_t window_size, - const big_uint& scalar) noexcept { - using big_uint_t = big_uint; - using ui_type = detail::limb_type; - + constexpr std::vector find_wnaf(const std::size_t window_size, + const big_uint& c) noexcept { // upper bound - constexpr std::size_t length = - big_uint_t::internal_limb_count * std::numeric_limits::digits; - std::vector res(length + 1); + constexpr std::size_t length = Bits + 1; + std::vector res(length); - big_uint_t c(scalar); - ui_type j = 0; - - while (!c.is_zero()) { - long u = 0; - if (c.bit_test(0u)) { - u = c.limbs()[0] % (1u << (window_size + 1)); - if (u > (1 << window_size)) { - u = u - (1 << (window_size + 1)); - } - - if (u > 0) { - c -= ui_type(u); - } else { - c += ui_type(-u); - } - } else { - u = 0; - } - res[j] = u; - ++j; - - c >>= 1; - } + detail::find_wnaf_impl(res, window_size, c); return res; } /* Array version */ template - constexpr auto find_wnaf_a(const std::size_t window_size, - const big_uint& scalar) noexcept { - using big_uint_t = big_uint; - using ui_type = detail::limb_type; - + constexpr auto find_wnaf_a(const std::size_t window_size, const big_uint& c) noexcept { // upper bound - constexpr std::size_t length = - big_uint_t::internal_limb_count * std::numeric_limits::digits; - - std::array res{0}; - - big_uint_t c(scalar); - ui_type j = 0; - - while (!c.is_zero()) { - long u = 0; - if (c.bit_test(0u)) { - u = c.limbs()[0] % (1u << (window_size + 1)); - if (u > (1 << window_size)) { - u = u - (1 << (window_size + 1)); - } + constexpr std::size_t length = Bits + 1; + std::array res{0}; - if (u > 0) { - c -= u; - } else { - c += ui_type(-u); - } - } - - res[j] = u; - ++j; - c >>= 1; - } + detail::find_wnaf_impl(res, window_size, c); return res; } From 7c7e82a09755b50b221796b6d366366fe7e8756c Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Tue, 17 Dec 2024 09:28:40 +0000 Subject: [PATCH 02/29] marshalling::multiprecision: remove boost includes --- .../nil/crypto3/marshalling/multiprecision/inference.hpp | 3 +-- .../nil/crypto3/marshalling/multiprecision/types/integral.hpp | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/crypto3/libs/marshalling/multiprecision/include/nil/crypto3/marshalling/multiprecision/inference.hpp b/crypto3/libs/marshalling/multiprecision/include/nil/crypto3/marshalling/multiprecision/inference.hpp index 58f25f8d3..787b29fb2 100644 --- a/crypto3/libs/marshalling/multiprecision/include/nil/crypto3/marshalling/multiprecision/inference.hpp +++ b/crypto3/libs/marshalling/multiprecision/include/nil/crypto3/marshalling/multiprecision/inference.hpp @@ -27,9 +27,8 @@ #define CRYPTO3_MARSHALLING_MULTIPRECISION_INFERENCE_TYPE_TRAITS_HPP #include -#include -#include #include +#include namespace nil::crypto3 { diff --git a/crypto3/libs/marshalling/multiprecision/include/nil/crypto3/marshalling/multiprecision/types/integral.hpp b/crypto3/libs/marshalling/multiprecision/include/nil/crypto3/marshalling/multiprecision/types/integral.hpp index 87d80ea52..864ec68f1 100644 --- a/crypto3/libs/marshalling/multiprecision/include/nil/crypto3/marshalling/multiprecision/types/integral.hpp +++ b/crypto3/libs/marshalling/multiprecision/include/nil/crypto3/marshalling/multiprecision/types/integral.hpp @@ -29,8 +29,6 @@ #include #include -#include -#include #include #include From 4f197c6c18e1f5b520b2ae5c475aa73fb8530a81 Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Tue, 17 Dec 2024 09:38:19 +0000 Subject: [PATCH 03/29] marshalling::multiprecision: clean up tests --- .../multiprecision/test/integral.cpp | 45 ++++++++++--------- .../test/integral_fixed_size_container.cpp | 22 +++++---- .../integral_non_fixed_size_container.cpp | 12 +++-- 3 files changed, 44 insertions(+), 35 deletions(-) diff --git a/crypto3/libs/marshalling/multiprecision/test/integral.cpp b/crypto3/libs/marshalling/multiprecision/test/integral.cpp index 5ea95824a..789a355bb 100644 --- a/crypto3/libs/marshalling/multiprecision/test/integral.cpp +++ b/crypto3/libs/marshalling/multiprecision/test/integral.cpp @@ -24,14 +24,19 @@ //---------------------------------------------------------------------------// #define BOOST_TEST_MODULE crypto3_marshalling_integral_test -// #define BOOST_TEST_MAIN #include + +#include +#include +#include +#include +#include +#include + #include #include #include -#include -#include #include #include @@ -40,30 +45,24 @@ #include #include +#include +#include #include template T generate_random() { - static const unsigned limbs = std::numeric_limits::is_specialized && std::numeric_limits::is_bounded ? - std::numeric_limits::digits / std::numeric_limits::digits + 3 : - 20; + static_assert(std::numeric_limits::is_specialized && std::numeric_limits::is_bounded && + std::numeric_limits::is_integer && std::numeric_limits::radix == 2, + "Only integer types are supported"); - static boost::random::uniform_int_distribution ui(0, limbs); + static boost::random::uniform_int_distribution len_distr( + 1, std::numeric_limits::digits); static boost::random::mt19937 gen; - T val = gen(); - unsigned lim = ui(gen); - for (unsigned i = 0; i < lim; ++i) { - val *= (gen.max)(); - val += gen(); - } - // If we overflow the number, like it was 23 bits, but we filled 1 limb of 64 bits, - // or it was 254 bits but we filled the upper 2 bits, the number will not complain. - // Nothing will be thrown, but errors will happen. The caller is responsible to not do so. - // TODO(ioxid): return this? - //val.normalize(); - - return val; + std::size_t len = len_distr(gen); + boost::random::uniform_int_distribution num_distr( + T(1) << (len - 1), len == std::numeric_limits::digits ? ~T(0) : (T(1) << len) - 1); + return num_distr(gen); } template @@ -149,8 +148,10 @@ void test_round_trip_non_fixed_precision(T val) { using unit_type = OutputType; std::vector cv; - export_bits(val, std::back_inserter(cv), units_bits, - std::is_same::value?true:false); + export_bits( + val, std::back_inserter(cv), units_bits, + static_cast( + std::is_same::value)); nil::crypto3::marshalling::status_type status; T test_val = nil::crypto3::marshalling::pack(cv, status); diff --git a/crypto3/libs/marshalling/multiprecision/test/integral_fixed_size_container.cpp b/crypto3/libs/marshalling/multiprecision/test/integral_fixed_size_container.cpp index 24e489f49..df026cde3 100644 --- a/crypto3/libs/marshalling/multiprecision/test/integral_fixed_size_container.cpp +++ b/crypto3/libs/marshalling/multiprecision/test/integral_fixed_size_container.cpp @@ -26,24 +26,28 @@ #define BOOST_TEST_MODULE crypto3_marshalling_integral_fixed_size_container_test #include + +#include +#include +#include +#include +#include + #include + #include #include -#include -//#include - -#include +#include +#include +#include +#include #include #include -//#include -#include -#include #include -#include - +#include template T generate_random() { diff --git a/crypto3/libs/marshalling/multiprecision/test/integral_non_fixed_size_container.cpp b/crypto3/libs/marshalling/multiprecision/test/integral_non_fixed_size_container.cpp index 0b83121ed..0c208ea64 100644 --- a/crypto3/libs/marshalling/multiprecision/test/integral_non_fixed_size_container.cpp +++ b/crypto3/libs/marshalling/multiprecision/test/integral_non_fixed_size_container.cpp @@ -26,6 +26,12 @@ #define BOOST_TEST_MODULE crypto3_marshalling_integral_non_fixed_size_container_test #include + +#include +#include +#include +#include + #include #include @@ -35,12 +41,10 @@ #include -#include -#include - #include -#include #include +#include +#include #include From fe86a97079b7a184c0cea3bbd216dda0ee9017f2 Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Tue, 17 Dec 2024 13:55:18 +0000 Subject: [PATCH 04/29] multiprecision: big_uint: rename limbs_count --- .../detail/big_mod/modular_ops.hpp | 22 +++---- .../detail/big_uint/arithmetic.hpp | 56 ++++++++--------- .../detail/big_uint/big_uint_impl.hpp | 62 +++++++++---------- .../detail/big_uint/ops/import_export.hpp | 10 +-- 4 files changed, 75 insertions(+), 75 deletions(-) diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp index 35f8fbf95..7b6eb1aa0 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp @@ -37,14 +37,14 @@ namespace nil::crypto3::multiprecision::detail { struct modular_policy { using big_uint_t = big_uint; - static constexpr std::size_t limbs_count = big_uint_t::internal_limb_count; + static constexpr std::size_t limb_count = big_uint_t::static_limb_count; static constexpr std::size_t limb_bits = big_uint_t::limb_bits; static constexpr std::size_t BitsCount_doubled = 2u * Bits; static constexpr std::size_t BitsCount_doubled_1 = BitsCount_doubled + 1; static constexpr std::size_t BitsCount_quadruple_1 = 2u * BitsCount_doubled + 1; - static constexpr std::size_t BitsCount_padded_limbs = limbs_count * limb_bits + limb_bits; - static constexpr std::size_t BitsCount_doubled_limbs = 2u * limbs_count * limb_bits; + static constexpr std::size_t BitsCount_padded_limbs = limb_count * limb_bits + limb_bits; + static constexpr std::size_t BitsCount_doubled_limbs = 2u * limb_count * limb_bits; static constexpr std::size_t BitsCount_doubled_padded_limbs = BitsCount_doubled_limbs + limb_bits; @@ -69,7 +69,7 @@ namespace nil::crypto3::multiprecision::detail { using big_uint_doubled_limbs = typename policy_type::big_uint_doubled_limbs; using big_uint_doubled_padded_limbs = typename policy_type::big_uint_doubled_padded_limbs; - static constexpr std::size_t limbs_count = policy_type::limbs_count; + static constexpr std::size_t limb_count = policy_type::limb_count; static constexpr std::size_t limb_bits = policy_type::limb_bits; constexpr barrett_modular_ops(const big_uint_t &m) : m_mod(m), m_barrett_mu(0u) { @@ -265,7 +265,7 @@ namespace nil::crypto3::multiprecision::detail { using big_uint_doubled_limbs = typename policy_type::big_uint_doubled_limbs; using big_uint_doubled_padded_limbs = typename policy_type::big_uint_doubled_padded_limbs; - static constexpr std::size_t limbs_count = policy_type::limbs_count; + static constexpr std::size_t limb_count = policy_type::limb_count; static constexpr std::size_t limb_bits = policy_type::limb_bits; constexpr montgomery_modular_ops(const big_uint_t &m) : barrett_modular_ops(m) { @@ -276,7 +276,7 @@ namespace nil::crypto3::multiprecision::detail { m_montgomery_p_dash = monty_inverse(this->m_mod.limbs()[0]); big_uint_doubled_padded_limbs r; - r.bit_set(2 * this->m_mod.limbs_count() * limb_bits); + r.bit_set(2 * this->m_mod.limb_count() * limb_bits); this->barrett_reduce(r); // Here we are intentionally throwing away half of the bits of r, it's @@ -328,7 +328,7 @@ namespace nil::crypto3::multiprecision::detail { big_uint_doubled_padded_limbs accum(result); big_uint_doubled_padded_limbs prod; - for (std::size_t i = 0; i < this->mod().limbs_count(); ++i) { + for (std::size_t i = 0; i < this->mod().limb_count(); ++i) { limb_type limb_accum = accum.limbs()[i]; double_limb_type mult_res = limb_accum * static_cast(p_dash()); limb_type mult_res_limb = static_cast(mult_res); @@ -338,7 +338,7 @@ namespace nil::crypto3::multiprecision::detail { prod <<= i * limb_bits; accum += prod; } - accum >>= this->mod().limbs_count() * limb_bits; + accum >>= this->mod().limb_count() * limb_bits; if (accum >= this->mod()) { accum -= this->mod(); @@ -366,7 +366,7 @@ namespace nil::crypto3::multiprecision::detail { // additional "unused" bit in the number. // 2. Some other bit in modulus is 0. // 3. The number has < 12 limbs. - return this->mod().limbs_count() < 12 && (Bits % sizeof(limb_type) != 0) && + return this->mod().limb_count() < 12 && (Bits % sizeof(limb_type) != 0) && this->mod_compliment() != limb_type(1u); } @@ -381,7 +381,7 @@ namespace nil::crypto3::multiprecision::detail { NIL_CO3_MP_ASSERT(is_applicable_for_no_carry_montgomery_mul()); // Obtain number of limbs - constexpr int N = big_uint::internal_limb_count; + constexpr int N = big_uint::static_limb_count; const big_uint a(c); // Copy the first argument, as the implemented // algorithm doesn't work in-place. @@ -475,7 +475,7 @@ namespace nil::crypto3::multiprecision::detail { NIL_CO3_MP_ASSERT(result < this->mod() && y < this->mod()); big_uint_t A(limb_type(0u)); - const std::size_t mod_size = this->mod().limbs_count(); + const std::size_t mod_size = this->mod().limb_count(); auto *mod_limbs = this->mod().limbs(); auto mod_last_limb = static_cast(mod_limbs[0]); auto y_last_limb = y.limbs()[0]; diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp index bb89da201..80d9c0207 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp @@ -37,7 +37,7 @@ namespace nil::crypto3::multiprecision { if (x == 1) { double_limb_type v = static_cast(*a.limbs()) + static_cast(*b.limbs()); - if (result.limbs_count() == 1) { + if (result.limb_count() == 1) { double_limb_type mask = big_uint::upper_limb_mask; if (v & ~mask) { v &= mask; @@ -82,7 +82,7 @@ namespace nil::crypto3::multiprecision { } if (carry) { - if (result.limbs_count() > x) { + if (result.limb_count() > x) { result.limbs()[x] = static_cast(1u); carry = 0; } @@ -93,8 +93,8 @@ namespace nil::crypto3::multiprecision { } else { limb_type mask = big_uint::upper_limb_mask; // If we have set any bit above "Bits", then we have a carry. - if (result.limbs()[result.limbs_count() - 1] & ~mask) { - result.limbs()[result.limbs_count() - 1] &= mask; + if (result.limbs()[result.limb_count() - 1] & ~mask) { + result.limbs()[result.limb_count() - 1] &= mask; result.set_carry(true); } } @@ -209,7 +209,7 @@ namespace nil::crypto3::multiprecision { if (x == 1) { double_limb_type v = static_cast(*a.limbs()) + static_cast(*b.limbs()); - if (result.limbs_count() == 1) { + if (result.limb_count() == 1) { double_limb_type mask = big_uint::upper_limb_mask; if (v & ~mask) { v &= mask; @@ -244,7 +244,7 @@ namespace nil::crypto3::multiprecision { carry = detail::addcarry_limb(0, pa[i], 1, pr + i); } if (i == x && carry) { - if (big_uint::internal_limb_count > x) { + if (result.limb_count() > x) { result.limbs()[x] = static_cast(1u); } } else if ((x != i) && (pa != pr)) { @@ -257,8 +257,8 @@ namespace nil::crypto3::multiprecision { } else { limb_type mask = big_uint::upper_limb_mask; // If we have set any bit above "Bits", then we have a carry. - if (result.limbs()[result.limbs_count() - 1] & ~mask) { - result.limbs()[result.limbs_count() - 1] &= mask; + if (result.limbs()[result.limb_count() - 1] & ~mask) { + result.limbs()[result.limb_count() - 1] &= mask; result.set_carry(true); } } @@ -362,19 +362,19 @@ namespace nil::crypto3::multiprecision { const_limb_pointer pa = a.limbs(); std::size_t i = 0; // Addition with carry until we either run out of digits or carry is zero: - for (; carry && (i < result.limbs_count()); ++i) { + for (; carry && (i < result.limb_count()); ++i) { carry += static_cast(pa[i]); pr[i] = static_cast(carry); carry >>= limb_bits; } // Just copy any remaining digits: if (&a != &result) { - std::copy(pa + i, pa + a.limbs_count(), pr + i); + std::copy(pa + i, pa + a.limb_count(), pr + i); } if (carry) { - if (result.limbs_count() > a.limbs_count()) { - result.limbs()[a.limbs_count()] = static_cast(carry); + if (result.limb_count() > a.limb_count()) { + result.limbs()[a.limb_count()] = static_cast(carry); carry = 0; } } @@ -384,8 +384,8 @@ namespace nil::crypto3::multiprecision { } else { limb_type mask = big_uint::upper_limb_mask; // If we have set any bit above "Bits", then we have a carry. - if (pr[result.limbs_count() - 1] & ~mask) { - pr[result.limbs_count() - 1] &= mask; + if (pr[result.limb_count() - 1] & ~mask) { + pr[result.limb_count() - 1] &= mask; result.set_carry(true); } } @@ -612,10 +612,10 @@ namespace nil::crypto3::multiprecision { // O(N) for this rather than a full O(N^2) multiply: // double_limb_type carry = 0; - // t.resize(y.limbs_count() + shift + 1, y.limbs_count() - // + shift); bool truncated_t = (t.limbs_count() != - // y.limbs_count() + shift + 1); - const bool truncated_t = y_order + shift + 2 > big_uint::internal_limb_count; + // t.resize(y.limb_count() + shift + 1, y.limb_count() + // + shift); bool truncated_t = (t.limb_count() != + // y.limb_count() + shift + 1); + const bool truncated_t = y_order + shift + 2 > big_uint::static_limb_count; t = 0u; limb_pointer pt = t.limbs(); for (std::size_t i = 0; i < y_order + 1; ++i) { @@ -627,7 +627,7 @@ namespace nil::crypto3::multiprecision { if (carry && !truncated_t) { pt[y_order + shift + 1] = static_cast(carry); } else if (!truncated_t) { - // t.resize(t.limbs_count() - 1, t.limbs_count() - + // t.resize(t.limb_count() - 1, t.limb_count() - // 1); } // @@ -662,9 +662,9 @@ namespace nil::crypto3::multiprecision { // // if (div && first_pass) { // first_pass = false; - // // while (pdiv[div->limbs_count() - 1] == 0) - // // div->resize(div->limbs_count() - 1, - // div->limbs_count() - 1); + // // while (pdiv[div->limb_count() - 1] == 0) + // // div->resize(div->limb_count() - 1, + // div->limb_count() - 1); // } // // Update rem_order: @@ -710,17 +710,17 @@ namespace nil::crypto3::multiprecision { const_limb_pointer pa = a.limbs(); const_limb_pointer pb = b.limbs(); limb_pointer pr = result.limbs(); - for (std::size_t i = 0; i < result.limbs_count(); ++i) { + for (std::size_t i = 0; i < result.limb_count(); ++i) { pr[i] = 0; } double_limb_type carry = 0; for (std::size_t i = 0; i < as; ++i) { - NIL_CO3_MP_ASSERT(result.limbs_count() > i); - std::size_t inner_limit = (std::min)(result.limbs_count() - i, bs); + NIL_CO3_MP_ASSERT(result.limb_count() > i); + std::size_t inner_limit = (std::min)(result.limb_count() - i, bs); std::size_t j = 0; for (; j < inner_limit; ++j) { - NIL_CO3_MP_ASSERT(i + j < result.limbs_count()); + NIL_CO3_MP_ASSERT(i + j < result.limb_count()); carry += static_cast(pa[i]) * static_cast(pb[j]); NIL_CO3_MP_ASSERT( @@ -732,8 +732,8 @@ namespace nil::crypto3::multiprecision { NIL_CO3_MP_ASSERT(carry <= max_limb_value); } if (carry) { - NIL_CO3_MP_ASSERT(result.limbs_count() > i + j); - if (i + j < result.limbs_count()) { + NIL_CO3_MP_ASSERT(result.limb_count() > i + j); + if (i + j < result.limb_count()) { pr[i + j] = static_cast(carry); } } diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp index 0cd92f4cf..7e80a3f45 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp @@ -64,7 +64,7 @@ namespace nil::crypto3::multiprecision { static constexpr std::size_t limb_bits = detail::limb_bits; static constexpr limb_type max_limb_value = detail::max_limb_value; - static constexpr std::size_t internal_limb_count = + static constexpr std::size_t static_limb_count = (Bits / limb_bits) + (((Bits % limb_bits) != 0u) ? 1u : 0u); static constexpr limb_type upper_limb_mask = (Bits % limb_bits) ? (limb_type(1) << (Bits % limb_bits)) - 1 : (~limb_type(0u)); @@ -72,9 +72,9 @@ namespace nil::crypto3::multiprecision { // // Helper functions for getting at our internal data, and manipulating storage: // - constexpr std::size_t limbs_count() const noexcept { - static_assert(internal_limb_count != 0, "No limbs in storage."); - return internal_limb_count; + constexpr std::size_t limb_count() const noexcept { + static_assert(static_limb_count != 0, "No limbs in storage."); + return static_limb_count; } constexpr limb_pointer limbs() noexcept { return m_data.data(); } constexpr const_limb_pointer limbs() const noexcept { return m_data.data(); } @@ -85,13 +85,13 @@ namespace nil::crypto3::multiprecision { // Zeros out everything after limb[i], replaces resizing. constexpr void zero_after(std::size_t start_index) { auto pr = this->limbs(); - for (std::size_t i = start_index; i < this->limbs_count(); ++i) { + for (std::size_t i = start_index; i < this->limb_count(); ++i) { pr[i] = 0; } } constexpr std::size_t used_limbs() const noexcept { - for (int i = internal_limb_count - 1; i >= 0; --i) { + for (int i = static_limb_count - 1; i >= 0; --i) { if (limbs()[i] != 0) { return i + 1; } @@ -100,7 +100,7 @@ namespace nil::crypto3::multiprecision { } constexpr std::size_t order() const noexcept { - for (int i = internal_limb_count - 1; i >= 0; --i) { + for (int i = static_limb_count - 1; i >= 0; --i) { if (limbs()[i] != 0) { return i; } @@ -119,7 +119,7 @@ namespace nil::crypto3::multiprecision { } else { static_assert(sizeof(T) % sizeof(limb_type) == 0); constexpr std::size_t n = - std::min(internal_limb_count, sizeof(T) / sizeof(limb_type)); + std::min(static_limb_count, sizeof(T) / sizeof(limb_type)); auto a_copy = a; for (std::size_t i = 0; i < n; ++i) { limbs()[i] = a_copy & static_cast(static_cast(-1)); @@ -135,19 +135,19 @@ namespace nil::crypto3::multiprecision { template constexpr void do_assign(const big_uint& other) noexcept { - std::size_t count = (std::min)(other.limbs_count(), this->limbs_count()); + std::size_t count = (std::min)(other.limb_count(), this->limb_count()); for (std::size_t i = 0; i < count; ++i) { this->limbs()[i] = other.limbs()[i]; } - // Zero out everything after (std::min)(other.limbs_count(), limbs_count()), so if size + // Zero out everything after (std::min)(other.limb_count(), limb_count()), so if size // of other was less, we have 0s at the end. - this->zero_after((std::min)(other.limbs_count(), this->limbs_count())); + this->zero_after((std::min)(other.limb_count(), this->limb_count())); this->normalize(); } public: // TODO(ioxid): this should be private - constexpr void normalize() noexcept { limbs()[internal_limb_count - 1] &= upper_limb_mask; } + constexpr void normalize() noexcept { limbs()[static_limb_count - 1] &= upper_limb_mask; } constexpr bool has_carry() const noexcept { return m_carry; } constexpr void set_carry(bool carry) noexcept { m_carry = carry; } @@ -269,7 +269,7 @@ namespace nil::crypto3::multiprecision { std::string result; result.reserve(used_limbs() * limb_bits / 4); bool found_first = false; - for (int i = internal_limb_count - 1; i >= 0; --i) { + for (int i = static_limb_count - 1; i >= 0; --i) { auto limb = limbs()[i]; bool should_pad = found_first; found_first = found_first || limb != 0; @@ -322,7 +322,7 @@ namespace nil::crypto3::multiprecision { return static_cast(this->limbs()[0]); } else { constexpr std::size_t n = - std::min(sizeof(T) / sizeof(limb_type), internal_limb_count); + std::min(sizeof(T) / sizeof(limb_type), static_limb_count); T result = 0; for (std::size_t i = 0; i < n; ++i) { result <<= limb_bits; @@ -606,8 +606,8 @@ namespace nil::crypto3::multiprecision { // // First figure out how big the result needs to be and set up some data: // - std::size_t rs = limbs_count(); - std::size_t os = o.limbs_count(); + std::size_t rs = limb_count(); + std::size_t os = o.limb_count(); auto [m, x] = std::minmax(rs, os); limb_pointer pr = limbs(); const_limb_pointer po = o.limbs(); @@ -653,7 +653,7 @@ namespace nil::crypto3::multiprecision { NIL_CO3_MP_FORCEINLINE constexpr void bitwise_xor(limb_type l) noexcept { limbs()[0] ^= l; } NIL_CO3_MP_FORCEINLINE constexpr void complement(const big_uint& o) noexcept { - std::size_t os = o.limbs_count(); + std::size_t os = o.limb_count(); for (std::size_t i = 0; i < os; ++i) { limbs()[i] = ~o.limbs()[i]; } @@ -671,7 +671,7 @@ namespace nil::crypto3::multiprecision { zero_after(0); } else { unsigned char* pc = reinterpret_cast(pr); - std::memmove(pc + bytes, pc, limbs_count() * sizeof(limb_type) - bytes); + std::memmove(pc + bytes, pc, limb_count() * sizeof(limb_type) - bytes); std::memset(pc, 0, bytes); } } @@ -691,9 +691,9 @@ namespace nil::crypto3::multiprecision { zero_after(0); } else { std::size_t i = offset; - std::size_t rs = limbs_count() + offset; - for (; i < limbs_count(); ++i) { - pr[rs - 1 - i] = pr[limbs_count() - 1 - i]; + std::size_t rs = limb_count() + offset; + for (; i < limb_count(); ++i) { + pr[rs - 1 - i] = pr[limb_count() - 1 - i]; } for (; i < rs; ++i) { pr[rs - 1 - i] = 0; @@ -713,7 +713,7 @@ namespace nil::crypto3::multiprecision { limb_pointer pr = limbs(); std::size_t i = 0; - std::size_t rs = limbs_count(); + std::size_t rs = limb_count(); // This code only works when shift is non-zero, otherwise we invoke undefined // behaviour! NIL_CO3_MP_ASSERT(shift); @@ -734,7 +734,7 @@ namespace nil::crypto3::multiprecision { void right_shift_byte(double_limb_type s) noexcept { limb_type offset = static_cast(s / limb_bits); NIL_CO3_MP_ASSERT((s % CHAR_BIT) == 0); - std::size_t ors = limbs_count(); + std::size_t ors = limb_count(); std::size_t rs = ors; if (offset >= rs) { zero_after(0); @@ -759,7 +759,7 @@ namespace nil::crypto3::multiprecision { constexpr void right_shift_limb(double_limb_type s) noexcept { limb_type offset = static_cast(s / limb_bits); NIL_CO3_MP_ASSERT((s % limb_bits) == 0); - std::size_t ors = limbs_count(); + std::size_t ors = limb_count(); std::size_t rs = ors; if (offset >= rs) { zero_after(0); @@ -778,7 +778,7 @@ namespace nil::crypto3::multiprecision { constexpr void right_shift_generic(double_limb_type s) noexcept { limb_type offset = static_cast(s / limb_bits); limb_type shift = static_cast(s % limb_bits); - std::size_t ors = limbs_count(); + std::size_t ors = limb_count(); std::size_t rs = ors; if (offset >= rs) { @@ -910,7 +910,7 @@ namespace nil::crypto3::multiprecision { // Misc ops NIL_CO3_MP_FORCEINLINE constexpr bool is_zero() const noexcept { - for (std::size_t i = 0; i < limbs_count(); ++i) { + for (std::size_t i = 0; i < limb_count(); ++i) { if (limbs()[i] != 0) { return false; } @@ -923,11 +923,11 @@ namespace nil::crypto3::multiprecision { // Find the index of the least significant limb that is non-zero: // std::size_t index = 0; - while ((index < limbs_count()) && !limbs()[index]) { + while ((index < limb_count()) && !limbs()[index]) { ++index; } - if (index == limbs_count()) { + if (index == limb_count()) { throw std::invalid_argument("zero has no lsb"); } @@ -943,7 +943,7 @@ namespace nil::crypto3::multiprecision { // // Find the index of the most significant bit that is non-zero: // - for (std::size_t i = limbs_count() - 1; i > 0; --i) { + for (std::size_t i = limb_count() - 1; i > 0; --i) { if (limbs()[i] != 0) { return i * limb_bits + std::bit_width(limbs()[i]) - 1; } @@ -1000,7 +1000,7 @@ namespace nil::crypto3::multiprecision { // Data // m_data[0] contains the lowest bits. - std::array m_data{0}; + std::array m_data{0}; // This is a temporary value which is set when carry has happend during addition. // If this value is true, reduction by modulus must happen next. @@ -1047,7 +1047,7 @@ namespace nil::crypto3::multiprecision { template constexpr std::size_t hash_value(const big_uint& val) noexcept { std::size_t result = 0; - for (std::size_t i = 0; i < val.limbs_count(); ++i) { + for (std::size_t i = 0; i < val.limb_count(); ++i) { boost::hash_combine(result, val.limbs()[i]); } return result; diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/import_export.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/import_export.hpp index 8ea016d11..99933216f 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/import_export.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/import_export.hpp @@ -42,7 +42,7 @@ namespace nil::crypto3::multiprecision { // TODO(ioxid): when should we throw? // We are ignoring any bits that will not fit into the number. // We are not throwing, we will use as many bits from the input as we need to. - if (val.limbs_count() > limb) { + if (val.limb_count() > limb) { val.limbs()[limb] |= value; } } @@ -101,7 +101,7 @@ namespace nil::crypto3::multiprecision { result = extract_bits(val, location + limb_bits - shift, count - limb_bits + shift); result <<= limb_bits - shift; } - if (limb < val.limbs_count()) { + if (limb < val.limb_count()) { result |= (val.limbs()[limb] >> shift) & mask; } return result; @@ -153,11 +153,11 @@ namespace nil::crypto3::multiprecision { ++limb_len; } - NIL_CO3_MP_ASSERT(result.limbs_count() > limb_len); + NIL_CO3_MP_ASSERT(result.limb_count() > limb_len); - result.limbs()[result.limbs_count() - 1] = 0u; + result.limbs()[result.limb_count() - 1] = 0u; std::memcpy(result.limbs(), i, - (std::min)(byte_len, result.limbs_count() * sizeof(limb_type))); + (std::min)(byte_len, result.limb_count() * sizeof(limb_type))); // This is probably unneeded, but let it stay for now. result.normalize(); From a1e31c51a83dacd2c9863a992d11f200a9713798 Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Tue, 17 Dec 2024 13:39:07 +0000 Subject: [PATCH 05/29] multiprecision: big_uint: remove carry field, make operators checked and add wrapping operators --- .../crypto3/multiprecision/detail/big_int.hpp | 34 +- .../detail/big_mod/big_mod_impl.hpp | 16 +- .../detail/big_mod/modular_ops.hpp | 8 +- .../detail/big_uint/arithmetic.hpp | 426 ++++++++++-------- .../detail/big_uint/big_uint_impl.hpp | 269 +++++++---- .../detail/big_uint/parsing.hpp | 2 +- .../detail/big_uint/storage.hpp | 1 + .../multiprecision/detail/integer_utils.hpp | 8 + .../multiprecision/detail/type_traits.hpp | 2 +- crypto3/libs/multiprecision/test/big_int.cpp | 34 +- 10 files changed, 476 insertions(+), 324 deletions(-) diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp index 21fcfafb8..048ab8001 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp @@ -38,10 +38,10 @@ namespace nil::crypto3::multiprecision { constexpr big_int() noexcept {} template - constexpr big_int(const big_uint& b) noexcept : m_abs(b) {} + constexpr big_int(const big_uint& b) : m_abs(b) {} template && std::is_signed_v, int> = 0> - constexpr big_int(T val) noexcept : m_abs(abs(val)) { + constexpr big_int(T val) : m_abs(abs(val)) { // for ADL using std::abs; if (val < 0) { @@ -50,7 +50,7 @@ namespace nil::crypto3::multiprecision { } template && std::is_unsigned_v, int> = 0> - constexpr big_int(T val) noexcept : m_abs(val) {} + constexpr big_int(T val) : m_abs(val) {} template constexpr big_int(const big_int& other) noexcept @@ -65,7 +65,7 @@ namespace nil::crypto3::multiprecision { } template - constexpr big_int& operator=(const big_int& other) noexcept { + constexpr big_int& operator=(const big_int& other) { m_negative = other.negative(); m_abs = other.abs(); return *this; @@ -73,7 +73,7 @@ namespace nil::crypto3::multiprecision { template && std::is_signed_v, int> = 0> - constexpr big_int& operator=(T val) noexcept { + constexpr big_int& operator=(T val) { using std::abs; m_abs = abs(val); if (val < 0) { @@ -84,7 +84,7 @@ namespace nil::crypto3::multiprecision { template && std::is_unsigned_v, int> = 0> - constexpr big_int& operator=(T val) noexcept { + constexpr big_int& operator=(T val) { m_negative = false; m_abs = val; return *this; @@ -147,9 +147,9 @@ namespace nil::crypto3::multiprecision { // Addition/subtraction - static constexpr big_int add(const big_int& a, const big_int& b) noexcept { + static constexpr big_int add(const big_int& a, const big_int& b) { if (!a.negative() && !b.negative()) { - return a.m_abs + b.m_abs; + return big_uint(a.m_abs) + b.m_abs; } if (!a.negative() && b.negative()) { if (a.m_abs >= b.m_abs) { @@ -160,14 +160,14 @@ namespace nil::crypto3::multiprecision { if (a.negative() && !b.negative()) { return add(b, a); } - return -big_int(a.m_abs + b.m_abs); + return -big_int(big_uint(a.m_abs) + b.m_abs); } - static constexpr big_int subtract(const big_int& a, const big_int& b) noexcept { + static constexpr big_int subtract(const big_int& a, const big_int& b) { return add(a, -b); } - NIL_CO3_MP_FORCEINLINE constexpr void increment() noexcept { + NIL_CO3_MP_FORCEINLINE constexpr void increment() { if (negative()) { --m_abs; normalize(); @@ -176,7 +176,7 @@ namespace nil::crypto3::multiprecision { ++m_abs; } - NIL_CO3_MP_FORCEINLINE constexpr void decrement() noexcept { + NIL_CO3_MP_FORCEINLINE constexpr void decrement() { if (negative()) { ++m_abs; return; @@ -311,12 +311,12 @@ namespace nil::crypto3::multiprecision { return a; } NIL_CO3_MP_BIG_INT_UNARY_TEMPLATE - constexpr auto& operator++(big_int_t& a) noexcept { + constexpr auto& operator++(big_int_t& a) { a.increment(); return a; } NIL_CO3_MP_BIG_INT_UNARY_TEMPLATE - constexpr auto operator++(big_int_t& a, int) noexcept { + constexpr auto operator++(big_int_t& a, int) { auto copy = a; ++a; return copy; @@ -325,19 +325,19 @@ namespace nil::crypto3::multiprecision { constexpr auto operator+(const big_int_t& a) noexcept { return a; } NIL_CO3_MP_BIG_INT_INTEGRAL_TEMPLATE - constexpr auto operator-(const T1& a, const T2& b) noexcept { return T1::subtract(a, b); } + constexpr auto operator-(const T1& a, const T2& b) { return T1::subtract(a, b); } NIL_CO3_MP_BIG_INT_INTEGRAL_ASSIGNMENT_TEMPLATE constexpr auto& operator-=(big_int_t& a, const T& b) { a = a - b; return a; } NIL_CO3_MP_BIG_INT_UNARY_TEMPLATE - constexpr auto& operator--(big_int_t& a) noexcept { + constexpr auto& operator--(big_int_t& a) { a.decrement(); return a; } NIL_CO3_MP_BIG_INT_UNARY_TEMPLATE - constexpr auto operator--(big_int_t& a, int) noexcept { + constexpr auto operator--(big_int_t& a, int) { auto copy = a; --a; return copy; diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/big_mod_impl.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/big_mod_impl.hpp index 12919046f..6e81bb8de 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/big_mod_impl.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/big_mod_impl.hpp @@ -176,12 +176,12 @@ namespace nil::crypto3::multiprecision { template || detail::is_integral_v, int> = \ 0> \ - constexpr auto operator OP_(const T& b) const noexcept { \ + friend constexpr auto operator OP_(const big_mod_impl& a, const T& b) noexcept { \ if constexpr (detail::is_big_mod_v) { \ - NIL_CO3_MP_ASSERT(ops().compare_eq(b.ops())); \ + NIL_CO3_MP_ASSERT(a.ops().compare_eq(b.ops())); \ } \ - big_mod_impl result = *this; \ - ops().METHOD_(result.raw_base(), convert_to_raw_base(b, ops())); \ + big_mod_impl result = a; \ + a.ops().METHOD_(result.raw_base(), convert_to_raw_base(b, a.ops())); \ return result; \ } \ \ @@ -196,12 +196,12 @@ namespace nil::crypto3::multiprecision { template || detail::is_integral_v, int> = \ 0> \ - constexpr auto& operator OP_ASSIGN_(const T & b) noexcept { \ + friend constexpr auto& operator OP_ASSIGN_(big_mod_impl & a, const T & b) noexcept { \ if constexpr (detail::is_big_mod_v) { \ - NIL_CO3_MP_ASSERT(ops().compare_eq(b.ops())); \ + NIL_CO3_MP_ASSERT(a.ops().compare_eq(b.ops())); \ } \ - ops().METHOD_(raw_base(), convert_to_raw_base(b, ops())); \ - return *this; \ + a.ops().METHOD_(a.raw_base(), convert_to_raw_base(b, a.ops())); \ + return a; \ } NIL_CO3_MP_BIG_MOD_OPERATOR_IMPL(+, +=, add) diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp index 7b6eb1aa0..b300f7df9 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp @@ -97,14 +97,14 @@ namespace nil::crypto3::multiprecision::detail { constexpr void add(big_uint &result, const big_uint &y) const { NIL_CO3_MP_ASSERT(result < mod() && y < mod()); - result += y; - // If we overflow and set the carry, we need to subtract the modulus, which is + bool carry = add_assign_with_carry(result, y); + + // If we overflow, we need to subtract the modulus, which is // the same as adding 2 ^ Bits - Modulus to the remaining part of the number. // After this we know for sure that the result < Modulus, do not waste time on // checking again. - if (result.has_carry()) { + if (carry) { result += mod_compliment(); - result.set_carry(false); } else if (result >= mod()) { result -= mod(); } diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp index 80d9c0207..422f767a6 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp @@ -4,7 +4,6 @@ #include #include #include -#include #include #include @@ -20,11 +19,14 @@ namespace nil::crypto3::multiprecision { namespace detail { + enum class operation_mode { checked, wrapping }; + // Addition/subtraction template - constexpr void add_constexpr_unsigned(big_uint& result, const big_uint& a, - const big_uint& b) noexcept { + [[nodiscard]] constexpr bool add_constexpr_unsigned(big_uint& result, + const big_uint& a, + const big_uint& b) noexcept { static_assert(Bits1 >= Bits2 && Bits1 >= Bits3, "invalid argument size"); // // This is the generic, C++ only version of addition. @@ -38,15 +40,16 @@ namespace nil::crypto3::multiprecision { double_limb_type v = static_cast(*a.limbs()) + static_cast(*b.limbs()); if (result.limb_count() == 1) { - double_limb_type mask = big_uint::upper_limb_mask; + constexpr double_limb_type mask = big_uint::upper_limb_mask; if (v & ~mask) { v &= mask; - result.set_carry(true); + carry = 1; } } result = v; - return; + return carry; } + result.zero_after(x); const_limb_pointer pa = a.limbs(); @@ -81,6 +84,8 @@ namespace nil::crypto3::multiprecision { ++pr, ++pa; } + NIL_CO3_MP_ASSERT(carry <= 1); + if (carry) { if (result.limb_count() > x) { result.limbs()[x] = static_cast(1u); @@ -88,25 +93,28 @@ namespace nil::crypto3::multiprecision { } } - if constexpr (Bits1 % limb_bits == 0) { - result.set_carry(carry); - } else { - limb_type mask = big_uint::upper_limb_mask; + if constexpr (Bits1 % limb_bits != 0) { // If we have set any bit above "Bits", then we have a carry. - if (result.limbs()[result.limb_count() - 1] & ~mask) { - result.limbs()[result.limb_count() - 1] &= mask; - result.set_carry(true); - } + carry = result.normalize(); + } + + return carry; + } + + template + constexpr void subtract_overflow() noexcept(Mode == operation_mode::wrapping) { + if constexpr (Mode == operation_mode::checked) { + throw std::overflow_error("big_uint: subtraction overflow"); } } // // Core subtraction routine: // - template + template constexpr void subtract_constexpr_unsigned(big_uint& result, const big_uint& a, - const big_uint& b) noexcept { + const big_uint& b) { static_assert(Bits1 >= Bits2 && Bits1 >= Bits3, "invalid argument size"); // // This is the generic, C++ only version of subtraction. @@ -123,23 +131,28 @@ namespace nil::crypto3::multiprecision { bool s = false; limb_type al = *a.limbs(); limb_type bl = *b.limbs(); - if (bl > al) { + if (al < bl) { + subtract_overflow(); std::swap(al, bl); s = true; } result = al - bl; if (s) { - result.negate(); + result.negate_wrapping(); } return; } + int c = a.compare(b); result.zero_after(x); + const_limb_pointer pa = a.limbs(); const_limb_pointer pb = b.limbs(); limb_pointer pr = result.limbs(); + bool swapped = false; if (c < 0) { + subtract_overflow(); std::swap(pa, pb); swapped = true; } else if (c == 0) { @@ -169,12 +182,8 @@ namespace nil::crypto3::multiprecision { } NIL_CO3_MP_ASSERT(0 == borrow); - // - // We may have lost digits, if so update limb usage count: - // - result.normalize(); if (swapped) { - result.negate(); + result.negate_wrapping(); } } @@ -196,170 +205,181 @@ namespace nil::crypto3::multiprecision { // are required to support these intrinsics. // template - constexpr void add_unsigned(big_uint& result, const big_uint& a, - const big_uint& b) noexcept { + [[nodiscard]] constexpr bool add_unsigned(big_uint& result, const big_uint& a, + const big_uint& b) noexcept { static_assert(Bits1 >= Bits2 && Bits1 >= Bits3, "invalid argument size"); + if (std::is_constant_evaluated()) { - add_constexpr_unsigned(result, a, b); - } else { - std::size_t as = a.used_limbs(); - std::size_t bs = b.used_limbs(); - auto [m, x] = std::minmax(as, bs); - - if (x == 1) { - double_limb_type v = static_cast(*a.limbs()) + - static_cast(*b.limbs()); - if (result.limb_count() == 1) { - double_limb_type mask = big_uint::upper_limb_mask; - if (v & ~mask) { - v &= mask; - result.set_carry(true); - } - } - result = v; - return; - } - const_limb_pointer pa = a.limbs(); - const_limb_pointer pb = b.limbs(); - limb_pointer pr = result.limbs(); + return add_constexpr_unsigned(result, a, b); + } - if (as < bs) { - std::swap(pa, pb); - } + std::size_t as = a.used_limbs(); + std::size_t bs = b.used_limbs(); + auto [m, x] = std::minmax(as, bs); - std::size_t i = 0; - unsigned char carry = 0; - for (; i + 4 <= m; i += 4) { - carry = detail::addcarry_limb(carry, pa[i + 0], pb[i + 0], pr + i); - carry = detail::addcarry_limb(carry, pa[i + 1], pb[i + 1], pr + i + 1); - carry = detail::addcarry_limb(carry, pa[i + 2], pb[i + 2], pr + i + 2); - carry = detail::addcarry_limb(carry, pa[i + 3], pb[i + 3], pr + i + 3); - } - for (; i < m; ++i) { - carry = detail::addcarry_limb(carry, pa[i], pb[i], pr + i); - } - for (; i < x && carry; ++i) { - // We know carry is 1, so we just need to increment pa[i] (ie add a literal 1) - // and capture the carry: - carry = detail::addcarry_limb(0, pa[i], 1, pr + i); - } - if (i == x && carry) { - if (result.limb_count() > x) { - result.limbs()[x] = static_cast(1u); + if (x == 1) { + double_limb_type v = static_cast(*a.limbs()) + + static_cast(*b.limbs()); + bool carry = false; + if (result.limb_count() == 1) { + constexpr double_limb_type mask = big_uint::upper_limb_mask; + if (v & ~mask) { + v &= mask; + carry = true; } - } else if ((x != i) && (pa != pr)) { - // Copy remaining digits only if we need to: - std::copy(pa + i, pa + x, pr + i); } + result = v; + return carry; + } - if constexpr (Bits1 % limb_bits == 0) { - result.set_carry(carry); - } else { - limb_type mask = big_uint::upper_limb_mask; - // If we have set any bit above "Bits", then we have a carry. - if (result.limbs()[result.limb_count() - 1] & ~mask) { - result.limbs()[result.limb_count() - 1] &= mask; - result.set_carry(true); - } + result.zero_after(x); + + const_limb_pointer pa = a.limbs(); + const_limb_pointer pb = b.limbs(); + limb_pointer pr = result.limbs(); + + if (as < bs) { + std::swap(pa, pb); + } + + std::size_t i = 0; + unsigned char carry = 0; + for (; i + 4 <= m; i += 4) { + carry = addcarry_limb(carry, pa[i + 0], pb[i + 0], pr + i); + carry = addcarry_limb(carry, pa[i + 1], pb[i + 1], pr + i + 1); + carry = addcarry_limb(carry, pa[i + 2], pb[i + 2], pr + i + 2); + carry = addcarry_limb(carry, pa[i + 3], pb[i + 3], pr + i + 3); + } + for (; i < m; ++i) { + carry = addcarry_limb(carry, pa[i], pb[i], pr + i); + } + for (; i < x && carry; ++i) { + // We know carry is 1, so we just need to increment pa[i] (ie add a literal 1) + // and capture the carry: + carry = addcarry_limb(0, pa[i], 1, pr + i); + } + if (i == x && carry) { + if (result.limb_count() > x) { + result.limbs()[x] = static_cast(1u); + carry = 0; } + } else if ((x != i) && (pa != pr)) { + // Copy remaining digits only if we need to: + std::copy(pa + i, pa + x, pr + i); + } + + NIL_CO3_MP_ASSERT(carry <= 1); + + if constexpr (Bits1 % limb_bits != 0) { + // If we have set any bit above "Bits", then we have a carry. + carry = result.normalize(); } + + return carry; } - template + template constexpr void subtract_unsigned(big_uint& result, const big_uint& a, - const big_uint& b) noexcept { + const big_uint& b) { static_assert(Bits1 >= Bits2 && Bits1 >= Bits3, "invalid argument size"); if (std::is_constant_evaluated()) { - subtract_constexpr_unsigned(result, a, b); - } else { - std::size_t as = a.used_limbs(); - std::size_t bs = b.used_limbs(); - auto [m, x] = std::minmax(as, bs); - // - // special cases for small limb counts: - // - if (x == 1) { - bool s = false; - limb_type al = *a.limbs(); - limb_type bl = *b.limbs(); - if (bl > al) { - std::swap(al, bl); - s = true; - } - result = al - bl; - if (s) { - result.negate(); - } - return; - } - int c = a.compare(b); - result.zero_after(x); - const_limb_pointer pa = a.limbs(); - const_limb_pointer pb = b.limbs(); - limb_pointer pr = result.limbs(); - bool swapped = false; - if (c < 0) { - std::swap(pa, pb); - swapped = true; - } else if (c == 0) { - result = static_cast(0u); - return; - } + subtract_constexpr_unsigned(result, a, b); + return; + } - std::size_t i = 0; - unsigned char borrow = 0; - // First where a and b overlap: - for (; i + 4 <= m; i += 4) { - borrow = detail::subborrow_limb(borrow, pa[i], pb[i], pr + i); - borrow = detail::subborrow_limb(borrow, pa[i + 1], pb[i + 1], pr + i + 1); - borrow = detail::subborrow_limb(borrow, pa[i + 2], pb[i + 2], pr + i + 2); - borrow = detail::subborrow_limb(borrow, pa[i + 3], pb[i + 3], pr + i + 3); - } - for (; i < m; ++i) { - borrow = detail::subborrow_limb(borrow, pa[i], pb[i], pr + i); - } - // Now where only a has digits, only as long as we've borrowed: - while (borrow && (i < x)) { - borrow = detail::subborrow_limb(borrow, pa[i], 0, pr + i); - ++i; - } - // Any remaining digits are the same as those in pa: - if ((x != i) && (pa != pr)) { - std::copy(pa + i, pa + x, pr + i); + std::size_t as = a.used_limbs(); + std::size_t bs = b.used_limbs(); + auto [m, x] = std::minmax(as, bs); + // + // special cases for small limb counts: + // + if (x == 1) { + bool s = false; + limb_type al = *a.limbs(); + limb_type bl = *b.limbs(); + if (al < bl) { + subtract_overflow(); + std::swap(al, bl); + s = true; } - NIL_CO3_MP_ASSERT(0 == borrow); - result.normalize(); - if (swapped) { - result.negate(); + result = al - bl; + if (s) { + result.negate_wrapping(); } - } // constexpr. + return; + } + + int c = a.compare(b); + result.zero_after(x); + + const_limb_pointer pa = a.limbs(); + const_limb_pointer pb = b.limbs(); + limb_pointer pr = result.limbs(); + + bool swapped = false; + if (c < 0) { + subtract_overflow(); + std::swap(pa, pb); + swapped = true; + } else if (c == 0) { + result = static_cast(0u); + return; + } + + std::size_t i = 0; + unsigned char borrow = 0; + // First where a and b overlap: + for (; i + 4 <= m; i += 4) { + borrow = subborrow_limb(borrow, pa[i], pb[i], pr + i); + borrow = subborrow_limb(borrow, pa[i + 1], pb[i + 1], pr + i + 1); + borrow = subborrow_limb(borrow, pa[i + 2], pb[i + 2], pr + i + 2); + borrow = subborrow_limb(borrow, pa[i + 3], pb[i + 3], pr + i + 3); + } + for (; i < m; ++i) { + borrow = subborrow_limb(borrow, pa[i], pb[i], pr + i); + } + // Now where only a has digits, only as long as we've borrowed: + while (borrow && (i < x)) { + borrow = subborrow_limb(borrow, pa[i], 0, pr + i); + ++i; + } + // Any remaining digits are the same as those in pa: + if ((x != i) && (pa != pr)) { + std::copy(pa + i, pa + x, pr + i); + } + NIL_CO3_MP_ASSERT(0 == borrow); + + if (swapped) { + result.negate_wrapping(); + } } #else template - constexpr void add_unsigned(big_uint& result, const big_uint& a, - const big_uint& b) noexcept { - add_constexpr_unsigned(result, a, b); + [[nodiscard]] constexpr bool add_unsigned(big_uint& result, const big_uint& a, + const big_uint& b) noexcept { + return add_constexpr_unsigned(result, a, b); } - template + template constexpr void subtract_unsigned(big_uint& result, const big_uint& a, - const big_uint& b) noexcept { - subtract_constexpr_unsigned(result, a, b); + const big_uint& b) { + subtract_constexpr_unsigned(result, a, b); } #endif template - constexpr void add_unsigned(big_uint& result, const big_uint& a, - const limb_type& b) noexcept { + [[nodiscard]] constexpr bool add_unsigned(big_uint& result, const big_uint& a, + const limb_type& b) noexcept { static_assert(Bits1 >= Bits2, "invalid argument size"); double_limb_type carry = b; limb_pointer pr = result.limbs(); const_limb_pointer pa = a.limbs(); + std::size_t i = 0; // Addition with carry until we either run out of digits or carry is zero: for (; carry && (i < result.limb_count()); ++i) { @@ -372,47 +392,48 @@ namespace nil::crypto3::multiprecision { std::copy(pa + i, pa + a.limb_count(), pr + i); } + NIL_CO3_MP_ASSERT(carry <= 1); + if (carry) { if (result.limb_count() > a.limb_count()) { - result.limbs()[a.limb_count()] = static_cast(carry); + result.limbs()[a.limb_count()] = static_cast(1u); carry = 0; } } - if constexpr (Bits1 % limb_bits == 0) { - result.set_carry(carry); - } else { - limb_type mask = big_uint::upper_limb_mask; + if constexpr (Bits1 % limb_bits != 0) { // If we have set any bit above "Bits", then we have a carry. - if (pr[result.limb_count() - 1] & ~mask) { - pr[result.limb_count() - 1] &= mask; - result.set_carry(true); - } + carry = result.normalize(); } + + return carry; } // // And again to subtract a single limb: // - template + template constexpr void subtract_unsigned(big_uint& result, const big_uint& a, - const limb_type& b) noexcept { + const limb_type& b) { static_assert(Bits1 >= Bits2, "invalid argument size"); // Subtract one limb. std::size_t as = a.used_limbs(); result.zero_after(as); constexpr double_limb_type borrow = static_cast(max_limb_value) + 1; + limb_pointer pr = result.limbs(); const_limb_pointer pa = a.limbs(); + if (*pa >= b) { *pr = *pa - b; if (&result != &a) { std::copy(pa + 1, pa + as, pr + 1); } } else if (as == 1) { + subtract_overflow(); *pr = b - *pa; - result.negate(); + result.negate_wrapping(); } else { *pr = static_cast((borrow + *pa) - b); std::size_t i = 1; @@ -425,37 +446,47 @@ namespace nil::crypto3::multiprecision { ++i; std::copy(pa + i, pa + as, pr + i); } - result.normalize(); } } - template - constexpr void add(big_uint& result, const big_uint& a, const T& b) noexcept { - static_assert(detail::is_integral_v); + template + constexpr void check_addition(bool carry) noexcept(Mode == operation_mode::wrapping) { + if constexpr (Mode == operation_mode::checked) { + if (carry) { + throw std::overflow_error("fixed precision overflow"); + } + } + } + + template + constexpr void add(big_uint& result, const big_uint& a, + const T& b) noexcept(Mode == operation_mode::wrapping) { + static_assert(is_integral_v); if constexpr (std::is_signed_v) { auto b_abs = unsigned_abs(b); if (b < 0) { - subtract_unsigned(result, a, detail::as_limb_type_or_big_uint(b_abs)); + subtract_unsigned(result, a, as_limb_type_or_big_uint(b_abs)); + } else { + check_addition(add_unsigned(result, a, as_limb_type_or_big_uint(b_abs))); } - add_unsigned(result, a, detail::as_limb_type_or_big_uint(b_abs)); } else { - add_unsigned(result, a, detail::as_limb_type_or_big_uint(b)); + check_addition(add_unsigned(result, a, as_limb_type_or_big_uint(b))); } } - template + template constexpr void subtract(big_uint& result, const big_uint& a, - const T& b) noexcept { - static_assert(detail::is_integral_v); + const T& b) noexcept(Mode == operation_mode::wrapping) { + static_assert(is_integral_v); if constexpr (std::is_signed_v) { auto b_abs = unsigned_abs(b); if (b < 0) { - detail::add_unsigned(result, a, detail::as_limb_type_or_big_uint(b_abs)); + check_addition(add_unsigned(result, a, as_limb_type_or_big_uint(b_abs))); } else { - detail::subtract_unsigned(result, a, detail::as_limb_type_or_big_uint(b_abs)); + subtract_unsigned(result, a, as_limb_type_or_big_uint(b_abs)); } } else { - detail::subtract_unsigned(result, a, detail::as_limb_type_or_big_uint(b)); + subtract_unsigned(result, a, as_limb_type_or_big_uint(b)); } } @@ -693,53 +724,60 @@ namespace nil::crypto3::multiprecision { // Multiplication - // These should be called only for creation of Montgomery and Barett - // params, calculation of inverse element and montgomery_reduce. Since these functions - // are relatively slow and are not called very often, we will not optimize them. We do - // NOT care about the execution speed. - - // Caller is responsible for the result to fit in Bits bits, we will NOT throw!!! + template + constexpr void multiplication_overflow_when(bool condition) noexcept( + Mode == operation_mode::wrapping) { + if constexpr (Mode == operation_mode::checked) { + if (condition) { + throw std::overflow_error("big_uint: multiplication overflow"); + } + } + } - template + // This is called during creation of Montgomery and Barett + // params, calculation of inverse element and montgomery_reduce. If they are slow + // or multiplication is needed in some other hot path this should be optimized. + template constexpr void multiply(big_uint& final_result, const big_uint& a, - const T& b_orig) noexcept { - auto b = detail::as_big_uint(b_orig); + const T& b_orig) { + static_assert(Bits1 >= Bits2); + + auto b = as_big_uint(b_orig); big_uint result; std::size_t as = a.used_limbs(); std::size_t bs = b.used_limbs(); const_limb_pointer pa = a.limbs(); const_limb_pointer pb = b.limbs(); limb_pointer pr = result.limbs(); - for (std::size_t i = 0; i < result.limb_count(); ++i) { - pr[i] = 0; - } + result.zero_after(0); double_limb_type carry = 0; for (std::size_t i = 0; i < as; ++i) { NIL_CO3_MP_ASSERT(result.limb_count() > i); std::size_t inner_limit = (std::min)(result.limb_count() - i, bs); + multiplication_overflow_when(inner_limit < bs); std::size_t j = 0; for (; j < inner_limit; ++j) { NIL_CO3_MP_ASSERT(i + j < result.limb_count()); carry += static_cast(pa[i]) * static_cast(pb[j]); - NIL_CO3_MP_ASSERT( - !std::numeric_limits::is_specialized || - ((std::numeric_limits::max)() - carry >= pr[i + j])); + NIL_CO3_MP_ASSERT(max_double_limb_value - carry >= pr[i + j]); carry += pr[i + j]; pr[i + j] = static_cast(carry); carry >>= limb_bits; NIL_CO3_MP_ASSERT(carry <= max_limb_value); } if (carry) { - NIL_CO3_MP_ASSERT(result.limb_count() > i + j); + multiplication_overflow_when(i + j >= result.limb_count()); if (i + j < result.limb_count()) { pr[i + j] = static_cast(carry); } + carry = 0; } - carry = 0; } - result.normalize(); + bool truncated = result.normalize(); + multiplication_overflow_when(truncated); + // TODO(ioxid): optimize this copy final_result = result; } } // namespace detail diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp index 7e80a3f45..d17840504 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp @@ -83,7 +83,7 @@ namespace nil::crypto3::multiprecision { private: // Zeros out everything after limb[i], replaces resizing. - constexpr void zero_after(std::size_t start_index) { + constexpr void zero_after(std::size_t start_index) noexcept { auto pr = this->limbs(); for (std::size_t i = start_index; i < this->limb_count(); ++i) { pr[i] = 0; @@ -112,7 +112,7 @@ namespace nil::crypto3::multiprecision { template && std::is_unsigned_v, int> = 0> - constexpr void do_assign_integral(const T& a) noexcept { + constexpr void do_assign_integral_unchecked(const T& a) noexcept { if constexpr (sizeof(T) <= sizeof(limb_type)) { this->limbs()[0] = a; this->zero_after(1); @@ -128,13 +128,21 @@ namespace nil::crypto3::multiprecision { zero_after(n); } this->normalize(); + } + + template && std::is_unsigned_v, int> = 0> + constexpr void do_assign_integral(const T& a) { + do_assign_integral_unchecked(a); if constexpr (sizeof(T) * CHAR_BIT > Bits) { - NIL_CO3_MP_ASSERT(big_uint(a).compare(*this) == 0); + if (big_uint(a).compare(*this) != 0) { + throw std::range_error("big_uint: out of range"); + } } } template - constexpr void do_assign(const big_uint& other) noexcept { + constexpr void do_assign_unchecked(const big_uint& other) noexcept { std::size_t count = (std::min)(other.limb_count(), this->limb_count()); for (std::size_t i = 0; i < count; ++i) { this->limbs()[i] = other.limbs()[i]; @@ -145,12 +153,23 @@ namespace nil::crypto3::multiprecision { this->normalize(); } + template + constexpr void do_assign(const big_uint& other) { + do_assign_unchecked(other); + if constexpr (Bits2 > Bits) { + if (other.compare(*this) != 0) { + throw std::range_error("big_uint: out of range"); + } + } + } + public: // TODO(ioxid): this should be private - constexpr void normalize() noexcept { limbs()[static_limb_count - 1] &= upper_limb_mask; } - - constexpr bool has_carry() const noexcept { return m_carry; } - constexpr void set_carry(bool carry) noexcept { m_carry = carry; } + constexpr bool normalize() noexcept { + bool result = limbs()[static_limb_count - 1] & ~upper_limb_mask; + limbs()[static_limb_count - 1] &= upper_limb_mask; + return result; + } // Constructor @@ -158,26 +177,25 @@ namespace nil::crypto3::multiprecision { constexpr big_uint(std::string_view str) { *this = str; } constexpr big_uint(const char* str) { *this = str; } - constexpr big_uint(const std::string &str) { *this = str; } + constexpr big_uint(const std::string& str) { *this = str; } template && std::is_signed_v, int> = 0> - constexpr big_uint(T val) noexcept { - NIL_CO3_MP_ASSERT_MSG(val >= 0, "big_uint: assignment from negative integer"); + constexpr big_uint(T val) { + if (val < 0) { + throw std::range_error("big_uint: assignment from negative integer"); + } do_assign_integral(static_cast>(val)); } template && std::is_unsigned_v, int> = 0> - constexpr big_uint(T val) noexcept { + constexpr big_uint(T val) { do_assign_integral(val); } // TODO(ioxid): make this explicit for the case when Bits2 > Bits template - constexpr big_uint(const big_uint& other) noexcept { + constexpr big_uint(const big_uint& other) { do_assign(other); - if constexpr (Bits2 > Bits) { - NIL_CO3_MP_ASSERT(other.compare(*this) == 0); - } } template @@ -195,15 +213,17 @@ namespace nil::crypto3::multiprecision { *this = detail::parse_int(str); return *this; } - constexpr big_uint& operator=(const std::string &str) { + constexpr big_uint& operator=(const std::string& str) { *this = detail::parse_int(str); return *this; } template && std::is_signed_v, int> = 0> - constexpr big_uint& operator=(T val) noexcept { - NIL_CO3_MP_ASSERT_MSG(val >= 0, "big_uint: assignment from negative integer"); + constexpr big_uint& operator=(T val) { + if (val < 0) { + throw std::range_error("big_uint: assignment from negative integer"); + } do_assign_integral(static_cast>(val)); return *this; } @@ -216,11 +236,8 @@ namespace nil::crypto3::multiprecision { } template - constexpr big_uint& operator=(const big_uint& other) noexcept { + constexpr big_uint& operator=(const big_uint& other) { do_assign(other); - if constexpr (Bits2 > Bits) { - NIL_CO3_MP_ASSERT(other.compare(*this) == 0); - } return *this; } @@ -239,7 +256,7 @@ namespace nil::crypto3::multiprecision { } } if (bits > Bits) { - throw std::invalid_argument("not enough bits"); + throw std::range_error("big_uint: not enough bits to store bytes"); } return *this; } @@ -308,7 +325,7 @@ namespace nil::crypto3::multiprecision { template = 0> constexpr big_uint truncate() const noexcept { big_uint result; - result.do_assign(*this); + result.do_assign_unchecked(*this); return result; } @@ -412,7 +429,7 @@ namespace nil::crypto3::multiprecision { // Arithmetic operations - constexpr void negate() noexcept { + constexpr void negate_wrapping() noexcept { if (is_zero()) { return; } @@ -420,6 +437,12 @@ namespace nil::crypto3::multiprecision { ++*this; } + constexpr auto negated_wrapping() const noexcept { + auto result = *this; + result.negate_wrapping(); + return result; + } + constexpr auto& operator++() noexcept { if (limbs()[0] < max_limb_value) { ++limbs()[0]; @@ -427,7 +450,8 @@ namespace nil::crypto3::multiprecision { normalize(); } } else { - detail::add(*this, *this, static_cast(1u)); + detail::add(*this, *this, + static_cast(1u)); } return *this; } @@ -446,7 +470,8 @@ namespace nil::crypto3::multiprecision { if (limbs()[0]) { --limbs()[0]; } else { - detail::subtract(*this, *this, static_cast(1u)); + detail::subtract(*this, *this, + static_cast(1u)); } return *this; } @@ -456,77 +481,144 @@ namespace nil::crypto3::multiprecision { return copy; } - constexpr big_uint operator-() const noexcept { - big_uint result = *this; - result.negate(); + template, int> = 0> + friend constexpr auto operator+(const big_uint& a, const T& b) { + detail::largest_big_uint_t result; + detail::add(result, a, b); return result; } - // Arithmetic operations + template, int> = 0> + friend constexpr auto operator+(const T& a, const big_uint& b) { + return b + a; + } template, int> = 0> - constexpr auto operator+(const T& b) const noexcept { + friend constexpr auto& operator+=(big_uint& a, const T& b) { + detail::add(a, a, b); + return a; + } + + template, int> = 0> + friend constexpr auto add_wrapping(const big_uint& a, const T& b) noexcept { detail::largest_big_uint_t result; - detail::add(result, *this, b); + detail::add(result, a, b); return result; } template, int> = 0> - friend constexpr auto operator+(const T& a, const big_uint& b) noexcept { - return b + a; + friend constexpr auto add_wrapping(const T& a, const big_uint& b) noexcept { + return add_wrapping(b, a); } template, int> = 0> - constexpr auto& operator+=(const T& b) noexcept { - detail::add(*this, *this, b); - return *this; + friend constexpr auto& add_assign_wrapping(big_uint& a, const T& b) noexcept { + detail::add(a, a, b); + return a; } template, int> = 0> - constexpr auto operator-(const T& b) const noexcept { + friend constexpr auto operator-(const big_uint& a, const T& b) { detail::largest_big_uint_t result; - detail::subtract(result, *this, b); + detail::subtract(result, a, b); return result; } template, int> = 0> - friend constexpr auto operator-(const T& a, const big_uint& b) noexcept { - return (-b) + a; + friend constexpr auto operator-(const T& a, const big_uint& b) { + auto a_unsigned = detail::unsigned_or_throw(a); + if (a_unsigned < b) { + throw std::overflow_error("big_uint: subtraction overflow"); + } + return add_wrapping(b.negated_wrapping(), a); } template, int> = 0> - constexpr auto& operator-=(const T& b) noexcept { - detail::subtract(*this, *this, b); - return *this; + friend constexpr auto& operator-=(big_uint& a, const T& b) { + detail::subtract(a, a, b); + return a; } template, int> = 0> - constexpr auto operator*(const T& b) const noexcept { + friend constexpr auto subtract_wrapping(const big_uint& a, const T& b) noexcept { + detail::largest_big_uint_t result; + detail::subtract(result, a, b); + return result; + } + + template, int> = 0> + friend constexpr auto subtract_wrapping(const T& a, const big_uint& b) noexcept { + return add_wrapping(b.negated_wrapping(), a); + } + + template, int> = 0> + friend constexpr auto& subtract_assign_wrapping(big_uint& a, const T& b) noexcept { + detail::subtract(a, a, b); + return a; + } + + template, int> = 0> + friend constexpr auto operator*(const big_uint& a, const T& b) { decltype(auto) b_unsigned = detail::unsigned_or_throw(b); detail::largest_big_uint_t result; - detail::multiply(result, *this, detail::as_big_uint(b_unsigned)); + detail::multiply(result, a, + detail::as_big_uint(b_unsigned)); return result; } template, int> = 0> - friend constexpr auto operator*(const T& a, const big_uint& b) noexcept { + friend constexpr auto operator*(const T& a, const big_uint& b) { return b * a; } template, int> = 0> - constexpr auto& operator*=(const T& b) noexcept { + friend constexpr auto& operator*=(big_uint& a, const T& b) { decltype(auto) b_unsigned = detail::unsigned_or_throw(b); - big_uint result; - detail::multiply(result, *this, detail::as_big_uint(b_unsigned)); - *this = result; - return *this; + detail::multiply(a, a, + detail::as_big_uint(b_unsigned)); + return a; + } + + template, int> = 0> + friend constexpr auto multiply_wrapping(const big_uint& a, const T& b) { + decltype(auto) b_unsigned = detail::unsigned_abs(b); + detail::largest_big_uint_t result; + detail::multiply(result, a, + detail::as_big_uint(b_unsigned)); + if constexpr (std::is_signed_v) { + if (b < 0) { + result.negate_wrapping(); + } + } + return result; } + template, int> = 0> + friend constexpr auto multiply_wrapping(const T& a, const big_uint& b) { + return multiply_wrapping(b, a); + } + + template, int> = 0> + friend constexpr auto& multiply_assign_wrapping(big_uint& a, const T& b) { + decltype(auto) b_unsigned = detail::unsigned_abs(b); + detail::multiply(a, a, + detail::as_big_uint(b_unsigned)); + if constexpr (std::is_signed_v) { + if (b < 0) { + a.negate_wrapping(); + } + } + return a; + } + + // TODO(ioxid): maybe add wrapping version of division and modulus, which accepts negative + // arguments + template && detail::is_integral_v) || (std::is_integral_v && std::is_same_v), int> = 0> - friend constexpr auto operator/(const T1& a, const T2& b) noexcept { + friend constexpr auto operator/(const T1& a, const T2& b) { decltype(auto) a_unsigned = detail::unsigned_or_throw(a); decltype(auto) b_unsigned = detail::unsigned_or_throw(b); using big_uint_a = std::decay_t; @@ -538,13 +630,13 @@ namespace nil::crypto3::multiprecision { } template, int> = 0> - constexpr auto& operator/=(const T& b) noexcept { + friend constexpr auto& operator/=(big_uint& a, const T& b) { decltype(auto) b_unsigned = detail::unsigned_or_throw(b); big_uint result; big_uint modulus; - detail::divide(&result, *this, detail::as_big_uint(b_unsigned), modulus); - *this = result; - return *this; + detail::divide(&result, a, detail::as_big_uint(b_unsigned), modulus); + a = result; + return a; } template, int> = 0> - constexpr auto& operator%=(const T& b) { + friend constexpr auto& operator%=(big_uint& a, const T& b) { decltype(auto) b_unsigned = detail::unsigned_or_throw(b); big_uint modulus; - detail::divide(static_cast(nullptr), *this, detail::as_big_uint(b_unsigned), + detail::divide(static_cast(nullptr), a, detail::as_big_uint(b_unsigned), modulus); - *this = modulus; - return *this; + a = modulus; + return a; } #define NIL_CO3_MP_BIG_UINT_BITWISE_OPERATOR_IMPL(OP_, OP_ASSIGN_, METHOD_) \ template, int> = 0> \ - constexpr auto operator OP_(const T& b) const noexcept { \ - detail::largest_big_uint_t result = *this; \ + friend constexpr auto operator OP_(const big_uint& a, const T& b) { \ + detail::largest_big_uint_t result = a; \ result.METHOD_(detail::as_limb_type_or_big_uint(detail::unsigned_or_throw(b))); \ return result; \ } \ \ template, int> = 0> \ - friend constexpr auto operator OP_(const T& a, const big_uint& b) noexcept { \ + friend constexpr auto operator OP_(const T& a, const big_uint& b) { \ return b OP_ a; \ } \ \ template, int> = 0> \ - constexpr auto& operator OP_ASSIGN_(const T & b) noexcept { \ - METHOD_(detail::as_limb_type_or_big_uint(detail::unsigned_or_throw(b))); \ - return *this; \ + friend constexpr auto& operator OP_ASSIGN_(big_uint & a, const T & b) { \ + a.METHOD_(detail::as_limb_type_or_big_uint(detail::unsigned_or_throw(b))); \ + return a; \ } NIL_CO3_MP_BIG_UINT_BITWISE_OPERATOR_IMPL(&, &=, bitwise_and) @@ -1002,46 +1094,53 @@ namespace nil::crypto3::multiprecision { // m_data[0] contains the lowest bits. std::array m_data{0}; - // This is a temporary value which is set when carry has happend during addition. - // If this value is true, reduction by modulus must happen next. - bool m_carry = false; - // Friends template friend class big_uint; template - friend constexpr void detail::add_constexpr_unsigned(big_uint& result, + friend constexpr bool detail::add_constexpr_unsigned(big_uint& result, const big_uint& a, const big_uint& b) noexcept; + template + friend constexpr void detail::subtract_constexpr_unsigned(big_uint& result, + const big_uint& a, + const big_uint& b); template - friend constexpr void detail::subtract_constexpr_unsigned( - big_uint& result, const big_uint& a, const big_uint& b) noexcept; - template - friend constexpr void detail::add_unsigned(big_uint& result, + friend constexpr bool detail::add_unsigned(big_uint& result, const big_uint& a, const big_uint& b) noexcept; - template + template friend constexpr void detail::subtract_unsigned(big_uint& result, const big_uint& a, - const big_uint& b) noexcept; + const big_uint& b); template - friend constexpr void detail::add_unsigned(big_uint& result, + friend constexpr bool detail::add_unsigned(big_uint& result, const big_uint& a, const limb_type& o) noexcept; - template + template friend constexpr void detail::subtract_unsigned(big_uint& result, const big_uint& a, - const limb_type& b) noexcept; + const limb_type& b); template friend constexpr void detail::divide(big_uint* div, const big_uint& x, const big_uint& y, big_uint& rem); - template + template friend constexpr void detail::multiply(big_uint& result, const big_uint& a, - const T& b) noexcept; + const T& b); }; + // Addition with carry + + template + [[nodiscard]] constexpr bool add_assign_with_carry(big_uint& a, + const big_uint& b) noexcept { + return detail::add_unsigned(a, a, b); + } + // Hash template diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/parsing.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/parsing.hpp index 9d8bc7b5a..e8d17b5f5 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/parsing.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/parsing.hpp @@ -49,7 +49,7 @@ namespace nil::crypto3::multiprecision { } } if (bits > Bits) { - throw std::invalid_argument("not enough bits to store literal"); + throw std::range_error("not enough bits to store literal"); } return result; } diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/storage.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/storage.hpp index 6047d7270..fb97aaab1 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/storage.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/storage.hpp @@ -24,6 +24,7 @@ namespace nil::crypto3::multiprecision::detail { static constexpr std::size_t limb_bits = sizeof(limb_type) * CHAR_BIT; static constexpr limb_type max_limb_value = ~static_cast(0u); + static constexpr double_limb_type max_double_limb_value = ~static_cast(0u); // Given a value represented in 'double_limb_type', decomposes it into // two 'limb_type' variables, based on high order bits and low order bits. diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_utils.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_utils.hpp index 261cbcf56..78fbacbb4 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_utils.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_utils.hpp @@ -2,6 +2,8 @@ #include +#include "nil/crypto3/multiprecision/detail/big_uint/type_traits.hpp" + namespace nil::crypto3::multiprecision::detail { template && std::is_signed_v, int> = 0> constexpr std::make_unsigned_t unsigned_abs(T x) { @@ -9,4 +11,10 @@ namespace nil::crypto3::multiprecision::detail { return (x < 0) ? -ux : ux; // compare signed x, negate unsigned x } + template || + (std::is_integral_v && std::is_unsigned_v), + int> = 0> + constexpr decltype(auto) unsigned_abs(T&& x) { + return std::forward(x); + } } // namespace nil::crypto3::multiprecision::detail diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/type_traits.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/type_traits.hpp index 8841175bc..e9ec825bf 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/type_traits.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/type_traits.hpp @@ -20,7 +20,7 @@ namespace nil::crypto3::multiprecision::detail { template, int> = 0> constexpr std::make_unsigned_t unsigned_or_throw(const T& a) { if (a < 0) { - throw std::invalid_argument("nonnegative value expected"); + throw std::range_error("nonnegative value expected"); } return static_cast>(a); } diff --git a/crypto3/libs/multiprecision/test/big_int.cpp b/crypto3/libs/multiprecision/test/big_int.cpp index b4403f4ee..d566d5e54 100644 --- a/crypto3/libs/multiprecision/test/big_int.cpp +++ b/crypto3/libs/multiprecision/test/big_int.cpp @@ -1,8 +1,10 @@ #define BOOST_TEST_MODULE big_int_test #include + #include #include +#include #include #include "nil/crypto3/multiprecision/big_uint.hpp" @@ -79,12 +81,12 @@ BOOST_AUTO_TEST_CASE(ops) { #define TEST_BINARY_OP(op) \ do { \ b = 32u; \ - a = 4; \ + a = 30; \ b = a op a; \ - b = 2 op a; \ - b = a op 2; \ - b = 2u op a; \ - b = a op 2u; \ + b = 200 op a; \ + b = a op 20; \ + b = 200u op a; \ + b = a op 20u; \ b = 32u; \ b op## = a; \ b op## = 2; \ @@ -99,7 +101,7 @@ BOOST_AUTO_TEST_CASE(ops) { TEST_BINARY_OP(-); --b; b--; - b = -b; + // b = -b; TEST_BINARY_OP(%); TEST_BINARY_OP(/); @@ -119,12 +121,12 @@ BOOST_AUTO_TEST_SUITE(addition) BOOST_AUTO_TEST_CASE(simple) { BOOST_CHECK_EQUAL(0x2_big_uint60 + 0x3_big_uint60, 0x5_big_uint60); } -BOOST_AUTO_TEST_CASE(wraps) { - BOOST_CHECK_EQUAL(0xFFFFFFFF_big_uint32 + 0x2_big_uint32, 0x00000001_big_uint32); +BOOST_AUTO_TEST_CASE(overflow_throws) { + BOOST_CHECK_THROW(0xFFFFFFFF_big_uint32 + 0x2_big_uint32, std::overflow_error); } -BOOST_AUTO_TEST_CASE(wraps_rev) { - BOOST_CHECK_EQUAL(0x2_big_uint32 + 0xFFFFFFFF_big_uint32, 0x00000001_big_uint32); +BOOST_AUTO_TEST_CASE(overflow_throws_rev) { + BOOST_CHECK_THROW(0x2_big_uint32 + 0xFFFFFFFF_big_uint32, std::overflow_error); } BOOST_AUTO_TEST_CASE(multilimb) { @@ -141,12 +143,16 @@ BOOST_AUTO_TEST_SUITE(multiplication) BOOST_AUTO_TEST_CASE(simple) { BOOST_CHECK_EQUAL(0x2_big_uint60 * 0x3_big_uint60, 0x6_big_uint60); } -BOOST_AUTO_TEST_CASE(wraps) { - BOOST_CHECK_EQUAL(0xFFFFFFFF_big_uint32 * 0x2_big_uint32, 0xFFFFFFFE_big_uint32); +BOOST_AUTO_TEST_CASE(multilimb) { + BOOST_CHECK_EQUAL(0xAFFFFFFFF_big_uint37 * 0x2_big_uint37, 0x15FFFFFFFE_big_uint37); } -BOOST_AUTO_TEST_CASE(multilimb) { - BOOST_CHECK_EQUAL(0xAFFFFFFFF_big_uint36 * 0x2_big_uint36, 0x5FFFFFFFE_big_uint36); +BOOST_AUTO_TEST_CASE(overflow_throws) { + BOOST_CHECK_THROW(0xFFFFFFFF_big_uint32 * 0x2_big_uint32, std::overflow_error); +} + +BOOST_AUTO_TEST_CASE(multilimb_overflow_throws) { + BOOST_CHECK_THROW(0xAFFFFFFFF_big_uint36 * 0x2_big_uint36, std::overflow_error); } BOOST_AUTO_TEST_SUITE_END() From 4aa79bbb671700ab56a755623d84a97a7cdf2941 Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Tue, 17 Dec 2024 17:12:30 +0100 Subject: [PATCH 06/29] multiprecision: make benchmarks optimize correctly --- crypto3/benchmarks/multiprecision/big_int.cpp | 8 ++++---- .../benchmarks/multiprecision/modular_adaptor_fixed.cpp | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/crypto3/benchmarks/multiprecision/big_int.cpp b/crypto3/benchmarks/multiprecision/big_int.cpp index e3c975f64..233a71a3d 100644 --- a/crypto3/benchmarks/multiprecision/big_int.cpp +++ b/crypto3/benchmarks/multiprecision/big_int.cpp @@ -52,7 +52,7 @@ BOOST_AUTO_TEST_SUITE(runtime_odd_tests) // This directly calls montgomery mul from modular_ops.hpp. BOOST_AUTO_TEST_CASE(montgomery_mul_perf_test) { auto raw_base = x_mod_rt_odd.raw_base(); - auto mod_ops = x_mod_rt_odd.ops(); + const auto &mod_ops = x_mod_rt_odd.ops(); nil::crypto3::bench::run_benchmark<>( "[odd modulus][runtime] montgomery mul (direct call)", @@ -113,7 +113,7 @@ BOOST_AUTO_TEST_SUITE(compile_time_odd_tests) // This directly calls montgomery mul from modular_ops.hpp. BOOST_AUTO_TEST_CASE(montgomery_mul_perf_test) { auto raw_base = x_mod_ct_odd.raw_base(); - auto mod_ops = x_mod_ct_odd.ops(); + const auto &mod_ops = x_mod_ct_odd.ops(); nil::crypto3::bench::run_benchmark<>( "[odd modulus][compile time] montgomery mul (direct call)", @@ -174,7 +174,7 @@ BOOST_AUTO_TEST_SUITE(runtime_even_tests) // This directly calls barrett mul from modular_ops.hpp. BOOST_AUTO_TEST_CASE(barrett_mul_perf_test) { auto raw_base = x_mod_rt_even.raw_base(); - auto mod_ops = x_mod_rt_even.ops(); + const auto &mod_ops = x_mod_rt_even.ops(); nil::crypto3::bench::run_benchmark<>( "[even modulus][runtime] barrett mul (direct call)", @@ -235,7 +235,7 @@ BOOST_AUTO_TEST_SUITE(compile_time_even_tests) // This directly calls mul from modular_ops.hpp. BOOST_AUTO_TEST_CASE(barrett_mul_perf_test) { auto raw_base = x_mod_ct_even.raw_base(); - auto mod_ops = x_mod_ct_even.ops(); + const auto &mod_ops = x_mod_ct_even.ops(); nil::crypto3::bench::run_benchmark<>( "[even modulus][compile time] barrett mul (direct call)", diff --git a/crypto3/benchmarks/multiprecision/modular_adaptor_fixed.cpp b/crypto3/benchmarks/multiprecision/modular_adaptor_fixed.cpp index 1492522e4..0e2445b5c 100644 --- a/crypto3/benchmarks/multiprecision/modular_adaptor_fixed.cpp +++ b/crypto3/benchmarks/multiprecision/modular_adaptor_fixed.cpp @@ -85,7 +85,7 @@ BOOST_AUTO_TEST_SUITE(runtime_odd_tests) // This directly calls montgomery_mul from modular_functions_fixed.hpp. BOOST_AUTO_TEST_CASE(montgomery_mul_perf_test) { auto base_data = x_mod_rt_odd.backend().base_data(); - auto mod_object = x_mod_rt_odd.backend().mod_data().get_mod_obj(); + const auto &mod_object = x_mod_rt_odd.backend().mod_data().get_mod_obj(); nil::crypto3::bench::run_benchmark<>( "[odd modulus][runtime] montgomery_mul (direct call)", @@ -165,7 +165,7 @@ BOOST_AUTO_TEST_SUITE(compile_time_odd_tests) // This directly calls montgomery_mul from modular_functions_fixed.hpp. BOOST_AUTO_TEST_CASE(montgomery_mul_perf_test) { auto base_data = x_mod_ct_odd.backend().base_data(); - auto mod_object = x_mod_ct_odd.backend().mod_data().get_mod_obj(); + const auto &mod_object = x_mod_ct_odd.backend().mod_data().get_mod_obj(); nil::crypto3::bench::run_benchmark<>( "[odd modulus][compile time] montgomery_mul (direct call)", @@ -245,7 +245,7 @@ BOOST_AUTO_TEST_SUITE(runtime_even_tests) // This directly calls regular_mul from modular_functions_fixed.hpp. BOOST_AUTO_TEST_CASE(barrett_mul_perf_test) { auto base_data = x_mod_rt_even.backend().base_data(); - auto mod_object = x_mod_rt_even.backend().mod_data().get_mod_obj(); + const auto &mod_object = x_mod_rt_even.backend().mod_data().get_mod_obj(); nil::crypto3::bench::run_benchmark<>( "[even modulus][runtime] regular_mul (direct call)", @@ -324,7 +324,7 @@ BOOST_AUTO_TEST_SUITE(compile_time_even_tests) // This directly calls regular_mul from modular_functions_fixed.hpp. BOOST_AUTO_TEST_CASE(barrett_mul_perf_test) { auto base_data = x_mod_ct_even.backend().base_data(); - auto mod_object = x_mod_ct_even.backend().mod_data().get_mod_obj(); + const auto &mod_object = x_mod_ct_even.backend().mod_data().get_mod_obj(); nil::crypto3::bench::run_benchmark<>( "[even modulus][compile time] regular_mul (direct call)", From c0e35fb77725d8290017fe8cac1935107d030c1a Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Tue, 17 Dec 2024 18:06:40 +0100 Subject: [PATCH 07/29] multiprecision: big_uint: optimize comparison --- .../detail/big_uint/big_uint_impl.hpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp index d17840504..5e385c3b3 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp @@ -361,14 +361,20 @@ namespace nil::crypto3::multiprecision { template constexpr int compare(const big_uint& b) const noexcept { - std::size_t as = used_limbs(); - std::size_t bs = b.used_limbs(); - if (as != bs) { - return as > bs ? 1 : -1; - } auto pa = limbs(); auto pb = b.limbs(); - for (auto i = static_cast(as) - 1; i >= 0; --i) { + constexpr std::size_t m = std::min(static_limb_count, big_uint::static_limb_count); + for (auto i = static_cast(limb_count()) - 1; i >= b.limb_count(); --i) { + if (pa[i]) { + return 1; + } + } + for (auto i = static_cast(b.limb_count()) - 1; i >= limb_count(); --i) { + if (pb[i]) { + return -1; + } + } + for (auto i = static_cast(m) - 1; i >= 0; --i) { if (pa[i] != pb[i]) { return pa[i] > pb[i] ? 1 : -1; } From aac7947a4b39a463fb285318753d16abc14e0991 Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Tue, 17 Dec 2024 21:27:30 +0100 Subject: [PATCH 08/29] multiprecision: add inverse benchmarks --- crypto3/benchmarks/multiprecision/big_int.cpp | 18 ++ .../multiprecision/modular_adaptor_fixed.cpp | 282 +++++++++--------- 2 files changed, 161 insertions(+), 139 deletions(-) diff --git a/crypto3/benchmarks/multiprecision/big_int.cpp b/crypto3/benchmarks/multiprecision/big_int.cpp index 233a71a3d..ae39f8c62 100644 --- a/crypto3/benchmarks/multiprecision/big_int.cpp +++ b/crypto3/benchmarks/multiprecision/big_int.cpp @@ -290,3 +290,21 @@ BOOST_AUTO_TEST_CASE(big_mod_mul_perf_test) { } BOOST_AUTO_TEST_SUITE_END() + +BOOST_AUTO_TEST_SUITE(compile_time_inverse_tests) + +BOOST_AUTO_TEST_CASE(inverse_extended_euclidean_algorithm_test) { + auto x_modular = x_mod_ct_odd; + + nil::crypto3::bench::run_benchmark<>( + "[odd modulus][compile time] inverse_extended_euclidean_algorithm_test", [&]() { + x_modular = inverse_extended_euclidean_algorithm(x_modular); + ++x_modular; + return x_modular; + }); + + // Print something so the whole computation is not optimized out. + std::cout << x_modular << std::endl; +} + +BOOST_AUTO_TEST_SUITE_END() diff --git a/crypto3/benchmarks/multiprecision/modular_adaptor_fixed.cpp b/crypto3/benchmarks/multiprecision/modular_adaptor_fixed.cpp index 0e2445b5c..a7e0ff3c2 100644 --- a/crypto3/benchmarks/multiprecision/modular_adaptor_fixed.cpp +++ b/crypto3/benchmarks/multiprecision/modular_adaptor_fixed.cpp @@ -7,40 +7,23 @@ // http://www.boost.org/LICENSE_1_0.txt //---------------------------------------------------------------------------// -#include "nil/crypto3/multiprecision/boost_backends/modular/modular_params.hpp" #define BOOST_TEST_MODULE modular_fixed_multiprecision_test #define TEST_CPP_INT -// Suddenly, BOOST_MP_ASSERT is NOT constexpr, and it is used in constexpr -// functions throughout the boost, resulting to compilation errors on all -// compilers in debug mode. We need to switch assertions off inside cpp_int -// to make this code compile in debug mode. So we use this workaround to -// turn off file 'boost/multiprecision/detail/assert.hpp' which contains -// definition of BOOST_MP_ASSERT and BOOST_MP_ASSERT_MSG. -#ifndef BOOST_MP_DETAIL_ASSERT_HPP - #define BOOST_MP_DETAIL_ASSERT_HPP - #define BOOST_MP_ASSERT(expr) ((void)0) - #define BOOST_MP_ASSERT_MSG(expr, msg) ((void)0) -#endif - -#include -#include #include - +#include +#include #include - +#include #include #include #include - +#include #include +#include #include -#include - -#include - using namespace boost::multiprecision; using boost::multiprecision::backends::cpp_int_modular_backend; @@ -51,8 +34,10 @@ using boost::multiprecision::backends::modular_params_rt; using Backend = cpp_int_modular_backend<256>; using standart_number = boost::multiprecision::number; -constexpr standart_number modulus_odd = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f_cppui_modular256; -constexpr standart_number modulus_even = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e_cppui_modular256; +constexpr standart_number modulus_odd = + 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f_cppui_modular256; +constexpr standart_number modulus_even = + 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e_cppui_modular256; constexpr backends::modular_params params_odd{modulus_odd.backend()}; constexpr backends::modular_params params_even{modulus_even.backend()}; @@ -68,13 +53,15 @@ using modular_number_ct_odd = boost::multiprecision::number; using modular_number_rt = boost::multiprecision::number; -constexpr standart_number x = 0xb5d724ce6f44c3c587867bbcb417e9eb6fa05e7e2ef029166568f14eb3161387_cppui_modular256; +constexpr standart_number x = + 0xb5d724ce6f44c3c587867bbcb417e9eb6fa05e7e2ef029166568f14eb3161387_cppui_modular256; constexpr modular_number_ct_odd x_mod_ct_odd = modular_backend_ct_odd(x.backend()); constexpr modular_number_ct_even x_mod_ct_even = modular_backend_ct_even(x.backend()); constexpr modular_number_rt x_mod_rt_odd = modular_backend_rt(x.backend(), modulus_odd.backend()); constexpr modular_number_rt x_mod_rt_even = modular_backend_rt(x.backend(), modulus_even.backend()); -constexpr standart_number y = 0xad6e1fcc680392abfb075838eafa513811112f14c593e0efacb6e9d0d7770b4_cppui_modular256; +constexpr standart_number y = + 0xad6e1fcc680392abfb075838eafa513811112f14c593e0efacb6e9d0d7770b4_cppui_modular256; constexpr modular_number_ct_odd y_mod_ct_odd = modular_backend_ct_odd(y.backend()); constexpr modular_number_ct_even y_mod_ct_even = modular_backend_ct_even(y.backend()); constexpr modular_number_rt y_mod_rt_odd = modular_backend_rt(y.backend(), modulus_odd.backend()); @@ -88,12 +75,14 @@ BOOST_AUTO_TEST_CASE(montgomery_mul_perf_test) { const auto &mod_object = x_mod_rt_odd.backend().mod_data().get_mod_obj(); nil::crypto3::bench::run_benchmark<>( - "[odd modulus][runtime] montgomery_mul (direct call)", - [&]() { - mod_object.montgomery_mul(base_data, y_mod_rt_odd.backend().base_data(), - std::integral_constant::value>()); - return base_data; - }); + "[odd modulus][runtime] montgomery_mul (direct call)", [&]() { + mod_object.montgomery_mul( + base_data, y_mod_rt_odd.backend().base_data(), + std::integral_constant< + bool, + boost::multiprecision::backends::is_trivial_cpp_int_modular::value>()); + return base_data; + }); std::cout << base_data << std::endl; } @@ -103,12 +92,11 @@ BOOST_AUTO_TEST_CASE(modular_adaptor_backend_sub_perf_test) { auto x_modular = x_mod_rt_odd.backend(); - nil::crypto3::bench::run_benchmark<>( - "[odd modulus][runtime] modular_adaptor_backend_subtract", - [&]() { - eval_subtract(x_modular, y_mod_rt_odd.backend()); - return x_modular; - }); + nil::crypto3::bench::run_benchmark<>("[odd modulus][runtime] modular_adaptor_backend_subtract", + [&]() { + eval_subtract(x_modular, y_mod_rt_odd.backend()); + return x_modular; + }); // Print something so the whole computation is not optimized out. std::cout << x_modular << std::endl; @@ -119,12 +107,11 @@ BOOST_AUTO_TEST_CASE(modular_adaptor_backend_add_perf_test) { auto x_modular = x_mod_rt_odd.backend(); - nil::crypto3::bench::run_benchmark<>( - "[odd modulus][runtime] modular_adaptor_backend_add", - [&]() { - eval_add(x_modular, y_mod_rt_odd.backend()); - return x_modular; - }); + nil::crypto3::bench::run_benchmark<>("[odd modulus][runtime] modular_adaptor_backend_add", + [&]() { + eval_add(x_modular, y_mod_rt_odd.backend()); + return x_modular; + }); // Print something so the whole computation is not optimized out. std::cout << x_modular << std::endl; @@ -133,12 +120,11 @@ BOOST_AUTO_TEST_CASE(modular_adaptor_backend_add_perf_test) { BOOST_AUTO_TEST_CASE(modular_adaptor_backend_mul_perf_test) { auto x_modular = x_mod_rt_odd.backend(); - nil::crypto3::bench::run_benchmark<>( - "[odd modulus][runtime] modular_adaptor_backend_multiply", - [&]() { - eval_multiply(x_modular, y_mod_rt_odd.backend()); - return x_modular; - }); + nil::crypto3::bench::run_benchmark<>("[odd modulus][runtime] modular_adaptor_backend_multiply", + [&]() { + eval_multiply(x_modular, y_mod_rt_odd.backend()); + return x_modular; + }); // Print something so the whole computation is not optimized out. std::cout << x_modular << std::endl; @@ -147,12 +133,11 @@ BOOST_AUTO_TEST_CASE(modular_adaptor_backend_mul_perf_test) { BOOST_AUTO_TEST_CASE(modular_adaptor_number_mul_perf_test) { auto x = x_mod_rt_odd; - nil::crypto3::bench::run_benchmark<>( - "[odd modulus][runtime] modular_adaptor_number_multiply", - [&]() { - x *= y_mod_rt_odd; - return x; - }); + nil::crypto3::bench::run_benchmark<>("[odd modulus][runtime] modular_adaptor_number_multiply", + [&]() { + x *= y_mod_rt_odd; + return x; + }); // Print something so the whole computation is not optimized out. std::cout << x << std::endl; @@ -168,12 +153,14 @@ BOOST_AUTO_TEST_CASE(montgomery_mul_perf_test) { const auto &mod_object = x_mod_ct_odd.backend().mod_data().get_mod_obj(); nil::crypto3::bench::run_benchmark<>( - "[odd modulus][compile time] montgomery_mul (direct call)", - [&]() { - mod_object.montgomery_mul(base_data, y_mod_ct_odd.backend().base_data(), - std::integral_constant::value>()); - return base_data; - }); + "[odd modulus][compile time] montgomery_mul (direct call)", [&]() { + mod_object.montgomery_mul( + base_data, y_mod_ct_odd.backend().base_data(), + std::integral_constant< + bool, + boost::multiprecision::backends::is_trivial_cpp_int_modular::value>()); + return base_data; + }); std::cout << base_data << std::endl; } @@ -184,11 +171,10 @@ BOOST_AUTO_TEST_CASE(modular_adaptor_backend_sub_perf_test) { auto x_modular = x_mod_ct_odd.backend(); nil::crypto3::bench::run_benchmark<>( - "[odd modulus][compile time] modular_adaptor_backend_subtract", - [&]() { - eval_subtract(x_modular, y_mod_ct_odd.backend()); - return x_modular; - }); + "[odd modulus][compile time] modular_adaptor_backend_subtract", [&]() { + eval_subtract(x_modular, y_mod_ct_odd.backend()); + return x_modular; + }); // Print something so the whole computation is not optimized out. std::cout << x_modular << std::endl; @@ -199,12 +185,11 @@ BOOST_AUTO_TEST_CASE(modular_adaptor_backend_add_perf_test) { auto x_modular = x_mod_ct_odd.backend(); - nil::crypto3::bench::run_benchmark<>( - "[odd modulus][compile time] modular_adaptor_backend_add", - [&]() { - eval_add(x_modular, y_mod_ct_odd.backend()); - return x_modular; - }); + nil::crypto3::bench::run_benchmark<>("[odd modulus][compile time] modular_adaptor_backend_add", + [&]() { + eval_add(x_modular, y_mod_ct_odd.backend()); + return x_modular; + }); // Print something so the whole computation is not optimized out. std::cout << x_modular << std::endl; @@ -214,11 +199,10 @@ BOOST_AUTO_TEST_CASE(modular_adaptor_backend_mul_perf_test) { auto x_modular = x_mod_ct_odd.backend(); nil::crypto3::bench::run_benchmark<>( - "[odd modulus][compile time] modular_adaptor_backend_multiply", - [&]() { - eval_multiply(x_modular, y_mod_ct_odd.backend()); - return x_modular; - }); + "[odd modulus][compile time] modular_adaptor_backend_multiply", [&]() { + eval_multiply(x_modular, y_mod_ct_odd.backend()); + return x_modular; + }); // Print something so the whole computation is not optimized out. std::cout << x_modular << std::endl; @@ -228,11 +212,10 @@ BOOST_AUTO_TEST_CASE(modular_adaptor_number_mul_perf_test) { auto x = x_mod_ct_odd; nil::crypto3::bench::run_benchmark<>( - "[odd modulus][compile time] modular_adaptor_number_multiply", - [&]() { - x *= y_mod_ct_odd; - return x; - }); + "[odd modulus][compile time] modular_adaptor_number_multiply", [&]() { + x *= y_mod_ct_odd; + return x; + }); // Print something so the whole computation is not optimized out. std::cout << x << std::endl; @@ -248,11 +231,10 @@ BOOST_AUTO_TEST_CASE(barrett_mul_perf_test) { const auto &mod_object = x_mod_rt_even.backend().mod_data().get_mod_obj(); nil::crypto3::bench::run_benchmark<>( - "[even modulus][runtime] regular_mul (direct call)", - [&]() { - mod_object.regular_mul(base_data, y_mod_rt_even.backend().base_data()); - return base_data; - }); + "[even modulus][runtime] regular_mul (direct call)", [&]() { + mod_object.regular_mul(base_data, y_mod_rt_even.backend().base_data()); + return base_data; + }); std::cout << base_data << std::endl; } @@ -262,12 +244,11 @@ BOOST_AUTO_TEST_CASE(modular_adaptor_backend_sub_perf_test) { auto x_modular = x_mod_rt_even.backend(); - nil::crypto3::bench::run_benchmark<>( - "[even modulus][runtime] modular_adaptor_backend_subtract", - [&]() { - eval_subtract(x_modular, y_mod_rt_even.backend()); - return x_modular; - }); + nil::crypto3::bench::run_benchmark<>("[even modulus][runtime] modular_adaptor_backend_subtract", + [&]() { + eval_subtract(x_modular, y_mod_rt_even.backend()); + return x_modular; + }); // Print something so the whole computation is not optimized out. std::cout << x_modular << std::endl; @@ -278,12 +259,11 @@ BOOST_AUTO_TEST_CASE(modular_adaptor_backend_add_perf_test) { auto x_modular = x_mod_rt_even.backend(); - nil::crypto3::bench::run_benchmark<>( - "[even modulus][runtime] modular_adaptor_backend_add", - [&]() { - eval_add(x_modular, y_mod_rt_even.backend()); - return x_modular; - }); + nil::crypto3::bench::run_benchmark<>("[even modulus][runtime] modular_adaptor_backend_add", + [&]() { + eval_add(x_modular, y_mod_rt_even.backend()); + return x_modular; + }); // Print something so the whole computation is not optimized out. std::cout << x_modular << std::endl; @@ -292,12 +272,11 @@ BOOST_AUTO_TEST_CASE(modular_adaptor_backend_add_perf_test) { BOOST_AUTO_TEST_CASE(modular_adaptor_backend_mul_perf_test) { auto x_modular = x_mod_rt_even.backend(); - nil::crypto3::bench::run_benchmark<>( - "[even modulus][runtime] modular_adaptor_backend_multiply", - [&]() { - eval_multiply(x_modular, y_mod_rt_even.backend()); - return x_modular; - }); + nil::crypto3::bench::run_benchmark<>("[even modulus][runtime] modular_adaptor_backend_multiply", + [&]() { + eval_multiply(x_modular, y_mod_rt_even.backend()); + return x_modular; + }); // Print something so the whole computation is not optimized out. std::cout << x_modular << std::endl; @@ -306,12 +285,11 @@ BOOST_AUTO_TEST_CASE(modular_adaptor_backend_mul_perf_test) { BOOST_AUTO_TEST_CASE(modular_adaptor_number_mul_perf_test) { auto x = x_mod_rt_even; - nil::crypto3::bench::run_benchmark<>( - "[even modulus][runtime] modular_adaptor_number_multiply", - [&]() { - x *= y_mod_rt_even; - return x; - }); + nil::crypto3::bench::run_benchmark<>("[even modulus][runtime] modular_adaptor_number_multiply", + [&]() { + x *= y_mod_rt_even; + return x; + }); // Print something so the whole computation is not optimized out. std::cout << x << std::endl; @@ -327,11 +305,10 @@ BOOST_AUTO_TEST_CASE(barrett_mul_perf_test) { const auto &mod_object = x_mod_ct_even.backend().mod_data().get_mod_obj(); nil::crypto3::bench::run_benchmark<>( - "[even modulus][compile time] regular_mul (direct call)", - [&]() { - mod_object.regular_mul(base_data, y_mod_ct_even.backend().base_data()); - return base_data; - }); + "[even modulus][compile time] regular_mul (direct call)", [&]() { + mod_object.regular_mul(base_data, y_mod_ct_even.backend().base_data()); + return base_data; + }); std::cout << base_data << std::endl; } @@ -342,11 +319,10 @@ BOOST_AUTO_TEST_CASE(modular_adaptor_backend_sub_perf_test) { auto x_modular = x_mod_ct_even.backend(); nil::crypto3::bench::run_benchmark<>( - "[even modulus][compile time] modular_adaptor_backend_subtract", - [&]() { - eval_subtract(x_modular, y_mod_ct_even.backend()); - return x_modular; - }); + "[even modulus][compile time] modular_adaptor_backend_subtract", [&]() { + eval_subtract(x_modular, y_mod_ct_even.backend()); + return x_modular; + }); // Print something so the whole computation is not optimized out. std::cout << x_modular << std::endl; @@ -357,12 +333,11 @@ BOOST_AUTO_TEST_CASE(modular_adaptor_backend_add_perf_test) { auto x_modular = x_mod_ct_even.backend(); - nil::crypto3::bench::run_benchmark<>( - "[even modulus][compile time] modular_adaptor_backend_add", - [&]() { - eval_add(x_modular, y_mod_ct_even.backend()); - return x_modular; - }); + nil::crypto3::bench::run_benchmark<>("[even modulus][compile time] modular_adaptor_backend_add", + [&]() { + eval_add(x_modular, y_mod_ct_even.backend()); + return x_modular; + }); // Print something so the whole computation is not optimized out. std::cout << x_modular << std::endl; @@ -372,11 +347,10 @@ BOOST_AUTO_TEST_CASE(modular_adaptor_backend_mul_perf_test) { auto x_modular = x_mod_ct_even.backend(); nil::crypto3::bench::run_benchmark<>( - "[even modulus][compile time] modular_adaptor_backend_multiply", - [&]() { - eval_multiply(x_modular, y_mod_ct_even.backend()); - return x_modular; - }); + "[even modulus][compile time] modular_adaptor_backend_multiply", [&]() { + eval_multiply(x_modular, y_mod_ct_even.backend()); + return x_modular; + }); // Print something so the whole computation is not optimized out. std::cout << x_modular << std::endl; @@ -386,14 +360,44 @@ BOOST_AUTO_TEST_CASE(modular_adaptor_number_mul_perf_test) { auto x = x_mod_ct_even; nil::crypto3::bench::run_benchmark<>( - "[even modulus][compile time] modular_adaptor_number_multiply", - [&]() { - x *= y_mod_ct_even; - return x; - }); + "[even modulus][compile time] modular_adaptor_number_multiply", [&]() { + x *= y_mod_ct_even; + return x; + }); // Print something so the whole computation is not optimized out. std::cout << x << std::endl; } -BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file +BOOST_AUTO_TEST_SUITE_END() + +BOOST_AUTO_TEST_SUITE(compile_time_inverse_tests) + +BOOST_AUTO_TEST_CASE(inverse_extended_euclidean_algorithm_test) { + auto x_modular = x_mod_ct_odd; + + nil::crypto3::bench::run_benchmark<>( + "[odd modulus][compile time] inverse_extended_euclidean_algorithm_test", [&]() { + x_modular = inverse_extended_euclidean_algorithm(x_modular); + ++x_modular; + return x_modular; + }); + + // Print something so the whole computation is not optimized out. + std::cout << x_modular << std::endl; +} + +BOOST_AUTO_TEST_CASE(inverse_mod_test) { + auto x_modular = x_mod_ct_odd; + + nil::crypto3::bench::run_benchmark<>("[odd modulus][compile time] inverse_mod", [&]() { + x_modular = inverse_mod(x_modular); + ++x_modular; + return x_modular; + }); + + // Print something so the whole computation is not optimized out. + std::cout << x_modular << std::endl; +} + +BOOST_AUTO_TEST_SUITE_END() From b8ef4257a9f8c920fa09f30ef4e6b66822c25a31 Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Wed, 18 Dec 2024 00:08:46 +0100 Subject: [PATCH 09/29] multiprecision: refactor big_int and inverse_extended_euclidean_algorithm --- crypto3/benchmarks/multiprecision/big_int.cpp | 4 +- .../algebra/fields/detail/element/fp.hpp | 2 +- .../crypto3/multiprecision/detail/big_int.hpp | 314 ++++++-------- .../detail/big_mod/ops/inverse.hpp | 4 +- .../multiprecision/detail/big_mod/ops/pow.hpp | 2 +- .../detail/big_uint/arithmetic.hpp | 1 + .../detail/big_uint/ops/gcd_inverse.hpp | 35 +- .../multiprecision/test/big_int_inverse.cpp | 398 ++++-------------- 8 files changed, 243 insertions(+), 517 deletions(-) diff --git a/crypto3/benchmarks/multiprecision/big_int.cpp b/crypto3/benchmarks/multiprecision/big_int.cpp index ae39f8c62..4eafb97ba 100644 --- a/crypto3/benchmarks/multiprecision/big_int.cpp +++ b/crypto3/benchmarks/multiprecision/big_int.cpp @@ -297,8 +297,8 @@ BOOST_AUTO_TEST_CASE(inverse_extended_euclidean_algorithm_test) { auto x_modular = x_mod_ct_odd; nil::crypto3::bench::run_benchmark<>( - "[odd modulus][compile time] inverse_extended_euclidean_algorithm_test", [&]() { - x_modular = inverse_extended_euclidean_algorithm(x_modular); + "[odd modulus][compile time] inverse with extended euclidean algorithm", [&]() { + x_modular = inverse(x_modular); ++x_modular; return x_modular; }); diff --git a/crypto3/libs/algebra/include/nil/crypto3/algebra/fields/detail/element/fp.hpp b/crypto3/libs/algebra/include/nil/crypto3/algebra/fields/detail/element/fp.hpp index 6268f2400..e2dfb8b05 100644 --- a/crypto3/libs/algebra/include/nil/crypto3/algebra/fields/detail/element/fp.hpp +++ b/crypto3/libs/algebra/include/nil/crypto3/algebra/fields/detail/element/fp.hpp @@ -208,7 +208,7 @@ namespace nil { } constexpr element_fp inversed() const { - return element_fp(inverse_extended_euclidean_algorithm(data)); + return element_fp(inverse(data)); } constexpr element_fp squared() const { diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp index 048ab8001..4393bc6cc 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -7,8 +8,6 @@ #include #include -#include - #include "nil/crypto3/multiprecision/detail/assert.hpp" #include "nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp" #include "nil/crypto3/multiprecision/detail/config.hpp" @@ -41,9 +40,7 @@ namespace nil::crypto3::multiprecision { constexpr big_int(const big_uint& b) : m_abs(b) {} template && std::is_signed_v, int> = 0> - constexpr big_int(T val) : m_abs(abs(val)) { - // for ADL - using std::abs; + constexpr big_int(T val) : m_abs(unsigned_abs(val)) { if (val < 0) { negate(); } @@ -53,7 +50,7 @@ namespace nil::crypto3::multiprecision { constexpr big_int(T val) : m_abs(val) {} template - constexpr big_int(const big_int& other) noexcept + constexpr big_int(const big_int& other) : m_negative(other.negative()), m_abs(other.abs()) {} // Assignment @@ -74,8 +71,8 @@ namespace nil::crypto3::multiprecision { template && std::is_signed_v, int> = 0> constexpr big_int& operator=(T val) { - using std::abs; - m_abs = abs(val); + m_negative = false; + m_abs = unsigned_abs(val); if (val < 0) { negate(); } @@ -90,8 +87,8 @@ namespace nil::crypto3::multiprecision { return *this; } - constexpr std::string str() const { - return (negative() ? std::string("-") : std::string("")) + m_abs.str(); + constexpr std::string str(std::ios_base::fmtflags flags = std::ios_base::dec) const { + return (negative() ? std::string("-") : std::string("")) + m_abs.str(flags); } template = 0> @@ -143,80 +140,139 @@ namespace nil::crypto3::multiprecision { return this->m_abs.compare(other.m_abs); } +#define NIL_CO3_MP_BIG_INT_IMPL_OPERATOR(op) \ + friend constexpr bool operator op(const big_int& a, const big_int& b) noexcept { \ + return a.compare(b) op 0; \ + } + + NIL_CO3_MP_BIG_INT_IMPL_OPERATOR(<) + NIL_CO3_MP_BIG_INT_IMPL_OPERATOR(<=) + NIL_CO3_MP_BIG_INT_IMPL_OPERATOR(>) + NIL_CO3_MP_BIG_INT_IMPL_OPERATOR(>=) + NIL_CO3_MP_BIG_INT_IMPL_OPERATOR(==) + NIL_CO3_MP_BIG_INT_IMPL_OPERATOR(!=) + +#undef NIL_CO3_MP_BIG_INT_IMPL_OPERATOR + // Arithmetic operations - // Addition/subtraction + friend constexpr big_int operator+(big_int a, const big_int& b) noexcept { + a += b; + return a; + } - static constexpr big_int add(const big_int& a, const big_int& b) { - if (!a.negative() && !b.negative()) { - return big_uint(a.m_abs) + b.m_abs; + friend constexpr auto& operator+=(big_int& a, const big_int& b) noexcept { + if (a.negative() == b.negative()) { + a.m_abs += b.m_abs; + return a; } - if (!a.negative() && b.negative()) { - if (a.m_abs >= b.m_abs) { - return a.m_abs - b.m_abs; - } - return -big_int(b.m_abs - a.m_abs); + if (a.m_abs >= b.m_abs) { + a.m_abs -= b.m_abs; + } else { + auto a_m_abs = a.m_abs; + a.m_abs = b.m_abs; + a.m_abs -= a_m_abs; + a.negate(); } - if (a.negative() && !b.negative()) { - return add(b, a); - } - return -big_int(big_uint(a.m_abs) + b.m_abs); - } - - static constexpr big_int subtract(const big_int& a, const big_int& b) { - return add(a, -b); + return a; } - NIL_CO3_MP_FORCEINLINE constexpr void increment() { + constexpr auto& operator++() { if (negative()) { --m_abs; normalize(); - return; + return *this; } ++m_abs; + return *this; } - NIL_CO3_MP_FORCEINLINE constexpr void decrement() { + friend constexpr auto operator++(big_int& a, int) { + auto copy = a; + ++a; + return copy; + } + + friend constexpr auto operator+(const big_int& a) noexcept { return a; } + + friend constexpr auto operator-(const big_int& a, const big_int& b) { return a + (-b); } + + friend constexpr auto& operator-=(big_int& a, const big_int& b) { + a = a - b; + return a; + } + + constexpr auto& operator--() { if (negative()) { ++m_abs; - return; + return *this; } if (is_zero(m_abs)) { m_negative = true; ++m_abs; - return; + return *this; } --m_abs; + return *this; } - // Modulus + friend constexpr auto operator--(big_int& a, int) { + auto copy = a; + --a; + return copy; + } - static constexpr big_int modulus(const big_int& x, const big_int& y) { - return static_cast(x - static_cast((x / y) * y)); + friend constexpr auto operator-(big_int a) noexcept { + a.negate(); + return a; } - // Division + friend constexpr auto operator*(const big_int& a, const big_int& b) { + big_int result = a.m_abs * b.m_abs; + if (a.sign() * b.sign() < 0) { + result = -result; + } + return result; + } - static constexpr big_int divide(const big_int& x, const big_int& y) { - big_int result = x.m_abs / y.m_abs; - if (x.negative() != y.negative()) { + friend constexpr auto& operator*=(big_int& a, const big_int& b) { + a = a * b; + return a; + } + + friend constexpr auto operator/(const big_int& a, const big_int& b) { + big_int result = a.m_abs / b.m_abs; + if (a.negative() != b.negative()) { result.negate(); } return result; } - // Multiplication + friend constexpr auto& operator/=(big_int& a, const big_int& b) { + a = a / b; + return a; + } - template - static constexpr big_int multiply(const big_int& a, - const big_int& b) noexcept { - big_int result = a.m_abs * b.m_abs; - if (a.sign() * b.sign() < 0) { - result = -result; + friend constexpr auto operator%(const big_int& a, const big_int& b) { + big_int result = a.m_abs % b.m_abs; + if (a.negative() != b.negative()) { + result.negate(); } return result; } + friend constexpr auto& operator%=(big_int& a, const big_int& b) { + a = a % b; + return a; + } + + // IO + + friend std::ostream& operator<<(std::ostream& os, const big_int& value) { + os << value.str(os.flags()); + return os; + } + // Misc ops NIL_CO3_MP_FORCEINLINE constexpr bool is_zero() const noexcept { return abs().is_zero(); } @@ -244,141 +300,16 @@ namespace nil::crypto3::multiprecision { bool m_negative = false; big_uint m_abs; - }; - - namespace detail { - template - constexpr bool is_big_int_v = false; - - template - constexpr bool is_big_int_v> = true; - - template - constexpr bool is_signed_integral_v = is_integral_v || is_big_int_v; - - template, int> = 0> - constexpr std::size_t get_bits() { - return T::Bits; - } - } // namespace detail - -#define NIL_CO3_MP_BIG_INT_INTEGRAL_TEMPLATE \ - template< \ - typename T1, typename T2, \ - std::enable_if_t && detail::is_signed_integral_v && \ - (detail::is_big_int_v || detail::is_big_int_v), \ - int> = 0, \ - typename largest_t = big_int(), detail::get_bits())>> - -#define NIL_CO3_MP_BIG_INT_INTEGRAL_ASSIGNMENT_TEMPLATE \ - template && detail::is_signed_integral_v, \ - int> = 0> - -#define NIL_CO3_MP_BIG_INT_UNARY_TEMPLATE \ - template, int> = 0> - - // Comparison - -#define NIL_CO3_MP_BIG_INT_IMPL_OPERATOR(op) \ - NIL_CO3_MP_BIG_INT_INTEGRAL_TEMPLATE \ - constexpr bool operator op(const T1& a, const T2& b) noexcept { \ - largest_t ap = a; \ - largest_t bp = b; \ - return ap.compare(bp) op 0; \ - } - NIL_CO3_MP_BIG_INT_IMPL_OPERATOR(<) - NIL_CO3_MP_BIG_INT_IMPL_OPERATOR(<=) - NIL_CO3_MP_BIG_INT_IMPL_OPERATOR(>) - NIL_CO3_MP_BIG_INT_IMPL_OPERATOR(>=) - NIL_CO3_MP_BIG_INT_IMPL_OPERATOR(==) - NIL_CO3_MP_BIG_INT_IMPL_OPERATOR(!=) + // Friends -#undef NIL_CO3_MP_BIG_INT_IMPL_OPERATOR + template + friend constexpr void divide_qr(const big_int& a, const big_int& b, + big_int& q, big_int& r); + }; // Arithmetic operations - NIL_CO3_MP_BIG_INT_INTEGRAL_TEMPLATE - constexpr auto operator+(const T1& a, const T2& b) noexcept { - big_int result; - result = decltype(result)::add(a, b); - return result; - } - NIL_CO3_MP_BIG_INT_INTEGRAL_ASSIGNMENT_TEMPLATE - constexpr auto& operator+=(big_int_t& a, const T& b) noexcept { - a = a + b; - return a; - } - NIL_CO3_MP_BIG_INT_UNARY_TEMPLATE - constexpr auto& operator++(big_int_t& a) { - a.increment(); - return a; - } - NIL_CO3_MP_BIG_INT_UNARY_TEMPLATE - constexpr auto operator++(big_int_t& a, int) { - auto copy = a; - ++a; - return copy; - } - NIL_CO3_MP_BIG_INT_UNARY_TEMPLATE - constexpr auto operator+(const big_int_t& a) noexcept { return a; } - - NIL_CO3_MP_BIG_INT_INTEGRAL_TEMPLATE - constexpr auto operator-(const T1& a, const T2& b) { return T1::subtract(a, b); } - NIL_CO3_MP_BIG_INT_INTEGRAL_ASSIGNMENT_TEMPLATE - constexpr auto& operator-=(big_int_t& a, const T& b) { - a = a - b; - return a; - } - NIL_CO3_MP_BIG_INT_UNARY_TEMPLATE - constexpr auto& operator--(big_int_t& a) { - a.decrement(); - return a; - } - NIL_CO3_MP_BIG_INT_UNARY_TEMPLATE - constexpr auto operator--(big_int_t& a, int) { - auto copy = a; - --a; - return copy; - } - - NIL_CO3_MP_BIG_INT_UNARY_TEMPLATE - constexpr big_int_t operator-(big_int_t a) noexcept { - a.negate(); - return a; - } - - NIL_CO3_MP_BIG_INT_INTEGRAL_TEMPLATE - constexpr auto operator*(const T1& a, const T2& b) noexcept { - return std::decay_t::multiply(a, b); - } - NIL_CO3_MP_BIG_INT_INTEGRAL_ASSIGNMENT_TEMPLATE - constexpr auto& operator*=(big_int_t& a, const T& b) noexcept { - a = a * b; - return a; - } - - NIL_CO3_MP_BIG_INT_INTEGRAL_TEMPLATE - constexpr auto operator/(const T1& a, const T2& b) noexcept { - return largest_t::divide(static_cast(a), static_cast(b)); - } - NIL_CO3_MP_BIG_INT_INTEGRAL_ASSIGNMENT_TEMPLATE - constexpr auto& operator/=(big_int_t& a, const T& b) noexcept { - a = a / b; - return a; - } - - NIL_CO3_MP_BIG_INT_INTEGRAL_TEMPLATE - constexpr auto operator%(const T1& a, const T2& b) noexcept { - return largest_t::modulus(static_cast(a), static_cast(b)); - } - NIL_CO3_MP_BIG_INT_INTEGRAL_ASSIGNMENT_TEMPLATE - constexpr auto& operator%=(big_int_t& a, const T& b) { - a = a % b; - return a; - } - template constexpr std::size_t hash_value(const big_int& val) noexcept { std::size_t result = 0; @@ -387,16 +318,29 @@ namespace nil::crypto3::multiprecision { return result; } - // IO + // Misc ops - NIL_CO3_MP_BIG_INT_UNARY_TEMPLATE - std::ostream& operator<<(std::ostream& os, const big_int_t& value) { - os << value.str(); - return os; + template + constexpr bool is_zero(const big_int& a) { + return a.is_zero(); } -#undef NIL_CO3_MP_BIG_INT_UNARY_TEMPLATE -#undef NIL_CO3_MP_BIG_INT_INTEGRAL_ASSIGNMENT_TEMPLATE -#undef NIL_CO3_MP_BIG_INT_INTEGRAL_TEMPLATE - + template + constexpr void divide_qr(const big_int& a, const big_int& b, big_int& q, + big_int& r) { + detail::divide(&q.m_abs, a.m_abs, b.m_abs, r.m_abs); + q.m_negative = false; + r.m_negative = false; + if (a.negative() != b.negative()) { + q.negate(); + r.negate(); + } + } } // namespace nil::crypto3::multiprecision + +template +struct std::hash> { + std::size_t operator()(const nil::crypto3::multiprecision::big_int& a) const noexcept { + return boost::hash>{}(a); + } +}; diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/inverse.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/inverse.hpp index 4ac66b42c..645b6e771 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/inverse.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/inverse.hpp @@ -20,7 +20,7 @@ namespace nil::crypto3::multiprecision { template, int> = 0> - constexpr big_mod_t inverse_extended_euclidean_algorithm(const big_mod_t &modular) { - return big_mod_t(inverse_extended_euclidean_algorithm(modular.base(), modular.mod()), modular.ops_storage()); + constexpr big_mod_t inverse(const big_mod_t &modular) { + return big_mod_t(inverse_mod(modular.base(), modular.mod()), modular.ops_storage()); } } // namespace nil::crypto3::multiprecision diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/pow.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/pow.hpp index 31a9aaeb6..f68261387 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/pow.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/pow.hpp @@ -37,7 +37,7 @@ namespace nil::crypto3::multiprecision { int> = 0> constexpr big_mod_t pow(const big_mod_t &b, const T &e) { if (e < 0) { - return pow(inverse_extended_euclidean_algorithm(b), detail::unsigned_abs(e)); + return pow(inverse(b), detail::unsigned_abs(e)); } return pow(b, static_cast>(e)); } diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp index 422f767a6..f9bffcbeb 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp @@ -36,6 +36,7 @@ namespace nil::crypto3::multiprecision { std::size_t as = a.used_limbs(); std::size_t bs = b.used_limbs(); auto [m, x] = std::minmax(as, bs); + if (x == 1) { double_limb_type v = static_cast(*a.limbs()) + static_cast(*b.limbs()); diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/gcd_inverse.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/gcd_inverse.hpp index 92b3a57de..8c8d2d903 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/gcd_inverse.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/gcd_inverse.hpp @@ -14,20 +14,19 @@ #include #include +#include "nil/crypto3/multiprecision/detail/assert.hpp" #include "nil/crypto3/multiprecision/detail/big_int.hpp" #include "nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp" -#include "nil/crypto3/multiprecision/detail/assert.hpp" namespace nil::crypto3::multiprecision { namespace detail { // a^(-1) mod p // http://www-math.ucdenver.edu/~wcherowi/courses/m5410/exeucalg.html template - constexpr big_int extended_euclidean_algorithm(const big_int& num1, - const big_int& num2, + constexpr big_int extended_euclidean_algorithm(big_int num1, big_int num2, big_int& bezout_x, big_int& bezout_y) { - big_int x, y, tmp_num1 = num1, tmp_num2 = num2; + big_int x, y; y = 1u; x = 0u; @@ -35,29 +34,24 @@ namespace nil::crypto3::multiprecision { bezout_y = 0u; // Extended Euclidean Algorithm - while (!tmp_num2.is_zero()) { - big_int quotient = tmp_num1; - big_int remainder = tmp_num1; - big_int placeholder; + while (!num2.is_zero()) { + big_int quotient; + big_int remainder; - quotient /= tmp_num2; - remainder %= tmp_num2; + divide_qr(num1, num2, quotient, remainder); - tmp_num1 = tmp_num2; - tmp_num2 = remainder; + num1 = num2; + num2 = remainder; big_int temp_x = x, temp_y = y; - placeholder = quotient * x; - placeholder = bezout_x - placeholder; - x = placeholder; + x = bezout_x - quotient * x; bezout_x = temp_x; - placeholder = quotient * y; - placeholder = bezout_y - placeholder; - y = placeholder; + y = bezout_y - quotient * y; bezout_y = temp_y; } - return tmp_num1; + + return num1; } } // namespace detail @@ -70,8 +64,7 @@ namespace nil::crypto3::multiprecision { } template - constexpr big_uint inverse_extended_euclidean_algorithm(const big_uint& a, - const big_uint& m) { + constexpr big_uint inverse_mod(const big_uint& a, const big_uint& m) { big_int aa = a, mm = m, x, y, g; g = detail::extended_euclidean_algorithm(aa, mm, x, y); if (g != 1u) { diff --git a/crypto3/libs/multiprecision/test/big_int_inverse.cpp b/crypto3/libs/multiprecision/test/big_int_inverse.cpp index f73a359a6..6f1987881 100644 --- a/crypto3/libs/multiprecision/test/big_int_inverse.cpp +++ b/crypto3/libs/multiprecision/test/big_int_inverse.cpp @@ -24,119 +24,6 @@ using namespace nil::crypto3::multiprecision; NIL_CO3_MP_DEFINE_BIG_UINT_LITERAL(6) -template -void test_inverse_extended_euclidean_algorithm() { - BOOST_CHECK_EQUAL( - inverse_extended_euclidean_algorithm(T(5), T("0x7fffffffffffffffffffffffffffffff")), - T("0x33333333333333333333333333333333")); - BOOST_CHECK_EQUAL( - inverse_extended_euclidean_algorithm(T(333), T("0x7fffffffffffffffffffffffffffffff")), - T("0x17d4f2ee517d4f2ee517d4f2ee517d4f")); - BOOST_CHECK_EQUAL(inverse_extended_euclidean_algorithm(T("0x435b21e35ccd62dbdbafa1368cf742f0"), - T("0x7fffffffffffffffffffffffffffffff")), - T("0x604ddb74e5a55e559a7320e45b06eaf6")); - BOOST_CHECK_EQUAL( - inverse_extended_euclidean_algorithm( - T(2), T("0x1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")), - T("0x10000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" - "0000000000000000000000000")); - BOOST_CHECK_EQUAL(inverse_extended_euclidean_algorithm(T(3), T(8)), T(3)); - BOOST_CHECK_THROW(inverse_extended_euclidean_algorithm(T(46), T(207)), std::invalid_argument); - BOOST_CHECK_THROW(inverse_extended_euclidean_algorithm(T(2), T(2)), std::invalid_argument); - BOOST_CHECK_THROW(inverse_extended_euclidean_algorithm(T(0), T(2)), std::invalid_argument); - BOOST_CHECK_THROW(inverse_extended_euclidean_algorithm(T(46), T(46)), std::invalid_argument); - BOOST_CHECK_EQUAL(inverse_extended_euclidean_algorithm(T(1), T(7)), T(1)); - BOOST_CHECK_EQUAL(inverse_extended_euclidean_algorithm(T(35), T(118)), T(27)); - BOOST_CHECK_THROW(inverse_extended_euclidean_algorithm(T(37), T(37)), std::invalid_argument); - BOOST_CHECK_EQUAL(inverse_extended_euclidean_algorithm(T(32), T(247)), T(193)); - BOOST_CHECK_EQUAL(inverse_extended_euclidean_algorithm(T(3), T(232)), T(155)); - - BOOST_CHECK_EQUAL( - inverse_extended_euclidean_algorithm( - T("256992387993922882115519242002267204163958280694902854777438773165028812741820300742" - "384101" - "620467227297951260702776745365693102268609333941403372929142489383748076291"), - T("310556067329850632847208938574658589632291100674077275160516075249922714838542485036" - "214015" - "8165019680645739648726058090243814223511639161631852729287604717869259565828")), - T("2322484593360248972803085811686365806060063797313230509497970163285203519904646342173323" - "688226" - "147654544918783691327115436052292182385106099615339567513136063879840431")); - - BOOST_CHECK_EQUAL( - inverse_extended_euclidean_algorithm( - T("657900513264442578215729259525804042708991731028255426638688946278845827095715186772" - "097484" - "16019817305674876843604308670298295897660589296995641401495105646770364032950"), - T("146059874272782860583686068115674600616627249438711269370889274434354805551497286303" - "947620" - "1659720247220048664250204314648520085411164461712526657028588699682983099362771")), - T("3701344688092353558099310214964185602579277616517826314317231208222417072861266226192312" - "282752" - "10678415132318220494260963802381448709723310690465171935975287188943190781")); - - BOOST_CHECK_EQUAL(inverse_extended_euclidean_algorithm(T(3), T(0x10)), T(11)); - BOOST_CHECK_EQUAL(inverse_extended_euclidean_algorithm(T(43000466091), T(0x10000000000)), - T(140404367363)); - - BOOST_CHECK_EQUAL(inverse_extended_euclidean_algorithm( - T("3329223706171052463206866408355190852145308853551222855374206553291583" - "6412003628111698671675220667324272" - "5944106904545859091557017307727326666832362641891029072983311591760876" - "2612451607036836604560196526748133" - "2952294823154321608619569856617204150085028173765891223691691685030517" - "0057553436136073435791550700526779" - "1266056164843197115173542457409178397682412186017844044878477733706673" - "6659493124795020814172868481356070" - "6694079674126165187970576121654781364910559498699000784756722078722425" - "3724912309650653332895570458720843" - "3224850656811897686972917521497485758932335208567118381404016914945323" - "3350227887942508765678216349436356" - "7584633848194784070822245649557468578497368723157561724530746784741768" - "6461029368632606300888825458750471" - "73194357829837349405264332156553159"), - T("5159669275902268897019683770634129859849131442089512209466255369748647" - "8852950434581004530951396375324897" - "3237934933418399835900527154085143847573539006016005510145975736902509" - "4548935216928274885474920588457238" - "9321992128261328481129830302072287292303501430702452146150323300983736" - "0681685755548737891159735617529596" - "3296209024100980888874174104384926439773409352855895683162800486061893" - "6254613392484195923653331976713963" - "9022384965245831654887217363203207214249335996119270164515039005157887" - "5246900773560274606831152842526302" - "3211977032707524224960793107608042288596827341046613333670880853546357" - "0182780841768637479016464266039055" - "7925243983808216928421220094838103017958334974205040660858707963225716" - "1952224606791379941232782765846637" - "12976241848458904056941218720227786752")), - T("16169765086855986127154046155397117295914963038387272783617457684599127447" - "6610311080533553178926047190203266" - "85568238777817971191773697446756550362276938623879013359293805261585253356" - "1719117119940626105914149272955096" - "43833787555922713773309241786955753178554821984186872072841194724366388916" - "5526728787046894739482800359519447" - "64596203739541946184136389849598657786471023022865585926888106336640072640" - "1157990917652680450814220027329982" - "28525926769366297380133831033446426381884582602684819819652397562413743816" - "5546650367370131035732951388159175" - "97189009924722836031296505773554187289297878370713302855264475968171422470" - "4381891573964406129272600659255700" - "50082441202586929437053251315496103922094819482313181774501817762229043061" - "5352105032422136121552433314291445" - "5291939319")); - BOOST_CHECK_EQUAL( - inverse_extended_euclidean_algorithm( - T(65279), T("0x100000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000" - "00000000000000000000000000000000000000000000000000000000000")), - T("2136191453734241471355287191702994357470910407859959447816962783332820558450714636705703" - "817069" - "8710253677755075362127788711957331760388539866898398399344480664991941861081743615")); -} - template void test_inverse_mod() { BOOST_CHECK_EQUAL(inverse_mod(T(5), T("0x7fffffffffffffffffffffffffffffff")), @@ -154,13 +41,13 @@ void test_inverse_mod() { "00000000000000000000" "0000000000000000000000000")); BOOST_CHECK_EQUAL(inverse_mod(T(3), T(8)), T(3)); - BOOST_CHECK_EQUAL(inverse_mod(T(46), T(207)), T(0)); - BOOST_CHECK_EQUAL(inverse_mod(T(2), T(2)), T(0)); - BOOST_CHECK_EQUAL(inverse_mod(T(0), T(2)), T(0)); - BOOST_CHECK_EQUAL(inverse_mod(T(46), T(46)), T(0)); + BOOST_CHECK_THROW(inverse_mod(T(46), T(207)), std::invalid_argument); + BOOST_CHECK_THROW(inverse_mod(T(2), T(2)), std::invalid_argument); + BOOST_CHECK_THROW(inverse_mod(T(0), T(2)), std::invalid_argument); + BOOST_CHECK_THROW(inverse_mod(T(46), T(46)), std::invalid_argument); BOOST_CHECK_EQUAL(inverse_mod(T(1), T(7)), T(1)); BOOST_CHECK_EQUAL(inverse_mod(T(35), T(118)), T(27)); - BOOST_CHECK_EQUAL(inverse_mod(T(37), T(37)), T(0)); + BOOST_CHECK_THROW(inverse_mod(T(37), T(37)), std::invalid_argument); BOOST_CHECK_EQUAL(inverse_mod(T(32), T(247)), T(193)); BOOST_CHECK_EQUAL(inverse_mod(T(3), T(232)), T(155)); @@ -191,205 +78,106 @@ void test_inverse_mod() { BOOST_CHECK_EQUAL(inverse_mod(T(3), T(0x10)), T(11)); BOOST_CHECK_EQUAL(inverse_mod(T(43000466091), T(0x10000000000)), T(140404367363)); - BOOST_CHECK_EQUAL(inverse_mod(T("33292237061710524632068664083551908521453088535512228553742065" - "532915836412003628111698671675220667324272" - "59441069045458590915570173077273266668323626418910290729833115" - "917608762612451607036836604560196526748133" - "29522948231543216086195698566172041500850281737658912236916916" - "850305170057553436136073435791550700526779" - "12660561648431971151735424574091783976824121860178440448784777" - "337066736659493124795020814172868481356070" - "66940796741261651879705761216547813649105594986990007847567220" - "787224253724912309650653332895570458720843" - "32248506568118976869729175214974857589323352085671183814040169" - "149453233350227887942508765678216349436356" - "75846338481947840708222456495574685784973687231575617245307467" - "847417686461029368632606300888825458750471" - "73194357829837349405264332156553159"), - T("51596692759022688970196837706341298598491314420895122094662553" - "697486478852950434581004530951396375324897" - "32379349334183998359005271540851438475735390060160055101459757" - "369025094548935216928274885474920588457238" - "93219921282613284811298303020722872923035014307024521461503233" - "009837360681685755548737891159735617529596" - "32962090241009808888741741043849264397734093528558956831628004" - "860618936254613392484195923653331976713963" - "90223849652458316548872173632032072142493359961192701645150390" - "051578875246900773560274606831152842526302" - "32119770327075242249607931076080422885968273410466133336708808" - "535463570182780841768637479016464266039055" - "79252439838082169284212200948381030179583349742050406608587079" - "632257161952224606791379941232782765846637" - "12976241848458904056941218720227786752")), - T("16169765086855986127154046155397117295914963038387272783617457684599127447" - "6610311080533553178926047190203266" - "85568238777817971191773697446756550362276938623879013359293805261585253356" - "1719117119940626105914149272955096" - "43833787555922713773309241786955753178554821984186872072841194724366388916" - "5526728787046894739482800359519447" - "64596203739541946184136389849598657786471023022865585926888106336640072640" - "1157990917652680450814220027329982" - "28525926769366297380133831033446426381884582602684819819652397562413743816" - "5546650367370131035732951388159175" - "97189009924722836031296505773554187289297878370713302855264475968171422470" - "4381891573964406129272600659255700" - "50082441202586929437053251315496103922094819482313181774501817762229043061" - "5352105032422136121552433314291445" - "5291939319")); BOOST_CHECK_EQUAL( - inverse_mod(T(65279), T("0x1000000000000000000000000000000000000000000000000000000000000000" - "000000000000000000000000" - "00000000000000000000000000000000000000000000000000000000000")), + inverse_mod(T("3329223706171052463206866408355190852145308853551222855374206553291583" + "6412003628111698671675220667324272" + "5944106904545859091557017307727326666832362641891029072983311591760876" + "2612451607036836604560196526748133" + "2952294823154321608619569856617204150085028173765891223691691685030517" + "0057553436136073435791550700526779" + "1266056164843197115173542457409178397682412186017844044878477733706673" + "6659493124795020814172868481356070" + "6694079674126165187970576121654781364910559498699000784756722078722425" + "3724912309650653332895570458720843" + "3224850656811897686972917521497485758932335208567118381404016914945323" + "3350227887942508765678216349436356" + "7584633848194784070822245649557468578497368723157561724530746784741768" + "6461029368632606300888825458750471" + "73194357829837349405264332156553159"), + T("5159669275902268897019683770634129859849131442089512209466255369748647" + "8852950434581004530951396375324897" + "3237934933418399835900527154085143847573539006016005510145975736902509" + "4548935216928274885474920588457238" + "9321992128261328481129830302072287292303501430702452146150323300983736" + "0681685755548737891159735617529596" + "3296209024100980888874174104384926439773409352855895683162800486061893" + "6254613392484195923653331976713963" + "9022384965245831654887217363203207214249335996119270164515039005157887" + "5246900773560274606831152842526302" + "3211977032707524224960793107608042288596827341046613333670880853546357" + "0182780841768637479016464266039055" + "7925243983808216928421220094838103017958334974205040660858707963225716" + "1952224606791379941232782765846637" + "12976241848458904056941218720227786752")), + T("16169765086855986127154046155397117295914963038387272783617457684599127447" + "6610311080533553178926047190203266" + "85568238777817971191773697446756550362276938623879013359293805261585253356" + "1719117119940626105914149272955096" + "43833787555922713773309241786955753178554821984186872072841194724366388916" + "5526728787046894739482800359519447" + "64596203739541946184136389849598657786471023022865585926888106336640072640" + "1157990917652680450814220027329982" + "28525926769366297380133831033446426381884582602684819819652397562413743816" + "5546650367370131035732951388159175" + "97189009924722836031296505773554187289297878370713302855264475968171422470" + "4381891573964406129272600659255700" + "50082441202586929437053251315496103922094819482313181774501817762229043061" + "5352105032422136121552433314291445" + "5291939319")); + BOOST_CHECK_EQUAL( + inverse_mod(T(65279), + T("0x100000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000" + "00000000000000000000000000000000000000000000000000000000000")), T("2136191453734241471355287191702994357470910407859959447816962783332820558450714636705703" "817069" "8710253677755075362127788711957331760388539866898398399344480664991941861081743615")); } -template -void test_monty_inverse() { - // test for monty_inverse - BOOST_CHECK_EQUAL(monty_inverse(T(12), T(5), T(5)), T(1823)); - BOOST_CHECK_EQUAL(monty_inverse(T(10), T(37), T(1)), T(26)); - BOOST_CHECK_EQUAL(monty_inverse(T(3), T(2), T(3)), T(3)); - BOOST_CHECK_EQUAL(monty_inverse(T(3), T(4), T(2)), T(11)); - BOOST_CHECK_EQUAL(monty_inverse(T(4), T(7), T(2)), T(37)); - BOOST_CHECK_EQUAL(monty_inverse(T(32), T(247), T(1)), T(193)); - BOOST_CHECK_EQUAL(monty_inverse(T(3), T(7), T(7)), T(549029)); - BOOST_CHECK_EQUAL(monty_inverse(T(5317589), T(23), T(8)), T(32104978469)); -} - BOOST_AUTO_TEST_SUITE(runtime_tests) -BOOST_AUTO_TEST_CASE(inverse_tests) { - // test_monty_inverse>(); - // test_inverse_mod>(); - test_inverse_extended_euclidean_algorithm>(); -} +BOOST_AUTO_TEST_CASE(inverse_tests) { test_inverse_mod>(); } BOOST_AUTO_TEST_CASE(test_big_mod_6_bits) { auto modular = big_mod_rt<6>(10_big_uint6, 37_big_uint6); - BOOST_CHECK_EQUAL(inverse_extended_euclidean_algorithm(modular).base(), 26u); -} + BOOST_CHECK_EQUAL(inverse(modular).base(), 26u); -// BOOST_AUTO_TEST_CASE(test_cpp_int_modular_backend_6_bits) { -// using namespace boost::multiprecision; -// using T = boost::multiprecision::cpp_int_modular_modular_backend<6>; -// -// modular = number>>(3, 8); -// modular.backend().mod_data().adjust_regular(res.backend(), -// inverse_extended_euclidean_algorithm(modular).backend().base_data()); -// BOOST_CHECK_EQUAL(number(res.backend()), number(3)); -// -// modular = number>>(3, 16); -// modular.backend().mod_data().adjust_regular(res.backend(), -// inverse_extended_euclidean_algorithm(modular).backend().base_data()); -// BOOST_CHECK_EQUAL(number(res.backend()), number(11)); -// -// modular = number>>( -// 65279, -// "0x100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" -// "000000000000000000000000000000000000000"); -// modular.backend().mod_data().adjust_regular(res.backend(), -// inverse_extended_euclidean_algorithm(modular).backend().base_data()); -// BOOST_CHECK_EQUAL( -// number(res.backend()), -// number("213619145373424147135528719170299435747091040785995944781696278333282055845071463670570381706987102536" -// "77755075362127788711957331760388539866898398399344480664991941861081743615")); -// -// modular = number>>( -// "33292237061710524632068664083551908521453088535512228553742065532915836412003628111698671675220667324272594410" -// "69045458590915570173077273266668323626418910290729833115917608762612451607036836604560196526748133295229482315" -// "43216086195698566172041500850281737658912236916916850305170057553436136073435791550700526779126605616484319711" -// "51735424574091783976824121860178440448784777337066736659493124795020814172868481356070669407967412616518797057" -// "61216547813649105594986990007847567220787224253724912309650653332895570458720843322485065681189768697291752149" -// "74857589323352085671183814040169149453233350227887942508765678216349436356758463384819478407082224564955746857" -// "8497368723157561724530746784741768646102936863260630088882545875047173194357829837349405264332156553159", -// "51596692759022688970196837706341298598491314420895122094662553697486478852950434581004530951396375324897323793" -// "49334183998359005271540851438475735390060160055101459757369025094548935216928274885474920588457238932199212826" -// "13284811298303020722872923035014307024521461503233009837360681685755548737891159735617529596329620902410098088" -// "88741741043849264397734093528558956831628004860618936254613392484195923653331976713963902238496524583165488721" -// "73632032072142493359961192701645150390051578875246900773560274606831152842526302321197703270752422496079310760" -// "80422885968273410466133336708808535463570182780841768637479016464266039055792524398380821692842122009483810301" -// "7958334974205040660858707963225716195222460679137994123278276584663712976241848458904056941218720227786752"); -// modular.backend().mod_data().adjust_regular(res.backend(), -// inverse_extended_euclidean_algorithm(modular).backend().base_data()); -// BOOST_CHECK_EQUAL( -// number(res.backend()), -// number("161697650868559861271540461553971172959149630383872727836174576845991274476610311080533553178926047190" -// "203266855682387778179711917736974467565503622769386238790133592938052615852533561719117119940626105914" -// "149272955096438337875559227137733092417869557531785548219841868720728411947243663889165526728787046894" -// "739482800359519447645962037395419461841363898495986577864710230228655859268881063366400726401157990917" -// "652680450814220027329982285259267693662973801338310334464263818845826026848198196523975624137438165546" -// "650367370131035732951388159175971890099247228360312965057735541872892978783707133028552644759681714224" -// "704381891573964406129272600659255700500824412025869294370532513154961039220948194823131817745018177622" -// "2904306153521050324221361215524333142914455291939319")); -// number> -// t1("46183318524466423714385242700212935662232011232920767824642233133732825160423"); -// number> -// t2("52435875175126190479447740508185965837690552500527637822603658699938581184513"); -// std::cout << "res1=" << inverse_mod(t1, t2) << std::endl; -// std::cout << std::endl; -// std::cout << "res1=" << inverse_mod(number>>(t1, t2)) << std::endl; -////5340958855958624790350191648327454295961274282628640357656781123563169745534 -// modular = number>>(43000466091, -// 0x10000000000); modular.backend().mod_data().adjust_regular(res.backend(), -// inverse_extended_euclidean_algorithm(modular).backend().base_data()); -// BOOST_CHECK_EQUAL(number(res.backend()), number(140404367363)); -//} + modular = big_mod_rt<6>(3_big_uint6, 8_big_uint6); + BOOST_CHECK_EQUAL(inverse(modular).base(), 3u); + + modular = big_mod_rt<6>(3_big_uint6, 16_big_uint6); + BOOST_CHECK_EQUAL(inverse(modular).base(), 11u); +} BOOST_AUTO_TEST_SUITE_END() -// BOOST_AUTO_TEST_SUITE(static_tests) -// -// BOOST_AUTO_TEST_CASE(cpp_int_fixed_test) { -// using Backend = cpp_int_modular_backend<585>; -// using Backend_modular = modular_adaptor>; -// using modular_number = number; -// -// constexpr auto mod = -// 0x100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000_cppui_modular585; -// constexpr auto a = 0xfeff_cppui_modular585; -// constexpr auto a_inv = -// 0x565eb513c8dca58227a9d17b4cc814dcf1cec08f4fdf2f0e3d4b88d45d318ec04f0f5e6dcc3a06404686cd542175970ca3b05404585cb511c6d89f78178fa736de14f307fb02fe00ff_cppui_modular585; -// static_assert(a_inv == inverse_extended_euclidean_algorithm(a, mod), "inverse error"); -// -// constexpr modular_number a_m(a, mod); -// constexpr modular_number a_inv_m(a_inv, mod); -// static_assert(a_inv_m == inverse_extended_euclidean_algorithm(a_m), "inverse error"); -// -// using T = number; -// -// static_assert(inverse_extended_euclidean_algorithm(T(3), T(8)) == T(3)); -// static_assert(inverse_extended_euclidean_algorithm(T(46), T(207)) == T(0)); -// static_assert(inverse_extended_euclidean_algorithm(T(2), T(2)) == T(0)); -// static_assert(inverse_extended_euclidean_algorithm(T(0), T(2)) == T(0)); -// static_assert(inverse_extended_euclidean_algorithm(T(46), T(46)) == T(0)); -// static_assert(inverse_extended_euclidean_algorithm(T(1), T(7)) == T(1)); -// static_assert(inverse_extended_euclidean_algorithm(T(35), T(118)) == T(27)); -// static_assert(inverse_extended_euclidean_algorithm(T(37), T(37)) == T(0)); -// static_assert(inverse_extended_euclidean_algorithm(T(32), T(247)) == T(193)); -// static_assert(inverse_extended_euclidean_algorithm(T(3), T(232)) == T(155)); -// -// static_assert(inverse_mod(T(3), T(8)) == T(3)); -// static_assert(inverse_mod(T(46), T(207)) == T(0)); -// static_assert(inverse_mod(T(2), T(2)) == T(0)); -// static_assert(inverse_mod(T(0), T(2)) == T(0)); -// static_assert(inverse_mod(T(46), T(46)) == T(0)); -// static_assert(inverse_mod(T(1), T(7)) == T(1)); -// static_assert(inverse_mod(T(35), T(118)) == T(27)); -// static_assert(inverse_mod(T(37), T(37)) == T(0)); -// static_assert(inverse_mod(T(32), T(247)) == T(193)); -// static_assert(inverse_mod(T(3), T(232)) == T(155)); -// -// static_assert(monty_inverse(T(12), T(5), T(5)) == T(1823)); -// static_assert(monty_inverse(T(10), T(37), T(1)) == T(26)); -// static_assert(monty_inverse(T(3), T(2), T(3)) == T(3)); -// static_assert(monty_inverse(T(3), T(4), T(2)) == T(11)); -// static_assert(monty_inverse(T(4), T(7), T(2)) == T(37)); -// static_assert(monty_inverse(T(32), T(247), T(1)) == T(193)); -// static_assert(monty_inverse(T(3), T(7), T(7)) == T(549029)); -// static_assert(monty_inverse(T(5317589), T(23), T(8)) == T(32104978469)); -// } -// -// BOOST_AUTO_TEST_SUITE_END() +BOOST_AUTO_TEST_SUITE(static_tests) + +BOOST_AUTO_TEST_CASE(fixed_test) { + using modular_number = nil::crypto3::multiprecision::big_mod_rt<585>; + using T = nil::crypto3::multiprecision::big_uint<585>; + + constexpr auto mod = + 0x100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000_big_uint585; + constexpr auto a = 0xfeff_big_uint585; + constexpr auto a_inv = + 0x565eb513c8dca58227a9d17b4cc814dcf1cec08f4fdf2f0e3d4b88d45d318ec04f0f5e6dcc3a06404686cd542175970ca3b05404585cb511c6d89f78178fa736de14f307fb02fe00ff_big_uint585; + static_assert(a_inv == inverse_mod(a, mod), "inverse error"); + + constexpr modular_number a_m(a, mod); + constexpr modular_number a_inv_m(a_inv, mod); + static_assert(a_inv_m == inverse(a_m), "inverse error"); + + static_assert(inverse_mod(T(3), T(8)) == T(3)); + // static_assert(inverse_mod(T(46), T(207)) == T(0)); + // static_assert(inverse_mod(T(2), T(2)) == T(0)); + // static_assert(inverse_mod(T(0), T(2)) == T(0)); + // static_assert(inverse_mod(T(46), T(46)) == T(0)); + static_assert(inverse_mod(T(1), T(7)) == T(1)); + static_assert(inverse_mod(T(35), T(118)) == T(27)); + // static_assert(inverse_mod(T(37), T(37)) == T(0)); + static_assert(inverse_mod(T(32), T(247)) == T(193)); + static_assert(inverse_mod(T(3), T(232)) == T(155)); +} + +BOOST_AUTO_TEST_SUITE_END() From f86790eab299cb196deb4cc55f3d99352a9deada Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Wed, 18 Dec 2024 12:39:44 +0000 Subject: [PATCH 10/29] multiprecision: throw on overflowing import --- .../detail/big_uint/ops/import_export.hpp | 86 ++++++------------- 1 file changed, 28 insertions(+), 58 deletions(-) diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/import_export.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/import_export.hpp index 99933216f..3751454a8 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/import_export.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/import_export.hpp @@ -8,25 +8,22 @@ // IWYU pragma: private; include "nil/crypto3/multiprecision/big_uint.hpp" +#include #include #include #include #include #include #include +#include #include -#include "nil/crypto3/multiprecision/detail/assert.hpp" #include "nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp" #include "nil/crypto3/multiprecision/detail/big_uint/storage.hpp" #include "nil/crypto3/multiprecision/detail/endian.hpp" namespace nil::crypto3::multiprecision { namespace detail { - /* This specialization is used when assigning `chunk_bits` - * of `bits` into `val` at `bit_location` in case where `val` - * is larger than one limb (machine word). - */ template void assign_bits(big_uint& val, Unsigned bits, std::size_t bit_location, std::size_t chunk_bits) { @@ -39,12 +36,10 @@ namespace nil::crypto3::multiprecision { limb_type value = static_cast(bits & mask) << shift; if (value) { - // TODO(ioxid): when should we throw? - // We are ignoring any bits that will not fit into the number. - // We are not throwing, we will use as many bits from the input as we need to. - if (val.limb_count() > limb) { - val.limbs()[limb] |= value; + if (limb >= val.limb_count()) { + throw std::overflow_error("import_bits: overflow"); } + val.limbs()[limb] |= value; } /* If some extra bits need to be assigned to the next limb */ @@ -59,35 +54,6 @@ namespace nil::crypto3::multiprecision { } } - /* This specialization is used when assigning `chunk_bits` - * of `bits` into `val` at `bit_location` in case where `val` - * fits into one limb (machine word). - */ - template - void assign_bits(big_uint& val, Unsigned bits, std::size_t bit_location, - std::size_t chunk_bits, - const std::integral_constant& /*unused*/) { - using limb_type = typename big_uint::limb_type; - // - // Check for possible overflow. - // - NIL_CO3_MP_ASSERT(!((bit_location >= limb_bits) && bits)); - - limb_type mask = chunk_bits >= limb_bits - ? ~static_cast(0u) - : (static_cast(1u) << chunk_bits) - 1; - limb_type value = (static_cast(bits) & mask) << bit_location; - *val.limbs() |= value; - - // - // Check for overflow bits: - // - bit_location = limb_bits - bit_location; - - NIL_CO3_MP_ASSERT( - !((bit_location < sizeof(bits) * CHAR_BIT) && (bits >> bit_location))); - } - template std::uintmax_t extract_bits(const big_uint& val, std::size_t location, std::size_t count) { @@ -123,10 +89,6 @@ namespace nil::crypto3::multiprecision { size_type limbs = std::distance(i, j); size_type bits = limbs * chunk_size; - // TODO(ioxid): this breaks marshalling tests - // We should throw an exception here. And check that excess bits are zero. - // NIL_CO3_MP_ASSERT(bits <= Bits); - difference_type bit_location = msv_first ? bits - chunk_size : 0; difference_type bit_location_change = msv_first ? -static_cast(chunk_size) : chunk_size; @@ -137,35 +99,43 @@ namespace nil::crypto3::multiprecision { bit_location += bit_location_change; } - // This will remove the upper bits using upper_limb_mask. - newval.normalize(); + if (newval.normalize()) { + throw std::overflow_error("import_bits: overflow"); + } - result = std::move(newval); + result = newval; return result; } template - inline big_uint& import_bits_fast(big_uint& result, T* i, T* j, - std::size_t chunk_size = 0) { - std::size_t byte_len = (j - i) * (chunk_size ? chunk_size / CHAR_BIT : sizeof(*i)); + inline big_uint& import_bits_fast(big_uint& result, T* i, T* j) { + std::size_t byte_len = (j - i) * sizeof(*i); std::size_t limb_len = byte_len / sizeof(limb_type); if (byte_len % sizeof(limb_type)) { ++limb_len; } - NIL_CO3_MP_ASSERT(result.limb_count() > limb_len); + std::size_t copy_len = (std::min)(byte_len, result.limb_count() * sizeof(limb_type)); - result.limbs()[result.limb_count() - 1] = 0u; - std::memcpy(result.limbs(), i, - (std::min)(byte_len, result.limb_count() * sizeof(limb_type))); + if (std::any_of(reinterpret_cast(i), reinterpret_cast(j), + [](char c) { return c != 0; })) { + throw std::overflow_error("import_bits: overflow"); + } + + std::memcpy(result.limbs(), i, copy_len); + std::memset(result.limbs() + copy_len, 0, + result.limb_count() * sizeof(limb_type) - copy_len); + + if (result.normalize()) { + throw std::overflow_error("import_bits: overflow"); + } - // This is probably unneeded, but let it stay for now. - result.normalize(); return result; } } // namespace detail - template + template, int> = 0> inline big_uint& import_bits(big_uint& val, Iterator i, Iterator j, std::size_t chunk_size = 0, bool msv_first = true) { return detail::import_bits_generic(val, i, j, chunk_size, msv_first); @@ -176,7 +146,7 @@ namespace nil::crypto3::multiprecision { bool msv_first = true) { #if NIL_CO3_MP_ENDIAN_LITTLE_BYTE if (((chunk_size % CHAR_BIT) == 0) && !msv_first && (sizeof(*i) * CHAR_BIT == chunk_size)) { - return detail::import_bits_fast(val, i, j, chunk_size); + return detail::import_bits_fast(val, i, j); } #endif return detail::import_bits_generic(val, i, j, chunk_size, msv_first); @@ -203,7 +173,7 @@ namespace nil::crypto3::multiprecision { *out = detail::extract_bits(val, bit_location, chunk_size); ++out; bit_location += bit_step; - } while ((bit_location >= 0) && (bit_location < static_cast(bitcount))); + } while ((bit_location >= 0) && (bit_location < static_cast(bitcount))); return out; } From 934a33395afc7544ebb29852ee41e5cab3aabe0e Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Wed, 18 Dec 2024 12:50:05 +0000 Subject: [PATCH 11/29] multiprecision: move import and export to class definition --- .../nil/crypto3/algebra/multiexp/policies.hpp | 2 +- .../nil/crypto3/hash/detail/h2c/ep.hpp | 4 +- .../nil/crypto3/hash/detail/h2c/ep2.hpp | 4 +- .../multiprecision/processing/integral.hpp | 24 +-- .../multiprecision/test/integral.cpp | 12 +- .../test/integral_fixed_size_container.cpp | 9 +- .../zk/types/placeholder/common_data.hpp | 4 +- .../nil/crypto3/multiprecision/big_uint.hpp | 1 - .../detail/big_uint/big_uint_impl.hpp | 149 +++++++++++++++ .../detail/big_uint/ops/import_export.hpp | 180 ------------------ .../include/nil/crypto3/random/hash.hpp | 4 +- 11 files changed, 181 insertions(+), 212 deletions(-) delete mode 100644 crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/import_export.hpp diff --git a/crypto3/libs/algebra/include/nil/crypto3/algebra/multiexp/policies.hpp b/crypto3/libs/algebra/include/nil/crypto3/algebra/multiexp/policies.hpp index 5e23246ef..97c12e1ef 100644 --- a/crypto3/libs/algebra/include/nil/crypto3/algebra/multiexp/policies.hpp +++ b/crypto3/libs/algebra/include/nil/crypto3/algebra/multiexp/policies.hpp @@ -116,7 +116,7 @@ namespace nil { for (std::size_t i = 0; i < length; i++) { // Should be // std::size_t bn_exponents_i_msb = exponents[i].data.base().msb() + 1; - // But nil::crypto3::multiprecision::msb doesn't work for zero value + // But msb doesn't work for zero value std::size_t bn_exponents_i_msb = 1; if (exponents[i] != field_value_type::zero()) { bn_exponents_i_msb = exponents[i].data.base().msb() + 1; diff --git a/crypto3/libs/hash/include/nil/crypto3/hash/detail/h2c/ep.hpp b/crypto3/libs/hash/include/nil/crypto3/hash/detail/h2c/ep.hpp index eeb1e23a4..1072e888c 100644 --- a/crypto3/libs/hash/include/nil/crypto3/hash/detail/h2c/ep.hpp +++ b/crypto3/libs/hash/include/nil/crypto3/hash/detail/h2c/ep.hpp @@ -97,8 +97,8 @@ namespace nil { for (std::size_t i = 0; i < N; i++) { for (std::size_t j = 0; j < m; j++) { auto elm_offset = L * (j + i * m); - import_bits(e, uniform_bytes.begin() + elm_offset, - uniform_bytes.begin() + elm_offset + L); + e.import_bits(uniform_bytes.begin() + elm_offset, + uniform_bytes.begin() + elm_offset + L); // Sometimes hash is 512 bits, while the group element is 256 or 381 bits. // In these cases we take the number module the modulus of the group. diff --git a/crypto3/libs/hash/include/nil/crypto3/hash/detail/h2c/ep2.hpp b/crypto3/libs/hash/include/nil/crypto3/hash/detail/h2c/ep2.hpp index a52936585..1d28c7ceb 100644 --- a/crypto3/libs/hash/include/nil/crypto3/hash/detail/h2c/ep2.hpp +++ b/crypto3/libs/hash/include/nil/crypto3/hash/detail/h2c/ep2.hpp @@ -86,8 +86,8 @@ namespace nil { for (std::size_t i = 0; i < N; i++) { for (std::size_t j = 0; j < m; j++) { auto elm_offset = L * (j + i * m); - import_bits(e, uniform_bytes.begin() + elm_offset, - uniform_bytes.begin() + elm_offset + L); + e.import_bits(uniform_bytes.begin() + elm_offset, + uniform_bytes.begin() + elm_offset + L); // Sometimes hash is 512 bits, while the group element is 256 or 381 bits. // In these cases we take the number module the modulus of the group. // TODO(ioxid): this is not needed diff --git a/crypto3/libs/marshalling/multiprecision/include/nil/crypto3/marshalling/multiprecision/processing/integral.hpp b/crypto3/libs/marshalling/multiprecision/include/nil/crypto3/marshalling/multiprecision/processing/integral.hpp index 367a888d3..0d76db28c 100644 --- a/crypto3/libs/marshalling/multiprecision/include/nil/crypto3/marshalling/multiprecision/processing/integral.hpp +++ b/crypto3/libs/marshalling/multiprecision/include/nil/crypto3/marshalling/multiprecision/processing/integral.hpp @@ -55,7 +55,7 @@ namespace nil { 1 : sizeof(typename std::iterator_traits::value_type) * 8; std::size_t chunk_bits = sizeof(typename std::iterator_traits::value_type) * units_bits; - export_bits(value, iter, chunk_bits, true); + value.export_bits(iter, chunk_bits, true); } /// @brief Write part of integral value into the output area using big @@ -76,12 +76,12 @@ namespace nil { if (value > 0) { std::size_t begin_index = - chunks_count - ((nil::crypto3::multiprecision::msb(value) + 1) / chunk_bits + - (((nil::crypto3::multiprecision::msb(value) + 1) % chunk_bits) ? 1 : 0)); + chunks_count - ((value.msb() + 1) / chunk_bits + + (((value.msb() + 1) % chunk_bits) ? 1 : 0)); std::fill(iter, iter + begin_index, 0); - export_bits(value, iter + begin_index, chunk_bits, true); + value.export_bits(iter + begin_index, chunk_bits, true); } else { std::fill(iter, iter + chunks_count, 0); } @@ -105,7 +105,7 @@ namespace nil { std::size_t chunk_bits = sizeof(typename std::iterator_traits::value_type) * units_bits; std::size_t chunks_count = (value_size / chunk_bits) + ((value_size % chunk_bits) ? 1 : 0); - nil::crypto3::multiprecision::import_bits(serializedValue, iter, iter + chunks_count, chunk_bits, true); + serializedValue.import_bits(iter, iter + chunks_count, chunk_bits, true); return serializedValue; } @@ -127,7 +127,7 @@ namespace nil { std::size_t chunk_bits = sizeof(typename std::iterator_traits::value_type) * units_bits; std::size_t chunks_count = (TSize / chunk_bits) + ((TSize % chunk_bits) ? 1 : 0); - nil::crypto3::multiprecision::import_bits(serializedValue, iter, iter + chunks_count, chunk_bits, true); + serializedValue.import_bits(iter, iter + chunks_count, chunk_bits, true); return serializedValue; } @@ -144,7 +144,7 @@ namespace nil { 1 : sizeof(typename std::iterator_traits::value_type) * 8; std::size_t chunk_bits = sizeof(typename std::iterator_traits::value_type) * units_bits; - export_bits(value, iter, chunk_bits, false); + value.export_bits(iter, chunk_bits, false); } /// @brief Write integral value into the output area using big @@ -162,14 +162,14 @@ namespace nil { std::size_t chunks_count = (TSize / chunk_bits) + ((TSize % chunk_bits) ? 1 : 0); if (value > 0) { - std::size_t begin_index = ((nil::crypto3::multiprecision::msb(value) + 1) / chunk_bits + - (((nil::crypto3::multiprecision::msb(value) + 1) % chunk_bits) ? 1 : 0)); + std::size_t begin_index = ((value.msb() + 1) / chunk_bits + + (((value.msb() + 1) % chunk_bits) ? 1 : 0)); if (begin_index < chunks_count) { std::fill(iter + begin_index, iter + chunks_count, 0x00); } - export_bits(value, iter, chunk_bits, false); + value.export_bits(iter, chunk_bits, false); } else { std::fill(iter, iter + chunks_count, 0); } @@ -191,7 +191,7 @@ namespace nil { std::size_t chunk_bits = sizeof(typename std::iterator_traits::value_type) * units_bits; std::size_t chunks_count = (value_size / chunk_bits) + ((value_size % chunk_bits) ? 1 : 0); - nil::crypto3::multiprecision::import_bits(serializedValue, iter, iter + chunks_count, chunk_bits, false); + serializedValue.import_bits(iter, iter + chunks_count, chunk_bits, false); return serializedValue; } @@ -211,7 +211,7 @@ namespace nil { std::size_t chunk_bits = sizeof(typename std::iterator_traits::value_type) * units_bits; std::size_t chunks_count = (TSize / chunk_bits) + ((TSize % chunk_bits) ? 1 : 0); - nil::crypto3::multiprecision::import_bits(serializedValue, iter, iter + chunks_count, chunk_bits, false); + serializedValue.import_bits(iter, iter + chunks_count, chunk_bits, false); return serializedValue; } diff --git a/crypto3/libs/marshalling/multiprecision/test/integral.cpp b/crypto3/libs/marshalling/multiprecision/test/integral.cpp index 789a355bb..0435f5919 100644 --- a/crypto3/libs/marshalling/multiprecision/test/integral.cpp +++ b/crypto3/libs/marshalling/multiprecision/test/integral.cpp @@ -83,10 +83,10 @@ void test_round_trip_fixed_precision_big_endian(T val) { std::vector cv; cv.resize(unitblob_size, 0x00); - std::size_t begin_index = cv.size() - ((nil::crypto3::multiprecision::msb(val) + 1) / units_bits + - (((nil::crypto3::multiprecision::msb(val) + 1) % units_bits) ? 1 : 0)); + std::size_t begin_index = + cv.size() - ((val.msb() + 1) / units_bits + (((val.msb() + 1) % units_bits) ? 1 : 0)); - export_bits(val, cv.begin() + begin_index, units_bits, true); + val.export_bits(cv.begin() + begin_index, units_bits, true); nil::crypto3::marshalling::status_type status; T test_val = nil::crypto3::marshalling::pack(cv, status); @@ -111,7 +111,7 @@ void test_round_trip_fixed_precision_little_endian(T val) { std::vector cv; - export_bits(val, std::back_inserter(cv), units_bits, false); + val.export_bits(std::back_inserter(cv), units_bits, false); cv.resize(unitblob_size, 0x00); nil::crypto3::marshalling::status_type status; @@ -148,8 +148,8 @@ void test_round_trip_non_fixed_precision(T val) { using unit_type = OutputType; std::vector cv; - export_bits( - val, std::back_inserter(cv), units_bits, + val.export_bits( + std::back_inserter(cv), units_bits, static_cast( std::is_same::value)); diff --git a/crypto3/libs/marshalling/multiprecision/test/integral_fixed_size_container.cpp b/crypto3/libs/marshalling/multiprecision/test/integral_fixed_size_container.cpp index df026cde3..50c3d66f1 100644 --- a/crypto3/libs/marshalling/multiprecision/test/integral_fixed_size_container.cpp +++ b/crypto3/libs/marshalling/multiprecision/test/integral_fixed_size_container.cpp @@ -94,10 +94,11 @@ void test_round_trip_fixed_size_container_fixed_precision_big_endian( for (std::size_t i = 0; i < TSize; i++) { std::size_t begin_index = - unitblob_size - ((nil::crypto3::multiprecision::msb(val_container[i]) + 1) / units_bits + - (((nil::crypto3::multiprecision::msb(val_container[i]) + 1) % units_bits) ? 1 : 0)); + unitblob_size - ((val_container[i].msb() + 1) / units_bits + + (((val_container[i].msb() + 1) % units_bits) ? 1 : 0)); - export_bits(val_container[i], cv.begin() + unitblob_size * i + begin_index, units_bits, true); + val_container[i].export_bits(cv.begin() + unitblob_size * i + begin_index, units_bits, + true); } nil::crypto3::marshalling::status_type status; @@ -135,7 +136,7 @@ void test_round_trip_fixed_size_container_fixed_precision_little_endian( cv.resize(unitblob_size * TSize, 0x00); for (std::size_t i = 0; i < TSize; i++) { - export_bits(val_container[i], cv.begin() + unitblob_size * i, units_bits, false); + val_container[i].export_bits(cv.begin() + unitblob_size * i, units_bits, false); } nil::crypto3::marshalling::status_type status; diff --git a/crypto3/libs/marshalling/zk/include/nil/crypto3/marshalling/zk/types/placeholder/common_data.hpp b/crypto3/libs/marshalling/zk/include/nil/crypto3/marshalling/zk/types/placeholder/common_data.hpp index 82ac12ed7..17a57bd8d 100644 --- a/crypto3/libs/marshalling/zk/include/nil/crypto3/marshalling/zk/types/placeholder/common_data.hpp +++ b/crypto3/libs/marshalling/zk/include/nil/crypto3/marshalling/zk/types/placeholder/common_data.hpp @@ -149,7 +149,7 @@ namespace nil { >::value) { auto integral = typename CommonDataType::field_type::integral_type(common_data.vk.constraint_system_with_params_hash.data); std::vector blob; - export_bits(integral, std::back_inserter(blob), 8); + integral.export_bits(std::back_inserter(blob), 8); for( std::size_t i = blob.size(); i > 0; i--){ filled_constraint_system_with_params_hash.value().push_back( nil::crypto3::marshalling::types::integral(blob[i-1]) @@ -247,7 +247,7 @@ namespace nil { blob.push_back(std::uint8_t(std::get<13>(filled_common_data.value()).value()[i].value())); } typename CommonDataType::field_type::integral_type newval; - import_bits(newval, blob.begin(), blob.end(), 8, false); + newval.import_bits(blob.begin(), blob.end(), 8, false); vk.constraint_system_with_params_hash = typename CommonDataType::field_type::value_type(newval); } else { for( std::size_t i = 0; i < std::get<13>(filled_common_data.value()).value().size(); i++){ diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_uint.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_uint.hpp index 277bf0588..0d0c16ba7 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_uint.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_uint.hpp @@ -3,7 +3,6 @@ #include "nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp" // IWYU pragma: export #include "nil/crypto3/multiprecision/detail/big_uint/limits.hpp" // IWYU pragma: export #include "nil/crypto3/multiprecision/detail/big_uint/ops/gcd_inverse.hpp" // IWYU pragma: export -#include "nil/crypto3/multiprecision/detail/big_uint/ops/import_export.hpp" // IWYU pragma: export #include "nil/crypto3/multiprecision/detail/big_uint/ops/jacobi.hpp" // IWYU pragma: export #include "nil/crypto3/multiprecision/detail/big_uint/ops/powm.hpp" // IWYU pragma: export #include "nil/crypto3/multiprecision/detail/big_uint/ops/ressol.hpp" // IWYU pragma: export diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp index 5e385c3b3..3a1069718 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp @@ -13,6 +13,8 @@ #include #include #include +#include +#include #include #include #include @@ -998,6 +1000,153 @@ namespace nil::crypto3::multiprecision { return result; } + // Import / export + + private: + template + void assign_bits(Unsigned bits, std::size_t bit_location, std::size_t chunk_bits) { + std::size_t limb = bit_location / limb_bits; + std::size_t shift = bit_location % limb_bits; + + limb_type mask = chunk_bits >= limb_bits + ? ~static_cast(0u) + : (static_cast(1u) << chunk_bits) - 1; + + limb_type value = static_cast(bits & mask) << shift; + if (value) { + if (limb >= limb_count()) { + throw std::overflow_error("import_bits: overflow"); + } + limbs()[limb] |= value; + } + + /* If some extra bits need to be assigned to the next limb */ + if (chunk_bits > limb_bits - shift) { + shift = limb_bits - shift; + chunk_bits -= shift; + bit_location += shift; + auto extra_bits = bits >> shift; + if (extra_bits) { + assign_bits(extra_bits, bit_location, chunk_bits); + } + } + } + + std::uintmax_t extract_bits(std::size_t location, std::size_t count) const { + std::size_t limb = location / limb_bits; + std::size_t shift = location % limb_bits; + std::uintmax_t result = 0; + std::uintmax_t mask = count == std::numeric_limits::digits + ? ~static_cast(0) + : (static_cast(1u) << count) - 1; + if (count > (limb_bits - shift)) { + result = extract_bits(location + limb_bits - shift, count - limb_bits + shift); + result <<= limb_bits - shift; + } + if (limb < limb_count()) { + result |= (limbs()[limb] >> shift) & mask; + } + return result; + } + + template + void import_bits_generic(Iterator i, Iterator j, std::size_t chunk_size = 0, + bool msv_first = true) { + zero_after(0); + + using value_type = typename std::iterator_traits::value_type; + using difference_type = typename std::iterator_traits::difference_type; + using size_type = typename std::make_unsigned::type; + + if (!chunk_size) { + chunk_size = std::numeric_limits::digits; + } + + size_type limbs = std::distance(i, j); + size_type bits = limbs * chunk_size; + + difference_type bit_location = msv_first ? bits - chunk_size : 0; + difference_type bit_location_change = + msv_first ? -static_cast(chunk_size) : chunk_size; + + while (i != j) { + assign_bits(*i, static_cast(bit_location), chunk_size); + ++i; + bit_location += bit_location_change; + } + + if (normalize()) { + throw std::overflow_error("import_bits: overflow"); + } + } + + template + void import_bits_fast(T* i, T* j) { + std::size_t byte_len = (j - i) * sizeof(*i); + std::size_t limb_len = byte_len / sizeof(limb_type); + if (byte_len % sizeof(limb_type)) { + ++limb_len; + } + + std::size_t copy_len = (std::min)(byte_len, limb_count() * sizeof(limb_type)); + + if (std::any_of(reinterpret_cast(i), reinterpret_cast(j), + [](char c) { return c != 0; })) { + throw std::overflow_error("import_bits: overflow"); + } + + std::memcpy(limbs(), i, copy_len); + std::memset(limbs() + copy_len, 0, limb_count() * sizeof(limb_type) - copy_len); + + if (normalize()) { + throw std::overflow_error("import_bits: overflow"); + } + } + + public: + template, int> = 0> + void import_bits(Iterator i, Iterator j, std::size_t chunk_size = 0, + bool msv_first = true) { + return import_bits_generic(i, j, chunk_size, msv_first); + } + + template + void import_bits(T* i, T* j, std::size_t chunk_size = 0, bool msv_first = true) { +#if NIL_CO3_MP_ENDIAN_LITTLE_BYTE + if (((chunk_size % CHAR_BIT) == 0) && !msv_first && + (sizeof(*i) * CHAR_BIT == chunk_size)) { + return import_bits_fast(i, j); + } +#endif + return import_bits_generic(i, j, chunk_size, msv_first); + } + + template + OutputIterator export_bits(OutputIterator out, std::size_t chunk_size, + bool msv_first = true) const { + if (!*this) { + *out = 0; + ++out; + return out; + } + std::size_t bitcount = msb() + 1; + + std::ptrdiff_t bit_location = + msv_first ? static_cast(bitcount - chunk_size) : 0; + const std::ptrdiff_t bit_step = msv_first ? (-static_cast(chunk_size)) + : static_cast(chunk_size); + while (bit_location % bit_step) { + ++bit_location; + } + do { + *out = extract_bits(bit_location, chunk_size); + ++out; + bit_location += bit_step; + } while ((bit_location >= 0) && (bit_location < static_cast(bitcount))); + + return out; + } + // IO friend std::ostream& operator<<(std::ostream& os, const big_uint& value) { diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/import_export.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/import_export.hpp deleted file mode 100644 index 3751454a8..000000000 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/import_export.hpp +++ /dev/null @@ -1,180 +0,0 @@ -/////////////////////////////////////////////////////////////// -// Copyright 2015 John Maddock. Distributed under the Boost -// Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt -/////////////////////////////////////////////////////////////// - -#pragma once - -// IWYU pragma: private; include "nil/crypto3/multiprecision/big_uint.hpp" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp" -#include "nil/crypto3/multiprecision/detail/big_uint/storage.hpp" -#include "nil/crypto3/multiprecision/detail/endian.hpp" - -namespace nil::crypto3::multiprecision { - namespace detail { - template - void assign_bits(big_uint& val, Unsigned bits, std::size_t bit_location, - std::size_t chunk_bits) { - std::size_t limb = bit_location / limb_bits; - std::size_t shift = bit_location % limb_bits; - - limb_type mask = chunk_bits >= limb_bits - ? ~static_cast(0u) - : (static_cast(1u) << chunk_bits) - 1; - - limb_type value = static_cast(bits & mask) << shift; - if (value) { - if (limb >= val.limb_count()) { - throw std::overflow_error("import_bits: overflow"); - } - val.limbs()[limb] |= value; - } - - /* If some extra bits need to be assigned to the next limb */ - if (chunk_bits > limb_bits - shift) { - shift = limb_bits - shift; - chunk_bits -= shift; - bit_location += shift; - auto extra_bits = bits >> shift; - if (extra_bits) { - assign_bits(val, extra_bits, bit_location, chunk_bits); - } - } - } - - template - std::uintmax_t extract_bits(const big_uint& val, std::size_t location, - std::size_t count) { - std::size_t limb = location / limb_bits; - std::size_t shift = location % limb_bits; - std::uintmax_t result = 0; - std::uintmax_t mask = count == std::numeric_limits::digits - ? ~static_cast(0) - : (static_cast(1u) << count) - 1; - if (count > (limb_bits - shift)) { - result = extract_bits(val, location + limb_bits - shift, count - limb_bits + shift); - result <<= limb_bits - shift; - } - if (limb < val.limb_count()) { - result |= (val.limbs()[limb] >> shift) & mask; - } - return result; - } - - template - big_uint& import_bits_generic(big_uint& result, Iterator i, Iterator j, - std::size_t chunk_size = 0, bool msv_first = true) { - big_uint newval; - - using value_type = typename std::iterator_traits::value_type; - using difference_type = typename std::iterator_traits::difference_type; - using size_type = typename std::make_unsigned::type; - - if (!chunk_size) { - chunk_size = std::numeric_limits::digits; - } - - size_type limbs = std::distance(i, j); - size_type bits = limbs * chunk_size; - - difference_type bit_location = msv_first ? bits - chunk_size : 0; - difference_type bit_location_change = - msv_first ? -static_cast(chunk_size) : chunk_size; - - while (i != j) { - assign_bits(newval, *i, static_cast(bit_location), chunk_size); - ++i; - bit_location += bit_location_change; - } - - if (newval.normalize()) { - throw std::overflow_error("import_bits: overflow"); - } - - result = newval; - return result; - } - - template - inline big_uint& import_bits_fast(big_uint& result, T* i, T* j) { - std::size_t byte_len = (j - i) * sizeof(*i); - std::size_t limb_len = byte_len / sizeof(limb_type); - if (byte_len % sizeof(limb_type)) { - ++limb_len; - } - - std::size_t copy_len = (std::min)(byte_len, result.limb_count() * sizeof(limb_type)); - - if (std::any_of(reinterpret_cast(i), reinterpret_cast(j), - [](char c) { return c != 0; })) { - throw std::overflow_error("import_bits: overflow"); - } - - std::memcpy(result.limbs(), i, copy_len); - std::memset(result.limbs() + copy_len, 0, - result.limb_count() * sizeof(limb_type) - copy_len); - - if (result.normalize()) { - throw std::overflow_error("import_bits: overflow"); - } - - return result; - } - } // namespace detail - - template, int> = 0> - inline big_uint& import_bits(big_uint& val, Iterator i, Iterator j, - std::size_t chunk_size = 0, bool msv_first = true) { - return detail::import_bits_generic(val, i, j, chunk_size, msv_first); - } - - template - inline big_uint& import_bits(big_uint& val, T* i, T* j, std::size_t chunk_size = 0, - bool msv_first = true) { -#if NIL_CO3_MP_ENDIAN_LITTLE_BYTE - if (((chunk_size % CHAR_BIT) == 0) && !msv_first && (sizeof(*i) * CHAR_BIT == chunk_size)) { - return detail::import_bits_fast(val, i, j); - } -#endif - return detail::import_bits_generic(val, i, j, chunk_size, msv_first); - } - - template - OutputIterator export_bits(const big_uint& val, OutputIterator out, - std::size_t chunk_size, bool msv_first = true) { - if (!val) { - *out = 0; - ++out; - return out; - } - std::size_t bitcount = msb(val) + 1; - - std::ptrdiff_t bit_location = - msv_first ? static_cast(bitcount - chunk_size) : 0; - const std::ptrdiff_t bit_step = msv_first ? (-static_cast(chunk_size)) - : static_cast(chunk_size); - while (bit_location % bit_step) { - ++bit_location; - } - do { - *out = detail::extract_bits(val, bit_location, chunk_size); - ++out; - bit_location += bit_step; - } while ((bit_location >= 0) && (bit_location < static_cast(bitcount))); - - return out; - } -} // namespace nil::crypto3::multiprecision diff --git a/crypto3/libs/random/include/nil/crypto3/random/hash.hpp b/crypto3/libs/random/include/nil/crypto3/random/hash.hpp index a4a386e22..5520e6e1f 100644 --- a/crypto3/libs/random/include/nil/crypto3/random/hash.hpp +++ b/crypto3/libs/random/include/nil/crypto3/random/hash.hpp @@ -99,8 +99,8 @@ namespace nil { }, seed_bytes.begin()); res = ::nil::crypto3::hash(seed_bytes); - ::nil::crypto3::multiprecision::import_bits( - result, res.begin(), res.begin() + bincode::modulus_chunks, 8, false); + result.import_bits(res.begin(), res.begin() + bincode::modulus_chunks, 8, + false); ++iter; } while (result >= result_type::field_type::modulus); From eca8b41972e16572f4a0c36c5d514e8aa207e78e Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Wed, 18 Dec 2024 13:13:02 +0000 Subject: [PATCH 12/29] multiprecision: simplify intrinsics logic --- .../detail/big_uint/arithmetic.hpp | 2 +- .../multiprecision/detail/helper_macros.hpp | 34 ------------------ .../detail/intel_intrinsics.hpp | 35 +++++++------------ 3 files changed, 14 insertions(+), 57 deletions(-) delete mode 100644 crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/helper_macros.hpp diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp index f9bffcbeb..1c2c73696 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp @@ -188,7 +188,7 @@ namespace nil::crypto3::multiprecision { } } -#ifdef NIL_CO3_MP_HAS_IMMINTRIN_H +#ifdef NIL_CO3_MP_HAS_INTRINSICS // // This is the key addition routine: // diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/helper_macros.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/helper_macros.hpp deleted file mode 100644 index 838b4dde2..000000000 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/helper_macros.hpp +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -// Copyright 2001 John Maddock. -// Copyright 2017 Peter Dimov. -// -// Distributed under the Boost Software License, Version 1.0. -// -// See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt -// -// NIL_CO3_MP_STRINGIZE(X) -// NIL_CO3_MP_JOIN(X, Y) -// -// Note that this header is C compatible. - -// -// Helper macro NIL_CO3_MP_STRINGIZE: -// Converts the parameter X to a string after macro replacement -// on X has been performed. -// -#define NIL_CO3_MP_STRINGIZE(X) NIL_CO3_MP_DO_STRINGIZE(X) -#define NIL_CO3_MP_DO_STRINGIZE(X) #X - -// -// Helper macro NIL_CO3_MP_JOIN: -// The following piece of macro magic joins the two -// arguments together, even when one of the arguments is -// itself a macro (see 16.3.1 in C++ standard). The key -// is that macro expansion of macro arguments does not -// occur in NIL_CO3_MP_DO_JOIN2 but does in NIL_CO3_MP_DO_JOIN. -// -#define NIL_CO3_MP_JOIN(X, Y) NIL_CO3_MP_DO_JOIN(X, Y) -#define NIL_CO3_MP_DO_JOIN(X, Y) NIL_CO3_MP_DO_JOIN2(X, Y) -#define NIL_CO3_MP_DO_JOIN2(X, Y) X##Y diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/intel_intrinsics.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/intel_intrinsics.hpp index 6f8d9ed9e..5a479b6b7 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/intel_intrinsics.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/intel_intrinsics.hpp @@ -2,55 +2,46 @@ #include "nil/crypto3/multiprecision/detail/big_uint/storage.hpp" #include "nil/crypto3/multiprecision/detail/config.hpp" -#include "nil/crypto3/multiprecision/detail/helper_macros.hpp" #include "nil/crypto3/multiprecision/detail/int128.hpp" -#if __has_include() +#if __has_include() -#define NIL_CO3_MP_HAS_IMMINTRIN_H +#define NIL_CO3_MP_HAS_INTRINSICS -#include // IWYU pragma: keep - -#if defined(NIL_CO3_MP_HAS_INT128) +#include namespace nil::crypto3::multiprecision::detail { +#if defined(NIL_CO3_MP_HAS_INT128) + NIL_CO3_MP_FORCEINLINE unsigned char addcarry_limb(unsigned char carry, limb_type a, limb_type b, limb_type* p_result) { using cast_type = unsigned long long; - - return NIL_CO3_MP_JOIN(_addcarry_u, 64)(carry, a, b, - reinterpret_cast(p_result)); + return _addcarry_u64(carry, a, b, reinterpret_cast(p_result)); } NIL_CO3_MP_FORCEINLINE unsigned char subborrow_limb(unsigned char carry, limb_type a, limb_type b, limb_type* p_result) { using cast_type = unsigned long long; - - return NIL_CO3_MP_JOIN(_subborrow_u, 64)(carry, a, b, - reinterpret_cast(p_result)); + return _subborrow_u64(carry, a, b, reinterpret_cast(p_result)); } -} // namespace nil::crypto3::multiprecision::detail - #else -namespace nil::crypto3::multiprecision::detail { - NIL_CO3_MP_FORCEINLINE unsigned char addcarry_limb(unsigned char carry, limb_type a, limb_type b, limb_type* p_result) { - return NIL_CO3_MP_JOIN(_addcarry_u, 32)(carry, a, b, - reinterpret_cast(p_result)); + using cast_type = unsigned int; + return _addcarry_u32(carry, a, b, reinterpret_cast(p_result)); } NIL_CO3_MP_FORCEINLINE unsigned char subborrow_limb(unsigned char carry, limb_type a, limb_type b, limb_type* p_result) { - return NIL_CO3_MP_JOIN(_subborrow_u, 32)(carry, a, b, - reinterpret_cast(p_result)); + using cast_type = unsigned int; + return _subborrow_u32(carry, a, b, reinterpret_cast(p_result)); } -} // namespace nil::crypto3::multiprecision::detail - #endif +} // namespace nil::crypto3::multiprecision::detail + #endif From 9b220cfdb5e735adb32ed90a8c0e84f5988e75ce Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Wed, 18 Dec 2024 13:23:54 +0000 Subject: [PATCH 13/29] multiprecision: remove detail/type_traits and clean up --- .../crypto3/multiprecision/detail/big_int.hpp | 5 +++- .../detail/big_mod/modular_ops.hpp | 7 ++--- .../multiprecision/detail/big_mod/ops/pow.hpp | 6 ++--- .../detail/big_uint/big_uint_impl.hpp | 1 - .../detail/big_uint/ops/powm.hpp | 5 ++-- .../detail/integer_ops_base.hpp | 1 - .../multiprecision/detail/integer_utils.hpp | 22 +++++++++++++-- .../multiprecision/detail/type_traits.hpp | 27 ------------------- 8 files changed, 33 insertions(+), 41 deletions(-) delete mode 100644 crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/type_traits.hpp diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp index 4393bc6cc..17c359cac 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp @@ -1,13 +1,16 @@ #pragma once -#include #include #include #include +#include +#include #include #include #include +#include + #include "nil/crypto3/multiprecision/detail/assert.hpp" #include "nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp" #include "nil/crypto3/multiprecision/detail/config.hpp" diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp index b300f7df9..dd94da31a 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp @@ -24,7 +24,6 @@ #include "nil/crypto3/multiprecision/detail/big_uint/storage.hpp" #include "nil/crypto3/multiprecision/detail/integer_ops_base.hpp" #include "nil/crypto3/multiprecision/detail/integer_utils.hpp" -#include "nil/crypto3/multiprecision/detail/type_traits.hpp" namespace nil::crypto3::multiprecision::detail { template @@ -195,7 +194,8 @@ namespace nil::crypto3::multiprecision::detail { template< std::size_t Bits2, std::size_t Bits3, typename T, /// result should fit in the output parameter - std::enable_if_t::Bits >= big_uint_t::Bits && is_unsigned_integer_v, + std::enable_if_t::Bits >= big_uint_t::Bits && + detail::is_integral_v && !std::numeric_limits::is_signed, int> = 0> constexpr void pow(big_uint &result, const big_uint &a, T exp) const { NIL_CO3_MP_ASSERT(a < mod()); @@ -564,7 +564,8 @@ namespace nil::crypto3::multiprecision::detail { template< std::size_t Bits2, std::size_t Bits3, typename T, /// result should fit in the output parameter - std::enable_if_t::Bits >= big_uint_t::Bits && is_unsigned_integer_v, + std::enable_if_t::Bits >= big_uint_t::Bits && + detail::is_integral_v && !std::numeric_limits::is_signed, int> = 0> constexpr void pow(big_uint &result, const big_uint &a, T exp) const { /// input parameter should be less than modulus diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/pow.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/pow.hpp index f68261387..491376a5f 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/pow.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/pow.hpp @@ -19,11 +19,11 @@ #include "nil/crypto3/multiprecision/detail/big_mod/big_mod_impl.hpp" #include "nil/crypto3/multiprecision/detail/big_mod/ops/inverse.hpp" #include "nil/crypto3/multiprecision/detail/integer_utils.hpp" -#include "nil/crypto3/multiprecision/detail/type_traits.hpp" namespace nil::crypto3::multiprecision { template && detail::is_unsigned_integer_v, + std::enable_if_t && detail::is_integral_v && + !std::numeric_limits::is_signed, int> = 0> constexpr big_mod_t pow(const big_mod_t &b, const T &e) { big_mod_t result(b.ops_storage()); @@ -32,7 +32,7 @@ namespace nil::crypto3::multiprecision { } template && detail::is_integer_v && + std::enable_if_t && detail::is_integral_v && std::numeric_limits::is_signed, int> = 0> constexpr big_mod_t pow(const big_mod_t &b, const T &e) { diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp index 3a1069718..84f1faa09 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp @@ -30,7 +30,6 @@ #include "nil/crypto3/multiprecision/detail/big_uint/type_traits.hpp" // IWYU pragma: export #include "nil/crypto3/multiprecision/detail/config.hpp" #include "nil/crypto3/multiprecision/detail/endian.hpp" -#include "nil/crypto3/multiprecision/detail/type_traits.hpp" namespace nil::crypto3::multiprecision { /** diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/powm.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/powm.hpp index 124abf694..5274f7a00 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/powm.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/powm.hpp @@ -19,12 +19,11 @@ #include "nil/crypto3/multiprecision/detail/big_mod/big_mod_impl.hpp" #include "nil/crypto3/multiprecision/detail/big_mod/ops/pow.hpp" #include "nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp" -#include "nil/crypto3/multiprecision/detail/type_traits.hpp" namespace nil::crypto3::multiprecision { template> && - detail::is_integer_v>, + std::enable_if_t> && + detail::is_integral_v>, int> = 0> constexpr big_uint powm(T1 &&b, T2 &&e, const big_uint &m) { return pow(big_mod_rt(std::forward(b), m), std::forward(e)).base(); diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_base.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_base.hpp index e23ee48b1..3b3bede0e 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_base.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_base.hpp @@ -4,7 +4,6 @@ #include #include "nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp" -#include "nil/crypto3/multiprecision/detail/type_traits.hpp" namespace nil::crypto3::multiprecision { template, int> = 0> diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_utils.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_utils.hpp index 78fbacbb4..f0714368e 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_utils.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_utils.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include "nil/crypto3/multiprecision/detail/big_uint/type_traits.hpp" @@ -11,10 +12,27 @@ namespace nil::crypto3::multiprecision::detail { return (x < 0) ? -ux : ux; // compare signed x, negate unsigned x } - template || - (std::is_integral_v && std::is_unsigned_v), + template> || + (std::is_integral_v> && + std::is_unsigned_v>), int> = 0> constexpr decltype(auto) unsigned_abs(T&& x) { return std::forward(x); } + + template, int> = 0> + constexpr std::make_unsigned_t unsigned_or_throw(const T& a) { + if (a < 0) { + throw std::range_error("nonnegative value expected"); + } + return static_cast>(a); + } + + template> || + (std::is_integral_v> && + std::is_unsigned_v>), + int> = 0> + constexpr decltype(auto) unsigned_or_throw(T&& a) { + return std::forward(a); + } } // namespace nil::crypto3::multiprecision::detail diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/type_traits.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/type_traits.hpp deleted file mode 100644 index e9ec825bf..000000000 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/type_traits.hpp +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once - -#include -#include -#include - -namespace nil::crypto3::multiprecision::detail { - template - constexpr bool is_integer_v = - std::numeric_limits::is_specialized && std::numeric_limits::is_integer; - - template - constexpr bool is_unsigned_integer_v = is_integer_v && !std::numeric_limits::is_signed; - - template>, int> = 0> - constexpr decltype(auto) unsigned_or_throw(T&& a) { - return std::forward(a); - } - - template, int> = 0> - constexpr std::make_unsigned_t unsigned_or_throw(const T& a) { - if (a < 0) { - throw std::range_error("nonnegative value expected"); - } - return static_cast>(a); - } -} // namespace nil::crypto3::multiprecision::detail From c4fc2bb96b1c836283e48bb794d4f33c6d046810 Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Wed, 18 Dec 2024 13:32:53 +0000 Subject: [PATCH 14/29] multiprecision: replace custom asserts with boost --- .../crypto3/multiprecision/detail/assert.hpp | 6 ---- .../crypto3/multiprecision/detail/big_int.hpp | 4 +-- .../detail/big_mod/big_mod_impl.hpp | 9 +++--- .../detail/big_mod/modular_ops.hpp | 17 +++++----- .../detail/big_uint/arithmetic.hpp | 31 ++++++++++--------- .../detail/big_uint/big_uint_impl.hpp | 14 ++++----- .../detail/big_uint/ops/gcd_inverse.hpp | 7 +++-- .../detail/big_uint/ops/ressol.hpp | 9 +++--- .../crypto3/multiprecision/miller_rabin.hpp | 12 +++---- 9 files changed, 54 insertions(+), 55 deletions(-) delete mode 100644 crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/assert.hpp diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/assert.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/assert.hpp deleted file mode 100644 index 3a8ca9e01..000000000 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/assert.hpp +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#include - -#define NIL_CO3_MP_ASSERT(expr) assert(expr) -#define NIL_CO3_MP_ASSERT_MSG(expr, msg) assert((expr) && (msg)) diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp index 17c359cac..50f42a3ce 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp @@ -9,9 +9,9 @@ #include #include +#include #include -#include "nil/crypto3/multiprecision/detail/assert.hpp" #include "nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp" #include "nil/crypto3/multiprecision/detail/config.hpp" @@ -108,7 +108,7 @@ namespace nil::crypto3::multiprecision { template explicit constexpr operator big_uint() const { - NIL_CO3_MP_ASSERT(!this->negative()); + BOOST_ASSERT(!this->negative()); return m_abs; } diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/big_mod_impl.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/big_mod_impl.hpp index 6e81bb8de..2251301bb 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/big_mod_impl.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/big_mod_impl.hpp @@ -21,7 +21,8 @@ #include #include -#include "nil/crypto3/multiprecision/detail/assert.hpp" +#include + #include "nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp" #include "nil/crypto3/multiprecision/detail/big_mod/modular_ops_storage.hpp" #include "nil/crypto3/multiprecision/detail/big_mod/type_traits.hpp" // IWYU pragma: export @@ -89,7 +90,7 @@ namespace nil::crypto3::multiprecision { #define NIL_CO3_MP_BIG_MOD_COMPARISON_IMPL(OP_) \ constexpr bool operator OP_(const big_mod_impl& o) const noexcept { \ - NIL_CO3_MP_ASSERT(ops().compare_eq(o.ops())); \ + BOOST_ASSERT(ops().compare_eq(o.ops())); \ return raw_base() OP_ o.raw_base(); \ } \ \ @@ -178,7 +179,7 @@ namespace nil::crypto3::multiprecision { 0> \ friend constexpr auto operator OP_(const big_mod_impl& a, const T& b) noexcept { \ if constexpr (detail::is_big_mod_v) { \ - NIL_CO3_MP_ASSERT(a.ops().compare_eq(b.ops())); \ + BOOST_ASSERT(a.ops().compare_eq(b.ops())); \ } \ big_mod_impl result = a; \ a.ops().METHOD_(result.raw_base(), convert_to_raw_base(b, a.ops())); \ @@ -198,7 +199,7 @@ namespace nil::crypto3::multiprecision { 0> \ friend constexpr auto& operator OP_ASSIGN_(big_mod_impl & a, const T & b) noexcept { \ if constexpr (detail::is_big_mod_v) { \ - NIL_CO3_MP_ASSERT(a.ops().compare_eq(b.ops())); \ + BOOST_ASSERT(a.ops().compare_eq(b.ops())); \ } \ a.ops().METHOD_(a.raw_base(), convert_to_raw_base(b, a.ops())); \ return a; \ diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp index dd94da31a..a6447fad4 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp @@ -19,7 +19,8 @@ #include #include -#include "nil/crypto3/multiprecision/detail/assert.hpp" +#include + #include "nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp" #include "nil/crypto3/multiprecision/detail/big_uint/storage.hpp" #include "nil/crypto3/multiprecision/detail/integer_ops_base.hpp" @@ -94,7 +95,7 @@ namespace nil::crypto3::multiprecision::detail { // result should fit in the output parameter std::enable_if_t= Bits3, int> = 0> constexpr void add(big_uint &result, const big_uint &y) const { - NIL_CO3_MP_ASSERT(result < mod() && y < mod()); + BOOST_ASSERT(result < mod() && y < mod()); bool carry = add_assign_with_carry(result, y); @@ -198,7 +199,7 @@ namespace nil::crypto3::multiprecision::detail { detail::is_integral_v && !std::numeric_limits::is_signed, int> = 0> constexpr void pow(big_uint &result, const big_uint &a, T exp) const { - NIL_CO3_MP_ASSERT(a < mod()); + BOOST_ASSERT(a < mod()); if (is_zero(exp)) { result = 1u; @@ -241,7 +242,7 @@ namespace nil::crypto3::multiprecision::detail { /// input number should fit in result std::enable_if_t= Bits3, int> = 0> constexpr void adjust_regular(big_uint &result, const big_uint &input) const { - NIL_CO3_MP_ASSERT(input < mod()); + BOOST_ASSERT(input < mod()); result = input; } @@ -377,8 +378,8 @@ namespace nil::crypto3::multiprecision::detail { template constexpr void montgomery_mul_no_carry_impl(big_uint &c, const big_uint &b) const { - NIL_CO3_MP_ASSERT(c < this->mod() && b < this->mod()); - NIL_CO3_MP_ASSERT(is_applicable_for_no_carry_montgomery_mul()); + BOOST_ASSERT(c < this->mod() && b < this->mod()); + BOOST_ASSERT(is_applicable_for_no_carry_montgomery_mul()); // Obtain number of limbs constexpr int N = big_uint::static_limb_count; @@ -472,7 +473,7 @@ namespace nil::crypto3::multiprecision::detail { template constexpr void montgomery_mul_CIOS_impl(big_uint &result, const big_uint &y) const { - NIL_CO3_MP_ASSERT(result < this->mod() && y < this->mod()); + BOOST_ASSERT(result < this->mod() && y < this->mod()); big_uint_t A(limb_type(0u)); const std::size_t mod_size = this->mod().limb_count(); @@ -569,7 +570,7 @@ namespace nil::crypto3::multiprecision::detail { int> = 0> constexpr void pow(big_uint &result, const big_uint &a, T exp) const { /// input parameter should be less than modulus - NIL_CO3_MP_ASSERT(a < this->mod()); + BOOST_ASSERT(a < this->mod()); big_uint_t R_mod_m = m_one; diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp index 1c2c73696..b20cb6065 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp @@ -7,7 +7,8 @@ #include #include -#include "nil/crypto3/multiprecision/detail/assert.hpp" +#include + #include "nil/crypto3/multiprecision/detail/big_uint/storage.hpp" #include "nil/crypto3/multiprecision/detail/big_uint/type_traits.hpp" #include "nil/crypto3/multiprecision/detail/integer_utils.hpp" @@ -85,7 +86,7 @@ namespace nil::crypto3::multiprecision { ++pr, ++pa; } - NIL_CO3_MP_ASSERT(carry <= 1); + BOOST_ASSERT(carry <= 1); if (carry) { if (result.limb_count() > x) { @@ -181,7 +182,7 @@ namespace nil::crypto3::multiprecision { if ((x != i) && (pa != pr)) { std::copy(pa + i, pa + x, pr + i); } - NIL_CO3_MP_ASSERT(0 == borrow); + BOOST_ASSERT(0 == borrow); if (swapped) { result.negate_wrapping(); @@ -269,7 +270,7 @@ namespace nil::crypto3::multiprecision { std::copy(pa + i, pa + x, pr + i); } - NIL_CO3_MP_ASSERT(carry <= 1); + BOOST_ASSERT(carry <= 1); if constexpr (Bits1 % limb_bits != 0) { // If we have set any bit above "Bits", then we have a carry. @@ -349,7 +350,7 @@ namespace nil::crypto3::multiprecision { if ((x != i) && (pa != pr)) { std::copy(pa + i, pa + x, pr + i); } - NIL_CO3_MP_ASSERT(0 == borrow); + BOOST_ASSERT(0 == borrow); if (swapped) { result.negate_wrapping(); @@ -393,7 +394,7 @@ namespace nil::crypto3::multiprecision { std::copy(pa + i, pa + a.limb_count(), pr + i); } - NIL_CO3_MP_ASSERT(carry <= 1); + BOOST_ASSERT(carry <= 1); if (carry) { if (result.limb_count() > a.limb_count()) { @@ -612,12 +613,12 @@ namespace nil::crypto3::multiprecision { (y_order > 0) ? (static_cast(py[y_order]) << limb_bits) | py[y_order - 1] : (static_cast(py[y_order]) << limb_bits); - NIL_CO3_MP_ASSERT(b); + BOOST_ASSERT(b); double_limb_type v = a / b; guess = static_cast(v); } - NIL_CO3_MP_ASSERT(guess); // If the guess ever gets to - // zero we go on forever.... + BOOST_ASSERT(guess); // If the guess ever gets to + // zero we go on forever.... // // Update result: // @@ -668,7 +669,7 @@ namespace nil::crypto3::multiprecision { // unsigned: // if (truncated_t && carry) { - NIL_CO3_MP_ASSERT_MSG(false, "how can this even happen"); + BOOST_ASSERT_MSG(false, "how can this even happen"); // We need to calculate 2^n + t - rem // where n is the number of bits in this type. // Simplest way is to get 2^n - rem by complementing @@ -720,7 +721,7 @@ namespace nil::crypto3::multiprecision { // remainder must be less than the divisor or our code has // failed - NIL_CO3_MP_ASSERT(rem < y); + BOOST_ASSERT(rem < y); } // Multiplication @@ -754,19 +755,19 @@ namespace nil::crypto3::multiprecision { double_limb_type carry = 0; for (std::size_t i = 0; i < as; ++i) { - NIL_CO3_MP_ASSERT(result.limb_count() > i); + BOOST_ASSERT(result.limb_count() > i); std::size_t inner_limit = (std::min)(result.limb_count() - i, bs); multiplication_overflow_when(inner_limit < bs); std::size_t j = 0; for (; j < inner_limit; ++j) { - NIL_CO3_MP_ASSERT(i + j < result.limb_count()); + BOOST_ASSERT(i + j < result.limb_count()); carry += static_cast(pa[i]) * static_cast(pb[j]); - NIL_CO3_MP_ASSERT(max_double_limb_value - carry >= pr[i + j]); + BOOST_ASSERT(max_double_limb_value - carry >= pr[i + j]); carry += pr[i + j]; pr[i + j] = static_cast(carry); carry >>= limb_bits; - NIL_CO3_MP_ASSERT(carry <= max_limb_value); + BOOST_ASSERT(carry <= max_limb_value); } if (carry) { multiplication_overflow_when(i + j >= result.limb_count()); diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp index 84f1faa09..5b5b4c5b3 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp @@ -21,9 +21,9 @@ #include #include +#include #include -#include "nil/crypto3/multiprecision/detail/assert.hpp" #include "nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp" #include "nil/crypto3/multiprecision/detail/big_uint/parsing.hpp" // IWYU pragma: export #include "nil/crypto3/multiprecision/detail/big_uint/storage.hpp" @@ -305,7 +305,7 @@ namespace nil::crypto3::multiprecision { auto ec = std::to_chars(result.data() + start_offset, result.data() + result.size(), limb, 16) .ec; - NIL_CO3_MP_ASSERT(ec == std::errc{}); + BOOST_ASSERT(ec == std::errc{}); } } if (flags & std::ios_base::uppercase) { @@ -781,7 +781,7 @@ namespace nil::crypto3::multiprecision { constexpr void left_shift_limb(double_limb_type s) noexcept { limb_type offset = static_cast(s / limb_bits); - NIL_CO3_MP_ASSERT(static_cast(s % limb_bits) == 0); + BOOST_ASSERT(static_cast(s % limb_bits) == 0); limb_pointer pr = limbs(); @@ -815,7 +815,7 @@ namespace nil::crypto3::multiprecision { std::size_t rs = limb_count(); // This code only works when shift is non-zero, otherwise we invoke undefined // behaviour! - NIL_CO3_MP_ASSERT(shift); + BOOST_ASSERT(shift); for (; rs - i >= 2 + offset; ++i) { pr[rs - 1 - i] = pr[rs - 1 - i - offset] << shift; pr[rs - 1 - i] |= pr[rs - 2 - i - offset] >> (limb_bits - shift); @@ -832,7 +832,7 @@ namespace nil::crypto3::multiprecision { void right_shift_byte(double_limb_type s) noexcept { limb_type offset = static_cast(s / limb_bits); - NIL_CO3_MP_ASSERT((s % CHAR_BIT) == 0); + BOOST_ASSERT((s % CHAR_BIT) == 0); std::size_t ors = limb_count(); std::size_t rs = ors; if (offset >= rs) { @@ -857,7 +857,7 @@ namespace nil::crypto3::multiprecision { constexpr void right_shift_limb(double_limb_type s) noexcept { limb_type offset = static_cast(s / limb_bits); - NIL_CO3_MP_ASSERT((s % limb_bits) == 0); + BOOST_ASSERT((s % limb_bits) == 0); std::size_t ors = limb_count(); std::size_t rs = ors; if (offset >= rs) { @@ -895,7 +895,7 @@ namespace nil::crypto3::multiprecision { std::size_t i = 0; // This code only works for non-zero shift, otherwise we invoke undefined behaviour! - NIL_CO3_MP_ASSERT(shift); + BOOST_ASSERT(shift); for (; i + offset + 1 < ors; ++i) { pr[i] = pr[i + offset] >> shift; pr[i] |= pr[i + offset + 1] << (limb_bits - shift); diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/gcd_inverse.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/gcd_inverse.hpp index 8c8d2d903..1fcbc5b15 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/gcd_inverse.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/gcd_inverse.hpp @@ -14,7 +14,8 @@ #include #include -#include "nil/crypto3/multiprecision/detail/assert.hpp" +#include + #include "nil/crypto3/multiprecision/detail/big_int.hpp" #include "nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp" @@ -59,7 +60,7 @@ namespace nil::crypto3::multiprecision { constexpr big_uint gcd(const big_uint& a, const big_uint& b) { big_int aa = a, bb = b, x, y, g; g = detail::extended_euclidean_algorithm(aa, bb, x, y); - NIL_CO3_MP_ASSERT(!g.negative()); + BOOST_ASSERT(!g.negative()); return g.abs(); } @@ -74,7 +75,7 @@ namespace nil::crypto3::multiprecision { if (x.negative()) { x += m; } - NIL_CO3_MP_ASSERT(x < m && !x.negative()); + BOOST_ASSERT(x < m && !x.negative()); return x.abs(); } } // namespace nil::crypto3::multiprecision diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/ressol.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/ressol.hpp index 204072605..8831ef118 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/ressol.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/ressol.hpp @@ -15,7 +15,8 @@ #include #include -#include "nil/crypto3/multiprecision/detail/assert.hpp" +#include + #include "nil/crypto3/multiprecision/detail/big_mod/big_mod_impl.hpp" #include "nil/crypto3/multiprecision/detail/big_mod/ops/pow.hpp" #include "nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp" @@ -42,13 +43,13 @@ namespace nil::crypto3::multiprecision { if (a.is_zero()) { return 0u; } - NIL_CO3_MP_ASSERT(a < p); + BOOST_ASSERT(a < p); if (p == two) { return a; } - NIL_CO3_MP_ASSERT(p > 1u); - NIL_CO3_MP_ASSERT(p % 2u != 0u); + BOOST_ASSERT(p > 1u); + BOOST_ASSERT(p % 2u != 0u); if (jacobi(a, p) != 1) { throw std::invalid_argument("Not a quadratic residue"); diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/miller_rabin.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/miller_rabin.hpp index 555745e04..63709be8f 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/miller_rabin.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/miller_rabin.hpp @@ -12,10 +12,10 @@ #include #include +#include #include #include "nil/crypto3/multiprecision/big_uint.hpp" -#include "nil/crypto3/multiprecision/detail/assert.hpp" #include "nil/crypto3/multiprecision/integer.hpp" namespace nil::crypto3::multiprecision { @@ -34,7 +34,7 @@ namespace nil::crypto3::multiprecision { std::uint32_t m1 = integer_modulus(n, pp1); for (std::size_t i = 0; i < sizeof(small_factors1) / sizeof(small_factors1[0]); ++i) { - NIL_CO3_MP_ASSERT(pp1 % small_factors1[i] == 0); + BOOST_ASSERT(pp1 % small_factors1[i] == 0); if (m1 % small_factors1[i] == 0) { return false; } @@ -46,7 +46,7 @@ namespace nil::crypto3::multiprecision { m1 = integer_modulus(n, pp2); for (std::size_t i = 0; i < sizeof(small_factors2) / sizeof(small_factors2[0]); ++i) { - NIL_CO3_MP_ASSERT(pp2 % small_factors2[i] == 0); + BOOST_ASSERT(pp2 % small_factors2[i] == 0); if (m1 % small_factors2[i] == 0) { return false; } @@ -58,7 +58,7 @@ namespace nil::crypto3::multiprecision { m1 = integer_modulus(n, pp3); for (std::size_t i = 0; i < sizeof(small_factors3) / sizeof(small_factors3[0]); ++i) { - NIL_CO3_MP_ASSERT(pp3 % small_factors3[i] == 0); + BOOST_ASSERT(pp3 % small_factors3[i] == 0); if (m1 % small_factors3[i] == 0) { return false; } @@ -70,7 +70,7 @@ namespace nil::crypto3::multiprecision { m1 = integer_modulus(n, pp4); for (std::size_t i = 0; i < sizeof(small_factors4) / sizeof(small_factors4[0]); ++i) { - NIL_CO3_MP_ASSERT(pp4 % small_factors4[i] == 0); + BOOST_ASSERT(pp4 % small_factors4[i] == 0); if (m1 % small_factors4[i] == 0) { return false; } @@ -90,7 +90,7 @@ namespace nil::crypto3::multiprecision { m1 = integer_modulus(n, pp5[k]); for (std::size_t i = 0; i < 4; ++i) { - NIL_CO3_MP_ASSERT(pp5[k] % small_factors5[k][i] == 0); + BOOST_ASSERT(pp5[k] % small_factors5[k][i] == 0); if (m1 % small_factors5[k][i] == 0) { return false; } From 29f2fd2e31d881ffa887d8a7810629006519b1d4 Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Wed, 18 Dec 2024 13:36:40 +0000 Subject: [PATCH 15/29] multiprecision: clean up formatting --- .../nil/crypto3/multiprecision/big_uint.hpp | 14 +++++++------- .../detail/big_uint/big_uint_impl.hpp | 3 ++- .../nil/crypto3/multiprecision/detail/config.hpp | 2 -- .../nil/crypto3/multiprecision/detail/endian.hpp | 2 +- .../nil/crypto3/multiprecision/literals.hpp | 2 +- 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_uint.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_uint.hpp index 0d0c16ba7..45acb72dc 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_uint.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_uint.hpp @@ -1,12 +1,12 @@ #pragma once -#include "nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp" // IWYU pragma: export -#include "nil/crypto3/multiprecision/detail/big_uint/limits.hpp" // IWYU pragma: export -#include "nil/crypto3/multiprecision/detail/big_uint/ops/gcd_inverse.hpp" // IWYU pragma: export -#include "nil/crypto3/multiprecision/detail/big_uint/ops/jacobi.hpp" // IWYU pragma: export -#include "nil/crypto3/multiprecision/detail/big_uint/ops/powm.hpp" // IWYU pragma: export -#include "nil/crypto3/multiprecision/detail/big_uint/ops/ressol.hpp" // IWYU pragma: export -#include "nil/crypto3/multiprecision/detail/big_uint/ops/wnaf.hpp" // IWYU pragma: export +#include "nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp" // IWYU pragma: export +#include "nil/crypto3/multiprecision/detail/big_uint/limits.hpp" // IWYU pragma: export +#include "nil/crypto3/multiprecision/detail/big_uint/ops/gcd_inverse.hpp" // IWYU pragma: export +#include "nil/crypto3/multiprecision/detail/big_uint/ops/jacobi.hpp" // IWYU pragma: export +#include "nil/crypto3/multiprecision/detail/big_uint/ops/powm.hpp" // IWYU pragma: export +#include "nil/crypto3/multiprecision/detail/big_uint/ops/ressol.hpp" // IWYU pragma: export +#include "nil/crypto3/multiprecision/detail/big_uint/ops/wnaf.hpp" // IWYU pragma: export namespace nil::crypto3::multiprecision { using uint128_t = big_uint<128>; diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp index 5b5b4c5b3..7e8215091 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp @@ -364,7 +364,8 @@ namespace nil::crypto3::multiprecision { constexpr int compare(const big_uint& b) const noexcept { auto pa = limbs(); auto pb = b.limbs(); - constexpr std::size_t m = std::min(static_limb_count, big_uint::static_limb_count); + constexpr std::size_t m = + std::min(static_limb_count, big_uint::static_limb_count); for (auto i = static_cast(limb_count()) - 1; i >= b.limb_count(); --i) { if (pa[i]) { return 1; diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/config.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/config.hpp index f78ae1a7f..2d4f8b6f8 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/config.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/config.hpp @@ -23,5 +23,3 @@ // #define NIL_CO3_MP_USE_LIMB_SHIFT #endif - - diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/endian.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/endian.hpp index 609535bd6..5c264713b 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/endian.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/endian.hpp @@ -34,4 +34,4 @@ #undef NIL_CO3_MP_ENDIAN_LITTLE_WORD #define NIL_CO3_MP_ENDIAN_LITTLE_WORD 1 #endif -#endif \ No newline at end of file +#endif diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/literals.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/literals.hpp index 54cafd6df..fa7bf633a 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/literals.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/literals.hpp @@ -25,7 +25,7 @@ namespace nil::crypto3::multiprecision::literals { #define NIL_CO3_MP_DEFINE_BIG_UINT_LITERAL(Bits) \ namespace nil::crypto3::multiprecision::literals { \ template \ - constexpr auto operator"" _big_uint##Bits() { \ + constexpr auto operator"" _big_uint##Bits() { \ constexpr std::size_t N = sizeof...(C); \ constexpr std::array str{C...}; \ constexpr auto result = \ From 9f3eefbf3b8dca9f5c3779408a0faeb7db8159d2 Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Wed, 18 Dec 2024 14:39:47 +0000 Subject: [PATCH 16/29] multiprecision: move more function inside classes --- .../crypto3/multiprecision/detail/big_int.hpp | 29 ++- .../detail/big_mod/big_mod_impl.hpp | 20 +- .../detail/big_uint/big_uint_impl.hpp | 203 +++++++++--------- 3 files changed, 125 insertions(+), 127 deletions(-) diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp index 50f42a3ce..00b68caf0 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp @@ -157,6 +157,8 @@ namespace nil::crypto3::multiprecision { #undef NIL_CO3_MP_BIG_INT_IMPL_OPERATOR + NIL_CO3_MP_FORCEINLINE constexpr bool is_zero() const noexcept { return abs().is_zero(); } + // Arithmetic operations friend constexpr big_int operator+(big_int a, const big_int& b) noexcept { @@ -269,6 +271,15 @@ namespace nil::crypto3::multiprecision { return a; } + // Hash + + friend constexpr std::size_t hash_value(const big_int& val) noexcept { + std::size_t result = 0; + boost::hash_combine(result, val.abs()); + boost::hash_combine(result, val.negative()); + return result; + } + // IO friend std::ostream& operator<<(std::ostream& os, const big_int& value) { @@ -276,10 +287,6 @@ namespace nil::crypto3::multiprecision { return os; } - // Misc ops - - NIL_CO3_MP_FORCEINLINE constexpr bool is_zero() const noexcept { return abs().is_zero(); } - private: constexpr void normalize() noexcept { if (m_abs.is_zero()) { @@ -311,23 +318,15 @@ namespace nil::crypto3::multiprecision { big_int& q, big_int& r); }; - // Arithmetic operations - - template - constexpr std::size_t hash_value(const big_int& val) noexcept { - std::size_t result = 0; - boost::hash_combine(result, val.abs()); - boost::hash_combine(result, val.negative()); - return result; - } - - // Misc ops + // For generic code template constexpr bool is_zero(const big_int& a) { return a.is_zero(); } + // To efficiently compute quotient and remainder at the same time + template constexpr void divide_qr(const big_int& a, const big_int& b, big_int& q, big_int& r) { diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/big_mod_impl.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/big_mod_impl.hpp index 2251301bb..2e77bbd69 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/big_mod_impl.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/big_mod_impl.hpp @@ -114,6 +114,12 @@ namespace nil::crypto3::multiprecision { #undef NIL_CO3_MP_BIG_MOD_COMPARISON_IMPL + constexpr bool is_zero() const noexcept { + // In barrett form raw_base is the same as base + // In montgomery form raw_base is base multiplied by r, so it is zero iff base is + return raw_base().is_zero(); + } + // String conversion constexpr std::string str(std::ios_base::fmtflags flags = std::ios_base::hex | @@ -218,18 +224,14 @@ namespace nil::crypto3::multiprecision { return os; } - // Misc ops - - constexpr bool is_zero() const noexcept { - // In barrett form raw_base is the same as base - // In montgomery form raw_base is base multiplied by r, so it is zero iff base is - return raw_base().is_zero(); - } - // Accessing raw base value. Should only be used internally by multiprecision library. + constexpr auto& raw_base() { return m_raw_base; } constexpr const auto& raw_base() const { return m_raw_base; } + // Accessing operations. Can be used to efficiently initialize a new big_mod_rt instance by + // copying operations storage from an existing big_mod_rt instance. + constexpr const auto& ops_storage() const { return m_modular_ops_storage; } constexpr const auto& ops() const { return m_modular_ops_storage.ops(); } @@ -264,7 +266,7 @@ namespace nil::crypto3::multiprecision { return result; } - // Misc ops + // For generic code template, int> = 0> constexpr bool is_zero(const big_mod_t& a) { diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp index 7e8215091..998ab47bf 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp @@ -413,8 +413,6 @@ namespace nil::crypto3::multiprecision { } } - // Comparison - #define NIL_CO3_MP_BIG_UINT_IMPL_COMPARISON_OPERATOR(OP_) \ template, int> = 0> \ constexpr bool operator OP_(const T& o) const noexcept { \ @@ -435,6 +433,15 @@ namespace nil::crypto3::multiprecision { #undef NIL_CO3_MP_BIG_UINT_IMPL_COMPARISON_OPERATOR + NIL_CO3_MP_FORCEINLINE constexpr bool is_zero() const noexcept { + for (std::size_t i = 0; i < limb_count(); ++i) { + if (limbs()[i] != 0) { + return false; + } + } + return true; + } + // Arithmetic operations constexpr void negate_wrapping() noexcept { @@ -1000,6 +1007,84 @@ namespace nil::crypto3::multiprecision { return result; } + constexpr std::size_t lsb() const { + // + // Find the index of the least significant limb that is non-zero: + // + std::size_t index = 0; + while ((index < limb_count()) && !limbs()[index]) { + ++index; + } + + if (index == limb_count()) { + throw std::invalid_argument("zero has no lsb"); + } + + // + // Find the index of the least significant bit within that limb: + // + std::size_t result = std::countr_zero(limbs()[index]); + + return result + index * limb_bits; + } + + constexpr std::size_t msb() const { + // + // Find the index of the most significant bit that is non-zero: + // + for (std::size_t i = limb_count() - 1; i > 0; --i) { + if (limbs()[i] != 0) { + return i * limb_bits + std::bit_width(limbs()[i]) - 1; + } + } + if (limbs()[0] == 0) { + throw std::invalid_argument("zero has no msb"); + } + return std::bit_width(limbs()[0]) - 1; + } + + constexpr bool bit_test(std::size_t index) const { + if (index >= Bits) { + return false; + // TODO(ioxid): this throws in multiexp tests + // throw std::invalid_argument("fixed precision overflow"); + } + std::size_t offset = index / limb_bits; + std::size_t shift = index % limb_bits; + limb_type mask = limb_type(1u) << shift; + return static_cast(limbs()[offset] & mask); + } + + constexpr void bit_set(std::size_t index) { + if (index >= Bits) { + throw std::invalid_argument("fixed precision overflow"); + } + std::size_t offset = index / limb_bits; + std::size_t shift = index % limb_bits; + limb_type mask = limb_type(1u) << shift; + limbs()[offset] |= mask; + } + + constexpr void bit_unset(std::size_t index) { + if (index >= Bits) { + throw std::invalid_argument("fixed precision overflow"); + } + std::size_t offset = index / limb_bits; + std::size_t shift = index % limb_bits; + limb_type mask = limb_type(1u) << shift; + limbs()[offset] &= ~mask; + } + + constexpr void bit_flip(big_uint& val, std::size_t index) { + if (index >= Bits) { + throw std::invalid_argument("fixed precision overflow"); + } + std::size_t offset = index / limb_bits; + std::size_t shift = index % limb_bits; + limb_type mask = limb_type(1u) << shift; + val.limbs()[offset] ^= mask; + } + // Import / export private: @@ -1147,100 +1232,21 @@ namespace nil::crypto3::multiprecision { return out; } - // IO - - friend std::ostream& operator<<(std::ostream& os, const big_uint& value) { - os << value.str(os.flags()); - return os; - } - - // Misc ops - - NIL_CO3_MP_FORCEINLINE constexpr bool is_zero() const noexcept { - for (std::size_t i = 0; i < limb_count(); ++i) { - if (limbs()[i] != 0) { - return false; - } - } - return true; - } - - constexpr std::size_t lsb() const { - // - // Find the index of the least significant limb that is non-zero: - // - std::size_t index = 0; - while ((index < limb_count()) && !limbs()[index]) { - ++index; - } + // Hash - if (index == limb_count()) { - throw std::invalid_argument("zero has no lsb"); + friend constexpr std::size_t hash_value(const big_uint& val) noexcept { + std::size_t result = 0; + for (std::size_t i = 0; i < val.limb_count(); ++i) { + boost::hash_combine(result, val.limbs()[i]); } - - // - // Find the index of the least significant bit within that limb: - // - std::size_t result = std::countr_zero(limbs()[index]); - - return result + index * limb_bits; - } - - constexpr std::size_t msb() const { - // - // Find the index of the most significant bit that is non-zero: - // - for (std::size_t i = limb_count() - 1; i > 0; --i) { - if (limbs()[i] != 0) { - return i * limb_bits + std::bit_width(limbs()[i]) - 1; - } - } - if (limbs()[0] == 0) { - throw std::invalid_argument("zero has no msb"); - } - return std::bit_width(limbs()[0]) - 1; - } - - constexpr bool bit_test(std::size_t index) const { - if (index >= Bits) { - return false; - // TODO(ioxid): this throws in multiexp tests - // throw std::invalid_argument("fixed precision overflow"); - } - std::size_t offset = index / limb_bits; - std::size_t shift = index % limb_bits; - limb_type mask = limb_type(1u) << shift; - return static_cast(limbs()[offset] & mask); - } - - constexpr void bit_set(std::size_t index) { - if (index >= Bits) { - throw std::invalid_argument("fixed precision overflow"); - } - std::size_t offset = index / limb_bits; - std::size_t shift = index % limb_bits; - limb_type mask = limb_type(1u) << shift; - limbs()[offset] |= mask; + return result; } - constexpr void bit_unset(std::size_t index) { - if (index >= Bits) { - throw std::invalid_argument("fixed precision overflow"); - } - std::size_t offset = index / limb_bits; - std::size_t shift = index % limb_bits; - limb_type mask = limb_type(1u) << shift; - limbs()[offset] &= ~mask; - } + // IO - constexpr void bit_flip(big_uint& val, std::size_t index) { - if (index >= Bits) { - throw std::invalid_argument("fixed precision overflow"); - } - std::size_t offset = index / limb_bits; - std::size_t shift = index % limb_bits; - limb_type mask = limb_type(1u) << shift; - val.limbs()[offset] ^= mask; + friend constexpr std::ostream& operator<<(std::ostream& os, const big_uint& value) { + os << value.str(os.flags()); + return os; } private: @@ -1296,18 +1302,7 @@ namespace nil::crypto3::multiprecision { return detail::add_unsigned(a, a, b); } - // Hash - - template - constexpr std::size_t hash_value(const big_uint& val) noexcept { - std::size_t result = 0; - for (std::size_t i = 0; i < val.limb_count(); ++i) { - boost::hash_combine(result, val.limbs()[i]); - } - return result; - } - - // Misc ops + // For generic code template constexpr std::size_t msb(const big_uint& a) { @@ -1329,6 +1324,8 @@ namespace nil::crypto3::multiprecision { return a.is_zero(); } + // To efficiently compute quotient and remainder at the same time + template constexpr void divide_qr(const big_uint& a, const big_uint& b, big_uint& q, big_uint& r) { From 5d4901b20fc9c22aeec4f90cd15cc5b6b6883a08 Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Wed, 18 Dec 2024 13:05:12 +0000 Subject: [PATCH 17/29] multiprecision: make internal methods private --- crypto3/benchmarks/multiprecision/big_int.cpp | 56 ++++++++-------- .../crypto3/multiprecision/detail/big_int.hpp | 1 - .../detail/big_mod/big_mod_impl.hpp | 65 ++++++++++--------- .../detail/big_mod/modular_ops.hpp | 23 ++++--- .../detail/big_mod/modular_ops_fwd.hpp | 27 ++++++++ .../multiprecision/detail/big_mod/ops/pow.hpp | 8 +-- .../detail/big_mod/test_support.hpp | 12 ++++ .../detail/big_uint/big_uint_impl.hpp | 36 +++++----- 8 files changed, 133 insertions(+), 95 deletions(-) create mode 100644 crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops_fwd.hpp create mode 100644 crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/test_support.hpp diff --git a/crypto3/benchmarks/multiprecision/big_int.cpp b/crypto3/benchmarks/multiprecision/big_int.cpp index 4eafb97ba..eee9e5923 100644 --- a/crypto3/benchmarks/multiprecision/big_int.cpp +++ b/crypto3/benchmarks/multiprecision/big_int.cpp @@ -20,6 +20,8 @@ #include #include +#include + #include using namespace nil::crypto3::multiprecision::literals; @@ -51,15 +53,14 @@ BOOST_AUTO_TEST_SUITE(runtime_odd_tests) // This directly calls montgomery mul from modular_ops.hpp. BOOST_AUTO_TEST_CASE(montgomery_mul_perf_test) { - auto raw_base = x_mod_rt_odd.raw_base(); - const auto &mod_ops = x_mod_rt_odd.ops(); + auto raw_base = nil::crypto3::multiprecision::detail::get_raw_base(x_mod_rt_odd); + const auto &mod_ops = x_mod_rt_odd.ops_storage().ops(); nil::crypto3::bench::run_benchmark<>( - "[odd modulus][runtime] montgomery mul (direct call)", - [&]() { - mod_ops.mul(raw_base, y_mod_rt_odd.raw_base()); - return raw_base; - }); + "[odd modulus][runtime] montgomery mul (direct call)", [&]() { + mod_ops.mul(raw_base, nil::crypto3::multiprecision::detail::get_raw_base(y_mod_rt_odd)); + return raw_base; + }); std::cout << raw_base << std::endl; } @@ -112,15 +113,14 @@ BOOST_AUTO_TEST_SUITE(compile_time_odd_tests) // This directly calls montgomery mul from modular_ops.hpp. BOOST_AUTO_TEST_CASE(montgomery_mul_perf_test) { - auto raw_base = x_mod_ct_odd.raw_base(); - const auto &mod_ops = x_mod_ct_odd.ops(); + auto raw_base = nil::crypto3::multiprecision::detail::get_raw_base(x_mod_ct_odd); + const auto &mod_ops = x_mod_ct_odd.ops_storage().ops(); // NOLINT nil::crypto3::bench::run_benchmark<>( - "[odd modulus][compile time] montgomery mul (direct call)", - [&]() { - mod_ops.mul(raw_base, y_mod_ct_odd.raw_base()); - return raw_base; - }); + "[odd modulus][compile time] montgomery mul (direct call)", [&]() { + mod_ops.mul(raw_base, nil::crypto3::multiprecision::detail::get_raw_base(y_mod_ct_odd)); + return raw_base; + }); std::cout << raw_base << std::endl; } @@ -173,15 +173,15 @@ BOOST_AUTO_TEST_SUITE(runtime_even_tests) // This directly calls barrett mul from modular_ops.hpp. BOOST_AUTO_TEST_CASE(barrett_mul_perf_test) { - auto raw_base = x_mod_rt_even.raw_base(); - const auto &mod_ops = x_mod_rt_even.ops(); + auto raw_base = nil::crypto3::multiprecision::detail::get_raw_base(x_mod_rt_even); + const auto &mod_ops = x_mod_rt_even.ops_storage().ops(); nil::crypto3::bench::run_benchmark<>( - "[even modulus][runtime] barrett mul (direct call)", - [&]() { - mod_ops.mul(raw_base, y_mod_rt_even.raw_base()); - return raw_base; - }); + "[even modulus][runtime] barrett mul (direct call)", [&]() { + mod_ops.mul(raw_base, + nil::crypto3::multiprecision::detail::get_raw_base(y_mod_rt_even)); + return raw_base; + }); std::cout << raw_base << std::endl; } @@ -234,15 +234,15 @@ BOOST_AUTO_TEST_SUITE(compile_time_even_tests) // This directly calls mul from modular_ops.hpp. BOOST_AUTO_TEST_CASE(barrett_mul_perf_test) { - auto raw_base = x_mod_ct_even.raw_base(); - const auto &mod_ops = x_mod_ct_even.ops(); + auto raw_base = nil::crypto3::multiprecision::detail::get_raw_base(x_mod_ct_even); + const auto &mod_ops = x_mod_ct_even.ops_storage().ops(); // NOLINT nil::crypto3::bench::run_benchmark<>( - "[even modulus][compile time] barrett mul (direct call)", - [&]() { - mod_ops.mul(raw_base, y_mod_ct_even.raw_base()); - return raw_base; - }); + "[even modulus][compile time] barrett mul (direct call)", [&]() { + mod_ops.mul(raw_base, + nil::crypto3::multiprecision::detail::get_raw_base(y_mod_ct_even)); + return raw_base; + }); std::cout << raw_base << std::endl; } diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp index 00b68caf0..54314e2d7 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp @@ -31,7 +31,6 @@ namespace nil::crypto3::multiprecision { class big_int { public: static constexpr std::size_t Bits = Bits_; - using self_type = big_int; using unsigned_type = big_uint; diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/big_mod_impl.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/big_mod_impl.hpp index 2e77bbd69..8749d41e0 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/big_mod_impl.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/big_mod_impl.hpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -25,6 +26,7 @@ #include "nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp" #include "nil/crypto3/multiprecision/detail/big_mod/modular_ops_storage.hpp" +#include "nil/crypto3/multiprecision/detail/big_mod/test_support.hpp" // IWYU pragma: keep (for get_raw_base) #include "nil/crypto3/multiprecision/detail/big_mod/type_traits.hpp" // IWYU pragma: export #include "nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp" #include "nil/crypto3/multiprecision/detail/integer_ops_base.hpp" // IWYU pragma: keep (used for is_zero) @@ -76,7 +78,7 @@ namespace nil::crypto3::multiprecision { constexpr big_uint_t base() const { big_uint_t result; - ops().adjust_regular(result, m_raw_base); + ops().adjust_regular(result, raw_base()); return result; } @@ -133,7 +135,7 @@ namespace nil::crypto3::multiprecision { constexpr void negate() { ops().negate(m_raw_base); } constexpr auto& operator++() noexcept { - ops().increment(raw_base()); + ops().increment(m_raw_base); return *this; } @@ -146,7 +148,7 @@ namespace nil::crypto3::multiprecision { constexpr auto operator+() const noexcept { return *this; } constexpr auto& operator--() noexcept { - ops().decrement(raw_base()); + ops().decrement(m_raw_base); return *this; } @@ -188,15 +190,15 @@ namespace nil::crypto3::multiprecision { BOOST_ASSERT(a.ops().compare_eq(b.ops())); \ } \ big_mod_impl result = a; \ - a.ops().METHOD_(result.raw_base(), convert_to_raw_base(b, a.ops())); \ + a.ops().METHOD_(result.m_raw_base, convert_to_raw_base(b, a.ops())); \ return result; \ } \ \ template, int> = 0> \ friend constexpr auto operator OP_(const T& a, const big_mod_impl& b) noexcept { \ big_mod_impl result(b.ops_storage()); \ - result.raw_base() = convert_to_raw_base(a, b.ops()); \ - b.ops().METHOD_(result.raw_base(), b.raw_base()); \ + result.m_raw_base = convert_to_raw_base(a, b.ops()); \ + b.ops().METHOD_(result.m_raw_base, b.raw_base()); \ return result; \ } \ \ @@ -207,7 +209,7 @@ namespace nil::crypto3::multiprecision { if constexpr (detail::is_big_mod_v) { \ BOOST_ASSERT(a.ops().compare_eq(b.ops())); \ } \ - a.ops().METHOD_(a.raw_base(), convert_to_raw_base(b, a.ops())); \ + a.ops().METHOD_(a.m_raw_base, convert_to_raw_base(b, a.ops())); \ return a; \ } @@ -217,6 +219,22 @@ namespace nil::crypto3::multiprecision { #undef NIL_CO3_MP_BIG_MOD_OPERATOR_IMPL + template && !std::numeric_limits::is_signed, + int> = 0> + friend constexpr big_mod_impl pow_unsigned(big_mod_impl b, const T& e) { + b.ops().pow(b.m_raw_base, b.raw_base(), e); + return b; + } + + // Hash + + friend constexpr std::size_t hash_value(const big_mod_impl& val) noexcept { + return hash_value(val.raw_base()); + // mod() is ignored because we don't allow comparing numbers with different moduli + // anyway + } + // IO friend std::ostream& operator<<(std::ostream& os, const big_mod_impl& value) { @@ -224,20 +242,24 @@ namespace nil::crypto3::multiprecision { return os; } - // Accessing raw base value. Should only be used internally by multiprecision library. - - constexpr auto& raw_base() { return m_raw_base; } - constexpr const auto& raw_base() const { return m_raw_base; } - // Accessing operations. Can be used to efficiently initialize a new big_mod_rt instance by // copying operations storage from an existing big_mod_rt instance. constexpr const auto& ops_storage() const { return m_modular_ops_storage; } + + private: constexpr const auto& ops() const { return m_modular_ops_storage.ops(); } + constexpr const auto& raw_base() const { return m_raw_base; } + + // Data - protected: modular_ops_storage_t m_modular_ops_storage; big_uint_t m_raw_base; + + // Friends + + template + friend constexpr const auto& detail::get_raw_base(const big_mod_t& a); }; template typename modular_ops_template> @@ -249,23 +271,6 @@ namespace nil::crypto3::multiprecision { using big_mod_rt_impl = big_mod_impl>; - // Hash - - template typename modular_ops_template> - constexpr std::size_t hash_value( - const big_mod_ct_impl& val) noexcept { - return hash_value(val.raw_base()); - } - - template typename modular_ops_template> - constexpr std::size_t hash_value( - const big_mod_rt_impl& val) noexcept { - std::size_t result = 0; - boost::hash_combine(result, val.base()); - boost::hash_combine(result, val.mod()); - return result; - } - // For generic code template, int> = 0> diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp index a6447fad4..80288970c 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp @@ -199,6 +199,7 @@ namespace nil::crypto3::multiprecision::detail { detail::is_integral_v && !std::numeric_limits::is_signed, int> = 0> constexpr void pow(big_uint &result, const big_uint &a, T exp) const { + /// input parameter should be less than modulus BOOST_ASSERT(a < mod()); if (is_zero(exp)) { @@ -572,10 +573,6 @@ namespace nil::crypto3::multiprecision::detail { /// input parameter should be less than modulus BOOST_ASSERT(a < this->mod()); - big_uint_t R_mod_m = m_one; - - big_uint_t base(a); - if (is_zero(exp)) { result = m_one; return; @@ -585,18 +582,20 @@ namespace nil::crypto3::multiprecision::detail { return; } + big_uint_t base(a), res = m_one; + while (true) { bool lsb = bit_test(exp, 0u); exp >>= 1u; if (lsb) { - mul(R_mod_m, base); + mul(res, base); if (is_zero(exp)) { break; } } mul(base, base); } - result = R_mod_m; + result = res; } // Adjust to/from modular form @@ -637,18 +636,18 @@ namespace nil::crypto3::multiprecision::detail { ops.adjust_modular(raw_base, b); } - template && std::is_signed_v, int> = 0> - constexpr void init_raw_base(big_uint &raw_base, SI b, const modular_ops_t &ops) { + template && std::is_signed_v, int> = 0> + constexpr void init_raw_base(big_uint &raw_base, T b, const modular_ops_t &ops) { ops.adjust_modular(raw_base, detail::as_big_uint(detail::unsigned_abs(b))); if (b < 0) { ops.negate(raw_base); } } - template && std::is_unsigned_v, int> = 0> - constexpr void init_raw_base(big_uint &raw_base, UI b, const modular_ops_t &ops) { + template && std::is_unsigned_v, int> = 0> + constexpr void init_raw_base(big_uint &raw_base, T b, const modular_ops_t &ops) { ops.adjust_modular(raw_base, detail::as_big_uint(b)); } } // namespace nil::crypto3::multiprecision::detail diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops_fwd.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops_fwd.hpp new file mode 100644 index 000000000..b6158884a --- /dev/null +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops_fwd.hpp @@ -0,0 +1,27 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2020 Mikhail Komarov +// Copyright (c) 2020 Ilias Khairullin +// Copyright (c) 2021 Aleksei Moskvin +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// + +#pragma once + +// IWYU pragma: private + +#include + +namespace nil::crypto3::multiprecision::detail { + template + struct modular_policy; + + template + class barrett_modular_ops; + + template + class montgomery_modular_ops; +} // namespace nil::crypto3::multiprecision::detail diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/pow.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/pow.hpp index 491376a5f..29134e5f2 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/pow.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/pow.hpp @@ -26,9 +26,7 @@ namespace nil::crypto3::multiprecision { !std::numeric_limits::is_signed, int> = 0> constexpr big_mod_t pow(const big_mod_t &b, const T &e) { - big_mod_t result(b.ops_storage()); - result.ops().pow(result.raw_base(), b.raw_base(), e); - return result; + return pow_unsigned(b, e); } template = 0> constexpr big_mod_t pow(const big_mod_t &b, const T &e) { if (e < 0) { - return pow(inverse(b), detail::unsigned_abs(e)); + return pow_unsigned(inverse(b), detail::unsigned_abs(e)); } - return pow(b, static_cast>(e)); + return pow_unsigned(b, static_cast>(e)); } } // namespace nil::crypto3::multiprecision diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/test_support.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/test_support.hpp new file mode 100644 index 000000000..a6888bfbe --- /dev/null +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/test_support.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include "nil/crypto3/multiprecision/detail/big_mod/type_traits.hpp" + +namespace nil::crypto3::multiprecision::detail { + // This should be used in tests or benchmarks only + template + constexpr const auto& get_raw_base(const big_mod_t& a) { + static_assert(detail::is_big_mod_v); + return a.raw_base(); + } +} // namespace nil::crypto3::multiprecision::detail diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp index 998ab47bf..2e9dffff0 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp @@ -24,6 +24,7 @@ #include #include +#include "nil/crypto3/multiprecision/detail/big_mod/modular_ops_fwd.hpp" // IWYU pragma: keep (used for friend declarations) #include "nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp" #include "nil/crypto3/multiprecision/detail/big_uint/parsing.hpp" // IWYU pragma: export #include "nil/crypto3/multiprecision/detail/big_uint/storage.hpp" @@ -51,15 +52,15 @@ namespace nil::crypto3::multiprecision { class big_uint { public: static constexpr std::size_t Bits = Bits_; - using self_type = big_uint; + // Storage + + private: using limb_type = detail::limb_type; using double_limb_type = detail::double_limb_type; using signed_limb_type = detail::signed_limb_type; using signed_double_limb_type = detail::signed_double_limb_type; - // Storage - using limb_pointer = detail::limb_pointer; using const_limb_pointer = detail::const_limb_pointer; static constexpr std::size_t limb_bits = detail::limb_bits; @@ -70,20 +71,20 @@ namespace nil::crypto3::multiprecision { static constexpr limb_type upper_limb_mask = (Bits % limb_bits) ? (limb_type(1) << (Bits % limb_bits)) - 1 : (~limb_type(0u)); - // - // Helper functions for getting at our internal data, and manipulating storage: - // constexpr std::size_t limb_count() const noexcept { static_assert(static_limb_count != 0, "No limbs in storage."); return static_limb_count; } constexpr limb_pointer limbs() noexcept { return m_data.data(); } constexpr const_limb_pointer limbs() const noexcept { return m_data.data(); } - constexpr auto& limbs_array() noexcept { return m_data; } - constexpr const auto& limbs_array() const noexcept { return m_data; } - private: - // Zeros out everything after limb[i], replaces resizing. + constexpr bool normalize() noexcept { + bool result = limbs()[static_limb_count - 1] & ~upper_limb_mask; + limbs()[static_limb_count - 1] &= upper_limb_mask; + return result; + } + + // Zeros out everything after limb[i] constexpr void zero_after(std::size_t start_index) noexcept { auto pr = this->limbs(); for (std::size_t i = start_index; i < this->limb_count(); ++i) { @@ -165,13 +166,6 @@ namespace nil::crypto3::multiprecision { } public: - // TODO(ioxid): this should be private - constexpr bool normalize() noexcept { - bool result = limbs()[static_limb_count - 1] & ~upper_limb_mask; - limbs()[static_limb_count - 1] &= upper_limb_mask; - return result; - } - // Constructor constexpr big_uint() noexcept {} @@ -477,8 +471,6 @@ namespace nil::crypto3::multiprecision { return copy; } - NIL_CO3_MP_FORCEINLINE constexpr void decrement() noexcept {} - constexpr auto operator+() const noexcept { return *this; } constexpr auto& operator--() noexcept { @@ -1292,6 +1284,12 @@ namespace nil::crypto3::multiprecision { template friend constexpr void detail::multiply(big_uint& result, const big_uint& a, const T& b); + + template + friend struct detail::modular_policy; + + template + friend class detail::montgomery_modular_ops; }; // Addition with carry From 62809e210600d4091a4c2a2609b6eb0fd0c9e895 Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Wed, 18 Dec 2024 17:43:09 +0000 Subject: [PATCH 18/29] multiprecision: disable exception in import which fires in tests --- .../crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp index 2e9dffff0..bb704ea2c 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp @@ -1153,7 +1153,8 @@ namespace nil::crypto3::multiprecision { } if (normalize()) { - throw std::overflow_error("import_bits: overflow"); + // TODO(ioxid): this throws right now + // throw std::overflow_error("import_bits: overflow"); } } From d5122c3753d4760ccf233d67cc61996375a2835b Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Wed, 18 Dec 2024 19:35:01 +0000 Subject: [PATCH 19/29] multiprecision: move boost backend tests into a subdirectory --- .../libs/multiprecision/test/CMakeLists.txt | 36 +--------- .../test/boost_backends/CMakeLists.txt | 68 +++++++++++++++++++ ...thmetic_non_matching_bitlength_numbers.cpp | 0 .../constexpr_arithmetric_test.hpp | 0 .../constexpr_test_arithmetic_backend.cpp | 0 .../constexpr_test_cpp_int.cpp | 0 .../constexpr_test_cpp_int_2.cpp | 0 .../constexpr_test_cpp_int_3.cpp | 0 .../constexpr_test_cpp_int_4.cpp | 0 .../constexpr_test_cpp_int_5.cpp | 0 .../constexpr_test_cpp_int_6.cpp | 0 .../constexpr_test_cpp_int_7.cpp | 0 .../test/{ => boost_backends}/eigen.hpp | 0 .../{ => boost_backends}/git_issue_167.cpp | 0 .../{ => boost_backends}/git_issue_175.cpp | 0 .../{ => boost_backends}/git_issue_248.cpp | 0 .../{ => boost_backends}/git_issue_265.cpp | 0 .../{ => boost_backends}/git_issue_277.cpp | 0 .../{ => boost_backends}/git_issue_30.cpp | 0 .../{ => boost_backends}/git_issue_98.cpp | 0 .../test/{ => boost_backends}/inverse.cpp | 0 .../test/{ => boost_backends}/issue_13148.cpp | 0 .../test/{ => boost_backends}/issue_13301.cpp | 0 .../test/{ => boost_backends}/jacobi.cpp | 0 .../modular_adaptor_fixed.cpp | 0 .../no_eh_test_support.cpp | 0 .../test/{ => boost_backends}/ressol.cpp | 0 .../serial_txts/boost-no-inspect | 0 .../serial_txts/cpp_int1024_serial32.txt | 0 .../serial_txts/cpp_int1024_serial64.txt | 0 .../serial_txts/cpp_int128_serial32.txt | 0 .../serial_txts/cpp_int128_serial64.txt | 0 .../serial_txts/cpp_int64_serial32.txt | 0 .../serial_txts/cpp_int64_serial64.txt | 0 .../{ => boost_backends}/skeleton_backend.hpp | 0 .../test/{ => boost_backends}/string_data.ipp | 0 .../{ => boost_backends}/test_arithmetic.hpp | 0 .../test_arithmetic_ab_1.cpp | 0 .../test_arithmetic_ab_2.cpp | 0 .../test_arithmetic_ab_3.cpp | 0 .../test_arithmetic_backend_concept.cpp | 0 .../test_arithmetic_cpp_int_1.cpp | 0 .../test_arithmetic_cpp_int_10.cpp | 0 .../test_arithmetic_cpp_int_11.cpp | 0 .../test_arithmetic_cpp_int_12.cpp | 0 .../test_arithmetic_cpp_int_13.cpp | 0 .../test_arithmetic_cpp_int_14.cpp | 0 .../test_arithmetic_cpp_int_15.cpp | 0 .../test_arithmetic_cpp_int_16.cpp | 0 .../test_arithmetic_cpp_int_17.cpp | 0 .../test_arithmetic_cpp_int_18.cpp | 0 .../test_arithmetic_cpp_int_19.cpp | 0 .../test_arithmetic_cpp_int_2.cpp | 0 .../test_arithmetic_cpp_int_20.cpp | 0 .../test_arithmetic_cpp_int_3.cpp | 0 .../test_arithmetic_cpp_int_4.cpp | 0 .../test_arithmetic_cpp_int_5.cpp | 0 .../test_arithmetic_cpp_int_6.cpp | 0 .../test_arithmetic_cpp_int_7.cpp | 0 .../test_arithmetic_cpp_int_8.cpp | 0 .../test_arithmetic_cpp_int_9.cpp | 0 .../test_arithmetic_cpp_int_br.cpp | 0 .../test_arithmetic_dbg_adptr1.cpp | 0 .../test_arithmetic_dbg_adptr1m.cpp | 0 .../test_arithmetic_dbg_adptr2.cpp | 0 .../test_arithmetic_logged_1.cpp | 0 .../test_arithmetic_logged_2.cpp | 0 .../test_arithmetic_mpz_rat.cpp | 0 .../test_arithmetic_skeleton.cpp | 0 .../test_checked_mixed_cpp_int.cpp | 0 .../{ => boost_backends}/test_constants.cpp | 0 .../{ => boost_backends}/test_constexpr.cpp | 0 .../test_convert_from_cpp_int.cpp | 0 .../test_cpp_int_conv.cpp | 0 .../test_cpp_int_import_export.cpp | 0 .../test_cpp_int_left_shift.cpp | 0 .../{ => boost_backends}/test_cpp_int_lit.cpp | 0 .../test_eigen_interop.cpp | 0 .../test_eigen_interop_cpp_int.cpp | 0 .../test/{ => boost_backends}/test_exp.cpp | 0 .../{ => boost_backends}/test_fpclassify.cpp | 0 .../test/{ => boost_backends}/test_gcd.cpp | 0 .../test/{ => boost_backends}/test_hash.cpp | 0 .../test/{ => boost_backends}/test_int_io.cpp | 0 .../test/{ => boost_backends}/test_log.cpp | 0 .../test/{ => boost_backends}/test_mixed.hpp | 0 .../test/{ => boost_backends}/test_move.cpp | 0 .../test_mpf_precisions.cpp | 0 .../test_nothrow_cpp_int.cpp | 0 .../test_nothrow_cpp_rational.cpp | 0 .../test_numeric_limits.cpp | 0 .../test_optional_compat.cpp | 0 .../test/{ => boost_backends}/test_pow.cpp | 0 .../test_sf_import_c99.cpp | 0 .../test/{ => boost_backends}/test_sqrt.cpp | 0 .../test_unchecked_cpp_int.cpp | 0 96 files changed, 71 insertions(+), 33 deletions(-) create mode 100644 crypto3/libs/multiprecision/test/boost_backends/CMakeLists.txt rename crypto3/libs/multiprecision/test/{ => boost_backends}/arithmetic_non_matching_bitlength_numbers.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/constexpr_arithmetric_test.hpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/constexpr_test_arithmetic_backend.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/constexpr_test_cpp_int.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/constexpr_test_cpp_int_2.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/constexpr_test_cpp_int_3.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/constexpr_test_cpp_int_4.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/constexpr_test_cpp_int_5.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/constexpr_test_cpp_int_6.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/constexpr_test_cpp_int_7.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/eigen.hpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/git_issue_167.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/git_issue_175.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/git_issue_248.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/git_issue_265.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/git_issue_277.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/git_issue_30.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/git_issue_98.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/inverse.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/issue_13148.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/issue_13301.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/jacobi.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/modular_adaptor_fixed.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/no_eh_test_support.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/ressol.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/serial_txts/boost-no-inspect (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/serial_txts/cpp_int1024_serial32.txt (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/serial_txts/cpp_int1024_serial64.txt (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/serial_txts/cpp_int128_serial32.txt (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/serial_txts/cpp_int128_serial64.txt (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/serial_txts/cpp_int64_serial32.txt (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/serial_txts/cpp_int64_serial64.txt (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/skeleton_backend.hpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/string_data.ipp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic.hpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_ab_1.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_ab_2.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_ab_3.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_backend_concept.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_cpp_int_1.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_cpp_int_10.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_cpp_int_11.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_cpp_int_12.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_cpp_int_13.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_cpp_int_14.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_cpp_int_15.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_cpp_int_16.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_cpp_int_17.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_cpp_int_18.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_cpp_int_19.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_cpp_int_2.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_cpp_int_20.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_cpp_int_3.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_cpp_int_4.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_cpp_int_5.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_cpp_int_6.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_cpp_int_7.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_cpp_int_8.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_cpp_int_9.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_cpp_int_br.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_dbg_adptr1.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_dbg_adptr1m.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_dbg_adptr2.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_logged_1.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_logged_2.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_mpz_rat.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_arithmetic_skeleton.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_checked_mixed_cpp_int.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_constants.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_constexpr.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_convert_from_cpp_int.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_cpp_int_conv.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_cpp_int_import_export.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_cpp_int_left_shift.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_cpp_int_lit.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_eigen_interop.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_eigen_interop_cpp_int.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_exp.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_fpclassify.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_gcd.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_hash.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_int_io.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_log.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_mixed.hpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_move.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_mpf_precisions.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_nothrow_cpp_int.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_nothrow_cpp_rational.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_numeric_limits.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_optional_compat.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_pow.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_sf_import_c99.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_sqrt.cpp (100%) rename crypto3/libs/multiprecision/test/{ => boost_backends}/test_unchecked_cpp_int.cpp (100%) diff --git a/crypto3/libs/multiprecision/test/CMakeLists.txt b/crypto3/libs/multiprecision/test/CMakeLists.txt index 155a181b1..c423d726f 100644 --- a/crypto3/libs/multiprecision/test/CMakeLists.txt +++ b/crypto3/libs/multiprecision/test/CMakeLists.txt @@ -7,7 +7,6 @@ # http://www.boost.org/LICENSE_1_0.txt #---------------------------------------------------------------------------# -add_custom_target(${CURRENT_PROJECT_NAME}_test_suite_modular_cpp_int_tests) add_custom_target(${CURRENT_PROJECT_NAME}_test_suite_big_int_tests) cm_test_link_libraries( @@ -15,7 +14,7 @@ cm_test_link_libraries( Boost::unit_test_framework ) -macro(define_runtime_multiprecision_test name) +macro(define_multiprecision_test name) set(test_name "${CURRENT_PROJECT_NAME}_${name}_test") cm_test(NAME ${test_name} SOURCES ${name}.cpp ARGS) @@ -37,20 +36,10 @@ macro(define_runtime_multiprecision_test name) endif() target_compile_definitions(${test_name} PRIVATE TEST_DATA_DIR="${CMAKE_CURRENT_SOURCE_DIR}/data/") -endmacro(define_runtime_multiprecision_test) - -macro(define_modular_cpp_int_test name) - define_runtime_multiprecision_test(${name}) - - set(test_name "${CURRENT_PROJECT_NAME}_${name}_test") - target_compile_definitions(${test_name} PUBLIC -DTEST_CPP_INT) - # target_link_libraries(${test_name} no_eh_support) - add_dependencies(${CURRENT_PROJECT_NAME}_test_suite_modular_cpp_int_tests ${test_name}) - -endmacro(define_modular_cpp_int_test) +endmacro(define_multiprecision_test) macro(define_big_int_test name) - define_runtime_multiprecision_test(${name}) + define_multiprecision_test(${name}) set(test_name "${CURRENT_PROJECT_NAME}_${name}_test") target_compile_definitions(${test_name} PUBLIC -DTEST_CPP_INT) @@ -59,17 +48,6 @@ macro(define_big_int_test name) endmacro(define_big_int_test) -set(RUNTIME_TESTS_NAMES - "inverse" - "jacobi" - "ressol" - "arithmetic_non_matching_bitlength_numbers" - ) - -set(MODULAR_TESTS_NAMES - "modular_adaptor_fixed" -) - set(BIG_INT_TESTS_NAMES "big_int" "big_int_comparison" @@ -81,14 +59,6 @@ set(BIG_INT_TESTS_NAMES "big_int_ressol" ) -foreach(TEST_NAME ${RUNTIME_TESTS_NAMES}) - define_runtime_multiprecision_test(${TEST_NAME}) -endforeach() - -foreach(TEST_NAME ${MODULAR_TESTS_NAMES}) - define_modular_cpp_int_test(${TEST_NAME}) -endforeach() - foreach(TEST_NAME ${BIG_INT_TESTS_NAMES}) define_big_int_test(${TEST_NAME}) endforeach() diff --git a/crypto3/libs/multiprecision/test/boost_backends/CMakeLists.txt b/crypto3/libs/multiprecision/test/boost_backends/CMakeLists.txt new file mode 100644 index 000000000..08d775772 --- /dev/null +++ b/crypto3/libs/multiprecision/test/boost_backends/CMakeLists.txt @@ -0,0 +1,68 @@ +#---------------------------------------------------------------------------# +# Copyright (c) 2018-2020 Mikhail Komarov +# Copyright (c) 2018-2021 Aleksei Moskvin +# +# Distributed under the Boost Software License, Version 1.0 +# See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt +#---------------------------------------------------------------------------# + +add_custom_target(${CURRENT_PROJECT_NAME}_test_suite_modular_cpp_int_tests) + +cm_test_link_libraries( + ${CMAKE_WORKSPACE_NAME}_${CURRENT_PROJECT_NAME} + Boost::unit_test_framework +) + +macro(define_runtime_multiprecision_test name) + set(test_name "${CURRENT_PROJECT_NAME}_${name}_test") + + cm_test(NAME ${test_name} SOURCES ${name}.cpp ARGS) + + target_include_directories(${test_name} PRIVATE + "$" + "$" + + ${Boost_INCLUDE_DIRS} + ) + + set_target_properties(${test_name} PROPERTIES CXX_STANDARD 23 + CXX_STANDARD_REQUIRED TRUE) + + if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + target_compile_options(${test_name} PRIVATE "-fconstexpr-steps=2147483647") + elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + target_compile_options(${test_name} PRIVATE "-fconstexpr-ops-limit=4294967295") + endif() + + target_compile_definitions(${test_name} PRIVATE TEST_DATA_DIR="${CMAKE_CURRENT_SOURCE_DIR}/data/") +endmacro(define_runtime_multiprecision_test) + +macro(define_modular_cpp_int_test name) + define_runtime_multiprecision_test(${name}) + + set(test_name "${CURRENT_PROJECT_NAME}_${name}_test") + target_compile_definitions(${test_name} PUBLIC -DTEST_CPP_INT) + # target_link_libraries(${test_name} no_eh_support) + add_dependencies(${CURRENT_PROJECT_NAME}_test_suite_modular_cpp_int_tests ${test_name}) + +endmacro(define_modular_cpp_int_test) + +set(RUNTIME_TESTS_NAMES + "inverse" + "jacobi" + "ressol" + "arithmetic_non_matching_bitlength_numbers" + ) + +set(MODULAR_TESTS_NAMES + "modular_adaptor_fixed" +) + +foreach(TEST_NAME ${RUNTIME_TESTS_NAMES}) + define_runtime_multiprecision_test(${TEST_NAME}) +endforeach() + +foreach(TEST_NAME ${MODULAR_TESTS_NAMES}) + define_modular_cpp_int_test(${TEST_NAME}) +endforeach() \ No newline at end of file diff --git a/crypto3/libs/multiprecision/test/arithmetic_non_matching_bitlength_numbers.cpp b/crypto3/libs/multiprecision/test/boost_backends/arithmetic_non_matching_bitlength_numbers.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/arithmetic_non_matching_bitlength_numbers.cpp rename to crypto3/libs/multiprecision/test/boost_backends/arithmetic_non_matching_bitlength_numbers.cpp diff --git a/crypto3/libs/multiprecision/test/constexpr_arithmetric_test.hpp b/crypto3/libs/multiprecision/test/boost_backends/constexpr_arithmetric_test.hpp similarity index 100% rename from crypto3/libs/multiprecision/test/constexpr_arithmetric_test.hpp rename to crypto3/libs/multiprecision/test/boost_backends/constexpr_arithmetric_test.hpp diff --git a/crypto3/libs/multiprecision/test/constexpr_test_arithmetic_backend.cpp b/crypto3/libs/multiprecision/test/boost_backends/constexpr_test_arithmetic_backend.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/constexpr_test_arithmetic_backend.cpp rename to crypto3/libs/multiprecision/test/boost_backends/constexpr_test_arithmetic_backend.cpp diff --git a/crypto3/libs/multiprecision/test/constexpr_test_cpp_int.cpp b/crypto3/libs/multiprecision/test/boost_backends/constexpr_test_cpp_int.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/constexpr_test_cpp_int.cpp rename to crypto3/libs/multiprecision/test/boost_backends/constexpr_test_cpp_int.cpp diff --git a/crypto3/libs/multiprecision/test/constexpr_test_cpp_int_2.cpp b/crypto3/libs/multiprecision/test/boost_backends/constexpr_test_cpp_int_2.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/constexpr_test_cpp_int_2.cpp rename to crypto3/libs/multiprecision/test/boost_backends/constexpr_test_cpp_int_2.cpp diff --git a/crypto3/libs/multiprecision/test/constexpr_test_cpp_int_3.cpp b/crypto3/libs/multiprecision/test/boost_backends/constexpr_test_cpp_int_3.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/constexpr_test_cpp_int_3.cpp rename to crypto3/libs/multiprecision/test/boost_backends/constexpr_test_cpp_int_3.cpp diff --git a/crypto3/libs/multiprecision/test/constexpr_test_cpp_int_4.cpp b/crypto3/libs/multiprecision/test/boost_backends/constexpr_test_cpp_int_4.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/constexpr_test_cpp_int_4.cpp rename to crypto3/libs/multiprecision/test/boost_backends/constexpr_test_cpp_int_4.cpp diff --git a/crypto3/libs/multiprecision/test/constexpr_test_cpp_int_5.cpp b/crypto3/libs/multiprecision/test/boost_backends/constexpr_test_cpp_int_5.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/constexpr_test_cpp_int_5.cpp rename to crypto3/libs/multiprecision/test/boost_backends/constexpr_test_cpp_int_5.cpp diff --git a/crypto3/libs/multiprecision/test/constexpr_test_cpp_int_6.cpp b/crypto3/libs/multiprecision/test/boost_backends/constexpr_test_cpp_int_6.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/constexpr_test_cpp_int_6.cpp rename to crypto3/libs/multiprecision/test/boost_backends/constexpr_test_cpp_int_6.cpp diff --git a/crypto3/libs/multiprecision/test/constexpr_test_cpp_int_7.cpp b/crypto3/libs/multiprecision/test/boost_backends/constexpr_test_cpp_int_7.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/constexpr_test_cpp_int_7.cpp rename to crypto3/libs/multiprecision/test/boost_backends/constexpr_test_cpp_int_7.cpp diff --git a/crypto3/libs/multiprecision/test/eigen.hpp b/crypto3/libs/multiprecision/test/boost_backends/eigen.hpp similarity index 100% rename from crypto3/libs/multiprecision/test/eigen.hpp rename to crypto3/libs/multiprecision/test/boost_backends/eigen.hpp diff --git a/crypto3/libs/multiprecision/test/git_issue_167.cpp b/crypto3/libs/multiprecision/test/boost_backends/git_issue_167.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/git_issue_167.cpp rename to crypto3/libs/multiprecision/test/boost_backends/git_issue_167.cpp diff --git a/crypto3/libs/multiprecision/test/git_issue_175.cpp b/crypto3/libs/multiprecision/test/boost_backends/git_issue_175.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/git_issue_175.cpp rename to crypto3/libs/multiprecision/test/boost_backends/git_issue_175.cpp diff --git a/crypto3/libs/multiprecision/test/git_issue_248.cpp b/crypto3/libs/multiprecision/test/boost_backends/git_issue_248.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/git_issue_248.cpp rename to crypto3/libs/multiprecision/test/boost_backends/git_issue_248.cpp diff --git a/crypto3/libs/multiprecision/test/git_issue_265.cpp b/crypto3/libs/multiprecision/test/boost_backends/git_issue_265.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/git_issue_265.cpp rename to crypto3/libs/multiprecision/test/boost_backends/git_issue_265.cpp diff --git a/crypto3/libs/multiprecision/test/git_issue_277.cpp b/crypto3/libs/multiprecision/test/boost_backends/git_issue_277.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/git_issue_277.cpp rename to crypto3/libs/multiprecision/test/boost_backends/git_issue_277.cpp diff --git a/crypto3/libs/multiprecision/test/git_issue_30.cpp b/crypto3/libs/multiprecision/test/boost_backends/git_issue_30.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/git_issue_30.cpp rename to crypto3/libs/multiprecision/test/boost_backends/git_issue_30.cpp diff --git a/crypto3/libs/multiprecision/test/git_issue_98.cpp b/crypto3/libs/multiprecision/test/boost_backends/git_issue_98.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/git_issue_98.cpp rename to crypto3/libs/multiprecision/test/boost_backends/git_issue_98.cpp diff --git a/crypto3/libs/multiprecision/test/inverse.cpp b/crypto3/libs/multiprecision/test/boost_backends/inverse.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/inverse.cpp rename to crypto3/libs/multiprecision/test/boost_backends/inverse.cpp diff --git a/crypto3/libs/multiprecision/test/issue_13148.cpp b/crypto3/libs/multiprecision/test/boost_backends/issue_13148.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/issue_13148.cpp rename to crypto3/libs/multiprecision/test/boost_backends/issue_13148.cpp diff --git a/crypto3/libs/multiprecision/test/issue_13301.cpp b/crypto3/libs/multiprecision/test/boost_backends/issue_13301.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/issue_13301.cpp rename to crypto3/libs/multiprecision/test/boost_backends/issue_13301.cpp diff --git a/crypto3/libs/multiprecision/test/jacobi.cpp b/crypto3/libs/multiprecision/test/boost_backends/jacobi.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/jacobi.cpp rename to crypto3/libs/multiprecision/test/boost_backends/jacobi.cpp diff --git a/crypto3/libs/multiprecision/test/modular_adaptor_fixed.cpp b/crypto3/libs/multiprecision/test/boost_backends/modular_adaptor_fixed.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/modular_adaptor_fixed.cpp rename to crypto3/libs/multiprecision/test/boost_backends/modular_adaptor_fixed.cpp diff --git a/crypto3/libs/multiprecision/test/no_eh_test_support.cpp b/crypto3/libs/multiprecision/test/boost_backends/no_eh_test_support.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/no_eh_test_support.cpp rename to crypto3/libs/multiprecision/test/boost_backends/no_eh_test_support.cpp diff --git a/crypto3/libs/multiprecision/test/ressol.cpp b/crypto3/libs/multiprecision/test/boost_backends/ressol.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/ressol.cpp rename to crypto3/libs/multiprecision/test/boost_backends/ressol.cpp diff --git a/crypto3/libs/multiprecision/test/serial_txts/boost-no-inspect b/crypto3/libs/multiprecision/test/boost_backends/serial_txts/boost-no-inspect similarity index 100% rename from crypto3/libs/multiprecision/test/serial_txts/boost-no-inspect rename to crypto3/libs/multiprecision/test/boost_backends/serial_txts/boost-no-inspect diff --git a/crypto3/libs/multiprecision/test/serial_txts/cpp_int1024_serial32.txt b/crypto3/libs/multiprecision/test/boost_backends/serial_txts/cpp_int1024_serial32.txt similarity index 100% rename from crypto3/libs/multiprecision/test/serial_txts/cpp_int1024_serial32.txt rename to crypto3/libs/multiprecision/test/boost_backends/serial_txts/cpp_int1024_serial32.txt diff --git a/crypto3/libs/multiprecision/test/serial_txts/cpp_int1024_serial64.txt b/crypto3/libs/multiprecision/test/boost_backends/serial_txts/cpp_int1024_serial64.txt similarity index 100% rename from crypto3/libs/multiprecision/test/serial_txts/cpp_int1024_serial64.txt rename to crypto3/libs/multiprecision/test/boost_backends/serial_txts/cpp_int1024_serial64.txt diff --git a/crypto3/libs/multiprecision/test/serial_txts/cpp_int128_serial32.txt b/crypto3/libs/multiprecision/test/boost_backends/serial_txts/cpp_int128_serial32.txt similarity index 100% rename from crypto3/libs/multiprecision/test/serial_txts/cpp_int128_serial32.txt rename to crypto3/libs/multiprecision/test/boost_backends/serial_txts/cpp_int128_serial32.txt diff --git a/crypto3/libs/multiprecision/test/serial_txts/cpp_int128_serial64.txt b/crypto3/libs/multiprecision/test/boost_backends/serial_txts/cpp_int128_serial64.txt similarity index 100% rename from crypto3/libs/multiprecision/test/serial_txts/cpp_int128_serial64.txt rename to crypto3/libs/multiprecision/test/boost_backends/serial_txts/cpp_int128_serial64.txt diff --git a/crypto3/libs/multiprecision/test/serial_txts/cpp_int64_serial32.txt b/crypto3/libs/multiprecision/test/boost_backends/serial_txts/cpp_int64_serial32.txt similarity index 100% rename from crypto3/libs/multiprecision/test/serial_txts/cpp_int64_serial32.txt rename to crypto3/libs/multiprecision/test/boost_backends/serial_txts/cpp_int64_serial32.txt diff --git a/crypto3/libs/multiprecision/test/serial_txts/cpp_int64_serial64.txt b/crypto3/libs/multiprecision/test/boost_backends/serial_txts/cpp_int64_serial64.txt similarity index 100% rename from crypto3/libs/multiprecision/test/serial_txts/cpp_int64_serial64.txt rename to crypto3/libs/multiprecision/test/boost_backends/serial_txts/cpp_int64_serial64.txt diff --git a/crypto3/libs/multiprecision/test/skeleton_backend.hpp b/crypto3/libs/multiprecision/test/boost_backends/skeleton_backend.hpp similarity index 100% rename from crypto3/libs/multiprecision/test/skeleton_backend.hpp rename to crypto3/libs/multiprecision/test/boost_backends/skeleton_backend.hpp diff --git a/crypto3/libs/multiprecision/test/string_data.ipp b/crypto3/libs/multiprecision/test/boost_backends/string_data.ipp similarity index 100% rename from crypto3/libs/multiprecision/test/string_data.ipp rename to crypto3/libs/multiprecision/test/boost_backends/string_data.ipp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic.hpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic.hpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic.hpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic.hpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_ab_1.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_ab_1.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_ab_1.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_ab_1.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_ab_2.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_ab_2.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_ab_2.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_ab_2.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_ab_3.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_ab_3.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_ab_3.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_ab_3.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_backend_concept.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_backend_concept.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_backend_concept.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_backend_concept.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_1.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_1.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_1.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_1.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_10.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_10.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_10.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_10.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_11.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_11.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_11.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_11.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_12.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_12.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_12.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_12.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_13.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_13.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_13.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_13.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_14.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_14.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_14.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_14.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_15.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_15.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_15.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_15.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_16.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_16.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_16.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_16.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_17.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_17.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_17.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_17.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_18.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_18.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_18.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_18.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_19.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_19.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_19.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_19.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_2.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_2.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_2.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_2.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_20.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_20.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_20.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_20.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_3.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_3.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_3.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_3.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_4.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_4.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_4.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_4.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_5.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_5.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_5.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_5.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_6.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_6.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_6.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_6.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_7.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_7.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_7.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_7.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_8.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_8.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_8.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_8.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_9.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_9.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_9.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_9.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_br.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_br.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_cpp_int_br.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_cpp_int_br.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_dbg_adptr1.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_dbg_adptr1.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_dbg_adptr1.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_dbg_adptr1.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_dbg_adptr1m.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_dbg_adptr1m.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_dbg_adptr1m.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_dbg_adptr1m.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_dbg_adptr2.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_dbg_adptr2.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_dbg_adptr2.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_dbg_adptr2.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_logged_1.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_logged_1.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_logged_1.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_logged_1.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_logged_2.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_logged_2.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_logged_2.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_logged_2.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_mpz_rat.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_mpz_rat.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_mpz_rat.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_mpz_rat.cpp diff --git a/crypto3/libs/multiprecision/test/test_arithmetic_skeleton.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_skeleton.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_arithmetic_skeleton.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_arithmetic_skeleton.cpp diff --git a/crypto3/libs/multiprecision/test/test_checked_mixed_cpp_int.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_checked_mixed_cpp_int.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_checked_mixed_cpp_int.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_checked_mixed_cpp_int.cpp diff --git a/crypto3/libs/multiprecision/test/test_constants.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_constants.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_constants.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_constants.cpp diff --git a/crypto3/libs/multiprecision/test/test_constexpr.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_constexpr.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_constexpr.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_constexpr.cpp diff --git a/crypto3/libs/multiprecision/test/test_convert_from_cpp_int.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_convert_from_cpp_int.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_convert_from_cpp_int.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_convert_from_cpp_int.cpp diff --git a/crypto3/libs/multiprecision/test/test_cpp_int_conv.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_cpp_int_conv.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_cpp_int_conv.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_cpp_int_conv.cpp diff --git a/crypto3/libs/multiprecision/test/test_cpp_int_import_export.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_cpp_int_import_export.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_cpp_int_import_export.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_cpp_int_import_export.cpp diff --git a/crypto3/libs/multiprecision/test/test_cpp_int_left_shift.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_cpp_int_left_shift.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_cpp_int_left_shift.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_cpp_int_left_shift.cpp diff --git a/crypto3/libs/multiprecision/test/test_cpp_int_lit.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_cpp_int_lit.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_cpp_int_lit.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_cpp_int_lit.cpp diff --git a/crypto3/libs/multiprecision/test/test_eigen_interop.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_eigen_interop.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_eigen_interop.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_eigen_interop.cpp diff --git a/crypto3/libs/multiprecision/test/test_eigen_interop_cpp_int.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_eigen_interop_cpp_int.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_eigen_interop_cpp_int.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_eigen_interop_cpp_int.cpp diff --git a/crypto3/libs/multiprecision/test/test_exp.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_exp.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_exp.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_exp.cpp diff --git a/crypto3/libs/multiprecision/test/test_fpclassify.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_fpclassify.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_fpclassify.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_fpclassify.cpp diff --git a/crypto3/libs/multiprecision/test/test_gcd.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_gcd.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_gcd.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_gcd.cpp diff --git a/crypto3/libs/multiprecision/test/test_hash.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_hash.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_hash.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_hash.cpp diff --git a/crypto3/libs/multiprecision/test/test_int_io.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_int_io.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_int_io.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_int_io.cpp diff --git a/crypto3/libs/multiprecision/test/test_log.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_log.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_log.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_log.cpp diff --git a/crypto3/libs/multiprecision/test/test_mixed.hpp b/crypto3/libs/multiprecision/test/boost_backends/test_mixed.hpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_mixed.hpp rename to crypto3/libs/multiprecision/test/boost_backends/test_mixed.hpp diff --git a/crypto3/libs/multiprecision/test/test_move.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_move.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_move.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_move.cpp diff --git a/crypto3/libs/multiprecision/test/test_mpf_precisions.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_mpf_precisions.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_mpf_precisions.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_mpf_precisions.cpp diff --git a/crypto3/libs/multiprecision/test/test_nothrow_cpp_int.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_nothrow_cpp_int.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_nothrow_cpp_int.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_nothrow_cpp_int.cpp diff --git a/crypto3/libs/multiprecision/test/test_nothrow_cpp_rational.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_nothrow_cpp_rational.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_nothrow_cpp_rational.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_nothrow_cpp_rational.cpp diff --git a/crypto3/libs/multiprecision/test/test_numeric_limits.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_numeric_limits.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_numeric_limits.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_numeric_limits.cpp diff --git a/crypto3/libs/multiprecision/test/test_optional_compat.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_optional_compat.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_optional_compat.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_optional_compat.cpp diff --git a/crypto3/libs/multiprecision/test/test_pow.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_pow.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_pow.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_pow.cpp diff --git a/crypto3/libs/multiprecision/test/test_sf_import_c99.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_sf_import_c99.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_sf_import_c99.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_sf_import_c99.cpp diff --git a/crypto3/libs/multiprecision/test/test_sqrt.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_sqrt.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_sqrt.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_sqrt.cpp diff --git a/crypto3/libs/multiprecision/test/test_unchecked_cpp_int.cpp b/crypto3/libs/multiprecision/test/boost_backends/test_unchecked_cpp_int.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/test_unchecked_cpp_int.cpp rename to crypto3/libs/multiprecision/test/boost_backends/test_unchecked_cpp_int.cpp From 7affc91db7a991f854c47962e2bfb87607afcb77 Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Wed, 18 Dec 2024 22:24:19 +0000 Subject: [PATCH 20/29] multiprecision: rename tests --- .../libs/multiprecision/test/CMakeLists.txt | 36 ++++++++----------- ...{big_int_modular.cpp => big_mod_basic.cpp} | 0 ...mprehensive.cpp => big_mod_randomized.cpp} | 0 .../test/{big_int.cpp => big_uint.cpp} | 0 ...cpp => big_uint_comparison_randomized.cpp} | 0 .../test/{big_int_inverse.cpp => inverse.cpp} | 0 .../test/{big_int_jacobi.cpp => jacobi.cpp} | 0 ..._int_miller_rabin.cpp => miller_rabin.cpp} | 0 .../test/{big_int_ressol.cpp => ressol.cpp} | 0 9 files changed, 14 insertions(+), 22 deletions(-) rename crypto3/libs/multiprecision/test/{big_int_modular.cpp => big_mod_basic.cpp} (100%) rename crypto3/libs/multiprecision/test/{big_int_modular_comprehensive.cpp => big_mod_randomized.cpp} (100%) rename crypto3/libs/multiprecision/test/{big_int.cpp => big_uint.cpp} (100%) rename crypto3/libs/multiprecision/test/{big_int_comparison.cpp => big_uint_comparison_randomized.cpp} (100%) rename crypto3/libs/multiprecision/test/{big_int_inverse.cpp => inverse.cpp} (100%) rename crypto3/libs/multiprecision/test/{big_int_jacobi.cpp => jacobi.cpp} (100%) rename crypto3/libs/multiprecision/test/{big_int_miller_rabin.cpp => miller_rabin.cpp} (100%) rename crypto3/libs/multiprecision/test/{big_int_ressol.cpp => ressol.cpp} (100%) diff --git a/crypto3/libs/multiprecision/test/CMakeLists.txt b/crypto3/libs/multiprecision/test/CMakeLists.txt index c423d726f..7c6f2d737 100644 --- a/crypto3/libs/multiprecision/test/CMakeLists.txt +++ b/crypto3/libs/multiprecision/test/CMakeLists.txt @@ -7,7 +7,7 @@ # http://www.boost.org/LICENSE_1_0.txt #---------------------------------------------------------------------------# -add_custom_target(${CURRENT_PROJECT_NAME}_test_suite_big_int_tests) +add_custom_target(${CURRENT_PROJECT_NAME}_test_suite) cm_test_link_libraries( ${CMAKE_WORKSPACE_NAME}_${CURRENT_PROJECT_NAME} @@ -36,29 +36,21 @@ macro(define_multiprecision_test name) endif() target_compile_definitions(${test_name} PRIVATE TEST_DATA_DIR="${CMAKE_CURRENT_SOURCE_DIR}/data/") -endmacro(define_multiprecision_test) - -macro(define_big_int_test name) - define_multiprecision_test(${name}) - set(test_name "${CURRENT_PROJECT_NAME}_${name}_test") - target_compile_definitions(${test_name} PUBLIC -DTEST_CPP_INT) - # target_link_libraries(${test_name} no_eh_support) - add_dependencies(${CURRENT_PROJECT_NAME}_test_suite_big_int_tests ${test_name}) - -endmacro(define_big_int_test) + add_dependencies(${CURRENT_PROJECT_NAME}_test_suite ${test_name}) +endmacro(define_multiprecision_test) -set(BIG_INT_TESTS_NAMES - "big_int" - "big_int_comparison" - "big_int_inverse" - "big_int_jacobi" - "big_int_miller_rabin" - "big_int_modular" - "big_int_modular_comprehensive" - "big_int_ressol" +set(MULTIPRECISION_TESTS_NAMES + "big_mod_basic" + "big_mod_randomized" + "big_uint_comparison_randomized" + "big_uint" + "inverse" + "jacobi" + "miller_rabin" + "ressol" ) -foreach(TEST_NAME ${BIG_INT_TESTS_NAMES}) - define_big_int_test(${TEST_NAME}) +foreach(TEST_NAME ${MULTIPRECISION_TESTS_NAMES}) + define_multiprecision_test(${TEST_NAME}) endforeach() diff --git a/crypto3/libs/multiprecision/test/big_int_modular.cpp b/crypto3/libs/multiprecision/test/big_mod_basic.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/big_int_modular.cpp rename to crypto3/libs/multiprecision/test/big_mod_basic.cpp diff --git a/crypto3/libs/multiprecision/test/big_int_modular_comprehensive.cpp b/crypto3/libs/multiprecision/test/big_mod_randomized.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/big_int_modular_comprehensive.cpp rename to crypto3/libs/multiprecision/test/big_mod_randomized.cpp diff --git a/crypto3/libs/multiprecision/test/big_int.cpp b/crypto3/libs/multiprecision/test/big_uint.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/big_int.cpp rename to crypto3/libs/multiprecision/test/big_uint.cpp diff --git a/crypto3/libs/multiprecision/test/big_int_comparison.cpp b/crypto3/libs/multiprecision/test/big_uint_comparison_randomized.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/big_int_comparison.cpp rename to crypto3/libs/multiprecision/test/big_uint_comparison_randomized.cpp diff --git a/crypto3/libs/multiprecision/test/big_int_inverse.cpp b/crypto3/libs/multiprecision/test/inverse.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/big_int_inverse.cpp rename to crypto3/libs/multiprecision/test/inverse.cpp diff --git a/crypto3/libs/multiprecision/test/big_int_jacobi.cpp b/crypto3/libs/multiprecision/test/jacobi.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/big_int_jacobi.cpp rename to crypto3/libs/multiprecision/test/jacobi.cpp diff --git a/crypto3/libs/multiprecision/test/big_int_miller_rabin.cpp b/crypto3/libs/multiprecision/test/miller_rabin.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/big_int_miller_rabin.cpp rename to crypto3/libs/multiprecision/test/miller_rabin.cpp diff --git a/crypto3/libs/multiprecision/test/big_int_ressol.cpp b/crypto3/libs/multiprecision/test/ressol.cpp similarity index 100% rename from crypto3/libs/multiprecision/test/big_int_ressol.cpp rename to crypto3/libs/multiprecision/test/ressol.cpp From 32714e1c43150669a361c372896854f11f35c4c9 Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Wed, 18 Dec 2024 22:41:48 +0000 Subject: [PATCH 21/29] multiprecision: remove examples --- .../multiprecision/example/big_seventh.cpp | 186 ----- .../example/cpp_int_import_export.cpp | 42 - .../example/cpp_int_mul_timing.cpp | 229 ------ .../multiprecision/example/cpp_int_snips.cpp | 73 -- .../example/debug_adaptor_snips.cpp | 35 - .../example/hashing_examples.cpp | 73 -- .../hypergeometric_luke_algorithms.cpp | 765 ------------------ .../example/integer_examples.cpp | 226 ------ .../multiprecision/example/logged_adaptor.cpp | 118 --- .../example/mixed_integer_arithmetic.cpp | 55 -- .../example/modular_examples.cpp | 86 -- .../example/numeric_limits_snips.cpp | 471 ----------- .../multiprecision/example/random_snips.cpp | 310 ------- .../multiprecision/example/safe_prime.cpp | 45 -- 14 files changed, 2714 deletions(-) delete mode 100644 crypto3/libs/multiprecision/example/big_seventh.cpp delete mode 100644 crypto3/libs/multiprecision/example/cpp_int_import_export.cpp delete mode 100644 crypto3/libs/multiprecision/example/cpp_int_mul_timing.cpp delete mode 100644 crypto3/libs/multiprecision/example/cpp_int_snips.cpp delete mode 100644 crypto3/libs/multiprecision/example/debug_adaptor_snips.cpp delete mode 100644 crypto3/libs/multiprecision/example/hashing_examples.cpp delete mode 100644 crypto3/libs/multiprecision/example/hypergeometric_luke_algorithms.cpp delete mode 100644 crypto3/libs/multiprecision/example/integer_examples.cpp delete mode 100644 crypto3/libs/multiprecision/example/logged_adaptor.cpp delete mode 100644 crypto3/libs/multiprecision/example/mixed_integer_arithmetic.cpp delete mode 100644 crypto3/libs/multiprecision/example/modular_examples.cpp delete mode 100644 crypto3/libs/multiprecision/example/numeric_limits_snips.cpp delete mode 100644 crypto3/libs/multiprecision/example/random_snips.cpp delete mode 100644 crypto3/libs/multiprecision/example/safe_prime.cpp diff --git a/crypto3/libs/multiprecision/example/big_seventh.cpp b/crypto3/libs/multiprecision/example/big_seventh.cpp deleted file mode 100644 index 830f28e29..000000000 --- a/crypto3/libs/multiprecision/example/big_seventh.cpp +++ /dev/null @@ -1,186 +0,0 @@ -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt -// or copy at http://www.boost.org/LICENSE_1_0.txt) - -// Copyright Paul A. Bristow 2019. -// Copyright Christopher Kormanyos 2012. -// Copyright John Maddock 2012. - -// This file is written to be included from a Quickbook .qbk document. -// It can be compiled by the C++ compiler, and run. Any output can -// also be added here as comment or included or pasted in elsewhere. -// Caution: this file contains Quickbook markup as well as code -// and comments: don't change any of the special comment markups! - -#ifdef _MSC_VER -#pragma warning(disable : 4512) // assignment operator could not be generated. -#pragma warning(disable : 4996) -#endif - -//[big_seventh_example_1 - -/*`[h5 Using Boost.Multiprecision `cpp_float` types for numerical calculations with higher precision than __fundamental -`long double`.] - -The Boost.Multiprecision library can be used for computations requiring precision -exceeding that of standard __fundamental types such as `float`, `double` -and `long double`. For extended-precision calculations, Boost.Multiprecision -supplies several template data types called `cpp_bin_float_`. - -The number of decimal digits of precision is fixed at compile-time via template parameter. - -To use these floating-point types and -[@https://www.boost.org/doc/libs/release/libs/math/doc/html/constants.html Boost.Math collection of high-precision -constants], we need some includes: -*/ - -#include - -#include -// that includes some predefined typedefs like: -// using nil::crypto3::multiprecision::cpp_bin_float_quad; -// using nil::crypto3::multiprecision::cpp_bin_float_50; -// using nil::crypto3::multiprecision::cpp_bin_float_100; - -#include -#include - -/*` So now we can demonstrate with some trivial calculations: - */ - -//] //[big_seventh_example_1] - -int main() { - - //[big_seventh_example_2 - /*`Using a `typedef` like `cpp_bin_float_50` hides the complexity of multiprecision, and - allows us to define variables with 50 decimal digit precision just like __fundamental `double`. - */ - using nil::crypto3::multiprecision::cpp_bin_float_50; - - cpp_bin_float_50 seventh = cpp_bin_float_50(1) / 7; // 1 / 7 - - /*`By default, output would only show the standard 6 decimal digits, - so set precision to show all 50 significant digits, including any trailing zeros (to show the full implied 50 digit - precision). - */ - std::cout.precision(std::numeric_limits::digits10); // Show 50 decimal digit precision. - std::cout << std::showpoint << std::endl; // Append any trailing zeros. - std::cout << seventh << std::endl; - /*`which outputs: - - 0.14285714285714285714285714285714285714285714285714 - - We can also use Boost.Math __math_constants like [pi], - guaranteed to be initialized with the very last bit of precision for the floating-point type. - */ - std::cout << "pi = " << boost::math::constants::pi() << std::endl; - cpp_bin_float_50 circumference = boost::math::constants::pi() * 2 * seventh; - std::cout << "c = " << circumference << std::endl; - - /*`which outputs - - pi = 3.1415926535897932384626433832795028841971693993751 - - c = 0.89759790102565521098932668093700082405633411410717 - */ - //] [/big_seventh_example_2] - - //[big_seventh_example_3 - /*`So using `cpp_bin_float_50` looks like a simple 'drop-in' for the __fundamental_type like 'double', - but beware of less-than-expected precision from construction or conversion from `double` or other lower precision - types. This is a mistake that is very easy to make, and very difficult to detect because the difference in precision - is only visible after about the 17th decimal digit. - - We can show this by constructing a fraction one seventh from `double`: - */ - cpp_bin_float_50 seventh_0 = - cpp_bin_float_50(1 / 7); // Avoid the schoolboy-error `double d7 = 1 / 7;` giving zero! - std::cout << "seventh_0 = " << seventh_0 << std::endl; - // seventh_double0 = 0.0000000000000000000000000000000000000000000000000 - - cpp_bin_float_50 seventh_double = cpp_bin_float_50(1. / 7); // Construct from double! (0.14285714285714) - std::cout << "seventh_double = " << seventh_double << std::endl; // Boost.Multiprecision post-school error! - // seventh_double = 0.14285714285714284921269268124888185411691665649414 - - /*`Did you spot the probably-unintended difference? After the 17th decimal digit, result is apparently random - and not the expected recurring pattern 14285714285714... - - The 'random' digits after digit 17 are from the `cpp_bin_float_50` representation of the `double` value - 0.14285714285714 which is different from the 'better' `cpp_bin_float_50` representation of the fraction 1/7 - */ - - cpp_bin_float_50 seventh_big(1); // 1 - seventh_big /= 7; - std::cout << "seventh_big = " << seventh_big << std::endl; // - // seventh_big = 0.14285714285714285714285714285714285714285714285714 - //`Note the recurring 14285714285714 pattern as expected. - - //`We can also construct a `const` version (but not yet `constexpr`) and evaluate in a single expression: - - const cpp_bin_float_50 seventh_const(cpp_bin_float_50(1) / 7); - std::cout << "seventh_const = " << seventh_const << std::endl; // - // seventh_const = 0.14285714285714285714285714285714285714285714285714 - //] [/big_seventh_example_3] - - //[big_seventh_example_constexpr - - // Sadly we cannot (yet) write: - // constexpr cpp_bin_float_50 any_constexpr(0); - - // constexpr cpp_bin_float_50 seventh_constexpr (cpp_bin_float_50(1) / 7); - // std::cout << "seventh_constexpr = " << seventh_constexpr << std::endl; // - // nor use the macro BOOST_CONSTEXPR_OR_CONST unless it returns `const` - // BOOST_CONSTEXPR_OR_CONST cpp_bin_float_50 seventh_constexpr(seventh_const); - - //] [/big_seventh_example_constexpr] - - //[big_seventh_example_4 - /*`For some purposes, this difference in precision may be insignificant, - but if one is implementing a formula involving a fraction from integers, - including decimal fractions like 1/10, 1/100, then comparison with other computations like __WolframAlpha - will reveal differences whose cause may be perplexing. - - To get as precise-as-possible decimal fractions like 1.234, we can write - */ - - const cpp_bin_float_50 f1(cpp_bin_float_50(1234) / 1000); // Construct from a fraction. - std::cout << "cpp_bin_float_50 f1(cpp_bin_float_50(1234) / 1000) = " << f1 - << std::endl; // cpp_bin_float_50 f1(cpp_bin_float_50(1234) / 1000) - // = 1.2340000000000000000000000000000000000000000000000 - /*`or - */ - const cpp_bin_float_50 f2("1.234"); // Construct from decimal digit string. - std::cout << "cpp_bin_float_50 f2(\"1.234\") = " << f2 - << std::endl; // cpp_bin_float_50 f2("1.234") = 1.2340000000000000000000000000000000000000000000000 - - /*`that are different from constructing from a `double` with value 1.234 - */ - const cpp_bin_float_50 f3(cpp_bin_float_50(1.234)); - std::cout << "cpp_bin_float_50 f3(cpp_bin_float_50(1.234)) = " << f3 - << std::endl; // 1.2339999999999999857891452847979962825775146484375 - - //] [/big_seventh_example_4] - - return 0; -} // int main() - -/* -//[big_seventh_example_output - -0.14285714285714285714285714285714285714285714285714 -pi = 3.1415926535897932384626433832795028841971693993751 -c = 0.89759790102565521098932668093700082405633411410717 -seventh_0 = 0.0000000000000000000000000000000000000000000000000 -seventh_double = 0.14285714285714284921269268124888185411691665649414 -seventh_big = 0.14285714285714285714285714285714285714285714285714 -seventh_const = 0.14285714285714285714285714285714285714285714285714 -cpp_bin_float_50 f1(cpp_bin_float_50(1234) / 100) = 12.340000000000000000000000000000000000000000000000 -cpp_bin_float_50 f2("1.234") = 1.2340000000000000000000000000000000000000000000000 -cpp_bin_float_50 f3(cpp_bin_float_50(1.234)) = 1.2339999999999999857891452847979962825775146484375 - -//] //[/big_seventh_example_output] - -*/ - diff --git a/crypto3/libs/multiprecision/example/cpp_int_import_export.cpp b/crypto3/libs/multiprecision/example/cpp_int_import_export.cpp deleted file mode 100644 index 953d43809..000000000 --- a/crypto3/libs/multiprecision/example/cpp_int_import_export.cpp +++ /dev/null @@ -1,42 +0,0 @@ -/////////////////////////////////////////////////////////////// -// Copyright 2015 John Maddock. Distributed under the Boost -// Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt - -#include -#include -#include -#include -#include - -//[IE1 - -/*` -In this simple example, we'll import/export the bits of a cpp_int -to a vector of 8-bit unsigned values: -*/ -/*= -#include -#include -#include -#include -#include -*/ - -int main() { - using nil::crypto3::multiprecision::cpp_int; - // Create a cpp_int with just a couple of bits set: - cpp_int i; - bit_set(i, 5000); // set the 5000'th bit - bit_set(i, 200); - bit_set(i, 50); - // export into 8-bit unsigned values, most significant bit first: - std::vector v; - export_bits(i, std::back_inserter(v), 8); - // import back again, and check for equality: - cpp_int j; - import_bits(j, v.begin(), v.end()); - BOOST_ASSERT(i == j); -} - -//] diff --git a/crypto3/libs/multiprecision/example/cpp_int_mul_timing.cpp b/crypto3/libs/multiprecision/example/cpp_int_mul_timing.cpp deleted file mode 100644 index ff96c8acc..000000000 --- a/crypto3/libs/multiprecision/example/cpp_int_mul_timing.cpp +++ /dev/null @@ -1,229 +0,0 @@ -/////////////////////////////////////////////////////////////////// -// Copyright Christopher Kormanyos 2019. // -// Distributed under the Boost Software License, // -// Version 1.0. (See accompanying file LICENSE_1_0.txt // -// or copy at http://www.boost.org/LICENSE_1_0.txt) // -/////////////////////////////////////////////////////////////////// - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -class random_pcg32_fast_base { -protected: - using itype = std::uint64_t; - - static constexpr bool is_mcg = false; - -public: - virtual ~random_pcg32_fast_base() = default; - -protected: - explicit random_pcg32_fast_base(const itype = itype()) { - } - - random_pcg32_fast_base(const random_pcg32_fast_base&) = default; - - random_pcg32_fast_base& operator=(const random_pcg32_fast_base&) = default; - - template - static ArithmeticType rotr(const ArithmeticType& value_being_shifted, const std::size_t bits_to_shift) { - const std::size_t left_shift_amount = std::numeric_limits::digits - bits_to_shift; - - const ArithmeticType part1 = - ((bits_to_shift > 0U) ? ArithmeticType(value_being_shifted >> bits_to_shift) : value_being_shifted); - const ArithmeticType part2 = - ((bits_to_shift > 0U) ? ArithmeticType(value_being_shifted << left_shift_amount) : 0U); - - return ArithmeticType(part1 | part2); - } - - template - struct xsh_rr_mixin { - static xtype output(const itype internal_value) { - using bitcount_t = std::size_t; - - constexpr bitcount_t bits = bitcount_t(sizeof(itype) * 8U); - constexpr bitcount_t xtypebits = bitcount_t(sizeof(xtype) * 8U); - constexpr bitcount_t sparebits = bits - xtypebits; - constexpr bitcount_t wantedopbits = - ((xtypebits >= 128U) ? - 7U : - ((xtypebits >= 64U) ? 6U : ((xtypebits >= 32U) ? 5U : ((xtypebits >= 16U) ? 4U : 3U)))); - - constexpr bitcount_t opbits = ((sparebits >= wantedopbits) ? wantedopbits : sparebits); - constexpr bitcount_t amplifier = wantedopbits - opbits; - constexpr bitcount_t mask = (1ULL << opbits) - 1U; - constexpr bitcount_t topspare = opbits; - constexpr bitcount_t bottomspare = sparebits - topspare; - constexpr bitcount_t xshift = (topspare + xtypebits) / 2U; - - const bitcount_t rot = ((opbits != 0U) ? (bitcount_t(internal_value >> (bits - opbits)) & mask) : 0U); - - const bitcount_t amprot = (rot << amplifier) & mask; - - const itype internal_value_xor = internal_value ^ itype(internal_value >> xshift); - - const xtype result = rotr(xtype(internal_value_xor >> bottomspare), amprot); - - return result; - } - }; -}; - -class random_pcg32_fast : public random_pcg32_fast_base { -private: - static constexpr itype default_multiplier = static_cast(6364136223846793005ULL); - static constexpr itype default_increment = static_cast(1442695040888963407ULL); - -public: - using result_type = std::uint32_t; - - static constexpr itype default_seed = static_cast(0xCAFEF00DD15EA5E5ULL); - - explicit random_pcg32_fast(const itype state = default_seed) : - random_pcg32_fast_base(state), my_inc(default_increment), - my_state(is_mcg ? state | itype(3U) : bump(state + increment())) { - } - - random_pcg32_fast(const random_pcg32_fast& other) : - random_pcg32_fast_base(other), my_inc(other.my_inc), my_state(other.my_state) { - } - - virtual ~random_pcg32_fast() = default; - - random_pcg32_fast& operator=(const random_pcg32_fast& other) { - static_cast(random_pcg32_fast_base::operator=(other)); - - if (this != &other) { - my_inc = other.my_inc; - my_state = other.my_state; - } - - return *this; - } - - void seed(const itype state = default_seed) { - my_inc = default_increment; - - my_state = (is_mcg ? state | itype(3U) : bump(state + increment())); - } - - result_type operator()() { - const result_type value = xsh_rr_mixin::output(base_generate0()); - - return value; - } - -private: - itype my_inc; - itype my_state; - - itype multiplier() const { - return default_multiplier; - } - - itype increment() const { - return default_increment; - } - - itype bump(const itype state) { - return itype(state * multiplier()) + increment(); - } - - itype base_generate0() { - const itype old_state = my_state; - - my_state = bump(my_state); - - return old_state; - } -}; - -template -void get_random_big_uint(RandomEngineType& rng, UnsignedIntegralIteratorType it_out) { - using local_random_value_type = typename RandomEngineType::result_type; - - using local_uint_type = typename std::iterator_traits::value_type; - - constexpr std::size_t digits_of_uint___type = - static_cast(std::numeric_limits::digits); - constexpr std::size_t digits_of_random_type = - static_cast(std::numeric_limits::digits); - - local_random_value_type next_random = rng(); - - *it_out = next_random; - - for (std::size_t i = digits_of_random_type; i < digits_of_uint___type; i += digits_of_random_type) { - (*it_out) <<= digits_of_random_type; - - next_random = rng(); - - (*it_out) |= next_random; - } -} - -using big_uint_backend_type = nil::crypto3::multiprecision:: - cpp_int_backend<8192UL << 1U, 8192UL << 1U, nil::crypto3::multiprecision::unsigned_magnitude>; - -using big_uint_type = nil::crypto3::multiprecision::number; - -namespace local { - std::vector a(1024U); - std::vector b(a.size()); -} // namespace local - -int main() { - random_pcg32_fast rng; - - rng.seed(std::clock()); - - for (auto i = 0U; i < local::a.size(); ++i) { - get_random_big_uint(rng, local::a.begin() + i); - get_random_big_uint(rng, local::b.begin() + i); - } - - std::size_t count = 0U; - - float total_time = 0.0F; - - const std::clock_t start = std::clock(); - - do { - const std::size_t index = count % local::a.size(); - - local::a[index] * local::b[index]; - - ++count; - } while ((total_time = (float(std::clock() - start) / float(CLOCKS_PER_SEC))) < 10.0F); - - // Boost.Multiprecision 1.71 - // bits: 16384, kops_per_sec: 4.7 - // bits: 32768, kops_per_sec: 1.2 - // bits: 65536, kops_per_sec: 0.3 - // bits: 131072, kops_per_sec: 0.075 - // bits: 262144, kops_per_sec: 0.019 - // bits: 524288, kops_per_sec: 0.0047 - - // Boost.Multiprecision + kara mult - // bits: 16384, kops_per_sec: 4.8 - // bits: 32768, kops_per_sec: 1.6 - // bits: 65536, kops_per_sec: 0.5 - // bits: 131072, kops_per_sec: 0.15 - // bits: 262144, kops_per_sec: 0.043 - // bits: 524288, kops_per_sec: 0.011 - - const float kops_per_sec = (float(count) / total_time) / 1000.0F; - - std::cout << "bits: " << std::numeric_limits::digits << ", kops_per_sec: " << kops_per_sec << count - << std::endl; -} diff --git a/crypto3/libs/multiprecision/example/cpp_int_snips.cpp b/crypto3/libs/multiprecision/example/cpp_int_snips.cpp deleted file mode 100644 index 7f8440715..000000000 --- a/crypto3/libs/multiprecision/example/cpp_int_snips.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/////////////////////////////////////////////////////////////// -// Copyright 2011 John Maddock. Distributed under the Boost -// Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt - -#include -#include - -void t1() { - //[cpp_int_eg - //=#include - //=#include - //= - //=int main() - //={ - using namespace nil::crypto3::multiprecision; - - int128_t v = 1; - - // Do some fixed precision arithmetic: - for (unsigned i = 1; i <= 20; ++i) - v *= i; - - std::cout << v << std::endl; // prints 2432902008176640000 (i.e. 20!) - - // Repeat at arbitrary precision: - cpp_int u = 1; - for (unsigned i = 1; i <= 100; ++i) - u *= i; - - // prints - // 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 - // (i.e. 100!) - std::cout << u << std::endl; - - //= return 0; - //=} - //] -} - -void t3() { - //[cpp_rational_eg - //=#include - //=#include - //= - //=int main() - //={ - using namespace nil::crypto3::multiprecision; - - cpp_rational v = 1; - - // Do some arithmetic: - for (unsigned i = 1; i <= 1000; ++i) - v *= i; - v /= 10; - - std::cout << v << std::endl; // prints 1000! / 10 - std::cout << numerator(v) << std::endl; - std::cout << denominator(v) << std::endl; - - cpp_rational w(2, 3); // component wise constructor - std::cout << w << std::endl; // prints 2/3 - //= return 0; - //=} - //] -} - -int main() { - t1(); - t3(); - return 0; -} - diff --git a/crypto3/libs/multiprecision/example/debug_adaptor_snips.cpp b/crypto3/libs/multiprecision/example/debug_adaptor_snips.cpp deleted file mode 100644 index b79d7c7a3..000000000 --- a/crypto3/libs/multiprecision/example/debug_adaptor_snips.cpp +++ /dev/null @@ -1,35 +0,0 @@ -/////////////////////////////////////////////////////////////// -// Copyright 2011 John Maddock. Distributed under the Boost -// Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt - -#include -#include -#include - -void t1() { - //[debug_adaptor_eg - //=#include - //=#include - - using namespace nil::crypto3::multiprecision; - - typedef number>> fp_type; - - fp_type denom = 1; - fp_type sum = 1; - - for (unsigned i = 2; i < 50; ++i) { - denom *= i; - sum += 1 / denom; - } - - std::cout << std::setprecision(std::numeric_limits::digits) << sum << std::endl; - //] -} - -int main() { - t1(); - return 0; -} - diff --git a/crypto3/libs/multiprecision/example/hashing_examples.cpp b/crypto3/libs/multiprecision/example/hashing_examples.cpp deleted file mode 100644 index 0426fd295..000000000 --- a/crypto3/libs/multiprecision/example/hashing_examples.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/////////////////////////////////////////////////////////////// -// Copyright 2012 John Maddock. Distributed under the Boost -// Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt - -#include -#include -#include -#include -#include - -//[hash1 - -/*` -All of the types in this library support hashing via boost::hash or std::hash. -That means we can use multiprecision types directly in hashed containers such as std::unordered_set: -*/ -//] - -void t1() { - //[hash2 - using namespace nil::crypto3::multiprecision; - using namespace boost::random; - - mt19937 mt; - uniform_int_distribution ui; - - std::unordered_set set; - // Put 1000 random values into the container: - for (unsigned i = 0; i < 1000; ++i) - set.insert(ui(mt)); - - //] -} - -//[hash3 - -/*` -Or we can define our own hash function, for example in this case based on -Google's CityHash: -*/ - -struct cityhash { - std::size_t operator()(const nil::crypto3::multiprecision::uint256_t& val) const { - // create a hash from all the limbs of the argument, this function is probably x64 specific, - // and requires that we access the internals of the data type: - std::size_t result = CityHash64(reinterpret_cast(val.backend().limbs()), - val.backend().size() * sizeof(val.backend().limbs()[0])); - // modify the returned hash based on sign: - return val < 0 ? ~result : result; - } -}; - -//] - -void t2() { - //[hash4 - - /*`As before insert some values into a container, this time using our custom hasher:*/ - - std::unordered_set set2; - for (unsigned i = 0; i < 1000; ++i) - set2.insert(ui(mt)); - - //] -} - -int main() { - t1(); - t2(); - return 0; -} - diff --git a/crypto3/libs/multiprecision/example/hypergeometric_luke_algorithms.cpp b/crypto3/libs/multiprecision/example/hypergeometric_luke_algorithms.cpp deleted file mode 100644 index cef2d7e5d..000000000 --- a/crypto3/libs/multiprecision/example/hypergeometric_luke_algorithms.cpp +++ /dev/null @@ -1,765 +0,0 @@ - -/////////////////////////////////////////////////////////////////////////////// -// Copyright Christopher Kormanyos 2013 - 2014. -// Copyright John Maddock 2013. -// Distributed under the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt -// or copy at http://www.boost.org/LICENSE_1_0.txt) -// -// This work is based on an earlier work: -// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", -// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 -// - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -//#define USE_CPP_BIN_FLOAT -#define USE_CPP_DEC_FLOAT -//#define USE_MPFR - -#if !defined(DIGIT_COUNT) -#define DIGIT_COUNT 100 -#endif - -#if !defined(BOOST_NO_CXX11_HDR_CHRONO) -#include -#define STD_CHRONO std::chrono -#else -#include -#define STD_CHRONO boost::chrono -#endif - -#if defined(USE_CPP_BIN_FLOAT) -#include -typedef nil::crypto3::multiprecision::number> mp_type; -#elif defined(USE_CPP_DEC_FLOAT) -#include -typedef nil::crypto3::multiprecision::number> mp_type; -#elif defined(USE_MPFR) -#include -typedef nil::crypto3::multiprecision::number> - mp_type; -#else -#error no multiprecision floating type is defined -#endif - -template -struct stopwatch { -public: - typedef typename clock_type::duration duration_type; - - stopwatch() : m_start(clock_type::now()) { - } - - stopwatch(const stopwatch& other) : m_start(other.m_start) { - } - - stopwatch& operator=(const stopwatch& other) { - m_start = other.m_start; - return *this; - } - - ~stopwatch() { - } - - duration_type elapsed() const { - return (clock_type::now() - m_start); - } - - void reset() { - m_start = clock_type::now(); - } - -private: - typename clock_type::time_point m_start; -}; - -namespace my_math { - template - T chebyshev_t(const std::int32_t n, const T& x); - - template - T chebyshev_t(const std::uint32_t n, const T& x, std::vector* vp); - - template - bool isneg(const T& x) { - return (x < T(0)); - } - - template - const T& zero() { - static const T value_zero(0); - return value_zero; - } - template - const T& one() { - static const T value_one(1); - return value_one; - } - template - const T& two() { - static const T value_two(2); - return value_two; - } -} // namespace my_math - -namespace orthogonal_polynomial_series { - template - static inline T orthogonal_polynomial_template(const T& x, - const std::uint32_t n, - std::vector* const vp = static_cast*>(0u)) { - // Compute the value of an orthogonal chebyshev polinomial. - // Use stable upward recursion. - - if (vp != nullptr) { - vp->clear(); - vp->reserve(static_cast(n + 1u)); - } - - T y0 = my_math::one(); - - if (vp != nullptr) { - vp->push_back(y0); - } - - if (n == static_cast(0u)) { - return y0; - } - - T y1 = x; - - if (vp != nullptr) { - vp->push_back(y1); - } - - if (n == static_cast(1u)) { - return y1; - } - - T a = my_math::two(); - T b = my_math::zero(); - T c = my_math::one(); - - T yk; - - // Calculate higher orders using the recurrence relation. - // The direction of stability is upward recursion. - for (std::int32_t k = static_cast(2); k <= static_cast(n); ++k) { - yk = (((a * x) + b) * y1) - (c * y0); - - y0 = y1; - y1 = yk; - - if (vp != nullptr) { - vp->push_back(yk); - } - } - - return yk; - } -} // namespace orthogonal_polynomial_series - -template -T my_math::chebyshev_t(const std::int32_t n, const T& x) { - if (my_math::isneg(x)) { - const bool b_negate = ((n % static_cast(2)) != static_cast(0)); - - const T y = chebyshev_t(n, -x); - - return (!b_negate ? y : -y); - } - - if (n < static_cast(0)) { - const std::int32_t nn = static_cast(-n); - - return chebyshev_t(nn, x); - } else { - return orthogonal_polynomial_series::orthogonal_polynomial_template(x, static_cast(n)); - } -} - -template -T my_math::chebyshev_t(const std::uint32_t n, const T& x, std::vector* const vp) { - return orthogonal_polynomial_series::orthogonal_polynomial_template(x, static_cast(n), vp); -} - -namespace util { - template - float digit_scale() { - const int d = ((std::max)(std::numeric_limits::digits10, 15)); - return static_cast(d) / 300.0F; - } -} // namespace util - -namespace examples { - namespace nr_006 { - template - class hypergeometric_pfq_base : private boost::noncopyable { - public: - virtual ~hypergeometric_pfq_base() { - } - - virtual void ccoef() const = 0; - - virtual T series() const { - using my_math::chebyshev_t; - - // Compute the Chebyshev coefficients. - // Get the values of the shifted Chebyshev polynomials. - std::vector chebyshev_t_shifted_values; - const T z_shifted = ((Z / W) * static_cast(2)) - static_cast(1); - - chebyshev_t(static_cast(C.size()), z_shifted, &chebyshev_t_shifted_values); - - // Luke: C ---------- COMPUTE SCALE FACTOR ---------- - // Luke: C - // Luke: C ---------- SCALE THE COEFFICIENTS ---------- - // Luke: C - - // The coefficient scaling is preformed after the Chebyshev summation, - // and it is carried out with a single division operation. - bool b_neg = false; - - const T scale = std::accumulate(C.begin(), C.end(), T(0), [&b_neg](T scale_sum, const T& ck) -> T { - ((!b_neg) ? (scale_sum += ck) : (scale_sum -= ck)); - b_neg = (!b_neg); - return scale_sum; - }); - - // Compute the result of the series expansion using unscaled coefficients. - const T sum = std::inner_product(C.begin(), C.end(), chebyshev_t_shifted_values.begin(), T(0)); - - // Return the properly scaled result. - return sum / scale; - } - - protected: - const T Z; - const T W; - mutable std::deque C; - - hypergeometric_pfq_base(const T& z, const T& w) : Z(z), W(w), C(0u) { - } - - virtual std::int32_t N() const { - return static_cast(util::digit_scale() * 500.0F); - } - }; - - template - class ccoef4_hypergeometric_0f1 : public hypergeometric_pfq_base { - public: - ccoef4_hypergeometric_0f1(const T& c, const T& z, const T& w) : hypergeometric_pfq_base(z, w), CP(c) { - } - - virtual ~ccoef4_hypergeometric_0f1() { - } - - virtual void ccoef() const { - // See Luke 1977 page 80. - const std::int32_t N1 = static_cast(this->N() + static_cast(1)); - const std::int32_t N2 = static_cast(this->N() + static_cast(2)); - - // Luke: C ---------- START COMPUTING COEFFICIENTS USING ---------- - // Luke: C ---------- BACKWARD RECURRENCE SCHEME ---------- - // Luke: C - T A3(0); - T A2(0); - T A1(boost::math::tools::root_epsilon()); - - hypergeometric_pfq_base::C.resize(1u, A1); - - std::int32_t X1 = N2; - - T C1 = T(1) - CP; - - const T Z1 = T(4) / hypergeometric_pfq_base::W; - - for (std::int32_t k = static_cast(0); k < N1; ++k) { - const T DIVFAC = T(1) / X1; - - --X1; - - // The terms have been slightly re-arranged resulting in lower complexity. - // Parentheses have been added to avoid reliance on operator precedence. - const T term = (A2 - ((A3 * DIVFAC) * X1)) + ((A2 * X1) * ((1 + (C1 + X1)) * Z1)) + - ((A1 * X1) * ((DIVFAC - (C1 * Z1)) + (X1 * Z1))); - - hypergeometric_pfq_base::C.push_front(term); - - A3 = A2; - A2 = A1; - A1 = hypergeometric_pfq_base::C.front(); - } - - hypergeometric_pfq_base::C.front() /= static_cast(2); - } - - private: - const T CP; - }; - - template - class ccoef1_hypergeometric_1f0 : public hypergeometric_pfq_base { - public: - ccoef1_hypergeometric_1f0(const T& a, const T& z, const T& w) : hypergeometric_pfq_base(z, w), AP(a) { - } - - virtual ~ccoef1_hypergeometric_1f0() { - } - - virtual void ccoef() const { - // See Luke 1977 page 67. - const std::int32_t N1 = static_cast(N() + static_cast(1)); - const std::int32_t N2 = static_cast(N() + static_cast(2)); - - // Luke: C ---------- START COMPUTING COEFFICIENTS USING ---------- - // Luke: C ---------- BACKWARD RECURRENCE SCHEME ---------- - // Luke: C - T A2(0); - T A1(boost::math::tools::root_epsilon()); - - hypergeometric_pfq_base::C.resize(1u, A1); - - std::int32_t X1 = N2; - - T V1 = T(1) - AP; - - // Here, we have corrected what appears to be an error in Luke's code. - - // Luke's original code listing has: - // AFAC = 2 + FOUR/W - // But it appears as though the correct form is: - // AFAC = 2 - FOUR/W. - - const T AFAC = 2 - (T(4) / hypergeometric_pfq_base::W); - - for (std::int32_t k = static_cast(0); k < N1; ++k) { - --X1; - - // The terms have been slightly re-arranged resulting in lower complexity. - // Parentheses have been added to avoid reliance on operator precedence. - const T term = -(((X1 * AFAC) * A1) + ((X1 + V1) * A2)) / (X1 - V1); - - hypergeometric_pfq_base::C.push_front(term); - - A2 = A1; - A1 = hypergeometric_pfq_base::C.front(); - } - - hypergeometric_pfq_base::C.front() /= static_cast(2); - } - - private: - const T AP; - - virtual std::int32_t N() const { - return static_cast(util::digit_scale() * 1600.0F); - } - }; - - template - class ccoef3_hypergeometric_1f1 : public hypergeometric_pfq_base { - public: - ccoef3_hypergeometric_1f1(const T& a, const T& c, const T& z, const T& w) : - hypergeometric_pfq_base(z, w), AP(a), CP(c) { - } - - virtual ~ccoef3_hypergeometric_1f1() { - } - - virtual void ccoef() const { - // See Luke 1977 page 74. - const std::int32_t N1 = static_cast(this->N() + static_cast(1)); - const std::int32_t N2 = static_cast(this->N() + static_cast(2)); - - // Luke: C ---------- START COMPUTING COEFFICIENTS USING ---------- - // Luke: C ---------- BACKWARD RECURRENCE SCHEME ---------- - // Luke: C - T A3(0); - T A2(0); - T A1(boost::math::tools::root_epsilon()); - - hypergeometric_pfq_base::C.resize(1u, A1); - - std::int32_t X = N1; - std::int32_t X1 = N2; - - T XA = X + AP; - T X3A = (X + 3) - AP; - - const T Z1 = T(4) / hypergeometric_pfq_base::W; - - for (std::int32_t k = static_cast(0); k < N1; ++k) { - --X; - --X1; - --XA; - --X3A; - - const T X3A_over_X2 = X3A / static_cast(X + 2); - - // The terms have been slightly re-arranged resulting in lower complexity. - // Parentheses have been added to avoid reliance on operator precedence. - const T PART1 = A1 * (((X + CP) * Z1) - X3A_over_X2); - const T PART2 = A2 * (Z1 * ((X + 3) - CP) + (XA / X1)); - const T PART3 = A3 * X3A_over_X2; - - const T term = (((PART1 + PART2) + PART3) * X1) / XA; - - hypergeometric_pfq_base::C.push_front(term); - - A3 = A2; - A2 = A1; - A1 = hypergeometric_pfq_base::C.front(); - } - - hypergeometric_pfq_base::C.front() /= static_cast(2); - } - - private: - const T AP; - const T CP; - }; - - template - class ccoef6_hypergeometric_1f2 : public hypergeometric_pfq_base { - public: - ccoef6_hypergeometric_1f2(const T& a, const T& b, const T& c, const T& z, const T& w) : - hypergeometric_pfq_base(z, w), AP(a), BP(b), CP(c) { - } - - virtual ~ccoef6_hypergeometric_1f2() { - } - - virtual void ccoef() const { - // See Luke 1977 page 85. - const std::int32_t N1 = static_cast(this->N() + static_cast(1)); - - // Luke: C ---------- START COMPUTING COEFFICIENTS USING ---------- - // Luke: C ---------- BACKWARD RECURRENCE SCHEME ---------- - // Luke: C - T A4(0); - T A3(0); - T A2(0); - T A1(boost::math::tools::root_epsilon()); - - hypergeometric_pfq_base::C.resize(1u, A1); - - std::int32_t X = N1; - T PP = X + AP; - - const T Z1 = T(4) / hypergeometric_pfq_base::W; - - for (std::int32_t k = static_cast(0); k < N1; ++k) { - --X; - --PP; - - const std::int32_t TWO_X = static_cast(X * 2); - const std::int32_t X_PLUS_1 = static_cast(X + 1); - const std::int32_t X_PLUS_3 = static_cast(X + 3); - const std::int32_t X_PLUS_4 = static_cast(X + 4); - - const T QQ = T(TWO_X + 3) / static_cast(TWO_X + static_cast(5)); - const T SS = (X + BP) * (X + CP); - - // The terms have been slightly re-arranged resulting in lower complexity. - // Parentheses have been added to avoid reliance on operator precedence. - const T PART1 = A1 * (((PP - (QQ * (PP + 1))) * 2) + (SS * Z1)); - const T PART2 = (A2 * (X + 2)) * ((((TWO_X + 1) * PP) / X_PLUS_1) - ((QQ * 4) * (PP + 1)) + - (((TWO_X + 3) * (PP + 2)) / X_PLUS_3) + - ((Z1 * 2) * (SS - (QQ * (X_PLUS_1 + BP)) * (X_PLUS_1 + CP)))); - const T PART3 = A3 * ((((X_PLUS_3 - AP) - (QQ * (X_PLUS_4 - AP))) * 2) + - (((QQ * Z1) * (X_PLUS_4 - BP)) * (X_PLUS_4 - CP))); - const T PART4 = ((A4 * QQ) * (X_PLUS_4 - AP)) / X_PLUS_3; - - const T term = (((PART1 - PART2) + (PART3 - PART4)) * X_PLUS_1) / PP; - - hypergeometric_pfq_base::C.push_front(term); - - A4 = A3; - A3 = A2; - A2 = A1; - A1 = hypergeometric_pfq_base::C.front(); - } - - hypergeometric_pfq_base::C.front() /= static_cast(2); - } - - private: - const T AP; - const T BP; - const T CP; - }; - - template - class ccoef2_hypergeometric_2f1 : public hypergeometric_pfq_base { - public: - ccoef2_hypergeometric_2f1(const T& a, const T& b, const T& c, const T& z, const T& w) : - hypergeometric_pfq_base(z, w), AP(a), BP(b), CP(c) { - } - - virtual ~ccoef2_hypergeometric_2f1() { - } - - virtual void ccoef() const { - // See Luke 1977 page 59. - const std::int32_t N1 = static_cast(N() + static_cast(1)); - const std::int32_t N2 = static_cast(N() + static_cast(2)); - - // Luke: C ---------- START COMPUTING COEFFICIENTS USING ---------- - // Luke: C ---------- BACKWARD RECURRENCE SCHEME ---------- - // Luke: C - T A3(0); - T A2(0); - T A1(boost::math::tools::root_epsilon()); - - hypergeometric_pfq_base::C.resize(1u, A1); - - std::int32_t X = N1; - std::int32_t X1 = N2; - std::int32_t X3 = static_cast((X * 2) + 3); - - T X3A = (X + 3) - AP; - T X3B = (X + 3) - BP; - - const T Z1 = T(4) / hypergeometric_pfq_base::W; - - for (std::int32_t k = static_cast(0); k < N1; ++k) { - --X; - --X1; - --X3A; - --X3B; - X3 -= 2; - - const std::int32_t X_PLUS_2 = static_cast(X + 2); - - const T XAB = T(1) / ((X + AP) * (X + BP)); - - // The terms have been slightly re-arranged resulting in lower complexity. - // Parentheses have been added to avoid reliance on operator precedence. - const T PART1 = (A1 * X1) * (2 - (((AP + X1) * (BP + X1)) * ((T(X3) / X_PLUS_2) * XAB)) + - ((CP + X) * (XAB * Z1))); - const T PART2 = - (A2 * XAB) * ((X3A * X3B) - (X3 * ((X3A + X3B) - 1)) + (((3 - CP) + X) * (X1 * Z1))); - const T PART3 = (A3 * X1) * (X3A / X_PLUS_2) * (X3B * XAB); - - const T term = (PART1 + PART2) - PART3; - - hypergeometric_pfq_base::C.push_front(term); - - A3 = A2; - A2 = A1; - A1 = hypergeometric_pfq_base::C.front(); - } - - hypergeometric_pfq_base::C.front() /= static_cast(2); - } - - private: - const T AP; - const T BP; - const T CP; - - virtual std::int32_t N() const { - return static_cast(util::digit_scale() * 1600.0F); - } - }; - - template - T luke_ccoef4_hypergeometric_0f1(const T& a, const T& x); - template - T luke_ccoef1_hypergeometric_1f0(const T& a, const T& x); - template - T luke_ccoef3_hypergeometric_1f1(const T& a, const T& b, const T& x); - template - T luke_ccoef6_hypergeometric_1f2(const T& a, const T& b, const T& c, const T& x); - template - T luke_ccoef2_hypergeometric_2f1(const T& a, const T& b, const T& c, const T& x); - } // namespace nr_006 -} // namespace examples - -template -T examples::nr_006::luke_ccoef4_hypergeometric_0f1(const T& a, const T& x) { - const ccoef4_hypergeometric_0f1 hypergeometric_0f1_object(a, x, T(-20)); - - hypergeometric_0f1_object.ccoef(); - - return hypergeometric_0f1_object.series(); -} - -template -T examples::nr_006::luke_ccoef1_hypergeometric_1f0(const T& a, const T& x) { - const ccoef1_hypergeometric_1f0 hypergeometric_1f0_object(a, x, T(-20)); - - hypergeometric_1f0_object.ccoef(); - - return hypergeometric_1f0_object.series(); -} - -template -T examples::nr_006::luke_ccoef3_hypergeometric_1f1(const T& a, const T& b, const T& x) { - const ccoef3_hypergeometric_1f1 hypergeometric_1f1_object(a, b, x, T(-20)); - - hypergeometric_1f1_object.ccoef(); - - return hypergeometric_1f1_object.series(); -} - -template -T examples::nr_006::luke_ccoef6_hypergeometric_1f2(const T& a, const T& b, const T& c, const T& x) { - const ccoef6_hypergeometric_1f2 hypergeometric_1f2_object(a, b, c, x, T(-20)); - - hypergeometric_1f2_object.ccoef(); - - return hypergeometric_1f2_object.series(); -} - -template -T examples::nr_006::luke_ccoef2_hypergeometric_2f1(const T& a, const T& b, const T& c, const T& x) { - const ccoef2_hypergeometric_2f1 hypergeometric_2f1_object(a, b, c, x, T(-20)); - - hypergeometric_2f1_object.ccoef(); - - return hypergeometric_2f1_object.series(); -} - -int main() { - stopwatch my_stopwatch; - float total_time = 0.0F; - - std::vector hypergeometric_0f1_results(20U); - std::vector hypergeometric_1f0_results(20U); - std::vector hypergeometric_1f1_results(20U); - std::vector hypergeometric_2f1_results(20U); - std::vector hypergeometric_1f2_results(20U); - - const mp_type a(mp_type(3) / 7); - const mp_type b(mp_type(2) / 3); - const mp_type c(mp_type(1) / 4); - - std::int_least16_t i; - - std::cout << "test hypergeometric_0f1." << std::endl; - i = 1U; - my_stopwatch.reset(); - - // Generate a table of values of Hypergeometric0F1. - // Compare with the Mathematica command: - // Table[N[HypergeometricPFQ[{}, {3/7}, -(i*EulerGamma)], 100], {i, 1, 20, 1}] - std::for_each(hypergeometric_0f1_results.begin(), hypergeometric_0f1_results.end(), [&i, &a](mp_type& new_value) { - const mp_type x(-(boost::math::constants::euler() * i)); - - new_value = examples::nr_006::luke_ccoef4_hypergeometric_0f1(a, x); - - ++i; - }); - - total_time += STD_CHRONO::duration_cast>(my_stopwatch.elapsed()).count(); - - // Print the values of Hypergeometric0F1. - std::for_each(hypergeometric_0f1_results.begin(), hypergeometric_0f1_results.end(), [](const mp_type& h) { - std::cout << std::setprecision(DIGIT_COUNT) << h << std::endl; - }); - - std::cout << "test hypergeometric_1f0." << std::endl; - i = 1U; - my_stopwatch.reset(); - - // Generate a table of values of Hypergeometric1F0. - // Compare with the Mathematica command: - // Table[N[HypergeometricPFQ[{3/7}, {}, -(i*EulerGamma)], 100], {i, 1, 20, 1}] - std::for_each(hypergeometric_1f0_results.begin(), hypergeometric_1f0_results.end(), [&i, &a](mp_type& new_value) { - const mp_type x(-(boost::math::constants::euler() * i)); - - new_value = examples::nr_006::luke_ccoef1_hypergeometric_1f0(a, x); - - ++i; - }); - - total_time += STD_CHRONO::duration_cast>(my_stopwatch.elapsed()).count(); - - // Print the values of Hypergeometric1F0. - std::for_each(hypergeometric_1f0_results.begin(), hypergeometric_1f0_results.end(), [](const mp_type& h) { - std::cout << std::setprecision(DIGIT_COUNT) << h << std::endl; - }); - - std::cout << "test hypergeometric_1f1." << std::endl; - i = 1U; - my_stopwatch.reset(); - - // Generate a table of values of Hypergeometric1F1. - // Compare with the Mathematica command: - // Table[N[HypergeometricPFQ[{3/7}, {2/3}, -(i*EulerGamma)], 100], {i, 1, 20, 1}] - std::for_each( - hypergeometric_1f1_results.begin(), hypergeometric_1f1_results.end(), [&i, &a, &b](mp_type& new_value) { - const mp_type x(-(boost::math::constants::euler() * i)); - - new_value = examples::nr_006::luke_ccoef3_hypergeometric_1f1(a, b, x); - - ++i; - }); - - total_time += STD_CHRONO::duration_cast>(my_stopwatch.elapsed()).count(); - - // Print the values of Hypergeometric1F1. - std::for_each(hypergeometric_1f1_results.begin(), hypergeometric_1f1_results.end(), [](const mp_type& h) { - std::cout << std::setprecision(DIGIT_COUNT) << h << std::endl; - }); - - std::cout << "test hypergeometric_1f2." << std::endl; - i = 1U; - my_stopwatch.reset(); - - // Generate a table of values of Hypergeometric1F2. - // Compare with the Mathematica command: - // Table[N[HypergeometricPFQ[{3/7}, {2/3, 1/4}, -(i*EulerGamma)], 100], {i, 1, 20, 1}] - std::for_each( - hypergeometric_1f2_results.begin(), hypergeometric_1f2_results.end(), [&i, &a, &b, &c](mp_type& new_value) { - const mp_type x(-(boost::math::constants::euler() * i)); - - new_value = examples::nr_006::luke_ccoef6_hypergeometric_1f2(a, b, c, x); - - ++i; - }); - - total_time += STD_CHRONO::duration_cast>(my_stopwatch.elapsed()).count(); - - // Print the values of Hypergeometric1F2. - std::for_each(hypergeometric_1f2_results.begin(), hypergeometric_1f2_results.end(), [](const mp_type& h) { - std::cout << std::setprecision(DIGIT_COUNT) << h << std::endl; - }); - - std::cout << "test hypergeometric_2f1." << std::endl; - i = 1U; - my_stopwatch.reset(); - - // Generate a table of values of Hypergeometric2F1. - // Compare with the Mathematica command: - // Table[N[HypergeometricPFQ[{3/7, 2/3}, {1/4}, -(i * EulerGamma)], 100], {i, 1, 20, 1}] - std::for_each( - hypergeometric_2f1_results.begin(), hypergeometric_2f1_results.end(), [&i, &a, &b, &c](mp_type& new_value) { - const mp_type x(-(boost::math::constants::euler() * i)); - - new_value = examples::nr_006::luke_ccoef2_hypergeometric_2f1(a, b, c, x); - - ++i; - }); - - total_time += STD_CHRONO::duration_cast>(my_stopwatch.elapsed()).count(); - - // Print the values of Hypergeometric2F1. - std::for_each(hypergeometric_2f1_results.begin(), hypergeometric_2f1_results.end(), [](const mp_type& h) { - std::cout << std::setprecision(DIGIT_COUNT) << h << std::endl; - }); - - std::cout << "Total execution time = " << std::setprecision(3) << total_time << "s" << std::endl; -} diff --git a/crypto3/libs/multiprecision/example/integer_examples.cpp b/crypto3/libs/multiprecision/example/integer_examples.cpp deleted file mode 100644 index c347e4355..000000000 --- a/crypto3/libs/multiprecision/example/integer_examples.cpp +++ /dev/null @@ -1,226 +0,0 @@ -/////////////////////////////////////////////////////////////// -// Copyright 2012 John Maddock. Distributed under the Boost -// Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt - -#include -#include -#include -#include - -// Includes Quickbook code snippets as comments. - -//[FAC1 - -/*` -In this simple example, we'll write a routine to print out all of the factorials -which will fit into a 128-bit integer. At the end of the routine we do some -fancy iostream formatting of the results: -*/ -/*= -#include -#include -#include -#include -*/ - -void print_factorials() { - using nil::crypto3::multiprecision::cpp_int; - // - // Print all the factorials that will fit inside a 128-bit integer. - // - // Begin by building a big table of factorials, once we know just how - // large the largest is, we'll be able to "pretty format" the results. - // - // Calculate the largest number that will fit inside 128 bits, we could - // also have used numeric_limits::max() for this value: - cpp_int limit = (cpp_int(1) << 128) - 1; - // - // Our table of values: - std::vector results; - // - // Initial values: - unsigned i = 1; - cpp_int factorial = 1; - // - // Cycle through the factorials till we reach the limit: - while (factorial < limit) { - results.push_back(factorial); - ++i; - factorial *= i; - } - // - // Lets see how many digits the largest factorial was: - unsigned digits = results.back().str().size(); - // - // Now print them out, using right justification, while we're at it - // we'll indicate the limit of each integer type, so begin by defining - // the limits for 16, 32, 64 etc bit integers: - cpp_int limits[] = { - (cpp_int(1) << 16) - 1, - (cpp_int(1) << 32) - 1, - (cpp_int(1) << 64) - 1, - (cpp_int(1) << 128) - 1, - }; - std::string bit_counts[] = {"16", "32", "64", "128"}; - unsigned current_limit = 0; - for (unsigned j = 0; j < results.size(); ++j) { - if (limits[current_limit] < results[j]) { - std::string message = "Limit of " + bit_counts[current_limit] + " bit integers"; - std::cout << std::setfill('.') << std::setw(digits + 1) << std::right << message << std::setfill(' ') - << std::endl; - ++current_limit; - } - std::cout << std::setw(digits + 1) << std::right << results[j] << std::endl; - } -} - -/*` -The output from this routine is: -[pre - 1 - 2 - 6 - 24 - 120 - 720 - 5040 - 40320 -................Limit of 16 bit integers - 362880 - 3628800 - 39916800 - 479001600 -................Limit of 32 bit integers - 6227020800 - 87178291200 - 1307674368000 - 20922789888000 - 355687428096000 - 6402373705728000 - 121645100408832000 - 2432902008176640000 -................Limit of 64 bit integers - 51090942171709440000 - 1124000727777607680000 - 25852016738884976640000 - 620448401733239439360000 - 15511210043330985984000000 - 403291461126605635584000000 - 10888869450418352160768000000 - 304888344611713860501504000000 - 8841761993739701954543616000000 - 265252859812191058636308480000000 - 8222838654177922817725562880000000 - 263130836933693530167218012160000000 - 8683317618811886495518194401280000000 - 295232799039604140847618609643520000000 -] -*/ - -//] - -//[BITOPS - -/*` -In this example we'll show how individual bits within an integer may be manipulated, -we'll start with an often needed calculation of ['2[super n] - 1], which we could obviously -implement like this: -*/ - -using nil::crypto3::multiprecision::cpp_int; - -cpp_int b1(unsigned n) { - cpp_int r(1); - return (r << n) - 1; -} - -/*` -Calling: - - std::cout << std::hex << std::showbase << b1(200) << std::endl; - -Yields as expected: - -[pre 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF] - -However, we could equally just set the n'th bit in the result, like this: -*/ - -cpp_int b2(unsigned n) { - cpp_int r(0); - return --bit_set(r, n); -} - -/*` -Note how the `bit_set` function sets the specified bit in its argument and then returns a reference to the result - -which we can then simply decrement. The result from a call to `b2` is the same as that to `b1`. - -We can equally test bits, so for example the n'th bit of the result returned from `b2` shouldn't be set -unless we increment it first: - - BOOST_ASSERT(!bit_test(b1(200), 200)); // OK - BOOST_ASSERT(bit_test(++b1(200), 200)); // OK - -And of course if we flip the n'th bit after increment, then we should get back to zero: - - BOOST_ASSERT(!bit_flip(++b1(200), 200)); // OK -*/ - -//] - -int main() { - print_factorials(); - - std::cout << std::hex << std::showbase << b1(200) << std::endl; - std::cout << std::hex << std::showbase << b2(200) << std::endl; - BOOST_ASSERT(!bit_test(b1(200), 200)); // OK - BOOST_ASSERT(bit_test(++b1(200), 200)); // OK - BOOST_ASSERT(!bit_flip(++b1(200), 200)); // OK - return 0; -} - -/* - -Program output: - - 1 - 2 - 6 - 24 - 120 - 720 - 5040 - 40320 -................Limit of 16 bit integers - 362880 - 3628800 - 39916800 - 479001600 -................Limit of 32 bit integers - 6227020800 - 87178291200 - 1307674368000 - 20922789888000 - 355687428096000 - 6402373705728000 - 121645100408832000 - 2432902008176640000 -................Limit of 64 bit integers - 51090942171709440000 - 1124000727777607680000 - 25852016738884976640000 - 620448401733239439360000 - 15511210043330985984000000 - 403291461126605635584000000 - 10888869450418352160768000000 - 304888344611713860501504000000 - 8841761993739701954543616000000 - 265252859812191058636308480000000 - 8222838654177922817725562880000000 - 263130836933693530167218012160000000 - 8683317618811886495518194401280000000 - 295232799039604140847618609643520000000 - 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - */ diff --git a/crypto3/libs/multiprecision/example/logged_adaptor.cpp b/crypto3/libs/multiprecision/example/logged_adaptor.cpp deleted file mode 100644 index 2ef069f08..000000000 --- a/crypto3/libs/multiprecision/example/logged_adaptor.cpp +++ /dev/null @@ -1,118 +0,0 @@ -/////////////////////////////////////////////////////////////// -// Copyright 2013 John Maddock. Distributed under the Boost -// Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt - -//[logged_adaptor - -#include -#include -#include -#include -// -// Begin by overloading log_postfix_event so we can capture each arithmetic event as it happens: -// -namespace nil { - namespace crypto3 { - namespace multiprecision { - - template - inline void log_postfix_event(const mpfi_float_backend& val, const char* event_description) { - // Print out the (relative) diameter of the interval: - using namespace nil::crypto3::multiprecision; - number> diam; - mpfi_diam(diam.backend().data(), val.data()); - std::cout << "Diameter was " << diam << " after operation: " << event_description << std::endl; - } - template - inline void log_postfix_event(const mpfi_float_backend&, const T&, const char* event_description) { - // This version is never called in this example. - } - - } // namespace multiprecision - } // namespace crypto3 -} // namespace nil - -int main() { - using namespace nil::crypto3::multiprecision; - typedef number>> logged_type; - // - // Test case deliberately introduces cancellation error, relative size of interval - // gradually gets larger after each operation: - // - logged_type a = 1; - a /= 10; - - for (unsigned i = 0; i < 13; ++i) { - logged_type b = a * 9; - b /= 10; - a -= b; - } - std::cout << "Final value was: " << a << std::endl; - return 0; -} - -//] - -/* -//[logged_adaptor_output - -Diameter was nan after operation: Default construct -Diameter was 0 after operation: Assignment from arithmetic type -Diameter was 4.33681e-18 after operation: /= -Diameter was nan after operation: Default construct -Diameter was 7.70988e-18 after operation: * -Diameter was 9.63735e-18 after operation: /= -Diameter was 1.30104e-16 after operation: -= -Diameter was nan after operation: Default construct -Diameter was 1.30104e-16 after operation: * -Diameter was 1.38537e-16 after operation: /= -Diameter was 2.54788e-15 after operation: -= -Diameter was nan after operation: Default construct -Diameter was 2.54788e-15 after operation: * -Diameter was 2.54863e-15 after operation: /= -Diameter was 4.84164e-14 after operation: -= -Diameter was nan after operation: Default construct -Diameter was 4.84164e-14 after operation: * -Diameter was 4.84221e-14 after operation: /= -Diameter was 9.19962e-13 after operation: -= -Diameter was nan after operation: Default construct -Diameter was 9.19962e-13 after operation: * -Diameter was 9.19966e-13 after operation: /= -Diameter was 1.74793e-11 after operation: -= -Diameter was nan after operation: Default construct -Diameter was 1.74793e-11 after operation: * -Diameter was 1.74793e-11 after operation: /= -Diameter was 3.32107e-10 after operation: -= -Diameter was nan after operation: Default construct -Diameter was 3.32107e-10 after operation: * -Diameter was 3.32107e-10 after operation: /= -Diameter was 6.31003e-09 after operation: -= -Diameter was nan after operation: Default construct -Diameter was 6.31003e-09 after operation: * -Diameter was 6.31003e-09 after operation: /= -Diameter was 1.19891e-07 after operation: -= -Diameter was nan after operation: Default construct -Diameter was 1.19891e-07 after operation: * -Diameter was 1.19891e-07 after operation: /= -Diameter was 2.27792e-06 after operation: -= -Diameter was nan after operation: Default construct -Diameter was 2.27792e-06 after operation: * -Diameter was 2.27792e-06 after operation: /= -Diameter was 4.32805e-05 after operation: -= -Diameter was nan after operation: Default construct -Diameter was 4.32805e-05 after operation: * -Diameter was 4.32805e-05 after operation: /= -Diameter was 0.00082233 after operation: -= -Diameter was nan after operation: Default construct -Diameter was 0.00082233 after operation: * -Diameter was 0.00082233 after operation: /= -Diameter was 0.0156243 after operation: -= -Diameter was nan after operation: Default construct -Diameter was 0.0156243 after operation: * -Diameter was 0.0156243 after operation: /= -Diameter was 0.296861 after operation: -= -Final value was: {8.51569e-15,1.14843e-14} - -//] -*/ diff --git a/crypto3/libs/multiprecision/example/mixed_integer_arithmetic.cpp b/crypto3/libs/multiprecision/example/mixed_integer_arithmetic.cpp deleted file mode 100644 index 061f7651e..000000000 --- a/crypto3/libs/multiprecision/example/mixed_integer_arithmetic.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/////////////////////////////////////////////////////////////// -// Copyright 2012 John Maddock. Distributed under the Boost -// Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt - -// -// Compare arithmetic results using fixed_int to GMP results. -// - -#ifdef _MSC_VER -# define _SCL_SECURE_NO_WARNINGS -#endif - -//[mixed_eg -#include - -int main() -{ - using namespace nil::crypto3::multiprecision; - - boost::uint64_t i = (std::numeric_limits::max)(); - boost::uint64_t j = 1; - - uint128_modular_t ui128; - uint256_t ui256; - // - // Start by performing arithmetic on 64-bit integers to yield 128-bit results: - // - std::cout << std::hex << std::showbase << i << std::endl; - std::cout << std::hex << std::showbase << add(ui128, i, j) << std::endl; - std::cout << std::hex << std::showbase << multiply(ui128, i, i) << std::endl; - // - // The try squaring a 128-bit integer to yield a 256-bit result: - // - ui128 = (std::numeric_limits::max)(); - std::cout << std::hex << std::showbase << multiply(ui256, ui128, ui128) << std::endl; - - return 0; -} -//] - -/* - -Program output: - -//[mixed_output - -0xffffffffffffffff -0x10000000000000000 -0xFFFFFFFFFFFFFFFE0000000000000001 -0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00000000000000000000000000000001 - -//] -*/ - diff --git a/crypto3/libs/multiprecision/example/modular_examples.cpp b/crypto3/libs/multiprecision/example/modular_examples.cpp deleted file mode 100644 index 5f8c0b661..000000000 --- a/crypto3/libs/multiprecision/example/modular_examples.cpp +++ /dev/null @@ -1,86 +0,0 @@ -//---------------------------------------------------------------------------// -// Copyright (c) 2020 Mikhail Komarov -// Copyright (c) 2019 Alexey Moskvin -// -// Distributed under the Boost Software License, Version 1.0 -// See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt -//---------------------------------------------------------------------------// - -//[cpp_modular_eg -#include -#include - -template -void modular_number_examples() -{ - std::cout << "Pre-calculation parameters for module: " << std::endl; - Params mod(7); - std::cout << "Value mod: " << mod << std::endl; - Modular a(4, 7), b(4, mod), c(9, mod), d(3, 4); - std::cout << "Initialization a equal b: " << (a == b) << std::endl; - std::cout << "Value a: " << a << std::endl; - std::cout << "Value b: " << b << std::endl; - std::cout << "Value c: " << c << std::endl; - - std::cout << "Some base function: " << std::endl; - std::cout << "Add a and b: " << a + b << std::endl; - std::cout << "Sub a and b: " << a - b << std::endl; - std::cout << "Sub c and a ((-y mod x) equal ((x-y) mod x): " << c - a << std::endl; - std::cout << "Multiply a and b: " << a * b << std::endl; - std::cout << "Divide a and b: " << a / b << std::endl; - std::cout << "Module a % b: " << a % b << std::endl; - - std::cout << "Some bitwise function: " << std::endl; - std::cout << "a and b: " << (a & b) << std::endl; - std::cout << "a xor b: " << (a ^ b) << std::endl; - std::cout << "a or b: " << (a | b) << std::endl; - - std::cout << "Pow function: " << std::endl; - std::cout << "Pow a^b: " << pow(a, b) << std::endl; - - // bls12_381 fr module used - Modular a1("0", "52435875175126190479447740508185965837690552500527637822603658699938581184513"), - s("5357548122352420230771103151484263264414796060802659492954687376906409358208", "52435875175126190479447740508185965837690552500527637822603658699938581184513"), - m_0_3("19672780149918614047617769345191063120834477401880138532514365439455403320407", "52435875175126190479447740508185965837690552500527637822603658699938581184513"), - b1("23676453812739116229745200103713259707623838255070610943572937899456163562296", "52435875175126190479447740508185965837690552500527637822603658699938581184513"); - std::cout << a1 << std::endl; - std::cout << s << std::endl; - std::cout << m_0_3 << std::endl; - std::cout << (s * m_0_3) << std::endl; - std::cout << (a1 - s * m_0_3) << std::endl; - std::cout << (a1 - b1) << std::endl; -} - -int main() -{ - modular_number_examples(); - return 0; -} - -//] - -/* - -//[modular_out -Pre-calculation parameters for module: -Value mod: 7 -Initialization a equal b: 1 -Value a: 4 -Value b: 4 -Value c: 2 -Some base function: -Add a and b: 1 -Sub a and b: 0 -Sub c and a ((-y mod x) equal ((x-y) mod x): 5 -Multiply a and b: 2 -Divide a and b: 1 -Module a % b: 0 -Some bitwise function: -a and b: 4 -a xor b: 0 -a or b: 4 -Pow function: -Pow a^b: 4 -//] -*/ diff --git a/crypto3/libs/multiprecision/example/numeric_limits_snips.cpp b/crypto3/libs/multiprecision/example/numeric_limits_snips.cpp deleted file mode 100644 index 93833d630..000000000 --- a/crypto3/libs/multiprecision/example/numeric_limits_snips.cpp +++ /dev/null @@ -1,471 +0,0 @@ -// Copyright Paul A. Bristow 2013 -// Copyright John Maddock 2013 -// Copyright Christopher Kormanyos - -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt -// or copy at http://www.boost.org/LICENSE_1_0.txt) - -// Examples of std::numeric_limits usage as snippets for multiprecision documentation at multiprecision.qbk. - -// Includes text as Quickbook comments. - -#include - -#include -#include - -#include -#include -#include - -#include // is decimal. -#include // is binary. - -#define BOOST_TEST_MAIN -#include // Boost.Test -#include - -#include -#include -#include -#include -#include // numeric_limits -#include -#include - -// static long double const log10Two = 0.30102999566398119521373889472449L; // log10(2.) -// It is more portable useful to use a Boost macro -// See https://www.boost.org/doc/libs/release/libs/config/doc/html/boost_config/boost_macro_reference.html -BOOST_STATIC_CONSTEXPR long double log10Two = 0.30102999566398119521373889472449L; -// which expands to static constexpr on standard C++11 and up, but static const on earlier versions. - -/*`By default, output would only show the standard 6 decimal digits, -so set precision to show all 50 significant digits, including any trailing zeros. -This is generally useful to show the implicit precision of the type of the value. -*/ - -template -int max_digits10() { - int significand_digits = std::numeric_limits::digits; - // BOOST_CONSTEXPR_OR_CONST int significand_digits = std::numeric_limits::digits; - return static_cast(ceil(1 + significand_digits * log10Two)); -} // template int max_digits10() - -// Used to test max_digits10<>() function below. -//#define BOOST_NO_CXX11_NUMERIC_LIMITS - -BOOST_AUTO_TEST_CASE(test_numeric_limits_snips) { -#if !(defined(CI_SUPPRESS_KNOWN_ISSUES) && defined(BOOST_MSVC) && (BOOST_MSVC == 1600)) - try { - - // Example of portable way to get `std::numeric_limits::max_digits10`. - //[max_digits10_1 - - /*`For example, to be portable (including obselete platforms) for type `T` where `T` may be: - `float`, `double`, `long double`, `128-bit quad type`, `cpp_bin_float_50` ... - */ - - typedef float T; - -#if defined BOOST_NO_CXX11_NUMERIC_LIMITS - // No max_digits10 implemented. - std::cout.precision(max_digits10()); -#else -#if (_MSC_VER <= 1600) - // The MSVC 2010 version had the wrong value for std::numeric_limits::max_digits10. - std::cout.precision(max_digits10()); -#else // Use the C++11 max_digits10. - std::cout.precision(std::numeric_limits::max_digits10); - std::cout.precision(std::numeric_limits::digits10); - std::cout.setf(std::ios_base::showpoint); // Append any trailing zeros, - // or more memorably - std::cout << std::showpoint << std::endl; // -#endif -#endif - - std::cout << "std::cout.precision(max_digits10) = " << std::cout.precision() << std::endl; // 9 - - double x = 1.2345678901234567889; - - std::cout << "x = " << x << std::endl; // - - /*`which should output: - - std::cout.precision(max_digits10) = 9 - x = 1.23456789 - */ - - //] [/max_digits10_1] - - { - //[max_digits10_2 - - double write = 2. / 3; // Any arbitrary value that cannot be represented exactly. - double read = 0; - std::stringstream s; - s.precision(std::numeric_limits::digits10); // or `float64_t` for 64-bit IEE754 double. - s << write; - s >> read; - if (read != write) { - std::cout << std::setprecision(std::numeric_limits::digits10) << read << " != " << write - << std::endl; - } - - //] [/max_digits10_2] - // 0.666666666666667 != 0.666666666666667 - } - - { - //[max_digits10_3 - - double pi = boost::math::double_constants::pi; - std::cout.precision(std::numeric_limits::max_digits10); - std::cout << pi << std::endl; // 3.1415926535897931 - - //] [/max_digits10_3] - } - { - //[max_digits10_4 - /*`and similarly for a much higher precision type: - */ - - using namespace nil::crypto3::multiprecision; - - typedef number> cpp_dec_float_50; // 50 decimal digits. - - // or using nil::crypto3::multiprecision::cpp_dec_float_50; - - cpp_dec_float_50 pi = boost::math::constants::pi(); - std::cout.precision(std::numeric_limits::max_digits10); - std::cout << pi << std::endl; - // 3.141592653589793238462643383279502884197169399375105820974944592307816406 - //] [/max_digits10_4] - } - - { - //[max_digits10_5 - - for (int i = 2; i < 15; i++) { - std::cout << std::setw(std::numeric_limits::max_digits10) << boost::math::factorial(i) - << std::endl; - } - - //] [/max_digits10_5] - } - - } catch (const std::exception& ex) { - std::cout << "Caught Exception " << ex.what() << std::endl; - } - - { - //[max_digits10_6 - - typedef double T; - - bool denorm = std::numeric_limits::denorm_min() < (std::numeric_limits::min)(); - BOOST_ASSERT(denorm); - - //] [/max_digits10_6] - } - - { - unsigned char c = 255; - std::cout << "char c = " << (int)c << std::endl; - } - - { - //[digits10_1 - std::cout << std::setw(std::numeric_limits::digits10 + 1 + 1) // digits10+1, and +1 for sign. - << std::showpos << (std::numeric_limits::max)() // +32767 - << std::endl - << std::setw(std::numeric_limits::digits10 + 1 + 1) << (std::numeric_limits::min)() - << std::endl; // -32767 - //] [/digits10_1] - } - - { - //[digits10_2 - std::cout << std::setw(std::numeric_limits::digits10 + 1 + 1) // digits10+1, and +1 for sign. - << std::showpos << (std::numeric_limits::max)() // 65535 - << std::endl - << std::setw(std::numeric_limits::digits10 + 1 + 1) // digits10+1, and +1 for sign. - << (std::numeric_limits::min)() << std::endl; // 0 - //] [/digits10_2] - } - - std::cout << std::noshowpos << std::endl; - - { - //[digits10_3 - std::cout.precision(std::numeric_limits::max_digits10); - double d = 1e15; - double dp1 = d + 1; - std::cout << d << "\n" << dp1 << std::endl; - // 1000000000000000 - // 1000000000000001 - std::cout << dp1 - d << std::endl; // 1 - //] [/digits10_3] - } - - { - //[digits10_4 - std::cout.precision(std::numeric_limits::max_digits10); - double d = 1e16; - double dp1 = d + 1; - std::cout << d << "\n" << dp1 << std::endl; - // 10000000000000000 - // 10000000000000000 - std::cout << dp1 - d << std::endl; // 0 !!! - //] [/digits10_4] - } - - { - //[epsilon_1 - std::cout.precision(std::numeric_limits::max_digits10); - double d = 1.; - double eps = std::numeric_limits::epsilon(); - double dpeps = d + eps; - std::cout << std::showpoint // Ensure all trailing zeros are shown. - << d << "\n" // 1.0000000000000000 - << dpeps << std::endl; // 2.2204460492503131e-016 - std::cout << dpeps - d // 1.0000000000000002 - << std::endl; - //] [epsilon_1] - } - - { - //[epsilon_2 - double one = 1.; - double nad = boost::math::float_next(one); - std::cout << nad << "\n" // 1.0000000000000002 - << nad - one // 2.2204460492503131e-016 - << std::endl; - //] [epsilon_2] - } - { - //[epsilon_3 - std::cout.precision(std::numeric_limits::max_digits10); - double d = 1.; - double eps = std::numeric_limits::epsilon(); - double dpeps = d + eps / 2; - - std::cout << std::showpoint // Ensure all trailing zeros are shown. - << dpeps << "\n" // 1.0000000000000000 - << eps / 2 << std::endl; // 1.1102230246251565e-016 - std::cout << dpeps - d // 0.00000000000000000 - << std::endl; - //] [epsilon_3] - } - - { - typedef double RealType; - //[epsilon_4 - /*`A tolerance might be defined using this version of epsilon thus: - */ - RealType tolerance = boost::math::tools::epsilon() * 2; - //] [epsilon_4] - (void)tolerance; // warning suppression - } - - { - bool b = - //[digits10_5 - -(std::numeric_limits::max)() == std::numeric_limits::lowest(); - //] [/digits10_5] - (void)b; // warning suppression - } - - { - //[denorm_min_1 - std::cout.precision(std::numeric_limits::max_digits10); - if (std::numeric_limits::has_denorm == std::denorm_present) { - double d = std::numeric_limits::denorm_min(); - - std::cout << d << std::endl; // 4.9406564584124654e-324 - - int exponent; - - double significand = frexp(d, &exponent); - std::cout << "exponent = " << std::hex << exponent << std::endl; // fffffbcf - std::cout << "significand = " << std::hex << significand << std::endl; // 0.50000000000000000 - } else { - std::cout << "No denormalization. " << std::endl; - } - //] [denorm_min_1] - } - - { - //[round_error_1 - double round_err = std::numeric_limits::epsilon() // 2.2204460492503131e-016 - * std::numeric_limits::round_error(); // 1/2 - std::cout << round_err << std::endl; // 1.1102230246251565e-016 - //] [/round_error_1] - } - - { - typedef double T; - //[tolerance_1 - /*`For example, if we want a tolerance that might suit about 9 arithmetical operations, - say sqrt(9) = 3, we could define: - */ - - T tolerance = 3 * std::numeric_limits::epsilon(); - - /*`This is very widely used in Boost.Math testing - with Boost.Test's macro `BOOST_CHECK_CLOSE_FRACTION` - */ - - T expected = 1.0; - T calculated = 1.0 + std::numeric_limits::epsilon(); - - BOOST_CHECK_CLOSE_FRACTION(expected, calculated, tolerance); - - //] [/tolerance_1] - } - -#if !(defined(CI_SUPPRESS_KNOWN_ISSUES) && defined(__GNUC__) && defined(_WIN32)) - { - //[tolerance_2 - - using nil::crypto3::multiprecision::cpp_dec_float; - using nil::crypto3::multiprecision::et_off; - using nil::crypto3::multiprecision::number; - - typedef number, et_off> cpp_dec_float_50; // 50 decimal digits. - /*`[note that Boost.Test does not yet allow floating-point comparisons with expression templates on, - so the default expression template parameter has been replaced by `et_off`.] - */ - - cpp_dec_float_50 tolerance = 3 * std::numeric_limits::epsilon(); - cpp_dec_float_50 expected = boost::math::constants::two_pi(); - cpp_dec_float_50 calculated = 2 * boost::math::constants::pi(); - - BOOST_CHECK_CLOSE_FRACTION(expected, calculated, tolerance); - - //] [/tolerance_2] - } - - { - //[tolerance_3 - - using nil::crypto3::multiprecision::cpp_bin_float_quad; - - cpp_bin_float_quad tolerance = 3 * std::numeric_limits::epsilon(); - cpp_bin_float_quad expected = boost::math::constants::two_pi(); - cpp_bin_float_quad calculated = 2 * boost::math::constants::pi(); - - BOOST_CHECK_CLOSE_FRACTION(expected, calculated, tolerance); - - //] [/tolerance_3] - } - - { - //[tolerance_4 - - using nil::crypto3::multiprecision::cpp_bin_float_oct; - - cpp_bin_float_oct tolerance = 3 * std::numeric_limits::epsilon(); - cpp_bin_float_oct expected = boost::math::constants::two_pi(); - cpp_bin_float_oct calculated = 2 * boost::math::constants::pi(); - - BOOST_CHECK_CLOSE_FRACTION(expected, calculated, tolerance); - - //] [/tolerance_4] - } - - { - //[nan_1] - - /*`NaN can be used with binary multiprecision types like `cpp_bin_float_quad`: - */ - using nil::crypto3::multiprecision::cpp_bin_float_quad; - - if (std::numeric_limits::has_quiet_NaN == true) { - cpp_bin_float_quad NaN = std::numeric_limits::quiet_NaN(); - std::cout << "cpp_bin_float_quad NaN is " << NaN << std::endl; // cpp_bin_float_quad NaN is nan - - cpp_bin_float_quad expected = NaN; - cpp_bin_float_quad calculated = 2 * NaN; - // Comparisons of NaN's always fail: - bool b = expected == calculated; - std::cout << b << std::endl; - BOOST_CHECK_NE(expected, expected); - BOOST_CHECK_NE(expected, calculated); - } else { - std::cout << "Type " << typeid(cpp_bin_float_quad).name() << " does not have NaNs!" << std::endl; - } - - //] [/nan_1] - } - - { - //[facet_1] - - /*` - See [@boost:/libs/math/example/nonfinite_facet_sstream.cpp] - and we also need - - #include - - Then we can equally well use a multiprecision type cpp_bin_float_quad: - - */ - using nil::crypto3::multiprecision::cpp_bin_float_quad; - - typedef cpp_bin_float_quad T; - - using boost::math::nonfinite_num_get; - using boost::math::nonfinite_num_put; - { - std::locale old_locale; - std::locale tmp_locale(old_locale, new nonfinite_num_put); - std::locale new_locale(tmp_locale, new nonfinite_num_get); - std::stringstream ss; - ss.imbue(new_locale); - T inf = std::numeric_limits::infinity(); - ss << inf; // Write out. - BOOST_ASSERT(ss.str() == "inf"); - T r; - ss >> r; // Read back in. - BOOST_ASSERT(inf == r); // Confirms that the floating-point values really are identical. - std::cout << "infinity output was " << ss.str() << std::endl; - std::cout << "infinity input was " << r << std::endl; - } - - /*` - `` - infinity output was inf - infinity input was inf - `` - Similarly we can do the same with NaN (except that we cannot use `assert` (because any comparisons with NaN - always return false). - */ - { - std::locale old_locale; - std::locale tmp_locale(old_locale, new nonfinite_num_put); - std::locale new_locale(tmp_locale, new nonfinite_num_get); - std::stringstream ss; - ss.imbue(new_locale); - T n; - T NaN = std::numeric_limits::quiet_NaN(); - ss << NaN; // Write out. - BOOST_ASSERT(ss.str() == "nan"); - std::cout << "NaN output was " << ss.str() << std::endl; - ss >> n; // Read back in. - std::cout << "NaN input was " << n << std::endl; - } - /*` - `` - NaN output was nan - NaN input was nan - `` - */ - //] [/facet_1] - } - -#endif -#endif -} // BOOST_AUTO_TEST_CASE(test_numeric_limits_snips) - diff --git a/crypto3/libs/multiprecision/example/random_snips.cpp b/crypto3/libs/multiprecision/example/random_snips.cpp deleted file mode 100644 index 42edb9708..000000000 --- a/crypto3/libs/multiprecision/example/random_snips.cpp +++ /dev/null @@ -1,310 +0,0 @@ -/////////////////////////////////////////////////////////////// -// Copyright 2011 John Maddock. Distributed under the Boost -// Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt - -#include -#include -#include -#include -#include -#include - -void t1() { - //[random_eg1 - //=#include - //=#include - //= - //=int main() - //={ - using namespace nil::crypto3::multiprecision; - using namespace boost::random; - - // - // Declare our random number generator type, the underlying generator - // is the Mersenne twister mt19937 engine, and we'll generate 256 bit - // random values, independent_bits_engine will make multiple calls - // to the underlying engine until we have the requested number of bits: - // - typedef independent_bits_engine generator_type; - generator_type gen; - // - // Generate some values: - // - std::cout << std::hex << std::showbase; - for (unsigned i = 0; i < 10; ++i) - std::cout << gen() << std::endl; - // - // Alternatively if we wish to generate random values in a fixed-precision - // type, then we must use an unsigned type in order to adhere to the - // conceptual requirements of the generator: - // - typedef independent_bits_engine generator512_type; - generator512_type gen512; - // - // Generate some 1024-bit unsigned values: - // - std::cout << std::hex << std::showbase; - for (unsigned i = 0; i < 10; ++i) - std::cout << gen512() << std::endl; - //= return 0; - //=} - //] -} - -// -// Output from t1() is: -//[random_eg1_out -/*`[pre -0xD091BB5C22AE9EF6E7E1FAEED5C31F792082352CF807B7DFE9D300053895AFE1 -0xA1E24BBA4EE4092B18F868638C16A625474BA8C43039CD1A8C006D5FFE2D7810 -0xF51F2AE7FF1816E4F702EF59F7BADAFA285954A1B9D09511F878C4B3FB2A0137 -0xF508E4AA1C1FE6527C419418CC50AA59CCDF2E5C4C0A1F3B2452A9DC01397D8D -0x6BF88C311CCA797AEA6DA4AEA3C78807CACE1969E0E0D4ADF5A14BAB80F00988 -0xA7DE9F4CCC450CBA0924668F5C7DC380D96089C53640AC4CEF1A2E6DAE6D9426 -0xADC1965B6613BA46C1FB41C2BD9B0ECDBE3DEDFC7989C8EE6468FD6E6C0DF032 -0xA7CD66342C826D8B2BD2E4124D4A2DBEB4BF6FA7CC1A89590826328251097330 -0x46E46CB0DF577EC20BD1E364262C556418DDA0C9FE7B45D9D2CE21C9D268409A -0xB1E049E1200BFA47512D6E73C3851EEEF341C0817D973E4808D17554A9E20D28 -0xD091BB5C22AE9EF6E7E1FAEED5C31F792082352CF807B7DFE9D300053895AFE1A1E24BBA4EE4092B18F868638C16A625474BA8C43039CD1A8C006D5FFE2D7810 -0xF51F2AE7FF1816E4F702EF59F7BADAFA285954A1B9D09511F878C4B3FB2A0137F508E4AA1C1FE6527C419418CC50AA59CCDF2E5C4C0A1F3B2452A9DC01397D8D -0x6BF88C311CCA797AEA6DA4AEA3C78807CACE1969E0E0D4ADF5A14BAB80F00988A7DE9F4CCC450CBA0924668F5C7DC380D96089C53640AC4CEF1A2E6DAE6D9426 -0xADC1965B6613BA46C1FB41C2BD9B0ECDBE3DEDFC7989C8EE6468FD6E6C0DF032A7CD66342C826D8B2BD2E4124D4A2DBEB4BF6FA7CC1A89590826328251097330 -0x46E46CB0DF577EC20BD1E364262C556418DDA0C9FE7B45D9D2CE21C9D268409AB1E049E1200BFA47512D6E73C3851EEEF341C0817D973E4808D17554A9E20D28 -0x70518CE6203AC30361ADD0AB35D0430CC3F8E8920D1C8509CB92388E095436BF2FD6E20868A29AF97D61330B753EC6FC7211EFEA7CD15133A574C4FFCB41F198 -0xB598EEF6EBBE7347C1332568CEBA5A7046A99459B4AD9F11AE00FEAA00B8B573A7B480B6B5F0B06C29A0EC27A4DAA0101E76A1C574BE91337F94C950C61F6ED6 -0xF5B1C7A192E195F8572384D4E0732C8895D41B68CEE496C3394BBD52048CD47CC05309BED23D2D63414DE9C5D2229F23818666A3F0A8B109B2F6B12769A48341 -0xE4123C566C548C8FF5941F6194B993AA8C1651342876763C237CE42EC300D11B263821CA3AEB820241EC0F84CF4AC36DD7393EE6FD0FC06A4118A30A551B54A4 -0xD074F86F4CC1C54A3E57A70303774CDAEDE43895379CE62759988939E8490DDC325410E1D9352F6A4047080AF47C081D9DB51A85C765D71F79297527FCCA2773 -] -*/ -//] - -void t2() { - std::cout << std::dec; - //[random_eg2 - //=#include - //=#include - //= - //=int main() - //={ - using namespace nil::crypto3::multiprecision; - using namespace boost::random; - - // - // Generate integers in a given range using uniform_int, - // the underlying generator is invoked multiple times - // to generate enough bits: - // - mt19937 mt; - uniform_int_distribution ui(-(cpp_int(1) << 256), cpp_int(1) << 256); - // - // Generate the numbers: - // - for (unsigned i = 0; i < 10; ++i) - std::cout << ui(mt) << std::endl; - - //= return 0; - //=} - //] -} -//[random_eg2_out -/*` -Program output is - -[pre -25593993629538149833210527544371584707508847463356155903670894544241785158492 -12721121657520147247744796431842326146296294180809160027132416389225539366745 -106034929479008809862776424170460808190085984129117168803272987114325199071833 -86048861429530654936263414134573980939351899046345384016090167510299251354700 --23473382144925885755951447143660880642389842563343761080591177733698450031250 -76840269649240973945508128641415259490679375154523618053296924666747244530145 -21638369166612496703991271955994563624044383325105383029306009417224944272131 -18829152205014764576551421737727569993966577957447887116062495161081023584880 -101521572847669971701030312596819435590097618913255156117898217707115132658117 --97490271301923067621481012355971422109456300816856752380346627103308328292057 -] -*/ -//] - -void t3() { - //[random_eg3 - //=#include - //=#include - //= - //=int main() - //={ - using namespace nil::crypto3::multiprecision; - using namespace boost::random; - - mt19937 gen; - // - // Generate the values: - // - std::cout << std::setprecision(50); - for (unsigned i = 0; i < 20; ++i) - std::cout << generate_canonical::digits>(gen) - << std::endl; - //= return 0; - //=} - //] -} - -//[random_eg3_out -/*` -Which produces the following output: - -[pre -0.96886777112423135248554451482797431507115448261086 -0.54722059636785192454525760726084778627750790023546 -0.99646132554800874317788284808573062871409279729804 -0.98110969177693891782396443737643892769773768718591 -0.29702944955795083040856753579705872634075574515969 -0.63976335709815275010379796044374742646738557798647 -0.79792861516022605265555700991255998690336456180995 -0.68135953856026596523755400091345037778580909233387 -0.47475868061723477935404326837783394169122045199915 -0.30191312687731969398296589840622989141067852863748 -0.87242882006730022427155209451091472382531795659709 -0.82190326480741096300318873712966555706035846579562 -0.49058903962146072778707295967429263659897501512813 -0.2102090745190061764133345429475530760261103345204 -0.4087311609617603484960794513055502599728804206333 -0.79397497154919267900450180642484943996546102712187 -0.70577425166871982574205252142383800792823003687121 -0.64396095652194035523385641523010248768636064728226 -0.5737546665965914620678634509134819579811035412969 -0.017773895576552474810236796736785695789752666554273 -] -*/ -//] - -void t4() { - std::cout << std::endl; - //[random_eg4 - //=#include - //=#include - //=#include - //= - //=int main() - //={ - using namespace nil::crypto3::multiprecision; - using namespace boost::random; - // - // Generate some distruted values: - // - uniform_real_distribution ur(-20, 20); - gamma_distribution gd(20); - independent_bits_engine::digits, cpp_int> gen; - // - // Generate some values: - // - std::cout << std::setprecision(50); - for (unsigned i = 0; i < 20; ++i) - std::cout << ur(gen) << std::endl; - for (unsigned i = 0; i < 20; ++i) - std::cout << gd(gen) << std::endl; - //= return 0; - //=} - //] -} - -//[random_eg4_out -/*` -Which produces the following output: - -[pre --18.576837157065858312137736538355805944098004018928 -4.5605477000094480453928920098152026546185388161216 --1.7611402252150150370944527411235180945558276280598 --2.471338289511354190492328039842914272146783953149 --7.4131520453411321647183692139916357315276121488316 --9.192739117661751364518299455475684051782402347659 -7.0126880787149555595443325648941661436898526919013 -2.8554749162054097111723076181877881960039268668423 -14.390501287552165467965587841551705310012046701036 --8.9747073123748752412086051960748002945548570524149 --8.1305063133718605220959174700954037986278348616362 -9.5496899464463627949564295930962040525540578754312 --15.309681742947663333436391348699943078942921692008 -2.0454914298189175280771944784358385982869708951824 --10.069253024538932382193363493367304983742246396276 -13.449212808583153116670057807764145176004060370818 --6.0065092542772507561228141992257782449634820245355 -15.00971466974838379824678369267201922989930663822 -16.158514812070905438581736305533045434508525979205 --2.1531361299576399413547008719541457739794964378093 -19.398278792113040046930806838893737245011219380822 -12.965216582396067073600685365545292876001524716225 -19.561779374349650983983836397553672788578622096947 -15.982213641588944604037715576313848977716540941271 -23.96044616946856385664151481695038833903083043492 -21.054716943622792848187523422423642819628010070375 -18.596078774135209530930707331338838805575875990091 -19.539530839287848627426769425090194390388333335812 -17.176133236359396942946640290935498641489373354297 -16.228802394876800099035133760539461530246286999827 -23.63807160907473465631049083277558060813997674519 -12.838499607321990428122225501321564153572478845401 -16.878362445712403300584931374939967549572637230102 -20.646246409377134464856282996941395597420615529803 -16.602429236226052406561338766554127142762673418695 -21.680007865714197450495711030406314524681744024329 -21.038948660115771777833205901845639760348321521616 -30.494499676527802078320016654058105593076348727966 -18.704734464995637480940828829962787676146589788572 -22.502216997171061548799304902323434654678156658236 -] -*/ -//] - -void t5() { - //[random_eg5 - //=#include - //=#include - //=#include - //= - //=int main() - //={ - using namespace nil::crypto3::multiprecision; - using namespace boost::random; - // - // Generate some multiprecision values, note that the generator is so large - // that we have to allocate it on the heap, otherwise we may run out of - // stack space! We could avoid this by using a floating point type which - // allocates it's internal storage on the heap - cpp_bin_float will do - // this with the correct template parameters, as will the GMP or MPFR - // based reals. - // - typedef lagged_fibonacci_01_engine big_fib_gen; - boost::scoped_ptr pgen(new big_fib_gen); - // - // Generate some values: - // - std::cout << std::setprecision(50); - for (unsigned i = 0; i < 20; ++i) - std::cout << (*pgen)() << std::endl; - // - // try again with a ranlux generator, this is not quite so large - // so we can use the heap this time: - // - typedef subtract_with_carry_01_engine::digits - 5, 10, 24> - ranlux_big_base_01; - typedef discard_block_engine big_ranlux; - big_ranlux rg; - for (unsigned i = 0; i < 20; ++i) - std::cout << rg() << std::endl; - //= return 0; - //=} - //] -} - -int main() { - t1(); - t2(); - t3(); - t4(); - t5(); - return 0; -} - diff --git a/crypto3/libs/multiprecision/example/safe_prime.cpp b/crypto3/libs/multiprecision/example/safe_prime.cpp deleted file mode 100644 index 644b15353..000000000 --- a/crypto3/libs/multiprecision/example/safe_prime.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/////////////////////////////////////////////////////////////// -// Copyright 2012 John Maddock. Distributed under the Boost -// Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt - -//[safe_prime - -#include -#include -#include -#include - -int main() -{ - using namespace boost::random; - using namespace nil::crypto3::multiprecision; - - typedef cpp_int int_type; - mt11213b base_gen(clock()); - independent_bits_engine gen(base_gen); - // - // We must use a different generator for the tests and number generation, otherwise - // we get false positives. - // - mt19937 gen2(clock()); - - for(unsigned i = 0; i < 100000; ++i) - { - int_type n = gen(); - if(miller_rabin_test(n, 25, gen2)) - { - // Value n is probably prime, see if (n-1)/2 is also prime: - std::cout << "We have a probable prime with value: " << std::hex << std::showbase << n << std::endl; - if(miller_rabin_test((n-1)/2, 25, gen2)) - { - std::cout << "We have a safe prime with value: " << std::hex << std::showbase << n << std::endl; - return 0; - } - } - } - std::cout << "Ooops, no safe primes were found - probably a bad choice of seed values!" << std::endl; - return 0; -} - -//] From 09d02217bc22f95c18a3c7feee12a4be8e518ffe Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Wed, 18 Dec 2024 23:52:16 +0000 Subject: [PATCH 22/29] multiprecision: add tests and fix bugs --- .../detail/big_uint/big_uint_impl.hpp | 4 +- crypto3/libs/multiprecision/test/big_uint.cpp | 264 +++++++++++++++++- 2 files changed, 255 insertions(+), 13 deletions(-) diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp index bb704ea2c..a3d4a5eb5 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp @@ -1067,14 +1067,14 @@ namespace nil::crypto3::multiprecision { limbs()[offset] &= ~mask; } - constexpr void bit_flip(big_uint& val, std::size_t index) { + constexpr void bit_flip(std::size_t index) { if (index >= Bits) { throw std::invalid_argument("fixed precision overflow"); } std::size_t offset = index / limb_bits; std::size_t shift = index % limb_bits; limb_type mask = limb_type(1u) << shift; - val.limbs()[offset] ^= mask; + limbs()[offset] ^= mask; } // Import / export diff --git a/crypto3/libs/multiprecision/test/big_uint.cpp b/crypto3/libs/multiprecision/test/big_uint.cpp index d566d5e54..df27be5d6 100644 --- a/crypto3/libs/multiprecision/test/big_uint.cpp +++ b/crypto3/libs/multiprecision/test/big_uint.cpp @@ -1,12 +1,13 @@ #define BOOST_TEST_MODULE big_int_test -#include - #include #include #include +#include #include +#include + #include "nil/crypto3/multiprecision/big_uint.hpp" #include "nil/crypto3/multiprecision/literals.hpp" @@ -19,13 +20,11 @@ NIL_CO3_MP_DEFINE_BIG_UINT_LITERAL(83) NIL_CO3_MP_DEFINE_BIG_UINT_LITERAL(85) NIL_CO3_MP_DEFINE_BIG_UINT_LITERAL(133) -using namespace nil::crypto3::multiprecision::literals; +using namespace nil::crypto3::multiprecision; BOOST_AUTO_TEST_SUITE(smoke) -BOOST_AUTO_TEST_CASE(construct_constexpr) { - constexpr nil::crypto3::multiprecision::big_uint<60> a = 0x123_big_uint60; -} +BOOST_AUTO_TEST_CASE(construct_constexpr) { constexpr big_uint<60> a = 0x123_big_uint60; } BOOST_AUTO_TEST_CASE(to_string_zero) { BOOST_CHECK_EQUAL((0x0_big_uint60).str(), "0x0"); } @@ -67,7 +66,7 @@ BOOST_AUTO_TEST_CASE(to_string_decimal_big) { } BOOST_AUTO_TEST_CASE(ops) { - nil::crypto3::multiprecision::big_uint<60> a = 2u, b; + big_uint<60> a = 2u, b; auto c1{a}; auto c2{std::move(a)}; // NOLINT @@ -218,12 +217,12 @@ BOOST_AUTO_TEST_CASE(to_uint64_t) { } BOOST_AUTO_TEST_CASE(from_uint64_t) { - nil::crypto3::multiprecision::big_uint<64> a = static_cast(0x123456789ABCDEFull); + big_uint<64> a = static_cast(0x123456789ABCDEFull); BOOST_CHECK_EQUAL(a, 0x123456789ABCDEF_big_uint64); } BOOST_AUTO_TEST_CASE(from_int64_t) { - nil::crypto3::multiprecision::big_uint<64> a = static_cast(0x123456789ABCDEFull); + big_uint<64> a = static_cast(0x123456789ABCDEFull); BOOST_CHECK_EQUAL(a, 0x123456789ABCDEF_big_uint64); } @@ -232,8 +231,8 @@ BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE(truncation) BOOST_AUTO_TEST_CASE(conversion_to_shorter_number) { - using standart_number = nil::crypto3::multiprecision::big_uint<256>; - using short_number = nil::crypto3::multiprecision::big_uint<128>; + using standart_number = big_uint<256>; + using short_number = big_uint<128>; constexpr standart_number x = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f_big_uint256; short_number s = x.truncate<128>(); @@ -242,3 +241,246 @@ BOOST_AUTO_TEST_CASE(conversion_to_shorter_number) { } BOOST_AUTO_TEST_SUITE_END() + +using int_types = std::tuple>; + +using signed_types = std::tuple; + +BOOST_AUTO_TEST_SUITE(checked_operations) + +BOOST_AUTO_TEST_CASE_TEMPLATE(addition_positive, T, int_types) { + BOOST_CHECK_EQUAL(20_big_uint7 + static_cast(10), 30_big_uint7); + BOOST_CHECK_EQUAL(static_cast(10) + 20_big_uint7, 30_big_uint7); + BOOST_CHECK_THROW(120_big_uint7 + static_cast(10), std::overflow_error); + BOOST_CHECK_THROW(static_cast(10) + 120_big_uint7, std::overflow_error); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(addition_negative, T, signed_types) { + BOOST_CHECK_EQUAL(20_big_uint7 + static_cast(-5), 15_big_uint7); + BOOST_CHECK_EQUAL(static_cast(-5) + 20_big_uint7, 15_big_uint7); + BOOST_CHECK_THROW(5_big_uint7 + static_cast(-20), std::overflow_error); + BOOST_CHECK_THROW(static_cast(-20) + 5_big_uint7, std::overflow_error); +} + +BOOST_AUTO_TEST_CASE(unary_plus) { + BOOST_CHECK_EQUAL(+20_big_uint7, 20_big_uint7); + BOOST_CHECK_EQUAL(+0_big_uint7, 0_big_uint7); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(subtraction_positive, T, int_types) { + BOOST_CHECK_EQUAL(20_big_uint7 - static_cast(5), 15_big_uint7); + BOOST_CHECK_EQUAL(static_cast(20) - 5_big_uint7, 15_big_uint7); + BOOST_CHECK_THROW(5_big_uint7 - static_cast(20), std::overflow_error); + BOOST_CHECK_THROW(static_cast(5) - 20_big_uint7, std::overflow_error); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(subtraction_negative, T, signed_types) { + BOOST_CHECK_EQUAL(20_big_uint7 - static_cast(-10), 30_big_uint7); + BOOST_CHECK_THROW(120_big_uint7 - static_cast(-10), std::overflow_error); + BOOST_CHECK_THROW(static_cast(-10) - 5_big_uint7, std::range_error); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(multiplication_positive, T, int_types) { + BOOST_CHECK_EQUAL(20_big_uint7 * static_cast(2), 40_big_uint7); + BOOST_CHECK_EQUAL(static_cast(2) * 20_big_uint7, 40_big_uint7); + BOOST_CHECK_THROW(70_big_uint7 * static_cast(2), std::overflow_error); + BOOST_CHECK_THROW(static_cast(2) * 70_big_uint7, std::overflow_error); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(multiplication_negative, T, signed_types) { + BOOST_CHECK_THROW(20_big_uint7 * static_cast(-2), std::range_error); + BOOST_CHECK_THROW(static_cast(-2) * 20_big_uint7, std::range_error); + BOOST_CHECK_THROW(70_big_uint7 * static_cast(-2), std::range_error); + BOOST_CHECK_THROW(static_cast(-2) * 70_big_uint7, std::range_error); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(division_positive, T, int_types) { + BOOST_CHECK_EQUAL(21_big_uint7 / static_cast(5), 4_big_uint7); + BOOST_CHECK_EQUAL(static_cast(21) / 5_big_uint7, 4_big_uint7); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(division_negative, T, signed_types) { + BOOST_CHECK_THROW(21_big_uint7 / static_cast(-5), std::range_error); + BOOST_CHECK_THROW(static_cast(-21) / 5_big_uint7, std::range_error); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(division_zero, T, int_types) { + BOOST_CHECK_THROW(21_big_uint7 / static_cast(0), std::overflow_error); + BOOST_CHECK_THROW(static_cast(21) / 0_big_uint7, std::overflow_error); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(modulus_positive, T, int_types) { + BOOST_CHECK_EQUAL(21_big_uint7 % static_cast(5), 1_big_uint7); + BOOST_CHECK_EQUAL(static_cast(21) % 5_big_uint7, 1_big_uint7); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(modulus_negative, T, signed_types) { + BOOST_CHECK_THROW(21_big_uint7 % static_cast(-5), std::range_error); + BOOST_CHECK_THROW(static_cast(-21) % 5_big_uint7, std::range_error); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(modulus_zero, T, int_types) { + BOOST_CHECK_THROW(21_big_uint7 % static_cast(0), std::overflow_error); + BOOST_CHECK_THROW(static_cast(21) % 0_big_uint7, std::overflow_error); +} + +BOOST_AUTO_TEST_SUITE_END() + +BOOST_AUTO_TEST_SUITE(wrapping_operations) + +BOOST_AUTO_TEST_CASE_TEMPLATE(addition_positive, T, int_types) { + BOOST_CHECK_EQUAL(add_wrapping(20_big_uint7, static_cast(10)), 30_big_uint7); + BOOST_CHECK_EQUAL(add_wrapping(static_cast(10), 20_big_uint7), 30_big_uint7); + BOOST_CHECK_EQUAL(add_wrapping(120_big_uint7, static_cast(10)), 2_big_uint7); + BOOST_CHECK_EQUAL(add_wrapping(static_cast(10), 120_big_uint7), 2_big_uint7); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(addition_negative, T, signed_types) { + BOOST_CHECK_EQUAL(add_wrapping(20_big_uint7, static_cast(-5)), 15_big_uint7); + BOOST_CHECK_EQUAL(add_wrapping(static_cast(-5), 20_big_uint7), 15_big_uint7); + BOOST_CHECK_EQUAL(add_wrapping(5_big_uint7, static_cast(-20)), 113_big_uint7); + BOOST_CHECK_EQUAL(add_wrapping(static_cast(-20), 5_big_uint7), 113_big_uint7); +} + +BOOST_AUTO_TEST_CASE(negated_wrapping) { + BOOST_CHECK_EQUAL(20_big_uint7 .negated_wrapping(), 108_big_uint7); + BOOST_CHECK_EQUAL(0_big_uint7 .negated_wrapping(), 0_big_uint7); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(subtraction_positive, T, int_types) { + BOOST_CHECK_EQUAL(subtract_wrapping(20_big_uint7, static_cast(5)), 15_big_uint7); + BOOST_CHECK_EQUAL(subtract_wrapping(static_cast(20), 5_big_uint7), 15_big_uint7); + BOOST_CHECK_EQUAL(subtract_wrapping(5_big_uint7, static_cast(20)), 113_big_uint7); + BOOST_CHECK_EQUAL(subtract_wrapping(static_cast(5), 20_big_uint7), 113_big_uint7); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(subtraction_negative, T, signed_types) { + BOOST_CHECK_EQUAL(subtract_wrapping(20_big_uint7, static_cast(-10)), 30_big_uint7); + BOOST_CHECK_EQUAL(subtract_wrapping(static_cast(-10), 20_big_uint7), 98_big_uint7); + BOOST_CHECK_EQUAL(subtract_wrapping(120_big_uint7, static_cast(-10)), 2_big_uint7); + BOOST_CHECK_EQUAL(subtract_wrapping(static_cast(-10), 120_big_uint7), 126_big_uint7); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(multiplication_positive, T, int_types) { + BOOST_CHECK_EQUAL(multiply_wrapping(20_big_uint7, static_cast(2)), 40_big_uint7); + BOOST_CHECK_EQUAL(multiply_wrapping(static_cast(2), 20_big_uint7), 40_big_uint7); + BOOST_CHECK_EQUAL(multiply_wrapping(70_big_uint7, static_cast(2)), 12_big_uint7); + BOOST_CHECK_EQUAL(multiply_wrapping(static_cast(2), 70_big_uint7), 12_big_uint7); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(multiplication_negative, T, signed_types) { + BOOST_CHECK_EQUAL(multiply_wrapping(20_big_uint7, static_cast(-2)), 88_big_uint7); + BOOST_CHECK_EQUAL(multiply_wrapping(static_cast(-2), 20_big_uint7), 88_big_uint7); + BOOST_CHECK_EQUAL(multiply_wrapping(70_big_uint7, static_cast(-2)), 116_big_uint7); + BOOST_CHECK_EQUAL(multiply_wrapping(static_cast(-2), 70_big_uint7), 116_big_uint7); +} + +BOOST_AUTO_TEST_SUITE_END() + +BOOST_AUTO_TEST_SUITE(bit_operations) + +BOOST_AUTO_TEST_CASE_TEMPLATE(and_positive, T, int_types) { + BOOST_CHECK_EQUAL(21_big_uint7 & static_cast(7), 5_big_uint7); + BOOST_CHECK_EQUAL(static_cast(7) & 21_big_uint7, 5_big_uint7); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(and_negative, T, signed_types) { + BOOST_CHECK_THROW(21_big_uint7 & static_cast(-7), std::range_error); + BOOST_CHECK_THROW(static_cast(-7) & 21_big_uint7, std::range_error); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(or_positive, T, int_types) { + BOOST_CHECK_EQUAL(21_big_uint7 | static_cast(7), 23_big_uint7); + BOOST_CHECK_EQUAL(static_cast(7) | 21_big_uint7, 23_big_uint7); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(or_negative, T, signed_types) { + BOOST_CHECK_THROW(21_big_uint7 | static_cast(-7), std::range_error); + BOOST_CHECK_THROW(static_cast(-7) | 21_big_uint7, std::range_error); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(xor_positive, T, int_types) { + BOOST_CHECK_EQUAL(21_big_uint7 ^ static_cast(7), 18_big_uint7); + BOOST_CHECK_EQUAL(static_cast(7) ^ 21_big_uint7, 18_big_uint7); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(xor_negative, T, signed_types) { + BOOST_CHECK_THROW(21_big_uint7 ^ static_cast(-7), std::range_error); + BOOST_CHECK_THROW(static_cast(-7) ^ 21_big_uint7, std::range_error); +} + +BOOST_AUTO_TEST_CASE(complement) { + BOOST_CHECK_EQUAL(~21_big_uint7, 106_big_uint7); + BOOST_CHECK_EQUAL(~0_big_uint7, 127_big_uint7); +} + +BOOST_AUTO_TEST_CASE(shift_left) { + BOOST_CHECK_EQUAL(21_big_uint7 << 1, 42_big_uint7); + BOOST_CHECK_EQUAL(21_big_uint7 << 3, 40_big_uint7); + BOOST_CHECK_EQUAL(21_big_uint7 << 5, 32_big_uint7); + BOOST_CHECK_EQUAL(21_big_uint7 << 7, 0_big_uint7); + BOOST_CHECK_EQUAL(21_big_uint7 << 0, 21_big_uint7); + BOOST_CHECK_EQUAL(21_big_uint7 << -1, 0_big_uint7); +} + +BOOST_AUTO_TEST_CASE(shift_right) { + BOOST_CHECK_EQUAL(21_big_uint7 >> 1, 10_big_uint7); + BOOST_CHECK_EQUAL(21_big_uint7 >> 3, 2_big_uint7); + BOOST_CHECK_EQUAL(21_big_uint7 >> 5, 0_big_uint7); + BOOST_CHECK_EQUAL(21_big_uint7 >> 7, 0_big_uint7); + BOOST_CHECK_EQUAL(21_big_uint7 >> 0, 21_big_uint7); + BOOST_CHECK_EQUAL(21_big_uint7 >> -1, 0_big_uint7); +} + +BOOST_AUTO_TEST_CASE(bit_set) { + auto n = 21_big_uint7; + n.bit_set(6); + BOOST_CHECK_EQUAL(n, 85_big_uint7); + n.bit_set(6); + BOOST_CHECK_EQUAL(n, 85_big_uint7); +} + +BOOST_AUTO_TEST_CASE(bit_flip) { + auto n = 21_big_uint7; + n.bit_flip(6); + BOOST_CHECK_EQUAL(n, 85_big_uint7); + n.bit_flip(6); + BOOST_CHECK_EQUAL(n, 21_big_uint7); +} + +BOOST_AUTO_TEST_CASE(bit_unset) { + auto n = 21_big_uint7; + n.bit_unset(0); + BOOST_CHECK_EQUAL(n, 20_big_uint7); + n.bit_unset(0); + BOOST_CHECK_EQUAL(n, 20_big_uint7); +} + +BOOST_AUTO_TEST_CASE(bit_test) { + BOOST_CHECK_EQUAL(21_big_uint7 .bit_test(0), true); + BOOST_CHECK_EQUAL(21_big_uint7 .bit_test(1), false); + BOOST_CHECK_EQUAL(21_big_uint7 .bit_test(2), true); + BOOST_CHECK_EQUAL(21_big_uint7 .bit_test(3), false); + BOOST_CHECK_EQUAL(21_big_uint7 .bit_test(4), true); + BOOST_CHECK_EQUAL(21_big_uint7 .bit_test(5), false); +} + +BOOST_AUTO_TEST_CASE(msb) { + BOOST_CHECK_EQUAL(21_big_uint7 .msb(), 4); + BOOST_CHECK_THROW(0_big_uint7 .msb(), std::invalid_argument); + BOOST_CHECK_EQUAL(32_big_uint7 .msb(), 5); + BOOST_CHECK_EQUAL(1_big_uint7 .msb(), 0); + BOOST_CHECK_EQUAL(2_big_uint7 .msb(), 1); +} + +BOOST_AUTO_TEST_CASE(lsb) { + BOOST_CHECK_EQUAL(21_big_uint7 .lsb(), 0); + BOOST_CHECK_THROW(0_big_uint7 .lsb(), std::invalid_argument); + BOOST_CHECK_EQUAL(32_big_uint7 .lsb(), 5); + BOOST_CHECK_EQUAL(1_big_uint7 .lsb(), 0); + BOOST_CHECK_EQUAL(2_big_uint7 .lsb(), 1); +} + +BOOST_AUTO_TEST_SUITE_END() From 81f11dd9ba8fb6a1995b8eebae363b3d0ccc71dc Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Thu, 19 Dec 2024 01:37:09 +0000 Subject: [PATCH 23/29] multiprecision: update and fix copyrights --- .../include/nil/crypto3/multiprecision/big_mod.hpp | 8 ++++++++ .../nil/crypto3/multiprecision/big_uint.hpp | 8 ++++++++ .../nil/crypto3/multiprecision/detail/big_int.hpp | 8 ++++++++ .../multiprecision/detail/big_mod/ops/inverse.hpp | 2 +- .../multiprecision/detail/big_mod/ops/pow.hpp | 2 +- .../multiprecision/detail/big_mod/ops/ressol.hpp | 2 +- .../multiprecision/detail/big_mod/test_support.hpp | 8 ++++++++ .../multiprecision/detail/big_mod/type_traits.hpp | 8 ++++++++ .../multiprecision/detail/big_uint/arithmetic.hpp | 11 +++++++++++ .../detail/big_uint/big_uint_impl.hpp | 11 +++++++++++ .../multiprecision/detail/big_uint/limits.hpp | 13 +++++++++---- .../detail/big_uint/ops/gcd_inverse.hpp | 1 + .../multiprecision/detail/big_uint/ops/jacobi.hpp | 1 + .../multiprecision/detail/big_uint/ops/powm.hpp | 2 +- .../multiprecision/detail/big_uint/ops/ressol.hpp | 1 + .../multiprecision/detail/big_uint/ops/wnaf.hpp | 1 + .../multiprecision/detail/big_uint/parsing.hpp | 8 ++++++++ .../multiprecision/detail/big_uint/storage.hpp | 13 +++++++++++++ .../multiprecision/detail/big_uint/type_traits.hpp | 9 +++++++++ .../nil/crypto3/multiprecision/detail/config.hpp | 9 +++++++++ .../nil/crypto3/multiprecision/detail/endian.hpp | 9 +++++++++ .../nil/crypto3/multiprecision/detail/int128.hpp | 10 ++++++++++ .../multiprecision/detail/integer_ops_base.hpp | 8 ++++++++ .../multiprecision/detail/integer_ops_powm.hpp | 8 ++++++++ .../multiprecision/detail/integer_utils.hpp | 8 ++++++++ .../multiprecision/detail/intel_intrinsics.hpp | 10 ++++++++++ .../include/nil/crypto3/multiprecision/integer.hpp | 8 ++++++++ .../nil/crypto3/multiprecision/literals.hpp | 12 ++++++++---- .../nil/crypto3/multiprecision/miller_rabin.hpp | 12 ++++++++---- crypto3/libs/multiprecision/test/CMakeLists.txt | 1 + crypto3/libs/multiprecision/test/big_mod_basic.cpp | 8 ++++++++ .../multiprecision/test/big_mod_randomized.cpp | 1 + crypto3/libs/multiprecision/test/big_uint.cpp | 8 ++++++++ .../test/big_uint_comparison_randomized.cpp | 1 + .../multiprecision/test/data/generate_test_data.py | 8 ++++++++ crypto3/libs/multiprecision/test/inverse.cpp | 1 + crypto3/libs/multiprecision/test/jacobi.cpp | 14 +++++++++----- crypto3/libs/multiprecision/test/miller_rabin.cpp | 14 +++++++++----- crypto3/libs/multiprecision/test/ressol.cpp | 1 + 39 files changed, 242 insertions(+), 26 deletions(-) diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_mod.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_mod.hpp index 3fd76e74a..267af4743 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_mod.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_mod.hpp @@ -1,3 +1,11 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// + #pragma once #include "nil/crypto3/multiprecision/detail/big_mod/big_mod_impl.hpp" // IWYU pragma: export diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_uint.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_uint.hpp index 45acb72dc..f2b079972 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_uint.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_uint.hpp @@ -1,3 +1,11 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// + #pragma once #include "nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp" // IWYU pragma: export diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp index 54314e2d7..7e0247375 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp @@ -1,3 +1,11 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// + #pragma once #include diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/inverse.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/inverse.hpp index 645b6e771..55f75748c 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/inverse.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/inverse.hpp @@ -1,6 +1,6 @@ //---------------------------------------------------------------------------// -// Copyright (c) 2020 Mikhail Komarov // Copyright (c) 2019-2021 Aleksei Moskvin +// Copyright (c) 2020 Mikhail Komarov // Copyright (c) 2020 Ilias Khairullin // Copyright (c) 2024 Andrey Nefedov // diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/pow.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/pow.hpp index 29134e5f2..71b4cfa2b 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/pow.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/pow.hpp @@ -1,6 +1,6 @@ //---------------------------------------------------------------------------// -// Copyright (c) 2020 Mikhail Komarov // Copyright (c) 2019-2021 Aleksei Moskvin +// Copyright (c) 2020 Mikhail Komarov // Copyright (c) 2020 Ilias Khairullin // Copyright (c) 2024 Andrey Nefedov // diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/ressol.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/ressol.hpp index 046574801..976270edd 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/ressol.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/ressol.hpp @@ -1,6 +1,6 @@ //---------------------------------------------------------------------------// -// Copyright (c) 2020 Mikhail Komarov // Copyright (c) 2019-2021 Aleksei Moskvin +// Copyright (c) 2020 Mikhail Komarov // Copyright (c) 2020 Ilias Khairullin // Copyright (c) 2024 Andrey Nefedov // diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/test_support.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/test_support.hpp index a6888bfbe..ae8b9248c 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/test_support.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/test_support.hpp @@ -1,3 +1,11 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// + #pragma once #include "nil/crypto3/multiprecision/detail/big_mod/type_traits.hpp" diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/type_traits.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/type_traits.hpp index 07e335442..8b11c6f36 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/type_traits.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/type_traits.hpp @@ -1,3 +1,11 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// + #pragma once #include diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp index b20cb6065..26c8419e7 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp @@ -1,3 +1,14 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2012 John Maddock +// Copyright (c) 2020 Madhur Chauhan +// Copyright (c) 2020 John Maddock +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// + #pragma once #include diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp index a3d4a5eb5..8b22423e4 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp @@ -1,3 +1,14 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2012-2022 John Maddock +// Copyright (c) 2022 Christopher Kormanyos +// Copyright (c) 2024 Martun Karapetyan +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// + #pragma once // IWYU pragma: private; include "nil/crypto3/multiprecision/big_uint.hpp" diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/limits.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/limits.hpp index 1e5e90acc..ffe9f400c 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/limits.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/limits.hpp @@ -1,7 +1,12 @@ -/////////////////////////////////////////////////////////////// -// Copyright 2012 John Maddock. Distributed under the Boost -// Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// +// Copyright (c) 2012 John Maddock +// Copyright (c) 2018-2020 Mikhail Komarov +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// #pragma once diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/gcd_inverse.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/gcd_inverse.hpp index 1fcbc5b15..df2e56942 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/gcd_inverse.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/gcd_inverse.hpp @@ -1,6 +1,7 @@ //---------------------------------------------------------------------------// // Copyright (c) 2020 Mikhail Komarov // Copyright (c) 2021 Aleksei Moskvin +// Copyright (c) 2024 Andrey Nefedov // // Distributed under the Boost Software License, Version 1.0 // See accompanying file LICENSE_1_0.txt or copy at diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/jacobi.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/jacobi.hpp index 530c389bd..638f57ae6 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/jacobi.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/jacobi.hpp @@ -1,6 +1,7 @@ //---------------------------------------------------------------------------// // Copyright (c) 2018-2020 Mikhail Komarov // Copyright (c) 2021 Aleksei Moskvin +// Copyright (c) 2024 Andrey Nefedov // // Distributed under the Boost Software License, Version 1.0 // See accompanying file LICENSE_1_0.txt or copy at diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/powm.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/powm.hpp index 5274f7a00..497200b64 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/powm.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/powm.hpp @@ -1,6 +1,6 @@ //---------------------------------------------------------------------------// -// Copyright (c) 2020 Mikhail Komarov // Copyright (c) 2019-2021 Aleksei Moskvin +// Copyright (c) 2020 Mikhail Komarov // Copyright (c) 2020 Ilias Khairullin // Copyright (c) 2024 Andrey Nefedov // diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/ressol.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/ressol.hpp index 8831ef118..2440d5136 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/ressol.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/ressol.hpp @@ -2,6 +2,7 @@ // Copyright (c) 2018-2020 Mikhail Komarov // Copyright (c) 2018-2020 Pavel Kharitonov // Copyright (c) 2021 Aleksei Moskvin +// Copyright (c) 2024 Andrey Nefedov // // Distributed under the Boost Software License, Version 1.0 // See accompanying file LICENSE_1_0.txt or copy at diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/wnaf.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/wnaf.hpp index 6a912886b..7c6903331 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/wnaf.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/wnaf.hpp @@ -1,5 +1,6 @@ //---------------------------------------------------------------------------// // Copyright (c) 2018-2020 Mikhail Komarov +// Copyright (c) 2024 Andrey Nefedov // // Distributed under the Boost Software License, Version 1.0 // See accompanying file LICENSE_1_0.txt or copy at diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/parsing.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/parsing.hpp index e8d17b5f5..1e1598ec7 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/parsing.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/parsing.hpp @@ -1,3 +1,11 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// + #pragma once #include diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/storage.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/storage.hpp index fb97aaab1..a57475300 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/storage.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/storage.hpp @@ -1,3 +1,16 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2012-2021 John Maddock +// Copyright (c) 2020 Mikhail Komarov +// Copyright (c) 2020 Ilias Khairullin +// Copyright (c) 2021 Aleksei Moskvin +// Copyright (c) 2021 Matt Borland +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// + #pragma once #include diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/type_traits.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/type_traits.hpp index 412b00533..e78cedb4e 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/type_traits.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/type_traits.hpp @@ -1,3 +1,12 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2018-2020 Mikhail Komarov +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// + #pragma once #include diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/config.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/config.hpp index 2d4f8b6f8..d9f5a9967 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/config.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/config.hpp @@ -1,3 +1,12 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2021 Matt Borland +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// + #pragma once #if !defined(NIL_CO3_MP_FORCEINLINE) diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/endian.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/endian.hpp index 5c264713b..6b408a74b 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/endian.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/endian.hpp @@ -1,3 +1,12 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2021 Matt Borland +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// + #pragma once #include diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/int128.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/int128.hpp index eabe5b604..c8162f944 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/int128.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/int128.hpp @@ -1,3 +1,13 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2010-2021 Douglas Gregor +// Copyright (c) 2021 Matt Borland +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// + #pragma once #if defined(__SIZEOF_INT128__) diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_base.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_base.hpp index 3b3bede0e..4350eb45c 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_base.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_base.hpp @@ -1,3 +1,11 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// + #pragma once #include diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_powm.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_powm.hpp index 42fbefbed..529c5d44c 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_powm.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_powm.hpp @@ -1,3 +1,11 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// + #pragma once #include diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_utils.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_utils.hpp index f0714368e..20271d7a8 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_utils.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_utils.hpp @@ -1,3 +1,11 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// + #pragma once #include diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/intel_intrinsics.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/intel_intrinsics.hpp index 5a479b6b7..ee6aaeb62 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/intel_intrinsics.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/intel_intrinsics.hpp @@ -1,3 +1,13 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2020 Madhur Chauhan +// Copyright (c) 2020 John Maddock +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// + #pragma once #include "nil/crypto3/multiprecision/detail/big_uint/storage.hpp" diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/integer.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/integer.hpp index 8225fdf3a..c8bc9046e 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/integer.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/integer.hpp @@ -1,3 +1,11 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// + #pragma once #include "nil/crypto3/multiprecision/detail/integer_ops_base.hpp" // IWYU pragma: export diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/literals.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/literals.hpp index fa7bf633a..ed925367f 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/literals.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/literals.hpp @@ -1,7 +1,11 @@ -/////////////////////////////////////////////////////////////// -// Copyright 2013 John Maddock. Distributed under the Boost -// Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// +// Copyright (c) 2013 John Maddock +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// #pragma once diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/miller_rabin.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/miller_rabin.hpp index 63709be8f..5fa70109f 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/miller_rabin.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/miller_rabin.hpp @@ -1,7 +1,11 @@ -/////////////////////////////////////////////////////////////// -// Copyright 2012 John Maddock. Distributed under the Boost -// Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// +// Copyright (c) 2012 John Maddock +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// #pragma once diff --git a/crypto3/libs/multiprecision/test/CMakeLists.txt b/crypto3/libs/multiprecision/test/CMakeLists.txt index 7c6f2d737..67f16d3fe 100644 --- a/crypto3/libs/multiprecision/test/CMakeLists.txt +++ b/crypto3/libs/multiprecision/test/CMakeLists.txt @@ -1,6 +1,7 @@ #---------------------------------------------------------------------------# # Copyright (c) 2018-2020 Mikhail Komarov # Copyright (c) 2018-2021 Aleksei Moskvin +# Copyright (c) 2024 Andrey Nefedov # # Distributed under the Boost Software License, Version 1.0 # See accompanying file LICENSE_1_0.txt or copy at diff --git a/crypto3/libs/multiprecision/test/big_mod_basic.cpp b/crypto3/libs/multiprecision/test/big_mod_basic.cpp index 112be3b04..d3f834fe8 100644 --- a/crypto3/libs/multiprecision/test/big_mod_basic.cpp +++ b/crypto3/libs/multiprecision/test/big_mod_basic.cpp @@ -1,3 +1,11 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// + #define BOOST_TEST_MODULE big_int_modular_test #include diff --git a/crypto3/libs/multiprecision/test/big_mod_randomized.cpp b/crypto3/libs/multiprecision/test/big_mod_randomized.cpp index 8395391b3..f4dd2064f 100644 --- a/crypto3/libs/multiprecision/test/big_mod_randomized.cpp +++ b/crypto3/libs/multiprecision/test/big_mod_randomized.cpp @@ -2,6 +2,7 @@ // Copyright (c) 2020 Mikhail Komarov // Copyright (c) 2020 Ilias Khairullin // Copyright (c) 2024 Martun Karapetyan +// Copyright (c) 2024 Andrey Nefedov // // Distributed under the Boost Software License, Version 1.0 // See accompanying file LICENSE_1_0.txt or copy at diff --git a/crypto3/libs/multiprecision/test/big_uint.cpp b/crypto3/libs/multiprecision/test/big_uint.cpp index df27be5d6..05f9010be 100644 --- a/crypto3/libs/multiprecision/test/big_uint.cpp +++ b/crypto3/libs/multiprecision/test/big_uint.cpp @@ -1,3 +1,11 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// + #define BOOST_TEST_MODULE big_int_test #include diff --git a/crypto3/libs/multiprecision/test/big_uint_comparison_randomized.cpp b/crypto3/libs/multiprecision/test/big_uint_comparison_randomized.cpp index a3ad8a59f..7e177d348 100644 --- a/crypto3/libs/multiprecision/test/big_uint_comparison_randomized.cpp +++ b/crypto3/libs/multiprecision/test/big_uint_comparison_randomized.cpp @@ -1,5 +1,6 @@ //---------------------------------------------------------------------------// // Copyright (c) 2024 Martun Karapetyan +// Copyright (c) 2024 Andrey Nefedov // // Distributed under the Boost Software License, Version 1.0 // See accompanying file LICENSE_1_0.txt or copy at diff --git a/crypto3/libs/multiprecision/test/data/generate_test_data.py b/crypto3/libs/multiprecision/test/data/generate_test_data.py index 3dcc3c431..72c667598 100644 --- a/crypto3/libs/multiprecision/test/data/generate_test_data.py +++ b/crypto3/libs/multiprecision/test/data/generate_test_data.py @@ -1,3 +1,11 @@ +#---------------------------------------------------------------------------# +# Copyright (c) 2024 Andrey Nefedov +# +# Distributed under the Boost Software License, Version 1.0 +# See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt +#---------------------------------------------------------------------------# + import random import math import json diff --git a/crypto3/libs/multiprecision/test/inverse.cpp b/crypto3/libs/multiprecision/test/inverse.cpp index 6f1987881..c0bfd4d80 100644 --- a/crypto3/libs/multiprecision/test/inverse.cpp +++ b/crypto3/libs/multiprecision/test/inverse.cpp @@ -2,6 +2,7 @@ // Copyright (c) 2018-2020 Mikhail Komarov // Copyright (c) 2018-2020 Pavel Kharitonov // Copyright (c) 2021 Aleksei Moskvin +// Copyright (c) 2024 Andrey Nefedov // // Distributed under the Boost Software License, Version 1.0 // See accompanying file LICENSE_1_0.txt or copy at diff --git a/crypto3/libs/multiprecision/test/jacobi.cpp b/crypto3/libs/multiprecision/test/jacobi.cpp index fd5485cc0..27013a01a 100644 --- a/crypto3/libs/multiprecision/test/jacobi.cpp +++ b/crypto3/libs/multiprecision/test/jacobi.cpp @@ -1,8 +1,12 @@ -/////////////////////////////////////////////////////////////// -// Copyright (c) 2020 Mikhail Komarov. -// Copyright (c) 2021 Aleksei Moskvin -// Distributed under the Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// +// Copyright (c) 2020 Mikhail Komarov +// Copyright (c) 2021 Aleksei Moskvin +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// #define BOOST_TEST_MODULE big_int_jacobi_test diff --git a/crypto3/libs/multiprecision/test/miller_rabin.cpp b/crypto3/libs/multiprecision/test/miller_rabin.cpp index 00410a030..0bf0cbdcf 100644 --- a/crypto3/libs/multiprecision/test/miller_rabin.cpp +++ b/crypto3/libs/multiprecision/test/miller_rabin.cpp @@ -1,8 +1,12 @@ -/////////////////////////////////////////////////////////////// -// Copyright (c) 2020 Mikhail Komarov. -// Copyright (c) 2021 Aleksei Moskvin -// Distributed under the Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// +// Copyright (c) 2020 Mikhail Komarov +// Copyright (c) 2021 Aleksei Moskvin +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// #define BOOST_TEST_MODULE big_int_miller_rabin_test diff --git a/crypto3/libs/multiprecision/test/ressol.cpp b/crypto3/libs/multiprecision/test/ressol.cpp index 1b2ff9f94..8e34de921 100644 --- a/crypto3/libs/multiprecision/test/ressol.cpp +++ b/crypto3/libs/multiprecision/test/ressol.cpp @@ -2,6 +2,7 @@ // Copyright (c) 2018-2020 Mikhail Komarov // Copyright (c) 2018-2020 Pavel Kharitonov // Copyright (c) 2021 Aleksei Moskvin +// Copyright (c) 2024 Andrey Nefedov // // Distributed under the Boost Software License, Version 1.0 // See accompanying file LICENSE_1_0.txt or copy at From 1039a7fbd206a1e3c5b9c45c6a0795ef337ce89b Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Thu, 19 Dec 2024 14:44:49 +0000 Subject: [PATCH 24/29] multiprecision: add custom and boost tests and fix bugs --- .../nil/crypto3/multiprecision/big_uint.hpp | 1 + .../detail/big_uint/big_uint_impl.hpp | 200 +- .../detail/big_uint/ops/pow.hpp | 47 + .../detail/big_uint/ops/powm.hpp | 13 +- .../detail/integer_ops_base.hpp | 21 + .../multiprecision/detail/integer_ops_pow.hpp | 11 + .../detail/integer_ops_powm.hpp | 20 +- .../nil/crypto3/multiprecision/integer.hpp | 1 + .../libs/multiprecision/test/CMakeLists.txt | 7 +- ..._randomized.cpp => big_mod_arithmetic.cpp} | 2 +- .../multiprecision/test/big_mod_basic.cpp | 2 +- .../test/big_uint_arithmetic.cpp | 2034 +++++++++++++++++ .../test/{big_uint.cpp => big_uint_basic.cpp} | 48 +- ...randomized.cpp => big_uint_comparison.cpp} | 2 +- crypto3/libs/multiprecision/test/inverse.cpp | 2 +- crypto3/libs/multiprecision/test/jacobi.cpp | 2 +- .../libs/multiprecision/test/miller_rabin.cpp | 2 +- crypto3/libs/multiprecision/test/ressol.cpp | 2 +- 18 files changed, 2300 insertions(+), 117 deletions(-) create mode 100644 crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/pow.hpp create mode 100644 crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_pow.hpp rename crypto3/libs/multiprecision/test/{big_mod_randomized.cpp => big_mod_arithmetic.cpp} (98%) create mode 100644 crypto3/libs/multiprecision/test/big_uint_arithmetic.cpp rename crypto3/libs/multiprecision/test/{big_uint.cpp => big_uint_basic.cpp} (89%) rename crypto3/libs/multiprecision/test/{big_uint_comparison_randomized.cpp => big_uint_comparison.cpp} (98%) diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_uint.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_uint.hpp index f2b079972..dd0e02ec3 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_uint.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_uint.hpp @@ -12,6 +12,7 @@ #include "nil/crypto3/multiprecision/detail/big_uint/limits.hpp" // IWYU pragma: export #include "nil/crypto3/multiprecision/detail/big_uint/ops/gcd_inverse.hpp" // IWYU pragma: export #include "nil/crypto3/multiprecision/detail/big_uint/ops/jacobi.hpp" // IWYU pragma: export +#include "nil/crypto3/multiprecision/detail/big_uint/ops/pow.hpp" // IWYU pragma: export #include "nil/crypto3/multiprecision/detail/big_uint/ops/powm.hpp" // IWYU pragma: export #include "nil/crypto3/multiprecision/detail/big_uint/ops/ressol.hpp" // IWYU pragma: export #include "nil/crypto3/multiprecision/detail/big_uint/ops/wnaf.hpp" // IWYU pragma: export diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp index 8b22423e4..cc0ca4105 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp @@ -42,6 +42,7 @@ #include "nil/crypto3/multiprecision/detail/big_uint/type_traits.hpp" // IWYU pragma: export #include "nil/crypto3/multiprecision/detail/config.hpp" #include "nil/crypto3/multiprecision/detail/endian.hpp" +#include "nil/crypto3/multiprecision/detail/integer_utils.hpp" namespace nil::crypto3::multiprecision { /** @@ -143,13 +144,12 @@ namespace nil::crypto3::multiprecision { this->normalize(); } - template && std::is_unsigned_v, int> = 0> + template, int> = 0> constexpr void do_assign_integral(const T& a) { - do_assign_integral_unchecked(a); + do_assign_integral_unchecked(detail::unsigned_or_throw(a)); if constexpr (sizeof(T) * CHAR_BIT > Bits) { - if (big_uint(a).compare(*this) != 0) { - throw std::range_error("big_uint: out of range"); + if (compare(a) != 0) { + throw std::range_error("big_uint: overflow"); } } } @@ -171,7 +171,7 @@ namespace nil::crypto3::multiprecision { do_assign_unchecked(other); if constexpr (Bits2 > Bits) { if (other.compare(*this) != 0) { - throw std::range_error("big_uint: out of range"); + throw std::range_error("big_uint: overflow"); } } } @@ -185,17 +185,9 @@ namespace nil::crypto3::multiprecision { constexpr big_uint(const char* str) { *this = str; } constexpr big_uint(const std::string& str) { *this = str; } - template && std::is_signed_v, int> = 0> - constexpr big_uint(T val) { - if (val < 0) { - throw std::range_error("big_uint: assignment from negative integer"); - } - do_assign_integral(static_cast>(val)); - } - - template && std::is_unsigned_v, int> = 0> - constexpr big_uint(T val) { - do_assign_integral(val); + template, int> = 0> + constexpr big_uint(T a) { + do_assign_integral(a); } // TODO(ioxid): make this explicit for the case when Bits2 > Bits @@ -224,20 +216,9 @@ namespace nil::crypto3::multiprecision { return *this; } - template && std::is_signed_v, int> = 0> - constexpr big_uint& operator=(T val) { - if (val < 0) { - throw std::range_error("big_uint: assignment from negative integer"); - } - do_assign_integral(static_cast>(val)); - return *this; - } - - template && std::is_unsigned_v, int> = 0> - constexpr big_uint& operator=(T val) noexcept { - do_assign_integral(val); + template, int> = 0> + constexpr big_uint& operator=(T a) { + do_assign_integral(a); return *this; } @@ -269,26 +250,23 @@ namespace nil::crypto3::multiprecision { // String conversion - constexpr std::string str(std::ios_base::fmtflags flags = std::ios_base::hex | - std::ios_base::showbase | - std::ios_base::uppercase) const { - if (flags & std::ios_base::dec) { - // TODO(ioxid): this is inefficient - std::string result; - auto copy = *this; - while (!copy.is_zero()) { - result += static_cast(static_cast(copy % 10u) + '0'); - copy /= 10u; - } - std::reverse(result.begin(), result.end()); - if (result.empty()) { - result += '0'; - } - return result; + private: + constexpr std::string decimal_str() const { + // TODO(ioxid): this is inefficient + std::string result; + auto copy = *this; + while (!copy.is_zero()) { + result += static_cast(static_cast(copy % 10u) + '0'); + copy /= 10u; } - if (!(flags & std::ios_base::hex)) { - throw std::invalid_argument("big_uint: unsupported format flags"); + std::reverse(result.begin(), result.end()); + if (result.empty()) { + result += '0'; } + return result; + } + + constexpr std::string hex_str() const { std::string result; result.reserve(used_limbs() * limb_bits / 4); bool found_first = false; @@ -313,15 +291,29 @@ namespace nil::crypto3::multiprecision { BOOST_ASSERT(ec == std::errc{}); } } + if (result.empty()) { + result += '0'; + } + return result; + } + + public: + constexpr std::string str(std::ios_base::fmtflags flags = std::ios_base::hex | + std::ios_base::showbase | + std::ios_base::uppercase) const { + if (flags & std::ios_base::dec) { + return decimal_str(); + } + if (!(flags & std::ios_base::hex)) { + throw std::invalid_argument("big_uint: unsupported format flags"); + } + auto result = hex_str(); if (flags & std::ios_base::uppercase) { for (std::size_t i = 0; i < result.size(); ++i) { result[i] = static_cast(std::toupper(static_cast(result[i]))); } } - if (result.size() == 0) { - result += '0'; - } if (flags & std::ios_base::showbase) { result = "0x" + result; } @@ -341,24 +333,37 @@ namespace nil::crypto3::multiprecision { std::is_unsigned_v, int> = 0> explicit constexpr operator T() const { + T result; if constexpr (sizeof(T) <= sizeof(limb_type)) { - return static_cast(this->limbs()[0]); + result = static_cast(this->limbs()[0]); } else { + static_assert(sizeof(T) % sizeof(limb_type) == 0); constexpr std::size_t n = std::min(sizeof(T) / sizeof(limb_type), static_limb_count); - T result = 0; + result = 0; for (std::size_t i = 0; i < n; ++i) { result <<= limb_bits; result |= limbs()[n - i - 1]; } - return result; } + if constexpr (sizeof(T) * CHAR_BIT < Bits) { + if (compare(result) != 0) { + throw std::overflow_error("big_uint: overflow"); + } + } + return result; } template && std::is_signed_v, int> = 0> explicit constexpr operator T() const { - return static_cast(static_cast>(*this)); + T result = static_cast(static_cast>(*this)); + if constexpr (sizeof(T) * CHAR_BIT <= Bits) { + if (compare(result) != 0) { + throw std::overflow_error("big_uint: overflow"); + } + } + return result; } explicit constexpr operator bool() const { return !is_zero(); } @@ -420,8 +425,8 @@ namespace nil::crypto3::multiprecision { #define NIL_CO3_MP_BIG_UINT_IMPL_COMPARISON_OPERATOR(OP_) \ template, int> = 0> \ - constexpr bool operator OP_(const T& o) const noexcept { \ - return compare(o) OP_ 0; \ + friend constexpr bool operator OP_(const big_uint& a, const T& b) noexcept { \ + return a.compare(b) OP_ 0; \ } \ \ template, int> = 0> \ @@ -735,18 +740,18 @@ namespace nil::crypto3::multiprecision { } template - NIL_CO3_MP_FORCEINLINE constexpr void bitwise_and(const big_uint& o) noexcept { - bitwise_op(o, std::bit_and()); + NIL_CO3_MP_FORCEINLINE constexpr void bitwise_and(const big_uint& other) noexcept { + bitwise_op(other, std::bit_and()); } template - NIL_CO3_MP_FORCEINLINE constexpr void bitwise_or(const big_uint& o) noexcept { - bitwise_op(o, std::bit_or()); + NIL_CO3_MP_FORCEINLINE constexpr void bitwise_or(const big_uint& other) noexcept { + bitwise_op(other, std::bit_or()); } template - NIL_CO3_MP_FORCEINLINE constexpr void bitwise_xor(const big_uint& o) noexcept { - bitwise_op(o, std::bit_xor()); + NIL_CO3_MP_FORCEINLINE constexpr void bitwise_xor(const big_uint& other) noexcept { + bitwise_op(other, std::bit_xor()); } // @@ -762,10 +767,10 @@ namespace nil::crypto3::multiprecision { NIL_CO3_MP_FORCEINLINE constexpr void bitwise_xor(limb_type l) noexcept { limbs()[0] ^= l; } - NIL_CO3_MP_FORCEINLINE constexpr void complement(const big_uint& o) noexcept { - std::size_t os = o.limb_count(); + NIL_CO3_MP_FORCEINLINE constexpr void complement(const big_uint& other) noexcept { + std::size_t os = other.limb_count(); for (std::size_t i = 0; i < os; ++i) { - limbs()[i] = ~o.limbs()[i]; + limbs()[i] = ~other.limbs()[i]; } normalize(); } @@ -925,10 +930,13 @@ namespace nil::crypto3::multiprecision { } // Shifting left throws away upper Bits. - constexpr big_uint& operator<<=(double_limb_type s) noexcept { - if (!s) { + template + constexpr big_uint& operator<<=(T s_original) { + static_assert(std::is_integral_v); + if (!s_original) { return *this; } + auto s = detail::unsigned_or_throw(s_original); #if NIL_CO3_MP_ENDIAN_LITTLE_BYTE && defined(NIL_CO3_MP_USE_LIMB_SHIFT) constexpr limb_type limb_shift_mask = limb_bits - 1; @@ -962,16 +970,20 @@ namespace nil::crypto3::multiprecision { return *this; } - constexpr big_uint operator<<(double_limb_type s) const noexcept { + template + constexpr big_uint operator<<(T s) const { big_uint result = *this; result <<= s; return result; } - constexpr big_uint& operator>>=(double_limb_type s) noexcept { - if (!s) { + template + constexpr big_uint& operator>>=(T s_original) { + static_assert(std::is_integral_v); + if (!s_original) { return *this; } + auto s = detail::unsigned_or_throw(s_original); #if NIL_CO3_MP_ENDIAN_LITTLE_BYTE && defined(NIL_CO3_MP_USE_LIMB_SHIFT) constexpr limb_type limb_shift_mask = limb_bits - 1; @@ -1004,7 +1016,8 @@ namespace nil::crypto3::multiprecision { return *this; } - constexpr big_uint operator>>(double_limb_type s) const noexcept { + template + constexpr big_uint operator>>(T s) const { big_uint result = *this; result >>= s; return result; @@ -1058,7 +1071,7 @@ namespace nil::crypto3::multiprecision { return static_cast(limbs()[offset] & mask); } - constexpr void bit_set(std::size_t index) { + constexpr big_uint& bit_set(std::size_t index) { if (index >= Bits) { throw std::invalid_argument("fixed precision overflow"); } @@ -1066,9 +1079,10 @@ namespace nil::crypto3::multiprecision { std::size_t shift = index % limb_bits; limb_type mask = limb_type(1u) << shift; limbs()[offset] |= mask; + return *this; } - constexpr void bit_unset(std::size_t index) { + constexpr big_uint& bit_unset(std::size_t index) { if (index >= Bits) { throw std::invalid_argument("fixed precision overflow"); } @@ -1076,9 +1090,10 @@ namespace nil::crypto3::multiprecision { std::size_t shift = index % limb_bits; limb_type mask = limb_type(1u) << shift; limbs()[offset] &= ~mask; + return *this; } - constexpr void bit_flip(std::size_t index) { + constexpr big_uint& bit_flip(std::size_t index) { if (index >= Bits) { throw std::invalid_argument("fixed precision overflow"); } @@ -1086,6 +1101,7 @@ namespace nil::crypto3::multiprecision { std::size_t shift = index % limb_bits; limb_type mask = limb_type(1u) << shift; limbs()[offset] ^= mask; + return *this; } // Import / export @@ -1238,21 +1254,28 @@ namespace nil::crypto3::multiprecision { // Hash - friend constexpr std::size_t hash_value(const big_uint& val) noexcept { + friend constexpr std::size_t hash_value(const big_uint& a) noexcept { std::size_t result = 0; - for (std::size_t i = 0; i < val.limb_count(); ++i) { - boost::hash_combine(result, val.limbs()[i]); + for (std::size_t i = 0; i < a.limb_count(); ++i) { + boost::hash_combine(result, a.limbs()[i]); } return result; } // IO - friend constexpr std::ostream& operator<<(std::ostream& os, const big_uint& value) { - os << value.str(os.flags()); + friend constexpr std::ostream& operator<<(std::ostream& os, const big_uint& a) { + os << a.str(os.flags()); return os; } + friend constexpr std::istream& operator>>(std::istream& is, big_uint& a) { + std::string s; + is >> s; + a = s; + return is; + } + private: // Data @@ -1329,6 +1352,21 @@ namespace nil::crypto3::multiprecision { return a.bit_test(index); } + template + constexpr big_uint& bit_set(big_uint& a, std::size_t index) { + return a.bit_set(index); + } + + template + constexpr big_uint& bit_unset(big_uint& a, std::size_t index) { + return a.bit_unset(index); + } + + template + constexpr big_uint& bit_flip(big_uint& a, std::size_t index) { + return a.bit_flip(index); + } + template constexpr bool is_zero(const big_uint& a) { return a.is_zero(); diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/pow.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/pow.hpp new file mode 100644 index 000000000..31d406eb1 --- /dev/null +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/pow.hpp @@ -0,0 +1,47 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2019-2021 Aleksei Moskvin +// Copyright (c) 2020 Mikhail Komarov +// Copyright (c) 2020 Ilias Khairullin +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// + +#pragma once + +// IWYU pragma: private; include "nil/crypto3/multiprecision/big_uint.hpp" + +#include + +#include "nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp" +#include "nil/crypto3/multiprecision/detail/integer_ops_base.hpp" + +namespace nil::crypto3::multiprecision { + template> && + detail::is_integral_v>, + int> = 0> + constexpr std::decay_t pow(T1 b, T2 e) { + if (is_zero(e)) { + return 1u; + } + + T1 res = 1u; + + while (true) { + bool lsb = bit_test(e, 0u); + e >>= 1u; + if (lsb) { + res *= b; + if (is_zero(e)) { + break; + } + } + b *= b; + } + + return res; + } +} // namespace nil::crypto3::multiprecision diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/powm.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/powm.hpp index 497200b64..20a9a868a 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/powm.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/powm.hpp @@ -13,7 +13,6 @@ // IWYU pragma: private; include "nil/crypto3/multiprecision/big_uint.hpp" -#include #include #include "nil/crypto3/multiprecision/detail/big_mod/big_mod_impl.hpp" @@ -21,11 +20,15 @@ #include "nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp" namespace nil::crypto3::multiprecision { - template> && - detail::is_integral_v>, + detail::is_integral_v> && + detail::is_integral_v>, int> = 0> - constexpr big_uint powm(T1 &&b, T2 &&e, const big_uint &m) { - return pow(big_mod_rt(std::forward(b), m), std::forward(e)).base(); + constexpr std::decay_t powm(T1 &&b, T2 &&e, T3 &&m) { + using big_mod_t = big_mod_rt< + std::decay_t::Bits>; + return static_cast>( + pow(big_mod_t(std::forward(b), std::forward(m)), std::forward(e)).base()); } } // namespace nil::crypto3::multiprecision diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_base.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_base.hpp index 4350eb45c..58bc308e3 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_base.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_base.hpp @@ -32,6 +32,27 @@ namespace nil::crypto3::multiprecision { return detail::as_big_uint(detail::unsigned_or_throw(a)).bit_test(index); } + template, int> = 0> + constexpr T &bit_set(T &a, std::size_t index) { + // TODO(ioxid): optimize + a = detail::as_big_uint(detail::unsigned_or_throw(a)).bit_set(index); + return a; + } + + template, int> = 0> + constexpr T &bit_unset(T &a, std::size_t index) { + // TODO(ioxid): optimize + a = detail::as_big_uint(detail::unsigned_or_throw(a)).bit_unset(index); + return a; + } + + template, int> = 0> + constexpr T &bit_flip(T &a, std::size_t index) { + // TODO(ioxid): optimize + a = detail::as_big_uint(detail::unsigned_or_throw(a)).bit_flip(index); + return a; + } + template, int> = 0> constexpr bool is_zero(T a) { return a == 0; diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_pow.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_pow.hpp new file mode 100644 index 000000000..2ba1d08f2 --- /dev/null +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_pow.hpp @@ -0,0 +1,11 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// + +#pragma once + +#include "nil/crypto3/multiprecision/detail/big_uint/ops/pow.hpp" // IWYU pragma: export diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_powm.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_powm.hpp index 529c5d44c..2dec67fec 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_powm.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_powm.hpp @@ -8,21 +8,5 @@ #pragma once -#include -#include - -#include "nil/crypto3/multiprecision/detail/big_uint/ops/powm.hpp" - -namespace nil::crypto3::multiprecision { - template>::is_integer && - std::numeric_limits>::is_integer && - std::is_integral_v, - int> = 0> - constexpr T3 powm(T1 &&b, T2 &&e, T3 m) { - // TODO(ioxid): optimize - return static_cast( - nil::crypto3::multiprecision::powm(std::forward(b), std::forward(e), - detail::as_big_uint(detail::unsigned_or_throw(m)))); - } -} // namespace nil::crypto3::multiprecision +// Reusing big_uint's implementation. TODO(ioxid): optimize for builtin types +#include "nil/crypto3/multiprecision/detail/big_uint/ops/powm.hpp" // IWYU pragma: export diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/integer.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/integer.hpp index c8bc9046e..ae697092d 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/integer.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/integer.hpp @@ -9,4 +9,5 @@ #pragma once #include "nil/crypto3/multiprecision/detail/integer_ops_base.hpp" // IWYU pragma: export +#include "nil/crypto3/multiprecision/detail/integer_ops_pow.hpp" // IWYU pragma: export #include "nil/crypto3/multiprecision/detail/integer_ops_powm.hpp" // IWYU pragma: export diff --git a/crypto3/libs/multiprecision/test/CMakeLists.txt b/crypto3/libs/multiprecision/test/CMakeLists.txt index 67f16d3fe..ce643c124 100644 --- a/crypto3/libs/multiprecision/test/CMakeLists.txt +++ b/crypto3/libs/multiprecision/test/CMakeLists.txt @@ -42,10 +42,11 @@ macro(define_multiprecision_test name) endmacro(define_multiprecision_test) set(MULTIPRECISION_TESTS_NAMES + "big_mod_arithmetic" "big_mod_basic" - "big_mod_randomized" - "big_uint_comparison_randomized" - "big_uint" + "big_uint_arithmetic" + "big_uint_basic" + "big_uint_comparison" "inverse" "jacobi" "miller_rabin" diff --git a/crypto3/libs/multiprecision/test/big_mod_randomized.cpp b/crypto3/libs/multiprecision/test/big_mod_arithmetic.cpp similarity index 98% rename from crypto3/libs/multiprecision/test/big_mod_randomized.cpp rename to crypto3/libs/multiprecision/test/big_mod_arithmetic.cpp index f4dd2064f..7e0844995 100644 --- a/crypto3/libs/multiprecision/test/big_mod_randomized.cpp +++ b/crypto3/libs/multiprecision/test/big_mod_arithmetic.cpp @@ -9,7 +9,7 @@ // http://www.boost.org/LICENSE_1_0.txt //---------------------------------------------------------------------------// -#define BOOST_TEST_MODULE big_int_modular_comprehensive_test +#define BOOST_TEST_MODULE big_mod_arithmetic_test #include #include diff --git a/crypto3/libs/multiprecision/test/big_mod_basic.cpp b/crypto3/libs/multiprecision/test/big_mod_basic.cpp index d3f834fe8..6c075c43e 100644 --- a/crypto3/libs/multiprecision/test/big_mod_basic.cpp +++ b/crypto3/libs/multiprecision/test/big_mod_basic.cpp @@ -6,7 +6,7 @@ // http://www.boost.org/LICENSE_1_0.txt //---------------------------------------------------------------------------// -#define BOOST_TEST_MODULE big_int_modular_test +#define BOOST_TEST_MODULE big_mod_basic_test #include #include diff --git a/crypto3/libs/multiprecision/test/big_uint_arithmetic.cpp b/crypto3/libs/multiprecision/test/big_uint_arithmetic.cpp new file mode 100644 index 000000000..90f82d04d --- /dev/null +++ b/crypto3/libs/multiprecision/test/big_uint_arithmetic.cpp @@ -0,0 +1,2034 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2012 John Maddock +// Copyright (c) 2024 Andrey Nefedov +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +//---------------------------------------------------------------------------// + +#define BOOST_TEST_MODULE big_uint_arithmetic_test + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include + +template +struct is_twos_complement_integer : public std::integral_constant {}; + +template +struct is_checked_cpp_int : public std::integral_constant {}; + +template +void test_comparisons(val_t, val_t, const std::integral_constant&) {} + +int normalize_compare_result(int r) { return r > 0 ? 1 : r < 0 ? -1 : 0; } + +template +void test_comparisons(val_t a, val_t b, const std::integral_constant&) { + big_uint_t r1(a); + big_uint_t r2(b); + big_uint_t z(1); + + int cr = a < b ? -1 : a > b ? 1 : 0; + + BOOST_CHECK_EQUAL(r1 == r2, a == b); + BOOST_CHECK_EQUAL(r1 != r2, a != b); + BOOST_CHECK_EQUAL(r1 <= r2, a <= b); + BOOST_CHECK_EQUAL(r1 < r2, a < b); + BOOST_CHECK_EQUAL(r1 >= r2, a >= b); + BOOST_CHECK_EQUAL(r1 > r2, a > b); + + BOOST_CHECK_EQUAL(r1 == b, a == b); + BOOST_CHECK_EQUAL(r1 != b, a != b); + BOOST_CHECK_EQUAL(r1 <= b, a <= b); + BOOST_CHECK_EQUAL(r1 < b, a < b); + BOOST_CHECK_EQUAL(r1 >= b, a >= b); + BOOST_CHECK_EQUAL(r1 > b, a > b); + + BOOST_CHECK_EQUAL(a == r2, a == b); + BOOST_CHECK_EQUAL(a != r2, a != b); + BOOST_CHECK_EQUAL(a <= r2, a <= b); + BOOST_CHECK_EQUAL(a < r2, a < b); + BOOST_CHECK_EQUAL(a >= r2, a >= b); + BOOST_CHECK_EQUAL(a > r2, a > b); + + BOOST_CHECK_EQUAL(r1 * z == r2, a == b); + BOOST_CHECK_EQUAL(r1 * z != r2, a != b); + BOOST_CHECK_EQUAL(r1 * z <= r2, a <= b); + BOOST_CHECK_EQUAL(r1 * z < r2, a < b); + BOOST_CHECK_EQUAL(r1 * z >= r2, a >= b); + BOOST_CHECK_EQUAL(r1 * z > r2, a > b); + + BOOST_CHECK_EQUAL(r1 == r2 * z, a == b); + BOOST_CHECK_EQUAL(r1 != r2 * z, a != b); + BOOST_CHECK_EQUAL(r1 <= r2 * z, a <= b); + BOOST_CHECK_EQUAL(r1 < r2 * z, a < b); + BOOST_CHECK_EQUAL(r1 >= r2 * z, a >= b); + BOOST_CHECK_EQUAL(r1 > r2 * z, a > b); + + BOOST_CHECK_EQUAL(r1 * z == r2 * z, a == b); + BOOST_CHECK_EQUAL(r1 * z != r2 * z, a != b); + BOOST_CHECK_EQUAL(r1 * z <= r2 * z, a <= b); + BOOST_CHECK_EQUAL(r1 * z < r2 * z, a < b); + BOOST_CHECK_EQUAL(r1 * z >= r2 * z, a >= b); + BOOST_CHECK_EQUAL(r1 * z > r2 * z, a > b); + + BOOST_CHECK_EQUAL(r1 * z == b, a == b); + BOOST_CHECK_EQUAL(r1 * z != b, a != b); + BOOST_CHECK_EQUAL(r1 * z <= b, a <= b); + BOOST_CHECK_EQUAL(r1 * z < b, a < b); + BOOST_CHECK_EQUAL(r1 * z >= b, a >= b); + BOOST_CHECK_EQUAL(r1 * z > b, a > b); + + BOOST_CHECK_EQUAL(a == r2 * z, a == b); + BOOST_CHECK_EQUAL(a != r2 * z, a != b); + BOOST_CHECK_EQUAL(a <= r2 * z, a <= b); + BOOST_CHECK_EQUAL(a < r2 * z, a < b); + BOOST_CHECK_EQUAL(a >= r2 * z, a >= b); + BOOST_CHECK_EQUAL(a > r2 * z, a > b); + + BOOST_CHECK_EQUAL(normalize_compare_result(r1.compare(r2)), cr); + BOOST_CHECK_EQUAL(normalize_compare_result(r2.compare(r1)), -cr); + BOOST_CHECK_EQUAL(normalize_compare_result(r1.compare(b)), cr); + BOOST_CHECK_EQUAL(normalize_compare_result(r2.compare(a)), -cr); +} + +template +void test_conditional(big_uint_t v, Exp e) { + // + // Verify that Exp is usable in Boolean contexts, and has the same value as v: + // + if (e) { + BOOST_CHECK(v); + } else { + BOOST_CHECK(!v); + } + if (!e) { + BOOST_CHECK(!v); + } else { + BOOST_CHECK(v); + } +} + +template +void test_complement(big_uint_t a, big_uint_t b, big_uint_t c, + const std::integral_constant&) { + int i = 1020304; + int j = 56789123; + int sign_mask = ~0; + if (std::numeric_limits::is_signed) { + BOOST_CHECK_EQUAL(~a, (~i & sign_mask)); + c = a & ~b; + BOOST_CHECK_EQUAL(c, (i & (~j & sign_mask))); + c = ~(a | b); + BOOST_CHECK_EQUAL(c, (~(i | j) & sign_mask)); + } else { + BOOST_CHECK_EQUAL((~a & a), 0); + } +} + +template +void test_complement(big_uint_t, big_uint_t, big_uint_t, + const std::integral_constant&) {} + +template +void test_signed_integer_ops(const std::integral_constant&) { + big_uint_t a(20); + big_uint_t b(7); + big_uint_t c(5); + BOOST_CHECK_EQUAL(-a % c, 0); + BOOST_CHECK_EQUAL(-a % b, -20 % 7); + BOOST_CHECK_EQUAL(-a % -b, -20 % -7); + BOOST_CHECK_EQUAL(a % -b, 20 % -7); + BOOST_CHECK_EQUAL(-a % 7, -20 % 7); + BOOST_CHECK_EQUAL(-a % -7, -20 % -7); + BOOST_CHECK_EQUAL(a % -7, 20 % -7); + BOOST_CHECK_EQUAL(-a % 7u, -20 % 7); + BOOST_CHECK_EQUAL(-a % a, 0); + BOOST_CHECK_EQUAL(-a % 5, 0); + BOOST_CHECK_EQUAL(-a % -5, 0); + BOOST_CHECK_EQUAL(a % -5, 0); + + b = -b; + BOOST_CHECK_EQUAL(a % b, 20 % -7); + a = -a; + BOOST_CHECK_EQUAL(a % b, -20 % -7); + BOOST_CHECK_EQUAL(a % -7, -20 % -7); + b = 7; + BOOST_CHECK_EQUAL(a % b, -20 % 7); + BOOST_CHECK_EQUAL(a % 7, -20 % 7); + BOOST_CHECK_EQUAL(a % 7u, -20 % 7); + + a = 20; + a %= b; + BOOST_CHECK_EQUAL(a, 20 % 7); + a = -20; + a %= b; + BOOST_CHECK_EQUAL(a, -20 % 7); + a = 20; + a %= -b; + BOOST_CHECK_EQUAL(a, 20 % -7); + a = -20; + a %= -b; + BOOST_CHECK_EQUAL(a, -20 % -7); + a = 5; + a %= b - a; + BOOST_CHECK_EQUAL(a, 5 % (7 - 5)); + a = -20; + a %= 7; + BOOST_CHECK_EQUAL(a, -20 % 7); + a = 20; + a %= -7; + BOOST_CHECK_EQUAL(a, 20 % -7); + a = -20; + a %= -7; + BOOST_CHECK_EQUAL(a, -20 % -7); +#ifndef BOOST_NO_LONG_LONG + a = -20; + a %= 7uLL; + BOOST_CHECK_EQUAL(a, -20 % 7); + a = 20; + a %= -7LL; + BOOST_CHECK_EQUAL(a, 20 % -7); + a = -20; + a %= -7LL; + BOOST_CHECK_EQUAL(a, -20 % -7); +#endif + a = 400; + b = 45; + // TODO(ioxid): implement lcm + // BOOST_CHECK_EQUAL(gcd(a, -45), boost::integer::gcd(400, 45)); + // BOOST_CHECK_EQUAL(lcm(a, -45), boost::integer::lcm(400, 45)); + // BOOST_CHECK_EQUAL(gcd(-400, b), boost::integer::gcd(400, 45)); + // BOOST_CHECK_EQUAL(lcm(-400, b), boost::integer::lcm(400, 45)); + a = -20; + BOOST_CHECK_EQUAL(abs(a), 20); + BOOST_CHECK_EQUAL(abs(-a), 20); + BOOST_CHECK_EQUAL(abs(+a), 20); + a = 20; + BOOST_CHECK_EQUAL(abs(a), 20); + BOOST_CHECK_EQUAL(abs(-a), 20); + BOOST_CHECK_EQUAL(abs(+a), 20); + a = -400; + b = 45; + // TODO(ioxid): implement lcm + // BOOST_CHECK_EQUAL(gcd(a, b), boost::integer::gcd(-400, 45)); + // BOOST_CHECK_EQUAL(lcm(a, b), boost::integer::lcm(-400, 45)); + // BOOST_CHECK_EQUAL(gcd(a, 45), boost::integer::gcd(-400, 45)); + // BOOST_CHECK_EQUAL(lcm(a, 45), boost::integer::lcm(-400, 45)); + // BOOST_CHECK_EQUAL(gcd(-400, b), boost::integer::gcd(-400, 45)); + // BOOST_CHECK_EQUAL(lcm(-400, b), boost::integer::lcm(-400, 45)); + big_uint_t r; + divide_qr(a, b, c, r); + BOOST_CHECK_EQUAL(c, a / b); + BOOST_CHECK_EQUAL(r, a % b); + BOOST_CHECK_EQUAL(integer_modulus(a, 57), abs(a % 57)); + b = -57; + divide_qr(a, b, c, r); + BOOST_CHECK_EQUAL(c, a / b); + BOOST_CHECK_EQUAL(r, a % b); + BOOST_CHECK_EQUAL(integer_modulus(a, -57), abs(a % -57)); + a = 458; + divide_qr(a, b, c, r); + BOOST_CHECK_EQUAL(c, a / b); + BOOST_CHECK_EQUAL(r, a % b); + BOOST_CHECK_EQUAL(integer_modulus(a, -57), abs(a % -57)); +#ifndef TEST_CHECKED_INT + if (is_checked_cpp_int::value) { + a = -1; +#ifndef BOOST_NO_EXCEPTIONS + BOOST_CHECK_THROW(a << 2, std::range_error); + BOOST_CHECK_THROW(a >> 2, std::range_error); + BOOST_CHECK_THROW(a <<= 2, std::range_error); + BOOST_CHECK_THROW(a >>= 2, std::range_error); +#endif + } else { + a = -1; + BOOST_CHECK_EQUAL(a << 10, -1024); + a = -23; + BOOST_CHECK_EQUAL(a << 10, -23552); + a = -23456; + BOOST_CHECK_EQUAL(a >> 10, -23); + a = -3; + BOOST_CHECK_EQUAL(a >> 10, -1); + } +#endif +} +template +void test_signed_integer_ops(const std::integral_constant&) {} + +template +inline big_uint_t negate_if_signed(big_uint_t r, const std::integral_constant&) { + return -r; +} +template +inline big_uint_t negate_if_signed(big_uint_t r, const std::integral_constant&) { + return r; +} + +template +void test_integer_overflow() { + if (std::numeric_limits::digits > std::numeric_limits::digits) { + big_uint_t m((std::numeric_limits::max)()); + Int r; + ++m; + if (is_checked_cpp_int::value) { + BOOST_CHECK_THROW((void)static_cast(m), std::overflow_error); + } else if (std::is_signed::value) { + r = static_cast(m); + BOOST_CHECK_EQUAL(r, (std::numeric_limits::max)()); + } else { + r = static_cast(m); + BOOST_CHECK_EQUAL(r, 0); + } + // Again with much larger value: + m = 1u; + m <<= (std::min)(std::numeric_limits::digits - 1, 1000); + if (is_checked_cpp_int::value) { + BOOST_CHECK_THROW((void)static_cast(m), std::overflow_error); + } else if (std::is_signed::value && std::is_integral::value) { + r = static_cast(m); + BOOST_CHECK_EQUAL(r, (std::numeric_limits::max)()); + } else { + r = static_cast(m); + BOOST_CHECK_EQUAL(r, 0); + } + + if (std::numeric_limits::is_signed && (std::is_signed::value)) { + m = (std::numeric_limits::min)(); + --m; + if (is_checked_cpp_int::value) { + BOOST_CHECK_THROW((void)static_cast(m), std::overflow_error); + } else { + r = static_cast(m); + BOOST_CHECK_EQUAL(r, (std::numeric_limits::min)()); + } + // Again with much larger value: + m = 2u; + m = pow(m, (std::min)(std::numeric_limits::digits - 1, 1000)); + ++m; + m = negate_if_signed( + m, std::integral_constant::is_signed>()); + if (is_checked_cpp_int::value) { + BOOST_CHECK_THROW((void)static_cast(m), std::overflow_error); + } else { + r = static_cast(m); + BOOST_CHECK_EQUAL(r, (std::numeric_limits::min)()); + } + } else if (std::numeric_limits::is_signed && !std::is_signed::value) { + // signed to unsigned converison with overflow, it's really not clear what should happen + // here! + m = (std::numeric_limits::max)(); + ++m; + m = negate_if_signed( + m, std::integral_constant::is_signed>()); + BOOST_CHECK_THROW((void)static_cast(m), std::range_error); + // Again with much larger value: + m = 2u; + m = pow(m, (std::min)(std::numeric_limits::digits - 1, 1000)); + m = negate_if_signed( + m, std::integral_constant::is_signed>()); + BOOST_CHECK_THROW((void)static_cast(m), std::range_error); + } + } +} + +template +void test_integer_round_trip() { + if (std::numeric_limits::digits >= std::numeric_limits::digits) { + big_uint_t m((std::numeric_limits::max)()); + Int r = static_cast(m); + BOOST_CHECK_EQUAL(m, r); + if (std::numeric_limits::is_signed && + (std::numeric_limits::digits > std::numeric_limits::digits)) { + m = (std::numeric_limits::min)(); + r = static_cast(m); + BOOST_CHECK_EQUAL(m, r); + } + } + test_integer_overflow(); +} + +template +void test_integer_ops() { // NOLINT + test_signed_integer_ops( + std::integral_constant::is_signed>()); + + big_uint_t a(20); + big_uint_t b(7); + big_uint_t c(5); + BOOST_CHECK_EQUAL(a % b, 20 % 7); + BOOST_CHECK_EQUAL(a % 7, 20 % 7); + BOOST_CHECK_EQUAL(a % 7u, 20 % 7); + BOOST_CHECK_EQUAL(a % a, 0); + BOOST_CHECK_EQUAL(a % c, 0); + BOOST_CHECK_EQUAL(a % 5, 0); + a = a % (b + 0); + BOOST_CHECK_EQUAL(a, 20 % 7); + a = 20; + c = (a + 2) % (a - 1); + BOOST_CHECK_EQUAL(c, 22 % 19); + c = 5; + a = b % (a - 15); + BOOST_CHECK_EQUAL(a, 7 % 5); + a = 20; + + a = 20; + a %= 7; + BOOST_CHECK_EQUAL(a, 20 % 7); +#ifndef BOOST_NO_LONG_LONG + a = 20; + a %= 7uLL; + BOOST_CHECK_EQUAL(a, 20 % 7); +#endif + a = 20; + ++a; + BOOST_CHECK_EQUAL(a, 21); + --a; + BOOST_CHECK_EQUAL(a, 20); + BOOST_CHECK_EQUAL(a++, 20); + BOOST_CHECK_EQUAL(a, 21); + BOOST_CHECK_EQUAL(a--, 21); + BOOST_CHECK_EQUAL(a, 20); + a = 2000; + a <<= 20; + BOOST_CHECK_EQUAL(a, 2000L << 20); + a >>= 20; + BOOST_CHECK_EQUAL(a, 2000); + a <<= 20u; + BOOST_CHECK_EQUAL(a, 2000L << 20); + a >>= 20u; + BOOST_CHECK_EQUAL(a, 2000); +#ifndef BOOST_NO_EXCEPTIONS + BOOST_CHECK_THROW(a <<= -20, std::range_error); + BOOST_CHECK_THROW((void)(a >>= -20), std::range_error); + BOOST_CHECK_THROW((void)big_uint_t(a << -20), std::range_error); + BOOST_CHECK_THROW((void)big_uint_t(a >> -20), std::range_error); +#endif +#ifndef BOOST_NO_LONG_LONG + if (sizeof(long long) > sizeof(std::size_t)) { + // extreme values should trigger an exception: +#ifndef BOOST_NO_EXCEPTIONS + BOOST_CHECK_THROW(a >>= (1uLL << (sizeof(long long) * CHAR_BIT - 2)), std::range_error); + BOOST_CHECK_THROW(a <<= (1uLL << (sizeof(long long) * CHAR_BIT - 2)), std::range_error); + BOOST_CHECK_THROW(a >>= -(1LL << (sizeof(long long) * CHAR_BIT - 2)), std::range_error); + BOOST_CHECK_THROW(a <<= -(1LL << (sizeof(long long) * CHAR_BIT - 2)), std::range_error); + BOOST_CHECK_THROW(a >>= (1LL << (sizeof(long long) * CHAR_BIT - 2)), std::range_error); + BOOST_CHECK_THROW(a <<= (1LL << (sizeof(long long) * CHAR_BIT - 2)), std::range_error); +#endif + // Unless they fit within range: + a = 2000L; + a <<= 20uLL; + BOOST_CHECK_EQUAL(a, (2000L << 20)); + a = 2000; + a <<= 20LL; + BOOST_CHECK_EQUAL(a, (2000L << 20)); + +#ifndef BOOST_NO_EXCEPTIONS + BOOST_CHECK_THROW(big_uint_t(a >> (1uLL << (sizeof(long long) * CHAR_BIT - 2))), + std::range_error); + BOOST_CHECK_THROW(big_uint_t(a <<= (1uLL << (sizeof(long long) * CHAR_BIT - 2))), + std::range_error); + BOOST_CHECK_THROW(big_uint_t(a >>= -(1LL << (sizeof(long long) * CHAR_BIT - 2))), + std::range_error); + BOOST_CHECK_THROW(big_uint_t(a <<= -(1LL << (sizeof(long long) * CHAR_BIT - 2))), + std::range_error); + BOOST_CHECK_THROW(big_uint_t(a >>= (1LL << (sizeof(long long) * CHAR_BIT - 2))), + std::range_error); + BOOST_CHECK_THROW(big_uint_t(a <<= (1LL << (sizeof(long long) * CHAR_BIT - 2))), + std::range_error); +#endif + // Unless they fit within range: + a = 2000L; + BOOST_CHECK_EQUAL(big_uint_t(a << 20uLL), (2000L << 20)); + a = 2000; + BOOST_CHECK_EQUAL(big_uint_t(a << 20LL), (2000L << 20)); + } +#endif + a = 20; + b = a << 20; + BOOST_CHECK_EQUAL(b, (20 << 20)); + b = a >> 2; + BOOST_CHECK_EQUAL(b, (20 >> 2)); + b = (a + 2) << 10; + BOOST_CHECK_EQUAL(b, (22 << 10)); + b = (a + 3) >> 3; + BOOST_CHECK_EQUAL(b, (23 >> 3)); + // + // Bit fiddling: + // + int i = 1020304; + int j = 56789123; + int k = 4523187; + a = i; + b = j; + c = a; + c &= b; + BOOST_CHECK_EQUAL(c, (i & j)); + c = a; + c &= j; + BOOST_CHECK_EQUAL(c, (i & j)); + c = a; + c &= a + b; + BOOST_CHECK_EQUAL(c, (i & (i + j))); + BOOST_CHECK_EQUAL((a & b), (i & j)); + c = k; + a = a & (b + k); + BOOST_CHECK_EQUAL(a, (i & (j + k))); + a = i; + a = (b + k) & a; + BOOST_CHECK_EQUAL(a, (i & (j + k))); + a = i; + c = a & b & k; + BOOST_CHECK_EQUAL(c, (i & j & k)); + c = a; + c &= (c + b); + BOOST_CHECK_EQUAL(c, (i & (i + j))); + c = a & (b | 1); + BOOST_CHECK_EQUAL(c, (i & (j | 1))); + + test_complement(a, b, c, typename is_twos_complement_integer::type()); + + a = i; + b = j; + c = a; + c |= b; + BOOST_CHECK_EQUAL(c, (i | j)); + c = a; + c |= j; + BOOST_CHECK_EQUAL(c, (i | j)); + c = a; + c |= a + b; + BOOST_CHECK_EQUAL(c, (i | (i + j))); + BOOST_CHECK_EQUAL((a | b), (i | j)); + c = k; + a = a | (b + k); + BOOST_CHECK_EQUAL(a, (i | (j + k))); + a = i; + a = (b + k) | a; + BOOST_CHECK_EQUAL(a, (i | (j + k))); + a = i; + c = a | b | k; + BOOST_CHECK_EQUAL(c, (i | j | k)); + c = a; + c |= (c + b); + BOOST_CHECK_EQUAL(c, (i | (i + j))); + c = a | (b | 1); + BOOST_CHECK_EQUAL(c, (i | (j | 1))); + + a = i; + b = j; + c = a; + c ^= b; + BOOST_CHECK_EQUAL(c, (i ^ j)); + c = a; + c ^= j; + BOOST_CHECK_EQUAL(c, (i ^ j)); + c = a; + c ^= a + b; + BOOST_CHECK_EQUAL(c, (i ^ (i + j))); + BOOST_CHECK_EQUAL((a ^ b), (i ^ j)); + c = k; + a = a ^ (b + k); + BOOST_CHECK_EQUAL(a, (i ^ (j + k))); + a = i; + a = (b + k) ^ a; + BOOST_CHECK_EQUAL(a, (i ^ (j + k))); + a = i; + c = a ^ b ^ k; + BOOST_CHECK_EQUAL(c, (i ^ j ^ k)); + c = a; + c ^= (c + b); + BOOST_CHECK_EQUAL(c, (i ^ (i + j))); + c = a ^ (b | 1); + BOOST_CHECK_EQUAL(c, (i ^ (j | 1))); + + a = i; + b = j; + c = k; + // + // Non-member functions: + // + a = 400; + b = 45; + // TODO(ioxid): implement lcm + // BOOST_CHECK_EQUAL(gcd(a, b), boost::integer::gcd(400, 45)); + // BOOST_CHECK_EQUAL(lcm(a, b), boost::integer::lcm(400, 45)); + // BOOST_CHECK_EQUAL(gcd(a, 45), boost::integer::gcd(400, 45)); + // BOOST_CHECK_EQUAL(lcm(a, 45), boost::integer::lcm(400, 45)); + // BOOST_CHECK_EQUAL(gcd(a, 45u), boost::integer::gcd(400, 45)); + // BOOST_CHECK_EQUAL(lcm(a, 45u), boost::integer::lcm(400, 45)); + // BOOST_CHECK_EQUAL(gcd(400, b), boost::integer::gcd(400, 45)); + // BOOST_CHECK_EQUAL(lcm(400, b), boost::integer::lcm(400, 45)); + // BOOST_CHECK_EQUAL(gcd(400u, b), boost::integer::gcd(400, 45)); + // BOOST_CHECK_EQUAL(lcm(400u, b), boost::integer::lcm(400, 45)); + + if (std::numeric_limits::is_bounded) { + // Fixed precision integer: + a = (std::numeric_limits::max)() - 1; + b = (std::numeric_limits::max)() / 35; + big_uint_t div = gcd(a, b); + BOOST_CHECK_EQUAL(a % div, 0); + BOOST_CHECK_EQUAL(b % div, 0); + } + + // + // Conditionals involving 2 arg functions: + // + test_conditional(big_uint_t(gcd(a, b)), gcd(a, b)); + + big_uint_t r; + divide_qr(a, b, c, r); + BOOST_CHECK_EQUAL(c, a / b); + BOOST_CHECK_EQUAL(r, a % b); + divide_qr(a + 0, b, c, r); + BOOST_CHECK_EQUAL(c, a / b); + BOOST_CHECK_EQUAL(r, a % b); + divide_qr(a, b + 0, c, r); + BOOST_CHECK_EQUAL(c, a / b); + BOOST_CHECK_EQUAL(r, a % b); + divide_qr(a + 0, b + 0, c, r); + BOOST_CHECK_EQUAL(c, a / b); + BOOST_CHECK_EQUAL(r, a % b); + // BOOST_CHECK_EQUAL(integer_modulus(a, 57), a % 57); + for (i = 0; i < 20; ++i) { + if (std::numeric_limits::is_specialized && + (!std::numeric_limits::is_bounded || + (i * 17 < std::numeric_limits::digits))) { + BOOST_CHECK_EQUAL(lsb(big_uint_t(1) << (i * 17)), static_cast(i * 17)); + BOOST_CHECK_EQUAL(msb(big_uint_t(1) << (i * 17)), static_cast(i * 17)); + BOOST_CHECK(bit_test(big_uint_t(1) << (i * 17), i * 17)); + BOOST_CHECK(!bit_test(big_uint_t(1) << (i * 17), i * 17 + 1)); + if (i) { + BOOST_CHECK(!bit_test(big_uint_t(1) << (i * 17), i * 17 - 1)); + } + big_uint_t zero(0); + BOOST_CHECK(bit_test(bit_set(zero, i * 17), i * 17)); + zero = 0; + BOOST_CHECK_EQUAL(bit_flip(zero, i * 17), big_uint_t(1) << i * 17); + zero = big_uint_t(1) << i * 17; + BOOST_CHECK_EQUAL(bit_flip(zero, i * 17), 0); + zero = big_uint_t(1) << i * 17; + BOOST_CHECK_EQUAL(bit_unset(zero, i * 17), 0); + } + } + // + // pow, powm: + // + BOOST_CHECK_EQUAL(pow(big_uint_t(3), 4u), 81); + BOOST_CHECK_EQUAL(pow(big_uint_t(3) + big_uint_t(0), 4u), 81); + BOOST_CHECK_EQUAL(powm(big_uint_t(3), big_uint_t(4), big_uint_t(13)), 81 % 13); + BOOST_CHECK_EQUAL(powm(big_uint_t(3), big_uint_t(4), 13), 81 % 13); + BOOST_CHECK_EQUAL(powm(big_uint_t(3), big_uint_t(4), big_uint_t(13) + 0), 81 % 13); + BOOST_CHECK_EQUAL(powm(big_uint_t(3), big_uint_t(4) + 0, big_uint_t(13)), 81 % 13); + BOOST_CHECK_EQUAL(powm(big_uint_t(3), big_uint_t(4) + 0, 13), 81 % 13); + BOOST_CHECK_EQUAL(powm(big_uint_t(3), big_uint_t(4) + 0, big_uint_t(13) + 0), 81 % 13); + BOOST_CHECK_EQUAL(powm(big_uint_t(3), 4 + 0, big_uint_t(13)), 81 % 13); + BOOST_CHECK_EQUAL(powm(big_uint_t(3), 4 + 0, 13), 81 % 13); + BOOST_CHECK_EQUAL(powm(big_uint_t(3), 4 + 0, big_uint_t(13) + 0), 81 % 13); + BOOST_CHECK_EQUAL(powm(big_uint_t(3) + 0, big_uint_t(4), big_uint_t(13)), 81 % 13); + BOOST_CHECK_EQUAL(powm(big_uint_t(3) + 0, big_uint_t(4), 13), 81 % 13); + BOOST_CHECK_EQUAL(powm(big_uint_t(3) + 0, big_uint_t(4), big_uint_t(13) + 0), 81 % 13); + BOOST_CHECK_EQUAL(powm(big_uint_t(3) + 0, big_uint_t(4) + 0, big_uint_t(13)), 81 % 13); + BOOST_CHECK_EQUAL(powm(big_uint_t(3) + 0, big_uint_t(4) + 0, 13), 81 % 13); + BOOST_CHECK_EQUAL(powm(big_uint_t(3) + 0, big_uint_t(4) + 0, big_uint_t(13) + 0), 81 % 13); + BOOST_CHECK_EQUAL(powm(big_uint_t(3) + 0, 4 + 0, big_uint_t(13)), 81 % 13); + BOOST_CHECK_EQUAL(powm(big_uint_t(3) + 0, 4 + 0, 13), 81 % 13); + BOOST_CHECK_EQUAL(powm(big_uint_t(3) + 0, 4 + 0, big_uint_t(13) + 0), 81 % 13); + // + // Conditionals involving 3 arg functions: + // + test_conditional(big_uint_t(powm(big_uint_t(3), big_uint_t(4), big_uint_t(13))), + powm(big_uint_t(3), big_uint_t(4), big_uint_t(13))); + +#ifndef BOOST_NO_EXCEPTIONS + // + // Things that are expected errors: + // + BOOST_CHECK_THROW(big_uint_t("3.14"), std::invalid_argument); + BOOST_CHECK_THROW(big_uint_t("3L"), std::invalid_argument); + BOOST_CHECK_THROW((void)big_uint_t(big_uint_t(20) / 0u), std::overflow_error); +#endif + // + // Extra tests added for full coverage: + // + a = 20; + b = 7; + c = 20 % b; + BOOST_CHECK_EQUAL(c, (20 % 7)); + c = 20 % (b + 0); + BOOST_CHECK_EQUAL(c, (20 % 7)); + c = a & 10; + BOOST_CHECK_EQUAL(c, (20 & 10)); + c = 10 & a; + BOOST_CHECK_EQUAL(c, (20 & 10)); + c = (a + 0) & (b + 0); + BOOST_CHECK_EQUAL(c, (20 & 7)); + c = 10 & (a + 0); + BOOST_CHECK_EQUAL(c, (20 & 10)); + c = 10 | a; + BOOST_CHECK_EQUAL(c, (20 | 10)); + c = (a + 0) | (b + 0); + BOOST_CHECK(c == (20 | 7)); + c = 20 | (b + 0); + BOOST_CHECK_EQUAL(c, (20 | 7)); + c = a ^ 7; + BOOST_CHECK_EQUAL(c, (20 ^ 7)); + c = 20 ^ b; + BOOST_CHECK_EQUAL(c, (20 ^ 7)); + c = (a + 0) ^ (b + 0); + BOOST_CHECK_EQUAL(c, (20 ^ 7)); + c = 20 ^ (b + 0); + BOOST_CHECK_EQUAL(c, (20 ^ 7)); + // + // Rval_tue ref tests: + // + c = big_uint_t(20) % b; + BOOST_CHECK_EQUAL(c, (20 % 7)); + c = a % big_uint_t(7); + BOOST_CHECK_EQUAL(c, (20 % 7)); + c = big_uint_t(20) % big_uint_t(7); + BOOST_CHECK_EQUAL(c, (20 % 7)); + c = big_uint_t(20) % 7; + BOOST_CHECK_EQUAL(c, (20 % 7)); + c = 20 % big_uint_t(7); + BOOST_CHECK_EQUAL(c, (20 % 7)); + c = big_uint_t(20) % (b * 1); + BOOST_CHECK_EQUAL(c, (20 % 7)); + c = (a * 1 + 0) % big_uint_t(7); + BOOST_CHECK_EQUAL(c, (20 % 7)); + c = big_uint_t(20) >> 2; + BOOST_CHECK_EQUAL(c, (20 >> 2)); + c = big_uint_t(20) & b; + BOOST_CHECK_EQUAL(c, (20 & 7)); + c = a & big_uint_t(7); + BOOST_CHECK_EQUAL(c, (20 & 7)); + c = big_uint_t(20) & big_uint_t(7); + BOOST_CHECK_EQUAL(c, (20 & 7)); + c = big_uint_t(20) & 7; + BOOST_CHECK_EQUAL(c, (20 & 7)); + c = 20 & big_uint_t(7); + BOOST_CHECK_EQUAL(c, (20 & 7)); + c = big_uint_t(20) & (b * 1 + 0); + BOOST_CHECK_EQUAL(c, (20 & 7)); + c = (a * 1 + 0) & big_uint_t(7); + BOOST_CHECK_EQUAL(c, (20 & 7)); + c = big_uint_t(20) | b; + BOOST_CHECK_EQUAL(c, (20 | 7)); + c = a | big_uint_t(7); + BOOST_CHECK_EQUAL(c, (20 | 7)); + c = big_uint_t(20) | big_uint_t(7); + BOOST_CHECK_EQUAL(c, (20 | 7)); + c = big_uint_t(20) | 7; + BOOST_CHECK_EQUAL(c, (20 | 7)); + c = 20 | big_uint_t(7); + BOOST_CHECK_EQUAL(c, (20 | 7)); + c = big_uint_t(20) | (b * 1 + 0); + BOOST_CHECK_EQUAL(c, (20 | 7)); + c = (a * 1 + 0) | big_uint_t(7); + BOOST_CHECK_EQUAL(c, (20 | 7)); + c = big_uint_t(20) ^ b; + BOOST_CHECK_EQUAL(c, (20 ^ 7)); + c = a ^ big_uint_t(7); + BOOST_CHECK_EQUAL(c, (20 ^ 7)); + c = big_uint_t(20) ^ big_uint_t(7); + BOOST_CHECK_EQUAL(c, (20 ^ 7)); + c = big_uint_t(20) ^ 7; + BOOST_CHECK_EQUAL(c, (20 ^ 7)); + c = 20 ^ big_uint_t(7); + BOOST_CHECK_EQUAL(c, (20 ^ 7)); + c = big_uint_t(20) ^ (b * 1 + 0); + BOOST_CHECK_EQUAL(c, (20 ^ 7)); + c = (a * 1 + 0) ^ big_uint_t(7); + BOOST_CHECK_EQUAL(c, (20 ^ 7)); + + // + // Round tripping of built in integers: + // + test_integer_round_trip(); + test_integer_round_trip(); + test_integer_round_trip(); + test_integer_round_trip(); + test_integer_round_trip(); + test_integer_round_trip(); +#ifndef BOOST_NO_LONG_LONG + test_integer_round_trip(); + test_integer_round_trip(); +#endif +} + +template +struct lexical_cast_target_type { + typedef typename std::conditional< + std::is_signed::value && std::is_integral::value, std::intmax_t, + typename std::conditional::value, std::uintmax_t, T>::type>::type type; +}; + +template +void test_negative_mixed_minmax(std::integral_constant const&) { + if (!std::numeric_limits::is_bounded || + (std::numeric_limits::digits >= std::numeric_limits::digits)) { + big_uint_t mx1((std::numeric_limits::max)() - 1); + ++mx1; + big_uint_t mx2((std::numeric_limits::max)()); + BOOST_CHECK_EQUAL(mx1, mx2); + mx1 = (std::numeric_limits::max)() - 1; + ++mx1; + mx2 = (std::numeric_limits::max)(); + BOOST_CHECK_EQUAL(mx1, mx2); + + if (!std::numeric_limits::is_bounded || + (std::numeric_limits::digits > std::numeric_limits::digits)) { + big_uint_t mx3((std::numeric_limits::min)() + 1); + --mx3; + big_uint_t mx4((std::numeric_limits::min)()); + BOOST_CHECK_EQUAL(mx3, mx4); + mx3 = (std::numeric_limits::min)() + 1; + --mx3; + mx4 = (std::numeric_limits::min)(); + BOOST_CHECK_EQUAL(mx3, mx4); + } + } +} +template +void test_negative_mixed_minmax(std::integral_constant const&) {} + +template +void test_negative_mixed_numeric_limits(std::integral_constant const&) { + typedef typename lexical_cast_target_type::type target_type; +#if defined(TEST_MPFR) + num_t tol = 10 * std::numeric_limits::epsilon(); +#else + num_t tol = 0; +#endif + static const int left_shift = std::numeric_limits::digits - 1; + num_t n1 = + -static_cast(1uLL << ((left_shift < 63) && (left_shift > 0) ? left_shift : 10)); + num_t n2 = -1; + num_t n3 = 0; + num_t n4 = -20; + std::ios_base::fmtflags f = std::is_floating_point::value ? std::ios_base::scientific + : std::ios_base::fmtflags(0); + int digits_to_print = + std::is_floating_point::value && std::numeric_limits::is_specialized + ? std::numeric_limits::digits10 + 5 + : 0; + if (std::numeric_limits::digits <= std::numeric_limits::digits) { + BOOST_CHECK_CLOSE( + n1, checked_lexical_cast(big_uint_t(n1).str(digits_to_print, f)), tol); + } + BOOST_CHECK_CLOSE(n2, checked_lexical_cast(big_uint_t(n2).str(digits_to_print, f)), + 0); + BOOST_CHECK_CLOSE(n3, checked_lexical_cast(big_uint_t(n3).str(digits_to_print, f)), + 0); + BOOST_CHECK_CLOSE(n4, checked_lexical_cast(big_uint_t(n4).str(digits_to_print, f)), + 0); +} + +template +void test_negative_mixed_numeric_limits(std::integral_constant const&) {} + +template +void test_negative_mixed(std::integral_constant const&) { + typedef typename std::conditional< + std::is_convertible::value, + typename std::conditional::value && (sizeof(num_t) < sizeof(int)), + int, num_t>::type, + big_uint_t>::type cast_type; + typedef typename std::conditional::value, num_t, + big_uint_t>::type simple_cast_type; + std::cout << "Testing mixed arithmetic with type: " << typeid(big_uint_t).name() << " and " + << typeid(num_t).name() << std::endl; + static const int left_shift = std::numeric_limits::digits - 1; + num_t n1 = + -static_cast(1uLL << ((left_shift < 63) && (left_shift > 0) ? left_shift : 10)); + num_t n2 = -1; + num_t n3 = 0; + num_t n4 = -20; + num_t n5 = -8; + + test_comparisons(n1, n2, std::is_convertible()); + test_comparisons(n1, n3, std::is_convertible()); + test_comparisons(n3, n1, std::is_convertible()); + test_comparisons(n2, n1, std::is_convertible()); + test_comparisons(n1, n1, std::is_convertible()); + test_comparisons(n3, n3, std::is_convertible()); + + // Default construct: + BOOST_CHECK_EQUAL(big_uint_t(n1), static_cast(n1)); + BOOST_CHECK_EQUAL(big_uint_t(n2), static_cast(n2)); + BOOST_CHECK_EQUAL(big_uint_t(n3), static_cast(n3)); + BOOST_CHECK_EQUAL(big_uint_t(n4), static_cast(n4)); + BOOST_CHECK_EQUAL(static_cast(n1), big_uint_t(n1)); + BOOST_CHECK_EQUAL(static_cast(n2), big_uint_t(n2)); + BOOST_CHECK_EQUAL(static_cast(n3), big_uint_t(n3)); + BOOST_CHECK_EQUAL(static_cast(n4), big_uint_t(n4)); + BOOST_CHECK_EQUAL(static_cast(big_uint_t(n1)), n1); + BOOST_CHECK_EQUAL(static_cast(big_uint_t(n2)), n2); + BOOST_CHECK_EQUAL(static_cast(big_uint_t(n3)), n3); + BOOST_CHECK_EQUAL(static_cast(big_uint_t(n4)), n4); + // Conversions when source is an expression template: + BOOST_CHECK_EQUAL(static_cast((big_uint_t(n1) + 0)), n1); + BOOST_CHECK_EQUAL(static_cast((big_uint_t(n2) + 0)), n2); + BOOST_CHECK_EQUAL(static_cast((big_uint_t(n3) + 0)), n3); + BOOST_CHECK_EQUAL(static_cast((big_uint_t(n4) + 0)), n4); + test_negative_mixed_numeric_limits( + std::integral_constant::is_specialized>()); + // Assignment: + big_uint_t r(0); + BOOST_CHECK(r != static_cast(n1)); + r = static_cast(n1); + BOOST_CHECK_EQUAL(r, static_cast(n1)); + r = static_cast(n2); + BOOST_CHECK_EQUAL(r, static_cast(n2)); + r = static_cast(n3); + BOOST_CHECK_EQUAL(r, static_cast(n3)); + r = static_cast(n4); + BOOST_CHECK_EQUAL(r, static_cast(n4)); + // Addition: + r = static_cast(n2); + BOOST_CHECK_EQUAL(r + static_cast(n4), static_cast(n2 + n4)); + BOOST_CHECK_EQUAL(big_uint_t(r + static_cast(n4)), + static_cast(n2 + n4)); + r += static_cast(n4); + BOOST_CHECK_EQUAL(r, static_cast(n2 + n4)); + // subtraction: + r = static_cast(n4); + BOOST_CHECK_EQUAL(r - static_cast(n5), static_cast(n4 - n5)); + BOOST_CHECK_EQUAL(big_uint_t(r - static_cast(n5)), + static_cast(n4 - n5)); + r -= static_cast(n5); + BOOST_CHECK_EQUAL(r, static_cast(n4 - n5)); + // Multiplication: + r = static_cast(n2); + BOOST_CHECK_EQUAL(r * static_cast(n4), static_cast(n2 * n4)); + BOOST_CHECK_EQUAL(big_uint_t(r * static_cast(n4)), + static_cast(n2 * n4)); + r *= static_cast(n4); + BOOST_CHECK_EQUAL(r, static_cast(n2 * n4)); + // Division: + r = static_cast(n1); + BOOST_CHECK_EQUAL(r / static_cast(n5), static_cast(n1 / n5)); + BOOST_CHECK_EQUAL(big_uint_t(r / static_cast(n5)), + static_cast(n1 / n5)); + r /= static_cast(n5); + BOOST_CHECK_EQUAL(r, static_cast(n1 / n5)); + // + // Extra cases for full coverage: + // + r = big_uint_t(n4) + static_cast(n5); + BOOST_CHECK_EQUAL(r, static_cast(n4 + n5)); + r = static_cast(n4) + big_uint_t(n5); + BOOST_CHECK_EQUAL(r, static_cast(n4 + n5)); + r = big_uint_t(n4) - static_cast(n5); + BOOST_CHECK_EQUAL(r, static_cast(n4 - n5)); + r = static_cast(n4) - big_uint_t(n5); + BOOST_CHECK_EQUAL(r, static_cast(n4 - n5)); + r = static_cast(n4) * big_uint_t(n5); + BOOST_CHECK_EQUAL(r, static_cast(n4 * n5)); + r = static_cast(num_t(4) * n4) / big_uint_t(4); + BOOST_CHECK_EQUAL(r, static_cast(n4)); + + big_uint_t a, b, c; + a = 20; + b = 30; + c = -a + b; + BOOST_CHECK_EQUAL(c, 10); + c = b + -a; + BOOST_CHECK_EQUAL(c, 10); + n4 = 30; + c = -a + static_cast(n4); + BOOST_CHECK_EQUAL(c, 10); + c = static_cast(n4) + -a; + BOOST_CHECK_EQUAL(c, 10); + c = -a + -b; + BOOST_CHECK_EQUAL(c, -50); + n4 = 4; + c = -(a + b) + static_cast(n4); + BOOST_CHECK_EQUAL(c, -50 + 4); + n4 = 50; + c = (a + b) - static_cast(n4); + BOOST_CHECK_EQUAL(c, 0); + c = (a + b) - static_cast(n4); + BOOST_CHECK_EQUAL(c, 0); + c = a - -(b + static_cast(n4)); + BOOST_CHECK_EQUAL(c, 20 - -(30 + 50)); + c = -(b + static_cast(n4)) - a; + BOOST_CHECK_EQUAL(c, -(30 + 50) - 20); + c = a - -b; + BOOST_CHECK_EQUAL(c, 50); + c = -a - b; + BOOST_CHECK_EQUAL(c, -50); + c = -a - static_cast(n4); + BOOST_CHECK_EQUAL(c, -20 - 50); + c = static_cast(n4) - -a; + BOOST_CHECK_EQUAL(c, 50 + 20); + c = -(a + b) - big_uint_t(n4); + BOOST_CHECK_EQUAL(c, -(20 + 30) - 50); + c = static_cast(n4) - (a + b); + BOOST_CHECK_EQUAL(c, 0); + c = (a + b) * static_cast(n4); + BOOST_CHECK_EQUAL(c, 50 * 50); + c = static_cast(n4) * (a + b); + BOOST_CHECK_EQUAL(c, 50 * 50); + c = a * -(b + static_cast(n4)); + BOOST_CHECK_EQUAL(c, 20 * -(30 + 50)); + c = -(b + static_cast(n4)) * a; + BOOST_CHECK_EQUAL(c, 20 * -(30 + 50)); + c = a * -b; + BOOST_CHECK_EQUAL(c, 20 * -30); + c = -a * b; + BOOST_CHECK_EQUAL(c, 20 * -30); + c = -a * static_cast(n4); + BOOST_CHECK_EQUAL(c, -20 * 50); + c = static_cast(n4) * -a; + BOOST_CHECK_EQUAL(c, -20 * 50); + c = -(a + b) + a; + BOOST_CHECK(-50 + 20); + c = static_cast(n4) - (a + b); + BOOST_CHECK_EQUAL(c, 0); + big_uint_t d = 10; + c = (a + b) / d; + BOOST_CHECK_EQUAL(c, 5); + c = (a + b) / (d + 0); + BOOST_CHECK_EQUAL(c, 5); + c = (a + b) / static_cast(n4); + BOOST_CHECK_EQUAL(c, 1); + c = static_cast(n4) / (a + b); + BOOST_CHECK_EQUAL(c, 1); + d = 50; + c = d / -(a + b); + BOOST_CHECK_EQUAL(c, -1); + c = -(a + b) / d; + BOOST_CHECK_EQUAL(c, -1); + d = 2; + c = a / -d; + BOOST_CHECK_EQUAL(c, 20 / -2); + c = -a / d; + BOOST_CHECK_EQUAL(c, 20 / -2); + d = 50; + c = -d / static_cast(n4); + BOOST_CHECK_EQUAL(c, -1); + c = static_cast(n4) / -d; + BOOST_CHECK_EQUAL(c, -1); + c = static_cast(n4) + a; + BOOST_CHECK_EQUAL(c, 70); + c = static_cast(n4) - a; + BOOST_CHECK_EQUAL(c, 30); + c = static_cast(n4) * a; + BOOST_CHECK_EQUAL(c, 50 * 20); + + n1 = -2; + n2 = -3; + n3 = -4; + a = static_cast(n1); + b = static_cast(n2); + c = static_cast(n3); + d = a + b * c; + BOOST_CHECK_EQUAL(d, -2 + -3 * -4); + d = static_cast(n1) + b * c; + BOOST_CHECK_EQUAL(d, -2 + -3 * -4); + d = a + static_cast(n2) * c; + BOOST_CHECK_EQUAL(d, -2 + -3 * -4); + d = a + b * static_cast(n3); + BOOST_CHECK_EQUAL(d, -2 + -3 * -4); + d = static_cast(n1) + static_cast(n2) * c; + BOOST_CHECK_EQUAL(d, -2 + -3 * -4); + d = static_cast(n1) + b * static_cast(n3); + BOOST_CHECK_EQUAL(d, -2 + -3 * -4); + a += static_cast(n2) * c; + BOOST_CHECK_EQUAL(a, -2 + -3 * -4); + a = static_cast(n1); + a += b * static_cast(n3); + BOOST_CHECK_EQUAL(a, -2 + -3 * -4); + a = static_cast(n1); + + d = b * c + a; + BOOST_CHECK_EQUAL(d, -2 + -3 * -4); + d = b * c + static_cast(n1); + BOOST_CHECK_EQUAL(d, -2 + -3 * -4); + d = static_cast(n2) * c + a; + BOOST_CHECK_EQUAL(d, -2 + -3 * -4); + d = b * static_cast(n3) + a; + BOOST_CHECK_EQUAL(d, -2 + -3 * -4); + d = static_cast(n2) * c + static_cast(n1); + BOOST_CHECK_EQUAL(d, -2 + -3 * -4); + d = b * static_cast(n3) + static_cast(n1); + BOOST_CHECK_EQUAL(d, -2 + -3 * -4); + + a = -20; + d = a - b * c; + BOOST_CHECK_EQUAL(d, -20 - -3 * -4); + n1 = -20; + d = static_cast(n1) - b * c; + BOOST_CHECK_EQUAL(d, -20 - -3 * -4); + d = a - static_cast(n2) * c; + BOOST_CHECK_EQUAL(d, -20 - -3 * -4); + d = a - b * static_cast(n3); + BOOST_CHECK_EQUAL(d, -20 - -3 * -4); + d = static_cast(n1) - static_cast(n2) * c; + BOOST_CHECK_EQUAL(d, -20 - -3 * -4); + d = static_cast(n1) - b * static_cast(n3); + BOOST_CHECK_EQUAL(d, -20 - -3 * -4); + a -= static_cast(n2) * c; + BOOST_CHECK_EQUAL(a, -20 - -3 * -4); + a = static_cast(n1); + a -= b * static_cast(n3); + BOOST_CHECK_EQUAL(a, -20 - -3 * -4); + + a = -2; + d = b * c - a; + BOOST_CHECK_EQUAL(d, -3 * -4 - -2); + n1 = -2; + d = b * c - static_cast(n1); + BOOST_CHECK_EQUAL(d, -3 * -4 - -2); + d = static_cast(n2) * c - a; + BOOST_CHECK_EQUAL(d, -3 * -4 - -2); + d = b * static_cast(n3) - a; + BOOST_CHECK_EQUAL(d, -3 * -4 - -2); + d = static_cast(n2) * c - static_cast(n1); + BOOST_CHECK_EQUAL(d, -3 * -4 - -2); + d = b * static_cast(n3) - static_cast(n1); + BOOST_CHECK_EQUAL(d, -3 * -4 - -2); + // + // Conversion from min and max values: + // + test_negative_mixed_minmax( + std::integral_constant < bool, + std::numeric_limits::is_integer&& std::numeric_limits::is_integer > ()); + // + // Rval_tue ref overloads: + // + a = 2; + n1 = 3; + d = -a + static_cast(n1); + BOOST_CHECK_EQUAL(d, 1); + d = static_cast(n1) + -a; + BOOST_CHECK_EQUAL(d, 1); + d = -a - static_cast(n1); + BOOST_CHECK_EQUAL(d, -5); + d = static_cast(n1) - -a; + BOOST_CHECK_EQUAL(d, 5); + d = -a * static_cast(n1); + BOOST_CHECK_EQUAL(d, -6); + d = static_cast(n1) * -a; + BOOST_CHECK_EQUAL(d, -6); + n1 = 4; + d = -static_cast(n1) / a; + BOOST_CHECK_EQUAL(d, -2); + d = static_cast(n1) / -a; + BOOST_CHECK_EQUAL(d, -2); +} + +template +void test_negative_mixed(std::integral_constant const&) {} + +template +void test_mixed(const std::integral_constant&) {} + +template +inline big_uint_t negate_value(const big_uint_t& val, const std::integral_constant&) { + return -val; +} +template +inline big_uint_t negate_value(const big_uint_t& val, const std::integral_constant&) { + return val; +} + +template +void test_mixed_numeric_limits(const std::integral_constant&) { + typedef typename lexical_cast_target_type::type target_type; +#if defined(TEST_MPFR) + num_t tol = 10 * std::numeric_limits::epsilon(); +#else + num_t tol = 0; +#endif + + big_uint_t d; + + static const int left_shift = std::numeric_limits::digits - 1; + num_t n1 = + static_cast(1uLL << ((left_shift < 63) && (left_shift > 0) ? left_shift : 10)); + num_t n2 = 1; + num_t n3 = 0; + num_t n4 = 20; + + std::ios_base::fmtflags f = std::is_floating_point::value ? std::ios_base::scientific + : std::ios_base::fmtflags(0); + int digits_to_print = + std::is_floating_point::value && std::numeric_limits::is_specialized + ? std::numeric_limits::digits10 + 5 + : 0; + // if (std::numeric_limits::digits <= std::numeric_limits::digits) { + // BOOST_CHECK_CLOSE(n1, + // checked_lexical_cast(big_uint_t(n1).str(digits_to_print, f)), + // tol); + // } + // BOOST_CHECK_CLOSE(n2, checked_lexical_cast(big_uint_t(n2).str(digits_to_print, + // f)), 0); BOOST_CHECK_CLOSE(n3, + // checked_lexical_cast(big_uint_t(n3).str(digits_to_print, f)), 0); + // BOOST_CHECK_CLOSE(n4, checked_lexical_cast(big_uint_t(n4).str(digits_to_print, + // f)), 0); +} +template +void test_mixed_numeric_limits(const std::integral_constant&) {} + +template +void test_mixed(const std::integral_constant&) { + typedef typename std::conditional< + std::is_convertible::value, + typename std::conditional::value && (sizeof(num_t) < sizeof(int)), + int, num_t>::type, + big_uint_t>::type cast_type; + typedef typename std::conditional::value, num_t, + big_uint_t>::type simple_cast_type; + + if (std::numeric_limits::is_specialized && + std::numeric_limits::is_bounded && + std::numeric_limits::digits < std::numeric_limits::digits) { + return; + } + + std::cout << "Testing mixed arithmetic with type: " << typeid(big_uint_t).name() << " and " + << typeid(num_t).name() << std::endl; + static const int left_shift = std::numeric_limits::digits - 1; + num_t n1 = + static_cast(1uLL << ((left_shift < 63) && (left_shift > 0) ? left_shift : 10)); + num_t n2 = 1; + num_t n3 = 0; + num_t n4 = 20; + num_t n5 = 8; + + test_comparisons(n1, n2, std::is_convertible()); + test_comparisons(n1, n3, std::is_convertible()); + test_comparisons(n1, n1, std::is_convertible()); + test_comparisons(n3, n1, std::is_convertible()); + test_comparisons(n2, n1, std::is_convertible()); + test_comparisons(n3, n3, std::is_convertible()); + + // Default construct: + BOOST_CHECK_EQUAL(big_uint_t(n1), static_cast(n1)); + BOOST_CHECK_EQUAL(big_uint_t(n2), static_cast(n2)); + BOOST_CHECK_EQUAL(big_uint_t(n3), static_cast(n3)); + BOOST_CHECK_EQUAL(big_uint_t(n4), static_cast(n4)); + BOOST_CHECK_EQUAL(static_cast(big_uint_t(n1)), n1); + BOOST_CHECK_EQUAL(static_cast(big_uint_t(n2)), n2); + BOOST_CHECK_EQUAL(static_cast(big_uint_t(n3)), n3); + BOOST_CHECK_EQUAL(static_cast(big_uint_t(n4)), n4); + // Again with expression templates: + BOOST_CHECK_EQUAL(static_cast(big_uint_t(n1) + 0), n1); + BOOST_CHECK_EQUAL(static_cast(big_uint_t(n2) + 0), n2); + BOOST_CHECK_EQUAL(static_cast(big_uint_t(n3) + 0), n3); + BOOST_CHECK_EQUAL(static_cast(big_uint_t(n4) + 0), n4); + BOOST_CHECK_EQUAL(static_cast(n1), big_uint_t(n1)); + BOOST_CHECK_EQUAL(static_cast(n2), big_uint_t(n2)); + BOOST_CHECK_EQUAL(static_cast(n3), big_uint_t(n3)); + BOOST_CHECK_EQUAL(static_cast(n4), big_uint_t(n4)); + // Assignment: + big_uint_t r(0); + BOOST_CHECK(r != static_cast(n1)); + r = static_cast(n1); + BOOST_CHECK_EQUAL(r, static_cast(n1)); + r = static_cast(n2); + BOOST_CHECK_EQUAL(r, static_cast(n2)); + r = static_cast(n3); + BOOST_CHECK_EQUAL(r, static_cast(n3)); + r = static_cast(n4); + BOOST_CHECK_EQUAL(r, static_cast(n4)); + // Addition: + r = static_cast(n2); + BOOST_CHECK_EQUAL(r + static_cast(n4), static_cast(n2 + n4)); + BOOST_CHECK_EQUAL(big_uint_t(r + static_cast(n4)), + static_cast(n2 + n4)); + r += static_cast(n4); + BOOST_CHECK_EQUAL(r, static_cast(n2 + n4)); + // subtraction: + r = static_cast(n4); + BOOST_CHECK_EQUAL(r - static_cast(n5), static_cast(n4 - n5)); + BOOST_CHECK_EQUAL(big_uint_t(r - static_cast(n5)), + static_cast(n4 - n5)); + r -= static_cast(n5); + BOOST_CHECK_EQUAL(r, static_cast(n4 - n5)); + // Multiplication: + r = static_cast(n2); + BOOST_CHECK_EQUAL(r * static_cast(n4), static_cast(n2 * n4)); + BOOST_CHECK_EQUAL(big_uint_t(r * static_cast(n4)), + static_cast(n2 * n4)); + r *= static_cast(n4); + BOOST_CHECK_EQUAL(r, static_cast(n2 * n4)); + // Division: + r = static_cast(n1); + BOOST_CHECK_EQUAL(r / static_cast(n5), static_cast(n1 / n5)); + BOOST_CHECK_EQUAL(big_uint_t(r / static_cast(n5)), + static_cast(n1 / n5)); + r /= static_cast(n5); + BOOST_CHECK_EQUAL(r, static_cast(n1 / n5)); + // + // special cases for full coverage: + // + r = static_cast(n5) + big_uint_t(n4); + BOOST_CHECK_EQUAL(r, static_cast(n4 + n5)); + r = static_cast(n4) - big_uint_t(n5); + BOOST_CHECK_EQUAL(r, static_cast(n4 - n5)); + r = static_cast(n4) * big_uint_t(n5); + BOOST_CHECK_EQUAL(r, static_cast(n4 * n5)); + r = static_cast(num_t(4) * n4) / big_uint_t(4); + BOOST_CHECK_EQUAL(r, static_cast(n4)); + + typedef std::integral_constant::is_specialized || + std::numeric_limits::is_signed) && + (!std::numeric_limits::is_specialized || + std::numeric_limits::is_signed)> + signed_tag; + + test_negative_mixed(signed_tag()); + + n1 = 2; + n2 = 3; + n3 = 4; + big_uint_t a(n1), b(n2), c(n3), d; + d = a + b * c; + BOOST_CHECK_EQUAL(d, 2 + 3 * 4); + d = static_cast(n1) + b * c; + BOOST_CHECK_EQUAL(d, 2 + 3 * 4); + d = a + static_cast(n2) * c; + BOOST_CHECK_EQUAL(d, 2 + 3 * 4); + d = a + b * static_cast(n3); + BOOST_CHECK_EQUAL(d, 2 + 3 * 4); + d = static_cast(n1) + static_cast(n2) * c; + BOOST_CHECK_EQUAL(d, 2 + 3 * 4); + d = static_cast(n1) + b * static_cast(n3); + BOOST_CHECK_EQUAL(d, 2 + 3 * 4); + a += static_cast(n2) * c; + BOOST_CHECK_EQUAL(a, 2 + 3 * 4); + a = static_cast(n1); + a += b * static_cast(n3); + BOOST_CHECK_EQUAL(a, 2 + 3 * 4); + a = static_cast(n1); + + d = b * c + a; + BOOST_CHECK_EQUAL(d, 2 + 3 * 4); + d = b * c + static_cast(n1); + BOOST_CHECK_EQUAL(d, 2 + 3 * 4); + d = static_cast(n2) * c + a; + BOOST_CHECK_EQUAL(d, 2 + 3 * 4); + d = b * static_cast(n3) + a; + BOOST_CHECK_EQUAL(d, 2 + 3 * 4); + d = static_cast(n2) * c + static_cast(n1); + BOOST_CHECK_EQUAL(d, 2 + 3 * 4); + d = b * static_cast(n3) + static_cast(n1); + BOOST_CHECK_EQUAL(d, 2 + 3 * 4); + + a = 20; + d = a - b * c; + BOOST_CHECK_EQUAL(d, 20 - 3 * 4); + n1 = 20; + d = static_cast(n1) - b * c; + BOOST_CHECK_EQUAL(d, 20 - 3 * 4); + d = a - static_cast(n2) * c; + BOOST_CHECK_EQUAL(d, 20 - 3 * 4); + d = a - b * static_cast(n3); + BOOST_CHECK_EQUAL(d, 20 - 3 * 4); + d = static_cast(n1) - static_cast(n2) * c; + BOOST_CHECK_EQUAL(d, 20 - 3 * 4); + d = static_cast(n1) - b * static_cast(n3); + BOOST_CHECK_EQUAL(d, 20 - 3 * 4); + a -= static_cast(n2) * c; + BOOST_CHECK_EQUAL(a, 20 - 3 * 4); + a = static_cast(n1); + a -= b * static_cast(n3); + BOOST_CHECK_EQUAL(a, 20 - 3 * 4); + + a = 2; + d = b * c - a; + BOOST_CHECK_EQUAL(d, 3 * 4 - 2); + n1 = 2; + d = b * c - static_cast(n1); + BOOST_CHECK_EQUAL(d, 3 * 4 - 2); + d = static_cast(n2) * c - a; + BOOST_CHECK_EQUAL(d, 3 * 4 - 2); + d = b * static_cast(n3) - a; + BOOST_CHECK_EQUAL(d, 3 * 4 - a); + d = static_cast(n2) * c - static_cast(n1); + BOOST_CHECK_EQUAL(d, 3 * 4 - 2); + d = b * static_cast(n3) - static_cast(n1); + BOOST_CHECK_EQUAL(d, 3 * 4 - 2); + + test_mixed_numeric_limits( + std::integral_constant::is_specialized>()); +} + +template +void test_members(big_uint_t) { + // + // Test sign and zero functions: + // + big_uint_t a = 20; + big_uint_t b = 30; + // BOOST_CHECK(a.sign() > 0); + BOOST_CHECK(!a.is_zero()); + // if (std::numeric_limits::is_signed) { + // a = -20; + // BOOST_CHECK(a.sign() < 0); + // BOOST_CHECK(!a.is_zero()); + // } + a = 0; + // BOOST_CHECK_EQUAL(a.sign(), 0); + BOOST_CHECK(a.is_zero()); + + // a = 20; + // b = 30; + // a.swap(b); + // BOOST_CHECK_EQUAL(a, 30); + // BOOST_CHECK_EQUAL(b, 20); +} + +template +void test_signed_ops(const std::integral_constant&) { + big_uint_t a(8); + big_uint_t b(64); + big_uint_t c(500); + big_uint_t d(1024); + big_uint_t ac; + BOOST_CHECK_EQUAL(-a, -8); + ac = a; + ac = ac - b; + BOOST_CHECK_EQUAL(ac, 8 - 64); + ac = a; + ac -= a + b; + BOOST_CHECK_EQUAL(ac, -64); + ac = a; + ac -= b - a; + BOOST_CHECK_EQUAL(ac, 16 - 64); + ac = -a; + BOOST_CHECK_EQUAL(ac, -8); + ac = a; + ac -= -a; + BOOST_CHECK_EQUAL(ac, 16); + ac = a; + ac += -a; + BOOST_CHECK_EQUAL(ac, 0); + ac = b; + ac /= -a; + BOOST_CHECK_EQUAL(ac, -8); + ac = a; + ac *= -a; + BOOST_CHECK_EQUAL(ac, -64); + ac = a + -b; + BOOST_CHECK_EQUAL(ac, 8 - 64); + ac = -a + b; + BOOST_CHECK_EQUAL(ac, -8 + 64); + ac = -a + -b; + BOOST_CHECK_EQUAL(ac, -72); + ac = a + -+-b; // lots of unary operators!! + BOOST_CHECK_EQUAL(ac, 72); + test_conditional(big_uint_t(-a), -a); + + // + // Rval_tue ref tests: + // + a = 3; + b = 4; + c = big_uint_t(20) + -(a + b); + BOOST_CHECK_EQUAL(c, 13); + c = big_uint_t(20) + -a; + BOOST_CHECK_EQUAL(c, 17); + c = -a + big_uint_t(20); + BOOST_CHECK_EQUAL(c, 17); + c = -a + b; + BOOST_CHECK_EQUAL(c, 1); + c = b + -a; + BOOST_CHECK_EQUAL(c, 1); + a = 2; + b = 3; + c = big_uint_t(10) - a; + BOOST_CHECK_EQUAL(c, 8); + c = a - big_uint_t(2); + BOOST_CHECK_EQUAL(c, 0); + c = big_uint_t(3) - big_uint_t(2); + BOOST_CHECK_EQUAL(c, 1); + a = 20; + c = a - (a + b); + BOOST_CHECK_EQUAL(c, -3); + a = 2; + c = (a * b) - (a + b); + BOOST_CHECK_EQUAL(c, 1); + c = big_uint_t(20) - -(a + b); + BOOST_CHECK_EQUAL(c, 25); + c = big_uint_t(20) - (-a); + BOOST_CHECK_EQUAL(c, 22); + c = (-b) - big_uint_t(-5); + BOOST_CHECK_EQUAL(c, 2); + c = (-b) - a; + BOOST_CHECK_EQUAL(c, -5); + c = b - (-a); + BOOST_CHECK_EQUAL(c, 5); + c = big_uint_t(3) * -(a + b); + BOOST_CHECK_EQUAL(c, -15); + c = -(a + b) * big_uint_t(3); + BOOST_CHECK_EQUAL(c, -15); + c = big_uint_t(2) * -a; + BOOST_CHECK_EQUAL(c, -4); + c = -a * big_uint_t(2); + BOOST_CHECK_EQUAL(c, -4); + c = -a * b; + BOOST_CHECK_EQUAL(c, -6); + a = 2; + b = 4; + c = big_uint_t(4) / -a; + BOOST_CHECK_EQUAL(c, -2); + c = -b / big_uint_t(2); + BOOST_CHECK_EQUAL(c, -2); + c = big_uint_t(4) / -(2 * a); + BOOST_CHECK_EQUAL(c, -1); + c = b / -(2 * a); + BOOST_CHECK_EQUAL(c, -1); + c = -(2 * a) / big_uint_t(2); + BOOST_CHECK_EQUAL(c, -2); +} +template +void test_signed_ops(const std::integral_constant&) {} + +template +void test_basic_conditionals(big_uint_t a, big_uint_t b) { + if (a) { + BOOST_ERROR("Unexpected non-zero result"); + } + if (!a) { + } else { + BOOST_ERROR("Unexpected zero result"); + } + b = 2; + if (!b) { + BOOST_ERROR("Unexpected zero result"); + } + if (b) { + } else { + BOOST_ERROR("Unexpected non-zero result"); + } + if (a && b) { + BOOST_ERROR("Unexpected zero result"); + } + if (!(a || b)) { + BOOST_ERROR("Unexpected zero result"); + } + if (a + b) { + } else { + BOOST_ERROR("Unexpected zero result"); + } + if (b - 2) { + BOOST_ERROR("Unexpected non-zero result"); + } +} + +template +void test_relationals(T a, T b) { + BOOST_CHECK_EQUAL((a == b), false); + BOOST_CHECK_EQUAL((a != b), true); + BOOST_CHECK_EQUAL((a <= b), true); + BOOST_CHECK_EQUAL((a < b), true); + BOOST_CHECK_EQUAL((a >= b), false); + BOOST_CHECK_EQUAL((a > b), false); + + BOOST_CHECK_EQUAL((a + b == b), false); + BOOST_CHECK_EQUAL((a + b != b), true); + BOOST_CHECK_EQUAL((a + b >= b), true); + BOOST_CHECK_EQUAL((a + b > b), true); + BOOST_CHECK_EQUAL((a + b <= b), false); + BOOST_CHECK_EQUAL((a + b < b), false); + + BOOST_CHECK_EQUAL((a == b + a), false); + BOOST_CHECK_EQUAL((a != b + a), true); + BOOST_CHECK_EQUAL((a <= b + a), true); + BOOST_CHECK_EQUAL((a < b + a), true); + BOOST_CHECK_EQUAL((a >= b + a), false); + BOOST_CHECK_EQUAL((a > b + a), false); + + BOOST_CHECK_EQUAL((a + b == b + a), true); + BOOST_CHECK_EQUAL((a + b != b + a), false); + BOOST_CHECK_EQUAL((a + b <= b + a), true); + BOOST_CHECK_EQUAL((a + b < b + a), false); + BOOST_CHECK_EQUAL((a + b >= b + a), true); + BOOST_CHECK_EQUAL((a + b > b + a), false); + + BOOST_CHECK_EQUAL((8 == b + a), false); + BOOST_CHECK_EQUAL((8 != b + a), true); + BOOST_CHECK_EQUAL((8 <= b + a), true); + BOOST_CHECK_EQUAL((8 < b + a), true); + BOOST_CHECK_EQUAL((8 >= b + a), false); + BOOST_CHECK_EQUAL((8 > b + a), false); + BOOST_CHECK_EQUAL((800 == b + a), false); + BOOST_CHECK_EQUAL((800 != b + a), true); + BOOST_CHECK_EQUAL((800 >= b + a), true); + BOOST_CHECK_EQUAL((800 > b + a), true); + BOOST_CHECK_EQUAL((800 <= b + a), false); + BOOST_CHECK_EQUAL((800 < b + a), false); + BOOST_CHECK_EQUAL((72 == b + a), true); + BOOST_CHECK_EQUAL((72 != b + a), false); + BOOST_CHECK_EQUAL((72 <= b + a), true); + BOOST_CHECK_EQUAL((72 < b + a), false); + BOOST_CHECK_EQUAL((72 >= b + a), true); + BOOST_CHECK_EQUAL((72 > b + a), false); + + BOOST_CHECK_EQUAL((b + a == 8), false); + BOOST_CHECK_EQUAL((b + a != 8), true); + BOOST_CHECK_EQUAL((b + a >= 8), true); + BOOST_CHECK_EQUAL((b + a > 8), true); + BOOST_CHECK_EQUAL((b + a <= 8), false); + BOOST_CHECK_EQUAL((b + a < 8), false); + BOOST_CHECK_EQUAL((b + a == 800), false); + BOOST_CHECK_EQUAL((b + a != 800), true); + BOOST_CHECK_EQUAL((b + a <= 800), true); + BOOST_CHECK_EQUAL((b + a < 800), true); + BOOST_CHECK_EQUAL((b + a >= 800), false); + BOOST_CHECK_EQUAL((b + a > 800), false); + BOOST_CHECK_EQUAL((b + a == 72), true); + BOOST_CHECK_EQUAL((b + a != 72), false); + BOOST_CHECK_EQUAL((b + a >= 72), true); + BOOST_CHECK_EQUAL((b + a > 72), false); + BOOST_CHECK_EQUAL((b + a <= 72), true); + BOOST_CHECK_EQUAL((b + a < 72), false); + + T c; + // + // min and max overloads: + // +#if !defined(min) && !defined(max) + // using std::max; + // using std::min; + // This works, but still causes complaints from inspect.exe, so use brackets to prevent + // macrosubstitution, and to explicitly specify type T seems necessary, for reasons unclear. + a = 2; + b = 5; + c = 6; + BOOST_CHECK_EQUAL((std::min)(a, b), a); + BOOST_CHECK_EQUAL((std::min)(b, a), a); + BOOST_CHECK_EQUAL((std::max)(a, b), b); + BOOST_CHECK_EQUAL((std::max)(b, a), b); + BOOST_CHECK_EQUAL((std::min)(a, b + c), a); + BOOST_CHECK_EQUAL((std::min)(b + c, a), a); + BOOST_CHECK_EQUAL((std::min)(a, c - b), 1); + BOOST_CHECK_EQUAL((std::min)(c - b, a), 1); + BOOST_CHECK_EQUAL((std::max)(a, b + c), 11); + BOOST_CHECK_EQUAL((std::max)(b + c, a), 11); + BOOST_CHECK_EQUAL((std::max)(a, c - b), a); + BOOST_CHECK_EQUAL((std::max)(c - b, a), a); + BOOST_CHECK_EQUAL((std::min)(a + b, b + c), 7); + BOOST_CHECK_EQUAL((std::min)(b + c, a + b), 7); + BOOST_CHECK_EQUAL((std::max)(a + b, b + c), 11); + BOOST_CHECK_EQUAL((std::max)(b + c, a + b), 11); + BOOST_CHECK_EQUAL((std::min)(a + b, c - a), 4); + BOOST_CHECK_EQUAL((std::min)(c - a, a + b), 4); + BOOST_CHECK_EQUAL((std::max)(a + b, c - a), 7); + BOOST_CHECK_EQUAL((std::max)(c - a, a + b), 7); + + long l1(2), l2(3); + long l3 = (std::min)(l1, l2) + (std::max)(l1, l2) + (std::max)(l1, l2) + + (std::min)(l1, l2); + BOOST_CHECK_EQUAL(l3, 10); + +#endif +} + +template +const T& self(const T& a) { + return a; // NOLINT +} + +template +void test() { +#if !defined(NO_MIXED_OPS) && !defined(SLOW_COMPILER) + std::integral_constant tag; + test_mixed(tag); + test_mixed(tag); + test_mixed(tag); + test_mixed(tag); + test_mixed(tag); + test_mixed(tag); + test_mixed(tag); + test_mixed(tag); + test_mixed(tag); +#ifdef BOOST_HAS_LONG_LONG + test_mixed(tag); + test_mixed(tag); +#endif + +#endif +#ifndef MIXED_OPS_ONLY + // + // Integer only functions: + // + test_integer_ops(); + // + // Test basic arithmetic: + // + big_uint_t a(8); + big_uint_t b(64); + big_uint_t c(500); + big_uint_t d(1024); + BOOST_CHECK_EQUAL(a + b, 72); + a += b; + BOOST_CHECK_EQUAL(a, 72); + BOOST_CHECK_EQUAL(a - b, 8); + a -= b; + BOOST_CHECK_EQUAL(a, 8); + BOOST_CHECK_EQUAL(a * b, 8 * 64L); + a *= b; + BOOST_CHECK_EQUAL(a, 8 * 64L); + BOOST_CHECK_EQUAL(a / b, 8); + a /= b; + BOOST_CHECK_EQUAL(a, 8); + big_uint_t ac(a); + BOOST_CHECK_EQUAL(ac, a); + ac = a * c; + BOOST_CHECK_EQUAL(ac, 8 * 500L); + ac = 8 * 500L; + ac = ac + b + c; + BOOST_CHECK_EQUAL(ac, 8 * 500L + 64 + 500); + ac = a; + ac = b + c + ac; + BOOST_CHECK_EQUAL(ac, 8 + 64 + 500); + ac = ac - b + c; + BOOST_CHECK_EQUAL(ac, 8 + 64 + 500 - 64 + 500); + ac = a; + ac = b + c - ac; + BOOST_CHECK_EQUAL(ac, -8 + 64 + 500); + ac = a; + ac = ac * b; + BOOST_CHECK_EQUAL(ac, 8 * 64); + ac = a; + ac *= b * ac; + BOOST_CHECK_EQUAL(ac, 8 * 8 * 64); + ac = b; + ac = ac / a; + BOOST_CHECK_EQUAL(ac, 64 / 8); + ac = b; + ac /= ac / a; + BOOST_CHECK_EQUAL(ac, 64 / (64 / 8)); + ac = a; + ac = b + ac * a; + BOOST_CHECK_EQUAL(ac, 64 * 2); + ac = a; + ac = b - ac * a; + BOOST_CHECK_EQUAL(ac, 0); + ac = a; + ac = b * (ac + a); + BOOST_CHECK_EQUAL(ac, 64 * (16)); + ac = a; + ac = b / (ac * 1); + BOOST_CHECK_EQUAL(ac, 64 / 8); + ac = a; + ac = ac + b; + BOOST_CHECK_EQUAL(ac, 8 + 64); + ac = a; + ac = a + ac; + BOOST_CHECK_EQUAL(ac, 16); + ac = a; + ac = a - ac; + BOOST_CHECK_EQUAL(ac, 0); + ac = a; + ac += a + b; + BOOST_CHECK_EQUAL(ac, 80); + ac = a; + ac += b + a; + BOOST_CHECK_EQUAL(ac, 80); + ac = +a; + BOOST_CHECK_EQUAL(ac, 8); + ac = 8; + ac = a * ac; + BOOST_CHECK_EQUAL(ac, 8 * 8); + ac = a; + ac = a; + ac += +a; + BOOST_CHECK_EQUAL(ac, 16); + ac = a; + ac += b - a; + BOOST_CHECK_EQUAL(ac, 8 + 64 - 8); + ac = a; + ac += b * c; + BOOST_CHECK_EQUAL(ac, 8 + 64 * 500); + ac = a; + ac = a; + ac -= +a; + BOOST_CHECK_EQUAL(ac, 0); + ac = a; + if (std::numeric_limits::is_signed || + is_twos_complement_integer::value) { + ac = a; + ac -= c - b; + BOOST_CHECK_EQUAL(ac, 8 - (500 - 64)); + ac = a; + ac -= b * c; + BOOST_CHECK_EQUAL(ac, 8 - 500 * 64); + } + ac = a; + ac += ac * b; + BOOST_CHECK_EQUAL(ac, 8 + 8 * 64); + if (std::numeric_limits::is_signed || + is_twos_complement_integer::value) { + ac = a; + ac -= ac * b; + BOOST_CHECK_EQUAL(ac, 8 - 8 * 64); + } + ac = a * 8; + ac *= +a; + BOOST_CHECK_EQUAL(ac, 64 * 8); + ac = a; + ac *= b * c; + BOOST_CHECK_EQUAL(ac, 8 * 64 * 500); + ac = a; + ac *= b / a; + BOOST_CHECK_EQUAL(ac, 8 * 64 / 8); + ac = a; + ac *= b + c; + BOOST_CHECK_EQUAL(ac, 8 * (64 + 500)); + ac = b; + ac /= +a; + BOOST_CHECK_EQUAL(ac, 8); + ac = b; + ac /= b / a; + BOOST_CHECK_EQUAL(ac, 64 / (64 / 8)); + ac = b; + ac /= a + big_uint_t(0); + BOOST_CHECK_EQUAL(ac, 8); + // + // simple tests with immediate values, these calls can be optimised in many backends: + // + ac = a + b; + BOOST_CHECK_EQUAL(ac, 72); + ac = a + +b; + BOOST_CHECK_EQUAL(ac, 72); + ac = +a + b; + BOOST_CHECK_EQUAL(ac, 72); + ac = +a + +b; + BOOST_CHECK_EQUAL(ac, 72); + ac = a; + ac = b / ac; + BOOST_CHECK_EQUAL(ac, b / a); + // + // Comparisons: + // + test_relationals(a, b); + test_members(a); + // + // Use in Boolean context: + // + a = 0; + b = 2; + test_basic_conditionals(a, b); + // + // Test iostreams: + // + std::stringstream ss; + a = 20; + b = 2; + ss << a; + ss >> c; + BOOST_CHECK_EQUAL(a, c); + ss.clear(); + ss << a + b; + ss >> c; + BOOST_CHECK_EQUAL(c, 22); + BOOST_CHECK_EQUAL(c, a + b); + // + // More cases for complete code coverage: + // + a = 20; + b = 30; + using std::swap; + swap(a, b); + BOOST_CHECK_EQUAL(a, 30); + BOOST_CHECK_EQUAL(b, 20); + a = 20; + b = 30; + std::swap(a, b); + BOOST_CHECK_EQUAL(a, 30); + BOOST_CHECK_EQUAL(b, 20); + a = 20; + b = 30; + a = a + b * 2; + BOOST_CHECK_EQUAL(a, 20 + 30 * 2); + a = 100; + a = a - b * 2; + BOOST_CHECK_EQUAL(a, 100 - 30 * 2); + a = 20; + a = a * (b + 2); + BOOST_CHECK_EQUAL(a, 20 * (32)); + a = 20; + a = (b + 2) * a; + BOOST_CHECK_EQUAL(a, 20 * (32)); + a = 90; + b = 2; + a = a / (b + 0); + BOOST_CHECK_EQUAL(a, 45); + a = 20; + b = 30; + c = (a * b) + 22; + BOOST_CHECK_EQUAL(c, 20 * 30 + 22); + c = 22 + (a * b); + BOOST_CHECK_EQUAL(c, 20 * 30 + 22); + c = 10; + ac = a + b * c; + BOOST_CHECK_EQUAL(ac, 20 + 30 * 10); + ac = b * c + a; + BOOST_CHECK_EQUAL(ac, 20 + 30 * 10); + a = a + b * c; + BOOST_CHECK_EQUAL(a, 20 + 30 * 10); + a = 20; + b = a + b * c; + BOOST_CHECK_EQUAL(b, 20 + 30 * 10); + b = 30; + c = a + b * c; + BOOST_CHECK_EQUAL(c, 20 + 30 * 10); + c = 10; + c = a + b / c; + BOOST_CHECK_EQUAL(c, 20 + 30 / 10); + // + // Additional tests for rvalue ref overloads: + // + a = 3; + b = 4; + c = big_uint_t(2) + a; + BOOST_CHECK_EQUAL(c, 5); + c = a + big_uint_t(2); + BOOST_CHECK_EQUAL(c, 5); + c = big_uint_t(3) + big_uint_t(2); + BOOST_CHECK_EQUAL(c, 5); + c = big_uint_t(2) + (a + b); + BOOST_CHECK_EQUAL(c, 9); + c = (a + b) + big_uint_t(2); + BOOST_CHECK_EQUAL(c, 9); + c = (a + b) + (a + b); + BOOST_CHECK_EQUAL(c, 14); + c = a * big_uint_t(4); + BOOST_CHECK_EQUAL(c, 12); + c = big_uint_t(3) * big_uint_t(4); + BOOST_CHECK_EQUAL(c, 12); + c = (a + b) * (a + b); + BOOST_CHECK_EQUAL(c, 49); + a = 2; + c = b / big_uint_t(2); + BOOST_CHECK_EQUAL(c, 2); + c = big_uint_t(4) / a; + BOOST_CHECK_EQUAL(c, 2); + c = big_uint_t(4) / big_uint_t(2); + BOOST_CHECK_EQUAL(c, 2); + // + // Test conditionals: + // + a = 20; + test_conditional(a, +a); + test_conditional(a, (a + 0)); + + test_signed_ops( + std::integral_constant::is_signed>()); + // + // Test hashing: + // + boost::hash hasher; + std::size_t s = hasher(a); + BOOST_CHECK_NE(s, 0); + std::hash hasher2; + s = hasher2(a); + BOOST_CHECK_NE(s, 0); + + // + // Test move: + // + big_uint_t m(static_cast(a)); + BOOST_CHECK_EQUAL(m, 20); + // Move from already moved from object: + big_uint_t m2(static_cast(a)); + // assign from moved from object + // (may result in "a" being left in valid state as implementation artifact): + c = static_cast(a); + // assignment to moved-from objects: + c = static_cast(m); + BOOST_CHECK_EQUAL(c, 20); + m2 = c; + BOOST_CHECK_EQUAL(c, 20); + // Destructor of "a" checks destruction of moved-from-object... + big_uint_t m3(static_cast(a)); +#ifndef BOOST_MP_NOT_TESTING_NUMBER + // + // string and string_view: + // + { + std::string s1("2"); + big_uint_t x(s1); + BOOST_CHECK_EQUAL(x, 2); + s1 = "3"; + // x.assign(s1); + x = s1; + BOOST_CHECK_EQUAL(x, 3); +#ifndef BOOST_NO_CXX17_HDR_STRING_VIEW + s1 = "20"; + std::string_view v(s1.c_str(), 1); + big_uint_t y(v); + BOOST_CHECK_EQUAL(y, 2); + std::string_view v2(s1.c_str(), 2); + // y.assign(v2); + y = v2; + BOOST_CHECK_EQUAL(y, 20); +#endif + } +#endif + // + // Bug cases, self assignment first: + // + a = 20; + a = self(a); + BOOST_CHECK_EQUAL(a, 20); + + a = 2; + a = a * a * a; + BOOST_CHECK_EQUAL(a, 8); + a = 2; + a = a + a + a; + BOOST_CHECK_EQUAL(a, 6); + a = 2; + a = a - a + a; // NOLINT + BOOST_CHECK_EQUAL(a, 2); + a = 2; + a = a + a - a; + BOOST_CHECK_EQUAL(a, 2); + a = 2; + a = a * a - a; + BOOST_CHECK_EQUAL(a, 2); + a = 2; + a = a + a * a; + BOOST_CHECK_EQUAL(a, 6); + a = 2; + a = (a + a) * a; + BOOST_CHECK_EQUAL(a, 8); +#endif +} + +BOOST_AUTO_TEST_CASE(boost_arithmetic_big_uint_test) { + test>(); + test>(); + test>(); + test>(); + test>(); + test>(); + test>(); +} diff --git a/crypto3/libs/multiprecision/test/big_uint.cpp b/crypto3/libs/multiprecision/test/big_uint_basic.cpp similarity index 89% rename from crypto3/libs/multiprecision/test/big_uint.cpp rename to crypto3/libs/multiprecision/test/big_uint_basic.cpp index 05f9010be..da512d9c4 100644 --- a/crypto3/libs/multiprecision/test/big_uint.cpp +++ b/crypto3/libs/multiprecision/test/big_uint_basic.cpp @@ -6,7 +6,7 @@ // http://www.boost.org/LICENSE_1_0.txt //---------------------------------------------------------------------------// -#define BOOST_TEST_MODULE big_int_test +#define BOOST_TEST_MODULE big_uint_basic_test #include #include @@ -254,8 +254,35 @@ using int_types = std::tuple>; +using unsigned_builtin_types = + std::tuple; + using signed_types = std::tuple; +BOOST_AUTO_TEST_SUITE(assignment) + +BOOST_AUTO_TEST_CASE_TEMPLATE(assignment_signed, T, signed_types) { + BOOST_CHECK_EQUAL(big_uint<7>(static_cast(2)), 2_big_uint7); + BOOST_CHECK_THROW(big_uint<7>(static_cast(-1)), std::range_error); + BOOST_CHECK_THROW(big_uint<7>(static_cast(128)), std::range_error); + BOOST_CHECK_THROW(big_uint<7>(static_cast(129)), std::range_error); + big_uint<7> n; + BOOST_CHECK_EQUAL(n = static_cast(2), 2_big_uint7); + BOOST_CHECK_THROW(n = static_cast(-1), std::range_error); + BOOST_CHECK_THROW(n = static_cast(128), std::range_error); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(assignment_unsigned, T, unsigned_builtin_types) { + BOOST_CHECK_EQUAL(big_uint<7>(static_cast(2)), 2_big_uint7); + BOOST_CHECK_THROW(big_uint<7>(static_cast(128)), std::range_error); + BOOST_CHECK_THROW(big_uint<7>(static_cast(129)), std::range_error); + big_uint<7> n; + BOOST_CHECK_EQUAL(n = static_cast(2), 2_big_uint7); + BOOST_CHECK_THROW(n = static_cast(128), std::range_error); +} + +BOOST_AUTO_TEST_SUITE_END() + BOOST_AUTO_TEST_SUITE(checked_operations) BOOST_AUTO_TEST_CASE_TEMPLATE(addition_positive, T, int_types) { @@ -315,6 +342,8 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(division_negative, T, signed_types) { } BOOST_AUTO_TEST_CASE_TEMPLATE(division_zero, T, int_types) { + BOOST_CHECK_EQUAL(0_big_uint7 / static_cast(5), 0_big_uint7); + BOOST_CHECK_EQUAL(static_cast(0) / 5_big_uint7, 0_big_uint7); BOOST_CHECK_THROW(21_big_uint7 / static_cast(0), std::overflow_error); BOOST_CHECK_THROW(static_cast(21) / 0_big_uint7, std::overflow_error); } @@ -387,6 +416,12 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multiplication_negative, T, signed_types) { BOOST_AUTO_TEST_SUITE_END() +BOOST_AUTO_TEST_CASE(add_assign_with_carry_test) { + auto n = 122_big_uint7; + BOOST_CHECK_EQUAL(add_assign_with_carry(n, 4_big_uint7), false); + BOOST_CHECK_EQUAL(add_assign_with_carry(n, 4_big_uint7), true); +} + BOOST_AUTO_TEST_SUITE(bit_operations) BOOST_AUTO_TEST_CASE_TEMPLATE(and_positive, T, int_types) { @@ -430,7 +465,7 @@ BOOST_AUTO_TEST_CASE(shift_left) { BOOST_CHECK_EQUAL(21_big_uint7 << 5, 32_big_uint7); BOOST_CHECK_EQUAL(21_big_uint7 << 7, 0_big_uint7); BOOST_CHECK_EQUAL(21_big_uint7 << 0, 21_big_uint7); - BOOST_CHECK_EQUAL(21_big_uint7 << -1, 0_big_uint7); + BOOST_CHECK_THROW(21_big_uint7 << -1, std::range_error); } BOOST_AUTO_TEST_CASE(shift_right) { @@ -439,7 +474,7 @@ BOOST_AUTO_TEST_CASE(shift_right) { BOOST_CHECK_EQUAL(21_big_uint7 >> 5, 0_big_uint7); BOOST_CHECK_EQUAL(21_big_uint7 >> 7, 0_big_uint7); BOOST_CHECK_EQUAL(21_big_uint7 >> 0, 21_big_uint7); - BOOST_CHECK_EQUAL(21_big_uint7 >> -1, 0_big_uint7); + BOOST_CHECK_THROW(21_big_uint7 >> -1, std::range_error); } BOOST_AUTO_TEST_CASE(bit_set) { @@ -492,3 +527,10 @@ BOOST_AUTO_TEST_CASE(lsb) { } BOOST_AUTO_TEST_SUITE_END() + +BOOST_AUTO_TEST_CASE(powm_test) { + BOOST_CHECK_EQUAL(powm(2_big_uint7, 4_big_uint7, 5_big_uint7), 1_big_uint7); + BOOST_CHECK_EQUAL(powm(2_big_uint7, 4_big_uint7, 5), 1); + BOOST_CHECK_EQUAL(powm(2_big_uint7, 4, 5_big_uint7), 1_big_uint7); + BOOST_CHECK_EQUAL(powm(2, 4, 5), 1); +} diff --git a/crypto3/libs/multiprecision/test/big_uint_comparison_randomized.cpp b/crypto3/libs/multiprecision/test/big_uint_comparison.cpp similarity index 98% rename from crypto3/libs/multiprecision/test/big_uint_comparison_randomized.cpp rename to crypto3/libs/multiprecision/test/big_uint_comparison.cpp index 7e177d348..3e5d0eeaa 100644 --- a/crypto3/libs/multiprecision/test/big_uint_comparison_randomized.cpp +++ b/crypto3/libs/multiprecision/test/big_uint_comparison.cpp @@ -7,7 +7,7 @@ // http://www.boost.org/LICENSE_1_0.txt //---------------------------------------------------------------------------// -#define BOOST_TEST_MODULE big_int_comparison_test +#define BOOST_TEST_MODULE big_uint_comparison_test #include #include diff --git a/crypto3/libs/multiprecision/test/inverse.cpp b/crypto3/libs/multiprecision/test/inverse.cpp index c0bfd4d80..f89d357ae 100644 --- a/crypto3/libs/multiprecision/test/inverse.cpp +++ b/crypto3/libs/multiprecision/test/inverse.cpp @@ -9,7 +9,7 @@ // http://www.boost.org/LICENSE_1_0.txt //---------------------------------------------------------------------------// -#define BOOST_TEST_MODULE big_int_inverse_test +#define BOOST_TEST_MODULE inverse_test #include diff --git a/crypto3/libs/multiprecision/test/jacobi.cpp b/crypto3/libs/multiprecision/test/jacobi.cpp index 27013a01a..abbe4600c 100644 --- a/crypto3/libs/multiprecision/test/jacobi.cpp +++ b/crypto3/libs/multiprecision/test/jacobi.cpp @@ -8,7 +8,7 @@ // http://www.boost.org/LICENSE_1_0.txt //---------------------------------------------------------------------------// -#define BOOST_TEST_MODULE big_int_jacobi_test +#define BOOST_TEST_MODULE jacobi_test #include #include diff --git a/crypto3/libs/multiprecision/test/miller_rabin.cpp b/crypto3/libs/multiprecision/test/miller_rabin.cpp index 0bf0cbdcf..56aba7a2d 100644 --- a/crypto3/libs/multiprecision/test/miller_rabin.cpp +++ b/crypto3/libs/multiprecision/test/miller_rabin.cpp @@ -8,7 +8,7 @@ // http://www.boost.org/LICENSE_1_0.txt //---------------------------------------------------------------------------// -#define BOOST_TEST_MODULE big_int_miller_rabin_test +#define BOOST_TEST_MODULE miller_rabin_test #include #include diff --git a/crypto3/libs/multiprecision/test/ressol.cpp b/crypto3/libs/multiprecision/test/ressol.cpp index 8e34de921..a3702b15e 100644 --- a/crypto3/libs/multiprecision/test/ressol.cpp +++ b/crypto3/libs/multiprecision/test/ressol.cpp @@ -9,7 +9,7 @@ // http://www.boost.org/LICENSE_1_0.txt //---------------------------------------------------------------------------// -#define BOOST_TEST_MODULE big_int_ressol_test +#define BOOST_TEST_MODULE ressol_test #include From 57aac7b92859b87e826179f21d16dff24e42e0b3 Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Thu, 19 Dec 2024 17:09:01 +0000 Subject: [PATCH 25/29] multiprecision: make casting to smaller type explicit --- .../fields/plonk/non_native/reduction.hpp | 16 ++++++++++++---- .../detail/big_mod/modular_ops.hpp | 10 +++++----- .../detail/big_uint/arithmetic.hpp | 2 +- .../detail/big_uint/big_uint_impl.hpp | 10 +++++++--- 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/crypto3/libs/blueprint/include/nil/blueprint/components/algebra/fields/plonk/non_native/reduction.hpp b/crypto3/libs/blueprint/include/nil/blueprint/components/algebra/fields/plonk/non_native/reduction.hpp index 4762affb8..bf4497758 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/components/algebra/fields/plonk/non_native/reduction.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/components/algebra/fields/plonk/non_native/reduction.hpp @@ -229,7 +229,9 @@ namespace nil { data[6] * (((one << 384) % L) & ((one << 73) - 1)) + data[7] * (((one << 448) % L) & ((one << 73) - 1)) + q * ((one << 73) - (crypto3::algebra::curves::ed25519::scalar_field_type::extended_integral_type(L) % (one << 73))); - crypto3::algebra::curves::ed25519::scalar_field_type::extended_integral_type r_extended = r; + auto r_extended = static_cast< + crypto3::algebra::curves::ed25519::scalar_field_type::extended_integral_type>( + r); auto d = (r_extended) & ((1 << (13)) - 1) + ((r_extended >> 13) & ((1 << (20)) - 1)) * (one << 13) + ((r_extended >> 33) & ((1 << (20)) - 1)) * (one << 33) + ((r_extended >> 53) & ((1 << (20)) - 1)) * (one << 53); @@ -301,9 +303,15 @@ namespace nil { auto constraint_4 = (s_r) * var(component.W(5), 0) + (1 - (s_r)*var(component.W(5), 0)) * var(component.W(6), 0) - 1; - crypto3::algebra::curves::ed25519::scalar_field_type::extended_integral_type one = 1; - std::array m = { - ((one << 192) % L), ((one << 256) % L), ((one << 320) % L), ((one << 384) % L), ((one << 448) % L)}; + using extended_integral_type = + crypto3::algebra::curves::ed25519::scalar_field_type::extended_integral_type; + extended_integral_type one = 1; + std::array m = { + static_cast((one << 192) % L), + static_cast((one << 256) % L), + static_cast((one << 320) % L), + static_cast((one << 384) % L), + static_cast((one << 448) % L)}; auto constraint_5 = var(component.W(0), +1) + var(component.W(1), +1) * (one << 64) + var(component.W(3), +1) * (m[0] & ((one << 73) - 1)) + diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp index 80288970c..783218b39 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp @@ -82,7 +82,7 @@ namespace nil::crypto3::multiprecision::detail { big_uint_padded_limbs compliment = 1u, modulus = m_mod; compliment <<= Bits; compliment -= modulus; - m_mod_compliment = compliment; + m_mod_compliment = static_cast(compliment); } // Common public methods @@ -178,7 +178,7 @@ namespace nil::crypto3::multiprecision::detail { input %= mod(); } } - result = input; + result = static_cast>(input); } // Methods which are customized: mul and exp @@ -226,7 +226,7 @@ namespace nil::crypto3::multiprecision::detail { base *= base; barrett_reduce(base); } - result = res; + result = static_cast>(res); } // Adjust to/from modular form @@ -346,7 +346,7 @@ namespace nil::crypto3::multiprecision::detail { accum -= this->mod(); } - result = accum; + result = static_cast>(accum); } // Delegates Montgomery multiplication to one of corresponding algorithms. @@ -609,7 +609,7 @@ namespace nil::crypto3::multiprecision::detail { this->barrett_reduce(tmp, input); tmp *= r2(); montgomery_reduce(tmp); - result = tmp; + result = static_cast(tmp); } template>(y - rem); } // remainder must be less than the divisor or our code has diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp index cc0ca4105..b7a546a7d 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp @@ -190,12 +190,16 @@ namespace nil::crypto3::multiprecision { do_assign_integral(a); } - // TODO(ioxid): make this explicit for the case when Bits2 > Bits - template + template = 0> constexpr big_uint(const big_uint& other) { do_assign(other); } + template Bits), int> = 0> + explicit constexpr big_uint(const big_uint& other) { + do_assign(other); + } + template constexpr big_uint(const std::array& bytes) noexcept { *this = bytes; @@ -222,7 +226,7 @@ namespace nil::crypto3::multiprecision { return *this; } - template + template = 0> constexpr big_uint& operator=(const big_uint& other) { do_assign(other); return *this; From 63680299e729d12adb143f196d863b21ffaad53b Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Thu, 19 Dec 2024 18:18:15 +0000 Subject: [PATCH 26/29] multiprecision: refactor addition with carry --- .../detail/big_uint/arithmetic.hpp | 9 +++-- .../detail/big_uint/big_uint_impl.hpp | 35 +++++++++++-------- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp index df5d64dad..a06d5eeb4 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp @@ -109,6 +109,7 @@ namespace nil::crypto3::multiprecision { if constexpr (Bits1 % limb_bits != 0) { // If we have set any bit above "Bits", then we have a carry. carry = result.normalize(); + BOOST_ASSERT(carry <= 1); } return carry; @@ -286,6 +287,7 @@ namespace nil::crypto3::multiprecision { if constexpr (Bits1 % limb_bits != 0) { // If we have set any bit above "Bits", then we have a carry. carry = result.normalize(); + BOOST_ASSERT(carry <= 1); } return carry; @@ -385,8 +387,9 @@ namespace nil::crypto3::multiprecision { #endif template - [[nodiscard]] constexpr bool add_unsigned(big_uint& result, const big_uint& a, - const limb_type& b) noexcept { + [[nodiscard]] constexpr limb_type add_unsigned(big_uint& result, + const big_uint& a, + const limb_type& b) noexcept { static_assert(Bits1 >= Bits2, "invalid argument size"); double_limb_type carry = b; @@ -419,6 +422,8 @@ namespace nil::crypto3::multiprecision { carry = result.normalize(); } + BOOST_ASSERT(carry <= max_limb_value); + return carry; } diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp index b7a546a7d..345c898a4 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp @@ -80,6 +80,8 @@ namespace nil::crypto3::multiprecision { static constexpr std::size_t static_limb_count = (Bits / limb_bits) + (((Bits % limb_bits) != 0u) ? 1u : 0u); + static constexpr std::size_t upper_limb_bits = + (Bits % limb_bits) ? Bits % limb_bits : limb_bits; static constexpr limb_type upper_limb_mask = (Bits % limb_bits) ? (limb_type(1) << (Bits % limb_bits)) - 1 : (~limb_type(0u)); @@ -90,10 +92,15 @@ namespace nil::crypto3::multiprecision { constexpr limb_pointer limbs() noexcept { return m_data.data(); } constexpr const_limb_pointer limbs() const noexcept { return m_data.data(); } - constexpr bool normalize() noexcept { - bool result = limbs()[static_limb_count - 1] & ~upper_limb_mask; - limbs()[static_limb_count - 1] &= upper_limb_mask; - return result; + constexpr limb_type normalize() noexcept { + if constexpr (Bits % limb_bits != 0) { + limb_type result = + (limbs()[static_limb_count - 1] & ~upper_limb_mask) >> upper_limb_bits; + limbs()[static_limb_count - 1] &= upper_limb_mask; + return result; + } else { + return 0; + } } // Zeros out everything after limb[i] @@ -544,6 +551,12 @@ namespace nil::crypto3::multiprecision { return a; } + template + [[nodiscard]] friend constexpr bool add_assign_with_carry( + big_uint& a, const big_uint& b) noexcept { + return detail::add_unsigned(a, a, b); + } + template, int> = 0> friend constexpr auto operator-(const big_uint& a, const T& b) { detail::largest_big_uint_t result; @@ -1310,9 +1323,9 @@ namespace nil::crypto3::multiprecision { const big_uint& a, const big_uint& b); template - friend constexpr bool detail::add_unsigned(big_uint& result, - const big_uint& a, - const limb_type& o) noexcept; + friend constexpr limb_type detail::add_unsigned(big_uint& result, + const big_uint& a, + const limb_type& o) noexcept; template friend constexpr void detail::subtract_unsigned(big_uint& result, const big_uint& a, @@ -1331,14 +1344,6 @@ namespace nil::crypto3::multiprecision { friend class detail::montgomery_modular_ops; }; - // Addition with carry - - template - [[nodiscard]] constexpr bool add_assign_with_carry(big_uint& a, - const big_uint& b) noexcept { - return detail::add_unsigned(a, a, b); - } - // For generic code template From ca5e99e6ebc991924bc05d2bfb08b2ac6129cd41 Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Fri, 20 Dec 2024 01:03:33 +0000 Subject: [PATCH 27/29] blueprint: use big_uint as zkevm_word_type --- .../components/hashes/keccak/keccak_table.hpp | 7 +- .../nil/blueprint/zkevm/copy_event.hpp | 15 +- .../include/nil/blueprint/zkevm/memory.hpp | 29 ++- .../nil/blueprint/zkevm/operations/addmod.hpp | 20 +- .../blueprint/zkevm/operations/bitwise.hpp | 12 +- .../nil/blueprint/zkevm/operations/byte.hpp | 18 +- .../nil/blueprint/zkevm/operations/cmp.hpp | 20 +- .../nil/blueprint/zkevm/operations/div.hpp | 4 +- .../blueprint/zkevm/operations/div_mod.hpp | 13 +- .../nil/blueprint/zkevm/operations/err0.hpp | 1 - .../nil/blueprint/zkevm/operations/err1.hpp | 1 - .../nil/blueprint/zkevm/operations/iszero.hpp | 2 +- .../nil/blueprint/zkevm/operations/mulmod.hpp | 27 +-- .../nil/blueprint/zkevm/operations/not.hpp | 3 +- .../nil/blueprint/zkevm/operations/pushx.hpp | 6 +- .../nil/blueprint/zkevm/operations/sar.hpp | 44 ++-- .../blueprint/zkevm/operations/sdiv_smod.hpp | 31 +-- .../nil/blueprint/zkevm/operations/shl.hpp | 19 +- .../nil/blueprint/zkevm/operations/shr.hpp | 28 +-- .../blueprint/zkevm/operations/signextend.hpp | 28 +-- .../zkevm/zkevm_machine_interface.hpp | 64 +++--- .../nil/blueprint/zkevm/zkevm_word.hpp | 92 +++----- .../hardhat_input_generator.hpp | 18 +- .../opcode_tester_input_generator.hpp | 129 +++++------ .../blueprint/zkevm_bbf/opcodes/add_sub.hpp | 3 +- .../blueprint/zkevm_bbf/opcodes/addmod.hpp | 25 +- .../blueprint/zkevm_bbf/opcodes/bitwise.hpp | 5 +- .../nil/blueprint/zkevm_bbf/opcodes/byte.hpp | 1 - .../blueprint/zkevm_bbf/opcodes/div_mod.hpp | 17 +- .../nil/blueprint/zkevm_bbf/opcodes/exp.hpp | 5 +- .../blueprint/zkevm_bbf/opcodes/keccak.hpp | 7 +- .../nil/blueprint/zkevm_bbf/opcodes/mul.hpp | 8 +- .../blueprint/zkevm_bbf/opcodes/mulmod.hpp | 38 +--- .../nil/blueprint/zkevm_bbf/opcodes/sar.hpp | 44 +--- .../blueprint/zkevm_bbf/opcodes/sdiv_smod.hpp | 35 +-- .../nil/blueprint/zkevm_bbf/opcodes/shl.hpp | 17 +- .../nil/blueprint/zkevm_bbf/opcodes/shr.hpp | 26 +-- .../zkevm_bbf/opcodes/signextend.hpp | 25 +- .../zkevm_bbf/types/rw_operation.hpp | 4 +- .../include/nil/blueprint/zkevm_bbf/util.hpp | 16 +- .../libs/blueprint/test/bbf/exp_wrapper.cpp | 19 +- .../libs/blueprint/test/zkevm/bytecode.cpp | 3 +- .../blueprint/test/zkevm/opcode_tester.hpp | 62 ++--- .../blueprint/test/zkevm/opcodes/add_sub.cpp | 38 +++- .../blueprint/test/zkevm/opcodes/bitwise.cpp | 72 ++++-- .../blueprint/test/zkevm/opcodes/byte_ops.cpp | 212 ++++++++++++----- .../libs/blueprint/test/zkevm/opcodes/cmp.cpp | 100 +++++--- .../libs/blueprint/test/zkevm/opcodes/div.cpp | 128 ++++++++--- .../blueprint/test/zkevm/opcodes/err0.cpp | 7 +- .../blueprint/test/zkevm/opcodes/mod_ops.cpp | 84 +++++-- .../libs/blueprint/test/zkevm/opcodes/mul.cpp | 24 +- .../libs/blueprint/test/zkevm/opcodes/not.cpp | 10 +- .../blueprint/test/zkevm/opcodes/workload.cpp | 6 +- .../test/zkevm_bbf/opcodes/add_sub.cpp | 38 +++- .../test/zkevm_bbf/opcodes/bitwise.cpp | 72 ++++-- .../test/zkevm_bbf/opcodes/byte_ops.cpp | 214 +++++++++++++----- .../blueprint/test/zkevm_bbf/opcodes/cmp.cpp | 100 +++++--- .../blueprint/test/zkevm_bbf/opcodes/div.cpp | 128 ++++++++--- .../blueprint/test/zkevm_bbf/opcodes/exp.cpp | 32 ++- .../blueprint/test/zkevm_bbf/opcodes/mul.cpp | 42 +++- .../blueprint/test/zkevm_bbf/opcodes/not.cpp | 10 +- .../test/zkevm_bbf/opcodes/pushx.cpp | 85 ++++--- .../proof-generator/assigner/trace_parser.hpp | 4 +- 63 files changed, 1414 insertions(+), 983 deletions(-) diff --git a/crypto3/libs/blueprint/include/nil/blueprint/components/hashes/keccak/keccak_table.hpp b/crypto3/libs/blueprint/include/nil/blueprint/components/hashes/keccak/keccak_table.hpp index a154b3d81..9c507865a 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/components/hashes/keccak/keccak_table.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/components/hashes/keccak/keccak_table.hpp @@ -50,8 +50,11 @@ namespace nil { nil::crypto3::algebra::fields::field<256>::integral_type n(d); std::pair hash_value; - hash_value.first = (n & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000_big_uint257) >> 128; - hash_value.second = n & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF_big_uint257; + hash_value.first = + (n & + 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000_big_uint256) >> + 128; + hash_value.second = n & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF_big_uint256; return hash_value; } diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/copy_event.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/copy_event.hpp index fba8f1a82..44b100e5f 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/copy_event.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/copy_event.hpp @@ -199,16 +199,11 @@ namespace nil { // CALLOP, RETURN, REVERT, RETURNDATACOPY // This function is just for testing. It'll be fully rewritten in evm-assigner. - std::size_t copy_events_from_trace( - std::vector &result, - boost::property_tree::ptree const &pt, - std::size_t rows_amount, - std::size_t call_id = 0, - std::size_t transaction_id = 0, - std::size_t initial_rw_counter = 0 - ){ - using integral_type = nil::crypto3::multiprecision::big_uint<257>; - + std::size_t copy_events_from_trace(std::vector &result, + boost::property_tree::ptree const &pt, + std::size_t rows_amount, std::size_t call_id = 0, + std::size_t transaction_id = 0, + std::size_t initial_rw_counter = 0) { boost::property_tree::ptree ptrace = pt.get_child("result.structLogs"); boost::property_tree::ptree pstack; boost::property_tree::ptree pmemory; diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/memory.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/memory.hpp index e9b368eec..ab360014b 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/memory.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/memory.hpp @@ -143,15 +143,19 @@ namespace nil { void append_opcode( std::string opcode, - const std::vector &stack, // Stack state before operation - const std::vector &stack_next, // stack state after operation. We need it for correct PUSH and correct SLOAD - const std::vector &memory , // Memory state before operation in bytes format - const std::vector &memory_next , // Memory state before operation in bytes format - const std::map &storage,// Storage state before operation - const std::map &storage_next// Storage state before operation - ){ - using integral_type = nil::crypto3::multiprecision::big_uint<257>; - + const std::vector &stack, // Stack state before operation + const std::vector + &stack_next, // stack state after operation. We need it for correct PUSH and + // correct SLOAD + const std::vector + &memory, // Memory state before operation in bytes format + const std::vector + &memory_next, // Memory state before operation in bytes format + const std::map + &storage, // Storage state before operation + const std::map + &storage_next // Storage state before operation + ) { // Opcode is not presented in RW lookup table. We just take it from json // // std::cout << opcode << std::endl; if(opcode == "STOP") { @@ -420,8 +424,8 @@ namespace nil { // std::cout << "\t" << rw_ops[rw_ops.size()-1] << std::endl; rw_ops.push_back(stack_operation(call_id, stack.size()-1, rw_ops.size(), false, stack[stack.size()-1])); // std::cout << "\t" << rw_ops[rw_ops.size()-1] << std::endl; - std::size_t length = std::size_t(integral_type(stack[stack.size()-3])); - std::size_t dest = std::size_t(integral_type(stack[stack.size()-1])); + std::size_t length = std::size_t(stack[stack.size()-3]); + std::size_t dest = std::size_t(stack[stack.size()-1]); // std::cout << "Length = " << length << std::endl; // std::cout << "Memory_size " << memory.size() << "=>" << memory_next.size() << std::endl; for( std::size_t i = 0; i < length; i++){ @@ -584,7 +588,7 @@ namespace nil { BOOST_ASSERT_MSG(addr < std::numeric_limits::max(), "Cannot process so large memory address"); // std::cout << "\t\t Address = 0x" << std::hex << addr << std::dec << " memory size " << memory.size() << std::endl; for( std::size_t i = 0; i < 32; i++){ - rw_ops.push_back(memory_operation(call_id, addr+i, rw_ops.size(), false, addr+i < memory.size() ? memory[std::size_t(integral_type(addr+i))]: 0)); + rw_ops.push_back(memory_operation(call_id, addr+i, rw_ops.size(), false, addr+i < memory.size() ? memory[std::size_t(addr+i)]: 0)); // std::cout << "\t" << rw_ops[rw_ops.size()-1] << std::endl; } rw_ops.push_back(stack_operation(call_id, stack_next.size()-1, rw_ops.size(), true, stack_next[stack_next.size()-1])); @@ -1256,6 +1260,7 @@ namespace nil { BOOST_ASSERT(false); } } + public: rw_trace(boost::property_tree::ptree const &pt, std::size_t rows_amount, std::size_t _call_id = 0){ call_id = _call_id; diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/addmod.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/addmod.hpp index ddfe071a7..f4b5c5461 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/addmod.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/addmod.hpp @@ -326,26 +326,24 @@ namespace nil { void generate_assignments(zkevm_table_type &zkevm_table, const zkevm_machine_interface &machine) override { using word_type = typename zkevm_stack::word_type; - using integral_type = nil::crypto3::multiprecision::big_uint<257>; word_type a = machine.stack_top(); word_type b = machine.stack_top(1); word_type N = machine.stack_top(2); - integral_type s_integral = integral_type(a) + integral_type(b); - int is_overflow = (s_integral >= zkevm_modulus); - word_type s = word_type(s_integral); + auto s_full = nil::crypto3::multiprecision::big_uint<257>(a) + b; + int is_overflow = s_full.bit_test(256); + word_type s = s_full.truncate<256>(); - integral_type r_integral = N != 0u ? s_integral / integral_type(N) : 0u; - bool r_overflow = (r_integral >= zkevm_modulus); - word_type r = r_integral; + auto r_full = N != 0u ? s_full / N : 0u; + bool r_overflow = r_full.bit_test(256); + word_type r = r_full.truncate<256>(); // word_type q = N != 0u ? s % N : s; - word_type q = word_type(s_integral - r_integral*integral_type(N)); - word_type q_out = N != 0u ? q : 0; // according to EVM spec s % 0 = 0 + word_type q = word_type(s_full - r_full * N); + word_type q_out = N != 0u ? q : 0u; // according to EVM spec s % 0 = 0 - bool t_last = integral_type(q) < integral_type(N); - word_type v = word_type(integral_type(q) + integral_type(t_last)*zkevm_modulus - integral_type(N)); + word_type v = subtract_wrapping(q, N); word_type result = q_out; diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/bitwise.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/bitwise.hpp index 198d4bfa2..71a1255c8 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/bitwise.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/bitwise.hpp @@ -112,9 +112,15 @@ namespace nil { word_type result; switch(bit_operation) { - case B_AND: result = a.base() & b.base(); break; - case B_OR: result = a.base() | b.base(); break; - case B_XOR: result = a.base() ^ b.base(); break; + case B_AND: + result = a & b; + break; + case B_OR: + result = a | b; + break; + case B_XOR: + result = a ^ b; + break; } const std::vector a_chunks = zkevm_word_to_field_element(a); diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/byte.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/byte.hpp index 052de4cc0..517a93900 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/byte.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/byte.hpp @@ -131,22 +131,17 @@ namespace nil { void generate_assignments(zkevm_table_type &zkevm_table, const zkevm_machine_interface &machine) override { using word_type = typename zkevm_stack::word_type; - using integral_type = nil::crypto3::multiprecision::big_uint<257>; word_type i = machine.stack_top(); word_type x = machine.stack_top(1); - int shift = (integral_type(i) < 32) ? int(integral_type(i)) : 32; - word_type result = word_type((integral_type(x) << ((8*shift) + 1)) >> (31*8 + 1)); - // +1 because integral type is 257 bits long + int shift = (i < 32) ? int(i) : 32; + word_type result = (x << (8 * shift)) >> (31 * 8); - unsigned int i0 = static_cast(integral_type(i) % 65536), - i0p = (integral_type(i) > 65535) ? 32 : i0; + unsigned int i0 = static_cast(i % 65536), i0p = (i > 65535) ? 32 : i0; int parity = i0p % 2, n = (i0p - parity) / 2; - unsigned int xn = static_cast((integral_type(x) << (16*n + 1)) >> (16*15 + 1)), - // +1 because integral_type is 257 bits long - xpp = xn % 256, - xp = (xn - xpp) / 256; + unsigned int xn = static_cast((x << (16 * n)) >> (16 * 15)), + xpp = xn % 256, xp = (xn - xpp) / 256; const std::vector i_chunks = zkevm_word_to_field_element(i); const std::vector x_chunks = zkevm_word_to_field_element(x); @@ -179,7 +174,8 @@ namespace nil { assignment.witness(witness_cols[chunk_amount + 4], curr_row) = xn; // n is the offset from MSW assignment.witness(witness_cols[chunk_amount + 5], curr_row) = xp; assignment.witness(witness_cols[chunk_amount + 6], curr_row) = xpp; - assignment.witness(witness_cols[chunk_amount + 7], curr_row) = static_cast(integral_type(result)); + assignment.witness(witness_cols[chunk_amount + 7], curr_row) = + static_cast(result); } std::size_t rows_amount() override { diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/cmp.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/cmp.hpp index 30688dd15..9e0aef141 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/cmp.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/cmp.hpp @@ -175,20 +175,15 @@ namespace nil { void generate_assignments(zkevm_table_type &zkevm_table, const zkevm_machine_interface &machine) override { using word_type = typename zkevm_stack::word_type; - using integral_type = nil::crypto3::multiprecision::big_uint<257>; - - auto is_negative = [](word_type x) { - return (integral_type(x) > zkevm_modulus/2 - 1); - }; word_type x = machine.stack_top(); word_type y = machine.stack_top(1); word_type r; if ((cmp_operation == C_LT) || (cmp_operation == C_SLT)) { - r = (integral_type(x) < integral_type(y)); + r = x < y; } else { - r = (integral_type(x) > integral_type(y)); + r = x > y; } word_type result; @@ -212,7 +207,7 @@ namespace nil { a = x; c = y; } - b = word_type(integral_type(c) + integral_type(r)*zkevm_modulus - integral_type(a)); + b = subtract_wrapping(c, a); const std::vector a_chunks = zkevm_word_to_field_element(a); const std::vector b_chunks = zkevm_word_to_field_element(b); @@ -236,7 +231,7 @@ namespace nil { if (cmp_operation == C_EQ) { assignment.witness(witness_cols[2*chunk_amount], curr_row + 1) = b_sum.is_zero() ? value_type::zero() : value_type::one() * b_sum.inversed(); - assignment.witness(witness_cols[chunk_amount + 1], curr_row + 1) = integral_type(result); + assignment.witness(witness_cols[chunk_amount + 1], curr_row + 1) = result; } for (std::size_t i = 0; i < chunk_amount; i++) { @@ -244,9 +239,8 @@ namespace nil { } if ((cmp_operation == C_SLT) || (cmp_operation == C_SGT)) { - integral_type two_15 = 32768, - biggest_a_chunk = integral_type(a) >> (256 - 16), - biggest_r_chunk = integral_type(c) >> (256 - 16); + word_type two_15 = 32768, biggest_a_chunk = a >> (256 - 16), + biggest_r_chunk = c >> (256 - 16); // find the sign bit by adding 2^16/2 to the biggest chunk. The carry-on bit is 1 iff the sign bit is 1 assignment.witness(witness_cols[chunk_amount], curr_row + 1) = @@ -257,7 +251,7 @@ namespace nil { (biggest_r_chunk > two_15 - 1) ? (biggest_r_chunk - two_15) : biggest_r_chunk + two_15; assignment.witness(witness_cols[chunk_amount + 3], curr_row + 1) = (biggest_r_chunk > two_15 - 1); - assignment.witness(witness_cols[chunk_amount + 4], curr_row + 1) = integral_type(result); + assignment.witness(witness_cols[chunk_amount + 4], curr_row + 1) = result; } // we might want to pack carries more efficiently? diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/div.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/div.hpp index fa1f1d0f3..be02e5ef5 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/div.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/div.hpp @@ -216,8 +216,8 @@ namespace nil { zkevm_stack &stack = machine.stack; word_type a = stack.pop(); word_type b = stack.pop(); - word_type result = b.base() != 0u ? a.base() / b.base() : 0u; - word_type q = b.base() != 0u ? a.base() % b.base() : a; + word_type result = b != 0u ? a / b : 0u; + word_type q = b != 0u ? a % b : a; const std::vector a_chunks = zkevm_word_to_field_element(a); const std::vector b_chunks = zkevm_word_to_field_element(b); diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/div_mod.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/div_mod.hpp index ed93e1bd6..7f7149c4a 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/div_mod.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/div_mod.hpp @@ -278,14 +278,11 @@ namespace nil { using word_type = typename zkevm_stack::word_type; word_type a = machine.stack_top(); word_type b = machine.stack_top(1); - using integral_type = nil::crypto3::multiprecision::big_uint<257>; - integral_type r_integral = b != 0u ? integral_type(a) / integral_type(b) : 0u; - word_type r = r_integral; - word_type q = b != 0u ? integral_type(a) % integral_type(b) : a; - word_type q_out = b != 0u ? q : 0; // according to EVM spec a % 0 = 0 - - bool t_last = integral_type(q) < integral_type(b); - word_type v = word_type(integral_type(q) + integral_type(t_last)*zkevm_modulus - integral_type(b)); + word_type r = b != 0u ? a / b : 0u; + word_type q = b != 0u ? a % b : a; + word_type q_out = b != 0u ? q : 0u; // according to EVM spec a % 0 = 0 + + word_type v = subtract_wrapping(q, b); word_type result = is_div ? r : q_out; diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/err0.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/err0.hpp index e445d98d3..f801c7f44 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/err0.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/err0.hpp @@ -146,7 +146,6 @@ namespace nil { void generate_assignments(zkevm_table_type &zkevm_table, const zkevm_machine_interface &machine, zkevm_word_type additional_input) { using word_type = typename zkevm_stack::word_type; - using integral_type = nil::crypto3::multiprecision::big_uint<257>; using circuit_integral_type = typename BlueprintFieldType::integral_type; zkevm_opcode opcode_mnemo = machine.error_opcode(); std::size_t opcode_num = zkevm_table.get_opcodes_info().get_opcode_number(opcode_mnemo); diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/err1.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/err1.hpp index 8b9adb460..7a5a43c9d 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/err1.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/err1.hpp @@ -145,7 +145,6 @@ namespace nil { void generate_assignments(zkevm_table_type &zkevm_table, const zkevm_machine_interface &machine, zkevm_word_type additional_input) { using word_type = typename zkevm_stack::word_type; - using integral_type = nil::crypto3::multiprecision::big_uint<257>; using circuit_integral_type = typename BlueprintFieldType::integral_type; assignment_type &assignment = zkevm_table.get_assignment(); diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/iszero.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/iszero.hpp index 606307c10..4c990ac64 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/iszero.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/iszero.hpp @@ -99,7 +99,7 @@ namespace nil { for (std::size_t i = 0; i < chunk_amount; i++) { assignment.witness(witness_cols[i], curr_row) = chunks[i]; } - assignment.witness(witness_cols[chunk_amount], curr_row) = (a.base() == 0u); + assignment.witness(witness_cols[chunk_amount], curr_row) = (a == 0u); const value_type chunk_sum = std::accumulate(chunks.begin(), chunks.end(), value_type::zero()); assignment.witness(witness_cols[2*chunk_amount], curr_row) = chunk_sum == 0 ? value_type::zero() : value_type::one() * chunk_sum.inversed(); diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/mulmod.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/mulmod.hpp index 82815b282..88e9c18a4 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/mulmod.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/mulmod.hpp @@ -455,7 +455,6 @@ namespace nil { void generate_assignments(zkevm_table_type &zkevm_table, const zkevm_machine_interface &machine) override { using word_type = typename zkevm_stack::word_type; - using integral_type = nil::crypto3::multiprecision::big_uint<257>; using extended_integral_type = nil::crypto3::multiprecision::big_uint<512>; word_type input_a = machine.stack_top(); @@ -464,23 +463,25 @@ namespace nil { word_type a = N != 0u ? input_a : 0; - extended_integral_type s_integral = extended_integral_type(integral_type(a)) * extended_integral_type(integral_type(b)); + extended_integral_type s_integral = + extended_integral_type(a) * extended_integral_type(b); - word_type sp = word_type(s_integral % extended_integral_type(zkevm_modulus)); - word_type spp = word_type(s_integral / extended_integral_type(zkevm_modulus)); + // TODO(ioxid): optimize all this: use divide_qr and bitwise operations + word_type sp = word_type(s_integral % extended_zkevm_mod); + word_type spp = word_type(s_integral / extended_zkevm_mod); - extended_integral_type r_integral = N != 0u ? s_integral / extended_integral_type(integral_type(N)) : 0u; - word_type rp = word_type(r_integral % extended_integral_type(zkevm_modulus)); - word_type rpp = word_type(r_integral / extended_integral_type(zkevm_modulus)); + extended_integral_type r_integral = + N != 0u ? s_integral / extended_integral_type(N) : 0u; + word_type rp = word_type(r_integral % extended_zkevm_mod); + word_type rpp = word_type(r_integral / extended_zkevm_mod); - word_type q = N != 0u ? word_type(s_integral % extended_integral_type(integral_type(N))) : 0u; + word_type q = N != 0u ? word_type(s_integral % extended_integral_type(N)) : 0u; - extended_integral_type Nr_integral = s_integral - extended_integral_type(integral_type(q)); - word_type Nr_p = word_type(Nr_integral % extended_integral_type(zkevm_modulus)); - word_type Nr_pp = word_type(Nr_integral / extended_integral_type(zkevm_modulus)); + extended_integral_type Nr_integral = s_integral - extended_integral_type(q); + word_type Nr_p = word_type(Nr_integral % extended_zkevm_mod); + word_type Nr_pp = word_type(Nr_integral / extended_zkevm_mod); - bool t_last = integral_type(q) < integral_type(N); - word_type v = word_type(integral_type(q) + integral_type(t_last)*zkevm_modulus - integral_type(N)); + word_type v = subtract_wrapping(q, N); word_type result = q; diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/not.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/not.hpp index 4d3ca8a78..f6c38201f 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/not.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/not.hpp @@ -122,9 +122,8 @@ namespace nil { void generate_assignments(zkevm_table_type &zkevm_table, const zkevm_machine_interface &machine) override { using word_type = typename zkevm_stack::word_type; - using integral_type = nil::crypto3::multiprecision::big_uint<257>; word_type a = machine.stack_top(); - word_type result = word_type((~integral_type(a)) % zkevm_modulus); + word_type result = ~a; const std::vector a_chunks = zkevm_word_to_field_element(a); const std::vector b_chunks = zkevm_word_to_field_element(result); diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/pushx.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/pushx.hpp index 299748638..4763604b8 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/pushx.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/pushx.hpp @@ -110,10 +110,10 @@ namespace nil { zkevm_table_type &zkevm_table, const zkevm_machine_interface &machine, zkevm_word_type bytecode_input ) { using word_type = typename zkevm_stack::word_type; - using integral_type = nil::crypto3::multiprecision::big_uint<257>; - zkevm_word_type a = word_type(integral_type(bytecode_input) & - ((integral_type(1) << (8*byte_count)) - 1)); // use only byte_count lowest bytes + zkevm_word_type a = + bytecode_input & subtract_wrapping(word_type(1) << (8 * byte_count), + 1); // use only byte_count lowest bytes const std::array bytes = w_to_8(a); const std::vector &witness_cols = zkevm_table.get_opcode_cols(); diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/sar.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/sar.hpp index 61070dee0..d2522b1a8 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/sar.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/sar.hpp @@ -432,37 +432,23 @@ namespace nil { void generate_assignments(zkevm_table_type &zkevm_table, const zkevm_machine_interface &machine) override { using word_type = typename zkevm_stack::word_type; - using integral_type = nil::crypto3::multiprecision::big_uint<257>; word_type input_b = machine.stack_top(); word_type input_a = machine.stack_top(1); - auto is_negative = [](word_type x) { - return (integral_type(x) > zkevm_modulus/2 - 1); - }; - auto negate_word = [](word_type x) { - return word_type(zkevm_modulus - integral_type(x)); - }; - auto abs_word = [&is_negative, &negate_word](word_type x) { - return is_negative(x)? negate_word(x) : x; - }; - word_type a = abs_word(input_a); - int shift = (integral_type(input_b) < 256) ? int(integral_type(input_b)) : 256; - integral_type r_integral = integral_type(a) >> shift; + int shift = (input_b < 256) ? int(input_b) : 256; + word_type r = a >> shift; - word_type result = is_negative(input_a) ? ( - (r_integral == 0)? word_type(zkevm_modulus-1) : negate_word(word_type(r_integral)) - ) : word_type(r_integral); + word_type result = is_negative(input_a) ? ((r == 0) ? neg_one : negate_word(r)) : r; - word_type b = word_type(integral_type(1) << shift); + word_type b = word_type(1) << shift; - word_type r = r_integral; - word_type q = b != 0u ? a.base() % b.base() : a; + // TODO(ioxid): optimize this with bit ops + word_type q = b != 0u ? a % b : a; - bool t_last = integral_type(q) < integral_type(b); - word_type v = word_type(integral_type(q) + integral_type(t_last)*zkevm_modulus - integral_type(b)); + word_type v = subtract_wrapping(q, b); const std::vector input_a_chunks = zkevm_word_to_field_element(input_a); const std::vector a_chunks = zkevm_word_to_field_element(a); @@ -481,8 +467,7 @@ namespace nil { for (std::size_t i = 0; i < chunk_amount; i++) { assignment.witness(witness_cols[i], curr_row) = result_chunks[i]; } - integral_type two_15 = 32768, - biggest_input_a_chunk = integral_type(input_a) >> (256-16); + word_type two_15 = 32768, biggest_input_a_chunk = input_a >> (256 - 16); assignment.witness(witness_cols[chunk_amount],curr_row) = (biggest_input_a_chunk > two_15 - 1) ? (biggest_input_a_chunk - two_15) : biggest_input_a_chunk + two_15; // a_aux assignment.witness(witness_cols[chunk_amount + 1],curr_row) = (biggest_input_a_chunk > two_15 - 1); // a_neg @@ -563,18 +548,19 @@ namespace nil { for (std::size_t i = 0; i < chunk_amount; i++) { assignment.witness(witness_cols[i], curr_row + 5) = input_b_chunks[i]; } - value_type b0p = integral_type(input_b) % 16, - b0pp = (integral_type(input_b) / 16) % 16, - b0ppp = (integral_type(input_b) % 65536) / 256, - I1 = b0ppp.is_zero() ? 0 : b0ppp.inversed(); + value_type b0p = input_b % 16, b0pp = (input_b / 16) % 16, + b0ppp = (input_b % 65536) / 256, + I1 = b0ppp.is_zero() ? 0 : b0ppp.inversed(); value_type sum_part_b = 0; for(std::size_t i = 1; i < chunk_amount; i++) { sum_part_b += input_b_chunks[i]; } value_type I2 = sum_part_b.is_zero() ? 0 : sum_part_b.inversed(), - z = (1 - b0ppp * I1) * (1 - sum_part_b * I2), // z is zero if input_b >= 256, otherwise it is 1 - tp = z * (static_cast(1) << int(integral_type(input_b) % 16)); + z = (1 - b0ppp * I1) * + (1 - + sum_part_b * I2), // z is zero if input_b >= 256, otherwise it is 1 + tp = z * (static_cast(1) << int(input_b % 16)); assignment.witness(witness_cols[chunk_amount], curr_row + 5) = b0p; assignment.witness(witness_cols[chunk_amount + 1], curr_row + 5) = b0pp; diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/sdiv_smod.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/sdiv_smod.hpp index 6ef21cc05..05ba564b7 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/sdiv_smod.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/sdiv_smod.hpp @@ -479,7 +479,6 @@ namespace nil { void generate_assignments(zkevm_table_type &zkevm_table, const zkevm_machine_interface &machine) override { using word_type = typename zkevm_stack::word_type; - using integral_type = nil::crypto3::multiprecision::big_uint<257>; word_type a = machine.stack_top(); word_type b_input = machine.stack_top(1); @@ -487,30 +486,18 @@ namespace nil { // According to Yellow paper, the result of -2^255 / -1 should be -2^255 (Yellow paper, page 30) // To achive that we need to replace b = -1 by b = 1 in this special case. This also helps the SMOD operation - word_type b = (integral_type(a) == zkevm_modulus - 1) && (integral_type(b_input) == zkevm_modulus/2) ? 1 : b_input; - - auto is_negative = [](word_type x) { - return (integral_type(x) > zkevm_modulus/2 - 1); - }; - auto negate_word = [](word_type x) { - return word_type(zkevm_modulus - integral_type(x)); - }; - auto abs_word = [&is_negative, &negate_word](word_type x) { - return is_negative(x)? negate_word(x) : x; - }; + word_type b = (a == neg_one) && (b_input == min_neg) ? 1 : b_input; word_type a_abs = abs_word(a), b_abs = abs_word(b); - integral_type r_integral = (b != 0u)? integral_type(a_abs) / integral_type(b_abs) : 0u; - word_type r_abs = r_integral, - q_abs = b != 0u ? integral_type(a_abs) % integral_type(b_abs) : integral_type(a_abs), + word_type r_abs = b != 0u ? a_abs / b_abs : 0u; + word_type q_abs = b != 0u ? a_abs % b_abs : a_abs, r = (is_negative(a) == is_negative(b)) ? r_abs : negate_word(r_abs), - q = is_negative(a)? negate_word(q_abs) : q_abs; + q = is_negative(a) ? negate_word(q_abs) : q_abs; - word_type q_out = b != 0u ? q : 0; // according to EVM spec a % 0 = 0 - bool t_last = integral_type(q_abs) < integral_type(b_abs); - word_type v = word_type(integral_type(q_abs) + integral_type(t_last)*zkevm_modulus - integral_type(b_abs)); + word_type q_out = b != 0u ? q : 0u; // according to EVM spec a % 0 = 0 + word_type v = subtract_wrapping(q_abs, b_abs); word_type result = is_div ? r : q_out; @@ -590,10 +577,8 @@ namespace nil { // compute signs of a,b and q // x + 2^15 = x_aux + 2^16*x_neg - integral_type two_15 = 32768, - biggest_a_chunk = integral_type(a) >> (256 - 16), - biggest_b_chunk = integral_type(b) >> (256 - 16), - biggest_q_chunk = integral_type(q) >> (256 - 16); + word_type two_15 = 32768, biggest_a_chunk = a >> (256 - 16), + biggest_b_chunk = b >> (256 - 16), biggest_q_chunk = q >> (256 - 16); assignment.witness(witness_cols[5 + chunk_amount], curr_row + 1) = (biggest_a_chunk > two_15 - 1) ? (biggest_a_chunk - two_15) : biggest_a_chunk + two_15; // a_aux diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/shl.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/shl.hpp index 347454f3a..9fca6fb8b 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/shl.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/shl.hpp @@ -223,16 +223,15 @@ namespace nil { void generate_assignments(zkevm_table_type &zkevm_table, const zkevm_machine_interface &machine) override { using word_type = typename zkevm_stack::word_type; - using integral_type = nil::crypto3::multiprecision::big_uint<257>; word_type a = machine.stack_top(); word_type input_b = machine.stack_top(1); - int shift = (integral_type(input_b) < 256) ? int(integral_type(input_b)) : 256; + int shift = (input_b < 256) ? int(input_b) : 256; - word_type result = word_type(integral_type(a) << shift); + word_type result = a << shift; - word_type b = word_type(integral_type(1) << shift); + word_type b = word_type(1) << shift; const std::vector input_b_chunks = zkevm_word_to_field_element(input_b); const std::vector a_chunks = zkevm_word_to_field_element(a); @@ -240,18 +239,18 @@ namespace nil { const std::vector r_chunks = zkevm_word_to_field_element(result); const std::size_t chunk_amount = a_chunks.size(); - value_type b0p = integral_type(input_b) % 16, - b0pp = (integral_type(input_b) / 16) % 16, - b0ppp = (integral_type(input_b) % 65536) / 256, - I1 = b0ppp.is_zero() ? 0 : b0ppp.inversed(); + value_type b0p = input_b % 16, b0pp = (input_b / 16) % 16, + b0ppp = (input_b % 65536) / 256, + I1 = b0ppp.is_zero() ? 0 : b0ppp.inversed(); value_type sum_b = 0; for(std::size_t i = 1; i < chunk_amount; i++) { sum_b += input_b_chunks[i]; } value_type I2 = sum_b.is_zero() ? 0 : sum_b.inversed(), - z = (1 - b0ppp * I1) * (1 - sum_b * I2), // z is zero if input_b >= 256, otherwise it is 1 - tp = z * (static_cast(1) << int(integral_type(input_b) % 16)); + z = (1 - b0ppp * I1) * + (1 - sum_b * I2), // z is zero if input_b >= 256, otherwise it is 1 + tp = z * (static_cast(1) << int(input_b % 16)); // note that we don't assign 64-chunks for a/b, as we can build them from 16-chunks with constraints // under the same logic we only assign the 16-bit chunks for carries diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/shr.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/shr.hpp index 217674b84..88fe3aab4 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/shr.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/shr.hpp @@ -329,21 +329,20 @@ namespace nil { void generate_assignments(zkevm_table_type &zkevm_table, const zkevm_machine_interface &machine) override { using word_type = typename zkevm_stack::word_type; - using integral_type = nil::crypto3::multiprecision::big_uint<257>; word_type input_b = machine.stack_top(); word_type a = machine.stack_top(1); - int shift = (integral_type(input_b) < 256) ? int(integral_type(input_b)) : 256; - integral_type r_integral = integral_type(a) >> shift; + int shift = (input_b < 256) ? int(input_b) : 256; + word_type r = a >> shift; - word_type b = word_type(integral_type(1) << shift); + word_type b = word_type(1) << shift; - word_type result = r_integral; - word_type q = b != 0u ? a.base() % b.base() : a; + word_type result = r; + // TODO(ioxid): optimize: use bit operations + word_type q = b != 0u ? a % b : a; - bool t_last = integral_type(q) < integral_type(b); - word_type v = word_type(integral_type(q) + integral_type(t_last)*zkevm_modulus - integral_type(b)); + word_type v = subtract_wrapping(q, b); const std::vector a_chunks = zkevm_word_to_field_element(a); const std::vector b_chunks = zkevm_word_to_field_element(b); @@ -404,18 +403,19 @@ namespace nil { for (std::size_t i = 0; i < chunk_amount; i++) { assignment.witness(witness_cols[i], curr_row + 3) = input_b_chunks[i]; } - value_type b0p = integral_type(input_b) % 16, - b0pp = (integral_type(input_b) / 16) % 16, - b0ppp = (integral_type(input_b) % 65536) / 256, - I1 = b0ppp.is_zero() ? 0 : b0ppp.inversed(); + value_type b0p = input_b % 16, b0pp = (input_b / 16) % 16, + b0ppp = (input_b % 65536) / 256, + I1 = b0ppp.is_zero() ? 0 : b0ppp.inversed(); value_type sum_part_b = 0; for(std::size_t i = 1; i < chunk_amount; i++) { sum_part_b += input_b_chunks[i]; } value_type I2 = sum_part_b.is_zero() ? 0 : sum_part_b.inversed(), - z = (1 - b0ppp * I1) * (1 - sum_part_b * I2), // z is zero if input_b >= 256, otherwise it is 1 - tp = z * (static_cast(1) << int(integral_type(input_b) % 16)); + z = (1 - b0ppp * I1) * + (1 - + sum_part_b * I2), // z is zero if input_b >= 256, otherwise it is 1 + tp = z * (static_cast(1) << int(input_b % 16)); assignment.witness(witness_cols[chunk_amount], curr_row + 3) = b0p; assignment.witness(witness_cols[chunk_amount + 1], curr_row + 3) = b0pp; diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/signextend.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/signextend.hpp index 5e8d55a5c..1e66666dd 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/signextend.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/operations/signextend.hpp @@ -157,27 +157,23 @@ namespace nil { void generate_assignments(zkevm_table_type &zkevm_table, const zkevm_machine_interface &machine) override { using word_type = typename zkevm_stack::word_type; - using integral_type = nil::crypto3::multiprecision::big_uint<257>; word_type b = machine.stack_top(); word_type x = machine.stack_top(1); - int len = (integral_type(b) < 32) ? int(integral_type(b)) + 1 : 32; - integral_type sign = (integral_type(x) << (8*(32-len) + 1)) >> 256; - word_type result = word_type((((integral_type(1) << 8*(32-len)) - 1) << 8*len)*sign) + - word_type((integral_type(x) << (8*(32-len) + 1)) >> (8*(32-len) + 1)); - // +1 because integral type is 257 bits long - - unsigned int b0 = static_cast(integral_type(b) % 65536), - b0p = (integral_type(b) > 65535) ? 32 : b0; + int len = (b < 32) ? int(b) + 1 : 32; + word_type sign = (x << (8 * (32 - len))) >> 255; + word_type result = + (subtract_wrapping(word_type(1) << 8 * (32 - len), 1) << 8 * len) * sign + + ((x << (8 * (32 - len))) >> (8 * (32 - len))); + + unsigned int b0 = static_cast(b % 65536), b0p = (b > 65535) ? 32 : b0; int parity = b0p % 2, n = (b0p - parity) / 2; - unsigned int xn = static_cast((integral_type(x) << (16*(n > 15 ? 16 : 15 - n) + 1)) >> (16*15 + 1)), - // +1 because integral_type is 257 bits long - xpp = xn % 256, - xp = (xn - xpp) / 256, - sb = (parity == 0) ? xpp : xp, - sgn = (sb > 128), - saux = sb + 128 - sgn*256; + unsigned int xn = static_cast( + (x << (16 * (n > 15 ? 16 : 15 - n) + 1)) >> (16 * 15 + 1)), + // +1 because integral_type is 257 bits long + xpp = xn % 256, xp = (xn - xpp) / 256, sb = (parity == 0) ? xpp : xp, + sgn = (sb > 128), saux = sb + 128 - sgn * 256; const std::vector b_chunks = zkevm_word_to_field_element(b); const std::vector x_chunks = zkevm_word_to_field_element(x); diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/zkevm_machine_interface.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/zkevm_machine_interface.hpp index db034f77c..92bb2e81a 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/zkevm_machine_interface.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/zkevm_machine_interface.hpp @@ -26,8 +26,9 @@ #pragma once -#include #include +#include +#include "nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp" namespace nil { namespace blueprint { @@ -77,8 +78,7 @@ namespace nil { return stack.pop(); } - void run_opcode(){ - using integral_type = nil::crypto3::multiprecision::big_uint<257>; + void run_opcode() { switch(opcode) { case zkevm_opcode::PUSH0: stack.push(0); @@ -221,7 +221,10 @@ namespace nil { break; case zkevm_opcode::NOT:{ word_type a = stack_pop(); - word_type not_a = word_type(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF_big_uint257) - a; + word_type not_a = + word_type( + 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF_big_uint256) - + a; stack.push(not_a); pc++; gas -= 3; break; @@ -251,7 +254,10 @@ namespace nil { word_type a = stack_pop(); word_type b = stack_pop(); word_type N = stack_pop(); - stack.push(N? (a * b).base() % N.base() : 0u); + stack.push( + N ? word_type((nil::crypto3::multiprecision::big_uint<512>(a) * b) % + N) + : 0u); pc++; gas -= 8; break; } @@ -259,7 +265,10 @@ namespace nil { word_type a = stack_pop(); word_type b = stack_pop(); word_type N = stack_pop(); - stack.push(N? (a + b).base() % N.base() : 0u); + stack.push( + N ? word_type((nil::crypto3::multiprecision::big_uint<257>(a) + b) % + N) + : 0u); pc++; gas -= 8; break; } @@ -300,10 +309,13 @@ namespace nil { case zkevm_opcode::SIGNEXTEND:{ word_type b = stack_pop(); word_type x = stack_pop(); - int len = (integral_type(b) < 32) ? int(integral_type(b)) + 1 : 32; - integral_type sign = (integral_type(x) << (8*(32-len) + 1)) >> 256; - word_type result = word_type((((integral_type(1) << 8*(32-len)) - 1) << 8*len)*sign) + - word_type((integral_type(x) << (8*(32-len) + 1)) >> (8*(32-len) + 1)); + int len = (b < 32) ? int(b) + 1 : 32; + word_type sign = (x << (8 * (32 - len))) >> 255; + word_type result = + (subtract_wrapping(word_type(1) << 8 * (32 - len), 1) << 8 * len) * + sign + + (x << (8 * (32 - len))) >> + (8 * (32 - len)); stack.push(result); pc++; gas -= 5; break; @@ -311,26 +323,27 @@ namespace nil { case zkevm_opcode::BYTE:{ word_type i = stack_pop(); word_type x = stack_pop(); - int shift = (integral_type(i) < 32) ? int(integral_type(i)) : 32; - stack.push(word_type((integral_type(x) << ((8*shift) + 1)) >> (31*8 + 1))); + int shift = (i < 32) ? int(i) : 32; + stack.push((x << (8 * shift)) >> (31 * 8)); pc++; gas -= 3; break; } case zkevm_opcode::SHL:{ word_type a = stack_pop(); word_type input_b = stack_pop(); - int shift = (integral_type(input_b) < 256) ? int(integral_type(input_b)) : 256; - stack.push(word_type(integral_type(a) << shift)); + int shift = (input_b < 256) ? int(input_b) : 256; + stack.push(a << shift); pc++; gas -= 3; break; } case zkevm_opcode::SHR:{ word_type a = stack_pop(); word_type input_b = stack_pop(); - int shift = (integral_type(input_b) < 256) ? int(integral_type(input_b)) : 256; - integral_type r_integral = integral_type(a) << shift; - word_type b = word_type(integral_type(1) << shift); - stack.push(r_integral); + int shift = (input_b < 256) ? int(input_b) : 256; + word_type r = a << shift; + // TODO(ioxid): fix + // word_type b = word_type(1) << shift; + stack.push(r); pc++; gas -= 3; break; } @@ -338,11 +351,10 @@ namespace nil { word_type input_a = stack_pop(); word_type input_b = stack_pop(); word_type a = abs_word(input_a); - int shift = (integral_type(input_b) < 256) ? int(integral_type(input_b)) : 256; - integral_type r_integral = integral_type(a) << shift; - word_type result = is_negative(input_a) ? ( - (r_integral == 0)? word_type(zkevm_modulus-1) : negate_word(word_type(r_integral)) - ) : word_type(r_integral); + int shift = (input_b < 256) ? int(input_b) : 256; + word_type r = a << shift; + word_type result = + is_negative(input_a) ? ((r == 0) ? neg_one : negate_word(r)) : r; stack.push(result); pc++; gas -= 3; break; @@ -350,21 +362,21 @@ namespace nil { case zkevm_opcode::AND:{ word_type a = stack_pop(); word_type b = stack_pop(); - stack.push(a.base() & b.base()); + stack.push(a & b); pc++; gas -= 3; break; } case zkevm_opcode::OR:{ word_type a = stack_pop(); word_type b = stack_pop(); - stack.push(a.base() | b.base()); + stack.push(a | b); pc++; gas -= 3; break; } case zkevm_opcode::XOR:{ word_type a = stack_pop(); word_type b = stack_pop(); - stack.push(a.base() ^ b.base()); + stack.push(a ^ b); pc++; gas -= 3; break; } diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/zkevm_word.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/zkevm_word.hpp index bd8e5d809..d53315dc3 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm/zkevm_word.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm/zkevm_word.hpp @@ -35,23 +35,21 @@ namespace nil { namespace blueprint { - - constexpr inline auto zkevm_modulus = - 0x10000000000000000000000000000000000000000000000000000000000000000_big_uint257; - - using zkevm_word_type = nil::crypto3::multiprecision::auto_big_mod; - - using zkevm_word_integral_type = nil::crypto3::multiprecision::big_uint<257>; + using zkevm_word_type = nil::crypto3::multiprecision::big_uint<256>; + inline static constexpr zkevm_word_type neg_one = zkevm_word_type(1).negated_wrapping(); + inline static constexpr zkevm_word_type min_neg = zkevm_word_type(1) << 255; + inline static constexpr auto extended_zkevm_mod = + nil::crypto3::multiprecision::big_uint<512>(1) << 256; template - std::vector zkevm_word_to_field_element(const zkevm_word_type &word) { + std::vector zkevm_word_to_field_element( + const zkevm_word_type &word) { using value_type = typename BlueprintFieldType::value_type; std::vector chunks; constexpr const std::size_t chunk_size = 16; constexpr const std::size_t num_chunks = 256 / chunk_size; - using integral_type = nil::crypto3::multiprecision::big_uint<257>; - constexpr const integral_type mask = (integral_type(1) << chunk_size) - 1; - integral_type word_copy = integral_type(word); + constexpr const zkevm_word_type mask = (zkevm_word_type(1) << chunk_size) - 1; + zkevm_word_type word_copy = word; for (std::size_t i = 0; i < num_chunks; ++i) { chunks.push_back(word_copy & mask); word_copy >>= chunk_size; @@ -102,38 +100,31 @@ namespace nil { return result; } - template - typename BlueprintFieldType::value_type w_hi(const zkevm_word_type &val){ - using integral_type = nil::crypto3::multiprecision::big_uint<257>; - - integral_type mask = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000_big_uint257; - return (integral_type(val) & mask) >> 128; + template + typename BlueprintFieldType::value_type w_hi(const zkevm_word_type &val) { + static constexpr zkevm_word_type mask = + 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000_big_uint256; + return (val & mask) >> 128; } - template - typename BlueprintFieldType::value_type w_lo(const zkevm_word_type &val){ - using integral_type = nil::crypto3::multiprecision::big_uint<257>; - - integral_type mask = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF_big_uint257; - return integral_type(val) & mask; + template + typename BlueprintFieldType::value_type w_lo(const zkevm_word_type &val) { + static constexpr zkevm_word_type mask = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF_big_uint256; + return val & mask; } - std::array w_to_8(const zkevm_word_type &val){ - using integral_type = nil::crypto3::multiprecision::big_uint<257>; - + std::array w_to_8(const zkevm_word_type &val) { std::array result; - integral_type tmp(val); + zkevm_word_type tmp(val); for(std::size_t i = 0; i < 32; i++){ result[31-i] = std::uint8_t(tmp & 0xFF); tmp >>= 8; } return result; } - std::array w_to_16(const zkevm_word_type &val){ - using integral_type = nil::crypto3::multiprecision::big_uint<257>; - + std::array w_to_16(const zkevm_word_type &val) { std::array result; - integral_type tmp(val); + zkevm_word_type tmp(val); for(std::size_t i = 0; i < 16; i++){ result[15-i] = std::size_t(tmp & 0xFFFF); tmp >>= 16; } @@ -150,27 +141,17 @@ namespace nil { // Return a/b, a%b std::pair eth_div(const zkevm_word_type &a, const zkevm_word_type &b){ - using integral_type = nil::crypto3::multiprecision::big_uint<257>; - integral_type r_integral = b != 0u ? integral_type(a) / integral_type(b) : 0u; + zkevm_word_type r_integral = b != 0u ? a / b : 0u; zkevm_word_type r = r_integral; - zkevm_word_type q = b != 0u ? integral_type(a) % integral_type(b) : 0u; + zkevm_word_type q = b != 0u ? a % b : 0u; return {r, q}; } - bool is_negative(zkevm_word_type x){ - using integral_type = nil::crypto3::multiprecision::big_uint<257>; - return (integral_type(x) > zkevm_modulus/2 - 1); - } + bool is_negative(zkevm_word_type x) { return x.bit_test(255); } - zkevm_word_type negate_word(zkevm_word_type x){ - using integral_type = nil::crypto3::multiprecision::big_uint<257>; - return zkevm_word_type(zkevm_modulus - integral_type(x)); - } + zkevm_word_type negate_word(const zkevm_word_type &x) { return x.negated_wrapping(); } - zkevm_word_type abs_word(zkevm_word_type x){ - using integral_type = nil::crypto3::multiprecision::big_uint<257>; - return is_negative(x)? negate_word(x) : x; - } + zkevm_word_type abs_word(zkevm_word_type x) { return is_negative(x) ? negate_word(x) : x; } zkevm_word_type zkevm_keccak_hash(std::vector input){ nil::crypto3::hashes::keccak_1600<256>::digest_type d = nil::crypto3::hash>(input); @@ -181,20 +162,19 @@ namespace nil { } // Return a/b, a%b - std::pair eth_signed_div(const zkevm_word_type &a, const zkevm_word_type &b_input){ - using integral_type = nil::crypto3::multiprecision::big_uint<257>; - - zkevm_word_type b = (integral_type(a) == zkevm_modulus - 1) && (integral_type(b_input) == zkevm_modulus/2) ? 1 : b_input; + std::pair eth_signed_div(const zkevm_word_type &a, + const zkevm_word_type &b_input) { + zkevm_word_type b = (a == neg_one) && (b_input == min_neg) ? 1u : b_input; zkevm_word_type a_abs = abs_word(a), b_abs = abs_word(b); - integral_type r_integral = (b != 0u)? integral_type(a_abs) / integral_type(b_abs) : 0u; - zkevm_word_type r_abs = r_integral, - q_abs = b != 0u ? integral_type(a_abs) % integral_type(b_abs) : a_abs, - r = (is_negative(a) == is_negative(b)) ? r_abs : negate_word(r_abs), - q = is_negative(a)? negate_word(q_abs) : q_abs; + // TODO(ioxid): use divide_qr here + zkevm_word_type r_abs = b != 0u ? a_abs / b_abs : 0u; + zkevm_word_type q_abs = b != 0u ? a_abs % b_abs : a_abs, + r = (is_negative(a) == is_negative(b)) ? r_abs : negate_word(r_abs), + q = is_negative(a) ? negate_word(q_abs) : q_abs; - zkevm_word_type q_out = b != 0u ? q : 0; // according to EVM spec a % 0 = 0 + zkevm_word_type q_out = b != 0u ? q : 0u; // according to EVM spec a % 0 = 0 return {r, q_out}; } diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/input_generators/hardhat_input_generator.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/input_generators/hardhat_input_generator.hpp index 7e332082a..fd133fc2f 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/input_generators/hardhat_input_generator.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/input_generators/hardhat_input_generator.hpp @@ -74,8 +74,6 @@ namespace nil { memory_next = byte_vector_from_ptree(std::next(it)->second.get_child("memory")); storage_next = key_value_storage_from_ptree(it->second.get_child("storage")); } - using integral_type = nil::crypto3::multiprecision::big_uint<257>; - zkevm_state state; // TODO:optimize state.tx_hash = 0; // TODO: change it state.opcode = opcode_number_from_str(opcode); @@ -230,8 +228,8 @@ namespace nil { _rw_operations.push_back(stack_rw_operation(call_id, stack.size()-1, rw_counter++, false, stack[stack.size()-1])); _rw_operations.push_back(stack_rw_operation(call_id, stack.size()-2, rw_counter++, false, stack[stack.size()-2])); - std::size_t length = std::size_t(integral_type(stack[stack.size()-2])); - std::size_t offset = std::size_t(integral_type(stack[stack.size()-1])); + std::size_t length = std::size_t(stack[stack.size()-2]); + std::size_t offset = std::size_t(stack[stack.size()-1]); auto hash_value = stack_next[stack_next.size()-1]; std::cout << "\tAdd copy event for KECCAK256 length = " << length << std::endl; @@ -304,9 +302,9 @@ namespace nil { _rw_operations.push_back(stack_rw_operation(call_id, stack.size()-2, rw_counter++, false, stack[stack.size()-2])); _rw_operations.push_back(stack_rw_operation(call_id, stack.size()-3, rw_counter++, false, stack[stack.size()-3])); - std::size_t length = std::size_t(integral_type(stack[stack.size()-3])); - std::size_t src = std::size_t(integral_type(stack[stack.size()-2])); - std::size_t dest = std::size_t(integral_type(stack[stack.size()-1])); + std::size_t length = std::size_t(stack[stack.size()-3]); + std::size_t src = std::size_t(stack[stack.size()-2]); + std::size_t dest = std::size_t(stack[stack.size()-1]); // std::cout << "Length = " << length << std::endl; // std::cout << "Memory_size " << memory.size() << "=>" << memory_next.size() << std::endl; @@ -475,7 +473,7 @@ namespace nil { BOOST_ASSERT_MSG(addr < std::numeric_limits::max(), "Cannot process so large memory address"); // std::cout << "\t\t Address = 0x" << std::hex << addr << std::dec << " memory size " << memory.size() << std::endl; for( std::size_t i = 0; i < 32; i++){ - _rw_operations.push_back(memory_rw_operation(call_id, addr+i, rw_counter++, false, addr+i < memory.size() ? memory[std::size_t(integral_type(addr+i))]: 0)); + _rw_operations.push_back(memory_rw_operation(call_id, addr+i, rw_counter++, false, addr+i < memory.size() ? memory[std::size_t(addr+i)]: 0)); } _rw_operations.push_back(stack_rw_operation(call_id, stack_next.size()-1, rw_counter++, true, stack_next[stack_next.size()-1])); @@ -904,8 +902,8 @@ namespace nil { std::cout << "\tAdd copy event for RETURN" << std::endl; _rw_operations.push_back(stack_rw_operation(call_id, stack.size()-1, rw_counter++, false, stack[stack.size()-1])); _rw_operations.push_back(stack_rw_operation(call_id, stack.size()-2, rw_counter++, false, stack[stack.size()-2])); - std::size_t offset = std::size_t(integral_type(stack[stack.size()-1])); - std::size_t length = std::size_t(integral_type(stack[stack.size()-2])); + std::size_t offset = std::size_t(stack[stack.size()-1]); + std::size_t length = std::size_t(stack[stack.size()-2]); copy_event cpy; cpy.source_id = call_id; diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/input_generators/opcode_tester_input_generator.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/input_generators/opcode_tester_input_generator.hpp index 5d245d7f2..313099f43 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/input_generators/opcode_tester_input_generator.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/input_generators/opcode_tester_input_generator.hpp @@ -52,7 +52,6 @@ namespace nil { apply_tester(tester); } - using integral_type = nil::crypto3::multiprecision::big_uint<257>; using extended_integral_type = nil::crypto3::multiprecision::big_uint<512>; void apply_tester(const zkevm_opcode_tester &tester, std::size_t initial_gas = 30000000){ @@ -137,8 +136,7 @@ namespace nil { zkevm_word_type b = stack.back(); stack.pop_back(); _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, false, b)); - integral_type r_integral = b != 0u ? integral_type(a) / integral_type(b) : 0u; - zkevm_word_type result = r_integral; + zkevm_word_type result = b != 0u ? a / b : 0u; _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, true, result)); stack.push_back(result); pc++; @@ -151,21 +149,12 @@ namespace nil { zkevm_word_type b_input = stack.back(); stack.pop_back(); _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, false, b_input)); - auto is_negative = [](zkevm_word_type x) { - return (integral_type(x) > zkevm_modulus / 2 - 1); - }; - auto negate_word = [](zkevm_word_type x) { - return zkevm_word_type(zkevm_modulus - integral_type(x)); - }; - auto abs_word = [&is_negative, &negate_word](zkevm_word_type x) { - return is_negative(x) ? negate_word(x) : x; - }; - bool overflow = (integral_type(a) == zkevm_modulus - 1) && (integral_type(b_input) == zkevm_modulus / 2); + bool overflow = (a == neg_one) && (b_input == min_neg); zkevm_word_type b = overflow ? 1 : b_input; zkevm_word_type a_abs = abs_word(a), b_abs = abs_word(b); - integral_type r_integral =(b != 0u) ? integral_type(a_abs) / integral_type(b_abs) : 0u; - zkevm_word_type r_abs = r_integral, - result = (is_negative(a) == is_negative(b)) ? r_abs: negate_word(r_abs); + zkevm_word_type r_abs = b != 0u ? a_abs / b_abs : 0u; + zkevm_word_type result = + (is_negative(a) == is_negative(b)) ? r_abs : negate_word(r_abs); _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, true, result)); stack.push_back(result); pc++; @@ -178,10 +167,10 @@ namespace nil { zkevm_word_type b = stack.back(); stack.pop_back(); _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, false, b)); - integral_type r_integral = b != 0u ? integral_type(a) / integral_type(b) : 0u; - zkevm_word_type r = r_integral; - zkevm_word_type q = b != 0u ? integral_type(a) % integral_type(b) : a; - zkevm_word_type result = b != 0u ? q : 0; // according to EVM spec a % 0 = 0 + // word_type r = b != 0u ? a / b : 0u; + zkevm_word_type q = b != 0u ? a % b : a; + zkevm_word_type result = + b != 0u ? q : 0u; // according to EVM spec a % 0 = 0 _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, true, result)); stack.push_back(result); pc++; @@ -194,24 +183,17 @@ namespace nil { zkevm_word_type b_input = stack.back(); stack.pop_back(); _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, false, b_input)); - auto is_negative = [](zkevm_word_type x) { - return (integral_type(x) > zkevm_modulus / 2 - 1); - }; - auto negate_word = [](zkevm_word_type x) { - return zkevm_word_type(zkevm_modulus - integral_type(x)); - }; - auto abs_word = [&is_negative, &negate_word](zkevm_word_type x) { - return is_negative(x) ? negate_word(x) : x; - }; - bool overflow = (integral_type(a) == zkevm_modulus - 1) && (integral_type(b_input) == zkevm_modulus / 2); + bool overflow = (a == neg_one) && (b_input == min_neg); zkevm_word_type b = overflow ? 1 : b_input; zkevm_word_type a_abs = abs_word(a), b_abs = abs_word(b); - integral_type r_integral =(b != 0u) ? integral_type(a_abs) / integral_type(b_abs) : 0u; - zkevm_word_type r_abs = r_integral, - q_abs = b != 0u ? integral_type(a_abs) % integral_type(b_abs) : a_abs, - r = (is_negative(a) == is_negative(b)) ? r_abs: negate_word(r_abs), - q = is_negative(a) ? negate_word(q_abs) : q_abs; - zkevm_word_type result = b != 0u ? q : 0; // according to EVM spec a % 0 = 0 + zkevm_word_type r_abs = b != 0u ? a_abs / b_abs : 0u; + zkevm_word_type q_abs = b != 0u ? a_abs % b_abs : a_abs, + r = (is_negative(a) == is_negative(b)) + ? r_abs + : negate_word(r_abs), + q = is_negative(a) ? negate_word(q_abs) : q_abs; + zkevm_word_type result = + b != 0u ? q : 0u; // according to EVM spec a % 0 = 0 _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, true, result)); stack.push_back(result); pc++; @@ -229,10 +211,10 @@ namespace nil { _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, false, modulus)); // This is how the result is calculated inside the circuit // It is suppose to avoid overflow of the type zkevm_word_type - integral_type s_integral = integral_type(a) + integral_type(b); - integral_type r_integral = modulus != 0u ? s_integral / integral_type(modulus) : 0u; - zkevm_word_type q = zkevm_word_type(s_integral - r_integral * integral_type(modulus)); - zkevm_word_type result = modulus != 0u ? q : 0; + auto s_full = nil::crypto3::multiprecision::big_uint<257>(a) + b; + auto r_full = modulus != 0u ? s_full / modulus : 0u; + zkevm_word_type q = zkevm_word_type(s_full - r_full * modulus); + zkevm_word_type result = modulus != 0u ? q : 0u; _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, true, result)); stack.push_back(result); pc++; @@ -249,13 +231,18 @@ namespace nil { stack.pop_back(); _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, false, modulus)); a = modulus != 0u ? a : 0; - extended_integral_type s_integral = extended_integral_type(integral_type(a)) * extended_integral_type(integral_type(b)); - zkevm_word_type sp = zkevm_word_type(s_integral % extended_integral_type(zkevm_modulus)); - zkevm_word_type spp = zkevm_word_type(s_integral / extended_integral_type(zkevm_modulus)); - extended_integral_type r_integral = modulus != 0u ? s_integral / extended_integral_type(integral_type(modulus)): 0u; - zkevm_word_type rp = zkevm_word_type(r_integral % extended_integral_type(zkevm_modulus)); - zkevm_word_type rpp = zkevm_word_type(r_integral / extended_integral_type(zkevm_modulus)); - zkevm_word_type result = modulus != 0u ? zkevm_word_type(s_integral % extended_integral_type(integral_type(modulus))): 0u; + extended_integral_type s_integral = + extended_integral_type(a) * extended_integral_type(b); + zkevm_word_type sp = zkevm_word_type(s_integral % extended_zkevm_mod); + zkevm_word_type spp = zkevm_word_type(s_integral / extended_zkevm_mod); + extended_integral_type r_integral = + modulus != 0u ? s_integral / extended_integral_type(modulus) : 0u; + zkevm_word_type rp = zkevm_word_type(r_integral % extended_zkevm_mod); + zkevm_word_type rpp = zkevm_word_type(r_integral / extended_zkevm_mod); + zkevm_word_type result = + modulus != 0u + ? zkevm_word_type(s_integral % extended_integral_type(modulus)) + : 0u; _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, true, result)); stack.push_back(result); pc++; @@ -283,9 +270,14 @@ namespace nil { zkevm_word_type x = stack.back(); stack.pop_back(); _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, false, x)); - int len = (integral_type(b) < 32) ? int(integral_type(b)) + 1 : 32; - integral_type sign = (integral_type(x) << (8 * (32 - len) + 1)) >> 256; - zkevm_word_type result = zkevm_word_type((((integral_type(1) << 8 * (32 - len)) - 1) << 8 * len) * sign) + zkevm_word_type((integral_type(x) << (8 * (32 - len) + 1)) >>(8 * (32 - len) + 1)); + int len = (b < 32) ? int(b) + 1 : 32; + zkevm_word_type sign = (x << (8 * (32 - len))) >> 255; + zkevm_word_type result = + zkevm_word_type( + (subtract_wrapping(zkevm_word_type(1) << 8 * (32 - len), 1) + << 8 * len) * + sign) + + ((x << (8 * (32 - len))) >> (8 * (32 - len))); _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, true, result)); stack.push_back(result); pc++; @@ -387,7 +379,7 @@ namespace nil { zkevm_word_type b = stack.back(); stack.pop_back(); _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, false, b)); - zkevm_word_type result = a.base() & b.base(); + zkevm_word_type result = a & b; _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, true, result)); stack.push_back(result); pc++; @@ -400,7 +392,7 @@ namespace nil { zkevm_word_type b = stack.back(); stack.pop_back(); _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, false, b)); - zkevm_word_type result = a.base() & b.base(); + zkevm_word_type result = a | b; _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, true, result)); stack.push_back(result); pc++; @@ -413,7 +405,7 @@ namespace nil { zkevm_word_type b = stack.back(); stack.pop_back(); _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, false, b)); - zkevm_word_type result = a.base() & b.base(); + zkevm_word_type result = a ^ b; _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, true, result)); stack.push_back(result); pc++; @@ -423,7 +415,11 @@ namespace nil { zkevm_word_type a = stack.back(); stack.pop_back(); _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, false, a)); - zkevm_word_type result = zkevm_word_type(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF_big_uint257) - a;; + zkevm_word_type result = + zkevm_word_type( + 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF_big_uint256) - + a; + ; _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, true, result)); stack.push_back(result); pc++; @@ -450,8 +446,8 @@ namespace nil { zkevm_word_type a = stack.back(); stack.pop_back(); _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, false, a)); - int shift = (integral_type(b) < 256) ? int(integral_type(b)) : 256; - zkevm_word_type result = zkevm_word_type(integral_type(a) << shift); + int shift = (b < 256) ? int(b) : 256; + zkevm_word_type result = a << shift; _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, true, result)); stack.push_back(result); pc++; @@ -464,9 +460,8 @@ namespace nil { zkevm_word_type a = stack.back(); stack.pop_back(); _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, false, a)); - int shift = (integral_type(b) < 256) ? int(integral_type(b)) : 256; - integral_type r_integral = integral_type(a) >> shift; - zkevm_word_type result = r_integral; + int shift = (b < 256) ? int(b) : 256; + zkevm_word_type result = a >> shift; _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, true, result)); stack.push_back(result); pc++; @@ -478,17 +473,13 @@ namespace nil { _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, false, b)); zkevm_word_type input_a = stack.back(); stack.pop_back(); - _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, false, input_a)); - auto is_negative = [](zkevm_word_type x) { - return (integral_type(x) > zkevm_modulus / 2 - 1);}; - auto negate_word = [](zkevm_word_type x) { - return zkevm_word_type(zkevm_modulus - integral_type(x));}; - auto abs_word = [&is_negative, &negate_word](zkevm_word_type x) { - return is_negative(x) ? negate_word(x) : x;}; + _rw_operations.push_back(stack_rw_operation( + call_id, stack.size(), rw_counter++, false, input_a)); zkevm_word_type a = abs_word(input_a); - int shift = (integral_type(b) < 256) ? int(integral_type(b)) : 256; - integral_type r_integral = integral_type(a) >> shift; - zkevm_word_type result = is_negative(a) ? ((r_integral == 0)? zkevm_word_type(zkevm_modulus-1) : negate_word(zkevm_word_type(r_integral))) : zkevm_word_type(r_integral); + int shift = (b < 256) ? int(b) : 256; + zkevm_word_type r = a >> shift; + zkevm_word_type result = + is_negative(a) ? ((r == 0) ? neg_one : negate_word(r)) : r; _rw_operations.push_back(stack_rw_operation(call_id, stack.size(), rw_counter++, true, result)); stack.push_back(result); pc++; diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/add_sub.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/add_sub.hpp index 543fbd376..1857cd19e 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/add_sub.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/add_sub.hpp @@ -47,12 +47,11 @@ namespace nil { using generic_component::lookup_table; public: using typename generic_component::TYPE; - using integral_type = zkevm_word_integral_type; zkevm_add_sub_bbf(context_type &context_object, const opcode_input_type ¤t_state, bool is_add): generic_component(context_object, false) { - integral_type two_128 = integral_type(1) << 128; + zkevm_word_type two_128 = zkevm_word_type(1) << 128; std::vector A(16); std::vector B(16); diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/addmod.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/addmod.hpp index d232818f3..d6d10e1e9 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/addmod.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/addmod.hpp @@ -130,8 +130,6 @@ namespace nil { const opcode_input_type ¤t_state, bool make_links = true) : generic_component(context_object), res(chunk_amount) { - using integral_type = zkevm_word_integral_type; - std::vector c_1_chunks(4); TYPE c_2; TYPE c_3; @@ -167,20 +165,17 @@ namespace nil { zkevm_word_type b = current_state.stack_top(1); zkevm_word_type N = current_state.stack_top(2); - integral_type s_integral = integral_type(a) + integral_type(b); - zkevm_word_type s = zkevm_word_type(s_integral); - s_overflow = (s_integral >= zkevm_modulus); - integral_type r_integral = N != 0u ? s_integral / integral_type(N) : 0u; - r_overflow = (r_integral >= zkevm_modulus); - zkevm_word_type r = r_integral; + auto s_full = nil::crypto3::multiprecision::big_uint<257>(a) + b; + zkevm_word_type s = s_full.truncate<256>(); + s_overflow = s_full.bit_test(256); + auto r_full = N != 0u ? s_full / N : 0u; + r_overflow = r_full.bit_test(256); + zkevm_word_type r = r_full.truncate<256>(); // word_type q = N != 0u ? s % N : s; - zkevm_word_type q = - zkevm_word_type(s_integral - r_integral * integral_type(N)); - zkevm_word_type q_out = N != 0u ? q : 0; // according to EVM spec s % 0 = 0 - bool t_last = integral_type(q) < integral_type(N); - zkevm_word_type v = zkevm_word_type(integral_type(q) + - integral_type(t_last) * zkevm_modulus - - integral_type(N)); + zkevm_word_type q = zkevm_word_type(s_full - r_full * N); + zkevm_word_type q_out = + N != 0u ? q : 0u; // according to EVM spec s % 0 = 0 + zkevm_word_type v = subtract_wrapping(q, N); a_chunks = zkevm_word_to_field_element(a); b_chunks = zkevm_word_to_field_element(b); diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/bitwise.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/bitwise.hpp index 4e42ecf75..07c6acf1f 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/bitwise.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/bitwise.hpp @@ -48,7 +48,6 @@ namespace nil { using generic_component::lookup_table; public: using typename generic_component::TYPE; - using integral_type = zkevm_word_integral_type; zkevm_bitwise_bbf(context_type &context_object, const opcode_input_type ¤t_state, bitwise_type bitwise_operation): generic_component(context_object, false) @@ -64,8 +63,8 @@ namespace nil { zkevm_word_type b_word = current_state.stack_top(1); auto a = w_to_8(a_word); auto b = w_to_8(b_word); - auto and_chunks = w_to_8(a_word.base() & b_word.base()); - auto xor_chunks = w_to_8(a_word.base() ^ b_word.base()); + auto and_chunks = w_to_8(a_word & b_word); + auto xor_chunks = w_to_8(a_word ^ b_word); for(std::size_t i = 0; i <32; i++){ A[i] = a[i]; diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/byte.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/byte.hpp index 48c758586..682f3d398 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/byte.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/byte.hpp @@ -46,7 +46,6 @@ namespace nil { using generic_component::lookup_table; public: using typename generic_component::TYPE; - using integral_type = zkevm_word_integral_type; zkevm_byte_bbf(context_type &context_object, const opcode_input_type ¤t_state): generic_component(context_object, false) diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/div_mod.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/div_mod.hpp index f83e172e1..eb461275e 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/div_mod.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/div_mod.hpp @@ -130,8 +130,6 @@ namespace nil { const opcode_input_type ¤t_state, bool is_div) : generic_component(context_object, false),res(chunk_amount) { - using integral_type = zkevm_word_integral_type; - std::vector c_1_chunks(4); TYPE c_2; TYPE carry[carry_amount + 1]; @@ -160,17 +158,12 @@ namespace nil { zkevm_word_type a = current_state.stack_top(); zkevm_word_type b = current_state.stack_top(1); + zkevm_word_type r = b != 0u ? a / b : 0u; + zkevm_word_type q = b != 0u ? a % b : a; + zkevm_word_type q_out = + b != 0u ? q : 0u; // according to EVM spec a % 0 = 0 - integral_type r_integral = - b != 0u ? integral_type(a) / integral_type(b) : 0u; - zkevm_word_type r = r_integral; - zkevm_word_type q = b != 0u ? integral_type(a) % integral_type(b) : a; - zkevm_word_type q_out = b != 0u ? q : 0; // according to EVM spec a % 0 = 0 - - bool t_last = integral_type(q) < integral_type(b); - zkevm_word_type v = zkevm_word_type(integral_type(q) + - integral_type(t_last) * zkevm_modulus - - integral_type(b)); + zkevm_word_type v = subtract_wrapping(q, b); zkevm_word_type result = is_div ? r : q_out; diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/exp.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/exp.hpp index 0f5880f48..ebec8e2db 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/exp.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/exp.hpp @@ -46,7 +46,6 @@ namespace nil { using generic_component::lookup_table; public: using typename generic_component::TYPE; - using integral_type = zkevm_word_integral_type; zkevm_exp_bbf(context_type &context_object, const opcode_input_type ¤t_state): generic_component(context_object, false) @@ -66,8 +65,8 @@ namespace nil { auto d = w_to_16(current_state.stack_top(1)); auto r = w_to_16(exp_by_squaring(current_state.stack_top(), current_state.stack_top(1))); s = 1; - if( integral_type(current_state.stack_top(1)) == 0 ) s = 0; - if( integral_type(current_state.stack_top(1)) == 1 ) s = 0; + if( current_state.stack_top(1) == 0 ) s = 0; + if( current_state.stack_top(1) == 1 ) s = 0; std::cout << "\t" << current_state.stack_top() << " ^ " diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/keccak.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/keccak.hpp index 90dee4154..b00e22790 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/keccak.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/keccak.hpp @@ -45,7 +45,6 @@ namespace nil { using generic_component::lookup_table; public: using typename generic_component::TYPE; - using integral_type = zkevm_word_integral_type; zkevm_keccak_bbf(context_type &context_object, const opcode_input_type ¤t_state): generic_component(context_object, false) @@ -57,11 +56,11 @@ namespace nil { if constexpr( stage == GenerationStage::ASSIGNMENT ){ offset = w_lo(current_state.stack_top()); length = w_lo(current_state.stack_top(1)); - std::size_t start_offset = std::size_t(integral_type(current_state.stack_top())); - std::size_t l = std::size_t(integral_type(current_state.stack_top(1))); + std::size_t start_offset = std::size_t(current_state.stack_top()); + std::size_t l = std::size_t(current_state.stack_top(1)); std::vector buffer; for( std::size_t i = 0; i < l; i++ ){ - buffer.push_back(std::uint8_t(integral_type(current_state.memory(start_offset + i)))); + buffer.push_back(std::uint8_t(current_state.memory(start_offset + i))); } auto hash_value = zkevm_keccak_hash(buffer); hash_hi = w_hi(hash_value); diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/mul.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/mul.hpp index 3bce9bfc6..f4a89dfa7 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/mul.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/mul.hpp @@ -47,9 +47,9 @@ namespace nil { using generic_component::lookup_table; public: using typename generic_component::TYPE; - using integral_type = zkevm_word_integral_type; - constexpr static const typename FieldType::value_type two_64 = 0x10000000000000000_big_uint257; + constexpr static const typename FieldType::value_type two_64 = + 0x10000000000000000_big_uint256; constexpr static const typename FieldType::value_type two_128 = 0x100000000000000000000000000000000_big_uint254; constexpr static const typename FieldType::value_type two_192 = 0x1000000000000000000000000000000000000000000000000_big_uint254; @@ -139,9 +139,9 @@ namespace nil { TYPE lo_carries = lo_carryless_construct(A_64, B_64, R_64); TYPE hi_carries = hi_carryless_construct(A_64, B_64, R_64); - integral_type c_first_i = typename FieldType::integral_type(lo_carries.data) >> 128; + zkevm_word_type c_first_i = typename FieldType::integral_type(lo_carries.data) >> 128; auto c_first = w_to_16(c_first_i); - integral_type c_second_i = (typename FieldType::integral_type(hi_carries.data) + c_first_i) >> 128; + zkevm_word_type c_second_i = (typename FieldType::integral_type(hi_carries.data) + c_first_i) >> 128; auto c_second = w_to_16(c_second_i); C3[3] = c_first[15]; C3[2] = c_first[14]; C3[1] = c_first[13]; C3[0] = c_first[12]; C2 = c_first[11]; diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/mulmod.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/mulmod.hpp index 5b2268d46..700137cc6 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/mulmod.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/mulmod.hpp @@ -141,7 +141,6 @@ namespace nil { const opcode_input_type ¤t_state, bool make_links = true) : generic_component(context_object), res(chunk_amount) { - using integral_type = zkevm_word_integral_type; using extended_integral_type = nil::crypto3::multiprecision::big_uint<512>; // The central relation is a * b = s = Nr + q, q < N. @@ -211,36 +210,23 @@ namespace nil { zkevm_word_type N = current_state.stack_top(2); zkevm_word_type a = N != 0u ? input_a : 0; extended_integral_type s_integral = - extended_integral_type(integral_type(a)) * - extended_integral_type(integral_type(b)); + extended_integral_type(a) * extended_integral_type(b); - zkevm_word_type sp = - zkevm_word_type(s_integral % extended_integral_type(zkevm_modulus)); - zkevm_word_type spp = - zkevm_word_type(s_integral / extended_integral_type(zkevm_modulus)); + zkevm_word_type sp = zkevm_word_type(s_integral % extended_zkevm_mod); + zkevm_word_type spp = zkevm_word_type(s_integral / extended_zkevm_mod); extended_integral_type r_integral = - N != 0u ? s_integral / extended_integral_type(integral_type(N)) : 0u; - zkevm_word_type rp = - zkevm_word_type(r_integral % extended_integral_type(zkevm_modulus)); - zkevm_word_type rpp = - zkevm_word_type(r_integral / extended_integral_type(zkevm_modulus)); + N != 0u ? s_integral / extended_integral_type(N) : 0u; + zkevm_word_type rp = zkevm_word_type(r_integral % extended_zkevm_mod); + zkevm_word_type rpp = zkevm_word_type(r_integral / extended_zkevm_mod); zkevm_word_type q = - N != 0u ? zkevm_word_type(s_integral % - extended_integral_type(integral_type(N))) - : 0u; - extended_integral_type Nr_integral = - s_integral - extended_integral_type(integral_type(q)); - zkevm_word_type Nr_p = - zkevm_word_type(Nr_integral % extended_integral_type(zkevm_modulus)); - zkevm_word_type Nr_pp = - zkevm_word_type(Nr_integral / extended_integral_type(zkevm_modulus)); - - bool t_last = integral_type(q) < integral_type(N); - zkevm_word_type v = zkevm_word_type(integral_type(q) + - integral_type(t_last) * zkevm_modulus - - integral_type(N)); + N != 0u ? zkevm_word_type(s_integral % extended_integral_type(N)) : 0u; + extended_integral_type Nr_integral = s_integral - extended_integral_type(q); + zkevm_word_type Nr_p = zkevm_word_type(Nr_integral % extended_zkevm_mod); + zkevm_word_type Nr_pp = zkevm_word_type(Nr_integral / extended_zkevm_mod); + + zkevm_word_type v = subtract_wrapping(q, N); zkevm_word_type result = q; diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/sar.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/sar.hpp index 6ac204298..bf77854c1 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/sar.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/sar.hpp @@ -131,8 +131,6 @@ namespace nil { const opcode_input_type ¤t_state) : generic_component(context_object, false), res(chunk_amount) { - using integral_type = zkevm_word_integral_type; - TYPE first_carryless; TYPE second_carryless; TYPE third_carryless; @@ -191,37 +189,19 @@ namespace nil { zkevm_word_type input_b = current_state.stack_top(); zkevm_word_type input_a = current_state.stack_top(1); - auto is_negative = [](zkevm_word_type x) { - return (integral_type(x) > zkevm_modulus / 2 - 1); - }; - auto negate_word = [](zkevm_word_type x) { - return zkevm_word_type(zkevm_modulus - integral_type(x)); - }; - auto abs_word = [&is_negative, &negate_word](zkevm_word_type x) { - return is_negative(x) ? negate_word(x) : x; - }; - zkevm_word_type a = abs_word(input_a); - int shift = - (integral_type(input_b) < 256) ? int(integral_type(input_b)) : 256; - integral_type r_integral = integral_type(a) >> shift; + int shift = (input_b < 256) ? int(input_b) : 256; + zkevm_word_type r = a >> shift; zkevm_word_type result = - is_negative(input_a) - ? ((r_integral == 0) ? zkevm_word_type(zkevm_modulus - 1) - : negate_word(zkevm_word_type(r_integral))) - : zkevm_word_type(r_integral); + is_negative(input_a) ? (r.is_zero() ? neg_one : negate_word(r)) : r; - zkevm_word_type b = zkevm_word_type(integral_type(1) << shift); + zkevm_word_type b = zkevm_word_type(1) << shift; - zkevm_word_type r = r_integral; - zkevm_word_type q = b != 0u ? integral_type(a) % integral_type(b) : a; + zkevm_word_type q = b != 0u ? a % b : a; - bool t_last = integral_type(q) < integral_type(b); - zkevm_word_type v = zkevm_word_type(integral_type(q) + - integral_type(t_last) * zkevm_modulus - - integral_type(b)); + zkevm_word_type v = subtract_wrapping(q, b); a_neg = is_negative(input_a); input_a_chunks = zkevm_word_to_field_element(input_a); @@ -233,12 +213,12 @@ namespace nil { q_chunks = zkevm_word_to_field_element(q); v_chunks = zkevm_word_to_field_element(v); - integral_type two_15 = 32768; - integral_type biggest_input_a_chunk = integral_type(input_a) >> (256 - 16); + zkevm_word_type two_15 = 32768; + auto biggest_input_a_chunk = zkevm_word_type(input_a) >> (256 - 16); - b0p = integral_type(input_b) % 16; - b0pp = (integral_type(input_b) / 16) % 16; - b0ppp = (integral_type(input_b) % 65536) / 256; + b0p = input_b % 16; + b0pp = (input_b / 16) % 16; + b0ppp = (input_b % 65536) / 256; I1 = b0ppp.is_zero() ? 0 : b0ppp.inversed(); sum_part_b = 0; @@ -250,7 +230,7 @@ namespace nil { z = (1 - b0ppp * I1) * (1 - sum_part_b * I2); // z is zero if input_b >= 256, otherwise it is 1 - tp = z * (static_cast(1) << int(integral_type(input_b) % 16)); + tp = z * (static_cast(1) << int(input_b % 16)); b_sum_inverse = b_sum.is_zero() ? 0 : b_sum.inversed(); b_zero = 1 - b_sum_inverse * b_sum; diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/sdiv_smod.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/sdiv_smod.hpp index 94bbaddf6..d21e889bc 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/sdiv_smod.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/sdiv_smod.hpp @@ -136,8 +136,6 @@ namespace nil { bool is_div) : generic_component(context_object, false), res(chunk_amount) { - using integral_type = nil::crypto3::multiprecision::big_uint<257>; - std::vector c_1_chunks(4); TYPE c_2; TYPE carry[3][carry_amount + 1]; @@ -197,36 +195,21 @@ namespace nil { zkevm_word_type a = current_state.stack_top(); zkevm_word_type b_input = current_state.stack_top(1); - bool overflow = (integral_type(a) == zkevm_modulus - 1) && - (integral_type(b_input) == zkevm_modulus / 2); + bool overflow = (a == neg_one) && (b_input == min_neg); zkevm_word_type b = overflow ? 1 : b_input; is_overflow = overflow; - auto is_negative = [](zkevm_word_type x) { - return (integral_type(x) > zkevm_modulus / 2 - 1); - }; - auto negate_word = [](zkevm_word_type x) { - return zkevm_word_type(zkevm_modulus - integral_type(x)); - }; - auto abs_word = [&is_negative, &negate_word](zkevm_word_type x) { - return is_negative(x) ? negate_word(x) : x; - }; - zkevm_word_type a_abs = abs_word(a), b_abs = abs_word(b); - integral_type r_integral = - (b != 0u) ? integral_type(a_abs) / integral_type(b_abs) : 0u; - zkevm_word_type r_abs = r_integral, - q_abs = b != 0u ? integral_type(a_abs) % integral_type(b_abs) : a_abs, + zkevm_word_type r_abs = b != 0u ? a_abs / b_abs : 0u; + zkevm_word_type q_abs = b != 0u ? a_abs % b_abs : a_abs, r = (is_negative(a) == is_negative(b)) ? r_abs : negate_word(r_abs), q = is_negative(a) ? negate_word(q_abs) : q_abs; - zkevm_word_type q_out = b != 0u ? q : 0; // according to EVM spec a % 0 = 0 - bool t_last = integral_type(q_abs) < integral_type(b_abs); - zkevm_word_type v = zkevm_word_type(integral_type(q_abs) + - integral_type(t_last) * zkevm_modulus - - integral_type(b_abs)); + zkevm_word_type q_out = + b != 0u ? q : 0u; // according to EVM spec a % 0 = 0 + zkevm_word_type v = subtract_wrapping(q, b); zkevm_word_type result = is_div ? r : q_out; a_chunks = zkevm_word_to_field_element(a); @@ -298,9 +281,9 @@ namespace nil { // compute signs of a,b and q // x + 2^15 = x_aux + 2^16*x_neg - biggest_a_chunk = integral_type(a) >> (256 - 16); - biggest_b_chunk = integral_type(b) >> (256 - 16); - biggest_q_chunk = integral_type(q) >> (256 - 16); + biggest_a_chunk = a >> (256 - 16); + biggest_b_chunk = b >> (256 - 16); + biggest_q_chunk = q >> (256 - 16); a_aux = (biggest_a_chunk > two_15 - 1) ? (biggest_a_chunk - two_15) : biggest_a_chunk + two_15; diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/shl.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/shl.hpp index f8692c609..6dedf89ac 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/shl.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/shl.hpp @@ -97,8 +97,6 @@ namespace nil { const opcode_input_type ¤t_state) : generic_component(context_object, false), res(chunk_amount) { - using integral_type = zkevm_word_integral_type; - TYPE first_carryless; TYPE second_carryless; @@ -141,21 +139,20 @@ namespace nil { zkevm_word_type input_b = current_state.stack_top(); zkevm_word_type a = current_state.stack_top(1); - int shift = - (integral_type(input_b) < 256) ? int(integral_type(input_b)) : 256; + int shift = (input_b < 256) ? int(input_b) : 256; - zkevm_word_type result = zkevm_word_type(integral_type(a) << shift); + zkevm_word_type result = a << shift; - zkevm_word_type b = zkevm_word_type(integral_type(1) << shift); + zkevm_word_type b = zkevm_word_type(1) << shift; input_b_chunks = zkevm_word_to_field_element(input_b); a_chunks = zkevm_word_to_field_element(a); b_chunks = zkevm_word_to_field_element(b); r_chunks = zkevm_word_to_field_element(result); - b0p = integral_type(input_b) % 16; - b0pp = (integral_type(input_b) / 16) % 16; - b0ppp = (integral_type(input_b) % 65536) / 256; + b0p = input_b % 16; + b0pp = (input_b / 16) % 16; + b0ppp = (input_b % 65536) / 256; I1 = b0ppp.is_zero() ? 0 : b0ppp.inversed(); sum_b = 0; @@ -165,7 +162,7 @@ namespace nil { I2 = sum_b.is_zero() ? 0 : sum_b.inversed(); z = (1 - b0ppp * I1) * (1 - sum_b * I2); // z is zero if input_b >= 256, otherwise it is 1 - tp = z * (static_cast(1) << int(integral_type(input_b) % 16)); + tp = z * (static_cast(1) << int(input_b % 16)); // note that we don't assign 64-chunks for a/b, as we can build them from // 16-chunks with constraints under the same logic we only assign the 16 - diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/shr.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/shr.hpp index dd9378ba0..c627567b1 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/shr.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/shr.hpp @@ -131,8 +131,6 @@ namespace nil { const opcode_input_type ¤t_state) : generic_component(context_object, false), res(chunk_amount) { - using integral_type = zkevm_word_integral_type; - TYPE first_carryless; TYPE second_carryless; TYPE third_carryless; @@ -184,20 +182,14 @@ namespace nil { zkevm_word_type input_b = current_state.stack_top(); zkevm_word_type a = current_state.stack_top(1); - int shift = - (integral_type(input_b) < 256) ? int(integral_type(input_b)) : 256; - integral_type r_integral = integral_type(a) >> shift; + int shift = (input_b < 256) ? int(input_b) : 256; + zkevm_word_type result = a >> shift; - zkevm_word_type b = zkevm_word_type(integral_type(1) << shift); + zkevm_word_type b = zkevm_word_type(1) << shift; - zkevm_word_type result = - r_integral; - zkevm_word_type q = b != 0u ? integral_type(a) % integral_type(b) : a; + zkevm_word_type q = b != 0u ? a % b : a; - bool t_last = integral_type(q) < integral_type(b); - zkevm_word_type v = zkevm_word_type(integral_type(q) + - integral_type(t_last) * zkevm_modulus - - integral_type(b)); + zkevm_word_type v = subtract_wrapping(q, b); input_b_chunks = zkevm_word_to_field_element(input_b); a_chunks = zkevm_word_to_field_element(a); @@ -206,9 +198,9 @@ namespace nil { q_chunks = zkevm_word_to_field_element(q); v_chunks = zkevm_word_to_field_element(v); - b0p = integral_type(input_b) % 16; - b0pp = (integral_type(input_b) / 16) % 16; - b0ppp = (integral_type(input_b) % 65536) / 256; + b0p = input_b % 16; + b0pp = (input_b / 16) % 16; + b0ppp = (input_b % 65536) / 256; I1 = b0ppp.is_zero() ? 0 : b0ppp.inversed(); sum_part_b = 0; @@ -220,7 +212,7 @@ namespace nil { z = (1 - b0ppp * I1) * (1 - sum_part_b * I2); // z is zero if input_b >= 256, otherwise it is 1 - tp = z * (static_cast(1) << int(integral_type(input_b) % 16)); + tp = z * (static_cast(1) << int(input_b % 16)); b_sum_inverse = b_sum.is_zero() ? 0 : b_sum.inversed(); b_zero = 1 - b_sum_inverse * b_sum; diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/signextend.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/signextend.hpp index 061cfe867..56ace3b25 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/signextend.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/opcodes/signextend.hpp @@ -68,8 +68,6 @@ namespace nil { const opcode_input_type ¤t_state) : generic_component(context_object, false), res(chunk_amount) { - using integral_type = zkevm_word_integral_type; - std::vector b_chunks(chunk_amount); std::vector x_chunks(chunk_amount); std::vector r_chunks(chunk_amount); @@ -98,27 +96,26 @@ namespace nil { zkevm_word_type b = current_state.stack_top(); zkevm_word_type x = current_state.stack_top(1); - int len = (integral_type(b) < 32) ? int(integral_type(b)) + 1 : 32; - integral_type sign = (integral_type(x) << (8 * (32 - len) + 1)) >> 256; + int len = (b < 32) ? int(b) + 1 : 32; + zkevm_word_type sign = (x << (8 * (32 - len))) >> 255; zkevm_word_type result = - zkevm_word_type( - (((integral_type(1) << 8 * (32 - len)) - 1) << 8 * len) * sign) + - zkevm_word_type((integral_type(x) << (8 * (32 - len) + 1)) >> - (8 * (32 - len) + 1)); - // +1 because integral type is 257 bits long - unsigned int b0 = static_cast(integral_type(b) % 65536); - unsigned int b0p_ui = (integral_type(b) > 65535) ? 32 : b0; + (subtract_wrapping(zkevm_word_type(1) << 8 * (32 - len), 1) + << 8 * len) * + sign + + (x << (8 * (32 - len))) >> + (8 * (32 - len)); + + unsigned int b0 = static_cast(b % 65536); + unsigned int b0p_ui = (b > 65535) ? 32 : b0; b0p = b0p_ui; unsigned int parity_ui = b0p_ui%2; parity = parity_ui; unsigned int n_ui = (b0p_ui-parity_ui)/2; n = n_ui; unsigned int xn_ui = static_cast( - (integral_type(x) << (16 * (n_ui > 15 ? 16 : 15 - n_ui) + 1)) >> - (16 * 15 + 1)); + (x << (16 * (n_ui > 15 ? 16 : 15 - n_ui))) >> (16 * 15)); xn = xn_ui; - // +1 because integral_type is 257 bits long unsigned int xpp_ui = xn_ui % 256; xpp = xpp_ui; xp = (xn - xpp) / 256; diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/types/rw_operation.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/types/rw_operation.hpp index c049c720b..e3687f442 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/types/rw_operation.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/types/rw_operation.hpp @@ -79,9 +79,9 @@ namespace nil { bool operator< (const rw_operation &other) const { if( op != other.op ) return op < other.op; if( call_id != other.call_id ) return call_id < other.call_id; - if( address != other.address ) return address.base() < other.address.base(); + if( address != other.address ) return address < other.address; if( field != other.field ) return field < other.field; - if( storage_key != other.storage_key ) return storage_key.base() < other.storage_key.base(); + if( storage_key != other.storage_key ) return storage_key < other.storage_key; if( rw_counter != other.rw_counter) return rw_counter < other.rw_counter; return false; } diff --git a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/util.hpp b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/util.hpp index 19950f42a..40137359e 100644 --- a/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/util.hpp +++ b/crypto3/libs/blueprint/include/nil/blueprint/zkevm_bbf/util.hpp @@ -73,25 +73,21 @@ namespace nil { } zkevm_word_type exp_by_squaring(zkevm_word_type a, zkevm_word_type n) { - using integral_type = nil::crypto3::multiprecision::big_uint<257>; + if (n == 0x00_big_uint256) return 1; + if (n == 0x01_big_uint256) return a; - if (n == 0x00_big_uint257) return 1; - if (n == 0x01_big_uint257) return a; - - zkevm_word_type exp = exp_by_squaring(a, zkevm_word_type(integral_type(n) >> 1)); + zkevm_word_type exp = exp_by_squaring(a, n >> 1); zkevm_word_type exp2 = exp * exp; - if ((integral_type(n) & 1) == 1) { + if (n & 1) { return exp2 * a; } return exp2; } - std::size_t log256(zkevm_word_type d){ - using integral_type = nil::crypto3::multiprecision::big_uint<257>; - + std::size_t log256(zkevm_word_type d) { std::size_t result = 0; while(d > 0){ - d = zkevm_word_type(integral_type(d) / integral_type(256u)); + d /= 256u; result++; } return result; diff --git a/crypto3/libs/blueprint/test/bbf/exp_wrapper.cpp b/crypto3/libs/blueprint/test/bbf/exp_wrapper.cpp index ff26021ab..df77c22d7 100644 --- a/crypto3/libs/blueprint/test/bbf/exp_wrapper.cpp +++ b/crypto3/libs/blueprint/test/bbf/exp_wrapper.cpp @@ -109,8 +109,8 @@ word_type random_word_type(nil::crypto3::random::algebraic_engine &g) } word_type exp_by_squaring(word_type a, word_type n) { - if (n == 0x00_big_uint257) return 1; - if (n == 0x01_big_uint257) return a; + if (n == 0x00_big_uint256) return 1; + if (n == 0x01_big_uint256) return a; word_type exp = exp_by_squaring(a, n >> 1); word_type exp2 = exp * exp; @@ -128,15 +128,12 @@ BOOST_AUTO_TEST_CASE(blueprint_plonk_exp_wrapper_test) { std::size_t max_exps = 2; std::vector> inputs; - word_type a1 = - 0xa00e9bd49962d7b217963a3daed6f4591c2bdbd41562d5f1446dc932ac9e1975_big_uint257; - word_type d1 = - 0xacab9c07aa7d08b7652965f01307cf5a3ed09cbf08325c10af9d2029e918ac7d_big_uint257; - word_type A1 = - 0x22fcc8f007a53fb4d231a691075afd85980214380e16a5994ff90de783c28b85_big_uint257; - word_type a2 = 0x2_big_uint257; - word_type d2 = 0x100_big_uint257; - word_type A2 = 0x0_big_uint257; + word_type a1 = 0xa00e9bd49962d7b217963a3daed6f4591c2bdbd41562d5f1446dc932ac9e1975_big_uint256; + word_type d1 = 0xacab9c07aa7d08b7652965f01307cf5a3ed09cbf08325c10af9d2029e918ac7d_big_uint256; + word_type A1 = 0x22fcc8f007a53fb4d231a691075afd85980214380e16a5994ff90de783c28b85_big_uint256; + word_type a2 = 0x2_big_uint256; + word_type d2 = 0x100_big_uint256; + word_type A2 = 0x0_big_uint256; inputs.push_back({a1, d1, A1}); inputs.push_back({a2, d2, A2}); diff --git a/crypto3/libs/blueprint/test/zkevm/bytecode.cpp b/crypto3/libs/blueprint/test/zkevm/bytecode.cpp index f2add076e..0b422478d 100644 --- a/crypto3/libs/blueprint/test/zkevm/bytecode.cpp +++ b/crypto3/libs/blueprint/test/zkevm/bytecode.cpp @@ -130,7 +130,8 @@ BOOST_AUTO_TEST_SUITE(blueprint_bytecode_input_test_suite) BOOST_AUTO_TEST_CASE(input_test){ nil::blueprint::components::bytecode_input_type input; input.new_bytecode(hex_string_to_bytes(bytecode_for)); - input.new_bytecode({hex_string_to_bytes(bytecode_addition), zkevm_word_type(0x1234ab000_big_uint257)}); + input.new_bytecode( + {hex_string_to_bytes(bytecode_addition), zkevm_word_type(0x1234ab000_big_uint256)}); auto ind = input.new_bytecode(); input.push_byte(ind, 0x60); input.push_byte(ind, 0x40); diff --git a/crypto3/libs/blueprint/test/zkevm/opcode_tester.hpp b/crypto3/libs/blueprint/test/zkevm/opcode_tester.hpp index 2884a78b4..740bd4021 100644 --- a/crypto3/libs/blueprint/test/zkevm/opcode_tester.hpp +++ b/crypto3/libs/blueprint/test/zkevm/opcode_tester.hpp @@ -59,127 +59,127 @@ namespace nil { std::vector additional_input; switch( opcode ){ case zkevm_opcode::PUSH1: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 1, additional_array.end()); break; case zkevm_opcode::PUSH2: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*2) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 2) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 2, additional_array.end()); break; case zkevm_opcode::PUSH3: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*3) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 3) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 3, additional_array.end()); break; case zkevm_opcode::PUSH4: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*4) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 4) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 4, additional_array.end()); break; case zkevm_opcode::PUSH5: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*5) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 5) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 5, additional_array.end()); break; case zkevm_opcode::PUSH6: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*6) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 6) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 6, additional_array.end()); break; case zkevm_opcode::PUSH7: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*7) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 7) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 7, additional_array.end()); break; case zkevm_opcode::PUSH8: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*8) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 8) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 8, additional_array.end()); break; case zkevm_opcode::PUSH9: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*9 ) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 9) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 9, additional_array.end()); break; case zkevm_opcode::PUSH10: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*10) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 10) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 10, additional_array.end()); break; case zkevm_opcode::PUSH11: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*11) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 11) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 11, additional_array.end()); break; case zkevm_opcode::PUSH12: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*12) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 12) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 11, additional_array.end()); break; case zkevm_opcode::PUSH13: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*13) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 13) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 11, additional_array.end()); break; case zkevm_opcode::PUSH14: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*14) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 14) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 11, additional_array.end()); break; case zkevm_opcode::PUSH15: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*15) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 15) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 15, additional_array.end()); break; case zkevm_opcode::PUSH16: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*16) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 16) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 16, additional_array.end()); break; case zkevm_opcode::PUSH17: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*17) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 17) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 17, additional_array.end()); break; case zkevm_opcode::PUSH18: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*18) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 18) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 18, additional_array.end()); break; case zkevm_opcode::PUSH19: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*19) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 19) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 19, additional_array.end()); break; case zkevm_opcode::PUSH20: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*20) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 20) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 20, additional_array.end()); break; case zkevm_opcode::PUSH21: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*21) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 21) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 21, additional_array.end()); break; case zkevm_opcode::PUSH22: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*22) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 22) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 22, additional_array.end()); break; case zkevm_opcode::PUSH23: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*23) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 23) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 23, additional_array.end()); break; case zkevm_opcode::PUSH24: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*24) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 24) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 24, additional_array.end()); break; case zkevm_opcode::PUSH25: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*25) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 25) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 25, additional_array.end()); break; case zkevm_opcode::PUSH26: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*26) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 26) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 26, additional_array.end()); break; case zkevm_opcode::PUSH27: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*27) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 27) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 27, additional_array.end()); break; case zkevm_opcode::PUSH28: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*28) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 28) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 28, additional_array.end()); break; case zkevm_opcode::PUSH29: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*29) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 29) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 29, additional_array.end()); break; case zkevm_opcode::PUSH30: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*30) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 30) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 30, additional_array.end()); break; case zkevm_opcode::PUSH31: - BOOST_ASSERT(additional_word < (zkevm_word_type(1).base() << 8*31) - 1); + BOOST_ASSERT(additional_word < (zkevm_word_type(1) << 8 * 31) - 1); additional_input.insert(additional_input.end(), additional_array.end() - 31, additional_array.end()); break; case zkevm_opcode::PUSH32: diff --git a/crypto3/libs/blueprint/test/zkevm/opcodes/add_sub.cpp b/crypto3/libs/blueprint/test/zkevm/opcodes/add_sub.cpp index 7767f5994..f77f3b8b7 100644 --- a/crypto3/libs/blueprint/test/zkevm/opcodes/add_sub.cpp +++ b/crypto3/libs/blueprint/test/zkevm/opcodes/add_sub.cpp @@ -63,23 +63,37 @@ BOOST_AUTO_TEST_CASE(zkevm_add_test) { zkevm_table zkevm_table(evm_circuit, assignment); zkevm_opcode_tester opcode_tester; - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::ADD); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SUB); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::ADD); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SUB); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::ADD); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SUB); opcode_tester.push_opcode(zkevm_opcode::RETURN); diff --git a/crypto3/libs/blueprint/test/zkevm/opcodes/bitwise.cpp b/crypto3/libs/blueprint/test/zkevm/opcodes/bitwise.cpp index 4ca007e5d..837d0986e 100644 --- a/crypto3/libs/blueprint/test/zkevm/opcodes/bitwise.cpp +++ b/crypto3/libs/blueprint/test/zkevm/opcodes/bitwise.cpp @@ -63,41 +63,65 @@ BOOST_AUTO_TEST_CASE(zkevm_bitwise_test) { zkevm_opcode_tester opcode_tester; // incorrect test logic, but we have no memory operations so - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x3_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x3_big_uint256); opcode_tester.push_opcode(zkevm_opcode::AND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x3_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x3_big_uint256); opcode_tester.push_opcode(zkevm_opcode::OR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x3_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x3_big_uint256); opcode_tester.push_opcode(zkevm_opcode::XOR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::AND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::OR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::XOR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::AND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::OR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::XOR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::AND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::OR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::XOR); opcode_tester.push_opcode(zkevm_opcode::RETURN); diff --git a/crypto3/libs/blueprint/test/zkevm/opcodes/byte_ops.cpp b/crypto3/libs/blueprint/test/zkevm/opcodes/byte_ops.cpp index 93b34b982..143a43ae4 100644 --- a/crypto3/libs/blueprint/test/zkevm/opcodes/byte_ops.cpp +++ b/crypto3/libs/blueprint/test/zkevm/opcodes/byte_ops.cpp @@ -63,164 +63,254 @@ BOOST_AUTO_TEST_CASE(zkevm_byte_ops_test) { zkevm_opcode_tester opcode_tester; // incorrect test logic, but we have no memory operations so - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::BYTE); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SIGNEXTEND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SHL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SHR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SAR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,0); opcode_tester.push_opcode(zkevm_opcode::BYTE); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,0); opcode_tester.push_opcode(zkevm_opcode::SIGNEXTEND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,0); opcode_tester.push_opcode(zkevm_opcode::SHL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,0); opcode_tester.push_opcode(zkevm_opcode::SHR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,0); opcode_tester.push_opcode(zkevm_opcode::SAR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,10); opcode_tester.push_opcode(zkevm_opcode::BYTE); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,10); opcode_tester.push_opcode(zkevm_opcode::SIGNEXTEND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,10); opcode_tester.push_opcode(zkevm_opcode::SHL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,10); opcode_tester.push_opcode(zkevm_opcode::SHR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,10); opcode_tester.push_opcode(zkevm_opcode::SAR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,257); opcode_tester.push_opcode(zkevm_opcode::BYTE); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,257); opcode_tester.push_opcode(zkevm_opcode::SIGNEXTEND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,257); opcode_tester.push_opcode(zkevm_opcode::SHL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,257); opcode_tester.push_opcode(zkevm_opcode::SHR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,257); opcode_tester.push_opcode(zkevm_opcode::SAR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,65538); opcode_tester.push_opcode(zkevm_opcode::BYTE); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,65538); opcode_tester.push_opcode(zkevm_opcode::SIGNEXTEND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,65538); opcode_tester.push_opcode(zkevm_opcode::SHL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,65538); opcode_tester.push_opcode(zkevm_opcode::SHR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,65538); opcode_tester.push_opcode(zkevm_opcode::SAR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,10); opcode_tester.push_opcode(zkevm_opcode::BYTE); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,10); opcode_tester.push_opcode(zkevm_opcode::SIGNEXTEND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,10); opcode_tester.push_opcode(zkevm_opcode::SHL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,10); opcode_tester.push_opcode(zkevm_opcode::SHR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,10); opcode_tester.push_opcode(zkevm_opcode::SAR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,30); opcode_tester.push_opcode(zkevm_opcode::BYTE); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,30); opcode_tester.push_opcode(zkevm_opcode::SIGNEXTEND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,30); opcode_tester.push_opcode(zkevm_opcode::SHL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,30); opcode_tester.push_opcode(zkevm_opcode::SHR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,30); opcode_tester.push_opcode(zkevm_opcode::SAR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,50); opcode_tester.push_opcode(zkevm_opcode::BYTE); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,50); opcode_tester.push_opcode(zkevm_opcode::SIGNEXTEND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,50); opcode_tester.push_opcode(zkevm_opcode::SHL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,50); opcode_tester.push_opcode(zkevm_opcode::SHR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,50); opcode_tester.push_opcode(zkevm_opcode::SAR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1234567890_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,1); opcode_tester.push_opcode(zkevm_opcode::BYTE); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1234567890_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,1); opcode_tester.push_opcode(zkevm_opcode::SIGNEXTEND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1234567890_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,1); opcode_tester.push_opcode(zkevm_opcode::SHL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1234567890_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,1); opcode_tester.push_opcode(zkevm_opcode::SHR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1234567890_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,1); opcode_tester.push_opcode(zkevm_opcode::SAR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1234567890_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,31); opcode_tester.push_opcode(zkevm_opcode::BYTE); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1234567890_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,31); opcode_tester.push_opcode(zkevm_opcode::SIGNEXTEND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1234567890_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,31); opcode_tester.push_opcode(zkevm_opcode::SHL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1234567890_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,31); opcode_tester.push_opcode(zkevm_opcode::SHR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1234567890_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,31); opcode_tester.push_opcode(zkevm_opcode::SAR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x33_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x33_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SAR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x33_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x33_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SHR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x33_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x33_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SHL); opcode_tester.push_opcode(zkevm_opcode::RETURN); diff --git a/crypto3/libs/blueprint/test/zkevm/opcodes/cmp.cpp b/crypto3/libs/blueprint/test/zkevm/opcodes/cmp.cpp index 970224a04..35dee745b 100644 --- a/crypto3/libs/blueprint/test/zkevm/opcodes/cmp.cpp +++ b/crypto3/libs/blueprint/test/zkevm/opcodes/cmp.cpp @@ -63,50 +63,90 @@ BOOST_AUTO_TEST_CASE(zkevm_cmp_test) { zkevm_opcode_tester opcode_tester; // incorrect test logic, but we have no memory operations so - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::GT); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::LT); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::EQ); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SGT); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SLT); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::GT); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::LT); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::EQ); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SGT); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SLT); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::GT); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::LT); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::EQ); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SGT); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SLT); opcode_tester.push_opcode(zkevm_opcode::RETURN); diff --git a/crypto3/libs/blueprint/test/zkevm/opcodes/div.cpp b/crypto3/libs/blueprint/test/zkevm/opcodes/div.cpp index 1babb5ac6..77bcbbe65 100644 --- a/crypto3/libs/blueprint/test/zkevm/opcodes/div.cpp +++ b/crypto3/libs/blueprint/test/zkevm/opcodes/div.cpp @@ -63,52 +63,100 @@ BOOST_AUTO_TEST_CASE(zkevm_mul_test) { zkevm_opcode_tester opcode_tester; // incorrect test logic, but we have no memory operations so - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); opcode_tester.push_opcode(zkevm_opcode::DIV); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); opcode_tester.push_opcode(zkevm_opcode::MOD); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SDIV); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SMOD); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1234567890); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::DIV); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1234567890); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::MOD); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1234567890); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SDIV); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1234567890); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SMOD); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::DIV); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::MOD); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SDIV); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SMOD); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1234567890); opcode_tester.push_opcode(zkevm_opcode::DIV); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1234567890); opcode_tester.push_opcode(zkevm_opcode::MOD); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1234567890); opcode_tester.push_opcode(zkevm_opcode::SDIV); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1234567890); opcode_tester.push_opcode(zkevm_opcode::SMOD); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0); @@ -124,17 +172,33 @@ BOOST_AUTO_TEST_CASE(zkevm_mul_test) { opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1234567890); opcode_tester.push_opcode(zkevm_opcode::SMOD); // below is the overflow case for signed division - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x8000000000000000000000000000000000000000000000000000000000000000_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8000000000000000000000000000000000000000000000000000000000000000_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); opcode_tester.push_opcode(zkevm_opcode::DIV); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x8000000000000000000000000000000000000000000000000000000000000000_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8000000000000000000000000000000000000000000000000000000000000000_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); opcode_tester.push_opcode(zkevm_opcode::MOD); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x8000000000000000000000000000000000000000000000000000000000000000_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8000000000000000000000000000000000000000000000000000000000000000_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SDIV); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x8000000000000000000000000000000000000000000000000000000000000000_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8000000000000000000000000000000000000000000000000000000000000000_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SMOD); opcode_tester.push_opcode(zkevm_opcode::RETURN); diff --git a/crypto3/libs/blueprint/test/zkevm/opcodes/err0.cpp b/crypto3/libs/blueprint/test/zkevm/opcodes/err0.cpp index ad2000799..68a9b5420 100644 --- a/crypto3/libs/blueprint/test/zkevm/opcodes/err0.cpp +++ b/crypto3/libs/blueprint/test/zkevm/opcodes/err0.cpp @@ -141,8 +141,11 @@ BOOST_AUTO_TEST_CASE(zkevm_err0_test_2) { zkevm_table zkevm_table(zkevm_circuit, assignment); zkevm_machine_type machine = get_empty_machine(8); - machine.apply_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); zkevm_table.assign_opcode(machine); - machine.apply_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); zkevm_table.assign_opcode(machine); + machine.apply_opcode(zkevm_opcode::PUSH32, +0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); +zkevm_table.assign_opcode(machine); machine.apply_opcode(zkevm_opcode::PUSH32, +0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); +zkevm_table.assign_opcode(machine); // produce an out-of-gas error zkevm_table.finalize_test(); diff --git a/crypto3/libs/blueprint/test/zkevm/opcodes/mod_ops.cpp b/crypto3/libs/blueprint/test/zkevm/opcodes/mod_ops.cpp index 948223cb1..74e5ba957 100644 --- a/crypto3/libs/blueprint/test/zkevm/opcodes/mod_ops.cpp +++ b/crypto3/libs/blueprint/test/zkevm/opcodes/mod_ops.cpp @@ -64,52 +64,88 @@ BOOST_AUTO_TEST_CASE(zkevm_mod_ops_test) { // incorrect test logic, but we have no memory operations so opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0); // N - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); // b + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); // b opcode_tester.push_opcode(zkevm_opcode::PUSH32, 2); // a opcode_tester.push_opcode(zkevm_opcode::ADDMOD); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0); // N - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); // b + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); // b opcode_tester.push_opcode(zkevm_opcode::PUSH32, 2); // a opcode_tester.push_opcode(zkevm_opcode::MULMOD); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1); // N - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); // b + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); // b opcode_tester.push_opcode(zkevm_opcode::PUSH32, 2); // a opcode_tester.push_opcode(zkevm_opcode::ADDMOD); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1); // N - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); // b + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); // b opcode_tester.push_opcode(zkevm_opcode::PUSH32, 2); // a opcode_tester.push_opcode(zkevm_opcode::MULMOD); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 3); // N - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); // b + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); // b opcode_tester.push_opcode(zkevm_opcode::PUSH32, 2); // a opcode_tester.push_opcode(zkevm_opcode::ADDMOD); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 3); // N - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); // b + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); // b opcode_tester.push_opcode(zkevm_opcode::PUSH32, 2); // a opcode_tester.push_opcode(zkevm_opcode::MULMOD); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x12b8f010425938504d73ebc8801e2e0161b70726fb8d3a24da9ff9647225a184_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x12b8f010425938504d73ebc8801e2e0161b70726fb8d3a24da9ff9647225a184_big_uint256); opcode_tester.push_opcode(zkevm_opcode::ADDMOD); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x12b8f010425938504d73ebc8801e2e0161b70726fb8d3a24da9ff9647225a184_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x12b8f010425938504d73ebc8801e2e0161b70726fb8d3a24da9ff9647225a184_big_uint256); opcode_tester.push_opcode(zkevm_opcode::MULMOD); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); opcode_tester.push_opcode(zkevm_opcode::ADDMOD); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); opcode_tester.push_opcode(zkevm_opcode::MULMOD); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x6789012345_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x6789012345_big_uint256); opcode_tester.push_opcode(zkevm_opcode::ADDMOD); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x6789012345_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x6789012345_big_uint256); opcode_tester.push_opcode(zkevm_opcode::MULMOD); opcode_tester.push_opcode(zkevm_opcode::RETURN); diff --git a/crypto3/libs/blueprint/test/zkevm/opcodes/mul.cpp b/crypto3/libs/blueprint/test/zkevm/opcodes/mul.cpp index 5db608845..9509470b9 100644 --- a/crypto3/libs/blueprint/test/zkevm/opcodes/mul.cpp +++ b/crypto3/libs/blueprint/test/zkevm/opcodes/mul.cpp @@ -63,16 +63,28 @@ BOOST_AUTO_TEST_CASE(zkevm_mul_test) { zkevm_table zkevm_table(evm_circuit, assignment); zkevm_opcode_tester opcode_tester; - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); opcode_tester.push_opcode(zkevm_opcode::MUL); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1234567890); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::MUL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::MUL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1234567890); opcode_tester.push_opcode(zkevm_opcode::MUL); opcode_tester.push_opcode(zkevm_opcode::RETURN); diff --git a/crypto3/libs/blueprint/test/zkevm/opcodes/not.cpp b/crypto3/libs/blueprint/test/zkevm/opcodes/not.cpp index 547e44957..fd221123f 100644 --- a/crypto3/libs/blueprint/test/zkevm/opcodes/not.cpp +++ b/crypto3/libs/blueprint/test/zkevm/opcodes/not.cpp @@ -62,11 +62,15 @@ BOOST_AUTO_TEST_CASE(zkevm_not_test) { zkevm_table zkevm_table(evm_circuit, assignment); zkevm_opcode_tester opcode_tester; // incorrect test logic, but we have no memory operations so - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::NOT); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::NOT); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::NOT); opcode_tester.push_opcode(zkevm_opcode::RETURN); diff --git a/crypto3/libs/blueprint/test/zkevm/opcodes/workload.cpp b/crypto3/libs/blueprint/test/zkevm/opcodes/workload.cpp index 021f6c6df..385076145 100644 --- a/crypto3/libs/blueprint/test/zkevm/opcodes/workload.cpp +++ b/crypto3/libs/blueprint/test/zkevm/opcodes/workload.cpp @@ -116,9 +116,9 @@ BOOST_AUTO_TEST_CASE(zkevm_workload_test) { // incorrect test logic, but we have no memory operations so for(std::size_t i = 0; i < workload; i++) { - opcode_tester.push_opcode(zkevm_opcode::PUSH1, 0x11_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH1, 0x22_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH1, 0x33_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH1, 0x11_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH1, 0x22_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH1, 0x33_big_uint256); opcode_tester.push_opcode(implemented_opcodes[i % num_of_opcodes]); } opcode_tester.push_opcode(zkevm_opcode::RETURN); diff --git a/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/add_sub.cpp b/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/add_sub.cpp index b8758e1c9..fbfc18a41 100644 --- a/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/add_sub.cpp +++ b/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/add_sub.cpp @@ -68,23 +68,37 @@ BOOST_AUTO_TEST_CASE(add_sub) { l1_size_restrictions max_sizes; - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::ADD); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SUB); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::ADD); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SUB); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::ADD); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SUB); opcode_tester.push_opcode(zkevm_opcode::STOP); diff --git a/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/bitwise.cpp b/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/bitwise.cpp index 1e7770fd1..3f5a19974 100644 --- a/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/bitwise.cpp +++ b/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/bitwise.cpp @@ -68,41 +68,65 @@ BOOST_AUTO_TEST_CASE(bitwize) { l1_size_restrictions max_sizes; - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x3_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x3_big_uint256); opcode_tester.push_opcode(zkevm_opcode::AND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x3_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x3_big_uint256); opcode_tester.push_opcode(zkevm_opcode::OR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x3_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x3_big_uint256); opcode_tester.push_opcode(zkevm_opcode::XOR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::AND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::OR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::XOR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::AND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::OR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::XOR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::AND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::OR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::XOR); opcode_tester.push_opcode(zkevm_opcode::STOP); diff --git a/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/byte_ops.cpp b/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/byte_ops.cpp index 7ee817256..b7b5913df 100644 --- a/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/byte_ops.cpp +++ b/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/byte_ops.cpp @@ -69,167 +69,257 @@ BOOST_AUTO_TEST_CASE(byte_ops) { l1_size_restrictions max_sizes; // incorrect test logic, but we have no memory operations so - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::BYTE); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SIGNEXTEND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SHL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SHR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SAR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,0); opcode_tester.push_opcode(zkevm_opcode::BYTE); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,0); opcode_tester.push_opcode(zkevm_opcode::SIGNEXTEND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0); opcode_tester.push_opcode(zkevm_opcode::SHL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,0); opcode_tester.push_opcode(zkevm_opcode::SHR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,0); opcode_tester.push_opcode(zkevm_opcode::SAR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,10); opcode_tester.push_opcode(zkevm_opcode::BYTE); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,10); opcode_tester.push_opcode(zkevm_opcode::SIGNEXTEND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 10); opcode_tester.push_opcode(zkevm_opcode::SHL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,10); opcode_tester.push_opcode(zkevm_opcode::SHR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,10); opcode_tester.push_opcode(zkevm_opcode::SAR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,257); opcode_tester.push_opcode(zkevm_opcode::BYTE); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,257); opcode_tester.push_opcode(zkevm_opcode::SIGNEXTEND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 257); opcode_tester.push_opcode(zkevm_opcode::SHL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,257); opcode_tester.push_opcode(zkevm_opcode::SHR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,257); opcode_tester.push_opcode(zkevm_opcode::SAR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,65538); opcode_tester.push_opcode(zkevm_opcode::BYTE); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,65538); opcode_tester.push_opcode(zkevm_opcode::SIGNEXTEND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 65538); opcode_tester.push_opcode(zkevm_opcode::SHL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,65538); opcode_tester.push_opcode(zkevm_opcode::SHR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,65538); opcode_tester.push_opcode(zkevm_opcode::SAR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,10); opcode_tester.push_opcode(zkevm_opcode::BYTE); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,10); opcode_tester.push_opcode(zkevm_opcode::SIGNEXTEND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 10); opcode_tester.push_opcode(zkevm_opcode::SHL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,10); opcode_tester.push_opcode(zkevm_opcode::SHR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,10); opcode_tester.push_opcode(zkevm_opcode::SAR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,30); opcode_tester.push_opcode(zkevm_opcode::BYTE); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,30); opcode_tester.push_opcode(zkevm_opcode::SIGNEXTEND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 30); opcode_tester.push_opcode(zkevm_opcode::SHL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,30); opcode_tester.push_opcode(zkevm_opcode::SHR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,30); opcode_tester.push_opcode(zkevm_opcode::SAR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,50); opcode_tester.push_opcode(zkevm_opcode::BYTE); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,50); opcode_tester.push_opcode(zkevm_opcode::SIGNEXTEND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 50); opcode_tester.push_opcode(zkevm_opcode::SHL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,50); opcode_tester.push_opcode(zkevm_opcode::SHR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,50); opcode_tester.push_opcode(zkevm_opcode::SAR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1234567890_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,1); opcode_tester.push_opcode(zkevm_opcode::BYTE); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1234567890_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,1); opcode_tester.push_opcode(zkevm_opcode::SIGNEXTEND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1); opcode_tester.push_opcode(zkevm_opcode::SHL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1234567890_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,1); opcode_tester.push_opcode(zkevm_opcode::SHR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1234567890_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,1); opcode_tester.push_opcode(zkevm_opcode::SAR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1234567890_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,31); opcode_tester.push_opcode(zkevm_opcode::BYTE); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1234567890_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,32); opcode_tester.push_opcode(zkevm_opcode::BYTE); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1234567890_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,31); opcode_tester.push_opcode(zkevm_opcode::SIGNEXTEND); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 31); opcode_tester.push_opcode(zkevm_opcode::SHL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1234567890_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,31); opcode_tester.push_opcode(zkevm_opcode::SHR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1234567890_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32,31); opcode_tester.push_opcode(zkevm_opcode::SAR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x33_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x33_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SAR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x33_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32,0x1_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x33_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SHR); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x33_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x33_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SHL); opcode_tester.push_opcode(zkevm_opcode::STOP); diff --git a/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/cmp.cpp b/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/cmp.cpp index 8534a91e3..0f1b55995 100644 --- a/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/cmp.cpp +++ b/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/cmp.cpp @@ -68,50 +68,90 @@ BOOST_AUTO_TEST_CASE(cmp) { l1_size_restrictions max_sizes; - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::GT); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::LT); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::EQ); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SGT); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SLT); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::GT); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::LT); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::EQ); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SGT); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SLT); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::GT); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::LT); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::EQ); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SGT); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SLT); opcode_tester.push_opcode(zkevm_opcode::STOP); diff --git a/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/div.cpp b/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/div.cpp index a11414bbb..54a29c87e 100644 --- a/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/div.cpp +++ b/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/div.cpp @@ -68,52 +68,100 @@ BOOST_AUTO_TEST_CASE(divs) { l1_size_restrictions max_sizes; // incorrect test logic, but we have no memory operations so - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); opcode_tester.push_opcode(zkevm_opcode::DIV); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); opcode_tester.push_opcode(zkevm_opcode::MOD); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SDIV); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SMOD); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1234567890); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::DIV); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1234567890); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::DIV); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1234567890); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SDIV); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1234567890); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SMOD); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::DIV); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::DIV); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SDIV); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SMOD); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1234567890); opcode_tester.push_opcode(zkevm_opcode::DIV); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1234567890); opcode_tester.push_opcode(zkevm_opcode::DIV); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1234567890); opcode_tester.push_opcode(zkevm_opcode::SDIV); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1234567890); opcode_tester.push_opcode(zkevm_opcode::SMOD); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0); @@ -129,17 +177,33 @@ BOOST_AUTO_TEST_CASE(divs) { opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1234567890); opcode_tester.push_opcode(zkevm_opcode::SMOD); // below is the overflow case for signed division - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x8000000000000000000000000000000000000000000000000000000000000000_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8000000000000000000000000000000000000000000000000000000000000000_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); opcode_tester.push_opcode(zkevm_opcode::DIV); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x8000000000000000000000000000000000000000000000000000000000000000_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8000000000000000000000000000000000000000000000000000000000000000_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); opcode_tester.push_opcode(zkevm_opcode::DIV); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x8000000000000000000000000000000000000000000000000000000000000000_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8000000000000000000000000000000000000000000000000000000000000000_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SDIV); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x8000000000000000000000000000000000000000000000000000000000000000_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8000000000000000000000000000000000000000000000000000000000000000_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); opcode_tester.push_opcode(zkevm_opcode::SMOD); opcode_tester.push_opcode(zkevm_opcode::STOP); diff --git a/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/exp.cpp b/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/exp.cpp index ac6425831..e50bd218d 100644 --- a/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/exp.cpp +++ b/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/exp.cpp @@ -81,24 +81,40 @@ BOOST_AUTO_TEST_CASE(exp) { opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1); opcode_tester.push_opcode(zkevm_opcode::EXP); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 2); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); opcode_tester.push_opcode(zkevm_opcode::EXP); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 2); opcode_tester.push_opcode(zkevm_opcode::EXP); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 255); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 2); opcode_tester.push_opcode(zkevm_opcode::EXP); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); opcode_tester.push_opcode(zkevm_opcode::EXP); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1234567890); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::EXP); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::EXP); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1234567890); opcode_tester.push_opcode(zkevm_opcode::EXP); opcode_tester.push_opcode(zkevm_opcode::STOP); diff --git a/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/mul.cpp b/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/mul.cpp index 3b376c437..eb6621050 100644 --- a/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/mul.cpp +++ b/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/mul.cpp @@ -70,31 +70,51 @@ BOOST_AUTO_TEST_CASE(mul) { opcode_tester.push_opcode(zkevm_opcode::PUSH32, 2); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 2); opcode_tester.push_opcode(zkevm_opcode::MUL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 2); opcode_tester.push_opcode(zkevm_opcode::MUL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1111111111111111111111111111111111111111111111111111111111111111_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1111111111111111111111111111111111111111111111111111111111111111_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 2); opcode_tester.push_opcode(zkevm_opcode::MUL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x4444444444444444333333333333333322222222222222221111111111111111_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x4444444444444444333333333333333322222222222222221111111111111111_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 2); opcode_tester.push_opcode(zkevm_opcode::MUL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x88888888888888888888888888888888_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x88888888888888888888888888888888_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 2); opcode_tester.push_opcode(zkevm_opcode::MUL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x8888888888888888888888888888888888888888888888888888888888888888_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x8888888888888888888888888888888888888888888888888888888888888888_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 2); opcode_tester.push_opcode(zkevm_opcode::MUL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_big_uint256); opcode_tester.push_opcode(zkevm_opcode::MUL); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1234567890); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::MUL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::MUL); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 1234567890); opcode_tester.push_opcode(zkevm_opcode::MUL); opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1e); diff --git a/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/not.cpp b/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/not.cpp index 8e8e1be49..1fe69c434 100644 --- a/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/not.cpp +++ b/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/not.cpp @@ -68,11 +68,15 @@ BOOST_AUTO_TEST_CASE(opcode_not) { l1_size_restrictions max_sizes; - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1234567890_big_uint256); opcode_tester.push_opcode(zkevm_opcode::NOT); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::NOT); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0xFb70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::NOT); opcode_tester.push_opcode(zkevm_opcode::STOP); diff --git a/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/pushx.cpp b/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/pushx.cpp index 9cf90ab55..b8e6f2f4e 100644 --- a/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/pushx.cpp +++ b/crypto3/libs/blueprint/test/zkevm_bbf/opcodes/pushx.cpp @@ -113,38 +113,59 @@ BOOST_AUTO_TEST_CASE(pushx) { zkevm_opcode_tester opcode_tester; opcode_tester.push_opcode(zkevm_opcode::PUSH0); - opcode_tester.push_opcode(zkevm_opcode::PUSH1, 0x12_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH2, 0x1234_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH3, 0x123456_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH4, 0x12345678_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH5, 0x1b70726fb8_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH6, 0x1b70726fb8d3_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH7, 0x1b70726fb8d3a2_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH8, 0x1b70726fb8d3a24d_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH9, 0x1b70726fb8d3a24da9_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH10, 0x1b70726fb8d3a24da9ff_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH11, 0x1b70726fb8d3a24da9ff96_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH12, 0x1b70726fb8d3a24da9ff9647_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH13, 0x1b70726fb8d3a24da9ff964722_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH14, 0x1b70726fb8d3a24da9ff9647225a_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH15, 0x1b70726fb8d3a24da9ff9647225a18_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH16, 0x1b70726fb8d3a24da9ff9647225a1841_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH17, 0x1b70726fb8d3a24da9ff9647225a18412b_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH18, 0x1b70726fb8d3a24da9ff9647225a18412b8f_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH19, 0x1b70726fb8d3a24da9ff9647225a18412b8f01_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH20, 0x1b70726fb8d3a24da9ff9647225a18412b8f0104_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH21, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH22, 0x1b70726fb8d3a24da9ff9647225a18412b8f01042593_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH23, 0x1b70726fb8d3a24da9ff9647225a18412b8f0104259385_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH24, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH25, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d7_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH26, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73e_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH27, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH28, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc88_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH29, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH30, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH31, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e0_big_uint257); - opcode_tester.push_opcode(zkevm_opcode::PUSH32, 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint257); + opcode_tester.push_opcode(zkevm_opcode::PUSH1, 0x12_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH2, 0x1234_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH3, 0x123456_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH4, 0x12345678_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH5, 0x1b70726fb8_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH6, 0x1b70726fb8d3_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH7, 0x1b70726fb8d3a2_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH8, 0x1b70726fb8d3a24d_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH9, 0x1b70726fb8d3a24da9_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH10, 0x1b70726fb8d3a24da9ff_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH11, 0x1b70726fb8d3a24da9ff96_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH12, 0x1b70726fb8d3a24da9ff9647_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH13, 0x1b70726fb8d3a24da9ff964722_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH14, 0x1b70726fb8d3a24da9ff9647225a_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH15, 0x1b70726fb8d3a24da9ff9647225a18_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH16, 0x1b70726fb8d3a24da9ff9647225a1841_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH17, + 0x1b70726fb8d3a24da9ff9647225a18412b_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH18, + 0x1b70726fb8d3a24da9ff9647225a18412b8f_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH19, + 0x1b70726fb8d3a24da9ff9647225a18412b8f01_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH20, + 0x1b70726fb8d3a24da9ff9647225a18412b8f0104_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH21, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH22, + 0x1b70726fb8d3a24da9ff9647225a18412b8f01042593_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH23, + 0x1b70726fb8d3a24da9ff9647225a18412b8f0104259385_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH24, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH25, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d7_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH26, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73e_big_uint256); + opcode_tester.push_opcode(zkevm_opcode::PUSH27, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH28, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc88_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH29, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH30, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH31, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e0_big_uint256); + opcode_tester.push_opcode( + zkevm_opcode::PUSH32, + 0x1b70726fb8d3a24da9ff9647225a18412b8f010425938504d73ebc8801e2e016_big_uint256); opcode_tester.push_opcode(zkevm_opcode::STOP); l1_size_restrictions max_sizes; diff --git a/proof-producer/libs/assigner/include/nil/proof-generator/assigner/trace_parser.hpp b/proof-producer/libs/assigner/include/nil/proof-generator/assigner/trace_parser.hpp index 19b6c6485..64f721e3b 100644 --- a/proof-producer/libs/assigner/include/nil/proof-generator/assigner/trace_parser.hpp +++ b/proof-producer/libs/assigner/include/nil/proof-generator/assigner/trace_parser.hpp @@ -29,9 +29,9 @@ namespace nil { // Convert protobuf Uint256 to zkevm_word_type [[nodiscard]] blueprint::zkevm_word_type proto_uint256_to_zkevm_word(const executionproofs::Uint256& pb_uint) { - blueprint::zkevm_word_integral_type result = 0; + blueprint::zkevm_word_type result = 0; for (size_t i = 0; i < pb_uint.word_parts_size() && i < 4; i++) { - result |= (static_cast(pb_uint.word_parts(i)) << (i * 64)); + result |= (static_cast(pb_uint.word_parts(i)) << (i * 64)); } return result; } From bf48eac5f31f9a15c722b667997c91b4f23f49e9 Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Fri, 20 Dec 2024 02:38:54 +0000 Subject: [PATCH 28/29] multiprecision: test: generate better test cases --- .../test/big_mod_arithmetic.cpp | 22 +- .../multiprecision/test/data/comparison.json | 14192 ++++++++-------- .../test/data/generate_test_data.py | 16 +- .../test/data/modular_arithmetic.json | 10012 +++++++++++ .../test/data/modular_comprehensive.json | 10012 ----------- 5 files changed, 17127 insertions(+), 17127 deletions(-) create mode 100644 crypto3/libs/multiprecision/test/data/modular_arithmetic.json delete mode 100644 crypto3/libs/multiprecision/test/data/modular_comprehensive.json diff --git a/crypto3/libs/multiprecision/test/big_mod_arithmetic.cpp b/crypto3/libs/multiprecision/test/big_mod_arithmetic.cpp index 7e0844995..51eebc53f 100644 --- a/crypto3/libs/multiprecision/test/big_mod_arithmetic.cpp +++ b/crypto3/libs/multiprecision/test/big_mod_arithmetic.cpp @@ -41,7 +41,7 @@ std::vector as_vector(const boost::property_tree::ptree &pt) { template auto test_dataset(const std::string &test_name) { - static std::string test_data = std::string(TEST_DATA_DIR) + R"(modular_comprehensive.json)"; + static std::string test_data = std::string(TEST_DATA_DIR) + R"(modular_arithmetic.json)"; boost::property_tree::ptree test_dataset; boost::property_tree::read_json(test_data, test_dataset); @@ -49,8 +49,8 @@ auto test_dataset(const std::string &test_name) { } template -struct ModularComprehensiveSample { - ModularComprehensiveSample(const boost::property_tree::ptree &sample) : ptree(sample) { +struct ModularArithmeticSample { + ModularArithmeticSample(const boost::property_tree::ptree &sample) : ptree(sample) { a = sample.get("a"); b = sample.get("b"); m = sample.get("m"); @@ -61,11 +61,11 @@ struct ModularComprehensiveSample { a_m_pow_b = sample.get("a_m_pow_b"); if (Montgomery && !m.bit_test(0)) { - throw std::runtime_error("ModularComprehensiveSample: Montgomery requires m to be odd"); + throw std::runtime_error("ModularArithmeticSample: Montgomery requires m to be odd"); } } - friend std::ostream &operator<<(std::ostream &os, const ModularComprehensiveSample &sample) { + friend std::ostream &operator<<(std::ostream &os, const ModularArithmeticSample &sample) { boost::property_tree::json_parser::write_json(os, sample.ptree); return os; } @@ -83,7 +83,7 @@ struct ModularComprehensiveSample { }; template -void base_operations_test(const ModularComprehensiveSample sample) { +void base_operations_test(const ModularArithmeticSample sample) { using modular_number = std::conditional_t, big_mod_rt>; @@ -106,28 +106,28 @@ void base_operations_test(const ModularComprehensiveSample sam BOOST_AUTO_TEST_SUITE(base_operations) -BOOST_DATA_TEST_CASE(prime_mod_montgomery_130, (test_dataset>( +BOOST_DATA_TEST_CASE(prime_mod_montgomery_130, (test_dataset>( "prime_mod_montgomery_130"))) { base_operations_test(sample); } BOOST_DATA_TEST_CASE(even_mod_130, - (test_dataset>("even_mod_130"))) { + (test_dataset>("even_mod_130"))) { base_operations_test(sample); } // This one tests 64-bit numbers used in Goldilock fields. -BOOST_DATA_TEST_CASE(goldilock, (test_dataset>("goldilock"))) { +BOOST_DATA_TEST_CASE(goldilock, (test_dataset>("goldilock"))) { base_operations_test(sample); } BOOST_DATA_TEST_CASE(even_mod_17, - (test_dataset>("even_mod_17"))) { + (test_dataset>("even_mod_17"))) { base_operations_test(sample); } BOOST_DATA_TEST_CASE(montgomery_17, - (test_dataset>("montgomery_17"))) { + (test_dataset>("montgomery_17"))) { base_operations_test(sample); } diff --git a/crypto3/libs/multiprecision/test/data/comparison.json b/crypto3/libs/multiprecision/test/data/comparison.json index 9639c6016..5f0b42584 100644 --- a/crypto3/libs/multiprecision/test/data/comparison.json +++ b/crypto3/libs/multiprecision/test/data/comparison.json @@ -1,113 +1,123 @@ { "test_comparison_12_17": [ { - "a": "0x223", - "b": "0x19d", - "cmp_a_b": 1 + "a": "0x45", + "b": "0x19b4", + "cmp_a_b": -1 }, { - "a": "0x2a6", - "b": "0x3c7", - "cmp_a_b": -1 + "a": "0x2d", + "b": "0xc", + "cmp_a_b": 1 }, { - "a": "0x42", - "b": "0x5b4", + "a": "0x14b", + "b": "0x7c6", "cmp_a_b": -1 }, { - "a": "0x78d", - "b": "0xa1a9", + "a": "0x3b", + "b": "0x7d", "cmp_a_b": -1 }, { - "a": "0x1b0", - "b": "0x104", - "cmp_a_b": 1 + "a": "0x185", + "b": "0x185", + "cmp_a_b": 0 }, { - "a": "0x25", - "b": "0x15971", + "a": "0x0", + "b": "0x1", "cmp_a_b": -1 }, { - "a": "0x538", - "b": "0x282", + "a": "0x2f", + "b": "0x5", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x40ff", + "a": "0xb", + "b": "0x4bac", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x11", - "cmp_a_b": -1 + "a": "0x3f", + "b": "0xd", + "cmp_a_b": 1 }, { - "a": "0x572", - "b": "0x10", - "cmp_a_b": 1 + "a": "0x168", + "b": "0x3c7", + "cmp_a_b": -1 }, { - "a": "0x31c", - "b": "0x2b", + "a": "0x68", + "b": "0x57", "cmp_a_b": 1 }, { - "a": "0x926", - "b": "0x1020", + "a": "0x0", + "b": "0x4", "cmp_a_b": -1 }, { - "a": "0x36b", - "b": "0x4c5", + "a": "0x5", + "b": "0x18d1", "cmp_a_b": -1 }, { - "a": "0x28", - "b": "0x372", + "a": "0xb", + "b": "0x319d", "cmp_a_b": -1 }, { - "a": "0x4", - "b": "0x8f5", - "cmp_a_b": -1 + "a": "0x6db", + "b": "0x6db", + "cmp_a_b": 0 }, { - "a": "0x2", - "b": "0xcf92", + "a": "0xd5", + "b": "0x13b", "cmp_a_b": -1 }, { - "a": "0x6dc", - "b": "0x64", + "a": "0x2a", + "b": "0xa", + "cmp_a_b": 1 + }, + { + "a": "0x8", + "b": "0x4", "cmp_a_b": 1 }, { "a": "0x9", - "b": "0x94a3", - "cmp_a_b": -1 + "b": "0x8", + "cmp_a_b": 1 }, { - "a": "0xa89", - "b": "0x958", + "a": "0xa", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x267", + "b": "0x6", "cmp_a_b": 1 }, { - "a": "0x804", - "b": "0x557", + "a": "0x4", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0xbc", - "b": "0x15a2", + "a": "0x59", + "b": "0xab5f", "cmp_a_b": -1 }, { - "a": "0x6", - "b": "0x3a81", + "a": "0x8", + "b": "0x35", "cmp_a_b": -1 }, { @@ -116,898 +126,923 @@ "cmp_a_b": 1 }, { - "a": "0x791", - "b": "0x1", + "a": "0x33e", + "b": "0x14e", "cmp_a_b": 1 }, { - "a": "0x9a", - "b": "0x4e", + "a": "0x1", + "b": "0x3", + "cmp_a_b": -1 + }, + { + "a": "0xda", + "b": "0x19", "cmp_a_b": 1 }, { - "a": "0x1", - "b": "0x1", + "a": "0x4a", + "b": "0x4a", "cmp_a_b": 0 }, { - "a": "0x4", - "b": "0x30ee", + "a": "0x2a", + "b": "0x1d42", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x15", + "a": "0x0", + "b": "0x2", "cmp_a_b": -1 }, { - "a": "0xd9", - "b": "0x179", - "cmp_a_b": -1 + "a": "0x15", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0xa", - "cmp_a_b": -1 + "a": "0x1e", + "b": "0x1e", + "cmp_a_b": 0 }, { - "a": "0x1b7", - "b": "0x7", + "a": "0x58", + "b": "0x5", "cmp_a_b": 1 }, { - "a": "0xc1d", - "b": "0xc1d", - "cmp_a_b": 0 + "a": "0x75", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x46c", - "b": "0x46c", - "cmp_a_b": 0 + "a": "0x2cb", + "b": "0x26", + "cmp_a_b": 1 }, { - "a": "0x4", - "b": "0x331", - "cmp_a_b": -1 + "a": "0x4a", + "b": "0x4a", + "cmp_a_b": 0 }, { - "a": "0xd", - "b": "0x13", + "a": "0x3", + "b": "0x9d7", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x1", + "a": "0x10", + "b": "0x10", "cmp_a_b": 0 }, { - "a": "0x7", - "b": "0x1d", - "cmp_a_b": -1 + "a": "0x1a", + "b": "0x3", + "cmp_a_b": 1 + }, + { + "a": "0xef", + "b": "0x70", + "cmp_a_b": 1 }, { - "a": "0xa49", - "b": "0x11f1", + "a": "0x0", + "b": "0x97f", "cmp_a_b": -1 }, { - "a": "0x1f", - "b": "0x0", + "a": "0x224", + "b": "0x224", + "cmp_a_b": 0 + }, + { + "a": "0x328", + "b": "0x19", "cmp_a_b": 1 }, { - "a": "0x10", - "b": "0x56", + "a": "0xbd5", + "b": "0x12448", "cmp_a_b": -1 }, { - "a": "0x70", - "b": "0xf40", + "a": "0x33", + "b": "0xf958", "cmp_a_b": -1 }, { - "a": "0xf6", - "b": "0xf6", - "cmp_a_b": 0 + "a": "0x27", + "b": "0x226b", + "cmp_a_b": -1 }, { - "a": "0x8", - "b": "0x137", + "a": "0xa7d", + "b": "0x12c8", "cmp_a_b": -1 }, { - "a": "0x217", - "b": "0x27", + "a": "0x2", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x344", - "b": "0x9", + "a": "0x194", + "b": "0x76", "cmp_a_b": 1 }, { - "a": "0xc1", - "b": "0xc1", - "cmp_a_b": 0 + "a": "0xc", + "b": "0x6d", + "cmp_a_b": -1 }, { - "a": "0xe56", - "b": "0x29", + "a": "0x871", + "b": "0x4f", "cmp_a_b": 1 }, { - "a": "0x186", - "b": "0x186", - "cmp_a_b": 0 + "a": "0x16", + "b": "0x52", + "cmp_a_b": -1 }, { - "a": "0x51", - "b": "0x51", - "cmp_a_b": 0 + "a": "0xe0", + "b": "0xf", + "cmp_a_b": 1 }, { - "a": "0xdd", - "b": "0x18d7c", + "a": "0x76", + "b": "0x7fc", "cmp_a_b": -1 }, { - "a": "0x4bf", - "b": "0x19", - "cmp_a_b": 1 - }, - { - "a": "0x2d8", - "b": "0x1ce", + "a": "0x59d", + "b": "0x1", "cmp_a_b": 1 }, { - "a": "0x11", - "b": "0x1", + "a": "0xd17", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x11094", + "a": "0x14", + "b": "0x90fc", "cmp_a_b": -1 }, { - "a": "0x78f", - "b": "0x78f", + "a": "0x114", + "b": "0x114", "cmp_a_b": 0 }, { - "a": "0x155", - "b": "0xa2b3", + "a": "0x10", + "b": "0x29", "cmp_a_b": -1 }, { - "a": "0x16", - "b": "0x3f2", + "a": "0xdf", + "b": "0x11136", + "cmp_a_b": -1 + }, + { + "a": "0x49c", + "b": "0x65", + "cmp_a_b": 1 + }, + { + "a": "0x3ab", + "b": "0x1779", "cmp_a_b": -1 }, { "a": "0x0", - "b": "0x2aeb", + "b": "0x1aa", "cmp_a_b": -1 }, { - "a": "0x10", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x19", + "b": "0x11fe", + "cmp_a_b": -1 }, { - "a": "0xdc3", - "b": "0x281", + "a": "0x5", + "b": "0x2", "cmp_a_b": 1 }, { - "a": "0x35", - "b": "0x0", + "a": "0x7", + "b": "0x5", "cmp_a_b": 1 }, { - "a": "0x4d", - "b": "0x4d", + "a": "0x3a", + "b": "0x3a", "cmp_a_b": 0 }, { - "a": "0xf", - "b": "0xae82", - "cmp_a_b": -1 - }, - { - "a": "0x442", - "b": "0x11a", + "a": "0x8c", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x22", - "b": "0x9385", + "a": "0x6", + "b": "0xb1e", "cmp_a_b": -1 }, { - "a": "0xb7", - "b": "0x743", + "a": "0x9c", + "b": "0x6b3f", "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0x1", - "cmp_a_b": 1 - }, - { - "a": "0x4a", - "b": "0x3d8", + "a": "0x65e", + "b": "0x1966", "cmp_a_b": -1 }, { - "a": "0x21", - "b": "0x15", + "a": "0x4f8", + "b": "0x44", "cmp_a_b": 1 }, { - "a": "0x24", - "b": "0x6698", - "cmp_a_b": -1 + "a": "0xdf", + "b": "0x4", + "cmp_a_b": 1 }, { - "a": "0x724", - "b": "0x4", + "a": "0x1", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x5", - "b": "0x5", - "cmp_a_b": 0 + "a": "0x2dd", + "b": "0x1d718", + "cmp_a_b": -1 }, { - "a": "0x6", - "b": "0x56", + "a": "0x2", + "b": "0x4", "cmp_a_b": -1 }, { "a": "0x3", - "b": "0x5", - "cmp_a_b": -1 + "b": "0x1", + "cmp_a_b": 1 }, { - "a": "0x11d", - "b": "0xc0a4", + "a": "0x43", + "b": "0x605", "cmp_a_b": -1 }, { - "a": "0x3f", - "b": "0xa", + "a": "0x2", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x6", - "b": "0x9bc1", + "a": "0x0", + "b": "0x16", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x283f", + "a": "0x0", + "b": "0x8", "cmp_a_b": -1 }, { - "a": "0x7f", - "b": "0x2", + "a": "0x864", + "b": "0x15", "cmp_a_b": 1 }, { - "a": "0x560", - "b": "0x560", - "cmp_a_b": 0 + "a": "0xd8", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x1", - "b": "0x1", - "cmp_a_b": 0 + "a": "0xca", + "b": "0x578", + "cmp_a_b": -1 }, { - "a": "0xf", - "b": "0x8e5", + "a": "0x2", + "b": "0x14b3", "cmp_a_b": -1 }, { - "a": "0x42", - "b": "0x360", + "a": "0xd", + "b": "0x32", "cmp_a_b": -1 }, { - "a": "0x329", - "b": "0x19f6", + "a": "0x45e", + "b": "0x127e", "cmp_a_b": -1 }, { - "a": "0x5", - "b": "0x41a7", + "a": "0x7", + "b": "0x1d", "cmp_a_b": -1 }, { - "a": "0x2d0", - "b": "0x58cb", + "a": "0x25", + "b": "0x11d9f", "cmp_a_b": -1 }, { - "a": "0xec", - "b": "0xec", - "cmp_a_b": 0 + "a": "0x1", + "b": "0x5a1c", + "cmp_a_b": -1 }, { - "a": "0x43", - "b": "0x6239", + "a": "0x97", + "b": "0x139", "cmp_a_b": -1 }, { - "a": "0xc", - "b": "0x2", - "cmp_a_b": 1 + "a": "0xa76", + "b": "0x15ee", + "cmp_a_b": -1 }, { - "a": "0x2", + "a": "0x56", + "b": "0x148fe", + "cmp_a_b": -1 + }, + { + "a": "0x4b1", "b": "0x1", "cmp_a_b": 1 }, { "a": "0x0", - "b": "0x664a", + "b": "0x29f", "cmp_a_b": -1 }, { - "a": "0x10f", - "b": "0x7f", - "cmp_a_b": 1 + "a": "0x97", + "b": "0xe7", + "cmp_a_b": -1 }, { - "a": "0x18", - "b": "0x18", - "cmp_a_b": 0 + "a": "0x0", + "b": "0x1", + "cmp_a_b": -1 }, { - "a": "0x3", - "b": "0x3", - "cmp_a_b": 0 + "a": "0x395", + "b": "0xc88", + "cmp_a_b": -1 }, { - "a": "0xbc", - "b": "0x3b", + "a": "0x591", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x27d", - "b": "0x52d", - "cmp_a_b": -1 - }, - { - "a": "0xc0", - "b": "0xc26", + "a": "0x1a", + "b": "0x24", "cmp_a_b": -1 }, { - "a": "0x2c1", - "b": "0x3020", + "a": "0x19", + "b": "0x4d", "cmp_a_b": -1 }, { - "a": "0x58a", - "b": "0x1c4", + "a": "0x73a", + "b": "0x195", "cmp_a_b": 1 }, { - "a": "0x4", - "b": "0x1d17", + "a": "0x28d", + "b": "0x1cd6", "cmp_a_b": -1 }, { - "a": "0x2c7", - "b": "0x2c7", - "cmp_a_b": 0 + "a": "0x6", + "b": "0x2df3", + "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x9f96", + "a": "0xd17", + "b": "0x666c", "cmp_a_b": -1 }, { - "a": "0xff", - "b": "0x3", - "cmp_a_b": 1 + "a": "0x8d", + "b": "0xf8b", + "cmp_a_b": -1 }, { - "a": "0x657", - "b": "0x8d", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x1034", + "cmp_a_b": -1 }, { "a": "0x2", - "b": "0xce5a", + "b": "0x2e8", "cmp_a_b": -1 }, { - "a": "0x1f", - "b": "0x1f", - "cmp_a_b": 0 - }, - { - "a": "0x1c1", - "b": "0x1c1", - "cmp_a_b": 0 - }, - { - "a": "0x12d", - "b": "0x12d", - "cmp_a_b": 0 + "a": "0x326", + "b": "0x712", + "cmp_a_b": -1 }, { - "a": "0xbb0", - "b": "0x2", + "a": "0x77", + "b": "0x1a", "cmp_a_b": 1 }, { - "a": "0x1", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x7", + "b": "0x3f7c", + "cmp_a_b": -1 }, { - "a": "0x38c", - "b": "0x38c", - "cmp_a_b": 0 + "a": "0xb", + "b": "0x3", + "cmp_a_b": 1 }, { - "a": "0x5", - "b": "0xf75b", + "a": "0x0", + "b": "0x8e9", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x0", + "a": "0x563", + "b": "0x6", "cmp_a_b": 1 }, { - "a": "0x4f5", - "b": "0x39", - "cmp_a_b": 1 + "a": "0x3a", + "b": "0x1dc78", + "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0x108", + "a": "0xc1", + "b": "0x115", "cmp_a_b": -1 }, { - "a": "0x97b", - "b": "0x8", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 }, { - "a": "0x2", - "b": "0x9954", + "a": "0x4", + "b": "0x1712", "cmp_a_b": -1 }, { - "a": "0x324", - "b": "0x1c7e", + "a": "0x26", + "b": "0x695", "cmp_a_b": -1 }, { - "a": "0x20", - "b": "0x20", + "a": "0x30", + "b": "0x30", "cmp_a_b": 0 }, { - "a": "0x1", - "b": "0x1", - "cmp_a_b": 0 + "a": "0x0", + "b": "0x1b105", + "cmp_a_b": -1 }, { - "a": "0x20", - "b": "0x5", - "cmp_a_b": 1 + "a": "0xc", + "b": "0x389", + "cmp_a_b": -1 }, { - "a": "0xc7", - "b": "0xc7", + "a": "0x2f", + "b": "0x2f", "cmp_a_b": 0 }, { - "a": "0x15", - "b": "0x7b", + "a": "0x2", + "b": "0x3", "cmp_a_b": -1 }, { - "a": "0x1ab", - "b": "0x1f", + "a": "0xf0", + "b": "0xa", "cmp_a_b": 1 }, { - "a": "0xa94", - "b": "0x2ce", - "cmp_a_b": 1 + "a": "0xf", + "b": "0x1142", + "cmp_a_b": -1 }, { - "a": "0x2ec", - "b": "0x2120", + "a": "0xf", + "b": "0x1b4", "cmp_a_b": -1 }, { - "a": "0x7", - "b": "0x5", - "cmp_a_b": 1 + "a": "0x4d", + "b": "0x65", + "cmp_a_b": -1 }, { - "a": "0xc8", - "b": "0x1", + "a": "0x1ec", + "b": "0x84", "cmp_a_b": 1 }, { - "a": "0xab", - "b": "0xab", - "cmp_a_b": 0 - }, - { - "a": "0x255", - "b": "0x6", + "a": "0x995", + "b": "0x64", "cmp_a_b": 1 }, { - "a": "0x32", - "b": "0xf", + "a": "0x40d", + "b": "0x2", "cmp_a_b": 1 }, { - "a": "0xa", - "b": "0x8213", + "a": "0x13", + "b": "0xc8", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x3b3", + "a": "0x9", + "b": "0xdf", "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0x1c9d", - "cmp_a_b": -1 + "a": "0x15", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x8d", - "b": "0x8d", - "cmp_a_b": 0 + "a": "0x21", + "b": "0x15", + "cmp_a_b": 1 }, { - "a": "0xc", - "b": "0x12", + "a": "0x2", + "b": "0xb6a5", "cmp_a_b": -1 }, { - "a": "0x3", - "b": "0x1c9", + "a": "0x5", + "b": "0x1f", "cmp_a_b": -1 }, { - "a": "0xb8", - "b": "0x6e8", + "a": "0x2", + "b": "0x6783", "cmp_a_b": -1 }, { - "a": "0x289", - "b": "0x4f", + "a": "0x0", + "b": "0xfb1d", + "cmp_a_b": -1 + }, + { + "a": "0x942", + "b": "0x68", "cmp_a_b": 1 }, { - "a": "0x3", - "b": "0x422", + "a": "0x47", + "b": "0xd7", "cmp_a_b": -1 }, { - "a": "0x103", - "b": "0x85", + "a": "0x5ce", + "b": "0x211", "cmp_a_b": 1 }, { - "a": "0x143", - "b": "0x2", + "a": "0x11d", + "b": "0x1", "cmp_a_b": 1 }, { - "a": "0x1ec", - "b": "0x1ec", + "a": "0x0", + "b": "0x0", "cmp_a_b": 0 }, { - "a": "0x1", - "b": "0x1", + "a": "0x69d", + "b": "0x69d", "cmp_a_b": 0 }, { - "a": "0x1", - "b": "0x1879", + "a": "0x761", + "b": "0x77b5", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x1", - "cmp_a_b": 0 - }, - { - "a": "0xff5", - "b": "0x148b", + "a": "0x15", + "b": "0x387d", "cmp_a_b": -1 }, { - "a": "0x206", - "b": "0xe4", - "cmp_a_b": 1 - }, - { - "a": "0x4", - "b": "0xa8", + "a": "0x0", + "b": "0x455e", "cmp_a_b": -1 }, { - "a": "0x16b", - "b": "0xb21d", + "a": "0x3", + "b": "0x146c5", "cmp_a_b": -1 }, { - "a": "0x2c6", - "b": "0x62", - "cmp_a_b": 1 + "a": "0x52f", + "b": "0x52f", + "cmp_a_b": 0 }, { "a": "0x5", - "b": "0x1", + "b": "0x2a", + "cmp_a_b": -1 + }, + { + "a": "0x4d", + "b": "0x11", "cmp_a_b": 1 }, { - "a": "0x7", - "b": "0x7", + "a": "0xe06", + "b": "0xe06", "cmp_a_b": 0 }, { "a": "0x1", - "b": "0x537", - "cmp_a_b": -1 + "b": "0x1", + "cmp_a_b": 0 }, { - "a": "0x15f", - "b": "0x78d3", + "a": "0x7", + "b": "0x1acd", "cmp_a_b": -1 }, { - "a": "0x2d", - "b": "0x1328b", - "cmp_a_b": -1 + "a": "0xe4", + "b": "0xe4", + "cmp_a_b": 0 }, { - "a": "0x8eb", - "b": "0x142", - "cmp_a_b": 1 + "a": "0x1f", + "b": "0x113", + "cmp_a_b": -1 }, { - "a": "0x6", - "b": "0x0", + "a": "0x9eb", + "b": "0x1", "cmp_a_b": 1 }, { "a": "0x1", - "b": "0x2975", + "b": "0x2d4", "cmp_a_b": -1 }, { - "a": "0xc89", - "b": "0xd1", + "a": "0x1ae", + "b": "0x16a", "cmp_a_b": 1 }, { - "a": "0x2", - "b": "0x2c", + "a": "0x2f", + "b": "0xa99", "cmp_a_b": -1 }, { - "a": "0xe", - "b": "0xe", - "cmp_a_b": 0 + "a": "0x6", + "b": "0x2", + "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x1e3", + "a": "0x32", + "b": "0x1dca", "cmp_a_b": -1 }, { - "a": "0x5", - "b": "0x27", + "a": "0x0", + "b": "0x413", "cmp_a_b": -1 }, { - "a": "0x8", - "b": "0x1", - "cmp_a_b": 1 + "a": "0xc1", + "b": "0x31d6", + "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x1", + "a": "0x5", + "b": "0x5", "cmp_a_b": 0 }, { - "a": "0xd6c", - "b": "0x2", - "cmp_a_b": 1 + "a": "0x270", + "b": "0x1de8", + "cmp_a_b": -1 }, { - "a": "0x246", - "b": "0xb3", - "cmp_a_b": 1 + "a": "0x10", + "b": "0x184", + "cmp_a_b": -1 }, { - "a": "0x22", - "b": "0x1", - "cmp_a_b": 1 + "a": "0x1a2", + "b": "0x2911", + "cmp_a_b": -1 }, { - "a": "0x3a", - "b": "0xec85", + "a": "0x14f", + "b": "0x1b8c", "cmp_a_b": -1 }, { - "a": "0x25", - "b": "0x24b", + "a": "0x1", + "b": "0x84", + "cmp_a_b": -1 + }, + { + "a": "0x5", + "b": "0x84e6", "cmp_a_b": -1 }, { "a": "0xb", - "b": "0x22a", + "b": "0x24fc", "cmp_a_b": -1 }, { - "a": "0x6", - "b": "0x3", + "a": "0xf", + "b": "0xb", "cmp_a_b": 1 }, { - "a": "0x7", - "b": "0x946", + "a": "0x3", + "b": "0x1df", "cmp_a_b": -1 }, { - "a": "0x48", - "b": "0x7d3", - "cmp_a_b": -1 + "a": "0x34", + "b": "0x34", + "cmp_a_b": 0 }, { - "a": "0x1cc", - "b": "0xf8d", - "cmp_a_b": -1 + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 }, { - "a": "0x6", - "b": "0x1c0", + "a": "0x71", + "b": "0x113a", "cmp_a_b": -1 }, { - "a": "0x6", - "b": "0x7", + "a": "0x28", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x145", + "b": "0x145", + "cmp_a_b": 0 + }, + { + "a": "0x37", + "b": "0x37", + "cmp_a_b": 0 + }, + { + "a": "0x3", + "b": "0x3", + "cmp_a_b": 0 + }, + { + "a": "0x1", + "b": "0x1d0", "cmp_a_b": -1 }, { - "a": "0x63", - "b": "0x1", + "a": "0x297", + "b": "0x2", "cmp_a_b": 1 }, { - "a": "0x1a", + "a": "0x7", "b": "0x2", "cmp_a_b": 1 }, { - "a": "0x299", - "b": "0xe30", + "a": "0xe32", + "b": "0x4", + "cmp_a_b": 1 + }, + { + "a": "0x16", + "b": "0x184", "cmp_a_b": -1 }, { - "a": "0x1ba", - "b": "0x40", + "a": "0xa7", + "b": "0x11", "cmp_a_b": 1 }, { - "a": "0xbb", - "b": "0x4858", + "a": "0x4", + "b": "0x5", "cmp_a_b": -1 }, { - "a": "0x13", - "b": "0x0", - "cmp_a_b": 1 + "a": "0xbd", + "b": "0x514", + "cmp_a_b": -1 }, { - "a": "0xe4", - "b": "0x12767", + "a": "0x11d", + "b": "0x405", "cmp_a_b": -1 }, { - "a": "0xd", - "b": "0x4d5", + "a": "0x2", + "b": "0x6afb", "cmp_a_b": -1 }, { - "a": "0x3a1", - "b": "0x2", + "a": "0x1b9", + "b": "0xa", "cmp_a_b": 1 }, { "a": "0x0", - "b": "0x39", - "cmp_a_b": -1 + "b": "0x0", + "cmp_a_b": 0 }, { - "a": "0x1a2", - "b": "0xaae", + "a": "0x8", + "b": "0x38e", "cmp_a_b": -1 }, { - "a": "0x13", - "b": "0x5", + "a": "0x2ac", + "b": "0x7", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x0", - "cmp_a_b": 0 + "a": "0x30", + "b": "0x74c3", + "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x2", + "a": "0xc3", + "b": "0x98a", "cmp_a_b": -1 }, { - "a": "0xcaf", - "b": "0xc", + "a": "0x21", + "b": "0x1", "cmp_a_b": 1 }, { - "a": "0x13", - "b": "0x1b639", + "a": "0x1fd", + "b": "0x1864", "cmp_a_b": -1 }, { - "a": "0x18", - "b": "0x20b", + "a": "0x0", + "b": "0x6", "cmp_a_b": -1 }, { - "a": "0x12e", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x3", + "b": "0x192fc", + "cmp_a_b": -1 }, { - "a": "0x1e", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x1", + "b": "0x15", + "cmp_a_b": -1 }, { - "a": "0x55f", - "b": "0x5", - "cmp_a_b": 1 + "a": "0x5", + "b": "0x430", + "cmp_a_b": -1 }, { - "a": "0x43b", - "b": "0x1", - "cmp_a_b": 1 + "a": "0x72f", + "b": "0x72f", + "cmp_a_b": 0 }, { - "a": "0x4", - "b": "0x7", + "a": "0x1a", + "b": "0xa9", "cmp_a_b": -1 }, { - "a": "0x8c3", - "b": "0xdb", + "a": "0xdd", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x95", - "b": "0x15f3", + "a": "0x1", + "b": "0x10", "cmp_a_b": -1 }, { @@ -1016,708 +1051,663 @@ "cmp_a_b": 0 }, { - "a": "0xb", - "b": "0x42", + "a": "0x0", + "b": "0x14", "cmp_a_b": -1 }, { - "a": "0x1c", - "b": "0x66", + "a": "0x43", + "b": "0x5fb", "cmp_a_b": -1 }, { - "a": "0x6fe", - "b": "0x233f", + "a": "0x2d", + "b": "0x3670", "cmp_a_b": -1 }, { - "a": "0x8", - "b": "0x1335", + "a": "0x77", + "b": "0x17ae", "cmp_a_b": -1 }, { - "a": "0x3d", - "b": "0x3d", - "cmp_a_b": 0 - }, - { - "a": "0x1", - "b": "0x2485", + "a": "0x48", + "b": "0x1be5c", "cmp_a_b": -1 }, { - "a": "0x12c", - "b": "0x37", - "cmp_a_b": 1 + "a": "0x3e5", + "b": "0x720", + "cmp_a_b": -1 }, { - "a": "0xca9", - "b": "0x30", - "cmp_a_b": 1 + "a": "0x2", + "b": "0x3928", + "cmp_a_b": -1 }, { - "a": "0x88a", - "b": "0xbfa", + "a": "0x3", + "b": "0x7cb", "cmp_a_b": -1 }, { - "a": "0x7fa", - "b": "0x1a18", + "a": "0x322", + "b": "0xd86", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x123e0", + "a": "0x3e", + "b": "0x60", "cmp_a_b": -1 }, { - "a": "0xb6", - "b": "0x4a2", + "a": "0x34c", + "b": "0x3b9", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x6c", + "cmp_a_b": -1 }, { - "a": "0x8e4", - "b": "0x1112e", + "a": "0x3", + "b": "0x1ed5", "cmp_a_b": -1 }, { - "a": "0x289", - "b": "0x283", + "a": "0x93e", + "b": "0x15", "cmp_a_b": 1 }, { - "a": "0xa89", - "b": "0x931", - "cmp_a_b": 1 + "a": "0x5", + "b": "0x5", + "cmp_a_b": 0 }, { - "a": "0x2", - "b": "0x4e0", + "a": "0xdb", + "b": "0x357", "cmp_a_b": -1 }, { - "a": "0x9", - "b": "0x1cba8", + "a": "0x61", + "b": "0x1a9e0", "cmp_a_b": -1 }, { - "a": "0xa3b", - "b": "0x1c792", + "a": "0x7", + "b": "0x2f0", "cmp_a_b": -1 }, { - "a": "0x29f", - "b": "0x1aec", + "a": "0x6c", + "b": "0x3a3", "cmp_a_b": -1 }, { - "a": "0xf4", - "b": "0x46", - "cmp_a_b": 1 + "a": "0x2", + "b": "0x136b0", + "cmp_a_b": -1 }, { - "a": "0x6a", - "b": "0x32eb", + "a": "0x5a3", + "b": "0x138ed", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0xbd4", - "cmp_a_b": -1 + "a": "0xab2", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0xb9", - "b": "0x12", + "a": "0xfb0", + "b": "0xc0f", "cmp_a_b": 1 }, { - "a": "0x9", - "b": "0x2", + "a": "0xa", + "b": "0x5", "cmp_a_b": 1 }, { - "a": "0x1e7", - "b": "0x3490", + "a": "0x0", + "b": "0x1d15b", "cmp_a_b": -1 }, { - "a": "0xb48", - "b": "0xdb26", - "cmp_a_b": -1 + "a": "0xf", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x9be", - "b": "0x237c", - "cmp_a_b": -1 + "a": "0x7", + "b": "0x7", + "cmp_a_b": 0 }, { - "a": "0x2", - "b": "0x2", + "a": "0x1e9", + "b": "0x1e9", "cmp_a_b": 0 }, { - "a": "0x0", - "b": "0x5f", + "a": "0x1f", + "b": "0x15c", "cmp_a_b": -1 }, { - "a": "0xb5", - "b": "0x1", + "a": "0x2a", + "b": "0x1e", "cmp_a_b": 1 }, { - "a": "0x3e2", - "b": "0x2f", - "cmp_a_b": 1 + "a": "0x3", + "b": "0x6", + "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x1", + "a": "0x3", + "b": "0x11", "cmp_a_b": -1 }, { - "a": "0x11", - "b": "0x11", + "a": "0x5", + "b": "0x5", "cmp_a_b": 0 }, { - "a": "0x2", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x1fb", + "b": "0xd8e7", + "cmp_a_b": -1 }, { - "a": "0x468", - "b": "0xa7ad", + "a": "0x26", + "b": "0xcfbe", "cmp_a_b": -1 }, { - "a": "0x242", - "b": "0x45d", + "a": "0x1", + "b": "0x4bb", "cmp_a_b": -1 }, { - "a": "0xc", - "b": "0xc", - "cmp_a_b": 0 + "a": "0x3b0", + "b": "0x14a7", + "cmp_a_b": -1 }, { - "a": "0x3", - "b": "0x1fc2", + "a": "0xf", + "b": "0x389", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x0", - "cmp_a_b": 0 + "a": "0x3", + "b": "0xdf", + "cmp_a_b": -1 }, { - "a": "0x1e7", - "b": "0x3a", - "cmp_a_b": 1 + "a": "0x3b", + "b": "0x26b", + "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0xa", + "a": "0x13", + "b": "0xaf", "cmp_a_b": -1 }, { - "a": "0x152", - "b": "0xef7a", + "a": "0x3f", + "b": "0x1edf", "cmp_a_b": -1 }, { - "a": "0x3", - "b": "0x1", - "cmp_a_b": 1 - }, - { - "a": "0xcf", - "b": "0xcf", - "cmp_a_b": 0 + "a": "0x2e1", + "b": "0xbb8f", + "cmp_a_b": -1 }, { - "a": "0x383", - "b": "0x383", + "a": "0x403", + "b": "0x403", "cmp_a_b": 0 }, { - "a": "0x2c", - "b": "0x6", + "a": "0xe", + "b": "0x3", "cmp_a_b": 1 }, { - "a": "0xe8", - "b": "0x25c", - "cmp_a_b": -1 - }, - { - "a": "0x11", - "b": "0x9a", - "cmp_a_b": -1 - }, - { - "a": "0x2a", - "b": "0x1b88f", + "a": "0xd", + "b": "0x873", "cmp_a_b": -1 }, { - "a": "0x2", + "a": "0x0", "b": "0x0", - "cmp_a_b": 1 - }, - { - "a": "0x1", - "b": "0x83", - "cmp_a_b": -1 + "cmp_a_b": 0 }, { - "a": "0xd", - "b": "0x2117", - "cmp_a_b": -1 + "a": "0x2cc", + "b": "0x2cc", + "cmp_a_b": 0 }, { - "a": "0x13", + "a": "0x1", "b": "0x1", - "cmp_a_b": 1 + "cmp_a_b": 0 }, { - "a": "0x712", - "b": "0x2f6", + "a": "0xb", + "b": "0x1", "cmp_a_b": 1 }, { - "a": "0x1e", - "b": "0x1e", + "a": "0x1", + "b": "0x1", "cmp_a_b": 0 }, { - "a": "0x4", - "b": "0x4", - "cmp_a_b": 0 + "a": "0x35", + "b": "0x12f21", + "cmp_a_b": -1 }, { - "a": "0x4", - "b": "0x1", - "cmp_a_b": 1 + "a": "0x2", + "b": "0x1c", + "cmp_a_b": -1 }, { - "a": "0x64", - "b": "0x2", + "a": "0x68e", + "b": "0x9", "cmp_a_b": 1 }, { - "a": "0x514", - "b": "0x15", + "a": "0x9f", + "b": "0x3d", "cmp_a_b": 1 }, { - "a": "0x2", - "b": "0x12dcf", + "a": "0x7", + "b": "0x1abd2", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x1d", + "a": "0xf", + "b": "0x2187", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x27f", + "a": "0x1", + "b": "0xed", "cmp_a_b": -1 }, { - "a": "0x4", - "b": "0x11", + "a": "0xf9", + "b": "0xfc7", "cmp_a_b": -1 }, { - "a": "0xb4", - "b": "0x88a5", + "a": "0x4", + "b": "0x8", "cmp_a_b": -1 }, { "a": "0x1", - "b": "0x7", + "b": "0x71f5", "cmp_a_b": -1 }, { - "a": "0x6", - "b": "0x777c", + "a": "0x7f", + "b": "0x580", "cmp_a_b": -1 }, { - "a": "0x6d", - "b": "0x6d", - "cmp_a_b": 0 - }, - { - "a": "0x1", - "b": "0x1ff49", + "a": "0x7", + "b": "0xb69f", "cmp_a_b": -1 }, { "a": "0x0", - "b": "0x1", + "b": "0x592", "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0xaef", - "cmp_a_b": -1 + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 }, { - "a": "0x1", - "b": "0x32", + "a": "0x5ca", + "b": "0x1d9de", "cmp_a_b": -1 }, { - "a": "0x3", - "b": "0x2", + "a": "0x64a", + "b": "0x54", "cmp_a_b": 1 }, { - "a": "0xef", - "b": "0xaa", - "cmp_a_b": 1 + "a": "0x3c", + "b": "0x7bf", + "cmp_a_b": -1 }, { - "a": "0x6", - "b": "0x6b", + "a": "0x9", + "b": "0x1ed8", "cmp_a_b": -1 }, { - "a": "0x413", - "b": "0x4f", + "a": "0xd", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x10", - "cmp_a_b": -1 - }, - { - "a": "0x0", - "b": "0x14f77", - "cmp_a_b": -1 + "a": "0x74", + "b": "0x1f", + "cmp_a_b": 1 }, { - "a": "0x5c8", - "b": "0x5c8", + "a": "0x121", + "b": "0x121", "cmp_a_b": 0 }, { - "a": "0x1", - "b": "0x66", - "cmp_a_b": -1 - }, - { - "a": "0x178", - "b": "0x37", - "cmp_a_b": 1 - }, - { - "a": "0x87", - "b": "0x179", + "a": "0x83", + "b": "0xcfe", "cmp_a_b": -1 }, { - "a": "0x11", - "b": "0x690", + "a": "0x0", + "b": "0x1bc2a", "cmp_a_b": -1 }, { - "a": "0x5", - "b": "0x3ca", + "a": "0x13", + "b": "0xe1", "cmp_a_b": -1 }, { - "a": "0xc3", - "b": "0xc1b", - "cmp_a_b": -1 + "a": "0x1ad", + "b": "0x4", + "cmp_a_b": 1 }, { - "a": "0x1a9", - "b": "0x55d", - "cmp_a_b": -1 + "a": "0x7e1", + "b": "0x7e1", + "cmp_a_b": 0 }, { - "a": "0x23", - "b": "0x10f2", - "cmp_a_b": -1 + "a": "0xef", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x285", - "b": "0x7", + "a": "0x511", + "b": "0xe", "cmp_a_b": 1 }, { - "a": "0x6", - "b": "0x43", - "cmp_a_b": -1 + "a": "0x62d", + "b": "0x37e", + "cmp_a_b": 1 }, { - "a": "0x1c7", - "b": "0x4", + "a": "0x584", + "b": "0x3", "cmp_a_b": 1 }, { - "a": "0x4c6", - "b": "0x9c23", + "a": "0x0", + "b": "0x1a9", "cmp_a_b": -1 }, { - "a": "0x40", - "b": "0xb5e1", + "a": "0x3", + "b": "0x135", "cmp_a_b": -1 }, { - "a": "0x1e6", - "b": "0x1d55a", - "cmp_a_b": -1 + "a": "0x283", + "b": "0xd8", + "cmp_a_b": 1 }, { - "a": "0xa71", - "b": "0x1e799", - "cmp_a_b": -1 + "a": "0xb78", + "b": "0xe6", + "cmp_a_b": 1 + }, + { + "a": "0xf06", + "b": "0xb36", + "cmp_a_b": 1 }, { - "a": "0x126", + "a": "0x28", "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x15e", - "b": "0xe62", + "a": "0x33", + "b": "0x447", "cmp_a_b": -1 }, { - "a": "0x5", - "b": "0x3", - "cmp_a_b": 1 + "a": "0x1", + "b": "0x167", + "cmp_a_b": -1 }, { - "a": "0xa5", - "b": "0x1", - "cmp_a_b": 1 + "a": "0x3c", + "b": "0x3c", + "cmp_a_b": 0 }, { - "a": "0x380", - "b": "0xcf", - "cmp_a_b": 1 + "a": "0x4f", + "b": "0x4f", + "cmp_a_b": 0 }, { - "a": "0x8", - "b": "0xcdfd", + "a": "0x2b", + "b": "0x220", "cmp_a_b": -1 }, { - "a": "0x3cd", - "b": "0x3cd", + "a": "0x0", + "b": "0x0", "cmp_a_b": 0 }, { - "a": "0x847", - "b": "0x56fb", + "a": "0x3", + "b": "0x231", "cmp_a_b": -1 }, { - "a": "0x49", - "b": "0x106e", + "a": "0xa", + "b": "0x1d65", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x8455", + "a": "0xc", + "b": "0xf2e5", "cmp_a_b": -1 }, { - "a": "0x7f9", - "b": "0x3ff", - "cmp_a_b": 1 + "a": "0x6f", + "b": "0xe23a", + "cmp_a_b": -1 }, { - "a": "0x43", - "b": "0x3", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 }, { - "a": "0x3b", - "b": "0x8", + "a": "0x5", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x3", - "b": "0x5", + "a": "0x1d3", + "b": "0x312", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x2bd", + "a": "0x8e", + "b": "0x1b6f0", "cmp_a_b": -1 }, { - "a": "0x6", - "b": "0x37c7", + "a": "0x5", + "b": "0x30", "cmp_a_b": -1 }, { - "a": "0x52a", - "b": "0x2d3", - "cmp_a_b": 1 - }, - { - "a": "0x0", - "b": "0x1ca8", + "a": "0x5", + "b": "0x2f", "cmp_a_b": -1 }, { - "a": "0x137", - "b": "0x74f8", + "a": "0x5", + "b": "0x215", "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0x2", - "cmp_a_b": 0 + "a": "0x8", + "b": "0x16cc", + "cmp_a_b": -1 }, { - "a": "0x42d", - "b": "0x157", + "a": "0x1fc", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x44", - "b": "0x35e", + "a": "0x0", + "b": "0x1e69", "cmp_a_b": -1 }, { - "a": "0x15", - "b": "0xf", + "a": "0x6c", + "b": "0x5", "cmp_a_b": 1 }, { - "a": "0x1e0", - "b": "0x44", + "a": "0xb5b", + "b": "0x2", "cmp_a_b": 1 }, { - "a": "0x2", - "b": "0x16b", + "a": "0xf", + "b": "0x19", "cmp_a_b": -1 }, { - "a": "0xea", - "b": "0xa2", - "cmp_a_b": 1 + "a": "0x0", + "b": "0xcc1", + "cmp_a_b": -1 }, { - "a": "0x1c", - "b": "0x6a35", - "cmp_a_b": -1 + "a": "0xc0e", + "b": "0x72", + "cmp_a_b": 1 }, { - "a": "0xb", - "b": "0x11", + "a": "0x1e", + "b": "0x6ca", "cmp_a_b": -1 }, { - "a": "0xb15", - "b": "0x5c", - "cmp_a_b": 1 + "a": "0x385", + "b": "0x19886", + "cmp_a_b": -1 }, { - "a": "0x47", - "b": "0x312", + "a": "0x2f0", + "b": "0x155b6", "cmp_a_b": -1 }, { - "a": "0x113", - "b": "0x28", + "a": "0x3e7", + "b": "0x3d3", "cmp_a_b": 1 }, { - "a": "0x2", - "b": "0xe", + "a": "0x11a", + "b": "0x1ea", "cmp_a_b": -1 }, { - "a": "0xe06", + "a": "0x0", "b": "0x0", - "cmp_a_b": 1 + "cmp_a_b": 0 }, { "a": "0x5", - "b": "0x2eef", + "b": "0x104", "cmp_a_b": -1 }, { - "a": "0x6", - "b": "0x6", + "a": "0x421", + "b": "0x421", "cmp_a_b": 0 }, { - "a": "0x1", - "b": "0xede0", + "a": "0x6", + "b": "0xdcff", "cmp_a_b": -1 }, { - "a": "0x1db", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x3", + "b": "0x20", + "cmp_a_b": -1 }, { - "a": "0x472", - "b": "0x472", - "cmp_a_b": 0 + "a": "0x1b", + "b": "0x164c", + "cmp_a_b": -1 }, { "a": "0x7", - "b": "0x34e9", + "b": "0x1d0bc", "cmp_a_b": -1 }, { - "a": "0x17", - "b": "0x17", + "a": "0x8", + "b": "0x8", "cmp_a_b": 0 }, { - "a": "0x15c", - "b": "0x76d", + "a": "0x0", + "b": "0x583", "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0x18", + "a": "0x28", + "b": "0x1f8", "cmp_a_b": -1 }, { - "a": "0xae", - "b": "0x359", + "a": "0x352", + "b": "0x546d", "cmp_a_b": -1 }, { - "a": "0x5", - "b": "0x3", - "cmp_a_b": 1 + "a": "0x184", + "b": "0x75ec", + "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0xd4", - "cmp_a_b": -1 + "a": "0x3ad", + "b": "0x9", + "cmp_a_b": 1 }, { - "a": "0x1f", - "b": "0x34", + "a": "0xfb7", + "b": "0x30c8", "cmp_a_b": -1 }, { - "a": "0x6", - "b": "0xee42", + "a": "0x3", + "b": "0x4", "cmp_a_b": -1 }, { @@ -1726,4021 +1716,4046 @@ "cmp_a_b": 0 }, { - "a": "0x240", - "b": "0x13", - "cmp_a_b": 1 + "a": "0x4", + "b": "0x86ec", + "cmp_a_b": -1 }, { - "a": "0x6", - "b": "0x490", + "a": "0x4", + "b": "0x8c", "cmp_a_b": -1 }, { - "a": "0xc59", - "b": "0x22", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x3a0", + "cmp_a_b": -1 }, { - "a": "0x10e", - "b": "0x1", + "a": "0x11c", + "b": "0x14", "cmp_a_b": 1 }, { - "a": "0x32a", - "b": "0xb7d", + "a": "0x2ac", + "b": "0x312", "cmp_a_b": -1 }, { - "a": "0x4", - "b": "0x3193", + "a": "0x41", + "b": "0x123ec", "cmp_a_b": -1 }, { - "a": "0x649", - "b": "0x13ca", + "a": "0x646", + "b": "0x144e8", "cmp_a_b": -1 }, { - "a": "0x870", - "b": "0xa6", - "cmp_a_b": 1 - }, - { - "a": "0xaa", - "b": "0xc", - "cmp_a_b": 1 + "a": "0x3", + "b": "0x3", + "cmp_a_b": 0 }, { - "a": "0x7", - "b": "0x2ba", + "a": "0x6", + "b": "0xb50", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0xb03", - "cmp_a_b": -1 + "a": "0x3f", + "b": "0x6", + "cmp_a_b": 1 }, { - "a": "0x128", - "b": "0x96", - "cmp_a_b": 1 + "a": "0x7d", + "b": "0xa4", + "cmp_a_b": -1 }, { - "a": "0xe86", - "b": "0xc93", + "a": "0x1a0", + "b": "0x11", "cmp_a_b": 1 }, { - "a": "0x67", - "b": "0xb0", + "a": "0x276", + "b": "0x368", "cmp_a_b": -1 }, { - "a": "0x471", - "b": "0x1c42", + "a": "0xfa1", + "b": "0x6c30", "cmp_a_b": -1 }, { - "a": "0xae6", - "b": "0x248", - "cmp_a_b": 1 + "a": "0x113", + "b": "0xd79", + "cmp_a_b": -1 }, { - "a": "0x15d", - "b": "0x15d", - "cmp_a_b": 0 + "a": "0x0", + "b": "0xef6", + "cmp_a_b": -1 }, { - "a": "0x4be", - "b": "0x7f", + "a": "0x8", + "b": "0x3", "cmp_a_b": 1 }, { - "a": "0x1", - "b": "0x79f", + "a": "0x0", + "b": "0xfbaf", "cmp_a_b": -1 }, { - "a": "0x17", - "b": "0x167ae", + "a": "0x40", + "b": "0xd821", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x27", + "a": "0xa92", + "b": "0xaa36", "cmp_a_b": -1 }, { - "a": "0x24f", - "b": "0x1", + "a": "0xc9a", + "b": "0x43", "cmp_a_b": 1 }, { - "a": "0x47", - "b": "0x441", + "a": "0x2b1", + "b": "0x770", "cmp_a_b": -1 }, { - "a": "0x42c", - "b": "0x188", - "cmp_a_b": 1 + "a": "0x527", + "b": "0xe18", + "cmp_a_b": -1 }, { - "a": "0x3b4", - "b": "0x6", - "cmp_a_b": 1 + "a": "0xc", + "b": "0xf49", + "cmp_a_b": -1 }, { - "a": "0x6c", - "b": "0x6c", - "cmp_a_b": 0 + "a": "0x29", + "b": "0x158", + "cmp_a_b": -1 }, { - "a": "0x35", - "b": "0x1", + "a": "0x9d5", + "b": "0x57", "cmp_a_b": 1 }, { - "a": "0xfb", - "b": "0x844d", + "a": "0x2ff", + "b": "0xb5d5", "cmp_a_b": -1 }, { - "a": "0x23", - "b": "0x23", - "cmp_a_b": 0 + "a": "0x16", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x18", - "b": "0x324b", + "a": "0xa", + "b": "0x193", "cmp_a_b": -1 }, { - "a": "0x3b7", - "b": "0x29d", - "cmp_a_b": 1 + "a": "0x68", + "b": "0x11be", + "cmp_a_b": -1 }, { - "a": "0x3d", - "b": "0x3d", - "cmp_a_b": 0 + "a": "0x2", + "b": "0x1e0", + "cmp_a_b": -1 }, { - "a": "0xf", - "b": "0x562", - "cmp_a_b": -1 + "a": "0x7d", + "b": "0x4", + "cmp_a_b": 1 }, { - "a": "0x2ce", - "b": "0x2ce", - "cmp_a_b": 0 + "a": "0x4ba", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x4c", - "b": "0x130", - "cmp_a_b": -1 + "a": "0x1a9", + "b": "0xb", + "cmp_a_b": 1 }, { - "a": "0x29b", - "b": "0x1049", + "a": "0x0", + "b": "0x25d", "cmp_a_b": -1 }, { - "a": "0x140", - "b": "0x518", + "a": "0x50", + "b": "0x1654a", "cmp_a_b": -1 }, { - "a": "0x12", - "b": "0x3c", + "a": "0x5", + "b": "0x17", "cmp_a_b": -1 }, { - "a": "0x4ae", - "b": "0x1a62a", - "cmp_a_b": -1 + "a": "0x14", + "b": "0x5", + "cmp_a_b": 1 }, { - "a": "0xfb", - "b": "0x3ce9", - "cmp_a_b": -1 + "a": "0x741", + "b": "0x1", + "cmp_a_b": 1 }, { - "a": "0x164", - "b": "0x0", + "a": "0xa0", + "b": "0x6", "cmp_a_b": 1 }, { - "a": "0xb", - "b": "0x18ffb", - "cmp_a_b": -1 + "a": "0xb87", + "b": "0xb87", + "cmp_a_b": 0 }, { - "a": "0x11", - "b": "0x20f", + "a": "0x8", + "b": "0x3", + "cmp_a_b": 1 + }, + { + "a": "0x565", + "b": "0x5d9f", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x7", + "a": "0x633", + "b": "0xfd7", "cmp_a_b": -1 }, { - "a": "0x25", - "b": "0x0", + "a": "0x190", + "b": "0x5", "cmp_a_b": 1 }, { - "a": "0xca", - "b": "0x973", + "a": "0x261", + "b": "0x5274", "cmp_a_b": -1 }, { - "a": "0x5f", - "b": "0x0", - "cmp_a_b": 1 - }, - { - "a": "0x492", - "b": "0x471", + "a": "0xb1f", + "b": "0x6", "cmp_a_b": 1 }, { - "a": "0x20", - "b": "0x27", + "a": "0x38", + "b": "0x1c49", "cmp_a_b": -1 }, { - "a": "0x3a", - "b": "0x52", + "a": "0xa6e", + "b": "0x753a", "cmp_a_b": -1 }, { - "a": "0x6", - "b": "0x10", + "a": "0xe", + "b": "0x13e4", "cmp_a_b": -1 }, { - "a": "0x3b7", - "b": "0x1", - "cmp_a_b": 1 + "a": "0xaa", + "b": "0xaa", + "cmp_a_b": 0 }, { - "a": "0x4f", - "b": "0x1b", - "cmp_a_b": 1 + "a": "0x3", + "b": "0x59", + "cmp_a_b": -1 }, { - "a": "0x32", - "b": "0x10a1", + "a": "0x2", + "b": "0x16", "cmp_a_b": -1 }, { - "a": "0x13", - "b": "0x22", + "a": "0x1dc", + "b": "0x1f1", "cmp_a_b": -1 }, { - "a": "0x62", + "a": "0x21d", + "b": "0x44", + "cmp_a_b": 1 + }, + { + "a": "0xb7", "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x399", - "b": "0x10776", + "a": "0x97", + "b": "0x391", "cmp_a_b": -1 }, { - "a": "0x69", - "b": "0x7", + "a": "0xcc2", + "b": "0xf", "cmp_a_b": 1 }, { - "a": "0xe6f", - "b": "0x2dbc", - "cmp_a_b": -1 - }, - { - "a": "0x195", - "b": "0x2", + "a": "0x25a", + "b": "0x84", "cmp_a_b": 1 }, { - "a": "0x43", - "b": "0x14e", + "a": "0x6", + "b": "0x1a497", "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0x2", - "cmp_a_b": 0 + "a": "0x935", + "b": "0x59", + "cmp_a_b": 1 }, { - "a": "0x1", - "b": "0x1994", + "a": "0x1d9", + "b": "0x1122", "cmp_a_b": -1 }, { - "a": "0x9", - "b": "0x6a", + "a": "0x3", + "b": "0x7e", "cmp_a_b": -1 }, { - "a": "0x68b", - "b": "0xb", + "a": "0x298", + "b": "0x4e", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x2", + "a": "0x7", + "b": "0x22", "cmp_a_b": -1 }, { - "a": "0x2a", - "b": "0x4", + "a": "0x95", + "b": "0x9", "cmp_a_b": 1 }, { - "a": "0x45", - "b": "0x45", + "a": "0x115", + "b": "0x115", "cmp_a_b": 0 }, { - "a": "0x100", - "b": "0x171", - "cmp_a_b": -1 + "a": "0x258", + "b": "0x1c0", + "cmp_a_b": 1 }, { - "a": "0x3", - "b": "0x47f6", + "a": "0x4f9", + "b": "0x151d8", "cmp_a_b": -1 }, { - "a": "0x1b", - "b": "0x10f", - "cmp_a_b": -1 + "a": "0x5f2", + "b": "0x5f2", + "cmp_a_b": 0 }, { - "a": "0x342", - "b": "0x72d", - "cmp_a_b": -1 + "a": "0x293", + "b": "0x24", + "cmp_a_b": 1 }, { - "a": "0x7b", - "b": "0xb10", + "a": "0x3", + "b": "0x1d6", "cmp_a_b": -1 }, { - "a": "0x458", - "b": "0x1ac", + "a": "0x932", + "b": "0x3", "cmp_a_b": 1 }, { - "a": "0x33b", - "b": "0x2540", - "cmp_a_b": -1 - }, - { - "a": "0x3c6", - "b": "0xa5", + "a": "0x743", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0xdf", - "b": "0xdf", - "cmp_a_b": 0 + "a": "0xb", + "b": "0x17", + "cmp_a_b": -1 }, { - "a": "0xc48", - "b": "0xa", - "cmp_a_b": 1 - }, - { - "a": "0x8", - "b": "0x0", - "cmp_a_b": 1 - }, - { - "a": "0x9ad", - "b": "0x15607", + "a": "0xf", + "b": "0x1d7", "cmp_a_b": -1 }, { - "a": "0x357", - "b": "0x357", - "cmp_a_b": 0 + "a": "0x142", + "b": "0x1669", + "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x461a", + "a": "0xc5", + "b": "0x256", "cmp_a_b": -1 }, { - "a": "0x3a4", - "b": "0x48", + "a": "0x86", + "b": "0x3", "cmp_a_b": 1 }, { - "a": "0x7e", - "b": "0x214c", + "a": "0x7b", + "b": "0x163a9", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0xb", + "a": "0x1", + "b": "0x165", "cmp_a_b": -1 }, { - "a": "0x5", - "b": "0x91c", + "a": "0xc3", + "b": "0xc4a4", "cmp_a_b": -1 }, { - "a": "0x43", - "b": "0x63c5", + "a": "0x4", + "b": "0x8", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x0", + "a": "0x2c", + "b": "0x13", "cmp_a_b": 1 }, { - "a": "0x900", - "b": "0x31", + "a": "0xf8e", + "b": "0xed7", "cmp_a_b": 1 }, { - "a": "0x8a4", - "b": "0x36", - "cmp_a_b": 1 + "a": "0x6e", + "b": "0x50c5", + "cmp_a_b": -1 }, { - "a": "0xd6f", - "b": "0x186d6", - "cmp_a_b": -1 + "a": "0x1c5", + "b": "0xe", + "cmp_a_b": 1 }, { - "a": "0xf", - "b": "0x32ef", + "a": "0x15", + "b": "0x400", "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0x50c", + "a": "0x0", + "b": "0x5f", "cmp_a_b": -1 }, { - "a": "0x3", - "b": "0xcb2", + "a": "0x7b0", + "b": "0x733d", "cmp_a_b": -1 }, { - "a": "0x272", - "b": "0x4c8c", - "cmp_a_b": -1 + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 }, { - "a": "0x37", - "b": "0x1fdd", + "a": "0xc", + "b": "0x25e", "cmp_a_b": -1 }, { - "a": "0x2ad", - "b": "0x229", + "a": "0x327", + "b": "0xa", "cmp_a_b": 1 }, { - "a": "0x1", - "b": "0x1", - "cmp_a_b": 0 + "a": "0x7", + "b": "0x3c", + "cmp_a_b": -1 }, { - "a": "0x3", - "b": "0x189b3", - "cmp_a_b": -1 + "a": "0x21b", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0xd", - "b": "0x65", + "a": "0x12", + "b": "0x1c4", "cmp_a_b": -1 }, { - "a": "0xe45", - "b": "0xe45", - "cmp_a_b": 0 + "a": "0x6f1", + "b": "0x1", + "cmp_a_b": 1 }, { - "a": "0x832", - "b": "0x832", - "cmp_a_b": 0 + "a": "0x2ef", + "b": "0xf7b1", + "cmp_a_b": -1 }, { - "a": "0x1b", - "b": "0x78", - "cmp_a_b": -1 + "a": "0xc0d", + "b": "0x2e", + "cmp_a_b": 1 }, { - "a": "0xb11", - "b": "0x4adb", + "a": "0x21", + "b": "0x2fd", "cmp_a_b": -1 }, { - "a": "0x3", - "b": "0xb", + "a": "0x0", + "b": "0x2c", "cmp_a_b": -1 }, { - "a": "0x3ea", - "b": "0x13", + "a": "0xd4e", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x1", - "b": "0x23a4", + "a": "0xf0", + "b": "0x48", + "cmp_a_b": 1 + }, + { + "a": "0x4", + "b": "0x18ed", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x4740", + "a": "0x42", + "b": "0x405", "cmp_a_b": -1 }, { - "a": "0x993", - "b": "0x1803", + "a": "0x1d", + "b": "0x241", "cmp_a_b": -1 }, { "a": "0x3", - "b": "0x51", + "b": "0xc8", "cmp_a_b": -1 }, { - "a": "0xf", - "b": "0x2", - "cmp_a_b": 1 + "a": "0x40", + "b": "0xa76d", + "cmp_a_b": -1 }, { - "a": "0x18", - "b": "0x97", + "a": "0x72", + "b": "0x3e0", "cmp_a_b": -1 }, { - "a": "0x6", - "b": "0x19e", + "a": "0x1d", + "b": "0x36", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x30c", + "a": "0x0", + "b": "0x5", "cmp_a_b": -1 }, { - "a": "0x4e", - "b": "0x9f3", - "cmp_a_b": -1 + "a": "0xe", + "b": "0xe", + "cmp_a_b": 0 }, { - "a": "0x1c", - "b": "0xa6a5", + "a": "0x7", + "b": "0x22", "cmp_a_b": -1 }, { - "a": "0x11", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x4", + "b": "0x3b9d", + "cmp_a_b": -1 }, { - "a": "0xd3c", - "b": "0x12", + "a": "0x78", + "b": "0x3e", "cmp_a_b": 1 }, { "a": "0x2", - "b": "0x26c", + "b": "0x335", "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0x2", - "cmp_a_b": 0 + "a": "0x311", + "b": "0x3", + "cmp_a_b": 1 }, { - "a": "0x9ea", - "b": "0x128", + "a": "0xcf", + "b": "0x7", "cmp_a_b": 1 }, { - "a": "0xa4b", - "b": "0xa4b", - "cmp_a_b": 0 + "a": "0x0", + "b": "0x1", + "cmp_a_b": -1 }, { - "a": "0x7", - "b": "0x876d", + "a": "0x0", + "b": "0x3e", "cmp_a_b": -1 }, { - "a": "0x47d", - "b": "0x1", - "cmp_a_b": 1 + "a": "0x28e", + "b": "0x28e", + "cmp_a_b": 0 }, { - "a": "0x4f", - "b": "0x5d", - "cmp_a_b": -1 + "a": "0x4", + "b": "0x4", + "cmp_a_b": 0 }, { - "a": "0x5d5", - "b": "0x103f", + "a": "0x4ed", + "b": "0xeece", "cmp_a_b": -1 }, { - "a": "0x92", - "b": "0xb6", - "cmp_a_b": -1 + "a": "0xf2", + "b": "0x26", + "cmp_a_b": 1 }, { - "a": "0xd5b", - "b": "0x66d", - "cmp_a_b": 1 + "a": "0x3b", + "b": "0x111f7", + "cmp_a_b": -1 }, { - "a": "0x19", - "b": "0xc", - "cmp_a_b": 1 + "a": "0x17f", + "b": "0x17f", + "cmp_a_b": 0 }, { - "a": "0x56", - "b": "0x10369", + "a": "0x6f", + "b": "0x19d0", "cmp_a_b": -1 }, { - "a": "0x10", - "b": "0x5", - "cmp_a_b": 1 + "a": "0x976", + "b": "0xc89", + "cmp_a_b": -1 }, { - "a": "0x61", - "b": "0x3", - "cmp_a_b": 1 + "a": "0x1bf", + "b": "0x1bf", + "cmp_a_b": 0 }, { - "a": "0x36", - "b": "0x4e3", + "a": "0x0", + "b": "0x51", "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0x62", + "a": "0xfb", + "b": "0x147", "cmp_a_b": -1 }, { - "a": "0x12", - "b": "0x1", - "cmp_a_b": 1 - }, - { - "a": "0x97", - "b": "0x2", - "cmp_a_b": 1 + "a": "0x6", + "b": "0xf", + "cmp_a_b": -1 }, { - "a": "0x133", - "b": "0xaf3", + "a": "0x1a", + "b": "0xda", "cmp_a_b": -1 }, { - "a": "0x597", - "b": "0x3", - "cmp_a_b": 1 + "a": "0x3", + "b": "0x883", + "cmp_a_b": -1 }, { - "a": "0xde9", - "b": "0x2d3", - "cmp_a_b": 1 + "a": "0xe", + "b": "0xe", + "cmp_a_b": 0 }, { - "a": "0x6e9", - "b": "0xd", + "a": "0x18a", + "b": "0x117", "cmp_a_b": 1 }, { - "a": "0x1a4", - "b": "0x2", + "a": "0x12", + "b": "0x1", "cmp_a_b": 1 }, { - "a": "0x4c5", - "b": "0x1601", + "a": "0xade", + "b": "0x13a10", "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0x0", + "a": "0x9", + "b": "0x3", "cmp_a_b": 1 }, { - "a": "0x3b0", - "b": "0x3fe", + "a": "0x0", + "b": "0x39", "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0xcce8", - "cmp_a_b": -1 + "a": "0x165", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x52e", - "b": "0xae9f", + "a": "0xf", + "b": "0x6c5", "cmp_a_b": -1 }, { - "a": "0x6", - "b": "0x159", + "a": "0x1", + "b": "0xe2", "cmp_a_b": -1 }, { - "a": "0x1c1", - "b": "0x9a4d", + "a": "0x0", + "b": "0x152d", "cmp_a_b": -1 }, { - "a": "0xce5", - "b": "0x1", + "a": "0x70", + "b": "0x60", "cmp_a_b": 1 }, { - "a": "0x36", - "b": "0x18", - "cmp_a_b": 1 + "a": "0x4", + "b": "0x26", + "cmp_a_b": -1 }, { - "a": "0x150", - "b": "0x2c06", + "a": "0x15", + "b": "0x3481", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x386", + "a": "0x7e", + "b": "0x60e", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x1", - "cmp_a_b": -1 + "a": "0x1c", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x6", - "b": "0x7e4c", + "a": "0x167", + "b": "0x2251", "cmp_a_b": -1 }, { - "a": "0xdd", - "b": "0x9", + "a": "0x4a", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x9", - "b": "0xd", + "a": "0x6c", + "b": "0xaf5d", "cmp_a_b": -1 }, { "a": "0x1", - "b": "0xae24", + "b": "0x98", "cmp_a_b": -1 }, { - "a": "0x4b1", - "b": "0xe4", - "cmp_a_b": 1 + "a": "0x3d0", + "b": "0xd0ce", + "cmp_a_b": -1 }, { - "a": "0x6be", - "b": "0x8", + "a": "0xa78", + "b": "0x1fb", "cmp_a_b": 1 }, { - "a": "0x27", - "b": "0x39", + "a": "0x172", + "b": "0x18711", "cmp_a_b": -1 }, { - "a": "0x1c6", - "b": "0x10c3", - "cmp_a_b": -1 + "a": "0x131", + "b": "0x14", + "cmp_a_b": 1 }, { - "a": "0x3", - "b": "0x3", + "a": "0x2c", + "b": "0x2c", "cmp_a_b": 0 }, - { - "a": "0x49", - "b": "0xfa", - "cmp_a_b": -1 - }, { "a": "0x2", - "b": "0xaec", + "b": "0x18", "cmp_a_b": -1 }, { - "a": "0x4", - "b": "0x483", + "a": "0x28", + "b": "0x3", + "cmp_a_b": 1 + }, + { + "a": "0x2", + "b": "0xae3", "cmp_a_b": -1 }, { - "a": "0x647", - "b": "0xd", + "a": "0x7cc", + "b": "0x7", "cmp_a_b": 1 }, { - "a": "0x88d", - "b": "0x88d", - "cmp_a_b": 0 + "a": "0xee", + "b": "0x1d", + "cmp_a_b": 1 }, { - "a": "0x5", - "b": "0xa1", + "a": "0x58", + "b": "0x6932", "cmp_a_b": -1 }, { - "a": "0xce", - "b": "0x75d", - "cmp_a_b": -1 + "a": "0xd7", + "b": "0x1a", + "cmp_a_b": 1 }, { - "a": "0x1", - "b": "0xb", - "cmp_a_b": -1 + "a": "0xa7", + "b": "0xa7", + "cmp_a_b": 0 }, { - "a": "0xcf7", - "b": "0xc", + "a": "0xd1", + "b": "0x31", "cmp_a_b": 1 }, + { + "a": "0x4ee", + "b": "0x67a", + "cmp_a_b": -1 + }, { "a": "0x0", - "b": "0x4d4", + "b": "0x2a", "cmp_a_b": -1 }, { - "a": "0xb", - "b": "0x9cc", + "a": "0x7", + "b": "0x184eb", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0x7e08", "cmp_a_b": -1 }, { - "a": "0x5c3", - "b": "0x5c3", + "a": "0xa40", + "b": "0xa40", "cmp_a_b": 0 }, { - "a": "0x3e", - "b": "0xf", + "a": "0x4f5", + "b": "0xc", "cmp_a_b": 1 }, { - "a": "0x852", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x266", + "b": "0x39c", + "cmp_a_b": -1 }, { - "a": "0x49", - "b": "0x5", + "a": "0x1e7", + "b": "0x39", "cmp_a_b": 1 }, { - "a": "0xe", - "b": "0x374f", + "a": "0x5", + "b": "0x1b714", "cmp_a_b": -1 }, { - "a": "0xf4f", - "b": "0x1432", + "a": "0x97", + "b": "0x3d5", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x973", + "a": "0x6", + "b": "0x90", "cmp_a_b": -1 }, { - "a": "0x3e4", - "b": "0x5", - "cmp_a_b": 1 + "a": "0xef", + "b": "0xef", + "cmp_a_b": 0 }, { - "a": "0x9", - "b": "0x5", - "cmp_a_b": 1 + "a": "0x3", + "b": "0x7f8", + "cmp_a_b": -1 }, { - "a": "0x56", - "b": "0x21", + "a": "0x3ec", + "b": "0x197", "cmp_a_b": 1 }, { - "a": "0x2", - "b": "0x3", + "a": "0x0", + "b": "0x164", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x40d", - "cmp_a_b": -1 + "a": "0x9c3", + "b": "0x3", + "cmp_a_b": 1 }, { - "a": "0x8", - "b": "0x2ca9", + "a": "0x1c0", + "b": "0x5d0", "cmp_a_b": -1 }, { - "a": "0xb5", - "b": "0x14b4", + "a": "0xa5", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 + }, + { + "a": "0x2", + "b": "0x48", "cmp_a_b": -1 }, { - "a": "0xaf8", - "b": "0x1", - "cmp_a_b": 1 + "a": "0xa", + "b": "0x1bc7", + "cmp_a_b": -1 }, { - "a": "0x94", - "b": "0x717", + "a": "0xe", + "b": "0x81", "cmp_a_b": -1 }, { - "a": "0x23b", - "b": "0x2", + "a": "0x82c", + "b": "0x5", "cmp_a_b": 1 }, { - "a": "0x9", - "b": "0x38f", + "a": "0x31", + "b": "0x6bce", "cmp_a_b": -1 }, { - "a": "0x169", - "b": "0x1", - "cmp_a_b": 1 + "a": "0xd4", + "b": "0x3c6", + "cmp_a_b": -1 }, { - "a": "0xc8", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x39", + "b": "0x107", + "cmp_a_b": -1 }, { - "a": "0x7", - "b": "0x5", + "a": "0xf78", + "b": "0x15", "cmp_a_b": 1 }, { "a": "0x5", - "b": "0x2031", - "cmp_a_b": -1 + "b": "0x5", + "cmp_a_b": 0 }, { - "a": "0x4b", - "b": "0x11f7", + "a": "0x153", + "b": "0x9f13", "cmp_a_b": -1 }, { - "a": "0xe82", - "b": "0xbd", + "a": "0xe", + "b": "0x2", "cmp_a_b": 1 }, { - "a": "0x7", - "b": "0x24", + "a": "0x2", + "b": "0x16", "cmp_a_b": -1 }, { - "a": "0x2a", - "b": "0x1", - "cmp_a_b": 1 + "a": "0x26", + "b": "0x26", + "cmp_a_b": 0 }, { - "a": "0xa", - "b": "0x53f", + "a": "0x2d", + "b": "0x64bb", "cmp_a_b": -1 }, { - "a": "0x4a", - "b": "0x0", + "a": "0x4c", + "b": "0x15", "cmp_a_b": 1 }, { "a": "0x18", - "b": "0x100", + "b": "0x6b03", "cmp_a_b": -1 }, { "a": "0x3", - "b": "0x7", - "cmp_a_b": -1 - }, - { - "a": "0x0", - "b": "0x633b", - "cmp_a_b": -1 + "b": "0x3", + "cmp_a_b": 0 }, { - "a": "0x1", - "b": "0xc86c", - "cmp_a_b": -1 + "a": "0x5f", + "b": "0xd", + "cmp_a_b": 1 }, { - "a": "0x28d", - "b": "0x13", + "a": "0x3f9", + "b": "0x3", "cmp_a_b": 1 }, { - "a": "0x7b4", - "b": "0x40", + "a": "0x3", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x1e", - "b": "0x2ca", + "a": "0x547", + "b": "0x7a2", "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0xf11", - "cmp_a_b": -1 + "a": "0x914", + "b": "0x1ef", + "cmp_a_b": 1 }, { - "a": "0x7", - "b": "0x1", + "a": "0x43", + "b": "0xa", "cmp_a_b": 1 }, { - "a": "0x93", - "b": "0x2cc", + "a": "0x1a", + "b": "0x40e2", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x1be7", + "a": "0x7", + "b": "0x2a", "cmp_a_b": -1 }, { - "a": "0x5", - "b": "0xe5", - "cmp_a_b": -1 + "a": "0x1e7", + "b": "0x1d", + "cmp_a_b": 1 }, { - "a": "0x984", - "b": "0x3", + "a": "0x28", + "b": "0x25", "cmp_a_b": 1 }, { - "a": "0xd", - "b": "0x8a22", + "a": "0x2", + "b": "0x43", "cmp_a_b": -1 }, { - "a": "0xa8", - "b": "0x4ab7", + "a": "0x6a", + "b": "0x44e9", "cmp_a_b": -1 }, { - "a": "0x28", - "b": "0x44a3", + "a": "0xee", + "b": "0x83cd", "cmp_a_b": -1 }, { - "a": "0x15f", - "b": "0x1", + "a": "0x395", + "b": "0x5b7", + "cmp_a_b": -1 + }, + { + "a": "0x365", + "b": "0x166", "cmp_a_b": 1 }, { - "a": "0xd", - "b": "0x14", + "a": "0x3", + "b": "0x155", "cmp_a_b": -1 }, { - "a": "0x2f", - "b": "0x4c", + "a": "0x0", + "b": "0x2503", "cmp_a_b": -1 }, { - "a": "0x331", - "b": "0x4bb", + "a": "0x2ff", + "b": "0x4c8f", "cmp_a_b": -1 }, { - "a": "0x47", - "b": "0x1739", + "a": "0x4", + "b": "0x16d", "cmp_a_b": -1 }, { - "a": "0x187", - "b": "0x6", + "a": "0x92", + "b": "0x92", + "cmp_a_b": 0 + }, + { + "a": "0x0", + "b": "0x65", + "cmp_a_b": -1 + }, + { + "a": "0x259", + "b": "0x1", "cmp_a_b": 1 }, { - "a": "0x6f8", + "a": "0x173", "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x2c0", - "b": "0x1", - "cmp_a_b": 1 + "a": "0x3", + "b": "0x99b", + "cmp_a_b": -1 }, { - "a": "0x1ae", - "b": "0x3ad4", + "a": "0x6", + "b": "0x6", + "cmp_a_b": 0 + }, + { + "a": "0x0", + "b": "0x1045", "cmp_a_b": -1 }, { - "a": "0x95", + "a": "0x7b", "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x30", - "b": "0x1", + "a": "0x91", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x1", - "b": "0x12b1", - "cmp_a_b": -1 + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 }, { - "a": "0x9cb", - "b": "0x2", + "a": "0x2b3", + "b": "0x8", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x17b4", + "a": "0x73", + "b": "0x10d7", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x6ac1", + "a": "0x75c", + "b": "0xbef", "cmp_a_b": -1 }, { - "a": "0x20", - "b": "0x2", + "a": "0x7f", + "b": "0x6b", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x59", + "a": "0x5", + "b": "0x34b", "cmp_a_b": -1 }, { - "a": "0x233", - "b": "0x16ef9", + "a": "0x14", + "b": "0x11c", "cmp_a_b": -1 }, { - "a": "0xb9", - "b": "0x6", - "cmp_a_b": 1 - }, - { - "a": "0x24", - "b": "0x178d8", + "a": "0x3", + "b": "0xe8", "cmp_a_b": -1 }, { - "a": "0x405", - "b": "0xfd", - "cmp_a_b": 1 + "a": "0x7", + "b": "0x8bc", + "cmp_a_b": -1 }, { - "a": "0x20", - "b": "0x7", + "a": "0x174", + "b": "0x94", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x2", + "a": "0x5", + "b": "0x15", "cmp_a_b": -1 }, { - "a": "0xf", - "b": "0x6", + "a": "0x10", + "b": "0x2", "cmp_a_b": 1 }, { - "a": "0x3e", - "b": "0x3e", - "cmp_a_b": 0 + "a": "0x629", + "b": "0x2", + "cmp_a_b": 1 }, { - "a": "0x9f9", - "b": "0x9f9", - "cmp_a_b": 0 + "a": "0xd", + "b": "0x1fb", + "cmp_a_b": -1 }, { - "a": "0x4", - "b": "0xc34a", + "a": "0x11", + "b": "0xc8e", "cmp_a_b": -1 }, { - "a": "0x24", - "b": "0x137d9", + "a": "0x2e", + "b": "0x70", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x3", + "a": "0x15", + "b": "0x10dc", "cmp_a_b": -1 }, { - "a": "0x36d", - "b": "0x23", + "a": "0x459", + "b": "0x166", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0xe5", + "a": "0x95f", + "b": "0x3696", "cmp_a_b": -1 }, { - "a": "0xe0", - "b": "0xe90d", + "a": "0x3", + "b": "0x2b2", "cmp_a_b": -1 }, { - "a": "0x5f", + "a": "0x17", "b": "0x93", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x20", + "a": "0xd", + "b": "0xa", + "cmp_a_b": 1 + }, + { + "a": "0x6cf", + "b": "0x7355", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x1", - "cmp_a_b": 0 + "a": "0x33", + "b": "0x243e", + "cmp_a_b": -1 }, { - "a": "0x554", - "b": "0x5", + "a": "0x4", + "b": "0xca", + "cmp_a_b": -1 + }, + { + "a": "0x65", + "b": "0x3", "cmp_a_b": 1 }, { - "a": "0x6a", - "b": "0x2", + "a": "0x6f", + "b": "0x26", "cmp_a_b": 1 }, { - "a": "0x2", - "b": "0xa4", - "cmp_a_b": -1 + "a": "0x14a", + "b": "0xee", + "cmp_a_b": 1 }, { - "a": "0x187", - "b": "0x88c9", - "cmp_a_b": -1 + "a": "0x2bf", + "b": "0x1", + "cmp_a_b": 1 }, { - "a": "0x3", - "b": "0x19e", - "cmp_a_b": -1 + "a": "0x1a1", + "b": "0xf", + "cmp_a_b": 1 }, { - "a": "0x43", - "b": "0x43", - "cmp_a_b": 0 + "a": "0xfe5", + "b": "0x5", + "cmp_a_b": 1 }, { - "a": "0x7", - "b": "0x96fa", + "a": "0x0", + "b": "0x5c2", "cmp_a_b": -1 }, { - "a": "0xe", - "b": "0xaecf", + "a": "0x30", + "b": "0x7", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x608", "cmp_a_b": -1 }, { - "a": "0x13f", - "b": "0x2528", + "a": "0x34", + "b": "0xdbc", "cmp_a_b": -1 }, { - "a": "0xa", - "b": "0x1", + "a": "0xe00", + "b": "0x39a", "cmp_a_b": 1 }, { - "a": "0x1d9", + "a": "0x0", "b": "0x5", - "cmp_a_b": 1 + "cmp_a_b": -1 }, { - "a": "0x3a", - "b": "0x15645", + "a": "0x195", + "b": "0xbe0", "cmp_a_b": -1 }, { - "a": "0x587", - "b": "0x38af", + "a": "0x2", + "b": "0x215", "cmp_a_b": -1 }, { - "a": "0xe29", - "b": "0xe29", - "cmp_a_b": 0 + "a": "0x1c", + "b": "0x4164", + "cmp_a_b": -1 }, { - "a": "0x3", - "b": "0x3", - "cmp_a_b": 0 + "a": "0x0", + "b": "0x2", + "cmp_a_b": -1 }, { - "a": "0x7", - "b": "0x13602", + "a": "0x0", + "b": "0x37f", "cmp_a_b": -1 }, { - "a": "0xeba", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x1a0", + "b": "0x8cc9", + "cmp_a_b": -1 }, { - "a": "0x1a", - "b": "0x18", + "a": "0xb68", + "b": "0x8", "cmp_a_b": 1 }, { - "a": "0x835", - "b": "0x835", - "cmp_a_b": 0 - }, - { - "a": "0x197", + "a": "0x3", "b": "0x1", "cmp_a_b": 1 }, { - "a": "0x6", - "b": "0x633e", + "a": "0xa", + "b": "0x119b", "cmp_a_b": -1 }, { - "a": "0x8", - "b": "0x6da", - "cmp_a_b": -1 + "a": "0x2fd", + "b": "0x27b", + "cmp_a_b": 1 }, { - "a": "0x5", - "b": "0x7a", + "a": "0x305", + "b": "0x792c", "cmp_a_b": -1 }, { - "a": "0x11a", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x33e", + "b": "0x35d1", + "cmp_a_b": -1 }, { - "a": "0xf", - "b": "0x282", + "a": "0x3", + "b": "0x40", "cmp_a_b": -1 }, { - "a": "0xc21", - "b": "0x8d7d", + "a": "0x0", + "b": "0x10a39", "cmp_a_b": -1 }, { - "a": "0x5e", - "b": "0x33", - "cmp_a_b": 1 + "a": "0xc", + "b": "0x166", + "cmp_a_b": -1 }, { - "a": "0x14", - "b": "0x0", + "a": "0x79", + "b": "0x1", "cmp_a_b": 1 }, { - "a": "0x36", - "b": "0x163b", + "a": "0x975", + "b": "0xc74", "cmp_a_b": -1 }, { - "a": "0x702", - "b": "0xc97d", + "a": "0x5c5", + "b": "0x7bb5", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x1a65", + "a": "0x2", + "b": "0x3", "cmp_a_b": -1 }, { - "a": "0x1a", - "b": "0x1fca7", - "cmp_a_b": -1 + "a": "0x37", + "b": "0x37", + "cmp_a_b": 0 }, { - "a": "0x1ca", - "b": "0x2", + "a": "0x6", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x77a", - "b": "0x77a", - "cmp_a_b": 0 + "a": "0x31", + "b": "0x6", + "cmp_a_b": 1 }, { - "a": "0x1fb", + "a": "0xac", "b": "0x1fb", - "cmp_a_b": 0 + "cmp_a_b": -1 }, { - "a": "0x4", - "b": "0x8f", + "a": "0x0", + "b": "0x9d", "cmp_a_b": -1 }, { - "a": "0x22", - "b": "0x28", + "a": "0x1", + "b": "0x3", "cmp_a_b": -1 }, { - "a": "0xa", + "a": "0x0", "b": "0x0", - "cmp_a_b": 1 + "cmp_a_b": 0 }, { - "a": "0x47", - "b": "0x1583", + "a": "0xa", + "b": "0x11c8", "cmp_a_b": -1 }, { - "a": "0x196", - "b": "0x2", - "cmp_a_b": 1 - }, - { - "a": "0x176", - "b": "0x176", + "a": "0x4", + "b": "0x4", "cmp_a_b": 0 }, { - "a": "0x349", - "b": "0x103", - "cmp_a_b": 1 - }, - { - "a": "0x1e7", - "b": "0x8", + "a": "0x647", + "b": "0x61f", "cmp_a_b": 1 }, { - "a": "0x1", - "b": "0x2", + "a": "0x0", + "b": "0x1a32", "cmp_a_b": -1 }, { - "a": "0x2c0", - "b": "0xeb37", + "a": "0x0", + "b": "0xb", "cmp_a_b": -1 }, { - "a": "0x26", - "b": "0x2776", + "a": "0x0", + "b": "0x17", "cmp_a_b": -1 }, { - "a": "0x3b", - "b": "0x1d139", - "cmp_a_b": -1 + "a": "0x1fc", + "b": "0x22", + "cmp_a_b": 1 }, { - "a": "0x14", - "b": "0x223", - "cmp_a_b": -1 + "a": "0x65d", + "b": "0x175", + "cmp_a_b": 1 }, { - "a": "0x2", - "b": "0x5", + "a": "0x0", + "b": "0x551", "cmp_a_b": -1 }, { - "a": "0x5", - "b": "0x5", - "cmp_a_b": 0 - }, - { - "a": "0x76", - "b": "0x76", - "cmp_a_b": 0 + "a": "0x0", + "b": "0x12", + "cmp_a_b": -1 }, { - "a": "0x6c", - "b": "0x42", + "a": "0x15f", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x31", - "b": "0x7f2a", + "a": "0x210", + "b": "0xde0", "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0x4a", + "a": "0x37b", + "b": "0xc09", "cmp_a_b": -1 }, { - "a": "0xec", - "b": "0xc", - "cmp_a_b": 1 + "a": "0xa", + "b": "0x1391d", + "cmp_a_b": -1 }, { - "a": "0x9", - "b": "0x86fe", + "a": "0x262", + "b": "0x6192", "cmp_a_b": -1 }, { - "a": "0x349", - "b": "0x9", - "cmp_a_b": 1 + "a": "0x75", + "b": "0x15b", + "cmp_a_b": -1 }, { "a": "0x3", - "b": "0x36d3", + "b": "0xa60", "cmp_a_b": -1 }, { - "a": "0x3", - "b": "0x326e", + "a": "0xb", + "b": "0x2fa1", "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0x2a", - "cmp_a_b": -1 + "a": "0x28", + "b": "0x28", + "cmp_a_b": 0 }, { - "a": "0xd", - "b": "0x1177", + "a": "0x260", + "b": "0x2cc", "cmp_a_b": -1 }, { - "a": "0x17", - "b": "0x5dcd", + "a": "0xbab", + "b": "0xecd8", "cmp_a_b": -1 }, { - "a": "0x4", - "b": "0x7", + "a": "0x47", + "b": "0x4f9", "cmp_a_b": -1 }, { - "a": "0x34", - "b": "0x953c", - "cmp_a_b": -1 + "a": "0xa8", + "b": "0x18", + "cmp_a_b": 1 }, { - "a": "0x2", - "b": "0xec", + "a": "0x0", + "b": "0x7d6", "cmp_a_b": -1 }, { - "a": "0x165", - "b": "0x165", - "cmp_a_b": 0 + "a": "0x170", + "b": "0xa32d", + "cmp_a_b": -1 }, { - "a": "0xc0", - "b": "0x3", - "cmp_a_b": 1 + "a": "0x20", + "b": "0x81", + "cmp_a_b": -1 }, { - "a": "0x7d", - "b": "0x23", + "a": "0x38c", + "b": "0x50", "cmp_a_b": 1 }, { - "a": "0x716", - "b": "0x1fc2", + "a": "0x7d", + "b": "0xa292", "cmp_a_b": -1 }, { - "a": "0xd8", - "b": "0x8", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x3614", + "cmp_a_b": -1 }, { - "a": "0x19d", - "b": "0xa053", + "a": "0x6", + "b": "0xf6", "cmp_a_b": -1 }, { - "a": "0x1c6", - "b": "0x2", + "a": "0xa", + "b": "0x3", "cmp_a_b": 1 }, { - "a": "0x2f5", - "b": "0x1", + "a": "0x1d", + "b": "0x16", "cmp_a_b": 1 }, { - "a": "0x3f", - "b": "0xbddb", - "cmp_a_b": -1 - }, - { - "a": "0x2", - "b": "0x4", + "a": "0x6", + "b": "0x23", "cmp_a_b": -1 }, { - "a": "0x5e", - "b": "0x412", + "a": "0x19", + "b": "0x9b9", "cmp_a_b": -1 }, { - "a": "0x36", - "b": "0x18", - "cmp_a_b": 1 - }, - { - "a": "0xb2", - "b": "0xa", + "a": "0x30", + "b": "0x2", "cmp_a_b": 1 }, { - "a": "0x3ff", - "b": "0x1", - "cmp_a_b": 1 + "a": "0x7d", + "b": "0x9e", + "cmp_a_b": -1 }, { - "a": "0x51", - "b": "0x934", + "a": "0x4ab", + "b": "0xa67", "cmp_a_b": -1 }, { - "a": "0xe", - "b": "0x31", + "a": "0x0", + "b": "0x1", "cmp_a_b": -1 }, { - "a": "0x4b", - "b": "0x0", + "a": "0x1cc", + "b": "0x9", "cmp_a_b": 1 }, { - "a": "0x330", - "b": "0x330", - "cmp_a_b": 0 - }, - { - "a": "0x1", - "b": "0x1", - "cmp_a_b": 0 - }, - { - "a": "0x101", - "b": "0x1db3", + "a": "0xb", + "b": "0x11", "cmp_a_b": -1 }, { - "a": "0x6ac", - "b": "0x839", + "a": "0x2", + "b": "0x276a", "cmp_a_b": -1 }, { - "a": "0x11a", - "b": "0x65", + "a": "0x25", + "b": "0x18", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x858a", - "cmp_a_b": -1 - }, - { - "a": "0x1f", - "b": "0x708", + "a": "0x55e", + "b": "0x2cbc", "cmp_a_b": -1 }, { - "a": "0x67e", - "b": "0x20", - "cmp_a_b": 1 - }, - { - "a": "0x11", - "b": "0x17", + "a": "0x1", + "b": "0x13417", "cmp_a_b": -1 }, { - "a": "0x28", - "b": "0x34", + "a": "0x373", + "b": "0x602", "cmp_a_b": -1 }, { - "a": "0x6ac", + "a": "0xb6", "b": "0xc", "cmp_a_b": 1 }, { - "a": "0x30", - "b": "0x17d9", - "cmp_a_b": -1 + "a": "0x2", + "b": "0x2", + "cmp_a_b": 0 }, { - "a": "0x35d", - "b": "0x115", + "a": "0x321", + "b": "0x242", "cmp_a_b": 1 }, { - "a": "0x4", - "b": "0x6dde", - "cmp_a_b": -1 + "a": "0xa6", + "b": "0xa3", + "cmp_a_b": 1 }, { - "a": "0x442", - "b": "0x978", + "a": "0x0", + "b": "0xec", "cmp_a_b": -1 }, { - "a": "0x976", - "b": "0x5124", + "a": "0x9", + "b": "0xf", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x19cb", + "a": "0x7ce", + "b": "0x5472", "cmp_a_b": -1 }, { - "a": "0x9af", - "b": "0x7e8", + "a": "0x39d", + "b": "0x28", "cmp_a_b": 1 }, { - "a": "0x2", - "b": "0x8d9f", + "a": "0x1fa", + "b": "0xc6c", "cmp_a_b": -1 }, { - "a": "0x6", - "b": "0x1d", + "a": "0x0", + "b": "0x72", "cmp_a_b": -1 }, { - "a": "0x438", - "b": "0x438", + "a": "0x342", + "b": "0x342", "cmp_a_b": 0 }, { - "a": "0x9bf", - "b": "0x16", + "a": "0x43", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0xe", - "b": "0x270", + "a": "0x333", + "b": "0x1365", "cmp_a_b": -1 }, { - "a": "0x1b", - "b": "0x1b", - "cmp_a_b": 0 + "a": "0x8b2", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x620", - "b": "0x40b", + "a": "0x4f2", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x36", - "b": "0x7053", + "a": "0x111", + "b": "0x133", "cmp_a_b": -1 }, { - "a": "0xf", - "b": "0x1081e", + "a": "0x2", + "b": "0x1cc", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x5e47", + "a": "0x1f9", + "b": "0x1c", + "cmp_a_b": 1 + }, + { + "a": "0x7aa", + "b": "0x7aa", + "cmp_a_b": 0 + }, + { + "a": "0x2", + "b": "0x3067", "cmp_a_b": -1 }, { - "a": "0xffb", - "b": "0x520e", + "a": "0x8", + "b": "0x14f7", "cmp_a_b": -1 }, { - "a": "0x2d1", - "b": "0x1c", - "cmp_a_b": 1 + "a": "0xa38", + "b": "0xa38", + "cmp_a_b": 0 }, { - "a": "0x1", - "b": "0x4", + "a": "0x3eb", + "b": "0x3540", "cmp_a_b": -1 }, { - "a": "0xf", - "b": "0xbc", + "a": "0x176", + "b": "0x17986", "cmp_a_b": -1 }, { - "a": "0x767", - "b": "0x0", + "a": "0xcdc", + "b": "0x195", "cmp_a_b": 1 }, { - "a": "0xab9", - "b": "0x8f", + "a": "0x34", + "b": "0xc", "cmp_a_b": 1 }, { - "a": "0x525", - "b": "0x780", + "a": "0x2", + "b": "0x5b3", "cmp_a_b": -1 }, { - "a": "0x20", - "b": "0xe858", + "a": "0xbe", + "b": "0x121e", "cmp_a_b": -1 }, { - "a": "0x88", - "b": "0x3", + "a": "0xf0", + "b": "0xc", "cmp_a_b": 1 }, { - "a": "0x738", - "b": "0x9", + "a": "0x72", + "b": "0x3", "cmp_a_b": 1 }, { - "a": "0x16", - "b": "0xb8", - "cmp_a_b": -1 + "a": "0x70", + "b": "0x70", + "cmp_a_b": 0 }, { - "a": "0xc83", - "b": "0xc83", - "cmp_a_b": 0 + "a": "0x41d", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x24", - "b": "0x170c", + "a": "0x179", + "b": "0x766", "cmp_a_b": -1 }, { - "a": "0x4c", - "b": "0x1182", - "cmp_a_b": -1 + "a": "0x1f", + "b": "0x16", + "cmp_a_b": 1 }, { - "a": "0x10", - "b": "0x1f", + "a": "0x0", + "b": "0x10a68", "cmp_a_b": -1 }, { - "a": "0x1a4", - "b": "0x11206", + "a": "0x2ab", + "b": "0x2ab", + "cmp_a_b": 0 + }, + { + "a": "0x1", + "b": "0x435", "cmp_a_b": -1 }, { - "a": "0x17", - "b": "0x1f7fe", + "a": "0xbb", + "b": "0x3cd0", "cmp_a_b": -1 }, { - "a": "0x535", - "b": "0x535", - "cmp_a_b": 0 + "a": "0x5", + "b": "0x1307e", + "cmp_a_b": -1 }, { - "a": "0x3b2", - "b": "0x7f", + "a": "0x732", + "b": "0x3", "cmp_a_b": 1 }, { - "a": "0x72", - "b": "0x189a", + "a": "0x12", + "b": "0x26", "cmp_a_b": -1 }, { - "a": "0x182", - "b": "0x36e5", + "a": "0x1", + "b": "0x22", "cmp_a_b": -1 }, { - "a": "0x9a", - "b": "0xae", + "a": "0x5", + "b": "0x66", "cmp_a_b": -1 }, { - "a": "0x56", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x11a", + "b": "0x11a", + "cmp_a_b": 0 }, { "a": "0x0", - "b": "0x928", + "b": "0xc1f", "cmp_a_b": -1 }, { - "a": "0x77", - "b": "0x50", + "a": "0xc83", + "b": "0xa17", "cmp_a_b": 1 }, { - "a": "0x2cd", - "b": "0x8d8", - "cmp_a_b": -1 - }, - { - "a": "0x2d6", - "b": "0x0", + "a": "0x9d", + "b": "0x15", "cmp_a_b": 1 }, { - "a": "0x1", - "b": "0x3a", + "a": "0xc", + "b": "0x105", "cmp_a_b": -1 }, { - "a": "0x6d", - "b": "0x4b45", + "a": "0x3", + "b": "0x3d67", "cmp_a_b": -1 }, { - "a": "0x387", - "b": "0x387", - "cmp_a_b": 0 + "a": "0x998", + "b": "0x1c", + "cmp_a_b": 1 }, { - "a": "0x23", - "b": "0x7", + "a": "0x44", + "b": "0x12", "cmp_a_b": 1 }, { - "a": "0x57", - "b": "0x0", + "a": "0x3c6", + "b": "0x45", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x0", - "cmp_a_b": 0 + "a": "0xe8", + "b": "0x64", + "cmp_a_b": 1 }, { - "a": "0x90", - "b": "0x3", + "a": "0x11", + "b": "0x389", + "cmp_a_b": -1 + }, + { + "a": "0xc", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x1a", - "b": "0x58", + "a": "0x105", + "b": "0xeb4", "cmp_a_b": -1 }, { - "a": "0xbc", - "b": "0x3794", - "cmp_a_b": -1 + "a": "0x1c", + "b": "0x6", + "cmp_a_b": 1 }, { - "a": "0x118", - "b": "0x690", + "a": "0x1", + "b": "0x58f", "cmp_a_b": -1 }, { - "a": "0x5", - "b": "0xa", + "a": "0x8", + "b": "0x63", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x30", + "a": "0x7", + "b": "0xe5", "cmp_a_b": -1 }, { - "a": "0x3", - "b": "0x1", + "a": "0x438", + "b": "0x22d", "cmp_a_b": 1 }, { - "a": "0x33a", - "b": "0x5f7a", + "a": "0x1f", + "b": "0x96d", "cmp_a_b": -1 }, { - "a": "0x2d8", - "b": "0x5f", + "a": "0x2e", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x27", - "b": "0xc50e", + "a": "0x7b0", + "b": "0x8", + "cmp_a_b": 1 + }, + { + "a": "0x77b", + "b": "0xe7c4", "cmp_a_b": -1 }, { - "a": "0x4e", - "b": "0xe", - "cmp_a_b": 1 + "a": "0x5", + "b": "0x7", + "cmp_a_b": -1 }, { - "a": "0x59", - "b": "0x1", + "a": "0xd1f", + "b": "0x7a4", "cmp_a_b": 1 }, { - "a": "0xac", - "b": "0x2ad3", - "cmp_a_b": -1 + "a": "0xfd4", + "b": "0x30", + "cmp_a_b": 1 }, { - "a": "0x8", + "a": "0x196", "b": "0x1", "cmp_a_b": 1 }, { - "a": "0x28", - "b": "0x640f", + "a": "0x1e", + "b": "0x91e5", "cmp_a_b": -1 }, { - "a": "0x206", - "b": "0xa04", + "a": "0xe", + "b": "0x1f", "cmp_a_b": -1 }, { - "a": "0x9", - "b": "0x1e66b", + "a": "0x3", + "b": "0x19", "cmp_a_b": -1 }, - { - "a": "0x13", - "b": "0x11", - "cmp_a_b": 1 - }, { "a": "0x4", - "b": "0x13", + "b": "0x7dcd", "cmp_a_b": -1 }, - { - "a": "0xb9a", - "b": "0x0", - "cmp_a_b": 1 - }, { "a": "0x1", - "b": "0x3328", + "b": "0x2", "cmp_a_b": -1 }, { - "a": "0xc", - "b": "0xc", + "a": "0x4bb", + "b": "0x4bb", "cmp_a_b": 0 }, { - "a": "0x40", - "b": "0x8", + "a": "0x2d6", + "b": "0x3e", "cmp_a_b": 1 }, { - "a": "0xa", - "b": "0x20", + "a": "0x2", + "b": "0x2d", "cmp_a_b": -1 }, { - "a": "0xb", - "b": "0x23d", - "cmp_a_b": -1 + "a": "0x8", + "b": "0x8", + "cmp_a_b": 0 }, { - "a": "0x1", - "b": "0x17", - "cmp_a_b": -1 + "a": "0x29", + "b": "0x2", + "cmp_a_b": 1 }, { - "a": "0x65d", - "b": "0xeb", + "a": "0x61", + "b": "0xa", "cmp_a_b": 1 }, { - "a": "0x43", - "b": "0x43", - "cmp_a_b": 0 + "a": "0xd18", + "b": "0x5b", + "cmp_a_b": 1 }, { - "a": "0x1c", - "b": "0x27", - "cmp_a_b": -1 + "a": "0x17", + "b": "0xc", + "cmp_a_b": 1 }, { - "a": "0x1", - "b": "0x440", + "a": "0x60", + "b": "0x13db", "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0x3", + "a": "0x4", + "b": "0x1a1", "cmp_a_b": -1 }, { - "a": "0xa40", - "b": "0xb051", - "cmp_a_b": -1 + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 }, { - "a": "0x1c", - "b": "0xe", + "a": "0x27", + "b": "0x6", "cmp_a_b": 1 }, { - "a": "0x3", - "b": "0x224", + "a": "0x0", + "b": "0xa", "cmp_a_b": -1 }, { - "a": "0x13", - "b": "0x5", - "cmp_a_b": 1 - }, - { - "a": "0x5e5", - "b": "0x922", + "a": "0x37", + "b": "0x8dd", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x4f4", + "a": "0x1b", + "b": "0x1f", "cmp_a_b": -1 }, { - "a": "0x1c2", - "b": "0x3", + "a": "0x9", + "b": "0x5", "cmp_a_b": 1 }, { - "a": "0x4d", - "b": "0x1d", - "cmp_a_b": 1 + "a": "0x2ee", + "b": "0x1c202", + "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0x2", - "cmp_a_b": 0 + "a": "0x2d", + "b": "0x4d09", + "cmp_a_b": -1 }, { - "a": "0x8", - "b": "0x400", + "a": "0xd", + "b": "0x432", "cmp_a_b": -1 }, { - "a": "0x199", - "b": "0x3278", + "a": "0x4d", + "b": "0xa1", "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0x108f", + "a": "0x38", + "b": "0x2c1", "cmp_a_b": -1 }, { - "a": "0x10", - "b": "0x2c", - "cmp_a_b": -1 + "a": "0x3", + "b": "0x3", + "cmp_a_b": 0 }, { - "a": "0x12", - "b": "0x11529", - "cmp_a_b": -1 + "a": "0x48", + "b": "0x3", + "cmp_a_b": 1 }, { - "a": "0x1", - "b": "0x25", + "a": "0x3d", + "b": "0x349", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x1", - "cmp_a_b": 0 + "a": "0x7", + "b": "0x1d", + "cmp_a_b": -1 }, { - "a": "0x410", - "b": "0x410", - "cmp_a_b": 0 + "a": "0x6d1", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0xb", - "b": "0x11", + "a": "0x6", + "b": "0x373", "cmp_a_b": -1 }, { - "a": "0x23e", - "b": "0x6ce", + "a": "0x3", + "b": "0x84", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x59", - "cmp_a_b": -1 + "a": "0x2", + "b": "0x2", + "cmp_a_b": 0 }, { - "a": "0x7bc", - "b": "0x7bc", - "cmp_a_b": 0 + "a": "0x595", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x4", - "b": "0x2", + "a": "0x413", + "b": "0x3a", "cmp_a_b": 1 }, { - "a": "0x102", - "b": "0x27", + "a": "0x777", + "b": "0x1e", "cmp_a_b": 1 }, { - "a": "0x1c9", - "b": "0x21d9", + "a": "0x1a0", + "b": "0x1a0", + "cmp_a_b": 0 + }, + { + "a": "0x0", + "b": "0x8e", "cmp_a_b": -1 }, { - "a": "0x8a1", - "b": "0x1", - "cmp_a_b": 1 + "a": "0x4c", + "b": "0x38b", + "cmp_a_b": -1 }, { - "a": "0x5", - "b": "0x1", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 }, { - "a": "0x87", - "b": "0xd0", + "a": "0x5", + "b": "0x41", "cmp_a_b": -1 }, { "a": "0x1", - "b": "0x638", + "b": "0x6b44", "cmp_a_b": -1 }, { - "a": "0x15b", - "b": "0x2ab", - "cmp_a_b": -1 + "a": "0x132", + "b": "0x3", + "cmp_a_b": 1 }, { - "a": "0x8c", - "b": "0x31c", - "cmp_a_b": -1 + "a": "0xc4", + "b": "0x2", + "cmp_a_b": 1 }, { - "a": "0x8", - "b": "0x3e3f", + "a": "0xd3c", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x2c", + "b": "0x3b", "cmp_a_b": -1 }, { - "a": "0xce8", - "b": "0xce", + "a": "0x26c", + "b": "0x48", "cmp_a_b": 1 }, { - "a": "0x84", - "b": "0x1212", + "a": "0x39", + "b": "0x3f59", "cmp_a_b": -1 }, { - "a": "0x1e3", - "b": "0x1e7af", + "a": "0x1d", + "b": "0x1b61", "cmp_a_b": -1 }, { - "a": "0x86", - "b": "0xa36", - "cmp_a_b": -1 + "a": "0x61", + "b": "0x61", + "cmp_a_b": 0 }, { - "a": "0x1", - "b": "0x1b9", - "cmp_a_b": -1 + "a": "0x2d", + "b": "0x2d", + "cmp_a_b": 0 }, { - "a": "0x3f", - "b": "0x1ae", + "a": "0x0", + "b": "0x2fe4", "cmp_a_b": -1 }, { - "a": "0x8", - "b": "0xc1", - "cmp_a_b": -1 + "a": "0x75a", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0xf", - "b": "0x4c9", + "a": "0x2", + "b": "0x2f", "cmp_a_b": -1 }, { - "a": "0xb", - "b": "0x5d", - "cmp_a_b": -1 + "a": "0x69", + "b": "0x2f", + "cmp_a_b": 1 }, { - "a": "0x12", - "b": "0x1a6f", + "a": "0x81", + "b": "0x4", + "cmp_a_b": 1 + }, + { + "a": "0xc4", + "b": "0x1a", + "cmp_a_b": 1 + }, + { + "a": "0x6", + "b": "0xf37", "cmp_a_b": -1 }, { - "a": "0x4", - "b": "0x110", + "a": "0x56", + "b": "0x3bfd", "cmp_a_b": -1 }, { - "a": "0x12f", - "b": "0x13", + "a": "0x3f", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0xf", - "b": "0xf", - "cmp_a_b": 0 + "a": "0x782", + "b": "0x32e", + "cmp_a_b": 1 }, { - "a": "0x4", - "b": "0x248", + "a": "0x3d", + "b": "0x74c9", "cmp_a_b": -1 }, { - "a": "0x88e", - "b": "0x2", + "a": "0x6c", + "b": "0x1", "cmp_a_b": 1 }, { - "a": "0x3dd", - "b": "0x7", + "a": "0x3b3", + "b": "0x2c7", "cmp_a_b": 1 }, { - "a": "0xb", - "b": "0x0", + "a": "0x9", + "b": "0x3", "cmp_a_b": 1 }, { - "a": "0x12", - "b": "0x1", - "cmp_a_b": 1 + "a": "0x1", + "b": "0x1094b", + "cmp_a_b": -1 }, { - "a": "0x17", - "b": "0x2d", - "cmp_a_b": -1 + "a": "0x3a0", + "b": "0xcb", + "cmp_a_b": 1 }, { - "a": "0x2d", - "b": "0xf0", + "a": "0xf", + "b": "0x1b0", "cmp_a_b": -1 }, { - "a": "0x1cf", - "b": "0x5", + "a": "0x34d", + "b": "0x5a", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x426a", + "a": "0x2d5", + "b": "0xcd2a", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x33", + "a": "0x987", + "b": "0x43", + "cmp_a_b": 1 + }, + { + "a": "0x3", + "b": "0x171", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x104a", + "a": "0x26", + "b": "0x1bd0", "cmp_a_b": -1 }, { - "a": "0x18", - "b": "0x18", - "cmp_a_b": 0 + "a": "0x7", + "b": "0x1b36", + "cmp_a_b": -1 }, { - "a": "0x5", - "b": "0x1", + "a": "0x14c", + "b": "0x5", "cmp_a_b": 1 }, { - "a": "0xcb9", - "b": "0x34e", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x1b27", + "cmp_a_b": -1 }, { - "a": "0x24", - "b": "0x46", + "a": "0x9b0", + "b": "0x8666", "cmp_a_b": -1 }, { - "a": "0x48f", - "b": "0xe", - "cmp_a_b": 1 + "a": "0x1d2", + "b": "0x1d2", + "cmp_a_b": 0 }, { - "a": "0x0", - "b": "0x1117e", + "a": "0x2f9", + "b": "0x752", "cmp_a_b": -1 }, { - "a": "0xce1", - "b": "0x1", + "a": "0x5b7", + "b": "0x3e0", "cmp_a_b": 1 }, { - "a": "0x950", - "b": "0x5", - "cmp_a_b": 1 + "a": "0x26", + "b": "0x6c7", + "cmp_a_b": -1 }, { - "a": "0x1d", - "b": "0x1d", + "a": "0x18c", + "b": "0x18c", "cmp_a_b": 0 }, { - "a": "0x28a", - "b": "0xc5eb", + "a": "0x7", + "b": "0x14df2", "cmp_a_b": -1 }, { - "a": "0x25a", - "b": "0xb47", + "a": "0x2", + "b": "0x3d", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x36d", + "a": "0x0", + "b": "0x76b", "cmp_a_b": -1 }, { - "a": "0x5", - "b": "0xf97d", + "a": "0x3", + "b": "0x12d9f", "cmp_a_b": -1 }, { - "a": "0x87f", - "b": "0x630", + "a": "0x3de", + "b": "0x0", "cmp_a_b": 1 }, { "a": "0x3", - "b": "0x8", + "b": "0x8aa", "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0x8", - "cmp_a_b": -1 + "a": "0x2b9", + "b": "0x35", + "cmp_a_b": 1 }, { - "a": "0x1", - "b": "0x997", - "cmp_a_b": -1 + "a": "0xe", + "b": "0x1", + "cmp_a_b": 1 }, { - "a": "0x1f", - "b": "0xe1", + "a": "0x3c9", + "b": "0x771", "cmp_a_b": -1 }, { - "a": "0xef", - "b": "0x1", + "a": "0xa", + "b": "0x3", "cmp_a_b": 1 }, { - "a": "0x27", - "b": "0x1936d", + "a": "0x4", + "b": "0x9", "cmp_a_b": -1 }, { - "a": "0xf79", - "b": "0xa0", - "cmp_a_b": 1 + "a": "0x8", + "b": "0x3577", + "cmp_a_b": -1 }, { - "a": "0xa4", - "b": "0x4ec9", - "cmp_a_b": -1 + "a": "0xf", + "b": "0xf", + "cmp_a_b": 0 }, { - "a": "0x22", - "b": "0x26", + "a": "0x135", + "b": "0x4", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x52b5", "cmp_a_b": -1 }, { - "a": "0x3e7", - "b": "0x6", + "a": "0x659", + "b": "0xd2", "cmp_a_b": 1 }, { - "a": "0x6", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x7", + "b": "0x5e", + "cmp_a_b": -1 }, { - "a": "0x2c2", - "b": "0x18d", + "a": "0x393", + "b": "0x21", "cmp_a_b": 1 }, { - "a": "0x70", - "b": "0x70", + "a": "0x1", + "b": "0x1", "cmp_a_b": 0 }, { - "a": "0x9", - "b": "0x60d", - "cmp_a_b": -1 + "a": "0x12", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x6", + "a": "0x7c", "b": "0x6", - "cmp_a_b": 0 + "cmp_a_b": 1 }, { - "a": "0x9e", - "b": "0x11281", + "a": "0x21", + "b": "0xf08e", "cmp_a_b": -1 }, { - "a": "0x64", - "b": "0x63", + "a": "0x81", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x562", - "b": "0x907d", + "a": "0x31", + "b": "0xb53", "cmp_a_b": -1 }, { - "a": "0x31", - "b": "0x1936", + "a": "0xd", + "b": "0xd", + "cmp_a_b": 0 + }, + { + "a": "0x0", + "b": "0xe", "cmp_a_b": -1 }, { - "a": "0x3d2", - "b": "0x1e", + "a": "0xa", + "b": "0x5", "cmp_a_b": 1 }, { - "a": "0x1b", - "b": "0x4f98", - "cmp_a_b": -1 + "a": "0x2b", + "b": "0x2b", + "cmp_a_b": 0 }, { - "a": "0xa46", - "b": "0x1019e", - "cmp_a_b": -1 + "a": "0x66", + "b": "0xb", + "cmp_a_b": 1 }, { - "a": "0x0", + "a": "0x5af", "b": "0xa", - "cmp_a_b": -1 + "cmp_a_b": 1 }, { - "a": "0x528", - "b": "0x5", + "a": "0xc3", + "b": "0x5f", "cmp_a_b": 1 }, { - "a": "0x2", - "b": "0x43a", + "a": "0xb2", + "b": "0x9a4e", "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0x1d", + "a": "0x56", + "b": "0x56", + "cmp_a_b": 0 + }, + { + "a": "0x282", + "b": "0x1bca", "cmp_a_b": -1 }, { - "a": "0xa", - "b": "0x82", + "a": "0x165", + "b": "0xb9f", "cmp_a_b": -1 }, { - "a": "0x8d", - "b": "0x3", - "cmp_a_b": 1 + "a": "0x466", + "b": "0x4560", + "cmp_a_b": -1 }, { - "a": "0x67", - "b": "0x67", - "cmp_a_b": 0 + "a": "0xd", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x22", - "b": "0xa69", + "a": "0x92", + "b": "0x19d5", "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0x435", + "a": "0x5", + "b": "0x79", "cmp_a_b": -1 }, { - "a": "0x572", - "b": "0x3463", - "cmp_a_b": -1 + "a": "0x19", + "b": "0x19", + "cmp_a_b": 0 }, { - "a": "0x1", - "b": "0x1", + "a": "0x12", + "b": "0x12", "cmp_a_b": 0 }, { - "a": "0x49", - "b": "0x3530", + "a": "0x0", + "b": "0x2", + "cmp_a_b": -1 + }, + { + "a": "0x19", + "b": "0x5", + "cmp_a_b": 1 + }, + { + "a": "0x223", + "b": "0x6ab", "cmp_a_b": -1 }, { - "a": "0x9fe", - "b": "0x2aa", - "cmp_a_b": 1 + "a": "0x3da", + "b": "0x3da", + "cmp_a_b": 0 }, { - "a": "0xd1", + "a": "0x3f3", "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x830", - "b": "0x7f", + "a": "0x2a", + "b": "0x1", "cmp_a_b": 1 }, { - "a": "0x2", - "b": "0xeb43", - "cmp_a_b": -1 + "a": "0x2da", + "b": "0x1", + "cmp_a_b": 1 }, { - "a": "0x3", - "b": "0x17794", - "cmp_a_b": -1 + "a": "0x17", + "b": "0x17", + "cmp_a_b": 0 }, { - "a": "0x487", - "b": "0x1", + "a": "0xf3d", + "b": "0xd4", "cmp_a_b": 1 }, { - "a": "0x20", - "b": "0x3", - "cmp_a_b": 1 + "a": "0x49", + "b": "0x111", + "cmp_a_b": -1 }, { - "a": "0x14", - "b": "0x1f087", - "cmp_a_b": -1 + "a": "0x330", + "b": "0x177", + "cmp_a_b": 1 }, { - "a": "0x3f", - "b": "0xa80d", - "cmp_a_b": -1 + "a": "0x32", + "b": "0x9", + "cmp_a_b": 1 }, { - "a": "0x24", - "b": "0x0", + "a": "0x567", + "b": "0x63", "cmp_a_b": 1 }, { - "a": "0x2", - "b": "0x11", + "a": "0x78a", + "b": "0x2d77", "cmp_a_b": -1 }, { - "a": "0x2c3", - "b": "0x2c3", + "a": "0xd7", + "b": "0xd7", "cmp_a_b": 0 }, { - "a": "0x3", - "b": "0x5", - "cmp_a_b": -1 + "a": "0xcf", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x1", - "b": "0x94", + "a": "0x5df", + "b": "0x4c2", + "cmp_a_b": 1 + }, + { + "a": "0x1f", + "b": "0x3e4", "cmp_a_b": -1 }, { - "a": "0xb2", - "b": "0xb2", - "cmp_a_b": 0 + "a": "0xa0", + "b": "0x3", + "cmp_a_b": 1 }, { "a": "0xb", - "b": "0x837", + "b": "0x1ac7", "cmp_a_b": -1 }, { - "a": "0x35", - "b": "0x4be", + "a": "0x29", + "b": "0x2a1e", "cmp_a_b": -1 }, { - "a": "0x1c", - "b": "0x4", - "cmp_a_b": 1 + "a": "0x3d", + "b": "0x613", + "cmp_a_b": -1 }, { - "a": "0x3a", - "b": "0x3a", + "a": "0xcc2", + "b": "0xcc2", "cmp_a_b": 0 }, { - "a": "0x9", - "b": "0x1941e", + "a": "0x18", + "b": "0xd22a", "cmp_a_b": -1 }, { - "a": "0x6", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x13", + "b": "0x13", + "cmp_a_b": 0 }, { - "a": "0x22", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x15b", + "b": "0x2c6", + "cmp_a_b": -1 }, { - "a": "0x5f", - "b": "0x5f", - "cmp_a_b": 0 + "a": "0x11c", + "b": "0x189e", + "cmp_a_b": -1 }, { "a": "0x0", - "b": "0xd0", + "b": "0x17", "cmp_a_b": -1 }, { - "a": "0x6fc", - "b": "0x2dcd", + "a": "0x0", + "b": "0x2b0", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x8a4", + "a": "0x89", + "b": "0x2f4", "cmp_a_b": -1 }, { - "a": "0xfa", - "b": "0x1", + "a": "0x6dc", + "b": "0xa7", "cmp_a_b": 1 }, { - "a": "0xbd", - "b": "0x1", - "cmp_a_b": 1 + "a": "0x1f4", + "b": "0x5a6", + "cmp_a_b": -1 }, { - "a": "0x1e", - "b": "0x4", - "cmp_a_b": 1 + "a": "0xa9", + "b": "0x18de", + "cmp_a_b": -1 }, { - "a": "0x7", - "b": "0x15", + "a": "0x33", + "b": "0x381d", "cmp_a_b": -1 }, { - "a": "0x4c", - "b": "0xe", - "cmp_a_b": 1 + "a": "0xb60", + "b": "0x119b5", + "cmp_a_b": -1 }, { - "a": "0x941", - "b": "0x73ac", - "cmp_a_b": -1 + "a": "0x230", + "b": "0x21", + "cmp_a_b": 1 }, { - "a": "0x3", - "b": "0x14", + "a": "0x0", + "b": "0x3", "cmp_a_b": -1 }, { - "a": "0x60", - "b": "0x63", + "a": "0x1", + "b": "0x352a", "cmp_a_b": -1 }, { - "a": "0x1dd", - "b": "0x0", - "cmp_a_b": 1 + "a": "0xbfa", + "b": "0x1a0c", + "cmp_a_b": -1 }, { - "a": "0x7f", - "b": "0x3237", + "a": "0x14b", + "b": "0x3cf", "cmp_a_b": -1 }, { - "a": "0xcd", - "b": "0x21", - "cmp_a_b": 1 + "a": "0x2", + "b": "0xd7", + "cmp_a_b": -1 }, { - "a": "0x7", - "b": "0x23", + "a": "0x6a", + "b": "0x83b8", "cmp_a_b": -1 }, { - "a": "0x25", - "b": "0x18db", + "a": "0x6", + "b": "0xa9", "cmp_a_b": -1 }, { - "a": "0x3e7", - "b": "0x9", + "a": "0x5c6", + "b": "0x2", "cmp_a_b": 1 }, { - "a": "0x9f2", - "b": "0x2d02", + "a": "0x2b", + "b": "0x7130", "cmp_a_b": -1 }, { - "a": "0x7", - "b": "0x6619", + "a": "0x9", + "b": "0x316e", "cmp_a_b": -1 }, { - "a": "0x34", - "b": "0x741", + "a": "0x2", + "b": "0x23", "cmp_a_b": -1 }, { - "a": "0x355", - "b": "0xa", + "a": "0x1f6", + "b": "0x44", "cmp_a_b": 1 }, { - "a": "0x2b6", - "b": "0x99", - "cmp_a_b": 1 + "a": "0xcf", + "b": "0x695", + "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x353", + "a": "0x73d", + "b": "0xd173", "cmp_a_b": -1 }, { - "a": "0x0", + "a": "0x4c", "b": "0x0", - "cmp_a_b": 0 + "cmp_a_b": 1 }, { - "a": "0xa8", - "b": "0x61a9", - "cmp_a_b": -1 + "a": "0x2f", + "b": "0x2f", + "cmp_a_b": 0 }, { - "a": "0x3", - "b": "0x134", + "a": "0x675", + "b": "0x7d1", "cmp_a_b": -1 }, { - "a": "0x9", - "b": "0x1", - "cmp_a_b": 1 - }, - { - "a": "0x27", - "b": "0x59", + "a": "0xc", + "b": "0x34e5", "cmp_a_b": -1 }, { - "a": "0xc81", - "b": "0x0", - "cmp_a_b": 1 - }, - { - "a": "0x1", - "b": "0x667c", + "a": "0x2", + "b": "0x11", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x193", + "a": "0x18", + "b": "0xd2", "cmp_a_b": -1 }, { - "a": "0x17", - "b": "0x13b", + "a": "0xb", + "b": "0x14f8", "cmp_a_b": -1 }, { - "a": "0xbe", - "b": "0x1de", - "cmp_a_b": -1 + "a": "0xe02", + "b": "0x3bc", + "cmp_a_b": 1 }, { - "a": "0x175", - "b": "0x6f", + "a": "0x58f", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x1cd", - "b": "0x1cd", - "cmp_a_b": 0 + "a": "0x763", + "b": "0x17", + "cmp_a_b": 1 }, { - "a": "0xeb3", - "b": "0x13589", + "a": "0xcf", + "b": "0x52d2", "cmp_a_b": -1 }, { - "a": "0x414", - "b": "0x1", - "cmp_a_b": 1 + "a": "0x4a", + "b": "0x7555", + "cmp_a_b": -1 }, { - "a": "0x25", - "b": "0x7", - "cmp_a_b": 1 + "a": "0x2e", + "b": "0x2e", + "cmp_a_b": 0 }, { - "a": "0x1fd", - "b": "0x6a9e", + "a": "0x1c", + "b": "0xea", "cmp_a_b": -1 }, { - "a": "0x99", - "b": "0xf", + "a": "0x159", + "b": "0x98", "cmp_a_b": 1 }, { - "a": "0x4f2", - "b": "0xd4", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x2", + "cmp_a_b": -1 }, { - "a": "0xa1", - "b": "0x52", + "a": "0xd", + "b": "0x6", "cmp_a_b": 1 }, { - "a": "0xd2", - "b": "0x3", + "a": "0x38", + "b": "0x4", "cmp_a_b": 1 }, { - "a": "0x10", - "b": "0x3f", + "a": "0x893", + "b": "0xda4", "cmp_a_b": -1 }, { - "a": "0x44", - "b": "0x8e1a", - "cmp_a_b": -1 + "a": "0xed", + "b": "0x97", + "cmp_a_b": 1 }, { - "a": "0xea", - "b": "0x373", + "a": "0x7", + "b": "0x15b4f", "cmp_a_b": -1 }, { - "a": "0x2d", - "b": "0x2d", + "a": "0x980", + "b": "0x980", "cmp_a_b": 0 }, { - "a": "0x2c", - "b": "0x8", - "cmp_a_b": 1 - }, - { - "a": "0xb4a", - "b": "0x5", - "cmp_a_b": 1 - }, - { - "a": "0x6f", - "b": "0x30d3", - "cmp_a_b": -1 + "a": "0x23", + "b": "0x23", + "cmp_a_b": 0 }, { - "a": "0xfe", - "b": "0x47d6", + "a": "0x6", + "b": "0x1022", "cmp_a_b": -1 }, { - "a": "0x19a", - "b": "0x243", + "a": "0x199", + "b": "0x237", "cmp_a_b": -1 }, { - "a": "0x8bd", - "b": "0x1a8", + "a": "0xa0", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0xa", - "b": "0x22", + "a": "0x2", + "b": "0x3bb", "cmp_a_b": -1 }, { - "a": "0xb", - "b": "0xb", - "cmp_a_b": 0 - }, - { - "a": "0x13a", - "b": "0x13a", - "cmp_a_b": 0 + "a": "0xfa", + "b": "0x2dad", + "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0x17", + "a": "0x0", + "b": "0x44", "cmp_a_b": -1 }, { - "a": "0x13", - "b": "0xc", + "a": "0x6b", + "b": "0x11", "cmp_a_b": 1 }, { "a": "0x0", - "b": "0x1a", - "cmp_a_b": -1 - }, - { - "a": "0x42", - "b": "0x324", + "b": "0x8", "cmp_a_b": -1 }, { - "a": "0x2a9", - "b": "0x8", - "cmp_a_b": 1 + "a": "0x67", + "b": "0x67", + "cmp_a_b": 0 }, { - "a": "0x1", - "b": "0x68d", + "a": "0x20c", + "b": "0x61d2", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x8e94", + "a": "0x2b9", + "b": "0x1a17", "cmp_a_b": -1 }, { - "a": "0x70", - "b": "0x55e", - "cmp_a_b": -1 + "a": "0x2", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x12", - "b": "0x5bf", + "a": "0x0", + "b": "0x7e1f", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x5f6c", + "a": "0xc", + "b": "0x3d31", "cmp_a_b": -1 }, { - "a": "0x1d9", - "b": "0xa8e", + "a": "0xb8", + "b": "0x3917", "cmp_a_b": -1 }, { - "a": "0x5", - "b": "0xb63", - "cmp_a_b": -1 + "a": "0xdd2", + "b": "0x85", + "cmp_a_b": 1 }, { - "a": "0x33", - "b": "0x1e5", + "a": "0x2", + "b": "0x6a", "cmp_a_b": -1 }, { - "a": "0x1e", - "b": "0x15ee", + "a": "0x1", + "b": "0x18e8", "cmp_a_b": -1 }, { - "a": "0x251", - "b": "0x9", - "cmp_a_b": 1 + "a": "0x5", + "b": "0x5", + "cmp_a_b": 0 }, { - "a": "0x2eb", - "b": "0x2eb", - "cmp_a_b": 0 + "a": "0x37", + "b": "0x73", + "cmp_a_b": -1 }, { - "a": "0xb", - "b": "0xdf18", + "a": "0x711", + "b": "0x181b", "cmp_a_b": -1 }, { - "a": "0xea", - "b": "0x1325", + "a": "0x270", + "b": "0x183d", "cmp_a_b": -1 }, { - "a": "0x15", - "b": "0x25", + "a": "0x252", + "b": "0x202c", "cmp_a_b": -1 }, { - "a": "0xdad", - "b": "0x5", + "a": "0x191", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x654", - "b": "0x654", + "a": "0x19d", + "b": "0x19d", "cmp_a_b": 0 }, { - "a": "0x5", - "b": "0x1d", + "a": "0x38", + "b": "0x16ba", "cmp_a_b": -1 }, { - "a": "0x1b0", - "b": "0x2102", + "a": "0x0", + "b": "0x270e", "cmp_a_b": -1 }, { - "a": "0x57", - "b": "0x1a", - "cmp_a_b": 1 + "a": "0x5c1", + "b": "0xde9", + "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x3f", + "a": "0x25", + "b": "0x190", "cmp_a_b": -1 }, { - "a": "0x156", - "b": "0x156", - "cmp_a_b": 0 + "a": "0x72", + "b": "0x1e5", + "cmp_a_b": -1 }, { - "a": "0x25e", - "b": "0x0", + "a": "0x6", + "b": "0x2", "cmp_a_b": 1 }, { - "a": "0x8f", - "b": "0x7", + "a": "0x27", + "b": "0x3", "cmp_a_b": 1 }, { - "a": "0x1", - "b": "0x1f03", + "a": "0xb7", + "b": "0x1fb", "cmp_a_b": -1 }, { - "a": "0x683", - "b": "0xac1e", - "cmp_a_b": -1 + "a": "0x6e", + "b": "0x4", + "cmp_a_b": 1 }, { - "a": "0x1", - "b": "0x7e6", + "a": "0x12", + "b": "0x2aa", "cmp_a_b": -1 }, { - "a": "0xf0", - "b": "0xf0", - "cmp_a_b": 0 - }, - { - "a": "0x6", - "b": "0x16", + "a": "0xea", + "b": "0x18a", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x2b9", + "a": "0x2b", + "b": "0x1ccf", "cmp_a_b": -1 }, { - "a": "0x1a0", - "b": "0x1948d", - "cmp_a_b": -1 + "a": "0x986", + "b": "0xaa", + "cmp_a_b": 1 }, { - "a": "0x11a", - "b": "0xc", + "a": "0x370", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0xc", - "b": "0x2", + "a": "0xde3", + "b": "0x350", "cmp_a_b": 1 }, { - "a": "0x5bc", - "b": "0x3", - "cmp_a_b": 1 + "a": "0x1", + "b": "0xe", + "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0x1", + "a": "0x7c8", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x1", - "b": "0x354", + "a": "0x5c", + "b": "0xf246", "cmp_a_b": -1 }, { - "a": "0xd", - "b": "0x1", - "cmp_a_b": 1 + "a": "0x3a", + "b": "0xf37a", + "cmp_a_b": -1 }, { - "a": "0x3ce", - "b": "0x10401", + "a": "0x12", + "b": "0xec", "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0x1f02", + "a": "0x3dc", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x7", + "b": "0x35", "cmp_a_b": -1 }, { - "a": "0x9", - "b": "0x181ed", + "a": "0xe4", + "b": "0x4c66", "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0x47", + "a": "0x6", + "b": "0xc", "cmp_a_b": -1 }, { - "a": "0x810", - "b": "0x810", - "cmp_a_b": 0 + "a": "0x15", + "b": "0x72", + "cmp_a_b": -1 }, { - "a": "0x9da", - "b": "0x98d7", + "a": "0x10a", + "b": "0x1396", "cmp_a_b": -1 + }, + { + "a": "0x1c3", + "b": "0xca", + "cmp_a_b": 1 } ], "test_comparison_260_130": [ { - "a": "0x94ea07c420797000000000", - "b": "0x2a7393810d7a420000", + "a": "0x42d81d11c16dc39049e3af0ceb4d20e", + "b": "0x4d2", "cmp_a_b": 1 }, { - "a": "0x35eda615d842", - "b": "0xba7", + "a": "0x6772ed996f125", + "b": "0xc6db16e7a", "cmp_a_b": 1 }, { - "a": "0x4a07dea52dbd6c0000000000000000000", - "b": "0xc2", + "a": "0x1d7b83a06dcdc8fd4e93cf47a34fc5d572", + "b": "0x3d19aabc1f90", "cmp_a_b": 1 }, { - "a": "0x10f8b915fdb64400000000000000000", - "b": "0x33ab59ef560c30000", - "cmp_a_b": 1 + "a": "0x2ba67903e36cf", + "b": "0x1a21b2836ea46e98b75", + "cmp_a_b": -1 }, { - "a": "0xc4a18377b88a000000000000000000000000000000000000000000000000000", - "b": "0x33df2e879c08", - "cmp_a_b": 1 + "a": "0x11fef5a55187a951855166465b", + "b": "0x30722ba1c8411ec18b76e589d4bc", + "cmp_a_b": -1 }, { - "a": "0x2a98317e8c033e0000000", - "b": "0x4e5867c4d9cbdc000000", + "a": "0x8afe6f875b98d086d18401176", + "b": "0x6d988122a08e324f550f", "cmp_a_b": 1 }, { - "a": "0x5fbf2e8d58db9400000000000000000000000000000000000000", - "b": "0x8b4ae2f41214d0", + "a": "0x7a1c4da2a83c504ebbc854b94e5efab8e36a7afb1c2d7b2ed384c44", + "b": "0x3b58", "cmp_a_b": 1 }, { - "a": "0x2fe4467802b1760000000000000000000000000000000000", - "b": "0x758f6b535362b4", + "a": "0x1d2ab8a89ccb884629074abb9f145852f153916b50ed151c2b57967ed4b6fe7e", + "b": "0x1d84b55a9dcc668fa4007b48", "cmp_a_b": 1 }, { - "a": "0x256ede86d6e492000000000000000000000000000000000000000000", - "b": "0x1b5a94a30a531", + "a": "0x1d576d95c864e76849838267b41f7834e9ecf5", + "b": "0x3d79a4eb9527fba", "cmp_a_b": 1 }, { - "a": "0x2aed0a505c657400000000000000000000000", - "b": "0x5da7e3db6d69e80000000000000", + "a": "0x8fa2d1240c5fa87b8a1f9e00e7ef4de3b68b89314f8c4c31c6dae4859274b", + "b": "0xbe5be72fa1e45ef60db", "cmp_a_b": 1 }, { - "a": "0x3ce245217dba9e00000000000000000000000000000000000000", - "b": "0x1f4a5ac0d286e", + "a": "0x1116930a407e9", + "b": "0x109", "cmp_a_b": 1 }, { - "a": "0x4d2b2cb010020", - "b": "0x225bd10fce7ac", - "cmp_a_b": 1 + "a": "0x9397f159ec7ac9db81f356e88031d0", + "b": "0x25d09c7efc6e4359105877bc7a9fa46", + "cmp_a_b": -1 }, { - "a": "0x154b3149ae8621000000000000000000000000000000000000000000", - "b": "0x9f221115c1ba100000", + "a": "0x7b40c823c694cf34a1572dbc07ca8", + "b": "0x9cf880e923a592933ffeae99", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x3f33b646b04f34", - "cmp_a_b": -1 + "a": "0x5f089682568bc5a9a12554a8e34e6a5305f25e5d9636c7dd52a236a88f66ae1d6", + "b": "0x17b68a0d8c", + "cmp_a_b": 1 }, { - "a": "0xba7aa06b3930d0000000000000000000000000000000000000", - "b": "0xbfe60bdfff3478", + "a": "0x6350fb8b69abed5cef1e4bc5a96a22854ce425a5f86584c92b195", + "b": "0x3a32f33d7ab41156a63e524f70", "cmp_a_b": 1 }, { - "a": "0x2ab72605aafdf40000000000000000", - "b": "0x24becc661bc2fa", + "a": "0x64f99d4c7767a84e19", + "b": "0x1a2d110aab3d43", "cmp_a_b": 1 }, { - "a": "0xc3dfdb582a98c0000000000", - "b": "0xb13a0c88646878000000000", + "a": "0x3293e", + "b": "0xaa6", "cmp_a_b": 1 }, { - "a": "0x189c81cc07ccf100000000", - "b": "0x31cb0412b6", + "a": "0xec7eecb810375f31bf45e96c772", + "b": "0x526cd00cf571", "cmp_a_b": 1 }, { - "a": "0x150b267", - "b": "0xbe8312d73ef7380000", + "a": "0x1ce031", + "b": "0xb604261e09678", "cmp_a_b": -1 }, { - "a": "0xf27536f170cbc00", - "b": "0x3b2", - "cmp_a_b": 1 - }, - { - "a": "0x1517615594257a00000000000000000000000000000", - "b": "0x3713c5d3bb31dc000000", + "a": "0x51967c208bb30de5a69cdab957917bd042c350962d28c5569194", + "b": "0x6f62c38ed", "cmp_a_b": 1 }, { - "a": "0x3", - "b": "0x2", + "a": "0x956e00c4", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x2ff7d9aa12bea4000000000", - "b": "0x1499b01b53cc640", + "a": "0xd583c000d99566221a71d8a5b3a3512ccaf", + "b": "0x1c3b10563a313890278c286cd4", "cmp_a_b": 1 }, { - "a": "0x12b1561b0457aa00000000000000000000000000000000", - "b": "0x39ba1b005b4e7e00", + "a": "0x17410923271dcf60071ec94327bf1b37039d22d0466c0c7d5a4c1ef7c146f02", + "b": "0x7e01770a506", "cmp_a_b": 1 }, { - "a": "0xcaa0d8d730e1100000000000000000000000000000", - "b": "0x0", + "a": "0x391347bdfff1276bb2e185f965898ed21757ebada36194a5bfd", + "b": "0x7cff", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0xc5e864fb3c7d9800000000000000000", - "cmp_a_b": -1 - }, - { - "a": "0x98047f6ebfae68000000000000000000000000000000", - "b": "0x1e96", + "a": "0xbe2f927936fbbebe92e814668eff0c02d459d554ec", + "b": "0xa33175b19d44", "cmp_a_b": 1 }, { - "a": "0xf2f7549a36033000000000000000000", - "b": "0x4a59e3e59ae86", + "a": "0x9558f8ff23bb5a0d38d7874f", + "b": "0x5", "cmp_a_b": 1 }, { - "a": "0x4651f31bb91ac0000000000000000000000", - "b": "0x198fde35e557ed00000000000000000", + "a": "0x60f7367804c2e32cea56fc9c0b1d9280", + "b": "0x3c0", "cmp_a_b": 1 }, { - "a": "0x118c745968fbc900000000000000000", - "b": "0x33acf4ae1aaab6000", + "a": "0xe04e26574b411a66cfd52f52b1791a4538abaa6028562f", + "b": "0x2306c325c1827df19f370", "cmp_a_b": 1 }, { "a": "0x0", - "b": "0x5a2c6d58576f4", + "b": "0x1f2950489bd", "cmp_a_b": -1 }, { - "a": "0xa8c4bc4a1452a800000000000000000000000000000000000", - "b": "0xf5ee6432cda", + "a": "0xcddf811f95bef21e221d1a367e5191cd925f560", + "b": "0x958ddd411f5d2148c", "cmp_a_b": 1 }, { - "a": "0x3579494ce291be00000000000000000000000000000", - "b": "0x459c18", + "a": "0xaa8a8344866204a4211a40e1a7683cd1795081d1596a", + "b": "0x30ec299f4e6425", "cmp_a_b": 1 }, { - "a": "0xad9d39b95780d0000000000000000000000000000000000", - "b": "0x0", + "a": "0x1a95209308edf7a78a660f65ad08a8f4951db5f50ee583796ce", + "b": "0xd715e00003d84d858b475b4c14", "cmp_a_b": 1 }, { - "a": "0x1a45b4e8fca366000000000000000000", - "b": "0x490700bfca7e00000000000000000000", - "cmp_a_b": -1 + "a": "0xb67418b6d331551de12", + "b": "0x1a", + "cmp_a_b": 1 }, { "a": "0x0", - "b": "0x33c1ebce29ae3", + "b": "0x61daa2903b19e603", "cmp_a_b": -1 }, { - "a": "0x1b989a8a7c7d120000000000000000000000000", - "b": "0x9f49c813b0dd3000000000000000000", - "cmp_a_b": 1 - }, - { - "a": "0x58c19dcb32545c0000000000000000000000000000000000000", - "b": "0x3dcfce51726538000000000", + "a": "0x1c69993d87e8ef437109d00750c4d9bb056a2e50f48e5", + "b": "0xe2bd99a20726dd9e07381914abaea30", "cmp_a_b": 1 }, { - "a": "0x6973d168efb684000000000000000000000", - "b": "0x1be085c935f64d0", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x12f83", + "cmp_a_b": -1 }, { - "a": "0x422fca5c1be4440000000000000000000000000000000000000000000000", - "b": "0x27c879f34", + "a": "0x14b486af13", + "b": "0x564c90b", "cmp_a_b": 1 }, { - "a": "0x13a7dfb183dc19000000000000000000000000000", - "b": "0xbe7641aaa5115", + "a": "0x588017fb92320eed22b6e3e228", + "b": "0x5e74fa7ac4322e", "cmp_a_b": 1 }, { - "a": "0xdbdc80f5e8bb58000000000000000000000000000000", - "b": "0x21cf600c84e9f00000000000000", + "a": "0x3392fd87ae31a9673060a005c5023c2bf07cbd2f4cf2e", + "b": "0x39bbc839fe4810", "cmp_a_b": 1 }, { - "a": "0x8e3cc16", - "b": "0xd27449ccb70b", - "cmp_a_b": -1 - }, - { - "a": "0xda85ced9b847b0000000000000", - "b": "0x9e2b88aca65aa800000000", + "a": "0xfedd05b2901cb3a82132bfe821096d4cad7ab0bc2ab36a7", + "b": "0xc39ccea17d41213aa637bc63dc4f6fb6", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x103c", + "a": "0x11ba231ecf", + "b": "0xb398d031f9f9dd2c7b2f3ea7c909c40", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x12edf006b166b0000000", + "a": "0x37ad754", + "b": "0x6a17fe23e868bad3b2b828", "cmp_a_b": -1 }, { - "a": "0x898c83b76000b800000000000000000000000000000000000000000000000", - "b": "0x88dfaadceec2180000000000", + "a": "0x606a71f3bbf976ee663bc7486ebd768165226563c1c709", + "b": "0x2399067f465", "cmp_a_b": 1 }, { - "a": "0x208146a53381aa00000000000000", - "b": "0x6a630af2e2", + "a": "0x558b17166a287c974a4b34130e95e38af9fe5dd34d576507a69f617bab888", + "b": "0x1e8d0c8c47eae1", "cmp_a_b": 1 }, { - "a": "0x4bc99b6e45325800000000000000000000000000000000000000000000000", - "b": "0x61563a68", - "cmp_a_b": 1 + "a": "0x6eda86200bbf60181", + "b": "0x1087a49f5b34ae6dafa4e828fc357d8f1", + "cmp_a_b": -1 }, { - "a": "0x15154523b0834900000000000000000000000000000000000000000000000000", - "b": "0x44aea5a14b", + "a": "0x186480bbe9f76d9fa65a6b8997f6bb6fb60fd1188", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x190ef8ed201", - "b": "0x35eb91cf716ddc00000000000", + "a": "0x348677ea36d9c150ae0", + "b": "0x3c4865503fa844adf0dda600ae5d2", "cmp_a_b": -1 }, { - "a": "0x2ec6ddb7c543fa000000000000000000000000000", - "b": "0x0", + "a": "0xaf7b7b3f1da91ef4c1b36fdbc74b6ee7f62d6587c", + "b": "0x2e37f714a51398e924aa1a5bad885", "cmp_a_b": 1 }, { - "a": "0x153e0e6d88ee3e0000000000000000000000000000000000", - "b": "0x8213cfe3819d7000000000000000000", + "a": "0x160463a6d7a7e16706465126bbdd7f8d1cd15e01768c509c0fbd4", + "b": "0x17c903a6301f567b89976", "cmp_a_b": 1 }, { - "a": "0xa5505818c21768000000000000000000000000000", - "b": "0x198024ed65fbbc0000000000000000000", - "cmp_a_b": 1 + "a": "0xddb", + "b": "0xddb", + "cmp_a_b": 0 }, { - "a": "0x110ced8aa8f77", - "b": "0x580acb7fb0", + "a": "0xe1db8be10dce5680df4f99370f0482bf9da1efc2e6c129e698cbd517f6437", + "b": "0xa498d6852c598d0b8d4d1", "cmp_a_b": 1 }, { - "a": "0x271e61273ac16a000000000000000000000000000000000000000000", - "b": "0x80a29da1139ed80", - "cmp_a_b": 1 + "a": "0x1c44dcc5dcb", + "b": "0x10050d00d16ea9dc0a98f4ad9ef2e", + "cmp_a_b": -1 }, { - "a": "0x21805a36fb5e3400000000000000", - "b": "0x103", + "a": "0x91a8298cbea2c1f0f2f37b022dddf28", + "b": "0x313003bb8cc59b9713e4d3", "cmp_a_b": 1 }, { - "a": "0x79bbbdd1dc5c78000000000000000000000000000000000000000000", - "b": "0x52", + "a": "0x17df1a4e8f069e7f82a1d94a7ef30a0327140c90da7ab", + "b": "0xf67b627a91feafdbd44c65c22565", "cmp_a_b": 1 }, { - "a": "0x624326bd2916980000000000000000000000000000", - "b": "0x1b0", + "a": "0x7", + "b": "0x7ec37", + "cmp_a_b": -1 + }, + { + "a": "0x56f00269a2c9fd8c2ea88bfb76d19e4e32060f80d5de7f3cac1", + "b": "0x8e088affd2f3f8a6ad585c7b8c", "cmp_a_b": 1 }, { - "a": "0x60a3a292684ee800000000000000000000000000000000000", - "b": "0x15e0c4d0f5bbca00000000", + "a": "0x3d438feafe5b2f6ecd320", + "b": "0x112c07e7c6aec2c5f4867", "cmp_a_b": 1 }, { - "a": "0x2be941559ba41e000000000000000", - "b": "0x8f4fa5a1abff700", + "a": "0x3ad4dbd5079f4a6e2b96d0ed4ed41517d92266b562133ac2fd3c0dcd", + "b": "0xad92532d754ab5b69dd516b4", "cmp_a_b": 1 }, { - "a": "0x16580ce12880960000000000000000000000000000000", - "b": "0x30ebf874f06ca6", + "a": "0x1b06e44827928a9155dd48f8b7281d0ae95b431fc47284bc10248", + "b": "0x1c1581cec53a1cdb4b13e", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x42e4f7815312", + "a": "0x5ab04", + "b": "0x7d05edbde63c4fdf333f14", "cmp_a_b": -1 }, { - "a": "0x90b6da1214f0c0000000000000000000000000000000000000000000000000", - "b": "0x2d811261c204a2000", - "cmp_a_b": 1 + "a": "0x14cb8492234c048", + "b": "0x38065806a5ab8b5c4a0e4", + "cmp_a_b": -1 }, { - "a": "0x3e9d65f96654100000000000000000000000000000000", - "b": "0xcbf91cf5d5", + "a": "0x3391a15070fe5e666c1b77c801a841c2a02f0a508313d91d15a8df0b2a70", + "b": "0x75b7f5217b7b1088a81b85b16cd4", "cmp_a_b": 1 }, { - "a": "0x62b4a4df184ed", - "b": "0x7936", + "a": "0xf5fa9dc938d45104ed0cd4d5850e5c220a22b16", + "b": "0x12b9654ea18715", "cmp_a_b": 1 }, { - "a": "0x6f9abef90a115c0000000000000000000000", - "b": "0x11fd7af143bf", + "a": "0x1942371e1ed796d007a382a53b4273b04", + "b": "0xeb5ab76a548c", "cmp_a_b": 1 }, { - "a": "0x30f30a69f674000000000000000000000000000000000000", - "b": "0x1667563466e672000000", + "a": "0x366975fc838a1ba4586e54d37a102608457", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x2542cbfcab013800000000000000000000000000000000000000000000000000", - "b": "0x1cc07f99320201", + "a": "0x1c38b3d69b71704e146312c0940a49778e2194c955f", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0xb55606641e076800000000000000000000000000", - "b": "0xc5f8755072f4b000000000", + "a": "0x9960d8ec7f527d9d2a887204ede013ef096e4", + "b": "0x2a5e8ba5bbcebf", "cmp_a_b": 1 }, { - "a": "0x1138eee5e99277000", - "b": "0x1165a16fc9762000000000000", + "a": "0x319", + "b": "0x807149b8ad161327d01d00ad75046", "cmp_a_b": -1 }, { - "a": "0x4d9021e0478f80000000000000000000000000000000000000000000000000000", - "b": "0x1e25191692a3", - "cmp_a_b": 1 - }, - { - "a": "0x5281d0af69f23c000000000000000000000000000000000", - "b": "0x59416896bf4a34000000000000", + "a": "0xe5a47f038282d95410d3bfecab", + "b": "0x99c502d", "cmp_a_b": 1 }, { - "a": "0x2b79554e045c4a", - "b": "0x2f44faa5b45df", + "a": "0x383ce962b456f7d31e5c85b5155a7b1bab76ba366", + "b": "0x1", "cmp_a_b": 1 }, { - "a": "0x9aaac0e15022180000000000000000000000000000000", - "b": "0x3d0785a765f6300000000000000000", + "a": "0x13299f9e78a222ebda4e75f26595e0c054854df85e6bf", + "b": "0x1a9", "cmp_a_b": 1 }, { - "a": "0x15034ca88376f7000000000000000000000000000000000000000000000000000", - "b": "0xd", + "a": "0x12dcef251207f9c394ba37c928b66d5", + "b": "0x4ca7", "cmp_a_b": 1 }, { - "a": "0x51a4eb9a9a141c000000000000000000000000000000000000000000000000", - "b": "0x10187023a7eb90000", + "a": "0x1f6767733eb070bdcba0cf5cdd63edc7e07ff6815e", + "b": "0xa1c", "cmp_a_b": 1 }, { - "a": "0xf35d2b64f8b6f8000000000000000000000000000000", - "b": "0x12809950671b4a00000000000000000", + "a": "0x7bb95b434e022c29e2c59c6a858e683ce69ce463f3a0", + "b": "0x20d4426ac68ba1d3", "cmp_a_b": 1 }, { - "a": "0x77ebd00e57c6b8000000000000000000000000000", - "b": "0xfe7280964523", + "a": "0x126f68b36e20ed0a01970c5e3f8d4", + "b": "0x2f6270e86f99", "cmp_a_b": 1 }, { - "a": "0x223779275d23fa0000000000000000000000000000000000000", - "b": "0x363914e2fb540c00", + "a": "0x4dca65b9d1a45ceabdcc2869d3337cbfd61c6fc", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x1cfa74d72c3bef00000000000000000000000000000000000000000000", - "b": "0xd67a58dbd44500000000000000", + "a": "0x21021d3f", + "b": "0x3ea3", "cmp_a_b": 1 }, { - "a": "0x25562a4d32ee500000000000000000000000000000000", - "b": "0x3b6", + "a": "0x5515c5fc345ce8cb0a24076ea335cb03e152aaa9cc01bc9b259aabbe", + "b": "0x2d", "cmp_a_b": 1 }, { - "a": "0xc5f", - "b": "0x34a40b87a528de000", + "a": "0x4096c7a9cc2589baedaa", + "b": "0x62b1d47667efc9585d40ed2763f7abd", "cmp_a_b": -1 }, { - "a": "0x2794dd77f9526c000000000000", - "b": "0x351d", + "a": "0x132b4d46ddc89a69c7c5971932cb77d6ce07858fabadf79f7b45d072e", + "b": "0xd3", "cmp_a_b": 1 }, { - "a": "0x7085aead15fad40000000000000000000", - "b": "0x225ba934ea9f9200", + "a": "0x382e94de1665e8adc8afed0efad277c0ac1e1b07c6d8e03069", + "b": "0x13dad30e75f68627f10fa755109f", "cmp_a_b": 1 }, { - "a": "0x248c067bd06bbe0000000000000000000000", - "b": "0x3001c8efa4def8", + "a": "0x1c7bf9ba9b59284bf34dfe7b35556c8a9fca2cc6e8cc67025b57b4", + "b": "0x7d0349d1ece6ce51ceea3c095b1061e2", "cmp_a_b": 1 }, { - "a": "0xc75409191e7ac00000000000000000000000", - "b": "0x83a2c4c7c202b0000000000000000000", + "a": "0x2eb497425cd509a0e78824f506e9fc33", + "b": "0x16fe632366e4d0cd1", "cmp_a_b": 1 }, { - "a": "0xc46e00f85d30e800000000", - "b": "0x118a4257154284000", - "cmp_a_b": 1 + "a": "0x17be", + "b": "0x4700f8007ffed37bf418d36fe5a62012", + "cmp_a_b": -1 }, { - "a": "0xa70626b5e2fd980000000000000000000000000000", - "b": "0x13c62affca2b9d000000", + "a": "0x3b24426c2dbba3dd2071a8a0492d913c27bb7934055bf3a696460d811a6c0", + "b": "0x2912d35af022c914e4e5", "cmp_a_b": 1 }, { - "a": "0x3cd0693d9e608c00000000000000000", - "b": "0x884a4bc99c5388000000000000000", + "a": "0x296d47ce727b4b2574647591789b", + "b": "0x516c78b7adf8203ab520a31f6e2", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x24715cb579f9880000", - "cmp_a_b": -1 + "a": "0x1701a61ccfeb435f12e50e4ea4da1a9439d89bb38f3fd4f", + "b": "0x12", + "cmp_a_b": 1 }, { - "a": "0x148fce305075510000000000000000000000000000000000000000000000000", - "b": "0xb00d62d50f4d780000000000000", + "a": "0xeb7660fb32f85b5c84a507c6bdbe", + "b": "0x68a4177e047978178", "cmp_a_b": 1 }, { - "a": "0x62356e7f65f6bc00000000000000000000000000000000000000000000", - "b": "0xdd95a", + "a": "0x2036d61aac3dbbd1183200f151944a60133b93bd051c", + "b": "0xe025de1c", "cmp_a_b": 1 }, { - "a": "0xd97d67b239d830000000000000000000000000000000", - "b": "0x24a1c92bf9bd1a000000000", + "a": "0x2128f82871968c27f20af9cbacc1598e3321f65db5be3e", + "b": "0x4d924bf2d7056894", "cmp_a_b": 1 }, { - "a": "0x3ae", - "b": "0xc99d811a392", - "cmp_a_b": -1 + "a": "0xcd3367a0a4e7ffbb72", + "b": "0x44d73e48039ec46d0", + "cmp_a_b": 1 }, { - "a": "0xfa87a1959713800000000000000000000000000000000000000000000000", - "b": "0x7065de6424a944000000000000", + "a": "0x3eeebb33565455fb8fae5d91abd31a", + "b": "0xe4f33f6335d9d", "cmp_a_b": 1 }, { - "a": "0xf3b963a0abec9000000000000000000000000000000000000000000000000000", - "b": "0xb3be8f69e1a808000000000000000", + "a": "0x5a853043cfbec2e6d4e7147e76b4ecc712180934615620f30fa7a438", + "b": "0xeb9cfada8291c7597b8d4", "cmp_a_b": 1 }, { - "a": "0x15945db22fcc3400000000000000000000000000", - "b": "0x24f5c3fa10f6a8000000000000000000", + "a": "0x50b64", + "b": "0x45da5", "cmp_a_b": 1 }, + { + "a": "0x4054", + "b": "0x1b94a", + "cmp_a_b": -1 + }, { "a": "0x0", - "b": "0x5706ebb0c707380000000000000", + "b": "0xcf25dc1d5ff3c", "cmp_a_b": -1 }, { - "a": "0x37c256fa60c50800000000000000000000000", - "b": "0x238e11d03805a20000000000000000", + "a": "0x3f098eef72d97eb98f113f546e1d0", + "b": "0x11f8f4d0dbb5f55f9cdc964", "cmp_a_b": 1 }, { - "a": "0x235e5cb4795c1e00000000000000000000000000000000000000", - "b": "0x0", + "a": "0xb80f0812583d2c163680428d4c8da8e8b1ffb695548dcde1b3c8b7cf16", + "b": "0x1c04db309", "cmp_a_b": 1 }, { - "a": "0x5a4e24f5779388000000000000000000000000000000000000", - "b": "0x480a6dc8d3696000000000", + "a": "0xe5d5ee9dd716d9b31501c3ba8a7790ffbb3b193b0c398a306adb881f17", + "b": "0x3fcc0", "cmp_a_b": 1 }, { - "a": "0x3b01c99dc1c11a0000000000000000000000000000000000000000", - "b": "0xd6c65450165d500000000000000", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x18cb", + "cmp_a_b": -1 }, { - "a": "0x810dcd823d349000000000000000000000000000000000000000000", - "b": "0x3", + "a": "0x96a834cff3c409936ef40dd73a38f0d3721", + "b": "0xe871e51", "cmp_a_b": 1 }, { - "a": "0xb57b88b163e77000000000000000000000000", - "b": "0xad5df3a19e39480", - "cmp_a_b": 1 + "a": "0x1c595bcf7", + "b": "0xf7225b32c6dfede0d", + "cmp_a_b": -1 }, { - "a": "0x9e9bbcbd49f2980000000000000000000000000000000000000", - "b": "0xd2896211768df0", + "a": "0x2130ddd7919017b463619acf7740f36b42914294a2f1099ceac06e", + "b": "0x66b6a017da86a284e8fb4fd6c2", "cmp_a_b": 1 }, { - "a": "0x1cfab1b360a78c000000000000000000", - "b": "0x0", + "a": "0x0", + "b": "0x8", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x5ba", + "cmp_a_b": -1 + }, + { + "a": "0xecf85508e1d49a0926bbec32", + "b": "0x3e9e96085016", "cmp_a_b": 1 }, { - "a": "0x2c43eef5edb", - "b": "0x139c15b187dca500000000000", + "a": "0x1", + "b": "0x3921b6ab174f", "cmp_a_b": -1 }, { - "a": "0x159d5317e2b79f000000000000000000000000000000000000000000", - "b": "0x2eddf76e57915e0000000000000000", + "a": "0xc0558dbf25043396f9c2d00ea0d57eb4b8cf4138556eaef6e48ba728bd97d52", + "b": "0x11809f3", "cmp_a_b": 1 }, { - "a": "0x35d13c0bd93", - "b": "0x6dea5c7f82dc1400000000000", + "a": "0x0", + "b": "0x10a83344e886848137df4615dc", "cmp_a_b": -1 }, { - "a": "0xb63c", - "b": "0x2e54", + "a": "0x6a892b9dc95ceeb4b53f1f8ad9d1ee6a0c7f28db0e", + "b": "0x88ba", "cmp_a_b": 1 }, { - "a": "0x74edd2efc89aa0000000000000000000000000000000000", - "b": "0x2", + "a": "0x2597dd77cf2ae98d1bbfa485469ec46dd06c1ba143f637f33d5b1", + "b": "0x252e4e82593aa8737", "cmp_a_b": 1 }, { - "a": "0x47107c1436f99c000", - "b": "0x8552cf680d2a68000000000000000000", - "cmp_a_b": -1 + "a": "0xe2319dd602c19cbf714add8dcc8aef4dfffb11bf91122cf2eb2ed", + "b": "0x1fdb51eec456", + "cmp_a_b": 1 }, { - "a": "0x7ed64daf36197400000000000000000000000000000", - "b": "0x2a0e9446ac641000000", + "a": "0x5f810cd78a75a7cfed10a8fe7", + "b": "0xc3ae567b1ccd464fe66", "cmp_a_b": 1 }, { - "a": "0x13c58b581545d700000", - "b": "0x150ad27a645da4000", + "a": "0x12564d3c3e6c8951068ca194d7cb840ebdaefae2b19d24ad7a79fcf0", + "b": "0x4e7ac705f76fe7a695b", "cmp_a_b": 1 }, { - "a": "0x6b1fad4140e7400000000000000000000000000000000000000000000000", - "b": "0x1659e", + "a": "0x3815ed6d8a36d03011d0fd54750e61b1d97eb2fc26fc574c358d3e42", + "b": "0xae7081b4", "cmp_a_b": 1 }, { - "a": "0x529f9b88a521bc000000000000", - "b": "0x91d709b5103348000000", + "a": "0x2d724b672865830", + "b": "0x102994907f1", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x0", - "cmp_a_b": 0 + "a": "0x22f185dd9cd4b91d7e7ea726a65113d6f94ed84", + "b": "0x7f7a4", + "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x0", - "cmp_a_b": 0 + "a": "0xe49ddd50339d23b763b29ea", + "b": "0x4eea64d23eaf3913e301c8730", + "cmp_a_b": -1 }, { - "a": "0x19e6f750070ee90000000000000000000000000000000000000000000000", - "b": "0x22fc4b9", + "a": "0x5c238731f19ccdb3c99f5cdaabc51dbcc13a03cd67d94feeae95", + "b": "0xe3", "cmp_a_b": 1 }, { - "a": "0x56e67b7f00c62c00000000000", - "b": "0x31049002a0bf0a000000000", - "cmp_a_b": 1 + "a": "0x75aff3cc60a7a2d842", + "b": "0x17ac0e385e092afe0da0e", + "cmp_a_b": -1 }, { - "a": "0xed7cd7298530c8000000000", - "b": "0x4", + "a": "0xef79bea82e21b6204bebefc20d7d4aea3cde390c36c33d550d82", + "b": "0x11ff", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x23ae23ee346a6e0", - "cmp_a_b": -1 + "a": "0x982e7cf2ffb924a6485fc3aebd368fea470f", + "b": "0x8c9a7f", + "cmp_a_b": 1 }, { - "a": "0x14b275e3a10ee30000000000000000", - "b": "0x14b275e3a10ee30000000000000000", - "cmp_a_b": 0 + "a": "0x364ea805229b4456af356dcae4e", + "b": "0x7", + "cmp_a_b": 1 }, { - "a": "0x4f6f3851be868c00000000000000000000000000000000000000000000000", - "b": "0x339722c900c55c00000000000", + "a": "0xb1f5382ecb559c510cbf3a5180d2a0acdffd0f651fff2de94ed0935144634d", + "b": "0xe01031fad1e06f00", "cmp_a_b": 1 }, { - "a": "0xc07252e4b71778000000000000000000000000000000000", - "b": "0x13", + "a": "0x41062d334cb4d9a4c0de4b89be037ad5", + "b": "0x12bdb3b15948f6332ed3dea2", "cmp_a_b": 1 }, { - "a": "0x115a4ac095184000000000000000000000000000000000", - "b": "0x1667d5572409a50000000000000000000", + "a": "0x2607687f1716696a25fc673ef5e39f3b00fecf4d53a1c3a", + "b": "0x146a6452df2510186", "cmp_a_b": 1 }, { - "a": "0x554d3ee6ebbc84000000000000000000000000000", - "b": "0xb57", + "a": "0x24b0d7bec6394b7d9216ed99ac9edd75dd0f", + "b": "0xa0e52cbc1", "cmp_a_b": 1 }, { - "a": "0xaeb275504b05400000000000000000000000000", - "b": "0x779fcd4de991b", + "a": "0x147ec97825ad137e21d5189c0ffcdc91b762b04eb32e", + "b": "0x1449598d5ca2", "cmp_a_b": 1 }, { - "a": "0x20cdb657506a9e000000000000000000000000000000000000000", - "b": "0xc2f0043b2859680", + "a": "0x69eac7e4e182b61f5351032068b53596303d936d642824b6a1b1d00dd010c", + "b": "0xa", "cmp_a_b": 1 }, { - "a": "0x1d1e6eeb9a4e0e0000000000000000000000000", - "b": "0x9de10f466e64300000", + "a": "0xbf5a02023f2da2d4cc502e1fc62a7d0e42ea50a", + "b": "0x4dbd27", "cmp_a_b": 1 }, { - "a": "0x37a55343156506000000000000000000000000000000000000000", - "b": "0xf693e7", + "a": "0xbbbce0efed3", + "b": "0x634", "cmp_a_b": 1 }, { - "a": "0x2f0540c23b9e78000000000000000000000000000000000", - "b": "0xb214a3099b", + "a": "0x0", + "b": "0x3ad21e354f6ae6d195acc", + "cmp_a_b": -1 + }, + { + "a": "0x79917ef6a76c29d", + "b": "0x78d5f54", "cmp_a_b": 1 }, { - "a": "0x1a74a694c709b5000000000000000000000000000000000000000000000000", - "b": "0xf8e16bca1806800000000000000000", + "a": "0x79028514e2cf6881adf1bdb6fed84ebfedb852f1cce93d1e5c82361", + "b": "0x1d9173c6c921adabb79a62513f", "cmp_a_b": 1 }, { - "a": "0x171cb3af76531e0000000", - "b": "0x424b74c39054d40000000000000", + "a": "0x662035dd6459331f2c908", + "b": "0x22a6642198f1d55280869f58e959642a", "cmp_a_b": -1 }, { - "a": "0x37bb20dc399cba0000000000000000000", - "b": "0x75d", + "a": "0x4269af6d096ec0fe51894d4834bb3a05147fea", + "b": "0x17b0b9", "cmp_a_b": 1 }, { - "a": "0x195d0b4aeca91a0000000000000000000000000000000000000000", - "b": "0x1d5f7024", + "a": "0x9ed8441566a686d6ffb30673605fca7b7e7fcfdcd398e0b7aa6ee8026f9e65cca", + "b": "0x254c0ebf3692b22", "cmp_a_b": 1 }, { - "a": "0x2542d22dac097e0000000000000000000", - "b": "0x1540fbbe80f5d6000000000000000", + "a": "0x70d48947a59ff", + "b": "0xf2720168", "cmp_a_b": 1 }, { - "a": "0x486aa4cac2f8", - "b": "0x9788f380d2f470000000", + "a": "0x3fd5baf665329bbd86ece89ce20ca9553d2", + "b": "0x7f3367cf0887f4ad1b5", + "cmp_a_b": 1 + }, + { + "a": "0x616727c8a86a03fd60b3", + "b": "0x1d9463df41cf488e06c19827f2b36", "cmp_a_b": -1 }, { - "a": "0x1547189d423995000000000000000000000000000000000", - "b": "0x10801f9bd7a31b00000000000000000", + "a": "0x47542bb89cf414ba49e36c5728c9205", + "b": "0x90941a7e9c915ad4d1", "cmp_a_b": 1 }, { - "a": "0x2fd51105a2a05a0000000000000000000000", - "b": "0xcd466ea7effe700000000000000000", + "a": "0x9fa9abd66f25cbe207fe7ec8118dcca62f529eb616292b043072b1215996c8b3", + "b": "0x5437baf2dd8f01d192eec", "cmp_a_b": 1 }, { - "a": "0x72f8e5211925f40", - "b": "0x59", + "a": "0x22b6be42534d858b1e89782e23d2e902f9ffc1c", + "b": "0xf021e4937198d", "cmp_a_b": 1 }, { - "a": "0x255ce855414b3600000000000000000000000000", - "b": "0x2c", + "a": "0x0", + "b": "0xb", + "cmp_a_b": -1 + }, + { + "a": "0x18ac516b264357bb8be94703f1ed0add178efbaa5daefaba3770b", + "b": "0x4a2aca5d01c19", "cmp_a_b": 1 }, { - "a": "0x3f091e2c2def9e0000000", - "b": "0x1d6e07911721100000000000000000000", + "a": "0xeaab6a712d0", + "b": "0x511289bf808a845950bc0c180adf1c0a", "cmp_a_b": -1 }, { - "a": "0x819db", - "b": "0xdf46096b696d600000000000000000", - "cmp_a_b": -1 + "a": "0x14", + "b": "0x14", + "cmp_a_b": 0 + }, + { + "a": "0x1cef406ec3989a4a2a9c6735a17352ec0382", + "b": "0x7dbb754fc5281", + "cmp_a_b": 1 }, { - "a": "0x18d66a10f178880000000000000", - "b": "0x91e539", + "a": "0x294544469ec12c2611de41538007c571562d68e33b", + "b": "0x39ed870c9b7146e", "cmp_a_b": 1 }, { - "a": "0xc3d7b2b22a714800000000000000000", - "b": "0x34920c1c47", + "a": "0x7867789b75a25457", + "b": "0x5", "cmp_a_b": 1 }, { - "a": "0xb39262d6c9793800000", - "b": "0x5af422c9c1e04400000000", - "cmp_a_b": -1 + "a": "0x3b26a53376f9842bf28b9560a32cd7", + "b": "0x56d", + "cmp_a_b": 1 }, { "a": "0x0", @@ -5748,9261 +5763,9246 @@ "cmp_a_b": 0 }, { - "a": "0x516ef5817ea3ac0000000000000000000000000000000000000000000000", - "b": "0x0", + "a": "0x216e155d4fed13bea22432cc59b1688393f7", + "b": "0x1a", "cmp_a_b": 1 }, { - "a": "0xf855a839a5b028000000000000000000000000000000000000000000000000000", - "b": "0x30f", + "a": "0x152ad8e89", + "b": "0x8e66bc509dab02bd4c3f9e8a5a981bd", + "cmp_a_b": -1 + }, + { + "a": "0x20489528eaf4b062fce1b34ed68217ae3a848e79d67bcee1f51e9", + "b": "0x25cb87d2d8eb6d", "cmp_a_b": 1 }, { - "a": "0x1c5df5", - "b": "0x16", + "a": "0x43ecfccdbab0b13b40ac30cceeb348d46113", + "b": "0x7762ffcb2aa3", "cmp_a_b": 1 }, { - "a": "0x1bf09795749fd1000000000000000000000000000000000000000000000000", - "b": "0xef3175f7341ca80000000000000", + "a": "0xe16cd40e243c33d03ab319ae45b333c70f6000f24cfe1f8a", + "b": "0x1bb10fad3771", "cmp_a_b": 1 }, { - "a": "0x49", - "b": "0xa32e6d6c6bf6380000000000", - "cmp_a_b": -1 + "a": "0xfd3e32985c817a937cc865f40ec4712d527a03cc17dde07363cd2", + "b": "0x26496d5", + "cmp_a_b": 1 }, { - "a": "0x21da4e8f4ed9840000000000000", - "b": "0x0", + "a": "0x3ff295cb32d747134f75266700b2978e9e0cd8b2da562c6", + "b": "0x11f88139bf93e5fbc7cb", "cmp_a_b": 1 }, { - "a": "0xb4154ed3975ec00000000000000000000000000000000000000000", - "b": "0x1a92cff", + "a": "0x1c55b421811ff0125f0449", + "b": "0x3a26299df181e4f", "cmp_a_b": 1 }, { - "a": "0xc1", - "b": "0x6885d2a6ad4f0c0000", - "cmp_a_b": -1 + "a": "0x24886291f15b76d8718685c4d668807a68fabb3", + "b": "0x1c27d04fbfedbee4da7ab175631d", + "cmp_a_b": 1 }, { - "a": "0xade38d3021", - "b": "0x567015e73065840000000000000", - "cmp_a_b": -1 + "a": "0xc2e3704d75fe3e7c52dc01327278ceda12915fd209f32", + "b": "0x4adf7ab50a277e0", + "cmp_a_b": 1 }, { - "a": "0x1f", - "b": "0x1904035f1374ca00000000000000000", - "cmp_a_b": -1 + "a": "0x1d9f198b3f261c5f87eff12d06ce5", + "b": "0x912", + "cmp_a_b": 1 }, { - "a": "0x4d9b6b5a53ac980", - "b": "0x618b31280a", + "a": "0x4837a73311e42da", + "b": "0x39d", "cmp_a_b": 1 }, { - "a": "0x22ef1e3d2dd8b800000000000000000000000000000000", - "b": "0x3decc2105b70a000", + "a": "0xf85f82283e4d7a28308950724d7dbfd37f0107d458a85e8694", + "b": "0x1caa9df00ded5ea11", "cmp_a_b": 1 }, { - "a": "0x1a6", - "b": "0x13b33f12f9bc140000000000000000", - "cmp_a_b": -1 + "a": "0xbbef6eeff6307286a3f5f60a30b570fe", + "b": "0x207ccfc4", + "cmp_a_b": 1 }, { - "a": "0x19aecee0d3cac400", - "b": "0x16dfd0e0b25e710000000000000000000", + "a": "0xbb99fb325659ab7a4883c9", + "b": "0xbb99fb325659ab7a4883c9", + "cmp_a_b": 0 + }, + { + "a": "0x1d96f8b7", + "b": "0x3eece5c7b0ad5fd5a2", "cmp_a_b": -1 }, { - "a": "0x4b684fe35877bc00000000000", - "b": "0x3168f70", + "a": "0x7df93e0d5d7a6058518c8a622d53fa183", + "b": "0x31b9ffb311e39c69d1b180", "cmp_a_b": 1 }, { - "a": "0x406b4cb33adca00000000000000000000000000000000", - "b": "0xb1a686d1d2cd880000000000000", - "cmp_a_b": 1 + "a": "0x19cba7e885a819600eab25f6", + "b": "0xca1f3579404fb0a11815b470b8c2", + "cmp_a_b": -1 }, { - "a": "0x181f0c90a2f3b400000000000", - "b": "0xfea996a925cb700000000", + "a": "0x2a5cbf74c16073fb7c3a93a5e78ec99ad9bb", + "b": "0x47527febc215777894", "cmp_a_b": 1 }, { - "a": "0xf54f67df7a42a00000000000000000000000000000000000000000000000", - "b": "0x1b35488a0f4eb4000000000000", + "a": "0x76b1ab2e1c7087e5a469d02f1173924b70918e85df4e0e8ab2e8bc1", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x1e9d6c85ca2f1d000000000", - "b": "0x137a37afe69", + "a": "0xf5fc325671f9857916b319835245afe5f37d3a6d8179a", + "b": "0x79210bb44af62d891a86421e3aa38", "cmp_a_b": 1 }, { - "a": "0xa7bc085", + "a": "0x686d03d06c3a6e073660fc39f55aae577c63747a", "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x1f4f5279ee08b100000000000000000000000000000000", - "b": "0x2a19eb487274ca00000000000000000", + "a": "0x341b7c8bbea21dd5d3b9bd4f75de64b4270089b4d3ac725e67e62", + "b": "0x74e2296932eff", "cmp_a_b": 1 }, { - "a": "0x18a5e0769cdfe0000000000000000000000000000000000000000000000000", - "b": "0xe4b", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x6a51aa44e829e9bc39066b", + "cmp_a_b": -1 }, { - "a": "0x1c6bc332f1a81c0000000000000000000", - "b": "0x59dcffd591b1a00000", + "a": "0xdfeff9d6a77153b5c7dfc64af5adf3d148867a65698eaad4fae26d0451ad86", + "b": "0x13f5e73db6a6668e9543cfd8", "cmp_a_b": 1 }, { - "a": "0x21ff3b743828600000000000000000000000000000000000000000000", - "b": "0x3139cfa3b60b7e00", + "a": "0x2b68bc69e730261181a00c0f9e5399e55a0fcb3422e2e95552a41d2", + "b": "0x264d30dd30ac64c5", "cmp_a_b": 1 }, { - "a": "0x76cb03d7a5ccc80", - "b": "0x989b3154", - "cmp_a_b": 1 + "a": "0x152bf23c79db9d4e210675", + "b": "0x152bf23c79db9d4e210675", + "cmp_a_b": 0 }, { - "a": "0x4594ffd20285b00000000000000000000000000", - "b": "0x1d065c3283", + "a": "0x2c82214561c0e4a2a4cdea3df4a0660907a963cf627de69131507d92f42460", + "b": "0x1", "cmp_a_b": 1 }, { - "a": "0x8c0b42a52916480000000000000000000000000000000000000000000000000", - "b": "0x1dcc0468eb47d7000000", + "a": "0x4", + "b": "0x151d6fbd67672789d64c6cd6", + "cmp_a_b": -1 + }, + { + "a": "0x1dd30b3584ff1ff6cf9308db1e3e915c4259bab2d8ab2818e27a7081aef6", + "b": "0xdf1cf4b2", "cmp_a_b": 1 }, { - "a": "0xe471699908d3880000000000000", - "b": "0xea92371ea556980000000000000", + "a": "0x162c240f59c95d", + "b": "0x210ad5a0ebeb1498a9c93322efbf62", "cmp_a_b": -1 }, { - "a": "0x8a7f4320a63a08000000000000000000000000000000000000000000000000000", - "b": "0x355e017b3", + "a": "0xe7ee8530d4af32a021", + "b": "0x5fbc771b5f5cf3e", "cmp_a_b": 1 }, { - "a": "0xc904cc4803baf000000000000000000000000000000000", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x4a92399c4f56173", + "b": "0xdd67730f1568ef154bf5f", + "cmp_a_b": -1 }, { - "a": "0x1037b1290bfd7a000000", - "b": "0xe012dfbb9dbf4800000000000000000", + "a": "0x38b18570b864364a8", + "b": "0xa73747a5829c1d31538c9", "cmp_a_b": -1 }, { - "a": "0xaf118539da21d80000000", - "b": "0x1", + "a": "0x35b9aa3e05d9b49d9aec3c5f4cd19b058e9282f4757ee6eb176f15c2bdb6e3e", + "b": "0x345ef88a6fda58db4e449a3421c", "cmp_a_b": 1 }, { - "a": "0xf10d0247d4d858000000000000000000000", - "b": "0x1682d7d9378ba", + "a": "0xb1fa84267f803ae3fa2e526c47308c9fd57dcedb8acba4b2aea55ce59991f", + "b": "0x20850f8b79a0d008c043feeedac826fc", "cmp_a_b": 1 }, { - "a": "0x1827d3f406e3850000000", - "b": "0x1d19a17ae865da0000000000000000", - "cmp_a_b": -1 - }, - { - "a": "0x6986e3dc216c38000", - "b": "0xb4", + "a": "0x4c4d5c86ef3e072862aab24cc701315b", + "b": "0x321bd0f", "cmp_a_b": 1 }, { - "a": "0x136ace56d329f00000000000000000000000000", - "b": "0x30dfc206", + "a": "0x1c69aff564748f2247", + "b": "0x12fb69", "cmp_a_b": 1 }, { - "a": "0x12c03a062c85a20000000000000000000000", - "b": "0x33b00188c0ce280000000000000", + "a": "0xb65e2f858789dba646720fb7b58f21de469633870", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0xc51f87639171200000000000000000000000000000000000000000000000", - "b": "0xf453284daf4f6800000", - "cmp_a_b": 1 + "a": "0xd00805e", + "b": "0x1d75d9659", + "cmp_a_b": -1 }, { - "a": "0x2d8b601be4c0d8000000000000000000000000000000000000000000000000000", - "b": "0x9184a56d92c980000000000000000", - "cmp_a_b": 1 + "a": "0x2ff74164e51eee", + "b": "0x2ff74164e51eee", + "cmp_a_b": 0 }, { - "a": "0x14c8194de53b2b00000000000000000000000000000000000000000000", - "b": "0x3a49b5c7920c1600000000000000000", + "a": "0xe2edcba8f667e", + "b": "0xb", "cmp_a_b": 1 }, { - "a": "0x8e2d9f45", - "b": "0x11af13", - "cmp_a_b": 1 + "a": "0x922", + "b": "0x172748ecf9d32f3c68", + "cmp_a_b": -1 }, { - "a": "0xbed0c96ffc8470000000", - "b": "0x2eefd", + "a": "0x7eefb05eae756111af0c676be813738d0b720", + "b": "0x6aa0a55a604f9cc61ee7c76", "cmp_a_b": 1 }, { - "a": "0x7ccace57e4e52000000000000000000000000000000000000000000000", - "b": "0x8f32b777f8791800000000000", + "a": "0x38a1adb7205977aa0409e7d6a5cc4d1e460c9ab97caa1db9203fc81fd054", + "b": "0x3cf923e491a2ae0533ff6c764", "cmp_a_b": 1 }, { - "a": "0x35a8d3845d954a000000000000000000000000000000000000000000000000000", - "b": "0xef63f5789b", + "a": "0xad581f8282a4f1798ae72bf3e4ee79c5a55fd0bb8", + "b": "0x32ca0e29172cb541", "cmp_a_b": 1 }, { - "a": "0x3a589120620f8e00000000000000000000000000000000", - "b": "0x23ba9a2f648f58", + "a": "0x2ad5b3f7e9981d1b8df614d7d5a664", + "b": "0xeb3b29a3737e28bfd", "cmp_a_b": 1 }, { - "a": "0xf2ca072d14d19800000000000000000000000000", - "b": "0xea19bbeb2515c8000", + "a": "0xf48196e9e26", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x2539b0e5ec812a000000000000000000", - "b": "0x329255108fe8ba000000", + "a": "0x126d30fca62f8237a", + "b": "0x3f24829ec1824", "cmp_a_b": 1 }, { - "a": "0xf", - "b": "0x520a557707eaa80000000000000", + "a": "0x21afc462b95e67", + "b": "0x28f9a028f8b749445", "cmp_a_b": -1 }, { - "a": "0x96ed3dfad440f80000000000000000000000000000000000000000000000000", - "b": "0x4718d6a946acb000000000000000", + "a": "0x6fa5601db", + "b": "0x6fa5601db", + "cmp_a_b": 0 + }, + { + "a": "0x939d82eaae3a10e68f8ca77ff11f9b016a331728e0d3c16bde7f", + "b": "0x38d", "cmp_a_b": 1 }, { - "a": "0x37519cfe1e8a520000000000000", - "b": "0xd7d0ecc07409880000000000000000", + "a": "0x0", + "b": "0x361908ecc5d070edb76943216a", "cmp_a_b": -1 }, { - "a": "0x6785bd84722", - "b": "0x40c5458416aaa", + "a": "0x2c0e1199333c0927717d2ca222fd", + "b": "0x1f48264d5cad22f7be4543af52271", "cmp_a_b": -1 }, { - "a": "0x86b43fb0d580b0000000000000000000000", - "b": "0x32134b8006cd520000000000000", + "a": "0x37c61621fdce5125633828a85e0ce8d3874", + "b": "0x294edb9", "cmp_a_b": 1 }, { - "a": "0x4d90c07e001f300000000000000000000000000000000000000", - "b": "0x36c55d9cff0dbc00000000000000", + "a": "0x3ff01c346d43983144088aadf8dbc897354c9f", + "b": "0xc47dc325ac15c", "cmp_a_b": 1 }, { - "a": "0x7ca43394ee8054000000", - "b": "0x14075b01637c", + "a": "0x3f249b1aede20d5c36b07d0fae54cb4", + "b": "0xfb115", "cmp_a_b": 1 }, { - "a": "0x46dd30f5a6b45800000000000000000000000000000000000000000000000", - "b": "0x1ba", + "a": "0xb8c8b60a638470d1c6d308bee994081434b977fb38722edee8e6", + "b": "0xe7db835b3688901", "cmp_a_b": 1 }, { - "a": "0xd", - "b": "0xf68ef361c", + "a": "0x0", + "b": "0xe25862b71200ce", "cmp_a_b": -1 }, { - "a": "0x236e3a6288a8720000000000000000000000000000000000000000000000", - "b": "0x14654cbfa909", + "a": "0x11217415222401d3a9fcd6e4f94a2a7d31df968684f88a", + "b": "0xb37b4f8d1e5a83ed", "cmp_a_b": 1 }, { - "a": "0x13a043f0a910ec0000000000000000000000000000000000000000000", - "b": "0x1a0225cf651fe2000000", + "a": "0x2aa63a5464c5fb152", + "b": "0xd4cd", "cmp_a_b": 1 }, { - "a": "0x36839d417381d200000000000000000000", - "b": "0xb8e0213d88dbf000", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x34014", + "cmp_a_b": -1 }, { - "a": "0x61f81aa0395098000000000000", - "b": "0x81fcd0f60dad300000", + "a": "0x7c82f55953f41a1636ce12ae37a849d1d42494296b689ce2b31292f94c4d", + "b": "0x4c805d05112a02", "cmp_a_b": 1 }, { - "a": "0x1342b0ff24e5d4000000000000000000000000000000000000000000000000", - "b": "0x61c15705e75c140000000000", + "a": "0x3443f5081577352bbead026a474c9118fd7ee33d76d911405", + "b": "0x1dda89", "cmp_a_b": 1 }, { - "a": "0x2ceaf198b5ada8000000000000000000000000000", - "b": "0x220ef00c2e0", + "a": "0x5f819468f30cecf393129c945be8145d9", + "b": "0x3f20be86a2501f76f80a2fd2", "cmp_a_b": 1 }, { - "a": "0x8d75239f5e", - "b": "0xa72ff8", + "a": "0xa207c8a2ab5123047286ac5bc700fd3e7a38ac98fdda4d", + "b": "0x38eaf1814836831313de798", "cmp_a_b": 1 }, { - "a": "0x1c9d9220b1a192000000000000000000000", - "b": "0xa", + "a": "0x15cdce9658d862158658acab37934c7ac7", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x10d4fa3a67fee500000000000000000000000000", - "b": "0x1eb9def126494f000000000000", - "cmp_a_b": 1 + "a": "0x1f0520b710354", + "b": "0x1f0520b710354", + "cmp_a_b": 0 }, { - "a": "0x205686b93a619c00000000000000000000000000000000000000", - "b": "0x3fe541142fa", + "a": "0x915d33adf6a11c62dd64a97fb334b", + "b": "0x200eacf3d", "cmp_a_b": 1 }, { - "a": "0x273c547da9deec0000000000000", - "b": "0x273c547da9deec0000000000000", - "cmp_a_b": 0 - }, - { - "a": "0x6bf3d0f6205f900000000000000000000000000000000000000000000000", - "b": "0x17dba8b2170842000000", + "a": "0x740862b01078277b75fd164a5c3ac10314f98151b349", + "b": "0x3327b49532c5dad3729728a9914652", "cmp_a_b": 1 }, { - "a": "0x166007a", - "b": "0xf487f", + "a": "0xa0c4d3fa469da88f8508b92", + "b": "0x3add9b6f42bd383ef52", "cmp_a_b": 1 }, { - "a": "0x1a56512cd6492a000000000000000000000000000000000000000", - "b": "0x4e3", + "a": "0x84496ae90a27b0ea7ef99565684a380c907727dc87ea6b542ad26e9", + "b": "0x2873c14e766f4a58815", "cmp_a_b": 1 }, { - "a": "0xea7394758ad820000000", - "b": "0x41bc2a2812738400", + "a": "0x2841a19e65fbd916cd68fd5ec022e891", + "b": "0x3119c023096610ef6e65494bd3645fc", "cmp_a_b": 1 }, { - "a": "0x274c2c2c13a2ac00", - "b": "0x3720eb20f19412", + "a": "0xfde0c9948fb7d4fd31bda4d2e173e", + "b": "0x982ce253002583194d420cfce4e", "cmp_a_b": 1 }, { - "a": "0x613c", - "b": "0x613c", - "cmp_a_b": 0 + "a": "0xc4cf37b2185d", + "b": "0x3a3", + "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x1e91a098d1edaa00000000000", - "cmp_a_b": -1 + "a": "0x6a866aef312ad63448e178c2b2865b867576227f17d368bd", + "b": "0x7d365c83ea4e5a2c1fef3dd6ed8f302e", + "cmp_a_b": 1 }, { - "a": "0x5f4f6bff801e04000000", - "b": "0x44dcf08602f3b8000000", + "a": "0x161d96101ad1f39afb681df870155c38fc7db8", + "b": "0x5", "cmp_a_b": 1 }, { - "a": "0x1c7779e2d9d37a00000000000000000000000000000000000000000", - "b": "0xf2bd748ae4dba0000000000000", + "a": "0xa3ff34b7c2ce6c9b7e9acd18227cbc27bb7f99c085d6df8156252006", + "b": "0x15304ca7f598ec4e7", "cmp_a_b": 1 }, { - "a": "0xe5235394253b60", - "b": "0x5fa11e5e645ce4000000000000000", + "a": "0x1d00a4a13198", + "b": "0x1309e6d12f889483", "cmp_a_b": -1 }, { - "a": "0x14e095dce717c80000000000000000000000000000000000000000", - "b": "0x4fc1bd3e5", + "a": "0xec9665aa519b0912a8f926d4409d1a23b", + "b": "0x90f141abc918ec785b144", "cmp_a_b": 1 }, { - "a": "0x1594290e581e360000000000000000000000000000000000", - "b": "0x350550dfded72400000000000000", + "a": "0x42a99ce4cd", + "b": "0xedcdf4d20476", + "cmp_a_b": -1 + }, + { + "a": "0x91488dcd7a23128102153284797ca0d4f36fb69b0ffc2960d6", + "b": "0xc8d98e8e32274b7e0d5717085dbbc", "cmp_a_b": 1 }, { - "a": "0x124ae845667bac000000", - "b": "0x80efae16665f3800000000000000000", - "cmp_a_b": -1 + "a": "0x7c2b9b12ad40bbb5f2cb6585303c4113988d406839", + "b": "0x7", + "cmp_a_b": 1 }, { - "a": "0x65295741b5da7", - "b": "0x6b311ea34b081c000000000000000", + "a": "0x21474daf99a6433a77d7c3", + "b": "0x6386fcf3a51fd86c51c23926", "cmp_a_b": -1 }, { - "a": "0x3303760600", - "b": "0x3303760600", + "a": "0x3537b8", + "b": "0x3537b8", "cmp_a_b": 0 }, { - "a": "0x2d4bc99f35a38c000000000000000000000", - "b": "0x108b6308dbac3e000000", + "a": "0x68b51f270d47d10460c9e06be775390d3477acfbf6dcaf7bddaac9599", + "b": "0x640", "cmp_a_b": 1 }, { - "a": "0x41a4f73d2c02f0000000000000000000000000000000000", - "b": "0x173fb140f89af500000000", + "a": "0x1fe199d8bfd370cf574572ce48784975c699", + "b": "0x4ee2ae2a2c587b1721c415791f205c08", "cmp_a_b": 1 }, { - "a": "0x4d006b", - "b": "0x43c08bad4b5b94000000000000000000", - "cmp_a_b": -1 + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 }, { - "a": "0x1432504816ed6a00000000000000", - "b": "0x34", + "a": "0x1936c3f9d08061c53013bb05c5", + "b": "0x290404ae6f1a15", "cmp_a_b": 1 }, { - "a": "0xb6814826e5d8c80000", - "b": "0x286e198c4c3cf00000000000000000000", - "cmp_a_b": -1 - }, - { - "a": "0x8bd31330e59ad0000000000000000000000000000000000000000000000", - "b": "0x12b97c61382a0e000000000000000", + "a": "0x7749c47f80b", + "b": "0x4", "cmp_a_b": 1 }, { - "a": "0x1f4a41641e3f170000000000000000000000000000000000000000000000000", - "b": "0xe7f1419a4ba02000000000000000000", + "a": "0x8b30ebbc767692e0c149d3670f55a1e69847eaabf2694090322ad81d771", + "b": "0x45dd55a5", "cmp_a_b": 1 }, { - "a": "0x164a05b22b5fe300000000000000000000000000000000000", - "b": "0x5cea2a1cb1e22000000000000000000", + "a": "0x14ce7751a1eddfef593d4be256f87954551d13235ea89b3", + "b": "0x82", "cmp_a_b": 1 }, { - "a": "0x2", - "b": "0x14d40b17cf801000000000", + "a": "0x18bd263ecbe", + "b": "0x134c25f94d967249984fe", "cmp_a_b": -1 }, { - "a": "0x10121b54472", - "b": "0x21eb186d929be6", - "cmp_a_b": -1 + "a": "0x15f2a2d9b7068d9aa0403570d3ee", + "b": "0x64e25e7f23824742ec7", + "cmp_a_b": 1 }, { - "a": "0x77de44", - "b": "0x5526ec8d8b21e8000", + "a": "0x585f53a1", + "b": "0x3c422f20ea4bd1afab2ef2d5c", "cmp_a_b": -1 }, { - "a": "0x69733b430024c4000000000000000000000000000000000000000000000000000", - "b": "0x154762fb87989d0000000000", + "a": "0x10d7560bb1747aebb8b34328b9a83", + "b": "0x37b40b3fa8b6a2761af88f18d598", "cmp_a_b": 1 }, { - "a": "0x1198b063e5e3", - "b": "0x4f08c0", + "a": "0xf7247d38ed2bb3d188213351f156eb8", + "b": "0x1ab1f3985a955b67f69d5b54c57344", "cmp_a_b": 1 }, { - "a": "0x1175bbe1cfed39000000000000000000000000000000000000", - "b": "0xda44d5b9109e100000000000", + "a": "0x39646664ef10799a6f4165e66ddc3a775cc44ee079366", + "b": "0x333230a8af3ce372c73866bdcd", "cmp_a_b": 1 }, { - "a": "0xf6806aeda951580000000000000", - "b": "0x7f372766a974240", - "cmp_a_b": 1 + "a": "0x76f12ff0", + "b": "0xb5c44f9ea91fe149f35d6b", + "cmp_a_b": -1 }, { - "a": "0x167a75b3874b6a000000000000000000000", - "b": "0x1", + "a": "0x847eee709813f8955f852a2ab116f", + "b": "0xa36e", "cmp_a_b": 1 }, { - "a": "0x47eb4fd429d06c00000000000000000000000000000000000000000000000", - "b": "0x0", + "a": "0xbb6f26ec1b7b0", + "b": "0x15f9a2156d67", "cmp_a_b": 1 }, { - "a": "0x1f7b2e8d609e7300000000000000000000000000000000000000000000", - "b": "0x8c6", + "a": "0xdfb9", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x1f5a55c4b1249e000000000000000000000000000000000000000", - "b": "0x9fe22c83546a08", + "a": "0x1c77ffd5e755fee0d7880521e37dddfc64818409419", + "b": "0x2c61870c98d48a5ae0", "cmp_a_b": 1 }, { - "a": "0x41976dc968b91c000000000000", - "b": "0x41976dc968b91c000000000000", - "cmp_a_b": 0 + "a": "0x1f", + "b": "0x149c2b9ad1b604184c", + "cmp_a_b": -1 }, { - "a": "0xc42bba62641d400000000000000000000000", - "b": "0x40eb385fa7813c", - "cmp_a_b": 1 + "a": "0xdd3290b13", + "b": "0xa9ae125128961880b6a4cfcec2c1d", + "cmp_a_b": -1 }, { - "a": "0x95dbff74de9fe800000000000000000000000000000000", - "b": "0x19cde6af3f9da9000000000000000", + "a": "0x5864b7ae624a67ec7a123063aa9e2566d8cf0bad7373d", + "b": "0x2e04952a4ff5", "cmp_a_b": 1 }, { - "a": "0x24f982f8c", - "b": "0x2da92041", + "a": "0x432cb1947115e58ded3a7c0eeae85f650bb629cb346925128c8b2b", + "b": "0xae079570e4bb53cf3dacf725880b516", "cmp_a_b": 1 }, { - "a": "0x41480aad3fa0c00", - "b": "0x13e036d47c79710", + "a": "0x62ae1012f5d00d9045578239df5b9cf89fa85b4692f24c863bb6513595", + "b": "0x1ab27084722316fab7a98ac769bc0", "cmp_a_b": 1 }, { - "a": "0x12b0203c92048c00000000000000000", - "b": "0x1b1999acdabecf00000000000", + "a": "0x285dbe32586da3b858bd5ac500cf83fcb34236de998467d7d1f82b", + "b": "0xda8fe8ffd1977c5b893b04d36c61a", "cmp_a_b": 1 }, { - "a": "0xbe74e1cfaeda18", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x5dac9", + "b": "0x358cea9f931b6eb3dc4", + "cmp_a_b": -1 }, { - "a": "0x1aa10fb8a3cf5400000000000000000000000000000000000", - "b": "0x131ccc78", + "a": "0x2c5f89d41231718a90a80f62b31c5b0bb0d6db9a07df696899e22e4e6b8", + "b": "0x1246d10a3909", "cmp_a_b": 1 }, { - "a": "0x6d4864b48ebcf400000000000000000000000000000000000000000000", - "b": "0xd0c5f95", + "a": "0x69d15325a148642891b80e1397c", + "b": "0x20f27642695", "cmp_a_b": 1 }, { - "a": "0x345db297a", - "b": "0x207aeb98b290b200000000", - "cmp_a_b": -1 - }, - { - "a": "0x1d88e627", - "b": "0x1d88e627", - "cmp_a_b": 0 - }, - { - "a": "0xdf4903b58c9ae0000000000000000000000000000000000000000000", - "b": "0xca2b123145", + "a": "0x57f24ad874e82faf32d4", + "b": "0x56f", "cmp_a_b": 1 }, { - "a": "0x2f87d7515d82a", - "b": "0x3", + "a": "0xe372fa5cfb0b3ea0713d5b624b4e5afa7f708a3ed4", + "b": "0x6", "cmp_a_b": 1 }, { - "a": "0x4", - "b": "0x59b68feb791250000000000000000", - "cmp_a_b": -1 - }, - { - "a": "0x2ced707aeaeb860000000000000000000000000000000000000000000000000", - "b": "0x52a82f38401e60000", + "a": "0x6cf53e954ee8", + "b": "0xd633c3", "cmp_a_b": 1 }, { - "a": "0x404898489a84e00000000", - "b": "0x307b70d921deae00", + "a": "0x49818baf495", + "b": "0x2dc2e", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x0", + "a": "0x9b0ca574aaf124955c52c6158c59dbeb", + "b": "0x9b0ca574aaf124955c52c6158c59dbeb", "cmp_a_b": 0 }, { - "a": "0xba86bebafc34d8000", - "b": "0x10ca38c2e4939e00000000000000000", - "cmp_a_b": -1 + "a": "0x38d97f74a5e6cb7eb4598aa1f36540d69588ab5e1b4", + "b": "0x91f", + "cmp_a_b": 1 }, { - "a": "0x156c6f5ee2d29a0000000000000000000000000000000", - "b": "0x209509ea78c6040000000000000000", + "a": "0xf0079aec91", + "b": "0x6465efa6", "cmp_a_b": 1 }, { - "a": "0xb24598c600cf28000000000000000", - "b": "0x521412bb3e2d4c", - "cmp_a_b": 1 + "a": "0x5c306db017", + "b": "0x16685411cf57e7701e12620cc3908adf", + "cmp_a_b": -1 }, { - "a": "0x1ce37e32ee7b3600000000000000000000000000000000000", - "b": "0x1982ddd970eb2f00000000", + "a": "0x2c7afa8d3f255a1bb454d73037b644e9", + "b": "0x2f0398141393fe", "cmp_a_b": 1 }, { - "a": "0x1dd611c85e9ec000000000000000000000000000000000000000000000", - "b": "0x5", + "a": "0xf5ced874e988ff0", + "b": "0x61394028539c", "cmp_a_b": 1 }, { - "a": "0x29", - "b": "0x645a112", - "cmp_a_b": -1 + "a": "0xf3b4700ed8a0f5048a07c42e08250925d273d0", + "b": "0x11fb63e69", + "cmp_a_b": 1 }, { - "a": "0xeed", - "b": "0x2bcb300b149d3c000000000000000", + "a": "0x23129362844889e691570c716", + "b": "0xe52392fe963e96082aba194bc7baee", "cmp_a_b": -1 }, { - "a": "0xb80e46784584680000000000000000000000000000000000000000000000000", - "b": "0x36a6acdd2a1a4", + "a": "0x713c279b25b83ccd533ae998c8c8155ba781", + "b": "0xcde55615ab7c2d7d2b534efb207cf", "cmp_a_b": 1 }, { - "a": "0x16e715927", - "b": "0x16e715927", - "cmp_a_b": 0 + "a": "0x3b7e88a8b18afc612d9ca19890a53b304e", + "b": "0x1750b56a820f", + "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x1b4a509ffab14d00", + "a": "0x131fed22", + "b": "0xee4dc2fd37f", "cmp_a_b": -1 }, { - "a": "0x169ddf44991e3b000000000000000000000000000000000000000", - "b": "0x558953c2f234", + "a": "0x1d1cb29f3b139d140ebcf22e57aaa0803fd85afcad455e3ba2cf1686863e50", + "b": "0x2ab9f91e6fef", "cmp_a_b": 1 }, { - "a": "0xda927c2057f53800000000000", - "b": "0x3a93f1791f156200000", + "a": "0x25f1fa6c0a552c9b7a43bd900a2b50d3582dfd87970657", + "b": "0x343886c30047", "cmp_a_b": 1 }, { - "a": "0x3a6f9ba87293cc000", - "b": "0x67611ce94a93640000000", - "cmp_a_b": -1 - }, - { - "a": "0x291d4db765d2040000000000000000000000000000", - "b": "0xbf21d43f1796d000000", + "a": "0x4281381ebb5613fae217e9e2d720d2fc0f1f7f337fa387814041d", + "b": "0x214ff7c7bec0092bb17953fad41f", "cmp_a_b": 1 }, { - "a": "0x7b6bcd31f1a17c000", - "b": "0x158d9a1d798", + "a": "0x170f91669a0321b88d3f79a54c0f21f7d2c9026490e67cafe03071b278bbd5", + "b": "0x6ede637a5de954714d609cc6", "cmp_a_b": 1 }, { - "a": "0x1ec4b5a05342b7000000000000000", - "b": "0x1ec4b5a05342b7000000000000000", - "cmp_a_b": 0 + "a": "0x49737d1278f8bbb9f7d3f", + "b": "0x45c0fac6109e517", + "cmp_a_b": 1 }, { - "a": "0x41b6b473ad3a68000000000000000000000000000000000000000000", - "b": "0x3", - "cmp_a_b": 1 + "a": "0xa9ff6041c0e92512e9a3cd9f753a", + "b": "0x2c07d4493d17bfd0baa227b8b398d5d3", + "cmp_a_b": -1 }, { - "a": "0x3c73e0310c9a0600000000000000000000", - "b": "0x15740325df3dcc00000000000", - "cmp_a_b": 1 + "a": "0xe", + "b": "0x4c", + "cmp_a_b": -1 }, { - "a": "0xa61680c0b6469800000000000", - "b": "0x14d7f4fa86740500000000000000", + "a": "0x214225f76ee2ddbc4c2d4c1", + "b": "0x2e8f1888520b295855d36aa5f069f91", "cmp_a_b": -1 }, { - "a": "0x26861b8585774a0000000", - "b": "0x1fa99d23921b400000000", + "a": "0x6d4e3d24c834a3646d0375023784ff7cff68af6a8c21f22526321fa69", + "b": "0x14c5bebebbfc089f8b86", "cmp_a_b": 1 }, { - "a": "0x168baff928aa5b0000000000000000000000000000000000000000000000000", - "b": "0x3bbe47a6a00a62", + "a": "0x34e690b1f44884bd55c64", + "b": "0x2a6095c2be6", "cmp_a_b": 1 }, { - "a": "0x15c20b6f572b72000000000", - "b": "0x88cff", + "a": "0x35ce6567325f7cf0135bc659d8ba4291bf9fdee4298", + "b": "0x205249cebe0", "cmp_a_b": 1 }, { - "a": "0x48f917cec34f58000", - "b": "0xabb4c77cc0ef500000000000", + "a": "0x100c3a05cb1d6d783c066552", + "b": "0xb5002e801037942231692d4e9b249fa1", "cmp_a_b": -1 }, { - "a": "0x25b6e7f9806c7600000", - "b": "0x19e93c68", - "cmp_a_b": 1 + "a": "0x1009253058bd1d055", + "b": "0x1009253058bd1d055", + "cmp_a_b": 0 }, { - "a": "0x4c013b1bb585f8000000000000000000000000000000000000000000000", - "b": "0x29ab9a51002b180000000", + "a": "0xcc1b94f93a4683fbd442ead84ceccc2372b4703ff7", + "b": "0x3", "cmp_a_b": 1 }, { - "a": "0x4042eb2626173400000", - "b": "0x2", + "a": "0x53d3013af1aead3f4255c3", + "b": "0xda51c756d46dda6925c6d25fcc", + "cmp_a_b": -1 + }, + { + "a": "0x2e2ed73bce2b964864cee10710096cf60fea3", + "b": "0x530f0d69", "cmp_a_b": 1 }, { - "a": "0x1130c5b551e879000000000000000000000000000000000000000000000000", - "b": "0xa825f7858c038800000000000000000", + "a": "0x39e8c6a3b9a617395fcab15a4d6f5c8ea3e943acf6b084a", + "b": "0x3b698e2c0aee4c8c", "cmp_a_b": 1 }, { - "a": "0xb21f", - "b": "0x3172d43b", - "cmp_a_b": -1 + "a": "0x47d5f7b9819de81807cd80a1c19ce19b6dd7b46c54a5", + "b": "0x310cdee", + "cmp_a_b": 1 }, { - "a": "0x1387524d6226510000", - "b": "0x2b3ded3f2de1a200000000000", + "a": "0x2", + "b": "0x37f6c70e21a2af", "cmp_a_b": -1 }, { - "a": "0x25bef9cfa910660000000000000000000000", - "b": "0x998b", + "a": "0xc9fc6ec71c5e81460b965f4c904dc6357379187f7a28e9420", + "b": "0xc485964e5", "cmp_a_b": 1 }, { - "a": "0x5069c0", - "b": "0x32b13a5f60", + "a": "0x49e8d", + "b": "0x471d7ec55c5b5d451cdf3b232", "cmp_a_b": -1 }, { - "a": "0x5e6abdb594093800000000000000000000000000000000000000000000000000", - "b": "0x1c4a17aa49cb3500000000000000000", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x1352b", + "cmp_a_b": -1 }, { - "a": "0x1da8cc14821d6800000000000000000000000000000000000000000000", - "b": "0xa4449ebafdc8100000000000000000", + "a": "0x55380aebd6ee4fa35761211c019a7a36e", + "b": "0x1d901c0157586ff3ef5d61", "cmp_a_b": 1 }, { - "a": "0xfb87f11a9b38300000000000000000000000000000000000000000", - "b": "0x34325c731", + "a": "0x75e0e02828ff746524db8f4633ed2b25dc4cd88919e4f55e56cf20ece3911f9d7", + "b": "0x15262ac6a7c1250b85db5447", "cmp_a_b": 1 }, { - "a": "0x65235d04c7732c0000000000000000000000000000000000000", - "b": "0x15b7e6788232db00", + "a": "0x187005aa5e4043a0944ae13b9a759ec8d0b94cf2032bef1f3c47", + "b": "0x35272ae52e43c67ac5dc12d6", "cmp_a_b": 1 }, { - "a": "0x4116c", - "b": "0x2cc206", - "cmp_a_b": -1 - }, - { - "a": "0x31fa4c35d63efa0000000000", - "b": "0x1", + "a": "0x21165fdede780b6b1190efe8cf88122c5753187ba55437", + "b": "0x3", "cmp_a_b": 1 }, { - "a": "0xb7347feb51caf8000000000000000", - "b": "0x952e45906cd210000000000", + "a": "0x740c3bfb00deabc21d5e2df65a1158d", + "b": "0x1b", "cmp_a_b": 1 }, { - "a": "0x2ecbfcd0c016ca00000000", - "b": "0x0", + "a": "0x470b3b8d115dde31ab9e44e0e3fab916954101fe96ca3110c29438b5b548fe2b7", + "b": "0x1bcd10c", "cmp_a_b": 1 }, { - "a": "0x6f", - "b": "0x11510165b7bc080000000000000000", + "a": "0x689d40", + "b": "0x75a17485c67", "cmp_a_b": -1 }, { - "a": "0xf6ab7aba8109a800000000000000000000000000000000000000000", - "b": "0x67e", - "cmp_a_b": 1 + "a": "0x1c2a2ba6cffc744", + "b": "0xb9ff2511b6c2825903f2e", + "cmp_a_b": -1 }, { - "a": "0x6b279bc0120c78000000000000000000000000000000000", - "b": "0x18b2f", + "a": "0x406f5160cab33023aaadd550f277e3039a8818028380336287c5", + "b": "0x16f44b80e7ccee7ad828b66a3", "cmp_a_b": 1 }, { - "a": "0x10ac343a3c6e040000000000000000", - "b": "0x6ccdb57cef1358000000000", + "a": "0x7cf9921fb22e57662861ff5114132c80e82d2ad083", + "b": "0x19ca15e08b0d97", "cmp_a_b": 1 }, { - "a": "0x160b4fbc571f590000000000000000000000", - "b": "0x63dc73b08899580", + "a": "0xcbea152c5011fd66061c9c6f0933c71c2c29bc0aad0c703c63", + "b": "0x129582475b36", "cmp_a_b": 1 }, { - "a": "0x14ab2bc8ae9a230000000", - "b": "0x2d01ddaca3ad500000000000000000", - "cmp_a_b": -1 - }, - { - "a": "0x6972a1b1f08b8c000000000000000", - "b": "0xbe3cce26da30680000000", + "a": "0x1c0e6667051673cde976c045b1b", + "b": "0x33a38dc112f9c79b11ad02fba", "cmp_a_b": 1 }, { - "a": "0x518052fb10c2", - "b": "0x2bdbc4a4e49874", + "a": "0xc016", + "b": "0xec9cae684181131700c85e840faecc1", "cmp_a_b": -1 }, { - "a": "0x4245c6b2f8f79000000000", - "b": "0xc5bf2eab", + "a": "0xe68919bf684b624c5a", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x2429915", - "b": "0x167cefd6c9eef40000000000", + "a": "0x60470", + "b": "0x8b2ece5d6fc6c0917429b09773aac7", "cmp_a_b": -1 }, { - "a": "0x348", - "b": "0x296cc71f8dae640000000000000", - "cmp_a_b": -1 + "a": "0x2f1a9384f1130e288137e", + "b": "0x72fba002251a437a8", + "cmp_a_b": 1 }, { - "a": "0x121861501a54820000000000000000000000000", - "b": "0x1006bb38063caf00000000000000000", + "a": "0x10533d5a4b8804c0cf16f3c7a4be8b9fbe", + "b": "0x7bf77ab975da717743f", "cmp_a_b": 1 }, { - "a": "0x27aaf697f24528000000000000000000000000000000000", - "b": "0x0", + "a": "0x74f69123bfc07dcd7d655198013d39e62900c5e0491cf9dc02e46d4b78", + "b": "0x3", "cmp_a_b": 1 }, { - "a": "0xe1e21ddc88a3100000000000000000000000000000000000000000000000000", - "b": "0x61c25202ab", + "a": "0x19e7e9fa3cafe4d5f0f82e0077a1960dfdd89c848240c7fd7616f54d5c964323d", + "b": "0x76fcb6865b2e70b419", "cmp_a_b": 1 }, { - "a": "0x9de3b5c674f6c000000000000", - "b": "0x2772e0c7", + "a": "0x1ed12", + "b": "0x6c", "cmp_a_b": 1 }, { - "a": "0x4042bf4d09fd0c00", - "b": "0x4042bf4d09fd0c00", - "cmp_a_b": 0 + "a": "0x6a79b55003607cb5a3c23", + "b": "0x166214df0", + "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x22", + "a": "0x1d02888d", + "b": "0x197baf2d159e811dacf33fafd1d83973d", "cmp_a_b": -1 }, { - "a": "0x2d6a190", - "b": "0xbd62b3ab8646f00000000000", - "cmp_a_b": -1 + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 }, { - "a": "0xa740085692a0f0000000000000000000000000000000000000", - "b": "0x72af31d43dc3e0", + "a": "0x8b836855a25fc72fac24b3581d367faf3b61030c0550a20", + "b": "0x1328e19c68356ec51b3adc9e1b0f", "cmp_a_b": 1 }, { - "a": "0x206df854cdcc4e0000000", - "b": "0xb0766a9bda7030000000000", - "cmp_a_b": -1 - }, - { - "a": "0x4a4312c26ca89c0000000000000000", - "b": "0x1bc61", + "a": "0x3ac4d58d43a569bbb54f7", + "b": "0x66a1c", "cmp_a_b": 1 }, { - "a": "0xec457dfa4763f80000000000000000000000000000000000000000000000", - "b": "0x2459bd1c5f4", + "a": "0xe9946b26fef2696397f7f5", + "b": "0x39e6c7faa6d908162d65", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x2862239aaf3", + "a": "0x151958a3ac78d4d", + "b": "0x1fcd21e7e10281f8", "cmp_a_b": -1 }, { - "a": "0x26e5a20c58ede40000", - "b": "0xc47c", + "a": "0xf1611128303f907230531707473fc79b249f2203b73dc5dab48a0be35", + "b": "0x25e996ebdeb6f24c622", "cmp_a_b": 1 }, { - "a": "0xa71021907c3bd000000000000000000000000000000000", - "b": "0x1bd265e5aa8", + "a": "0xc9322bf66d3e72839739c23a1c1d975", + "b": "0xf268", "cmp_a_b": 1 }, { - "a": "0x34d", - "b": "0x34d", - "cmp_a_b": 0 - }, - { - "a": "0x18bf35f", - "b": "0x14aef575c27b1a000", - "cmp_a_b": -1 + "a": "0x39696199adc0cd2653ee5000", + "b": "0x1d64126b2eefd3ccc", + "cmp_a_b": 1 }, { - "a": "0x8e5212d6a5bca00000000000000000000", - "b": "0x459c8a37d14e7c0000000", + "a": "0x26c0e0e0e7ce676b68400f5699f506ebdf8f4bc2f1b366b07223889e49fa7d", + "b": "0x10", "cmp_a_b": 1 }, { - "a": "0x1efa7df7637ca80000000000000000000000000000000000000", - "b": "0x28089aed20052e000", + "a": "0x295aac8fe5be899e59570537a6472f", + "b": "0xde03969b4d45c9694a753c", "cmp_a_b": 1 }, { - "a": "0x959327fd86d048000000000000000000000000", - "b": "0x403fa5ccd80b7", + "a": "0x433ac6a0f9f4208cda9b55e5a7b11b9bdf50ef463c38f4db90cef7586fe0d", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x3de3", - "b": "0x3d5e17e73738c000000", + "a": "0xe6994b61bf09baebe", + "b": "0x2c1d232cef27272223bb", "cmp_a_b": -1 }, { - "a": "0x811f9b5970", - "b": "0x40d8d975c77d88000", + "a": "0x88654f444893ada90babc888d", + "b": "0x2f4179f49b0ef3aa4b41b9f68986032", "cmp_a_b": -1 }, { - "a": "0x3eeeb5fd62e1d80000000000000000000000000000000", - "b": "0x6ba4a501d727280000000000000", + "a": "0x37e031", + "b": "0x1063a", "cmp_a_b": 1 }, { - "a": "0x223ab975c8ace4000000000000000000000000000000000000000000000000", - "b": "0x2cf4d013cbad90", + "a": "0x23b6c", + "b": "0x52e97098088f3479eb9e920681", + "cmp_a_b": -1 + }, + { + "a": "0x1f4202b530a1536681492817fb15dca6b99aa09ad4a03c465780b", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x3675a564af9cec0000000000", - "b": "0x35770911ad", + "a": "0x897858866546a0ea21199b372bf8efdb6266287a3c8635ac30873846", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x116cfbcb551dfd0000000000000000000000000", - "b": "0x3c88feebcbd2a200000000000000000", + "a": "0x30cd7a80dae3c3cfa3cdacb1c766c5c91", + "b": "0x75a4eb683ea2c9", "cmp_a_b": 1 }, { - "a": "0x4f1c19", - "b": "0x15aed80a496f470000", + "a": "0x7ec", + "b": "0x1250e4", "cmp_a_b": -1 }, { - "a": "0x444f5b3dddc2680000000000000000000000000000000000000", - "b": "0x475926620bd", + "a": "0x5a6f273d8fd773795d36bb24ff83604fcf929f2f33c837", + "b": "0x6e5cdaf2ac1619b166ec5", "cmp_a_b": 1 }, { - "a": "0x4ce8e6975cf128000000000000000000000000000000000", - "b": "0x1ab5f44b66", + "a": "0x380fccbc091bcf542a0fa5f1ac4ac8e97", + "b": "0xcf52ced5d70fc316", "cmp_a_b": 1 }, { - "a": "0xbc618593aff3c00000000000000000000000000000000000000000000", - "b": "0xbb5bf5f2089de80000000000000", + "a": "0x7f77b61f8d9035f690e96daa37f7791bcee8", + "b": "0x171ea19e05916c54a1e23d1ab2405", "cmp_a_b": 1 }, { - "a": "0x86c857f6f392600000000000000000000000000000000000000000", - "b": "0x1a37a17be77cea00000000000", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x1b733227ea8e", + "cmp_a_b": -1 }, { - "a": "0x18cb194", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x953ec", + "b": "0x11d194bf76f7c581f61e9afea34025", + "cmp_a_b": -1 }, { - "a": "0x3e2f7b", + "a": "0x0", "b": "0x0", - "cmp_a_b": 1 + "cmp_a_b": 0 }, { - "a": "0x26b13ea388f16c000000000000000000000000000000", - "b": "0x20de3", - "cmp_a_b": 1 + "a": "0x36d4", + "b": "0x6fb2a1f2", + "cmp_a_b": -1 }, { - "a": "0x321dda4e2a2dd800000000000000000000000000000000000", - "b": "0x32b79acf53ab", + "a": "0x4e27f71fd3bb376c9", + "b": "0xcc", "cmp_a_b": 1 }, { - "a": "0x12b51dadb9bedd0000000000000000000000000000000000000000000000000", - "b": "0x31ff5449ce9b0600000", + "a": "0x22891b8d", + "b": "0x159dbfeea2b37a67c22c08cb", + "cmp_a_b": -1 + }, + { + "a": "0x99801ceea295d1dfd5ed8a1e6882", + "b": "0x14ff75e55d", "cmp_a_b": 1 }, { - "a": "0x34e1e44cb5a524000000000000000000000000000000000000000", - "b": "0xbace35a7fb260000000000000000000", + "a": "0x265556e8ea86058f30a4430460f30f2e1", + "b": "0x2054639ffa1b3dc0ec5bf954d0a9c40c0", "cmp_a_b": 1 }, { - "a": "0x21b1041c946", - "b": "0x68d0", + "a": "0x1775e36868cb8ad13ebf7b8443a389781aabca6a0", + "b": "0x5b55cb195c", "cmp_a_b": 1 }, { - "a": "0x85ae0f7d2788080000000000000000000", - "b": "0x2123c41f142bba0000000000000000", + "a": "0x8066d55c92dabc5d21bfd5efc2eb3faaa0c92da178bce", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x5da196bedea9a80000000000000000000000000000000000000000", - "b": "0x14c61", + "a": "0x164bad5842b0c7e10e3c4fd2fa3dab6e3029cc50b98ce8be89", + "b": "0x7", "cmp_a_b": 1 }, { - "a": "0x14aab801a43de8000000000000", - "b": "0x0", + "a": "0xef68e5f17a43452a22656f30e6f691025e", + "b": "0x8bd0ce", "cmp_a_b": 1 }, { - "a": "0x5fa99a6e84fe8c000000000000000000000000", - "b": "0x0", + "a": "0xd96a74ea597f", + "b": "0xbfb901ad9396e7847fc", + "cmp_a_b": -1 + }, + { + "a": "0x7f84fc8bc09", + "b": "0xcfd9f9e4255e6f87c17", + "cmp_a_b": -1 + }, + { + "a": "0x266840eb997a159083a37beb3", + "b": "0x2", "cmp_a_b": 1 }, { - "a": "0x1547ad62b8f9ba000000000000000000000", - "b": "0xbcb687cbc143e0000000000", + "a": "0x2b714795432", + "b": "0xa02", "cmp_a_b": 1 }, { - "a": "0x6f2e2228b17", - "b": "0x46e48ad001e15800000000000000000", + "a": "0x6114de33282", + "b": "0x9d4589038da1a", + "cmp_a_b": -1 + }, + { + "a": "0x2968f448f6e9f", + "b": "0x2d72399c976417", "cmp_a_b": -1 }, { - "a": "0x2a4e5ae0bb", - "b": "0x762be32f0d", + "a": "0x1b16d1d003", + "b": "0x10b673d4bebfcc6553148a23d2", "cmp_a_b": -1 }, { - "a": "0x237c25f059914000000000000000000000000000000000000000000", - "b": "0x8b0d323d098f90000000000", + "a": "0x532ded38955947b1518f5a8c8dab74d2c143ddd7e251da176ad71e4fb9b4082e", + "b": "0xe3c839", "cmp_a_b": 1 }, { - "a": "0x41334b90a8ef2c00", - "b": "0x34214f9de17802", + "a": "0x13f280cddb8049abf9d5cc9a8224d3735939d486bf1", + "b": "0xfd9703f517866d51c", "cmp_a_b": 1 }, { - "a": "0xbd84bd6a1", - "b": "0x8389b6254152280000000000000", + "a": "0x5", + "b": "0x27e9f4663257fcfb8e42b0", "cmp_a_b": -1 }, { - "a": "0x4f67c143acf0d800000000000000000000000000000000000000000", - "b": "0x131cb176308f", + "a": "0x1033023dd1c7f07275eca74424556689f74ea108e077795b71925", + "b": "0x3d230ebc", + "cmp_a_b": 1 + }, + { + "a": "0x8c8185e5ac72e9c73fd04da3ddbcf116bcadc401ed21f67ba41c05eab", + "b": "0x3df8dd9c7d4d4262bbe4000e2b3", "cmp_a_b": 1 }, { - "a": "0x919bedf35894600000000000000000000000000000000000000000000", - "b": "0x354d5f1d0f", + "a": "0x115b2c4126a0bb36775e9378f67473f9", + "b": "0xea5368f80528f38b308ebc1f2ec", "cmp_a_b": 1 }, { - "a": "0x87c8e5427", - "b": "0x2002ef10da2ae600000", + "a": "0x3a", + "b": "0x56972fdc0e729c74161224deede9", "cmp_a_b": -1 }, { - "a": "0xddb8debf1578680000000000000000", - "b": "0xb2b3b7849e763000000000000", - "cmp_a_b": 1 + "a": "0x8ef2f530c4b834", + "b": "0x21a16807b0ae2d33bd", + "cmp_a_b": -1 }, { - "a": "0x2aa94a6db36106000000000000000000", - "b": "0x1d3d8118c173a30000000000", + "a": "0x206009f44333c0c3e1f0c5f4", + "b": "0x7b0a428231e", "cmp_a_b": 1 }, { - "a": "0x1883c00a4014470000000000000", - "b": "0x1883c00a4014470000000000000", - "cmp_a_b": 0 + "a": "0x854e856df478bfe1c1c5f5b7a7ce7194ba9f2a42b8cee48d6", + "b": "0xaf", + "cmp_a_b": 1 }, { - "a": "0x18eaf2f9134642", - "b": "0x1", + "a": "0xcf420cf66adb67418c1b4c85b46cc6cac6631389d17cd941163cdfced83", + "b": "0x159637ab4d9ff3b5db1859d4173", "cmp_a_b": 1 }, { - "a": "0x184141620569400000000000000000000000", - "b": "0x5f", + "a": "0x536252a868bda1109cd15d491cef95365c085c253bef", + "b": "0x1002e", "cmp_a_b": 1 }, { - "a": "0x35bf2cf10bd582000000000000000000", - "b": "0x35bf2cf10bd582000000000000000000", - "cmp_a_b": 0 + "a": "0x2f8655ff99f4a8b2fae620931c36fb688bbe3a56430804cdee2", + "b": "0xf0bf5a0322d289189628c54d8c5f7a", + "cmp_a_b": 1 }, { - "a": "0x64af23c4ea29f800000000000000000000000000000000", - "b": "0x3d3818565e171a00000000000000000", + "a": "0x3990529817d446d159eb5c2c5dc51ccfaaa931f3649b56a07c3", + "b": "0x1a716077f5d07aae7f9b909128", "cmp_a_b": 1 }, { - "a": "0x63a1d9874e39740000000000000000", - "b": "0x15fbbff93cda5a000000", + "a": "0x87c5246f18fe5475bb771877e141e39e7911f493c450a0e6901fcbf688e89f54b", + "b": "0x1b900ac3bb97a4b", "cmp_a_b": 1 }, { - "a": "0x29f003c460b13c000000000000000000000000000000000000000000000", - "b": "0x37c1690111ce74", - "cmp_a_b": 1 + "a": "0x837ab33", + "b": "0x837ab33", + "cmp_a_b": 0 }, { - "a": "0x4016fe14", - "b": "0x11f52369ec674000000", - "cmp_a_b": -1 + "a": "0x2c983453cbcf9cb1aa31f546185e80c9f67b05c9669b3cbfd", + "b": "0x1ed534b28055635", + "cmp_a_b": 1 }, { - "a": "0xfda606644f82d80", - "b": "0x167c1ff3cfd52c00000000000000", - "cmp_a_b": -1 + "a": "0x2d51804ab11564ae10a665d7517", + "b": "0x7992", + "cmp_a_b": 1 }, { - "a": "0x1", - "b": "0x33a80d", + "a": "0xa400b2ac33886", + "b": "0x13a4f6e0030db9c4c38297c0", "cmp_a_b": -1 }, { - "a": "0xb5994111fd34c00000000000000000000000000", - "b": "0xd", + "a": "0x45eaa4e27155e904ac8a20f1ab44be109fd5239e77f6cf4ebd4b353d", + "b": "0xf2ad9dfb", "cmp_a_b": 1 }, { - "a": "0x598b74abd380d0000000000000000000000000000000000000000", - "b": "0x14c7", + "a": "0xd8b0537fbb2bcdacf32dfc297ac288819822ebc7ef", + "b": "0x19a5f868a802f4", "cmp_a_b": 1 }, { - "a": "0xb9736d15d72c780000000", - "b": "0xb9736d15d72c780000000", - "cmp_a_b": 0 + "a": "0x86f18059debc3b9996fcfe36f57", + "b": "0x41712ad72f4c94e72e1b7f53d495a2", + "cmp_a_b": -1 }, { - "a": "0x498fee842c0bd80000000000000000000", - "b": "0x3de4117ebe5a1a00", + "a": "0xc9295a219dda8ec9c05", + "b": "0x3214", "cmp_a_b": 1 }, { - "a": "0x207ee9914d8156000000000000000000000000000000000000000", - "b": "0x561a14ff401", + "a": "0x12c30b4d6d9575d095138eadb6e460a675", + "b": "0x9a47dfabb3daba5e4734fb3eb935da4c", "cmp_a_b": 1 }, { - "a": "0x292bebcce8354c000000000000000000000000000000000000000000000", - "b": "0x5", + "a": "0x2ab8f5a26ce1c8403caf0f71877cac55aa0d9271", + "b": "0x6d7166c54b", "cmp_a_b": 1 }, { - "a": "0x1745813f2e61be0000000000000000000000000000000000000000000", - "b": "0x1", + "a": "0x8fd2927b440d4eb03ed8da8a35d9f4e2be57d81", + "b": "0xd3c84724e1687e3c82ef9f1d90", "cmp_a_b": 1 }, { - "a": "0x82df8f7325a070000000000000000000000000000000000000000000000000000", - "b": "0xd763eb78", + "a": "0x233f232a262b7e3e757ad185e1d38f988922dcb59fce3c44f5bca7ecb", + "b": "0x40b72d41c402bb0eb2f9904b", "cmp_a_b": 1 }, { - "a": "0x12ac80d06dc9a", - "b": "0x48d99a819e664c0000000000000", - "cmp_a_b": -1 - }, - { - "a": "0x11b9b095a16e9200000000000000000000000000000000000000000", - "b": "0x8ce6ad701", + "a": "0x5f8550a498aa622eeec051bb329d35ae81e1ec3f582b943f", + "b": "0x366b9645fecb18ea916e95a55", "cmp_a_b": 1 }, { - "a": "0x1201475d0", - "b": "0x54dd052e0f2bac0", - "cmp_a_b": -1 + "a": "0xe8fddefd680deb839597f119389daac3c58e26674c0d848d32e", + "b": "0x74d30f8add9198047b", + "cmp_a_b": 1 }, { - "a": "0x4", - "b": "0x32", - "cmp_a_b": -1 + "a": "0x15ad6be38b28557", + "b": "0xaa", + "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x1b", - "cmp_a_b": -1 + "a": "0x114b76ff6891a9b7c7ef434afafa7aab9d275ad360282d", + "b": "0xdc20da5bd10d44b3d", + "cmp_a_b": 1 }, { - "a": "0x246b19dc25da6e0000000000", - "b": "0x2979bff0d0ad92000000000000000000", - "cmp_a_b": -1 + "a": "0xe3094", + "b": "0xe3094", + "cmp_a_b": 0 }, { - "a": "0x1561a0a0e481b30000000000000", - "b": "0x22801aa", + "a": "0xf2b01e0a8db8f8c77d80857fb264e036b5a4fd1a1781ba4be906e22c3e", + "b": "0x5b3be516709463e6f3215100e", "cmp_a_b": 1 }, { - "a": "0x119f0c6a7084a0000000000000000000000000000000", - "b": "0x2e72d9ea511e960000000000", + "a": "0x74f575541b40f7635abe4611b4891857f4ecb", + "b": "0x20635f01b7bc821082dbb783da9", "cmp_a_b": 1 }, { - "a": "0xaf5", - "b": "0x2ec1fa97d98106000000000000000", - "cmp_a_b": -1 + "a": "0x1cf6c9c5bd9f501631d210ae23626d93be7f", + "b": "0x7", + "cmp_a_b": 1 }, { - "a": "0xa2b4db99677728000000000000000000000000", - "b": "0xb4faf2b66a", + "a": "0x82b186f7564319cff239f2cb45a0a6", + "b": "0x2d66b28886565c4d", "cmp_a_b": 1 }, { - "a": "0xc88a200e93830000000000000000000000000000000000000000000", - "b": "0x471fb5cf19db50000000000000", + "a": "0x3d4d180e50365da110afa372e33beff86e9fd5f0f52f4bc22f2753a831ec4", + "b": "0xa069ac875999a79a495f", "cmp_a_b": 1 }, { - "a": "0x8ad705bf3e1b900000000000000000000000", - "b": "0x4d344be615c9fc00000000000000", + "a": "0x64d7ca9431d69d88fc7301ce0a82395fd8d2a1e", + "b": "0xddc4d44e6cd146c6c414b3bb7b915a8", "cmp_a_b": 1 }, { - "a": "0x88392bad47d598000000", + "a": "0x1342f076a3", "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x4c605dea3ea7f0000000000", - "b": "0x843ec68d1adfa80000000000000", + "a": "0x919b9d11de576", + "b": "0x677dfbe635fc75d5233ccec76", "cmp_a_b": -1 }, { - "a": "0x20a1066982b2d800000000", - "b": "0x2245713fef46ba00000000000", - "cmp_a_b": -1 + "a": "0x14c5bf578349c1ce42", + "b": "0x14c5bf578349c1ce42", + "cmp_a_b": 0 }, { - "a": "0x3b84629825f248000", - "b": "0xd1adc6549e61d0000", + "a": "0x631b7297904d67b6f", + "b": "0x545f9f24b5225c7bbc8dd01fa", "cmp_a_b": -1 }, { - "a": "0x1add8c81b2cfa20000", - "b": "0x7762252b25306", + "a": "0xab3a60cf38d058d4140f891c7114022e4d7e3ceb51f93db0125d93203aaa702", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x5919b4a7b8fa2c00000000000", - "b": "0x1824e564020268", + "a": "0x493caf93b3b251899215da72f8b252c5a357d72055b8cdd56", + "b": "0x186e2190ee7aed3", "cmp_a_b": 1 }, { - "a": "0x13450d9ccbd0ed00000000000000000000000000000", - "b": "0x437d7abd5d2c94000000000000000000", + "a": "0x1fb0799c74f8f31873fbf25b96db62bcf55f7656c850e81e7c7b1a7528", + "b": "0xcebe974", "cmp_a_b": 1 }, { - "a": "0x1c5b0af96a68da000000000", - "b": "0x10b390c3e9d46d0000000000000000", - "cmp_a_b": -1 - }, - { - "a": "0x3af3fe32ce63220000000000000000000000", - "b": "0xc9fe5df", + "a": "0x45ce840544cb4", + "b": "0x8c50", "cmp_a_b": 1 }, { - "a": "0x17eae98b43f62600000000", - "b": "0x17eae98b43f62600000000", - "cmp_a_b": 0 + "a": "0x376f2aa3f", + "b": "0xf108214a20dad778f7c9ae", + "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0xc39403d5", + "a": "0x1d5", + "b": "0x6df8c837b81739d308f3d08410e50fc", "cmp_a_b": -1 }, { - "a": "0x1b3591005c30f10000", - "b": "0x1b3591005c30f10000", + "a": "0x599eb2593c58335100399b3780a554268638abb8a0f4fa5b852b133b2e454ec", + "b": "0x1dff9c422581e44da9835e3c06b", + "cmp_a_b": 1 + }, + { + "a": "0xc11d9948fa23c39dbede7dc93ee55", + "b": "0xc11d9948fa23c39dbede7dc93ee55", "cmp_a_b": 0 }, { - "a": "0x11b43aff298a060000000000000000000000", - "b": "0x786ed3e38", + "a": "0xd8121bef7892518fc99f0b062877b0968786cbc", + "b": "0xc2873b86058b00ce4721", "cmp_a_b": 1 }, { - "a": "0x103", - "b": "0x1", + "a": "0x48c9ff5b7985c0c8489eb7bb4608", + "b": "0x94dddb3884ab68df76120", "cmp_a_b": 1 }, { - "a": "0x59adb4c3490fe000", - "b": "0x7d0e87f9a1639000", - "cmp_a_b": -1 + "a": "0xea99ad42520f5b449e19d4fd1f303b160ea", + "b": "0x1aed0c46ce8361915f", + "cmp_a_b": 1 }, { - "a": "0x13793dd8e7d31c000000000000", - "b": "0x311de48a1534ce00000000", - "cmp_a_b": 1 + "a": "0x1a505e59390ab6294c781201", + "b": "0xc016bf25a56de707db6dd3595855342", + "cmp_a_b": -1 }, { - "a": "0x102fe9553c45ef0000000000000000000000000000000", - "b": "0xaa7baecd90b3f8000000000000", + "a": "0x697bc1db2540830a45fa9d992a971e671cd9bb7", + "b": "0x4bddb92", "cmp_a_b": 1 }, { - "a": "0x3c5d1e28", - "b": "0x22914b9", - "cmp_a_b": 1 + "a": "0x378dfcadfe9ac3942bb2c39479308dc6a", + "b": "0x378dfcadfe9ac3942bb2c39479308dc6a", + "cmp_a_b": 0 }, { - "a": "0x90cebdd85262c8000000000000000000000", - "b": "0x13be8ac6317ca90000", + "a": "0x306e0623ef18d59b1bdd3189500377f2e472dd8914e", + "b": "0x25f1785b00402", "cmp_a_b": 1 }, { - "a": "0xa89422644325480000000000000000000000000000000000000", - "b": "0xc9f842f34", + "a": "0x11e510cf7ff80c450eb8d8240377aa80d0", + "b": "0x7a532a6d39c8688ba469c", "cmp_a_b": 1 }, { - "a": "0x7299b10aad2c2", - "b": "0x4ce", + "a": "0x57731cf305a80eca69ddbf7fb17ed820", + "b": "0x108e290c", "cmp_a_b": 1 }, { - "a": "0x701c94c1fd3fd8000000000000000000000000000000000000000000000", - "b": "0x5e5e64efec3d50000000000", + "a": "0x239298ad32fd184fc08deb9a9022fe37dc8a7cea006ebb89d", + "b": "0x37c158228804de8e9", "cmp_a_b": 1 }, { - "a": "0x54066", - "b": "0x151cdbd8d3f28b000000", + "a": "0x0", + "b": "0xa802e603fe60c8496154be9", "cmp_a_b": -1 }, { - "a": "0x1b507ea3436e", - "b": "0x805c7cc52ec158000000000", - "cmp_a_b": -1 + "a": "0xf2f76f2688", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x7ce5c6779387f40000000000000000000000000000000000000", - "b": "0x4cf7bf6abd44e80000000", + "a": "0x164caeefd2cf8f26b25ac204b4851318f2f9889637ae52286b337a0", + "b": "0x1c6f21", "cmp_a_b": 1 }, { - "a": "0x588863438d347c00000000000000000000000000", - "b": "0x134f2ff6ccb103", - "cmp_a_b": 1 + "a": "0x4d376a4", + "b": "0x4d376a4", + "cmp_a_b": 0 }, { - "a": "0xb0e04901a9c5d00000000000", - "b": "0x1572cfbe321c85000", - "cmp_a_b": 1 + "a": "0xcbc", + "b": "0x1eccca24df", + "cmp_a_b": -1 }, { - "a": "0x4b5b97966575340000000000", - "b": "0x7206f5", - "cmp_a_b": 1 + "a": "0x376e528e", + "b": "0xda938325839b1788", + "cmp_a_b": -1 }, { - "a": "0x6108be6226bb4000000000000000000000000000000000000000000000000", - "b": "0xc2c98fede3fcb800", + "a": "0x2ceff427700a828a9a74f0b87f1357827ed6fc07d4f498ecbd", + "b": "0x3927665", "cmp_a_b": 1 }, { - "a": "0x5d0c3", - "b": "0x0", + "a": "0xdff8e92791bf84a9007ca67a1c22584e88209f7edf89b", + "b": "0x12d", "cmp_a_b": 1 }, { - "a": "0x2f576303bbd60e00000000000000000000000", - "b": "0x1aa5c340ab49360", + "a": "0x3ad6f01bbb7e27f69cd8fa4b4da1c", + "b": "0x690b711be75b9a1294", "cmp_a_b": 1 }, { - "a": "0x332d20e209cc2a00000000000000000000000000000000000000000000", - "b": "0x2a82127dd0053c000000000000", + "a": "0x882e264fa0a558fd908d75f54608bd53ac5e9236c74660", + "b": "0xff9c4940e41b1689", "cmp_a_b": 1 }, { - "a": "0xf29a875991cef000000000000000000000000000000", - "b": "0xbb3542bbca8e10000000000000000", + "a": "0x7f64c06734663c1e58c7b937a8955dc42729d8a036a0232320204cb4ac37", + "b": "0xc617c7e2b453651805", "cmp_a_b": 1 }, { - "a": "0x8efa6b6a6bf4e80000000000000000000000000", - "b": "0x6bbe1970008", + "a": "0x20fc47", + "b": "0x6cfd", "cmp_a_b": 1 }, { - "a": "0x1b89457aafa3a60000000000", - "b": "0x7de95df2a44f84000000000000000000", - "cmp_a_b": -1 + "a": "0x74d00", + "b": "0xf8", + "cmp_a_b": 1 }, { - "a": "0xfd57db47ee3d60000000000000000000000000", - "b": "0x3449e79d5fa6fa000", + "a": "0x41fa9e80538", + "b": "0x3cb092d92e4", "cmp_a_b": 1 }, { - "a": "0x3976c9ac0c49cc000", - "b": "0x55b2", + "a": "0x52c67c016ad9e4b41023ee6f40d305bf781861f876b2b70cc1b484e3e3b", + "b": "0xab14680b96eda5e737bad2d7c6dbbc", "cmp_a_b": 1 }, { - "a": "0x3548e670a497ea0000000", - "b": "0x3ae2f8", + "a": "0x6f2b96b60ef72948e40eb1fe43d64aace1c9a1c598fa1f543be48", + "b": "0xf4cf7c7cec878081116e5", "cmp_a_b": 1 }, { - "a": "0xf2e250c15022b80000000000000000000000", - "b": "0x140abbb", + "a": "0x9acaf469ae74d31e551507ac0bab2a4929768b", + "b": "0xace3c4", "cmp_a_b": 1 }, { - "a": "0x83c0a61456dc5000000000000000000", - "b": "0x2414cf94cf292c0000000000000000000", + "a": "0x3d00d1e139b8cd969b4e7e6db1", + "b": "0x3d00d1e139b8cd969b4e7e6db1", + "cmp_a_b": 0 + }, + { + "a": "0x96c7", + "b": "0x66f16ab95244f1dc5073fc2b", "cmp_a_b": -1 }, { - "a": "0x61b2e032cb8bd00000000000000000000", - "b": "0x13", + "a": "0x21ef997d7476b1a5bf16d83a4187d02822553d", + "b": "0x1670fd490c5bbb959", "cmp_a_b": 1 }, { - "a": "0x99164d55bb83d800000000000000000000000000000000", - "b": "0x1a19077ef183ba000", + "a": "0x30ca76a6db5baa7452ec132a1b109f7d26379d9ef0af51d1f9863", + "b": "0xe62d7caa53d6113d2c", "cmp_a_b": 1 }, { - "a": "0x1ccd4be6ecf6b90000000000000", - "b": "0x1b4d8f", + "a": "0x43667f32aecec3fd1ba535f714f11ac923bc39", + "b": "0xef7a0865b57e1835da1e585d565c5e", "cmp_a_b": 1 }, { - "a": "0x5407c042cd7", - "b": "0x1bfe481411159d000000000000", + "a": "0xdf85f2efa5e8", + "b": "0x7bcfab5f626f6c", "cmp_a_b": -1 }, { - "a": "0xb0c0897c094da00000000000000000000000000000000000", - "b": "0x9fc470c57172780000000000000", - "cmp_a_b": 1 - }, - { - "a": "0xeac61c2244a888000000000000000000000", - "b": "0x3230b2b5d1e", + "a": "0x1e09656c62c7b31e5da9cdbca1c612845f9eb0cd3109f5b312be8c77de6d7350", + "b": "0x4c83d58e09", "cmp_a_b": 1 }, { - "a": "0x27e7c983109bfc00000000000000000000000000000000000000", - "b": "0x44d6", + "a": "0x375d6f4712f68193daab19f6b2455d4e28eb27e1793afc9092", + "b": "0x1b62ce", "cmp_a_b": 1 }, { - "a": "0x107690dda132bb000000", - "b": "0x162332ead9f3330000000000000", + "a": "0x2c41c88b1f", + "b": "0x39ef3c502c3a5fd79f5f78f", "cmp_a_b": -1 }, { - "a": "0x14d84874bbbc4f000000000000", - "b": "0x198701dadd9398000", - "cmp_a_b": 1 - }, - { - "a": "0x49c760d63c67b8000000000000000000000000000000000000", - "b": "0xbf64e6add0b7d0000000000", + "a": "0x1c6c2c9bb8871b8dbe5f8a138462e03", + "b": "0xa773d1605b4b062b", "cmp_a_b": 1 }, { - "a": "0x14f675a433461400000000000000000000000000000000000000000", - "b": "0x19586", - "cmp_a_b": 1 + "a": "0xa85fe165621df7502d4aa4", + "b": "0x2be4bda126c4f0562d7286f9a6a893", + "cmp_a_b": -1 }, { - "a": "0x43f3f04f554b5400000000000000000000", - "b": "0x151b13abe8c23100000", - "cmp_a_b": 1 + "a": "0x1138315", + "b": "0x829729f9", + "cmp_a_b": -1 }, { - "a": "0x1ad8467c379aaa00000000000000000000000", - "b": "0x18b27d5df274dd0000000000000000", + "a": "0x3d914d2bc0862c36db226d7d6e066b6c7b8eded185bc67e951f81f6b8cc4e5ca", + "b": "0x1911c20620", "cmp_a_b": 1 }, { - "a": "0xbfa0ceb989ab8800000000000000000000000000000000000000000000000000", - "b": "0x3a4890dfc2", + "a": "0x38d78d73b68a491082d3ac27ccc756e968a3", + "b": "0x3aafa723437bf2c48d008", "cmp_a_b": 1 }, { - "a": "0x2e", - "b": "0x0", - "cmp_a_b": 1 + "a": "0xb24c4c05a0101a", + "b": "0x3a2954c2a0857397f98b953a54b955", + "cmp_a_b": -1 }, { - "a": "0x13828276b789ab000000000000000000", - "b": "0x2ba1f9f86a9a4200", + "a": "0x11345d781600edb229b6b54cde62340b21c4d157058b1a8951", + "b": "0x5348e135eddaa03ab089", "cmp_a_b": 1 }, { - "a": "0x3970c281d2ac50000000000000000000000", - "b": "0x3aa0ee8ec49de800", + "a": "0x5d425adf67adc773e0acd0e28d9cdac2dd428f9d0756f9d3c8f95", + "b": "0xa1144c842bc2ab636bbf", "cmp_a_b": 1 }, { - "a": "0xc8a8c1c48d0c700000", - "b": "0xc8a8c1c48d0c700000", + "a": "0x166ce6a660c2138", + "b": "0x166ce6a660c2138", "cmp_a_b": 0 }, { - "a": "0x6ea220", - "b": "0x2824ab09edace600000000000000", - "cmp_a_b": -1 - }, - { - "a": "0x5cb5e0184add5c00000000000000000000000000000", - "b": "0x62fdef2fecac080000", + "a": "0xe1cc82eed0829c7feb8bfa294b11d732d518", + "b": "0x1f", "cmp_a_b": 1 }, { - "a": "0x2c9b793a26537e00000000000000000000", - "b": "0x0", + "a": "0x14854518395bd6989a8bc0dacfe54b3293ac00d7352217916d4287e", + "b": "0x2", "cmp_a_b": 1 }, { - "a": "0x72feb51c9c49", - "b": "0x8a514246a4d56800000000", - "cmp_a_b": -1 - }, - { - "a": "0x35e6b811883814000000000000000000000000000000000000000", - "b": "0x105fb", + "a": "0x979c1ac316650c3fd54bd78c1c1a7d415e150c72ce8", + "b": "0x60a5603f596803e9", "cmp_a_b": 1 }, { - "a": "0xef99dd2b14fb6000000000000000000000000000000000000000000000000000", - "b": "0x459513fcc8017000000000", + "a": "0x1e4f07691712fc7ffee1f0ab99b40c", + "b": "0x1ab4", "cmp_a_b": 1 }, { - "a": "0x1205c881a56ecf00000000", - "b": "0x160da34d4", + "a": "0x19927ebcbed076fdbaefbb2b573", + "b": "0x2", "cmp_a_b": 1 }, { - "a": "0x6d36f5bbcc46280000000", - "b": "0x16e8a20f0a396400000000000", + "a": "0x1978323b55f7e2cb15465", + "b": "0x258f8889df848c24c9f1079df18048d66", "cmp_a_b": -1 }, { - "a": "0x1eaf14757765b800000000", - "b": "0x5ff6b", - "cmp_a_b": 1 + "a": "0x10aaf6492aa4", + "b": "0x573692df0d8d9982d70b34ee0d0289b", + "cmp_a_b": -1 }, { - "a": "0x2baf347ec77eec00000000000000000000000000000", - "b": "0x2a7a9ea", + "a": "0x931b006c9cbe2f9e2772ac07b3d4e0d706", + "b": "0x66a231097aeefccc53c", "cmp_a_b": 1 }, { - "a": "0xcb359635968f8800000000000000000000", - "b": "0xd7d61f0ff9", + "a": "0xd635bfcb81f", + "b": "0x380910bf014", "cmp_a_b": 1 }, { - "a": "0x4", - "b": "0x1", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x30b836e6188f44", + "cmp_a_b": -1 }, { - "a": "0xff0a86244236700000000000000000000000000", - "b": "0x87f1a20f989", + "a": "0x754fe21744850bfbebb3e217380", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x16dc225801eab100000000000000000000000000000000000000", - "b": "0x3f5b6570986b4c000000000000000", + "a": "0x6a0f4ada3e113c1ba78450ee56bd022f", + "b": "0x6f95968a5d33cb76d", "cmp_a_b": 1 }, { - "a": "0x1d1c8690fc100200000", - "b": "0x1f4", + "a": "0xecd901bbddb450ccff730758a1d7915fc3f7805a", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x95cb2b952bb7380000000000000000000000", - "b": "0x8d5b1202c21a00000000000000", - "cmp_a_b": 1 + "a": "0x245cea904a5ef", + "b": "0x35161d7b298d3ce5", + "cmp_a_b": -1 }, { - "a": "0x17d3ccffbe82d10000000000000000000000000000000000000000000000000", - "b": "0x28c9a2f1daa4800000000", + "a": "0x3be32c0500295d34b26463d5990eb9ee9478c1d4940b0751", + "b": "0x152ab8e2", "cmp_a_b": 1 }, { - "a": "0xf832876afc026800", - "b": "0xf832876afc026800", - "cmp_a_b": 0 - }, - { - "a": "0x95b4b238ad736000000000000000", - "b": "0xec1fa7568a9c0800000000", + "a": "0x1295f95e8d899c7cc3aee3c4488572", + "b": "0x9de0cebd21914393c7", "cmp_a_b": 1 }, { - "a": "0x762ad22ce106ec000000000000000", - "b": "0xd66d4deb29492000", + "a": "0xe8da6530890b9d76e503311e086b3afe1819f4705c38950bb5fc94ee2", + "b": "0x15a356dfb", "cmp_a_b": 1 }, { - "a": "0x2480e2a49c4152000000000000000000000", - "b": "0x237d", + "a": "0x8fc23e8aa9df1ec81bc54eab3b4158b600bafa67a84d4d4ecaf8b4874", + "b": "0xe78b0fcf3a02a143784694fca09", "cmp_a_b": 1 }, { - "a": "0x679152a0a0a5", - "b": "0x194931261a61d7", - "cmp_a_b": -1 + "a": "0x18b63108b34bfba763615035546e70", + "b": "0x18b63108b34bfba763615035546e70", + "cmp_a_b": 0 }, { - "a": "0x7c04", - "b": "0x6c3a7c95f675c4000000000000", + "a": "0x0", + "b": "0x4e699b12d652d358d386a849cc130", "cmp_a_b": -1 }, { - "a": "0xc15a867057c9d000000", - "b": "0x1935d5b3ac9", + "a": "0x19537d4733bb64f2be71575adcbe8d8076a1f", + "b": "0x8259", "cmp_a_b": 1 }, { - "a": "0x4f7c1b1", - "b": "0x91ba85c4aa8e88000000000", + "a": "0x16c23fcf8", + "b": "0xb022bdb3f0c65da896d4aec923c", "cmp_a_b": -1 }, { - "a": "0x3209235812b6d40000", - "b": "0x9ba05954573af8000000", + "a": "0x28484ff76b5e22", + "b": "0x3370831e81dec62722469a6", "cmp_a_b": -1 }, { - "a": "0x41540dec", - "b": "0x4cd3da54bb4fec00000000000000", - "cmp_a_b": -1 + "a": "0x1c313d5834609607772f58af4354b", + "b": "0x1c7540410b6808dc812324f585", + "cmp_a_b": 1 }, { - "a": "0x2010664ebc266200000000000000", - "b": "0x11be728f5d035c0000000", + "a": "0x225126a5fa7a14b0b4d1630a3268e92b", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x8add31a4192da0000000000000000000000000000000000000000000000", - "b": "0x3ebd70f5e6aa4c0000000000000", + "a": "0x41eceaac1327a1ff4b45bdd37dda11aa2b5b52170ec3b9a45", + "b": "0xae55b4a61", "cmp_a_b": 1 }, { - "a": "0x3052aa2fc46586000000000", - "b": "0x46525723a78448000000", + "a": "0x79c7f45a2d5998fd1a71e272896e54", + "b": "0x1062da6fc62623fb", "cmp_a_b": 1 }, { - "a": "0x6a40b34cf257bc000000000000000000000000000000000", - "b": "0x2e04fc9b55757a0000000000", + "a": "0x2d4d544f7d6347edf453adf704439f2a896738ce14d71e0250fd72a8bc6f6", + "b": "0xefc8843c", "cmp_a_b": 1 }, { - "a": "0x48a736e48b58fc00000000000", - "b": "0x89bb87e", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x627c617ab7bb56bbc21c12b168ae6", + "cmp_a_b": -1 }, { - "a": "0xbbfa4ee325b8b00000000000000000000000000000000000", - "b": "0x3262464a", - "cmp_a_b": 1 + "a": "0x154", + "b": "0x3f5d3c9375066845f49876", + "cmp_a_b": -1 }, { - "a": "0x2e7429a30e05d000000000000000000000000000000000000000000000000000", - "b": "0x289cbac12e7d44000000000000000", + "a": "0x27a3790ed236a24b1756db239d2395411a7eb22f6530e39d2b9047d254", + "b": "0x105689b30049e7eb5826814288a9a1", "cmp_a_b": 1 }, { - "a": "0x1ddf808020eaa6000", - "b": "0x9b0f04786", + "a": "0x0", + "b": "0xf192ba3cf532430cf0b93", + "cmp_a_b": -1 + }, + { + "a": "0x1578c2f3f63592e06dbcc08e911df13abc6879c27289cae081512ae13601efccc", + "b": "0xa3", "cmp_a_b": 1 }, { - "a": "0x2c4a762f1", - "b": "0x0", + "a": "0x78315b0fd321d0b21ed152c67cef3adf46ba5c15e49fcba05", + "b": "0x36e1d85c8ad", "cmp_a_b": 1 }, { - "a": "0x300951addd2d74000000000000000000000000", - "b": "0x2fc23d", + "a": "0x1d5c806f29b2fa46b17921ea74d542f848781447", + "b": "0x32c102", "cmp_a_b": 1 }, { - "a": "0x16b8ce565c7ccc000000000000000000000000000000000000000000", - "b": "0xf527671aa225", + "a": "0x45a0bd62b6d721cee9cd8b", + "b": "0x1ce4c57", "cmp_a_b": 1 }, { - "a": "0x2c492737b37160000000000000", - "b": "0x1652c47c6c85a6000000000000000000", - "cmp_a_b": -1 + "a": "0x327a", + "b": "0xd", + "cmp_a_b": 1 }, { - "a": "0x8b30854a6b20f8000000", - "b": "0x8b30854a6b20f8000000", - "cmp_a_b": 0 + "a": "0x3c785aa1a8c90d4157f0d170cabd3291ee2f8d980c0e4763d2b2847acfcfd418", + "b": "0x4d14e8c1", + "cmp_a_b": 1 }, { - "a": "0x143d28b54b5c0600000000000000000000000000000000000000000", - "b": "0x567ed239003eac00000", + "a": "0x17ec0f68ffacdfe5763df668f098820d735f70e6beee442365d3c3", + "b": "0x254c3441e57903122ee6df1f", "cmp_a_b": 1 }, { - "a": "0x1558cbe4c2417e000000000000", - "b": "0x2430c54f43f9dc0000000000000", - "cmp_a_b": -1 + "a": "0x5ee908ba1407fa183", + "b": "0x5ee908ba1407fa183", + "cmp_a_b": 0 }, { - "a": "0x39f9538a5d6fac000000000000000000000000", - "b": "0x55c74b9d461cf0000000000000000", + "a": "0x21678c608ede0f559ed8349b5516fdcef83c343c02bb", + "b": "0xd3295c46", "cmp_a_b": 1 }, { - "a": "0x7aca570c2c41ac0000000000000000", - "b": "0x443d00a922913c00000000000000000", + "a": "0xb331cba74627", + "b": "0x340c678b73eb9949cfa0a05a1e7bc6d09", "cmp_a_b": -1 }, { - "a": "0x245fe164eda9e400000000000000000000000000000000000000000000000", - "b": "0x0", + "a": "0x4344a119ccd845ad33118aad760307afa3781ae775f3884dd410edeeb492", + "b": "0x1b78de8", "cmp_a_b": 1 }, { - "a": "0xefe7f51f8f63280000000000000000000000000", - "b": "0x23469dd787e6500000000000", - "cmp_a_b": 1 + "a": "0x10eb97521f63e28c8", + "b": "0x10eb97521f63e28c8", + "cmp_a_b": 0 }, { - "a": "0x357b898e86285e0000", - "b": "0x1", + "a": "0x1a6392f4eeca2cec6510374f232a667361c0db406b45cac11ec609448d0c6", + "b": "0x16baa49193eaf4", "cmp_a_b": 1 }, { - "a": "0xcd43aeaccf0688000000000000000000000000000000000000000000", - "b": "0x1f58538", + "a": "0x403ca7fc9eabb7e02f222c94934301ab486d617d1c49633b7df6c33f0", + "b": "0x5e", "cmp_a_b": 1 }, { - "a": "0x761", - "b": "0xf9477667", - "cmp_a_b": -1 - }, - { - "a": "0x36c0ee2", - "b": "0x15b8fa2fb1283800000000000000", - "cmp_a_b": -1 + "a": "0x501", + "b": "0x501", + "cmp_a_b": 0 }, { - "a": "0x3f17ad17ebb44a00000000000000000000000000000000000", - "b": "0x6d668b92ef13940000000000000", + "a": "0x6b08fc27b9d738e0ead7bcc3bd13f16de6e3451e281d2c4", + "b": "0x1a94924be0713070", "cmp_a_b": 1 }, { - "a": "0xff3ab57969a33800000000000000000000000000000000000", + "a": "0x1e0f0df043600d9edc8d3c019538cdc965ae82b24db4e0c", "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x47ebd9", - "b": "0x69ad793b200b00000000000000000", - "cmp_a_b": -1 + "a": "0x261ff34d7d5c03a36b5937b1cb5", + "b": "0xc0eb303b4d55b9d46d6a5b6", + "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x17967fc237d9140000000", + "a": "0x1b0c1", + "b": "0x5656d4ffd45cff276a0556506a43a1", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x1", - "cmp_a_b": 0 + "a": "0x398dbc547e4ee5beb927380ffbe39e9ffe3eacc96ae741428c839944dda76035f", + "b": "0x2f01", + "cmp_a_b": 1 }, { - "a": "0x8607657a5946180000000000000000000000000000", - "b": "0x5f26e720b8e788000000000", + "a": "0x16e9ec485c5c35880491a812e8bd31cb0d7b9fe33931ae2d1bda3501a0a97810", + "b": "0x3e2c", "cmp_a_b": 1 }, { - "a": "0x7fb2f7380307240000000000000000000000000000", - "b": "0x2aeea89ee116c40000000", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x51263bdfd7d5cfdb", + "cmp_a_b": -1 }, { - "a": "0x89dec5290f92a800000000000000000000000000000000000000", - "b": "0x12ed7b296c83d00000", + "a": "0x3a86760286ee0552640cee4304d47", + "b": "0x4244a2f", "cmp_a_b": 1 }, { - "a": "0x1416309a64c981000000000000000", - "b": "0xb49b5427a1f", + "a": "0xa1a08c103dc1c318d69a543e664717a26f07192f0fc18670bd1e00a05de419", + "b": "0x9", "cmp_a_b": 1 }, { - "a": "0x9b35bc93ecad7000000000000", - "b": "0x0", + "a": "0x9e3fbcbcece7d9da7748385193914e8d788a", + "b": "0xa1da6091b7c", "cmp_a_b": 1 }, { - "a": "0x901b6f85f432380000000000000000000000000000000000000000000", - "b": "0x4d6f92a1c8", - "cmp_a_b": 1 + "a": "0x2", + "b": "0x82af8b8fe1467d8ed18", + "cmp_a_b": -1 }, { - "a": "0x51b9aaf29905d000000000000000000000000000000000000000000000", - "b": "0x0", + "a": "0x2d2568c819c1aa9195d79edb410c2e", + "b": "0x3b5cc8fed11d906ed0f49e15f88a", "cmp_a_b": 1 }, { - "a": "0x33d1130", - "b": "0x16", - "cmp_a_b": 1 + "a": "0x1ccf", + "b": "0x49f8b23f269f911d911daf", + "cmp_a_b": -1 }, { - "a": "0x1657c191da1ab0000000000000000000000000000000000000000000000000", - "b": "0x24b064ab00d", + "a": "0xfb556cb4148e33391debb4482def0daca511c1ccefd3cd8c22e6ba9e", + "b": "0x7e784", "cmp_a_b": 1 }, { - "a": "0x1120ef38f726b5000000000000000000000000000000000000", - "b": "0x715043573a61a8000000000000000", + "a": "0x8a84209051accd64554ab1343b16f1e4e3c34382c0af4db761ef", + "b": "0x1a7e4b0e", "cmp_a_b": 1 }, { - "a": "0x3e59bf2ad41ea40000000000000000000", - "b": "0x16d19133e9a5", + "a": "0x343bc94f25d009205edfa81d3e22adbfcbe79a37d1c88df7ba5b", + "b": "0x72a023304c6aab7f6908b84228e", "cmp_a_b": 1 }, { - "a": "0x198dbe250b4cc60000000000000000000000000000000000000", - "b": "0x60f3f9d528e4f40000", + "a": "0x1c10bda4b18aaab4b", + "b": "0x7", "cmp_a_b": 1 }, { - "a": "0x1f17bf235cdd34000000000", - "b": "0xac73b3ad5795f8000000", + "a": "0x7a5a4015735fb85671d59d822ec58df25495c3a0c76abee3f", + "b": "0x63149b727622f02adacc86", "cmp_a_b": 1 }, { - "a": "0x252933dc8d2fb2000000000000000000000000000000000000000", - "b": "0xb7443b0c1c31b000000", + "a": "0x129e3f9a8ba648fa939083ee7ced7dae372ecc3ff1deb879c92cff89ce0ee", + "b": "0x3e8de172e78a5", "cmp_a_b": 1 }, { - "a": "0xa", - "b": "0x679839e4c1aae00000", + "a": "0x0", + "b": "0x1c0376c6", "cmp_a_b": -1 }, { - "a": "0x358680f709e8400000000000000000000000000000000000000000000", - "b": "0x4826bb2a0c6e4c", + "a": "0x190e0f1b8f334ba7", + "b": "0x10971e3", "cmp_a_b": 1 }, { - "a": "0x3cbbd3c2731bd600000000000000000000000000000000000000000000", - "b": "0x19775f66536ac00000000000000000000", + "a": "0x3edbffc85b77cdbce6cfca9ed853c6a6a5a3e28a876", + "b": "0x1a61b2a12200272f5974c3", "cmp_a_b": 1 }, { - "a": "0x1022bdbe", - "b": "0x4", + "a": "0x1abda29f", + "b": "0x21d3", "cmp_a_b": 1 }, { - "a": "0xd5762cf93a9f900000000000000000000000000000", - "b": "0x11a84c4ff63f3f0000000000", + "a": "0x211b40605b0dd8b7681c1127f774b90fe8784785232", + "b": "0x3b41df", "cmp_a_b": 1 }, { - "a": "0x1c78b85b81b53d000000000000000", - "b": "0x605f586", + "a": "0xb87da9f878903aa88ef067803d5d8053e48", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x421fc5372b0db8000000000000000000000000000000000", - "b": "0x1aa", + "a": "0x74d3e4830daa8c39829c2ef1d87e279a25", + "b": "0xfc", "cmp_a_b": 1 }, { - "a": "0x6e2038d2defb100000000000000000000000000000000000000", - "b": "0x2b448564fb6b12000000000000", + "a": "0x6dbb0b925b5614247969eb99ed652fc24fd328ae37e2c6f88b17be8d", + "b": "0x1b2d91ad92a0", "cmp_a_b": 1 }, { - "a": "0xd14442c7cd70f800000000000000000000000000000000", - "b": "0x4138c4d7ff2008000000000000", - "cmp_a_b": 1 + "a": "0x13c1d3f4", + "b": "0x1c6b8cda4b265a45bacfe19f", + "cmp_a_b": -1 }, { - "a": "0x170c0b50d3d52200000000000000000000000000000000", - "b": "0x0", + "a": "0xdec8843221395a1e440bbdf370ac84b87c70606833f6bf63bf9a0a7ae6f", + "b": "0x6382675917fcf0f379d4d082ac6", "cmp_a_b": 1 }, { - "a": "0x111e826def0f460000000000000", - "b": "0x22a548e1d97a7e0", + "a": "0x5271c058aee7c2f5a88fa028ed7b50b803adf07c9f419108c12277ff7aaac7e", + "b": "0xeca36c7ef28e7a8ad43add32ebc54", "cmp_a_b": 1 }, { - "a": "0x2aadd80578be", - "b": "0x14b25cd19e757200", - "cmp_a_b": -1 - }, - { - "a": "0x344d4ff589142c00000000000000000000000000000000000000000", - "b": "0x9c47", + "a": "0x1737c6c0409b8b8176fc72c57e69bd", + "b": "0x13e2c67d2122d2ba2728c5", "cmp_a_b": 1 }, { - "a": "0x9e9c6cbbfdc5", - "b": "0x1220c624e11dd400000000000", + "a": "0x1a6997dc7b7827bfe5d2c", + "b": "0x1a7b1ec76569652c39dff19", "cmp_a_b": -1 }, { - "a": "0x102133492374660000000000000000000000000000000000000000000000000", - "b": "0x69eeb1349", + "a": "0xb43bb9343331a347cc1a51f9bca52579e78914fe2bc7c8b1662c52594dc1ea3c", + "b": "0x10ec94bf7e995e9927c451", "cmp_a_b": 1 }, { - "a": "0x51cfebd85afbd00000000000000000000000000000000000000000", - "b": "0x422ee14035af44", + "a": "0x1e2a325a976ba2b4ae0730740ac7d6cf7c17e79d0e875b98a6", + "b": "0x34166b80bac6ceb8a75a86ab649a2ff85", "cmp_a_b": 1 }, { - "a": "0x737796", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x3457f4c84997", + "b": "0x13eabce0f7a1a6f7bf5788e3cd47874a", + "cmp_a_b": -1 }, { - "a": "0x2330e3b040a0ee000000", - "b": "0x166489d439ff58000", + "a": "0x9db3decddd109d77150abff8a25", + "b": "0x586913", "cmp_a_b": 1 }, { - "a": "0xf4458916aefbc000000000000000000", + "a": "0x2ca5b60c2fca696a444a8dd4ed0c5328962a1b9a9df606da2ccc449393e80944", "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x27ff62bb939fb80000000000000000000000000000000000000000", - "b": "0x4a7205da274164000000000000000", + "a": "0x7c10d3bd995ad7b4e2764d13eb", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x12b49c67eba86600000", - "b": "0xbe68ec4ec4ebe8000000", - "cmp_a_b": -1 + "a": "0x1cadffc79d4117affe0c34dcdaec", + "b": "0x1cadffc79d4117affe0c34dcdaec", + "cmp_a_b": 0 }, { - "a": "0x2600aaf560893e00000000000000000000000000000000000000000000000000", - "b": "0x14658c72f5dfb0000", + "a": "0x34aef31e928b84098d49b63edb1746e11832cc", + "b": "0x185206e0c6c235", "cmp_a_b": 1 }, { - "a": "0x4ae0", - "b": "0x36", + "a": "0x1e7a54389d5bddaa3475ee644305be5c0997397d0dc9948bfcc", + "b": "0x29ab3db0b9e6e3e903b9151c", "cmp_a_b": 1 }, { - "a": "0x16745ec172eb45000000000000000000000000000", - "b": "0x32a3a9b5", + "a": "0x366e6b2cd7b75bba5ce9c1f6c6b60e157886bfdc2443a507ce009b8d1616", + "b": "0x42a8b148b4c0e1d8", "cmp_a_b": 1 }, { - "a": "0x6e61d777ab6c1800", - "b": "0x46c353446a30dc0000000000", - "cmp_a_b": -1 - }, - { - "a": "0x64f5fa8391eaa40000000000000000000000000000000000000000", - "b": "0xe236f00", + "a": "0x2f5cf46ec6ccea9c4448e5b7df07adf1fed80d21c21541a28b0c3dc66f1b7a", + "b": "0x3e79728bce8a0ddc23", "cmp_a_b": 1 }, { - "a": "0x146fce7bd47c330000000000000000000000000000000000000000000000", - "b": "0x4d2ea957e5e0f000000", + "a": "0x20b90dabbf5c1e5d85496d49693cebb05e2e895b13fd252b8b45", + "b": "0xb39f0", "cmp_a_b": 1 }, { - "a": "0x4efbd2f331", - "b": "0x4902342fb61e14", + "a": "0xdb0e18a3acae269d0", + "b": "0x396765f095d517317636654", "cmp_a_b": -1 }, { - "a": "0x1235ee07dcf33f0000000000000000000000000000000", - "b": "0x32e11", + "a": "0x9f3cf7a042e34130ad3459816ee40ecb9f48a32dfbb7992232b7e75868927", + "b": "0xbf76c999cea51bd00843e0fc8c30f9", "cmp_a_b": 1 }, { - "a": "0x30e6a2db9d84080000000000", - "b": "0x16108ce5", + "a": "0x2eae1df3c2f54defb9bfc4513b44e7e0eeb7794f9e763d92cd078c2", + "b": "0x1b529dd199831f08250239c7c84e1d8", "cmp_a_b": 1 }, { - "a": "0x1a", - "b": "0x7fb26623a", + "a": "0x4f170c4a9f170587f2732880ad", + "b": "0x3ee0bc7751", + "cmp_a_b": 1 + }, + { + "a": "0x3ce0ce334eef", + "b": "0x5fa67fa2b828fe61e", "cmp_a_b": -1 }, { - "a": "0xee", - "b": "0x1a24286ef6c47", + "a": "0x212de4d01bd350f16d1f22cad", + "b": "0xdd6574dd3e1608733b132de9f77fa69", "cmp_a_b": -1 }, { - "a": "0x2700e4df6afeac0000000000000000000000000000000000000", - "b": "0x39ff7af59", + "a": "0x3b3fa34a06143b7443eee0000fa0", + "b": "0x1b7464af45f", "cmp_a_b": 1 }, { - "a": "0x11b8fa3f09129b000000000000000000000000000000000000000000", - "b": "0x368504097e", + "a": "0x2726bab109e8ca08a1d", + "b": "0x15f209a72fc33c2d60c00bd9", + "cmp_a_b": -1 + }, + { + "a": "0x826205321bb933b849e996246f4d3835c", + "b": "0x61", "cmp_a_b": 1 }, { - "a": "0x1", - "b": "0x3e260cf9580a0a0000000000000", + "a": "0x8603e4300715010fa34543", + "b": "0x12df33775310bbcbdb7bf04a96", "cmp_a_b": -1 }, { - "a": "0x3065fad3f203d00000000000000000000", - "b": "0xac47fdb3510850000000000000", + "a": "0x16123f8dcac6fd8cb875bbd36909f93", + "b": "0x5", "cmp_a_b": 1 }, { - "a": "0x65e391c232e53c000000000000", - "b": "0x780363855f29a800000000000", - "cmp_a_b": 1 + "a": "0x11b3d9be29ebdc72619ea432", + "b": "0x1d1c9fe10383ee73aac59626", + "cmp_a_b": -1 }, { - "a": "0xd576fca059ef880000000000000000000000000000000000000", - "b": "0xdb58dcbb2", + "a": "0xce49b1f869dbb3cd2d63f15038b35a28ed9e86bb9ac7b", + "b": "0x67ced29e977a004e2c", "cmp_a_b": 1 }, { - "a": "0x8c124fdc905138000", - "b": "0x125076aa6753620000000000000", + "a": "0x162a517a04f42", + "b": "0x6e4787c4a51736d7f07", "cmp_a_b": -1 }, { - "a": "0x9b1e269133a5200000000000000000000000000000000000000000000000000", - "b": "0x5e0dfc49386ee0000000000000", + "a": "0x1791de084c196e9176e5e5bb83f00ad5486dad0424b46807a9b626", + "b": "0x53ae148dadcac48b", "cmp_a_b": 1 }, { - "a": "0x119f6d4a655f6e", - "b": "0x50dcc8c", + "a": "0x2542c43d7b9bf3e8ab0d833c9a4b567b5b137540e5d136a9e01dbd6f9f00c", + "b": "0xa9c0057cd86edcdf87", "cmp_a_b": 1 }, { - "a": "0x907", - "b": "0x136ffbbece170900", - "cmp_a_b": -1 + "a": "0x734700bc3e5abb253353ded", + "b": "0xa1a5ac309358ed77e5a1ef", + "cmp_a_b": 1 }, { - "a": "0xa3123c12a4a7580000000000000000000000000000", - "b": "0x7", + "a": "0xbb2f3a909ff14d89f7d6a6e851856779", + "b": "0x2fbc457739dca188b45bee3ad354fa0", "cmp_a_b": 1 }, { - "a": "0x92cd49456dbf000000000000000000000", - "b": "0xd21d0b644f89180", + "a": "0x1fbb9c0223ffa295e31d99badd609b9b525e7a", + "b": "0xe73952cc16b269efd95e1dd8c7ad4", "cmp_a_b": 1 }, { - "a": "0xc7fdbfb90f78b80000000000000000000", - "b": "0x110629591a2c7c0000000000000", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x5c1ff3c4e", + "cmp_a_b": -1 }, { - "a": "0x89240", - "b": "0xd", + "a": "0x1fd3c751ae70ea359b13714be113a684c73b0d28ccbf984f", + "b": "0x1773285da35ca11351a4929f7550de240", "cmp_a_b": 1 }, { "a": "0x0", - "b": "0x16c", + "b": "0x143e6e1271cde8", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x3ef5c0e", + "a": "0x2b1", + "b": "0xa65573bd45478d5fedda6196", + "cmp_a_b": -1 + }, + { + "a": "0x2198783834c7070a3b9c6", + "b": "0x2198783834c7070a3b9c6", + "cmp_a_b": 0 + }, + { + "a": "0x58a35695", + "b": "0x2593c1d25b124ba4fc", "cmp_a_b": -1 }, { - "a": "0x14e31fbd67f5800000000", - "b": "0x14e31fbd67f5800000000", + "a": "0x2895d793e72b095889c1b9", + "b": "0x2895d793e72b095889c1b9", "cmp_a_b": 0 }, { - "a": "0x67ec5e227062c800000000000000000000000000000000000000000000000", - "b": "0x712cc985087b1c00000000000", + "a": "0x34cbc49f7f141118b0db1286c222acc30aca2d0af6", + "b": "0x4b2", "cmp_a_b": 1 }, { - "a": "0x29b8978d1596cc000000000", - "b": "0x102", + "a": "0x32ce197e8239be9b231a1942654911be5c93a73a20d1b751a6eeac5285ede20", + "b": "0x1b", "cmp_a_b": 1 }, { - "a": "0x2ecf72f14cd7d40000000000000000", - "b": "0x30", + "a": "0x9251198069c27739a540f67c9d67cbbc7dc7d2b5e39687f30d51d107519a064", + "b": "0x2fee61063cfc8ed818faa06b5", "cmp_a_b": 1 }, { - "a": "0x386c991560508200000000000000000000000000000000000000000000000", - "b": "0xa4225963", + "a": "0x5d417dcd1b3a", + "b": "0x5d417dcd1b3a", + "cmp_a_b": 0 + }, + { + "a": "0x1bdb95993f7b327d4f80c65", + "b": "0x19bf7b5816a50", "cmp_a_b": 1 }, { - "a": "0x1038f05f3e5c5000000000000000000000000", - "b": "0x85ceb2d3", + "a": "0xfb651d3307a", + "b": "0xfb651d3307a", + "cmp_a_b": 0 + }, + { + "a": "0x1462aad2ab44d64ded95a1b3f22622126b79e6c65bc5acec61", + "b": "0x15c2", "cmp_a_b": 1 }, { - "a": "0x7", - "b": "0x22d7b4c7cdb35a0000000000000000", - "cmp_a_b": -1 + "a": "0x266598471cd62806a", + "b": "0x23e9c6", + "cmp_a_b": 1 }, { - "a": "0x2d2e06c31b901000", - "b": "0x25f1b0e86bad34000000000000000", + "a": "0x8604b030d2aeb7d4495504", + "b": "0x7c3f09f1523ef3ab8c6b16cc35cea7", "cmp_a_b": -1 }, { - "a": "0x1647144b7064fd0000000000000000000000000000000", - "b": "0x5711fce97c9a3800000", + "a": "0x1cea29f277810ec5d2df376d9b1e8928cf2ff2c8e4e1a4da7210c9afccabcc91", + "b": "0xedf584428", "cmp_a_b": 1 }, { - "a": "0x546b2bba4c894000", - "b": "0x546b2bba4c894000", - "cmp_a_b": 0 + "a": "0x38e77", + "b": "0xdfb4d651d4e4f6c6149", + "cmp_a_b": -1 }, { - "a": "0x345d0132466648000000000000000000", - "b": "0x11211912dc65f50000000000", + "a": "0x29683f574e77fac49cf7311901c0d48f3f17ec60f4df", + "b": "0x1d9445bf909056f290", "cmp_a_b": 1 }, { - "a": "0x1fb1576134de6000000000000000000000000000", - "b": "0x0", + "a": "0x4491b77c6af1b5fa5ae843ff4aa771f00da3b54d5beb2f4d0b01", + "b": "0x23eda77e5e92202ef4595", "cmp_a_b": 1 }, { - "a": "0x56c10e6eb18b280", - "b": "0xbe1a09b4751b1", + "a": "0x3164a19eab4ffc5558b98d35b5fbe420ad025c98941b5", + "b": "0x70b45ab289891cb90e44d", "cmp_a_b": 1 }, { - "a": "0x24221180facdda0000000000000000000", - "b": "0x14dffa64117d74000", + "a": "0x12ec852ed2e75fa17df39416bc3540f56cd080ba0b1", + "b": "0xd553c77b", "cmp_a_b": 1 }, { - "a": "0xfbbbfd9ba38a98000000000000000000000000000000", - "b": "0x2e1663173b06e40000000000000000", + "a": "0xd70111f8adcef952b052507509e", + "b": "0x88c2e258cb960f04bb", "cmp_a_b": 1 }, { - "a": "0x3ad556abb79e08000", - "b": "0x7f718e6cfaaae000000000000000", + "a": "0xb", + "b": "0x11ed56", "cmp_a_b": -1 }, { - "a": "0x4380759cdc66d40000000000000", - "b": "0x203de78059691a000000000000000000", - "cmp_a_b": -1 + "a": "0x78acecb44202b769e14bce47d7cfe6ab1bde71b15df2289a264fe02e1030c", + "b": "0xf1408ecfe8a4c49", + "cmp_a_b": 1 }, { - "a": "0x86f9fea39389700000000000000000000000000000", - "b": "0x54a143d20", + "a": "0x8800522d870ad1b28ff4ab7c54d8af2ced7b8323253f7489a77a80880df3e96e1", + "b": "0x3ea7e4c879cb96b99f2259f0", "cmp_a_b": 1 }, { - "a": "0x4cbf357c323a000000000000000", - "b": "0x92598cd7692348000000000000000", - "cmp_a_b": -1 + "a": "0x198b151fc97fef8ae107b9c703ad", + "b": "0x6ade5b", + "cmp_a_b": 1 }, { - "a": "0x6bc10163ab", - "b": "0x1fb92643539eed0000", + "a": "0x397330babe90489b904fd", + "b": "0x5c3d53e30136ad78199d47f", "cmp_a_b": -1 }, { - "a": "0x7c6874db8e50e0000000000000000000000000", - "b": "0x2c467cb3ddb07800000000000000", - "cmp_a_b": 1 + "a": "0x28524c25a9d", + "b": "0x33155af6e7ae20", + "cmp_a_b": -1 }, { - "a": "0xff40ae26a2e998000000000000", - "b": "0x14aabeebd7c77e0000", + "a": "0x7e099867", + "b": "0x3adc3a2", "cmp_a_b": 1 }, { - "a": "0x27c8422c1e326400000000000000000000000000000000", - "b": "0x13e1609e26747b000000000", + "a": "0x5dd139a8be", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0xe1", - "b": "0x7693efb", - "cmp_a_b": -1 + "a": "0x3020834f5ec139b4ab2f3f209a31484d85a7df40", + "b": "0x30f0b634ca4b894", + "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x11b1235", + "a": "0x7231b66", + "b": "0x5dbea41248e21eaf15ef", "cmp_a_b": -1 }, { - "a": "0x17c44c1412f8b800000", - "b": "0x117d6b21846456000", + "a": "0x1a11192c5a7120b78e", + "b": "0x756c", "cmp_a_b": 1 }, { - "a": "0x290b1979bf7e4400000000000000000000000000000000000000000000", - "b": "0x67966f2c19dd", + "a": "0x7e749b90216e7c7ad3bea45476d694e229efd1c389d608ae93", + "b": "0x6e74219ad45be4847052234db0761eec", "cmp_a_b": 1 }, { - "a": "0x14ed1c5c93be02000000000000000000", - "b": "0x14ed1c5c93be02000000000000000000", - "cmp_a_b": 0 + "a": "0x6619519a94224e4a1b2fff535291", + "b": "0x2e3e5fb292c408554521baeb548400d9d", + "cmp_a_b": -1 }, { - "a": "0x1bea20a8140770000000000000000000000", - "b": "0x7c825a", + "a": "0xa21ee6a08a323b7", + "b": "0x210f4704b9", "cmp_a_b": 1 }, { - "a": "0xa46c0316acc35000000000000000000", - "b": "0xdbfb66f297d5", + "a": "0x223fc659d6c58d52fb86dcc6", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x4c45fdc8f0d8800000000000", - "b": "0x73ba5bc056d5fc0000000000000000", + "a": "0x18", + "b": "0x31ae0cfa75e", "cmp_a_b": -1 }, { - "a": "0x375109ae2903ec00000", - "b": "0x44", + "a": "0x7dd7b635173da43c35cd25cf4d2ae4a741", + "b": "0x13b22f2d76d1091aa36e430dabea4741", "cmp_a_b": 1 }, { - "a": "0x270c09fce8b59a000000000000", - "b": "0x1e3ed6b", + "a": "0x2cc6140a63b2f9f9cb578ed4", + "b": "0x7c3", "cmp_a_b": 1 }, { - "a": "0x7acd", - "b": "0x7", + "a": "0x21601f3fa0fc501bc5be7bfd28e8664a162", + "b": "0x1160e4f5e4e9ade5c4a92db9360044f2", "cmp_a_b": 1 }, { - "a": "0x236b542b445fe40000000000000000000", - "b": "0x1af33a8c20e19c00000000", + "a": "0x1beec2de1208f77a298d408c64569dc98de9980a14ad8e17e7630e5edb852", + "b": "0x2a15e811732cd", "cmp_a_b": 1 }, { - "a": "0x1581478fc9fe27000000000000000000000000000000000", - "b": "0x91ef36778fb8000000000000000000", + "a": "0xbcdb59844c1a38582be86c74f9558319282877e11fb1259c43563d3a59651078", + "b": "0x73b", "cmp_a_b": 1 }, { - "a": "0xfad71bffbcc8900000", - "b": "0x4", + "a": "0xb07e79b4774079fcca49ae992ae890c9f8765eb8a4b5ca20", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x1dd8b08147f8d9000000000000000000000000000000000000000000", - "b": "0x22767bc1fc97340000", + "a": "0xa42b2c8c89a96ee2bd3cd8f", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x3ed4c67bce10ca000000000000000000000000", - "b": "0xdf301aa15ed85800", + "a": "0xf75bdcc8d", + "b": "0x95736d8", "cmp_a_b": 1 }, { - "a": "0x6eab27b8", - "b": "0x45", + "a": "0x581fd6816d0f4176209582c9f68113ec58014f7c3da934ea9b9ad3f", + "b": "0xd07f", "cmp_a_b": 1 }, { - "a": "0x265fb2fa5dea84000000000000000000000000000000000000000000", - "b": "0x49c5", + "a": "0x242c980a954122dbb0d671ac8e5bc74431a2a9f4ef", + "b": "0x3b527b1a93c6e8e6ac6b3f3a", "cmp_a_b": 1 }, { - "a": "0x1c88fdf97efdef0000000000000000000000000000000000000000000", - "b": "0x6577da", + "a": "0x362f645b94017112d7eb26a6d7cd889", + "b": "0x2a568209427d", "cmp_a_b": 1 }, { - "a": "0x54", - "b": "0x772bf5b4078", - "cmp_a_b": -1 - }, - { - "a": "0x3e9cad61ab01d200000000000000000000000000000", - "b": "0x42172dcab8d41", + "a": "0x1e06832b392e68d70c070dd4bf85a", + "b": "0x13", "cmp_a_b": 1 }, { - "a": "0x33e9e1d245283e0000", - "b": "0x17b05e88309dc100000000", + "a": "0x1882b2cdd0", + "b": "0xf21be8a23b4fa9522c3", "cmp_a_b": -1 }, { - "a": "0x2204f7", - "b": "0x849c11d", + "a": "0x0", + "b": "0x227257141c7bda", "cmp_a_b": -1 }, { - "a": "0x113b233afbe80d000000000000000", - "b": "0x2b1661ce141ed60000000", + "a": "0xba9e040a56e066", + "b": "0xba9e040a56e066", + "cmp_a_b": 0 + }, + { + "a": "0xa28437c65f69c93b6474614891b336fb9bf99949541374836c2dfa93b", + "b": "0xb5cd5982301588ead08701fe3", "cmp_a_b": 1 }, { - "a": "0x190f64d087c70100000000000000000000000000000000000", - "b": "0x0", + "a": "0x3b8bd9f1419285e10effe9cb3e674cdd5f734fcfdb3a1667b3f3a1acc803", + "b": "0x27a8f49e833c8b20884aa7c8ae07a1e6", "cmp_a_b": 1 }, { - "a": "0x291fbdee4d0b3e00000000000000000000000000000", - "b": "0x6639", + "a": "0x589b2554e451a63013a3cfad2b278823b2d32d0a65c2fea476c9c9c", + "b": "0x600210cb9c526d7f023a7b", "cmp_a_b": 1 }, { - "a": "0x32ac", - "b": "0x254e6194e021b40000000000", - "cmp_a_b": -1 + "a": "0x75b152cf496ebeb6d4c31af0dd85c", + "b": "0x84bbf9", + "cmp_a_b": 1 }, { - "a": "0x80602d099773c8000000000000000000000", - "b": "0x927287a", + "a": "0xb3c514fe577a40cf29ee89dd24a6a7813fe072d95f1bd5202e46fe", + "b": "0xefb7c145959abaa4334c428b454", "cmp_a_b": 1 }, { - "a": "0x44581", - "b": "0x2cf4fea79a08e0000", - "cmp_a_b": -1 + "a": "0x8cc95bc7ae14c20481c397bd84", + "b": "0xe44a7e2384f3879f47697", + "cmp_a_b": 1 }, { - "a": "0x282a7e7a", - "b": "0x1945b8bf8da", - "cmp_a_b": -1 + "a": "0x2a1db3429aedbbee9a8ecf1be846506c", + "b": "0x2b99390c8e87ee9fe4613ac8", + "cmp_a_b": 1 }, { - "a": "0xcd1ff9dd2f8fe80000000000000000000000000", - "b": "0x7b32f57013", + "a": "0x96fa7a0ed006b7275c5ca65d4d7582cba6fa73e484", + "b": "0x596744631f570cf934811a7184318", "cmp_a_b": 1 }, { - "a": "0x24e362ea1217a8000000000000000000000000000000000000000000", - "b": "0x2fd", + "a": "0x2df5d39e7f9920f3135e319916c46412bbfdfc6f6987b4349d16bdb9184e30", + "b": "0x2e5", + "cmp_a_b": 1 + }, + { + "a": "0x34a9e2e678575d5a279c01194a6e69246ace4b753ef1128", + "b": "0xb3ff21ea58", "cmp_a_b": 1 }, { - "a": "0x1305df001a8a270000000000000000000000000000000000000000000", - "b": "0x45a0ead51462c40000000000000", + "a": "0xbb9c88898f0dfaf11787635d637", + "b": "0x7a7a2f35ddf639a2c00a14998517", + "cmp_a_b": -1 + }, + { + "a": "0x15d604f1411ec296d339c30a2514be680fb922119d4a", + "b": "0x5e0e", "cmp_a_b": 1 }, { - "a": "0x3df2445bd7820e00000000000000000000000000000000000000", - "b": "0x1070eb89bd7dd900", + "a": "0x18ec42dea4de235e38e0f9ffa67ac29156a96a3d5485da4407b4e", + "b": "0x7c7fabce35ef375949e82bb", "cmp_a_b": 1 }, { - "a": "0x4bc2a4e52c60e00000000000000000000000000000000000000000000", - "b": "0x11bceba092d957000000", + "a": "0x31fa0e68100ec9", + "b": "0x18", "cmp_a_b": 1 }, { - "a": "0x53333ef120769c00000000000000000000000000000000000000000000000", - "b": "0x37c13df144455400000000000000000", + "a": "0x7a11957a403763be2e1d570", + "b": "0x12a87a86682988fd8a8120f", "cmp_a_b": 1 }, { - "a": "0xc51113fac1c0180000000000000000000000000000000000000000000000000", - "b": "0x75a99227a3280400000000000000000", + "a": "0xcfa6ad10557286790505", + "b": "0x6", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x315bef8e3feea800000", + "a": "0x3fa", + "b": "0xa66e265", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x3b0f6", - "cmp_a_b": -1 + "a": "0x1148868224a1c84f4fa18f66e6c5d2", + "b": "0x1148868224a1c84f4fa18f66e6c5d2", + "cmp_a_b": 0 }, { - "a": "0x1c41540de5d0c4000000000000000000000000000000000000000000000", - "b": "0x1d0017d59de1630000000", + "a": "0xc512a1e1fac70867a9c01de2", + "b": "0x900ee7c676a72dcef", "cmp_a_b": 1 }, { - "a": "0x114dd588a5fbb800000000000000000000000000000000", - "b": "0x45a2a76f9260040000000000000", + "a": "0x1ce45e1641ef12ce3ed71c9b2dc9dbfa25a0", + "b": "0x1edd02401a53364618ecb05", "cmp_a_b": 1 }, { - "a": "0x4c656947dbcc1400000000000000000000000000000", - "b": "0x246899d27acea80000000000", + "a": "0x2b6ad49b418d82b5b", + "b": "0x1b7f91315", "cmp_a_b": 1 }, { - "a": "0x31c608e0b5437e0000000", - "b": "0x327be5158b96cc0000000000000000", + "a": "0x0", + "b": "0x18cd081f548027e6cbe3a62f7af0a3", "cmp_a_b": -1 }, { - "a": "0x2b701eb55accf", - "b": "0x3202696b1630d4000000", - "cmp_a_b": -1 + "a": "0x3ecd14f0b7a89af135d", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x4e476e2f56978800", - "b": "0x186741cde3d4a20", + "a": "0x1c54d1630de63c6d92b0586468d4c57ed379f377a1d9973e971cfcf7", + "b": "0x1b453", "cmp_a_b": 1 }, { - "a": "0x39ae56574fe4f200000000000000000000000000000000000000", - "b": "0x7912afe59e38c", + "a": "0x10b09fc91bbd003626b81b7a12b6db67741e4e27c04b63", + "b": "0x63ef8d73dd8cd5bb4", "cmp_a_b": 1 }, { - "a": "0x350cc6fe0ba686000000000000000000000000000000000000000", - "b": "0x2641", + "a": "0x156d41128e119f70df23548", + "b": "0x67d7f83ab7f518b1f944e9", "cmp_a_b": 1 }, { - "a": "0x26", - "b": "0x26", - "cmp_a_b": 0 + "a": "0x7a338dfa1af956be3e8e514d256c7dc8c6260ced09b8c7276582f39b3f", + "b": "0x3415e037835e106b60c3094b78d", + "cmp_a_b": 1 }, { - "a": "0x26c9d0abd0b98a000000000000000000000000000000000000000000000000", - "b": "0x21de915a34e7ee00000", + "a": "0x3b1581c497b5a13c2e5dbe994851d2df561807", + "b": "0xe18310104", "cmp_a_b": 1 }, { - "a": "0x178dda9", - "b": "0x3a5aa9ab747fdc000000000000000000", - "cmp_a_b": -1 + "a": "0x24bd4d6c92db255c859f721f88d1524", + "b": "0x4a0aa64cf2a4", + "cmp_a_b": 1 }, { - "a": "0x2ab6e959cee93400", - "b": "0x315ea05bdd25ee00000000", + "a": "0x43a47a02ca4d61a6d21ee578856c6a2146c955b175f71a915495e", + "b": "0x20b772cbfd12741037213c78272a7ffe6", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x382c0", "cmp_a_b": -1 }, { - "a": "0x4b707b2e91b06c00000000000000000000000000000", - "b": "0x2d8bd1d13ac98c0000000000000000", + "a": "0x1a27fdd7a159bc4532829c2c96ffe781f0f16", + "b": "0x2f22d", "cmp_a_b": 1 }, { - "a": "0x10e416176710320000000000000000000000", - "b": "0x278ff2be520f", + "a": "0x69913a31b23e2803b3b36488b9619861248f96ef6f52f5", + "b": "0x97f9", "cmp_a_b": 1 }, { - "a": "0x67025a55af78cc00000000000000000000000000", - "b": "0x26c7d87f2191d", - "cmp_a_b": 1 + "a": "0x6e3429", + "b": "0x6e3429", + "cmp_a_b": 0 }, { - "a": "0xadb35e511d4cf000000000000000000000000000000000000000000000000", - "b": "0x1", + "a": "0x32547d1845afd154b95b2", + "b": "0x9", "cmp_a_b": 1 }, { - "a": "0x1833027d5ab3480000000000000", - "b": "0x52b4f01b59d26800000000000000", + "a": "0x0", + "b": "0xd9a8be36b9fb22b3e073b", "cmp_a_b": -1 }, { - "a": "0x2c21fce2bcfc0e0000", - "b": "0x43e901a876c4f0000000000000", - "cmp_a_b": -1 + "a": "0x274219517ef360f6a916b07ce4cbbc289c8cde6a0f46a893e447", + "b": "0x8fa8aee", + "cmp_a_b": 1 }, { - "a": "0x14c504385b129500000000", - "b": "0x8acfdd", + "a": "0x51404bee36ce519b8ae0bd183159bc54c8d83607c0d4572aec7b8ae6f9b", + "b": "0xd2b73f937ca0b4", "cmp_a_b": 1 }, { - "a": "0x294231e5d9519c00000000000000000000000000000000000", - "b": "0xdd064ac7b724f000000000", - "cmp_a_b": 1 + "a": "0x841b1a", + "b": "0x841b1a", + "cmp_a_b": 0 }, { - "a": "0x6ac75df7fbc64", - "b": "0x47ac", - "cmp_a_b": 1 + "a": "0xedc16fcaddb4c", + "b": "0xedc16fcaddb4c", + "cmp_a_b": 0 }, { - "a": "0x485bb7f80788fc000000000000000000000000000000000000000000", - "b": "0x34fc37211dfae20000000", + "a": "0x63c9b0266c8b2693cf81eab52c0121f04ef1", + "b": "0x250ebf999", "cmp_a_b": 1 }, { - "a": "0x1f9d8ae5980e3400000000000000000000000000000000000", - "b": "0x1094a814f5948c0000000000000", + "a": "0x187598dc3d09190eddc8d4152e8e483dbc2270efb2719c758", + "b": "0x5ab29c16f99101d0d657334a64009883", "cmp_a_b": 1 }, { - "a": "0x4647618f7d9a1c0000000000", - "b": "0x1c35c57c3c9ad9000000", + "a": "0x15ff68bff8e16f0be4d4f5de93693b197fc7e7af84b", + "b": "0x2f34d0368557f39795e8c", "cmp_a_b": 1 }, { - "a": "0x194cd065c2143b0000000000000000000000000000000000000000000000", - "b": "0x28816133ffb5", + "a": "0xf84fc53b7c18d", + "b": "0x1f2a85a9d4", "cmp_a_b": 1 }, { - "a": "0xcb3e3464ae3728000000000000000000000000000000", - "b": "0x9a5f354d6b5758000000000000000", + "a": "0xd583f01895e1ac47", + "b": "0x8e935f483edc84f", "cmp_a_b": 1 }, { - "a": "0x17910534ce8a0200000000000000000000000000000000000000000", - "b": "0x6187687267e6fc00000000000000000", + "a": "0x568b7", + "b": "0x568b7", + "cmp_a_b": 0 + }, + { + "a": "0x2667fa1326fe728a0605c", + "b": "0x64", "cmp_a_b": 1 }, { - "a": "0x28f60f4858e812000", - "b": "0x0", + "a": "0x1d1c06be3f9c7f2dd865ec61e73bbc29c9d7a1e", + "b": "0x4958c3eb09e", "cmp_a_b": 1 }, { - "a": "0xd7c6aa565acbf00000", - "b": "0x1937dfc6a686a800000000000000000", + "a": "0x165b96a6d1ec9bb07b0b", + "b": "0x3bf22f1b8bffdb676e7cc", "cmp_a_b": -1 }, { - "a": "0x9f697ed154be28000000000000000000000", - "b": "0x657a61fba7f3cc00000000000000000", + "a": "0x9152b0631432f073e32765758cf2ba7f00baea", + "b": "0x2f08af6d", "cmp_a_b": 1 }, { - "a": "0x20680", - "b": "0x21602227235fda00000", + "a": "0x3ac352a174074b1", + "b": "0x7c80df0a8043f4961fb5b459bf81659", "cmp_a_b": -1 }, { - "a": "0x102c86a6ee01c60000000000000000000000000000000000000000000", - "b": "0x4cbf4", - "cmp_a_b": 1 - }, - { - "a": "0x2d4cf2b9323d", - "b": "0x1919e45499055f0000", + "a": "0x725dd", + "b": "0x7b722b0b80524909ced71f40a7040c75", "cmp_a_b": -1 }, { - "a": "0x125e5e854f703f00000", - "b": "0x1", + "a": "0xc9f70539695b1f92646c55b70660f3f80a9e046b1a2b15149e", + "b": "0xe9638f20255472472be", "cmp_a_b": 1 }, { - "a": "0x6ffd2b1e43e7a", - "b": "0x3", + "a": "0x1580817fd141e53f77d3ae781e6a6576fe011fc246c90d", + "b": "0xf5070", "cmp_a_b": 1 }, { - "a": "0x1ec28a91bb59de0000", - "b": "0x4c61e", - "cmp_a_b": 1 + "a": "0x153b173470268a8", + "b": "0x9a8a74122b9add5a5028fbdf9e336", + "cmp_a_b": -1 }, { - "a": "0x39403820c4740c00000000000000000000000", - "b": "0x3df8", + "a": "0x821f", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0xd0573617bfc02800000000000000000000000000", - "b": "0x691ef23fdbf11800000000", + "a": "0x117c03b57080ecef7419668b4949a26d0dfc0d9da7ce", + "b": "0xc942c6", "cmp_a_b": 1 }, { - "a": "0x518", - "b": "0x518", - "cmp_a_b": 0 + "a": "0x48848ebf2f073657ae0a3f7dcdb3789c7b012140a", + "b": "0x1c743b2f77b343d5207a9", + "cmp_a_b": 1 }, { - "a": "0xee2abc23c90608000000", - "b": "0x593be1d6daca64", - "cmp_a_b": 1 + "a": "0xf1785a9f0e2610baea09", + "b": "0x18e5aadcecdfcf665aebd0ca449bac", + "cmp_a_b": -1 }, { - "a": "0x738f74d27e595c00000000000000000000000000", - "b": "0x6aa0", + "a": "0xdc74e0da1e433fd7e16fd1335607f0da289fe0ddfa", + "b": "0x2085b1a17afad6a9", "cmp_a_b": 1 }, { - "a": "0x1e9ae472cc316e0000000000000000", - "b": "0x9856ef8d44c898000000000000000", + "a": "0xd13c6a5acf1da2eeedc46f5581ebb", + "b": "0xf1710b0b7cd305098455007631f", "cmp_a_b": 1 }, { - "a": "0x357b91befb5ec4000000000000000000000000000000000000000000", - "b": "0x2acef87f5703ae0000000000000000000", + "a": "0xa8afcd5ee97884e53a6230920892301b3bffc35422fb78fac1732", + "b": "0x15a22d43a", "cmp_a_b": 1 }, { - "a": "0xdf0d9ca0af56a0000000000000000", - "b": "0x3a2e4a7d291b8c00000", + "a": "0x500270ab68eef67e3fa14921a005ad60dd53179f47aa4d9ec21f91a0a063baca1", + "b": "0x3bb", "cmp_a_b": 1 }, { - "a": "0x3f396ba8ba3", - "b": "0xbbffcf9fd2f0c8000000000000000", - "cmp_a_b": -1 + "a": "0x263cb5ee0", + "b": "0x1d0", + "cmp_a_b": 1 }, { - "a": "0x37cf3869f2de8600000000000000000000000000000000000000", - "b": "0xf20d312ddaece000", + "a": "0xa63b059f01aea493082bc7990ec5", + "b": "0x6d553d5dc5aae47067", "cmp_a_b": 1 }, { - "a": "0x6cc", - "b": "0x11bc509bf185f200000", - "cmp_a_b": -1 + "a": "0x2b4448ba7f973687fa8b7b35548d0ceb", + "b": "0x2b4448ba7f973687fa8b7b35548d0ceb", + "cmp_a_b": 0 }, { - "a": "0x28577aeb73985a00000", - "b": "0x4b6b74dc071eb0000000000", + "a": "0x0", + "b": "0x1753c5003379b19359125752dc7acc052", "cmp_a_b": -1 }, { - "a": "0x10d7526ba684db00000000000000000000000000000", - "b": "0x25746ddc", - "cmp_a_b": 1 - }, - { - "a": "0x0", - "b": "0x206e3b1ead63a00000", + "a": "0x76ac274931dadcde9", + "b": "0x4821c7dbb81a22cf13c1", "cmp_a_b": -1 }, { - "a": "0x16cd76e4803ad80000", - "b": "0x16cd76e4803ad80000", + "a": "0xa8ebdf3f8e4b089e8b9d3f0734", + "b": "0xa8ebdf3f8e4b089e8b9d3f0734", "cmp_a_b": 0 }, { - "a": "0x1c702bf18b5bd8000000000000000000000000000000000", - "b": "0x456541f5c28ee40", + "a": "0x57384ab47ec2a88f4", + "b": "0x77093", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x18a777ebd873b7000", - "cmp_a_b": -1 + "a": "0x586f9cf0f9651b4953845412ada8882bcc90097c49a", + "b": "0x8cb3abbfaf8cb8a91754d02572eb77a3", + "cmp_a_b": 1 }, { - "a": "0xbbbfb479ffb148000000000", - "b": "0x18f194092ad6a7000", + "a": "0x2f731a3a9ce4650527953932cb020fdc52", + "b": "0x17a06ae8f7e9f7a926e02adcecf09b", "cmp_a_b": 1 }, { - "a": "0xf60d86f7a00e", - "b": "0x1269f3", + "a": "0x2e25768abd3836ece7d7391d7f0ef945f83c33b5", + "b": "0x11d917", "cmp_a_b": 1 }, { - "a": "0xe2d10", - "b": "0x8fc0af0d27ccf8", + "a": "0x0", + "b": "0xa1a24e595cf4df00f6b038387b3", "cmp_a_b": -1 }, { - "a": "0x143cb56f772e0c0000000000000000", - "b": "0x36ca", - "cmp_a_b": 1 + "a": "0x26ec53ec873", + "b": "0x16b8d40a6e4a329d9f1b249", + "cmp_a_b": -1 }, { - "a": "0x557c51eec8c694000000000000000000000000", - "b": "0x1c7aa74171fb52000", + "a": "0x2250c9a324b0120f6f66c3bfc923ef70", + "b": "0x211f980da29e4953b0cc1b49e024f", "cmp_a_b": 1 }, { - "a": "0x10b44f62d0a62", - "b": "0x10b44f62d0a62", + "a": "0x34e733c6e0d1ac643a158c70", + "b": "0x34e733c6e0d1ac643a158c70", "cmp_a_b": 0 }, { - "a": "0x45835bdabe2c380000000000000000000000000", - "b": "0x172935", + "a": "0x1adeb936b73ede", + "b": "0x33363c8c5f", "cmp_a_b": 1 }, { - "a": "0x440cb1b55210d8000000", - "b": "0x6d9b800e2e97980000", + "a": "0x4e26ddae349dc8d427becbcadf63331e0630199809be1a7", + "b": "0x18747aef103927c3eb0a418d80393a", "cmp_a_b": 1 }, { - "a": "0x6cecce3a5eabf0000000000000000000000000000", - "b": "0x76ec5", + "a": "0x3d276e94e84875c7ef5201fe92146b4c94305", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x1b300853a986d80000000000000000000000000000000000000", - "b": "0x243e14f2f9", + "a": "0x7d22ed753d0df755001a1f", + "b": "0x159e14b58119aa71b", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x1db02a19a918b70000000", - "cmp_a_b": -1 + "a": "0xa9b01fb053bd763ad034f1a2d9c1610db878690b", + "b": "0x647ec9587583fa3a439335f9268a694e", + "cmp_a_b": 1 }, { - "a": "0x38e0b62cd1feec", - "b": "0x9", + "a": "0x12f16f26c2533e3d5b2edd655b26570836ccfc2f602c01c5511981ad127", + "b": "0x38fa07749c6a", "cmp_a_b": 1 }, { - "a": "0x2f292c96aa23b80000000000000", - "b": "0x5d0fced6f250a40000000000", + "a": "0x1abf23e52a2703d03fde8fb2b07896e", + "b": "0x21006c6cb668e7ffafd8cc72f1c", "cmp_a_b": 1 }, { - "a": "0x4fea265dd30168000000000000000000000000000000", - "b": "0x71913bd92f001c00", + "a": "0xff31cce6d99f18ccb49efc32591", + "b": "0x558", "cmp_a_b": 1 }, { - "a": "0xacbcd3bd20a10800000000000000", - "b": "0x503", + "a": "0xd9cb8e87ae661608c59a84680c50a2ba277d4ca36e54fac0626c561d61c", + "b": "0x5f775bc0986102bba2", "cmp_a_b": 1 }, { - "a": "0x3dd956", - "b": "0x46de7725011428", - "cmp_a_b": -1 + "a": "0x20f9916ea24e35ed1651823f1f0e68c0", + "b": "0x20f9916ea24e35ed1651823f1f0e68c0", + "cmp_a_b": 0 }, { - "a": "0x18f0f7ff151a53000000000000000000000000000000000000000", - "b": "0x1ff4c1458fe", + "a": "0x4ed4dc9aa4788285cde9fa1363f", + "b": "0x122264c05364", "cmp_a_b": 1 }, { - "a": "0x166de4043bdfde000000", - "b": "0x0", + "a": "0x6805cd395650ae6546a097f5469de5278dd499", + "b": "0x383daf197", "cmp_a_b": 1 }, { - "a": "0x2a7479da2273d2000000000000000000000000000000000000000000", - "b": "0x45034729f92", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x3e7ebfe2b731c899286f", + "cmp_a_b": -1 }, { - "a": "0x224fa98e3e27e40000000000000", - "b": "0x170e1dd0b68a260000000000000", + "a": "0x2b491ee4f4137f4c64ceff9c79438a839aa791d7761db795370532d4b5d", + "b": "0x1e818865c3ada07a05c78b48c0156f13c", "cmp_a_b": 1 }, { - "a": "0x4583b7cc268f", - "b": "0x50420e547a202800000000000", + "a": "0xe28e00e309692c8d469ba933", + "b": "0x15f31d9df3e6e291cb01238416d", "cmp_a_b": -1 }, { - "a": "0x8f52f01d54f7780000000000000000000000000000000000000", - "b": "0x25491f327b603c000000000000", + "a": "0xd7ea316b3246f54b6db2afb6a6a4e81b711a2a322d5a23d0e9", + "b": "0x1e0a6a9be02fabf1dbb2996f6d", "cmp_a_b": 1 }, { - "a": "0x2846ba455c53140000000000000", - "b": "0x168e95ef945ecd00000000000000", - "cmp_a_b": -1 + "a": "0x70c4b1896ef3d502fee9dc95a4663db9a325", + "b": "0x3358b6a86c0", + "cmp_a_b": 1 }, { - "a": "0x244e4439668808000000000000000000000000000000", - "b": "0x2", + "a": "0x23190604e159d7bd8f8ef", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0xde4a6f74be92580", - "b": "0x1943d1f240654a000000000", + "a": "0xae1d2", + "b": "0x2421993562d192b9fd5176ea78", "cmp_a_b": -1 }, { - "a": "0x50e017471", - "b": "0x8e105ad8641e60", + "a": "0xba163fdce2669bc9d97679", + "b": "0x63cc4bd87c72b403469ae2ce2ac", "cmp_a_b": -1 }, { - "a": "0x3e4c1145f8ff72000000000000000000000000000", - "b": "0x25", + "a": "0x54ea2464d94e5a45d53b01f386b959b2d9", + "b": "0xb", "cmp_a_b": 1 }, { - "a": "0x1c10aa4bb87948000000000000000000000000000000000000000000000", - "b": "0x27b31", + "a": "0x2c5619405cb5063f6e18c4b7c2b9", + "b": "0x686", "cmp_a_b": 1 }, { - "a": "0xf23b6cbfbddb60000000000000000000000000000000000000", - "b": "0x378f702", + "a": "0x8c6d4e1f2b5da4791f99ccbfedce219b9f317d9404b9d155b", + "b": "0x45ac93471c20d7c90f9edbd6ae05", "cmp_a_b": 1 }, { - "a": "0x450904808b7f84000000", - "b": "0x701608cb6e671000000000", - "cmp_a_b": -1 - }, - { - "a": "0x28f742b14a68da000000000000000000000", - "b": "0x3f5567e838a", + "a": "0x12223dd0563cfbbdcd207c9814b7e151478f", + "b": "0xeea31d3f0741", "cmp_a_b": 1 }, { - "a": "0x65528", - "b": "0x2790c926f37cbe00000000000000000", - "cmp_a_b": -1 - }, - { - "a": "0xa9116ab3970d60000000000000000000000000000", - "b": "0x8480aef2ab4c6000000", + "a": "0x656a7958069415e92f1d721ac3dc764a47b3ac172978648cf9", + "b": "0x17427add8c855", "cmp_a_b": 1 }, { - "a": "0x63b82d6ff9a2900000000000000000000000000000000000000", - "b": "0x6bff23306634c00000", + "a": "0xd19f4ea14d5405af7b1b38ddb10c708420577b4c9", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x56132766b208740000000000000000000000000", - "b": "0x9f", + "a": "0x24502d0fa1a3f1d171649d930d25abb6bdb3acf0033761", + "b": "0x2bde43b", "cmp_a_b": 1 }, { - "a": "0x54d9ef48b7f0080000000000000", - "b": "0x3cb39550332", - "cmp_a_b": 1 + "a": "0x1623b7066787f71c0f077", + "b": "0x185e247e85364caf8fadb13", + "cmp_a_b": -1 }, { - "a": "0x2b24a599a3462e0000000000000000000000000", - "b": "0x135b094bbbb4bd000", + "a": "0xde2c85865821b0f44dae24a4667d03c76b3d395c5681510825cbd9a6cc99ac", + "b": "0x729c0d0093", "cmp_a_b": 1 }, { - "a": "0x1794e7ed3a8f72000000000000000000000000", - "b": "0x15bb984705f3010000000", - "cmp_a_b": 1 + "a": "0xe601d487b8a4b6", + "b": "0x1fa83f8027f473679b3c0", + "cmp_a_b": -1 }, { - "a": "0x3e93cb7acc1d2600000", - "b": "0x0", + "a": "0x13f7a27fb32a9570b84a3eb4d9357b81ce", + "b": "0x8a72", "cmp_a_b": 1 }, { - "a": "0xdd61d69aacece0000000000000000000000000000000000000000000000000000", - "b": "0x59527e4b3aa2ac000000000", + "a": "0xe1869365646bd7daee2293c1f018c74", + "b": "0x40e975d06b0043af980dc44252", "cmp_a_b": 1 }, { - "a": "0x65f3", - "b": "0x9e8438bc04bf580", + "a": "0x3", + "b": "0x1dd", "cmp_a_b": -1 }, { - "a": "0xc152d59559366000000000000000000000000000000000000000", - "b": "0x380a5897", + "a": "0x2d26d92acbb40d87073e2421bb19c0e9", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x53f2972b619bd40000000000000000000000000000000000000000000000", - "b": "0xae33d187bb446000000000000", + "a": "0x10b1dc302d62f758639916e516fb95c2f0df3c2c", + "b": "0x6b1256b2684ba126", "cmp_a_b": 1 }, { - "a": "0x7f9f52b0e396d80000000000", - "b": "0x0", + "a": "0x2daea9ee07010351962e5d5c91493de0e13f3", + "b": "0x1a537abe299e109e5540", "cmp_a_b": 1 }, { - "a": "0xe8a57bc8565fd800000000000000000000000000000", - "b": "0x120b080d8a52ce00000000000", + "a": "0x10d7e58c179414b63d8698c006d9e13b38384cface6b1385", + "b": "0x52abe8b6932629dbd7bf1", "cmp_a_b": 1 }, { - "a": "0x27d3236ab890160000000000000000000000", - "b": "0x59782be2e5333c00", + "a": "0xa7bc141d5aa9c97e3fa79864868dfd4ec4e85a3de37e9acb5fc0e4ef28f4724b", + "b": "0x6e842b", "cmp_a_b": 1 }, { - "a": "0x2b38b8518b107e00000000000000000000000000000", - "b": "0x149456d0ff27f60000", + "a": "0x2bf02094e225ad2ea89b927c3ece028f2976bfd5406", + "b": "0x5acbff369fd0fb312162ff68edf", "cmp_a_b": 1 }, { - "a": "0x3778ed052088dc", - "b": "0x1ba2f43ba3558e0000000000000000", - "cmp_a_b": -1 + "a": "0x37fa5c755ad382448682db82951e8227", + "b": "0x37fa5c755ad382448682db82951e8227", + "cmp_a_b": 0 }, { - "a": "0x27c3e65f3d98d200000000000000000", - "b": "0x893a561e19d59000", + "a": "0x87a07e3d5acd575d7805b7d2207613818bf88a9095af4c197a7d54c9cedb90017", + "b": "0x10a291597a934a1c7ad", "cmp_a_b": 1 }, { - "a": "0x12a34a82aa73b3000000000000", - "b": "0x2720134fe44cc8000000000000000", - "cmp_a_b": -1 - }, - { - "a": "0x3c3eb060e93e4e000000", - "b": "0x3461167691f1720000000000", - "cmp_a_b": -1 - }, - { - "a": "0x3ac1aa9f9a5bee00000000000000000000000000000000000", - "b": "0x4cbcc", + "a": "0xeac455c2f7a8e02fae7ba2d28fda39743efd8af", + "b": "0x732419", "cmp_a_b": 1 }, { - "a": "0xaf1f1", - "b": "0xaf1f1", - "cmp_a_b": 0 - }, - { - "a": "0x846263a8151d480", - "b": "0x846263a8151d480", - "cmp_a_b": 0 + "a": "0x1a25b653bf56c91c4ab61df", + "b": "0x7147c3d00f7b2413", + "cmp_a_b": 1 }, { - "a": "0x339b2b660d4216000000000000000000000000000000", - "b": "0x7d", + "a": "0x7b4c3e8a4b897c00dc73c1d7d89ed323a5e2237ef1f01d55", + "b": "0xc308c8336019de0283e0", "cmp_a_b": 1 }, { - "a": "0xb033b25c4e4098000000000000000000000000000000000000", - "b": "0x2eabbe3bacda7e000000", + "a": "0x23533373bcbe5e59f80c800b459d8cdf7ff7457fb", + "b": "0xff83c6e8b93a1c929452ab6881f7c10e", "cmp_a_b": 1 }, { - "a": "0x302e9", - "b": "0x35a935d50317fc0000000000000", + "a": "0x3393d02450c4a89ce059710f5", + "b": "0x4c40e5b00b540164412f034d4e", "cmp_a_b": -1 }, { - "a": "0x254f69f2089a9000000000000000000000000000000000000000", - "b": "0x145", - "cmp_a_b": 1 + "a": "0x38", + "b": "0x45de2dfa", + "cmp_a_b": -1 }, { - "a": "0x60275f5ac6058400000000000000000000000000", - "b": "0x778d3bdea9f02c00000000000", - "cmp_a_b": 1 + "a": "0x9", + "b": "0x9", + "cmp_a_b": 0 }, { - "a": "0x0", - "b": "0x6a089bb198eda", + "a": "0xf43834f47591bc", + "b": "0x1140f46accde2db29c2182d699b77", "cmp_a_b": -1 }, { "a": "0x0", - "b": "0x16f85502cb5b7b0000000000", - "cmp_a_b": -1 + "b": "0x0", + "cmp_a_b": 0 }, { - "a": "0x4fbff52610f2700000000000000000000000000000000000000000000", - "b": "0x0", + "a": "0x4ab9b1c59a0d095d014f7d0893d3dede6ce2d974f302", + "b": "0x18ed1b0bea7af721e36a3a660809b5565", "cmp_a_b": 1 }, { - "a": "0x3df695dfb5aa", - "b": "0x19930a2d49778700000", + "a": "0x269", + "b": "0x350a1f", "cmp_a_b": -1 }, { - "a": "0x58188164ea5d1c0000000000000000000000000000000", - "b": "0x2066b7e81d5f3e000000000000000000", + "a": "0x10c329031f20dc5cab745448ea5a567010e80a6f5c18a8", + "b": "0x117", "cmp_a_b": 1 }, { - "a": "0x11582b048b693a00000000000000", - "b": "0x0", + "a": "0x71d2db8de99970779afe7fdb6ac2f61", + "b": "0x256406", "cmp_a_b": 1 }, { - "a": "0x28481df", - "b": "0xb65b40a58433100000000000000", - "cmp_a_b": -1 - }, - { - "a": "0x51b18a847719e0000000000000000", - "b": "0x2f3d3ce", + "a": "0x23a50dd45858ae084794f991", + "b": "0xd7b48d171a70f9c", "cmp_a_b": 1 }, { - "a": "0x747c3a4f5", - "b": "0x93e16985b30550", - "cmp_a_b": -1 - }, - { - "a": "0x1fed0ff479a4d2000000000000000000000", - "b": "0xae3d41154ba9080000", + "a": "0x3dacffa2f130ddfa54d6128b7f530", + "b": "0x1e515255fcd", "cmp_a_b": 1 }, { - "a": "0x183c83f87a566100000000000000000000000000000000000000000000000", - "b": "0x21695e5dd", + "a": "0xd93f6d33febbe3abfcb257c3d51e65febe0557a633eef3c", + "b": "0x70a2", "cmp_a_b": 1 }, { - "a": "0x209b1c3fd41a7a000000000000000000000000000000", - "b": "0x3b5", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 }, { - "a": "0x240714d", - "b": "0xcbc37d71f9b", - "cmp_a_b": -1 + "a": "0x3964996ebb2b3980ce966200601f13907b4a7fa665e0fb0b56385", + "b": "0x507eca20e12abe5044585", + "cmp_a_b": 1 }, { - "a": "0xb19b3c9b57d3680000000000000", - "b": "0x113918f957c", + "a": "0x11924242ae8c65e8affbab8c60e85a7", + "b": "0x730547bc4a82204efbaa", "cmp_a_b": 1 }, { - "a": "0x11cfb756a09dcc0000000000000000000000000", - "b": "0xddfd2eef4c", + "a": "0x6d906ff3e61443d131077c76cdd237185a", + "b": "0x40dbd3d2a9a83e33a36fc5", "cmp_a_b": 1 }, { - "a": "0x3b550aeed9305", - "b": "0x3d9a060cefc49a0000000000000000", - "cmp_a_b": -1 + "a": "0x1737ebaa9355ac4c61fd4e449d58e098", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x9b871f11b2011000000", - "b": "0xd5b09ee5a987680000000000000000", - "cmp_a_b": -1 + "a": "0x2f83da9c5f7c4f1a", + "b": "0x21756", + "cmp_a_b": 1 }, { - "a": "0x3e0990d42e1966000000000000000000000000", - "b": "0x4fbf1cf9f4bd0c000000000", + "a": "0x4e84", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0xdd2131f99544580000000", - "b": "0x1be9216ab1a90200000000000000000", + "a": "0x19", + "b": "0x5ab3951751501228", "cmp_a_b": -1 }, { "a": "0x0", - "b": "0x1edc87fc99553b0000000000", + "b": "0x1b1e7b1a786dd5a36f21c1", "cmp_a_b": -1 }, { - "a": "0x88ec55a5fcf77800000000000000", - "b": "0x491e9922c30c7800000", + "a": "0x2c0280a063f9e836a1f612a7e72", + "b": "0x63a47fed1de", "cmp_a_b": 1 }, { - "a": "0x515fe7e3e8e8ec000000000000000000000000000000000000000000000000000", - "b": "0xf13de26b89c6700", + "a": "0x19ed15913748050881c9c23ad6ca91fa16dbdb69cdc", + "b": "0x7934b", "cmp_a_b": 1 }, { - "a": "0x15e8dcf4d6455500000000000000000000000000000000000", - "b": "0x1f5d9a57f6f31800000000000", - "cmp_a_b": 1 + "a": "0xae3a276bd8324f1286452bebb6115", + "b": "0xae3a276bd8324f1286452bebb6115", + "cmp_a_b": 0 }, { - "a": "0x3a73150e14597200000000000000000000000000000000000000000", - "b": "0x88eb66f71e0e080000000000", + "a": "0x18d0fbbc1ec3dffb8a04c62c324b558847c423", + "b": "0x137a036d1cc1b007e5b0140", "cmp_a_b": 1 }, { - "a": "0x21e11755c16b1c00000000000000000000000", - "b": "0x238b6e16eb601400000000000", + "a": "0x1b25eff2098b55a7094d1c2680222d1872d4b711", + "b": "0x16ffb04763bb14410f", "cmp_a_b": 1 }, { - "a": "0x24736c6a5a284c0000000000000000000000000000000000000000000000000", - "b": "0x8", - "cmp_a_b": 1 + "a": "0x2a36", + "b": "0x31bffea715e3e114b0d64599d9955c24", + "cmp_a_b": -1 + }, + { + "a": "0x98810d9444db342e1", + "b": "0x98810d9444db342e1", + "cmp_a_b": 0 }, { - "a": "0x48b09b28428bb40000000000000", - "b": "0x3d30fbb7716e30000000000000", + "a": "0x1fecd7c59e", + "b": "0x69e95f8bc", "cmp_a_b": 1 }, { - "a": "0x884fe7e6966b8", - "b": "0x30b42f5f5ed3ac0000000", + "a": "0x0", + "b": "0x1572a0ea7f80d346", "cmp_a_b": -1 }, { - "a": "0xed81c297b1b580000000000000000000000000000000", - "b": "0x7e427382e80", - "cmp_a_b": 1 + "a": "0x20", + "b": "0x20", + "cmp_a_b": 0 }, { - "a": "0x15694b272d1e0d0000000000000000000000000000000000000000000000000", - "b": "0x0", + "a": "0x7a5b3c04e2d21f8b3fdbcc2c0f756b8a", + "b": "0x1bccb3473af38", "cmp_a_b": 1 }, { - "a": "0x197b781ab9757900000000000", - "b": "0x47de11a6", + "a": "0x118a447865a5ee8e692b87fdc690d6d746e0065102998dffb2", + "b": "0x713234695", "cmp_a_b": 1 }, { - "a": "0x67629a2034822400000000000000000000000000000000", - "b": "0x18dcc1496b965b00000000", + "a": "0x11871a427445a77fc7fea0be53fed88bb790b4a393f0a837e0da720", + "b": "0x97ae33ff7930e79dbe66d1f3", "cmp_a_b": 1 }, { - "a": "0x14", - "b": "0x2016dd83e3b2c000000000000000", - "cmp_a_b": -1 + "a": "0xe440055", + "b": "0xe440055", + "cmp_a_b": 0 }, { - "a": "0x3ae15222e377ea0000000000", - "b": "0x1106f", - "cmp_a_b": 1 + "a": "0x100aacf91c", + "b": "0x13d46ff5d4091766926bc8c0e3", + "cmp_a_b": -1 }, { - "a": "0x87f5b59339f11800000000000000000000000000000000000000000000000", - "b": "0x97fedbe792d", + "a": "0x3d4e539f4ff6d711c275d6", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x164998e", - "b": "0x1a4cb09", - "cmp_a_b": -1 + "a": "0x8dbab83e02f6ef8ef8a8370e00fc4c999150b6400b9d7787", + "b": "0xee", + "cmp_a_b": 1 }, { - "a": "0x6bce7d5f4f7", - "b": "0xc81ee87d2d6868000000000000", - "cmp_a_b": -1 + "a": "0x18461c4dd4694572e4aab22962866365afb4d9ca6b540fe0246245efc", + "b": "0x9c7e7440be549", + "cmp_a_b": 1 }, { - "a": "0xa31e22955c5940000000", - "b": "0x58cac7ecaa5", + "a": "0x720570e1bebee5052cfb0b33a463c", + "b": "0x1573145bb7c933d3798", "cmp_a_b": 1 }, { - "a": "0x1ac955894718e6000000000000000000000000", - "b": "0x22", - "cmp_a_b": 1 + "a": "0x1", + "b": "0x708abac9c1a946121cc0c", + "cmp_a_b": -1 }, { - "a": "0x3597598b", - "b": "0xd59433161055000000000000000", + "a": "0xc73474", + "b": "0x6dba2d0a14b2ff", "cmp_a_b": -1 }, { - "a": "0x45819821fd9e80000000000000000000000000", - "b": "0x62b21d4a24705000000", + "a": "0x6be5278da4e6329d967744de22c6e84f333cae1f93b2d8bb2cd78426c45396a80", + "b": "0x393663b23031d604b24ef719782182b63", "cmp_a_b": 1 }, { - "a": "0x79667f8f20b9f800", - "b": "0x9c81c9adea76900000000000", + "a": "0x1a163a7cf928cd65a", + "b": "0xa88b29eb2ed353e2aec10de99f3", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x43b910ff04a73000000000", + "a": "0x15490788", + "b": "0x82c4d91d9e1a97a7d2392cb140", "cmp_a_b": -1 }, { - "a": "0x91", - "b": "0x91", - "cmp_a_b": 0 - }, - { - "a": "0x3e8a00d424a31a0000000000", - "b": "0x183270ef60d904000000000000", - "cmp_a_b": -1 + "a": "0xb12ae629733f765762909", + "b": "0x46e2d9875cd320", + "cmp_a_b": 1 }, { - "a": "0x58e60ad5b05dbc00000000000000000000000000000000000000000000000", - "b": "0x21dbafd0a3e6bc000000000000000000", + "a": "0x25252f701664a7a4df00da5e70027dc8ddd8bbb0a9dfcff5af", + "b": "0x504dcd96f80b885246f6377c33f5", "cmp_a_b": 1 }, { - "a": "0xc2f006b56d31980000000000000000000000000000000000", - "b": "0x2534a40f62649a0000000000000000000", + "a": "0x1c780e7442d9ebd81c8d72fb184fa6740a1cd1b53b2f60", + "b": "0x2bb9016f88de82484e", "cmp_a_b": 1 }, { - "a": "0x54892e07705", - "b": "0x135505373fb7cf000000000000000", - "cmp_a_b": -1 + "a": "0x1448bdec1244ec1cee9eac6d9845eb18cdbc1b4c90ae807a446fe5e0b04ea", + "b": "0xc3bd", + "cmp_a_b": 1 }, { - "a": "0x426736d7c2740000000000000000000000000000000000000000000", - "b": "0x66", + "a": "0x3c9551922cb0f29055c9ab63b0ac4c671e41d", + "b": "0x6354012f0db246", "cmp_a_b": 1 }, { - "a": "0x359ed3dd3234240000000000000000000000000000000000000000", - "b": "0x644b", + "a": "0x135e034df6567bc0af9f73351b075bc723ad7601403a8ac1", + "b": "0x3057209e75a295d6274729ea56dfa0f", "cmp_a_b": 1 }, { - "a": "0x17f9da96c572b9000000000000000000000000000000", - "b": "0x38545fd4c1059000000", + "a": "0x988ce3d28e00b0633b759c795140e", + "b": "0xd74a133781636", "cmp_a_b": 1 }, { - "a": "0x1465465bb983c6000000000000000", - "b": "0x18a463e95981ee000", + "a": "0x8a371500c6", + "b": "0x221", "cmp_a_b": 1 }, { - "a": "0xc0bf", - "b": "0xb98e9689907a600", + "a": "0xbf134866c12ed1", + "b": "0x7c2ae85d8fd5899ad17ad", "cmp_a_b": -1 }, { - "a": "0x17433b228562e40000000000000000000000", - "b": "0x4", + "a": "0x44607c009063437923a490417", + "b": "0x102", "cmp_a_b": 1 }, { - "a": "0x24779ea36e50f200000000000000000000000000000000", - "b": "0x22dca2ca97a94200000000000000000", + "a": "0x98d10058f4574fc9ab74c01518e30e7ce7182c33fd7f7", + "b": "0xac15d45cecd3c275ee5a9dddc046d", "cmp_a_b": 1 }, { - "a": "0xd20ab385cb83d80000000000000000000", - "b": "0x12cad4aad", + "a": "0x206726d220ed4218ae1bc23e3d9f45e5495a5e6ac22130b9c7c0403eea0d3ad29", + "b": "0x732ffcdf7029", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x3e1da81d6961360000000000000000", - "cmp_a_b": -1 - }, - { - "a": "0xa418b5f282875000000000000000000000000000", - "b": "0xaca8c90c8dae", + "a": "0x71b2ffe6f59ccb8c2f3f01586fcc87d11c29", + "b": "0xa", "cmp_a_b": 1 }, { - "a": "0x6989849919e61c0000000", - "b": "0x0", + "a": "0x1a2f9bbf27270d47d57cdb85a7c8c9f5a2fab0", + "b": "0xfaacc422", "cmp_a_b": 1 }, { - "a": "0xa9c142abda1698000000000000000000", - "b": "0x21a7f4fe1b844a000000000", + "a": "0x309e1c9fa8d5949ec08e773f18343b3beff446dca8d7a9055d7e535df82", + "b": "0xcfd8bca7e2b4180d102809e", "cmp_a_b": 1 }, { - "a": "0x131b5ad3c8ccc0000000000000000000", - "b": "0xa79d9f07a734280000000", + "a": "0x248386f25e26064f76604687ac7bb63", + "b": "0x44217a4928ed", "cmp_a_b": 1 }, { - "a": "0x6c6ab98b3691c800000000000000000000000000000000000000000000", - "b": "0x0", + "a": "0x1e81d5f019d24ce69e8f79ac54b67e1bbc77", + "b": "0x5b01b2ec9f96a", "cmp_a_b": 1 }, { - "a": "0x15fb494561b1b200000", - "b": "0xdfc143ba", + "a": "0x2df7795a", + "b": "0x9962", "cmp_a_b": 1 }, { - "a": "0x6e881e5a652e6000000", - "b": "0x6a4756fdea0e1c0000000000", + "a": "0x7ba", + "b": "0x17af5c7f5b7ec3f8b50512f3dd453", "cmp_a_b": -1 }, { - "a": "0x2fa4c1e1602fa6000000000000000000000000000000000000000", - "b": "0xce023", - "cmp_a_b": 1 + "a": "0xa38c085d74084afd", + "b": "0x1e64a2d2912492ac551654fe52", + "cmp_a_b": -1 }, { - "a": "0x5a67dc3257afd00000000000000000000000000000000000000000000", - "b": "0xe1adaf993fe50000000000000", - "cmp_a_b": 1 + "a": "0x1293da57e5e5f22823600ac", + "b": "0xfcca094c6bc1e12509e1a74", + "cmp_a_b": -1 }, { - "a": "0x498854a0096c48000000000000000000000000000000000000000000", - "b": "0x2109", + "a": "0x183bf34a0ba216b80edd47591e6f15eb170e0403bc4b4b2", + "b": "0x3ea197d7a602faf", "cmp_a_b": 1 }, { - "a": "0x1265d3298fe8a6000", - "b": "0x5fe5aa57196a9", + "a": "0x5ad8b420ac1", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x127cb751c23820000000000000", - "b": "0x127cb751c23820000000000000", - "cmp_a_b": 0 + "a": "0x210b04fc30ccdd8", + "b": "0xc5e7a89f28a2283020", + "cmp_a_b": -1 }, { - "a": "0x1231c2c7c728ed000000000000000000000000000000000000000000", - "b": "0x1bdac54af0548600000", - "cmp_a_b": 1 + "a": "0xc", + "b": "0x30bb9b", + "cmp_a_b": -1 }, { - "a": "0xec4f7cc8dc02080000000000000000000000000000000000", - "b": "0x37e734879d42b", + "a": "0x7337ebe80bea783869c6c559d42f03284e16d6a95a3072b3", + "b": "0x28ec2021cd698d8d604a7b73131", "cmp_a_b": 1 }, { - "a": "0x8f152f184d44c00000000000000000000000000000000000000000", - "b": "0x1c2fdf7e9fb60b0000000000000", + "a": "0x145bafd", + "b": "0x26", "cmp_a_b": 1 }, { - "a": "0x7304882e393d10000000000000000000000000000000000000000000000", - "b": "0xba682a125143d00000000000000000", + "a": "0x13c493dcd6b00d53ba2aa8c4aee79ed75601f0fde87d8ec5a25f499d3ff1aaaf4", + "b": "0x313fd2a407c218482c15dd", "cmp_a_b": 1 }, { - "a": "0xdede121d53915800000000000000000000000000000000000", - "b": "0x261086dd80bac400", + "a": "0x6d05ef1ee9f778", + "b": "0x16fbbb1590f", "cmp_a_b": 1 }, { - "a": "0x584947c3", - "b": "0x18f2f72f413", + "a": "0x34579ed5c8", + "b": "0x261c7a886e0e76dce", "cmp_a_b": -1 }, { - "a": "0x1171e3", - "b": "0xa4cc61800208f8000000", + "a": "0x1f91", + "b": "0x516753411c0abe85ee1835893d07e44", "cmp_a_b": -1 }, { - "a": "0x1d109e923bbab3000", - "b": "0x6ab64a13bbbfb00000000000", - "cmp_a_b": -1 - }, - { - "a": "0x17c2b", - "b": "0x1d62704f1fa1d40000000000000000000", - "cmp_a_b": -1 + "a": "0x2699b1daf498efe8a", + "b": "0x2b651646e59", + "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x60144c1db", - "cmp_a_b": -1 + "a": "0x2a68f716e35f6ce3e47ecdc4061a0b1545898582d921e1478054e17486cfe3", + "b": "0x8bf4a07", + "cmp_a_b": 1 }, { - "a": "0x1eba506f780405", - "b": "0x183c66fcb59f95000000000000000", - "cmp_a_b": -1 + "a": "0x5e61caf0488130b0ec4552aa27685554a2965d0a29b25e356814", + "b": "0xafacd1a8cf83f489dc", + "cmp_a_b": 1 }, { - "a": "0x296d5", - "b": "0x41a9e757a3b2", - "cmp_a_b": -1 + "a": "0x1cee39b513e268e4b42509fbc79ec4ac4e069328cde1d25", + "b": "0x2002d9c", + "cmp_a_b": 1 }, { - "a": "0x28991856b52ddc0000000000000000000000000000000000000000000", - "b": "0x13ca6641002ea800000000", + "a": "0x260fc7d55607df9bdb211", + "b": "0x1ad82f09e8585a0c59c", "cmp_a_b": 1 }, { - "a": "0x1b744f7566c3e900000000000000000", - "b": "0x2100c6628784cc000000000000000000", + "a": "0x0", + "b": "0x1a98", "cmp_a_b": -1 }, { - "a": "0x1c6a13a068e289000000000000000000000000000000000000000000000000000", - "b": "0x13360214", + "a": "0x1553b99ecee5bf1b862f4dd329b472f925", + "b": "0x953f158634398bae", "cmp_a_b": 1 }, { - "a": "0x93972", - "b": "0x34b209ec8287380000000000000000000", + "a": "0xb9ee84333dceafb425ee", + "b": "0x1123d32f9e316d70e3e63d9cd", "cmp_a_b": -1 }, { - "a": "0x50127dc9159914000000", - "b": "0x26f1d03", + "a": "0x123cd5f5681f5c335ff36240ff0fdb691b18d4f0f2", + "b": "0x7cd7324c71fa2dbaa3", "cmp_a_b": 1 }, { - "a": "0x708fa2373afafc000000000000000000000000000000000000000", - "b": "0x443ece6cfea0440000000000000", + "a": "0x1ccb9be81430e795eb88fe01d35d13ea", + "b": "0x16a514e7ce276dc9752d4bd7c98ced", "cmp_a_b": 1 }, { - "a": "0x2419f51b5838220000000000000000000000000000000", - "b": "0x1aaa1740c7adc70000000", + "a": "0x589cc9f13d97fd943b2d70", + "b": "0x3c83106860", "cmp_a_b": 1 }, { - "a": "0x22246bc5be940600000000000000000000000000000000", - "b": "0xa6faef8eeafcd80000000000000000", + "a": "0x16e116a57d2b72d9e336642626e48", + "b": "0x1206ea", "cmp_a_b": 1 }, { - "a": "0x26f", - "b": "0x625d6f369582700000000", + "a": "0x10f032f7e34ed4", + "b": "0x34a21bdc3e643afa410", "cmp_a_b": -1 }, { - "a": "0x6915aa694cb8c00000000000000000000000000000000", - "b": "0x9c41", - "cmp_a_b": 1 + "a": "0x1dc5aaf0", + "b": "0x12a6c79d2a763a7f4ed9", + "cmp_a_b": -1 }, { - "a": "0x280cac6f3f39140000000000000000000000000000000000000000000000", - "b": "0x22f6dcb12a3a0", - "cmp_a_b": 1 + "a": "0x1eff28906ecc8a63cc7e", + "b": "0x415a13e13e71ea0f50ffa57f379", + "cmp_a_b": -1 }, { - "a": "0x292b6d2ac79a2a00000000000000000000000000", - "b": "0x309ed8b24d9ca800000000000000", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x1da6c33755362ca4c39a31", + "cmp_a_b": -1 }, { - "a": "0x829c4849de550800000000000000000", - "b": "0x14cee171", + "a": "0x7d092e6df1f17648239ae2ec0e", + "b": "0x7d092e6df1f17648239ae2ec0e", + "cmp_a_b": 0 + }, + { + "a": "0x8490540a63984741e03daedb3da09dca0828eb8ad0916fec7a1a30", + "b": "0x6bc7916747a", "cmp_a_b": 1 }, { - "a": "0x14963481e370", - "b": "0x14963481e370", - "cmp_a_b": 0 + "a": "0x14174153900383178c6e09b65178e0882b2079645c", + "b": "0x249b787bbc3f5936d3d862", + "cmp_a_b": 1 }, { - "a": "0x17", - "b": "0x3a6d1d68116fca00000000000000000", + "a": "0x7", + "b": "0x2b51e3ba9dc99ae51643e9444b514", "cmp_a_b": -1 }, { - "a": "0x5139638804c244000000000000000000000000000000000000000", - "b": "0x4c862c9ebf171", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x549ab1", + "cmp_a_b": -1 }, { - "a": "0x26c91697", - "b": "0x17d5982ca7302", + "a": "0x7d80", + "b": "0x1ccff4226c02f1cddbd9", "cmp_a_b": -1 }, { - "a": "0x94155c1", - "b": "0xa", + "a": "0x6bf331be2ee9451717b33e666fffc03bd961f78ae73f264fbe51f2fd4ff9d0", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x355c57c9cdb5860000", - "b": "0x59632d37fde0e8000", + "a": "0x1a76adfeed49fc03e3b548178c1e08655361f07aa65a9c1df9deb86ea5718", + "b": "0x6e59ca37fb20b72", "cmp_a_b": 1 }, { - "a": "0x86c443", - "b": "0x19e", + "a": "0xa954ea74d53e6b5f6ac582f7a214d01338086d5fad65d187b6bfe", + "b": "0xcf756e7d493f10", "cmp_a_b": 1 }, { - "a": "0x18aa2a67413efe000000000000000000000000000000000000000", - "b": "0x152afe570b79c0000000000", + "a": "0x1", + "b": "0x1a059756e", + "cmp_a_b": -1 + }, + { + "a": "0x7b7a4e345a", + "b": "0x7", "cmp_a_b": 1 }, { - "a": "0xb7be5f", - "b": "0x138563fbd358a30000000", - "cmp_a_b": -1 + "a": "0x5e630607abf4b", + "b": "0x35f446", + "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x0", - "cmp_a_b": 0 + "a": "0x1ec535820c142d58d42969fdb3443b9a35fcc825d6b6a10717", + "b": "0x10", + "cmp_a_b": 1 }, { - "a": "0x755da0ddb90a9800000000000000000000000000000000000000000000", - "b": "0x2bd198a8453580", + "a": "0xf8d32620d43c114a684d06da2082a75d6411d95a662", + "b": "0x2132fadd0158988c5", "cmp_a_b": 1 }, { - "a": "0x1c4855cd392aa800000000000000000000000000000000000000000", - "b": "0x2b235c803de1c000000000", + "a": "0x961fb7bb821c25c015b65d8426", + "b": "0x13ed1d307a", "cmp_a_b": 1 }, { - "a": "0x18268abd6a34f70000000000000000000", - "b": "0x1ea", + "a": "0x13e508265ec08e5277b1d5c3bd8e13192db9007d6ad020", + "b": "0x648baa23e1020", "cmp_a_b": 1 }, { - "a": "0x23e95ad6e05dc200000000000000000000000", - "b": "0x3d5ddfb0", + "a": "0x332913917ea3224", + "b": "0x1f", "cmp_a_b": 1 }, { - "a": "0xafd76647", - "b": "0x13bebfec6be3c400000000", + "a": "0xa", + "b": "0x3604da42f6dcc6ffb52950b", "cmp_a_b": -1 }, { - "a": "0xa9f5e491443da0000000000000000000000000000", - "b": "0x1da402a421d88b0000000000000", + "a": "0x12ee6e63211a65f7e593c769d3ea74c91f79d4d80c9b8eff50f128210", + "b": "0x1a", "cmp_a_b": 1 }, { - "a": "0x176bbf7de7fccc00000000000", - "b": "0x176bbf7de7fccc00000000000", - "cmp_a_b": 0 + "a": "0x188181a4f176ef7174046403853e146555b3232c2a", + "b": "0x8b99aa71beefdbbadaf", + "cmp_a_b": 1 }, { - "a": "0x5a7a34bd3094440000000000000000000000000000", - "b": "0x2ad7a5d102cf680", + "a": "0xd6550377e1245237c7fccbbeccfb0f69276", + "b": "0x2ced2", "cmp_a_b": 1 }, { - "a": "0x19d1ec1d78767c0000000000000000000000000000000", - "b": "0x17d6b27", + "a": "0x1025aaff4790d23135192f6cac8b9b2cdf53371b046", + "b": "0x28d2fcdca9c8f15744c62558b6ad5ce7", "cmp_a_b": 1 }, { - "a": "0x2f398f5c6206400000", - "b": "0x77f959f6", + "a": "0x6217a77f76de05ebd33f5acd13b341c8a144631566f38628b3c09d", + "b": "0xf6d8173b6e8a094e8d7b68d609ec", "cmp_a_b": 1 }, { - "a": "0x2f50226aedcc62000000000000000000000000000", - "b": "0x43fafd3ef912ac00000000", + "a": "0x0", + "b": "0x1aaf6c161f252b46a7624d5d784c6", + "cmp_a_b": -1 + }, + { + "a": "0x5fd739a0eedf02324d5e31ce8abdf24f8e8d22880f8293d12", + "b": "0x128fe0b3ed931c10dd", "cmp_a_b": 1 }, { - "a": "0x5babe8b672b5cc000000000000000000", - "b": "0x5babe8b672b5cc000000000000000000", - "cmp_a_b": 0 + "a": "0x377a25572574a3b21eb7f10b7e5cddbe4d34e7ddeb3b790c3694774a589e5a", + "b": "0xbdffb1b7c2b484f0c", + "cmp_a_b": 1 }, { - "a": "0x804ad5fa51f0e8000000000000000000000000000", - "b": "0xb162a0248a9f580000000000000000", + "a": "0xadb47a4ebbc693d4c2db9183c0468571deb", + "b": "0x4908", "cmp_a_b": 1 }, { - "a": "0x127", - "b": "0x38d32fc8e0b04a00000000000000", - "cmp_a_b": -1 + "a": "0x1e895df8337ffaf863a8632fb9", + "b": "0x1e895df8337ffaf863a8632fb9", + "cmp_a_b": 0 }, { - "a": "0x425b4371ce4b78000000000000000000000000000000000", - "b": "0x51791dfb", + "a": "0x25a5d5a5e757f3d293b1c4e6c5", + "b": "0x1ea3eb", "cmp_a_b": 1 }, { - "a": "0xc7fadad998123000000000000000000000000000000000000000000", - "b": "0x212c639859367000000000000000000", - "cmp_a_b": 1 + "a": "0x16e0a", + "b": "0x9ac9b8a31d73f7", + "cmp_a_b": -1 }, { - "a": "0x18b16f3da7a23e00000000000000000000", - "b": "0x580d22857ce8f8000", + "a": "0xca09bf0d2a970a62ecede6727cc394a9978b3a5e388148458422ea4faec", + "b": "0x497bec76f33a3d9cecafd1", "cmp_a_b": 1 }, { - "a": "0x5bc4318184ad740000000000000000000000000000", - "b": "0x13d81a2d8e9d6e0000", + "a": "0x86acc272430f0b0f815b322a3a39cfc87b6c7c9213599ef6dfc4e4", + "b": "0xe8b3459d997019dc941d6edeed153", "cmp_a_b": 1 }, { - "a": "0x2c205c", - "b": "0x606c5a2bb44260000000000000", + "a": "0x73eb12d021a", + "b": "0x1fc1cadf4728e7fecefc30", "cmp_a_b": -1 }, { - "a": "0x40ff7a160da75000000000000000000000", - "b": "0x5c2456a8f1528000000000", + "a": "0x3693bdd21094e6e42a230db3e4aff30a43aaec8eac8de", + "b": "0x1a2be1", "cmp_a_b": 1 }, { - "a": "0x81470193ab9b4000000000000000000000000000000000", - "b": "0x628de96dbc08580000", + "a": "0x11defaac2b650e730c01621f35d", + "b": "0x5c459aab6204e", "cmp_a_b": 1 }, { - "a": "0xbe4b3bd23129b8000000000000000000000000000000000000000000000000", - "b": "0x16e58166d3", + "a": "0xfad64431d8c1e97783ee8ed6f9a0a741b718f0c3b974e4", + "b": "0x18541451e312c22f7a139", "cmp_a_b": 1 }, { - "a": "0x1cc83680664b0d0000000000000000000000000", - "b": "0x18da409d184", - "cmp_a_b": 1 + "a": "0x1868a94c42a", + "b": "0x1868a94c42a", + "cmp_a_b": 0 }, { - "a": "0x203fdb6021e7c600000000000000000", - "b": "0x25fb", + "a": "0x956316aa0e31b19d3b3a948617d60b863d43582af150b209", + "b": "0x6c8", "cmp_a_b": 1 }, { - "a": "0x2a1ad546064b1c000000000000000000000000000000000000000000000000", - "b": "0x2ed1c98d7185d800000000000", + "a": "0xd1bd93b3fb9ad732e945433aa", + "b": "0x3d", "cmp_a_b": 1 }, { - "a": "0x24e51fcb9a8dbc00000000000000000000", - "b": "0x19dc65f", + "a": "0x45256c38ce595d6e3c4e2ae13c81bcf7597e20ee77866dfaa388d622353d", + "b": "0x161", "cmp_a_b": 1 }, { - "a": "0x1fc9411c76dde4000000000000000000000000000000000000000000000", - "b": "0x974632e0e791f80000000000000000", + "a": "0x18d0f0abd3041dbb4", + "b": "0x2e02d", "cmp_a_b": 1 }, { - "a": "0x2c0ce02947e8a200000000000000000000000000000000000", - "b": "0x4ec", + "a": "0x921ea6a1a8fb440922d33e", + "b": "0x1caadf0841fe01ad7f", "cmp_a_b": 1 }, { - "a": "0x23527f1d2abbe80000000000000000000000000000000000", - "b": "0x1b92f12", - "cmp_a_b": 1 + "a": "0x9c6c6ab9bf856", + "b": "0x7b2ae96eac380ad6f55d9cbc4414", + "cmp_a_b": -1 }, { - "a": "0x1c917076a3474100000000000000000000000000000", - "b": "0x95f92852dc9be000", + "a": "0x1fa25dd87028e180751941797ce99", + "b": "0xfaac7bb190abfa7bf89117", "cmp_a_b": 1 }, { - "a": "0x24d2e65e54014e0000000000", - "b": "0x3355f7b99cb84400000000000", + "a": "0x3cc4182a93a5418df", + "b": "0xec130b103a5dacd6465cbe49", "cmp_a_b": -1 }, { - "a": "0x26438b24645a7a00000000", - "b": "0x4", + "a": "0x55e555102df091c5153", + "b": "0x1b8a358bd3524", "cmp_a_b": 1 }, { - "a": "0x61bf5", - "b": "0x557", + "a": "0x23cd46b11b95875b40af2cac", + "b": "0x56b7a19a", "cmp_a_b": 1 }, { - "a": "0xb78f11283e79b8000", - "b": "0x344227168c4a3c000000000000000", - "cmp_a_b": -1 + "a": "0x5eda4bf4cca098e82356cbaaf361a56e9f83c78313397", + "b": "0x1d77ccc0e90", + "cmp_a_b": 1 }, { - "a": "0x310d50b498708e00000000000000000000000000000000000", - "b": "0x371aa2909d24ee00000", + "a": "0x13dd8760cce8470f26d2e603069b0a5534eebc7b495", + "b": "0x13ee2b46271ce", "cmp_a_b": 1 }, { - "a": "0x79d10100e2", - "b": "0x0", + "a": "0xb5698ebef6211f9c", + "b": "0xb5698ebef6211f9c", + "cmp_a_b": 0 + }, + { + "a": "0x4eeaa70086e1b9f49b8f53b4df4efb265", + "b": "0x248720a3af206294c38981abe4de4d59", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x1251a40d2df4b20000000000", + "a": "0x3", + "b": "0x27ed4df0f53", "cmp_a_b": -1 }, { - "a": "0x21310228d911fc000000000", - "b": "0x168ef87c20dcbc0", + "a": "0x39b90cedb6ff560bf8fedf88d", + "b": "0x14e62eb605ace67df6e", "cmp_a_b": 1 }, { - "a": "0x1de4b18e7e990200000000", - "b": "0x16a932559e", - "cmp_a_b": 1 + "a": "0x992", + "b": "0x1ab34b74d28385093d771a472bfaea9e5", + "cmp_a_b": -1 }, { - "a": "0x91117f86f3277800000000000000000000000000000000000000000000", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x2c8fb62e5a1fea4b29578b54", + "b": "0x2c8fb62e5a1fea4b29578b54", + "cmp_a_b": 0 }, { - "a": "0x56a7a3acc1423400000000000000000000000000000000000000000", - "b": "0xc103433ce6a49000000000", + "a": "0x1f4d248d715975d0ada36596b6e9b098b2", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0xd77508f21e3980000000000000000000000000000000000000000000000000", - "b": "0x1c404e61fd8c8a00000000000", + "a": "0x62f0a34d6049020a1b03084c25a07c11dda7a0f", + "b": "0x8c38ff3fe11fe", "cmp_a_b": 1 }, { - "a": "0xfc19fe1a77b990000000000000000000000000000000", - "b": "0x32e8f5e39db7f0000", + "a": "0x519ec6ec1d4347f39984934894458405fd86652bef77ebdbd3d05e623264", + "b": "0x2b66b2b", "cmp_a_b": 1 }, { - "a": "0x12c316b6436d75000000000000", - "b": "0xa614c4b8a2de680000000000000", + "a": "0x364", + "b": "0x2ef6910693e6be9ff66d927df48f", "cmp_a_b": -1 }, { - "a": "0x1173de65", - "b": "0x14201028ffe86c", - "cmp_a_b": -1 + "a": "0x60c78641ceb9ad729f555e80af", + "b": "0x1dac8590840c5628cdbaafa1", + "cmp_a_b": 1 }, { - "a": "0x26e0b4161", - "b": "0x268272b2cf", + "a": "0x0", + "b": "0x1cb97470f5624cd0a19bbf78d279d5c", "cmp_a_b": -1 }, { - "a": "0x710266b4f4167c0000000000000000000000000000000000000000", - "b": "0x782e16992fe14400000000000", + "a": "0x5d2364308d4f3609a69d3b08602bedbd3b47", + "b": "0x2a3434cbfb8acbea4ee263c", "cmp_a_b": 1 }, { - "a": "0xc5bd77573996b80000000000000000000000000000000000000", - "b": "0x2ba1b3f15235c200000", + "a": "0x20ddbfb790fa82acf6e899cdcc52d1e3fec8d00231f9fbac", + "b": "0x4", "cmp_a_b": 1 }, { - "a": "0x64f35e124bf29400000", - "b": "0x275cca6a9370220000000000", + "a": "0x2a68724f4", + "b": "0x56991b0792864316aa67454895f", "cmp_a_b": -1 }, { - "a": "0x38fa1c8e086e08000000000000000000000000000000000000000000000000", - "b": "0x2f7add47a2cb7c00000000000", + "a": "0x26ebee311cea3605199fea5aa9", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x2b89b8d119a1b6000000000000000000000000000000000000000000000", - "b": "0xff3742617c98f0000000000000000", - "cmp_a_b": 1 + "a": "0xeb", + "b": "0x5c9c689a25025b879153ede95f107", + "cmp_a_b": -1 }, { - "a": "0x6c32cae55a2c9c0000000000000000000000000000000000000000000000000", - "b": "0x85ce610", + "a": "0xaa354c5b395439072d513e4eff967f746ed78623a0e7eaeaa629c3e62439475", + "b": "0xbecf628f690", "cmp_a_b": 1 }, { - "a": "0x45c735685dddb00000000000", - "b": "0x0", + "a": "0x86c300f2a332dde619f49c76044118f9e5646c", + "b": "0xacd8c9", "cmp_a_b": 1 }, { - "a": "0x21a2a1baa4cf800000000", - "b": "0xc2f95f55565ff", + "a": "0x5a", + "b": "0x27a2862450823b0d0bb2e73249f8a6", + "cmp_a_b": -1 + }, + { + "a": "0x13b52135fb06", + "b": "0x18bd1cc4bb2fdffe1a041", + "cmp_a_b": -1 + }, + { + "a": "0x4e85358a669bb7316b80567758fa48aefd24f4", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x11ac95fc0", - "b": "0x1341", + "a": "0x1779bf99a985f04855f90bab", + "b": "0xfcf97278e224a7", "cmp_a_b": 1 }, { - "a": "0x17af787a2ff4030", - "b": "0x1e", + "a": "0x7aef4b136a4a093d9e1a3270b1c0d0d4b8e1194e6", + "b": "0x267826dd", "cmp_a_b": 1 }, { - "a": "0x139e131e6d683600000000000000000000000000000000000000000000000000", - "b": "0x1123", + "a": "0xd827c9cad0a49797fa2d9225273f776c1f0e3c27216af268159d005d6b", + "b": "0x1bee14c8a83", "cmp_a_b": 1 }, { - "a": "0x3d34659bfbed9", - "b": "0x21fbd6e70", + "a": "0xcbedc0426096cc94b5f7f63bd551e9f7ca211cff88", + "b": "0x3a135b834855af2f", "cmp_a_b": 1 }, { - "a": "0x159bbabc1", - "b": "0x3fa165cc41511c00000000000", + "a": "0x0", + "b": "0x6", "cmp_a_b": -1 }, { - "a": "0x1563981281112c000000000000000000000000", - "b": "0x121", + "a": "0xe4bb1d424362520bda", + "b": "0x4f3a", "cmp_a_b": 1 }, { - "a": "0x326c823d969480000000000000000000000000000000000000000", - "b": "0x3313023bcf0c9c", - "cmp_a_b": 1 + "a": "0x44b4ee27d", + "b": "0x13f410b3a2493c8292e7d609ac7a9ccac", + "cmp_a_b": -1 }, { - "a": "0xf3f994abcfb00000000000000000000000", - "b": "0x79861e1f00dab000000000000", + "a": "0x14a27367b41ac92bcc4580aeea0ae48fc8b9427", + "b": "0x146f5c3e0c3b822385f3a35b5f8dfef37", "cmp_a_b": 1 }, { - "a": "0x309c17dd414bb80000000000000000000000000000", - "b": "0x20065078d", + "a": "0x252951ab062d6826337a190fa3c52506c4139d1e3e4af9ad5b10a9a2", + "b": "0x663d", "cmp_a_b": 1 }, { - "a": "0x7c3e6fca026f40000000000", - "b": "0x2e57df6147bc8c0000", + "a": "0x5c51e637c22aded6c97bf0f82ceccae6fb42c55fbde37c9c1315b942461ad8", + "b": "0x31a8554a44f861a7c095859f7", "cmp_a_b": 1 }, { - "a": "0x933cc930c070000000000000000000000000000000", - "b": "0x238841", + "a": "0x19e6874ca0aa8", + "b": "0x19e6874ca0aa8", + "cmp_a_b": 0 + }, + { + "a": "0x2f30a08071f0c6cd53bbdbf8b0346501dd41c225b3160930b2206", + "b": "0x1c7f9964ce4", "cmp_a_b": 1 }, { - "a": "0x19cc9f9", - "b": "0x1e0405a6cc580d00000", + "a": "0xe7b3e09ab76d4d5a5192817c3d325b", + "b": "0x2067e9da783671c32258e52ce068ce92", "cmp_a_b": -1 }, { - "a": "0x34f34930583e4800000", - "b": "0x2fbd", + "a": "0x1d44b9d609a3d89fde21c2", + "b": "0x9c6b8b0b524", "cmp_a_b": 1 }, { - "a": "0xcf13c", - "b": "0x6", + "a": "0x19f7ece799d68c9bbc27d09b2641aaacc6d054f43e2cacdaf3a52128803a4a5a", + "b": "0x259b1e2c402013608938bc288dd552d", "cmp_a_b": 1 }, { - "a": "0x29abcf67267d9c0", - "b": "0x3232e03b9b6df0000000", + "a": "0xd614c4b2e0c0ca632b041", + "b": "0x1d2e0ed0861594f16e9dbe50", "cmp_a_b": -1 }, { - "a": "0x2bfb4198beeee8000000000000000", - "b": "0x2bfb4198beeee8000000000000000", - "cmp_a_b": 0 + "a": "0x5bfa1328a13b360308d9d6b2b1869ce2d01", + "b": "0x4250c784ed9f9fe3ab", + "cmp_a_b": 1 }, { - "a": "0x20653a016d773e000000000000000000000000000000000000000000", - "b": "0x2984b379d54cb60000000000", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x855d", + "cmp_a_b": -1 }, { - "a": "0x2f4de779029f66000000000000000000000000000000000000000", - "b": "0x1bdd9f0041e6530000000000000000000", + "a": "0x16c508debd6a9e8a992bf5c170c5a", + "b": "0x195f224720527ad14ac5940", "cmp_a_b": 1 }, { - "a": "0x24a5fbcfd859ca00", - "b": "0x61c58ccc86b0ac00000000000000", - "cmp_a_b": -1 + "a": "0x163f13fb07c6e71e9cf20bf4a883099fe8f506942cf323e98853529", + "b": "0x1f06b0f243cf1641628937", + "cmp_a_b": 1 }, { - "a": "0x5bf8e9c", - "b": "0x240d179d7ae656000000000", - "cmp_a_b": -1 + "a": "0xcaea5faef4fe5b73c7a3ce98bf1834ad46e9df9d9756d90e08a5b7b30b", + "b": "0x55c70c1e266", + "cmp_a_b": 1 }, { - "a": "0xc2b03cfeac6e50000000000000000000000", - "b": "0x1201a2810995a", + "a": "0x85a3fab8cdb93e7ff2b2894f55a32e4f26813037105b183f17f28b2e2ede8", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x1020e7bd447af40000000000000000000000000", - "b": "0xd9227033f7f6f00", + "a": "0x144b550ce7266040b7cfa8fa92f71ca40573b31c4ec539", + "b": "0x54ab67df424efe9dbf9de014", "cmp_a_b": 1 }, { - "a": "0x11efbb35d76f5a00000", - "b": "0x7287ada65d1f6c0000000000000", - "cmp_a_b": -1 + "a": "0xfd4c8af47cdd55eb0740aa38a2", + "b": "0xfd4c8af47cdd55eb0740aa38a2", + "cmp_a_b": 0 }, { - "a": "0x882c32383b7cf0000000000000000000000000000000000000000000", - "b": "0x1f34cbafae8", + "a": "0x633ddf7cfcfee101ae35bf758ec205019285222e87fb3aee6", + "b": "0x8b7409eeb594", "cmp_a_b": 1 }, { - "a": "0x2faaeb23481aba000000000000000", - "b": "0x13e7c5e658d01200000000", - "cmp_a_b": 1 + "a": "0x3525c5f9957bea", + "b": "0x3f96097b0c869d23359b8e6c", + "cmp_a_b": -1 }, { - "a": "0x3a676", - "b": "0x54", - "cmp_a_b": 1 + "a": "0x49120191301", + "b": "0xbc1f2ca637f", + "cmp_a_b": -1 }, { - "a": "0xa6259b3b95f5400000000000000000000", - "b": "0x0", + "a": "0x9732ed3b7f96b19ac67927b93b24f00e70188921b61740", + "b": "0x15e41ba84198d650144", "cmp_a_b": 1 }, { - "a": "0xa26f28f67461a8000000000000000000000000000000000000", - "b": "0x168927377063a400000000000", + "a": "0xea45d615e2bb3", + "b": "0x5171", "cmp_a_b": 1 }, { - "a": "0xb2c8766392a53800000000000000000000000", - "b": "0x2", + "a": "0xbc83f454b226f6f28d5f820ef2849d45f8b0600b0", + "b": "0x2a8d84e1b4b79bed3a1feb02a0", "cmp_a_b": 1 }, { - "a": "0x4be30b473c3dc0000000000000000000000000000000000000000000", - "b": "0x5b133503e2bf5c0000000000", + "a": "0x780cfb443e19a9449984cec1133b67fbf9369d1201b8596c2053335d8151c", + "b": "0x1407c084", "cmp_a_b": 1 }, { - "a": "0x5f2dfde1e36f94000000000000000", - "b": "0x0", + "a": "0x3d91b22e77bb8407e88b5b8382779bb3", + "b": "0x23204a5b41d06a9232be797a97a", "cmp_a_b": 1 }, { - "a": "0x20ddb766427c", - "b": "0x20ddb766427c", - "cmp_a_b": 0 - }, - { - "a": "0x3b0", - "b": "0x249ab2fd62c63e000", + "a": "0x0", + "b": "0x6e7d3ac71ed302", "cmp_a_b": -1 }, { - "a": "0x798333e312a2c0000000000000000000000", - "b": "0x4e49b8c3061a3c000000000000", + "a": "0x4318544d99eda432147b766e4c488da800e819", + "b": "0x182df93a3af0", "cmp_a_b": 1 }, { - "a": "0x2b4b32f2159d180000000000000", - "b": "0x33965d29894a620000000000000000", - "cmp_a_b": -1 + "a": "0x4100d417342c41e9c5d6a8c00983", + "b": "0x4100d417342c41e9c5d6a8c00983", + "cmp_a_b": 0 }, { - "a": "0x7e0a76e2", - "b": "0xd70c097285b4b0000000000000", - "cmp_a_b": -1 + "a": "0x436dc166ca2e67c3d101f3", + "b": "0x1b1cd0", + "cmp_a_b": 1 }, { - "a": "0x2c6a9b6", - "b": "0x906b89f88b507800000", - "cmp_a_b": -1 + "a": "0x1001c8f710561fb1e", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x713ec5f6011b680000000000000", - "b": "0x713ec5f6011b680000000000000", - "cmp_a_b": 0 + "a": "0xcb", + "b": "0x218", + "cmp_a_b": -1 }, { - "a": "0x616fb36d339090000000000000000000000", - "b": "0x7292474c951b", + "a": "0x2596d2db79cccb3eb68ca35772d995844a34ac36ff4d722462c92f", + "b": "0xbaac93c4d9e4644270", "cmp_a_b": 1 }, { - "a": "0x3a593095dbcb9e00000000000000000000000000000000000000000000000000", - "b": "0x932bff8db", + "a": "0x73f22d64834c5", + "b": "0x7", "cmp_a_b": 1 }, { - "a": "0x84c7519267", - "b": "0xe", + "a": "0xc820621cd5cedaa475ba5cbd807506ab43621", + "b": "0x3", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0xe528e85db9c8d80000000000", - "cmp_a_b": -1 + "a": "0x1110d55f39c8824d8be34cfd1527fed520c15d120f9b5afcc0e38f5d6b4d4a4", + "b": "0x1c0a1", + "cmp_a_b": 1 }, { - "a": "0x15cac8e73c39f8000000000000000000000000", - "b": "0x600de", + "a": "0x10072d198cf08d438259815f9e34ec06f3027c6446c3147c81ad", + "b": "0x77629ee18d880e955afc154784b", "cmp_a_b": 1 }, { - "a": "0xf15b1cd263fa5800000000000000000000000000", - "b": "0xf03b72197186000000", - "cmp_a_b": 1 + "a": "0x3d01c881c5", + "b": "0x3d01c881c5", + "cmp_a_b": 0 }, { - "a": "0x1dafc6b73def60000000000000000000000000000000000000000", - "b": "0xac8115a2931b00000000000000000", + "a": "0x345cd242edf5338823a4bf7e53a8078d2e0163aa", + "b": "0xc9f67774a5", "cmp_a_b": 1 }, { - "a": "0x5a6785236f", - "b": "0x1af7ddd", - "cmp_a_b": 1 + "a": "0x2f85c65547", + "b": "0x2f85c65547", + "cmp_a_b": 0 }, { - "a": "0x2204e835ddea", - "b": "0x63c77ecf4c", + "a": "0x438c5fd82c432402538a15307f848489e1af065b31", + "b": "0x27e4478f11dbda8678f491799fef", "cmp_a_b": 1 }, { - "a": "0x1083e57cd52", - "b": "0xa", + "a": "0x1f21abcdf69771a1414a275837ed0df543c75d9cf01ec9b59f6617ebc1", + "b": "0x105307ee05ade63fda295877696a", "cmp_a_b": 1 }, { - "a": "0x102d0a4", - "b": "0x1965048702587000000", + "a": "0xf0c3d56e8c", + "b": "0xd2ef3d5e8e0ea9a37220", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x15c9", + "a": "0x359ddee41dfb9ced", + "b": "0x3a5460e10bcc8432cbc", "cmp_a_b": -1 }, { - "a": "0x757960af82", - "b": "0x1b8506be59a1ec00000", - "cmp_a_b": -1 + "a": "0x77540d3c483ef5aee74", + "b": "0x36", + "cmp_a_b": 1 }, { - "a": "0x7542ef1b8edeb400000000000000000000000000000000000000000", - "b": "0x29465082764840000000", + "a": "0x3fb5fc6d2d653dc7a616f096fbd39ebfec55c7166d5c0e1717", + "b": "0xe", "cmp_a_b": 1 }, { - "a": "0x519d3aa8bb098c000000000", - "b": "0x1255cc3ba94ada0000000000000", - "cmp_a_b": -1 + "a": "0x49e79abd11501a2e7849b395e8d24a451", + "b": "0x197adbfa", + "cmp_a_b": 1 }, { - "a": "0x109933dfde7ba800000000000000000000000000", - "b": "0x7cb28", + "a": "0x899391cdb5c998bcffa708fc7cb0cfee18d9f136d662d9ad4b", + "b": "0x56cb80f142f", "cmp_a_b": 1 }, { - "a": "0x7dbd4c552826f", - "b": "0x6b48892dc3cd78000000000000", + "a": "0x0", + "b": "0x4bee0d4e92", "cmp_a_b": -1 }, { - "a": "0x47e573358d28600000000000000000000000000000000000", - "b": "0x82159af1ecdc680000000", + "a": "0xff136f64e4baac6d79139179012e4f86b702c0a3d", + "b": "0x1765863d8cdd7fa7d6cc2d5cbf73", "cmp_a_b": 1 }, { - "a": "0x216a5fe046257", - "b": "0x4ecadd9f0dc2f800000000000000000", - "cmp_a_b": -1 - }, - { - "a": "0x17", - "b": "0x3fab8", + "a": "0x0", + "b": "0x99b091e9", "cmp_a_b": -1 }, { - "a": "0x32eed32555efce000000000000000000000000000000000", - "b": "0x1e07451e0c70a100", + "a": "0x5d5e2061a78701e5c5235570ae3690a", + "b": "0x2c2d2aa6644", "cmp_a_b": 1 }, { - "a": "0x6a012394c8953c00000000000000000000000000000000000000", - "b": "0x11a3b07025776c000000000", - "cmp_a_b": 1 + "a": "0x2a5da9eeb4f6", + "b": "0x2a5da9eeb4f6", + "cmp_a_b": 0 }, { - "a": "0xb8c5de61b3cad0000000000000000000000000", - "b": "0x25806ac36", + "a": "0xb7681c16cae7ce59885a350f14035ceee1690677d6007b52a", + "b": "0x1e95813d5b87dc66d9", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x12cb7a7b10fa500000000000000000000", - "cmp_a_b": -1 - }, - { - "a": "0x1a6b2160663df70000000000000000000000000", - "b": "0x13e9", + "a": "0x3dbe0b1e0689629927c6e9c55db7ad3fc00a599", + "b": "0xfa2", "cmp_a_b": 1 }, { - "a": "0x3f89e1d78c43060000000000000000000", - "b": "0x2e1179afcc4f3", + "a": "0x19829345af662b58959119194cfef70ea7a3608cebdb10b8ee6771c13f6b5483", + "b": "0xeb080e32a4e54c43e2dde5c", "cmp_a_b": 1 }, { - "a": "0x4", - "b": "0x6a8a75011", - "cmp_a_b": -1 - }, - { - "a": "0x6e5e65cb5f6c9c000000000000000000000000000000000000000000", - "b": "0x13322da3c0", + "a": "0x398cc23106be0fb3c4f5b2b471ee218c72d2d95692a2d6", + "b": "0xcca905d29746924464ad6aad8d8c6fd", "cmp_a_b": 1 }, { - "a": "0x77fdb5440", - "b": "0xed411b7e3d13a00000000000", + "a": "0x1313d5462f918b1115", + "b": "0x849a5e73bc1599c8defc7c3047d6cd13", "cmp_a_b": -1 }, { - "a": "0x8ba10daaab742000000000000000000000000000000000000000000000000000", - "b": "0x961b866cb05b380000000000000", + "a": "0x3a91faeca4667bc4993fc3803bb181a973864a623f22238ad09466800", + "b": "0x66f5b546e6", "cmp_a_b": 1 }, { - "a": "0x1f244305d3e3070", - "b": "0x4a1d33c614f9e4000000", + "a": "0x5407f6c921e2", + "b": "0x52e38420ce6086ccb727", "cmp_a_b": -1 }, { - "a": "0x5086b338b34", - "b": "0x8", + "a": "0x19d197755715b38e9f8c9353cd6d1dd86ba2590633770cc7b978ff", + "b": "0x33c44", "cmp_a_b": 1 }, { - "a": "0x4d91a725b778140000000000000000000000000000000000000", - "b": "0xd6f8701a65cd0800000", + "a": "0x8bd413492fa1b02d944ced412fe7530db7d4cb3a1b0382ee33b7511e0d37f753", + "b": "0x10d7b034ecea5eca092bfde4d442e2b15", "cmp_a_b": 1 }, { - "a": "0x1a1ef78beb152000000000000000", - "b": "0xf", - "cmp_a_b": 1 + "a": "0x3da18d458f", + "b": "0x7ef9fe518df3172be721f8a1d9", + "cmp_a_b": -1 }, { - "a": "0x5296e0e818e", - "b": "0x920200bf0f02d8000000000000", + "a": "0xede871e555e", + "b": "0x55c1c851c8a4fab64a3adfa2", "cmp_a_b": -1 }, { - "a": "0x6c7820a151e888000000000000000000000000", - "b": "0x72f7bed7169bbc00", + "a": "0x3a36a8c1582147bcd6d4c67c76e6cb4abe42b6313f8a5911ffaf", + "b": "0x175bc6639ec93a554965cf155", "cmp_a_b": 1 }, { - "a": "0x57f5a382be299c0000000000000000000000", - "b": "0xe0d5513c51e32000000", + "a": "0x2fdd939f2858b6ccf3fa8b1ed", + "b": "0x8893234ff3323d", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0xa5edb9", + "a": "0x594a", + "b": "0x7acd74861bac524", "cmp_a_b": -1 }, { - "a": "0x3412905d3469ec00000000000000000000000000000000000000", - "b": "0x25968578a41b7c00000000000000", - "cmp_a_b": 1 + "a": "0x1240", + "b": "0xa3c0b10c800", + "cmp_a_b": -1 }, { - "a": "0x5d248a28165a68000000000000000000000000000000000", - "b": "0x8a5b91ad9a70780000000000000000", + "a": "0xbb85d4b2c2e26ef4b65d155ff8d35f116ca51a2a4384b908267c", + "b": "0x11", "cmp_a_b": 1 }, { - "a": "0x7edcac1ce5e8dc00000000000000000000000000000", - "b": "0x14fc0f73af1296000000000", + "a": "0x265b9d392a01650675c162e552cb7cb", + "b": "0x14a732fb4", "cmp_a_b": 1 }, { - "a": "0x56b416aa5f26e0000000000000000", - "b": "0x1a1fe8d6e8e3290", + "a": "0xdf5e3def0b", + "b": "0x3ecf1a088f", "cmp_a_b": 1 }, { - "a": "0xf2564c6b182b5000000000000000000000000000000", - "b": "0x409e1b4e3bd13000000000000000", + "a": "0x5baa867380c697329e836f6c237aadf0e2e71abf", + "b": "0x2928b58e6fc5d7b", "cmp_a_b": 1 }, { - "a": "0x1033aa3cbfeef4000000000000000000000000000000000", - "b": "0x10751d07d00c3f000000000000", + "a": "0x7cc39d205ed5975d0f246e497f2c838", + "b": "0x31bd3049fb23caf44a", "cmp_a_b": 1 }, { - "a": "0x6b6d98344965a80000000000000000000000000000", - "b": "0x615e32ff23c1d80000000000", + "a": "0x2b657564d145f0d4267e74904da4b2eda14fddb356b8a96aedf22ddc83e002a", + "b": "0x3d42d7e3ba57", "cmp_a_b": 1 }, { - "a": "0x1c0f1dfee902070000000000000000000000000000000000000", - "b": "0x691b96", + "a": "0xb3ba66a0524557f1ed926c156332", + "b": "0x731c20e547faf14e", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0xfc57f6da29d73000000000000000", + "a": "0x740d6a861d1dd57", + "b": "0x2b72388d540acf803", "cmp_a_b": -1 }, { - "a": "0xb8e7c06160ca4800000000", - "b": "0x2548b87221391e000000000000000000", + "a": "0x35ed7832c933af222a0b3", + "b": "0x3b8eac98452b5411b97aea2f79445", "cmp_a_b": -1 }, { - "a": "0xafbab1", - "b": "0x560c08", + "a": "0x158fb6980b8b40fd5f0098e67f95cb460440a2cdfefbfd1eda2e63e", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x39acc71c3726be000000000000", - "b": "0x6ca", - "cmp_a_b": 1 + "a": "0x7933904c182", + "b": "0x28a836828ba116d3", + "cmp_a_b": -1 }, { - "a": "0x5fbac560017864000000000000000000000000000000", - "b": "0x276877", + "a": "0x3bae369685ce4464511ec8f14e2f937f597c5bf474c8d09edc0e4dfb6a6ec", + "b": "0xef7de511cd9a8cfedc", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x1404382", - "cmp_a_b": -1 + "a": "0x253bdeb2227fad33f2601e66076590789df44cc4c8db86b5ab5557ffbb", + "b": "0x169658a550c1e4b435e0", + "cmp_a_b": 1 }, { - "a": "0x4579618dba65b800000000000000000000000000", - "b": "0x0", + "a": "0xcd41f791d8020383b424f5d9ecae1db3b22c26dddf02b9439a06baca9", + "b": "0x8ea8b8e1c1f354049d6", "cmp_a_b": 1 }, { - "a": "0x176ed1c2f2b27b0000000000000000000000000000000000000000000000", - "b": "0x24dc1fdf46cfae000000000000000", + "a": "0x202fed9f6f2b1a79f4b5296ae3450939c2c7225d4aaef2612e00905", + "b": "0xc3fe33486964bb3f81335", "cmp_a_b": 1 }, { - "a": "0x756b8841d0ae74000000000000000000000000000000000000", - "b": "0xb78804dd359fd80000000", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x1687f0904f1f2303a90c6d0b", + "cmp_a_b": -1 }, { - "a": "0x568354ead1e3f400000000000000000000", - "b": "0x71466", + "a": "0x17147f8ae3a41edbaa77fe32033", + "b": "0x317cbfed2c92fdff5731599f", "cmp_a_b": 1 + }, + { + "a": "0x1d98322ba1ee7da21bc2", + "b": "0x93d3f8f4ebc18f9a911d16e4aa", + "cmp_a_b": -1 } ], "test_comparison_128_256": [ { - "a": "0x126e6ec2dd123f000000000000000", - "b": "0x20bcf8022f157a000000000000000000000000000000000000", - "cmp_a_b": -1 - }, - { - "a": "0xfe865bb4fe40e00000000000000", - "b": "0x28fbc08c217a9e00", + "a": "0x58d089cf0ac88edb50ece3eccd50329b", + "b": "0x386fdd90a44046e6ee82ea1cf6c121", "cmp_a_b": 1 }, { - "a": "0x23d7056818d5ce000000000000000000", - "b": "0x0", + "a": "0x1fdb229cb3c0d", + "b": "0x2c24005ce", "cmp_a_b": 1 }, { - "a": "0x7378183a5254a40000000", - "b": "0xe3b98fe89c84c80", - "cmp_a_b": 1 + "a": "0x737", + "b": "0xd574ac5c32fa9", + "cmp_a_b": -1 }, { - "a": "0xba5", - "b": "0x238c0909293968000000000000000000000000", + "a": "0x23da129ce6c492", + "b": "0xcd21e3ee50370b082e6a9c25ca89efe203", "cmp_a_b": -1 }, { - "a": "0x644", - "b": "0x644", - "cmp_a_b": 0 + "a": "0x32b17faf69bc353", + "b": "0x1ddbe6b85947f89749f36bef546eab22e9a7c570e7d0", + "cmp_a_b": -1 }, { - "a": "0x3deedb69e03360000000000000", - "b": "0x3deedb69e03360000000000000", + "a": "0x1f4", + "b": "0x1f4", "cmp_a_b": 0 }, { - "a": "0x85bcb47ca8f4d", - "b": "0x84756c1", - "cmp_a_b": 1 - }, - { - "a": "0x3f1dc9a7f241c8000", - "b": "0x1a538a5cd386cd00000000000000", + "a": "0x2c8d30", + "b": "0xbedf4cd4dd2f9e1f9e417d4634db203", "cmp_a_b": -1 }, { - "a": "0xd55a43eee668380", - "b": "0xd55a43eee668380", - "cmp_a_b": 0 - }, - { - "a": "0x3c9", - "b": "0x13a8f3b288e2b4000000000", + "a": "0xcd6227942223de9598c26f652cb40fe", + "b": "0xd95068c27493e2dcb868222dd9f536a7f3834a8482543fbfaffa", "cmp_a_b": -1 }, { - "a": "0xadcc", - "b": "0x1ae1b26cfdb836000000000000000000000000000000000000000000000000", + "a": "0x52e397217f40131bac75b8a5c67b09", + "b": "0x805eb1d981923a2fb2f8f201055b03085b3b3eeb193fd2", "cmp_a_b": -1 }, { - "a": "0x128fb7e", - "b": "0x1f66218264b6b4000000000000000000", + "a": "0x739de", + "b": "0xbea8b1a743abce893f5d030ba0d1f1bcdd9", "cmp_a_b": -1 }, { - "a": "0x3186cda", - "b": "0x9117fbfdb63f88000000000000000000000000000000000000000000", + "a": "0xc809e3bbff023b", + "b": "0xb1c9fa474eb1651d", "cmp_a_b": -1 }, { - "a": "0xbe688579", - "b": "0x2b4e86b6f65288", - "cmp_a_b": -1 + "a": "0x5", + "b": "0x5", + "cmp_a_b": 0 }, { - "a": "0xe933c3b009de500", - "b": "0x60bbd1d35701ac000000", + "a": "0xb5150dcea11", + "b": "0x73b69b60698dfaf5066f6552a1ab5b7a4b8f5317c54703254cebd", "cmp_a_b": -1 }, { - "a": "0x71e4b", - "b": "0x5795bff25523dc000", + "a": "0x5d5", + "b": "0x10b3cdb8a0d106bc418f9ae8d505f367e6576dc04", "cmp_a_b": -1 }, { - "a": "0x33faa22beca2680000", - "b": "0x416d510a74a9", + "a": "0x3fa19dd45782517bdd", + "b": "0xd6fcc33ac88046218", "cmp_a_b": 1 }, { - "a": "0x3ba1c9", - "b": "0xd1a84af3", + "a": "0x1eddaa8ff9eb862c2b1a", + "b": "0xd553a649768dc022611449878f871fa9247e72df0f8bb54f3b94c9455c3", "cmp_a_b": -1 }, { - "a": "0x133604f", - "b": "0x1f9871bad93f2d0000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x60ac70f204c4232ebd73d", + "b": "0xc326ab728849bf", + "cmp_a_b": 1 }, { - "a": "0x8df6a9613630a0000000000000000000", - "b": "0x6020e3ad64ef6c00000000000000000000000000000000000000000000000000", + "a": "0x144900cf7a4a95a045b698d4d", + "b": "0x71dfb6bde95c3308c2fe3db9e14d1ca44641149c97a9", "cmp_a_b": -1 }, { - "a": "0xca9e58a9f", - "b": "0x290373", - "cmp_a_b": 1 + "a": "0x2", + "b": "0x186f2402b479e1611ba08d3ae521ce780b10a7cd315201a8cdbee3", + "cmp_a_b": -1 }, { - "a": "0x25aa92f1068c9", - "b": "0xd4114", - "cmp_a_b": 1 + "a": "0x4a8998f84f15545", + "b": "0x129ed7fe4574b6abe4943a87f02f9e05c18194fedd4737721be2c28450d8", + "cmp_a_b": -1 }, { - "a": "0xf0c6423dfb81680000000000000", - "b": "0x6017c311ae4fe4000000000000000000000000000", + "a": "0x125e462fe9e0", + "b": "0x3aa9a2213a6a4a9d36ac5f6f5ebd0b10fe25aa", "cmp_a_b": -1 }, { - "a": "0x295371c9dfa9d40000000000", - "b": "0x918218a85b37c0000000000000000000000000000000000", + "a": "0x109ed2b", + "b": "0x193cddc40114a5b186ed0c7b3e04be3", "cmp_a_b": -1 }, { - "a": "0x144b1aebc684d300000000000", - "b": "0x5bde76f67b15f40", + "a": "0x244251e8a267539cad", + "b": "0x260", "cmp_a_b": 1 }, { - "a": "0x169b", - "b": "0x8012e6259c6", - "cmp_a_b": -1 - }, - { - "a": "0x8c71e66e06e450", - "b": "0x34f898faaab0e0000000000000", + "a": "0x5f", + "b": "0xed43", "cmp_a_b": -1 }, { - "a": "0x67", - "b": "0x51255de0cf5c", - "cmp_a_b": -1 + "a": "0x1e149479a32c", + "b": "0x1e149479a32c", + "cmp_a_b": 0 }, { - "a": "0x112c2c44697026000000000", - "b": "0x18a7b04e98661a00000000", + "a": "0x60fc5a7e2710d8d", + "b": "0x2d6eabb712f13f9", "cmp_a_b": 1 }, { - "a": "0x3e4ab85b", - "b": "0xa284796dc18998000000000000000000000000000000000000000", + "a": "0xe64a7beef784454d86ce93e1302e", + "b": "0x5da675da8a4efc7ae3ce5a7bb0344cb670eb", "cmp_a_b": -1 }, { - "a": "0xed4", - "b": "0x6c834f78a5ddd800000000000000000000", + "a": "0x12bcde41", + "b": "0xe9e15ab9c945af7f1e6d3ec6003108532b75", "cmp_a_b": -1 }, { - "a": "0x412bfe553d8f0800000000", - "b": "0x38311cdb29e98200000", - "cmp_a_b": 1 + "a": "0x8e9acb951db021e8f71", + "b": "0x8e9acb951db021e8f71", + "cmp_a_b": 0 }, { - "a": "0x107082a140b73d00", - "b": "0x20", - "cmp_a_b": 1 + "a": "0x941acdd065df873e2126be0aa99188", + "b": "0xd9e06f2314c955ae32ead5c5bf958ecee5bc4964a98f41419dccee53c5dce", + "cmp_a_b": -1 }, { - "a": "0x9dc2b1d32109580000", - "b": "0x451785f936d9a80000", - "cmp_a_b": 1 + "a": "0x2f757b", + "b": "0x7e76e08038", + "cmp_a_b": -1 }, { - "a": "0x18", - "b": "0x18", - "cmp_a_b": 0 + "a": "0x2c0171f379b4fd16914", + "b": "0x1d804d6cffe3f4bb27895be4d", + "cmp_a_b": -1 }, { - "a": "0x21da6fc33bde4800", - "b": "0x17742b720927a7000000000000000000000000000000000", + "a": "0x1e2", + "b": "0x34bd03d87fd717ab67", "cmp_a_b": -1 }, { - "a": "0x8fdb1581a73918000000000", - "b": "0x2991579cc6278e000000", + "a": "0x2f168f7937fdfcb477108ff6cf0072d", + "b": "0x116ee300f276c941cfa1a1fdc5515a", "cmp_a_b": 1 }, { - "a": "0xed8ae6505027", - "b": "0x229b766b01fe6e00000000000000000000000000000000000000000", + "a": "0x623908a", + "b": "0x6a2b07fe93952f0d71499adabab2db73775", "cmp_a_b": -1 }, { - "a": "0x2bd2ee46", - "b": "0x0", + "a": "0x37b633dc9c0bebdf94ceaf9b47817cc6", + "b": "0xd5c9d764e4b49605", "cmp_a_b": 1 }, { - "a": "0x8b8c3e9179cea0000000000", - "b": "0x66c747176f18b4", + "a": "0x41b85048d9b", + "b": "0xa55", "cmp_a_b": 1 }, { - "a": "0x7168091750311000", - "b": "0x6b36cd57c5b2", - "cmp_a_b": 1 + "a": "0xbd13d837", + "b": "0x1ce5dcdbfe2fea908e4c62064e2cb497", + "cmp_a_b": -1 }, { - "a": "0x85", - "b": "0x1795736", + "a": "0x147c5895e824", + "b": "0x14daaac1075dc4c39f1616cb783b047cc88364bb54a5af3916c7f3794132d2ac", "cmp_a_b": -1 }, { - "a": "0x130beecd0eaa8000000", - "b": "0x1b1da26ff34374000000000000000000000000000000000000", + "a": "0x1ca7ca89b3e94c03c94f25ef15442", + "b": "0xff2b0bdf9dde016dcfb0274faad08e2cef2b9ca419e3e9", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x1396e274de9f4b000000000000000000000000000000000000", + "a": "0x165a2fa17a65b11a5ef", + "b": "0x28ef86085f2924a6c1d8fabb4ea6f7479d7689ad", "cmp_a_b": -1 }, { - "a": "0x4a32bd7629e2800000000000", - "b": "0x92ce6daaa649800000000000000000000", + "a": "0x66dd0f2f4a507b1", + "b": "0x39b77fdd0a082b6e3e7ad141aeb14d43a04e94882dec", "cmp_a_b": -1 }, { - "a": "0x1f9edaf60e7b9a0000000000", - "b": "0x8250f059f8f3a80000000000", + "a": "0x9f1f9", + "b": "0x325fd19c43a7a2ba2141b9", "cmp_a_b": -1 }, { - "a": "0xaa", - "b": "0x13de3613f2285c00000000000000000", + "a": "0x97c576e", + "b": "0x2cc3a34d8862545c16885b", "cmp_a_b": -1 }, { - "a": "0x7a8f12086e", - "b": "0x26d0e18df8b6", + "a": "0x55301f870447febbe0c0", + "b": "0x14a26a27065e873d2f01a9d4ba438516e7112ff9", "cmp_a_b": -1 }, { - "a": "0x1c0a8e3090a9ca0000000000", - "b": "0x73bcdcf88065b000000000000000000000000000000000000000000000000000", + "a": "0x1791ab54", + "b": "0x10535f310fcbacf84bf80518aff0f904cecbd32", "cmp_a_b": -1 }, { - "a": "0x37c3debbb98", - "b": "0x291", - "cmp_a_b": 1 + "a": "0x7de300808f76781e221504aa", + "b": "0x19e6a22652c07d68c09b5baae9e088d0a86f01c936b52bde08bd4713", + "cmp_a_b": -1 }, { - "a": "0xa0deeed7c849b0000000", - "b": "0x2cfb79cce9869800000000000000000", + "a": "0x3f0e11303c6066", + "b": "0x149c2ba5fca49e8", "cmp_a_b": -1 }, { - "a": "0x49704d2ed776f00000000000", - "b": "0xe934492017f950000000000000000000000000000000000000000000", + "a": "0x0", + "b": "0x282088615187d78cde246f7561", "cmp_a_b": -1 }, { - "a": "0x17850e6c52d35d0000000000000", - "b": "0x37553cdace7acc0000000000000000000000000000000", + "a": "0x2cf9ca98f37942008e092", + "b": "0x1a7532fd19757d5611606a", "cmp_a_b": -1 }, { - "a": "0xd958836e21b02800", - "b": "0x1449eb7c11784f0000000000000000000", + "a": "0x3c6893e1d263fd28b0", + "b": "0x2c025f1f28e4d9d8f59aa0fe016a66817ee9d33ce34e418f79", "cmp_a_b": -1 }, { - "a": "0x1a17085", - "b": "0x4f13d3ef5e814800000000000000000000000000000000000000000", + "a": "0x44779420e859205", + "b": "0x2f48e4d29b5a615862", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x1", + "a": "0xc550628235c9ab8e6955632f7547", + "b": "0xb0a48b9f332e1e2c050670bfba2aaf70cd42998e304130fecadf9a", + "cmp_a_b": -1 + }, + { + "a": "0x1d1ea06961af0e0403", + "b": "0x1d1ea06961af0e0403", "cmp_a_b": 0 }, { - "a": "0x80ced8cb24469800000", - "b": "0x15a28ee22eedac0000000000000000000000000000000000000000000000000", + "a": "0x62a91879f8e364c885b36259ef6d7", + "b": "0x1d05f7638fe015414936ef40be868a4d2e81a88afa71251f9b", "cmp_a_b": -1 }, { "a": "0x0", - "b": "0x15aec946aac73500000000000000000000000000000000", + "b": "0x9f6b7b03d06d6dc1b345eecc3dddcc9fd559b1d48c85c344", "cmp_a_b": -1 }, { - "a": "0x375e", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x35c9f437a2255a905d05a6b0", + "b": "0x40019962ffed3824e7cd476ef88c5951264e12e014f81dfe516945f408d", + "cmp_a_b": -1 }, { - "a": "0x9dd6d77f5ed0c000000000000000", - "b": "0x1f83a3ef99a4bd0000000", - "cmp_a_b": 1 + "a": "0x9daf1a1db19a9b554fafe77", + "b": "0x2ce01ab04e6f5cf0b70cb2586a21aa5704638e", + "cmp_a_b": -1 }, { - "a": "0x19a6f5704e6d78000000000000000000", - "b": "0x8e04850c023cb000", - "cmp_a_b": 1 + "a": "0x1fb003b086891357dea1", + "b": "0x7f214c86ed1ded8301912a676304b6a90104d36bed6530012de7e815eec8f053", + "cmp_a_b": -1 }, { - "a": "0xbc912f1d0d62", - "b": "0xbc912f1d0d62", - "cmp_a_b": 0 + "a": "0x8b3c528a23a10e9c26b", + "b": "0xe", + "cmp_a_b": 1 }, { - "a": "0x4cc2df2813988", - "b": "0x7addd857", + "a": "0x8b861ca9eef3ec847d13b", + "b": "0x715a1410ab", "cmp_a_b": 1 }, { - "a": "0x4f7de0bbef3a", - "b": "0xc711a677056830000000000000", + "a": "0x6733b0502b11a49bb9204f5bfd913", + "b": "0x4f363e6bc87339af0c914600d0f871dc1d8066ddabc9e", "cmp_a_b": -1 }, { - "a": "0xf837c77df05fc000", - "b": "0xf837c77df05fc000", - "cmp_a_b": 0 - }, - { - "a": "0xceff162ba91", - "b": "0xcbb2", - "cmp_a_b": 1 + "a": "0x56e811100", + "b": "0x3f3c0235643c30a542f6f0d5934d23d33c1060c2d960d3", + "cmp_a_b": -1 }, { - "a": "0x1be6", - "b": "0x12b59d634af69b00000000000000000000000000000000000", + "a": "0xa", + "b": "0x9e844053d061738b836e7a7be9fcb05", "cmp_a_b": -1 }, { - "a": "0x27463d7dcb", - "b": "0xe7aa92850552c00000000000", + "a": "0x2244163a88f90d6804", + "b": "0x16e40b6fb84a63d858bae9730b19f5b2c38b4a22c809dad9f97d975c494a9968", "cmp_a_b": -1 }, { - "a": "0xd13d519d9efdc800000000000000", - "b": "0x158c5403d8b80200000000000000", + "a": "0xa09f4cae1c87ff9ee9ae0c7", + "b": "0xce22020d0", "cmp_a_b": 1 }, { - "a": "0x27b1ac5b6aedbe0000000000000", - "b": "0x61a4fb8cf02028000000000000000000000000000000000000000000000000", - "cmp_a_b": -1 - }, - { - "a": "0x5", - "b": "0x9de4a", + "a": "0x9c150c5edeae4ce64ebeb659f7e11a1", + "b": "0x5bbd19d5e65639d631eb99933a290a3586a", "cmp_a_b": -1 }, { - "a": "0x58b14ec34", + "a": "0x2dc34d5ad688e3a48", "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x1bb", - "b": "0x2d", + "a": "0x4df29c66a", + "b": "0x58", "cmp_a_b": 1 }, { - "a": "0x345e49509", - "b": "0x53f70d7c3f843800000000000000000000000", + "a": "0x58a18ee5c7a9e5deaa0c9bbdfbdd3", + "b": "0xe66100a050c174dc57cf962b2b4cc95c6a54b2498d64b2c59aa3c4492", "cmp_a_b": -1 }, { - "a": "0x1c64", - "b": "0x3834f4793e4b6800000000000", + "a": "0x2c01dd889", + "b": "0xa556bd4587aed733acdea", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x0", - "cmp_a_b": 0 - }, - { - "a": "0x176f77b08e8d75000", - "b": "0x0", - "cmp_a_b": 1 - }, - { - "a": "0x0", - "b": "0x19727c4ba76ce400000000000000000000000000000000000000000000000", + "a": "0x3c34890", + "b": "0x24669c0d8817046bf100a5ca6589a70be736b230", "cmp_a_b": -1 }, { - "a": "0x1869b47f23322800000000000000000", - "b": "0x1be9b96da52a0d000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x6cb793f580e27bf8a9fb8be", + "b": "0x6cb793f580e27bf8a9fb8be", + "cmp_a_b": 0 }, { - "a": "0x82736f6bd676", - "b": "0xef7796e0df43d800000000000000000000000000000", + "a": "0x319b6", + "b": "0x678034b816ac60780", "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0x2", + "a": "0x4d99426d700e8", + "b": "0x4d99426d700e8", "cmp_a_b": 0 }, { - "a": "0x524fbc060", - "b": "0xd7f00b26c157600000000000000000000000000000", - "cmp_a_b": -1 - }, - { - "a": "0x87f0eac7f6878", - "b": "0x32", + "a": "0x51c3e68a1847b3f91c58d5883c7344bb", + "b": "0xab9", "cmp_a_b": 1 }, { - "a": "0x7a18bde882d8", - "b": "0x7efc99f9b1f8a0000000000", - "cmp_a_b": -1 + "a": "0x392c", + "b": "0x392c", + "cmp_a_b": 0 }, { - "a": "0xb08b75dbc20050", - "b": "0x2480365950a5520000000000000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 }, { - "a": "0x37fe24fee8", - "b": "0x1444895bd303", + "a": "0x29ebf3a54d0586b74ba9ef", + "b": "0x1d2480f05bb1fa0ab14d324af07b82febc6f666bdb5d0c6d79950a80ee1", "cmp_a_b": -1 }, { - "a": "0x4", - "b": "0x539f6b82f400ec00", - "cmp_a_b": -1 + "a": "0x50d2ae879bdd5b56e8d11a5", + "b": "0xe27e9820d561", + "cmp_a_b": 1 }, { - "a": "0x154961541cc14400", - "b": "0x11188e8d56b23f0000000000000", - "cmp_a_b": -1 + "a": "0x31d92bf2f9c690264ccf7c68", + "b": "0x2bdeeaf9d13b600d1b08eab", + "cmp_a_b": 1 }, { - "a": "0x6e35ec1d613454000", - "b": "0x2d291d10ff75ec0000000000000000000", - "cmp_a_b": -1 + "a": "0x3d64e50a60ff2c431e3892090db06ba4", + "b": "0x2680c3315f6158", + "cmp_a_b": 1 }, { - "a": "0x4169968e35d", - "b": "0x3204f994ceb4e40000000000000000000000000000", + "a": "0x2b649eac8f45534ea", + "b": "0x2165a33fa01f8594d03ef2a2b075776924dc38a08f21a82b7717e6202e6", "cmp_a_b": -1 }, { - "a": "0x715e844e24bdb8000000000000000000", - "b": "0x257e2a946730580000000", - "cmp_a_b": 1 + "a": "0x2fb207967ba", + "b": "0x83bc81168bb5371db3a375adc2918431e", + "cmp_a_b": -1 }, { - "a": "0xd3e2a64a977940000000000000000000", - "b": "0x9bc85e2a5534f80000000000000", - "cmp_a_b": 1 + "a": "0x246685be76eb542e716d9a57d", + "b": "0x246685be76eb542e716d9a57d", + "cmp_a_b": 0 }, { - "a": "0x5a7b8735bf04e8", - "b": "0x913528473b37a80000000", - "cmp_a_b": -1 + "a": "0xf0d035e1e3e2818277e21f724c8d", + "b": "0xf0d035e1e3e2818277e21f724c8d", + "cmp_a_b": 0 }, { - "a": "0x6e074", - "b": "0xa722f98f1db1a", - "cmp_a_b": -1 + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 }, { - "a": "0x10caa17", - "b": "0x10caa17", - "cmp_a_b": 0 + "a": "0x1c5dcde5c", + "b": "0x11a3865b02fe6", + "cmp_a_b": -1 }, { - "a": "0x31c0f68460f85a", - "b": "0x9a2d03991f466800000000000000", + "a": "0x2d8a3da1ff1864d15be9a", + "b": "0x1f3a501b94c6df961937aa6ab245536296c926ff23945e9ccc", "cmp_a_b": -1 }, { - "a": "0x34c6ab653d5", - "b": "0x5e8fe357a6acbc00000000000000000000000", + "a": "0x3ee54b98e6a3a5c", + "b": "0x765875358611735cb58da90e6e2f", "cmp_a_b": -1 }, { - "a": "0x1ac58a0c2c40440000000000000", - "b": "0x511658b6f77e", + "a": "0x13fedf8bcba793fd46f", + "b": "0x332fae25850a7d", "cmp_a_b": 1 }, { - "a": "0x4c169a", - "b": "0xb82a171296910800000000000", + "a": "0x1e0042d981f6c99a8cdd1fca735c", + "b": "0x4bf0af76da17b7035e362c5d25ebecced6063b619b4", "cmp_a_b": -1 }, { - "a": "0xcaaa8", + "a": "0x291612ce8dc74083832081071a00bb94", "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x1fe", - "b": "0x4da3ecb979fe3c0000000000000000000", + "a": "0xc90e33", + "b": "0x1af13680784bf63b4f3ef6b2e0280709e8bc5f5e0707b6f1", "cmp_a_b": -1 }, { - "a": "0x4aee9d8", - "b": "0x1765faa68", + "a": "0x0", + "b": "0xff2063c39d740d2a280a7ca381d3ff9d", "cmp_a_b": -1 }, { - "a": "0x17a2ced7e9552", - "b": "0xcad7933c6d2b6800000000000", + "a": "0xedd1cae161aad6ce30a47dbbd60eef6", + "b": "0x355dc70692ba67b80e0c6fac92073bdb9113e3786f2a59bef191444", "cmp_a_b": -1 }, { - "a": "0x14b8db5a6348a0", - "b": "0x265b63b2f406", + "a": "0x4e47baa9e1bdc631178c", + "b": "0xc", "cmp_a_b": 1 }, { - "a": "0x1ece04ea299716000", - "b": "0x187463f75e904a00000000000000", + "a": "0x8fdbcfff1d51bea34475bea61c7", + "b": "0x575dcc9b308ea6a9dd40e633410bab505e1", "cmp_a_b": -1 }, { - "a": "0x36495", - "b": "0xf0", - "cmp_a_b": 1 + "a": "0x69c45c86463c03aa6b4e728b5c", + "b": "0x69c45c86463c03aa6b4e728b5c", + "cmp_a_b": 0 }, { - "a": "0x4601b49a248844000", - "b": "0xbc25ec74971fd80", - "cmp_a_b": 1 + "a": "0x881b7c0937b7d1", + "b": "0x881b7c0937b7d1", + "cmp_a_b": 0 }, { - "a": "0xe6589f1baf59c80", - "b": "0x2bd3cfcb96955c00000000000000000000000", + "a": "0x1f8620b2e4a07ed3f0700982ed", + "b": "0xc7613f1e69ad268ad8afddeee464a5d3babe93afce6399a1d2b5be9cde", "cmp_a_b": -1 }, { "a": "0x0", - "b": "0x173cb6f9676", + "b": "0x315", "cmp_a_b": -1 }, { - "a": "0x76496d43faae0c00000000", - "b": "0x27f", - "cmp_a_b": 1 - }, - { - "a": "0x221018c9db4d26000000000000", - "b": "0x691e8d6ed5f4e800", - "cmp_a_b": 1 + "a": "0x144ae1d15", + "b": "0x7f6d0d82ec4d5a8268a58cfb4b72bf4b6732b7e943d134abf5ad77", + "cmp_a_b": -1 }, { - "a": "0xbd7536f059774", - "b": "0xbd7536f059774", + "a": "0xd707f3c4b2d266", + "b": "0xd707f3c4b2d266", "cmp_a_b": 0 }, { - "a": "0x28556f9514341a000000000", - "b": "0x97219b1d3b0f700000000", - "cmp_a_b": 1 + "a": "0x1458cdb128cc968241da1cf8ccbc2705", + "b": "0x3f5366ac1d6515398c8e56f25183cc483614411a75", + "cmp_a_b": -1 }, { - "a": "0x1352159fea1fa20000", - "b": "0x4ed939876b4504000000000000000000000000000000000000000000", + "a": "0x4327ca50ef8e629493f222b0b8fefe4", + "b": "0x912353b9f3f0ddc0175d8c3d199f2acb342d41cab94bd", "cmp_a_b": -1 }, { - "a": "0xb7ccae7304b3a000000000000", - "b": "0xb7ccae7304b3a000000000000", + "a": "0x170a57de43a2611c8ae063e3ece8", + "b": "0x170a57de43a2611c8ae063e3ece8", "cmp_a_b": 0 }, { - "a": "0x627263", - "b": "0x0", - "cmp_a_b": 1 - }, - { - "a": "0x9bcab22bc8e56800000000000000000", - "b": "0x11cdfaae6f6e2f000000000000000000000", + "a": "0x3737d854317e7c160f734c5da3e", + "b": "0x6bb6a5a3779f15b8d650fb6b36a87ad", "cmp_a_b": -1 }, { - "a": "0x3d459dc09508620000000000", - "b": "0x19c3589572135900000000000000000000000", - "cmp_a_b": -1 + "a": "0xb903a62ea1e7752f67657d1207845d6", + "b": "0x5add9f03c06da19de20cf5a84782", + "cmp_a_b": 1 }, { - "a": "0x1a4ee9bc53684", - "b": "0x5a2c49a405f0d400000000000000000000000000", + "a": "0x188f9e39c2a8c35e9ebf", + "b": "0xf348b6605c8d5489dea337009b57", "cmp_a_b": -1 }, { - "a": "0x6ec8dd114d7b3c00000", - "b": "0x7386edce902b9c00000000000000000", - "cmp_a_b": -1 + "a": "0x9da8a87f9715", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x905868c36d7fe000", - "b": "0x905868c36d7fe000", + "a": "0x0", + "b": "0x0", "cmp_a_b": 0 }, { - "a": "0x0", - "b": "0x22b29b761b1", + "a": "0xa93df79a890f172c199864179908", + "b": "0x389da8a513cb176d99cba024d4ab10f796c691380d67510935b1eb42bc50d", "cmp_a_b": -1 }, { - "a": "0xa1242e0ff22a9000000000000", - "b": "0x10eadbe365e8660000000000000000000000000000000000000", + "a": "0x89542a2c8aaa0ab508b75f9277c", + "b": "0x14d90f38ead69a131d20c131ff94cde5eab21ce77", "cmp_a_b": -1 }, { - "a": "0x74156", - "b": "0x33bfea541f7b3c0000000", - "cmp_a_b": -1 + "a": "0x1074ba04d1ed47e56ed9f", + "b": "0x4763b36d1c1663cc0cc1", + "cmp_a_b": 1 }, { - "a": "0x186f8a1f32c26c00000000", - "b": "0x41fa723af6b01000000000000000000", + "a": "0x2c73e9c0c273afa", + "b": "0x12b2568c03c82b15f2ab65260ade6d59c5868fa18", "cmp_a_b": -1 }, { - "a": "0x452d4", - "b": "0xd7a57607bb3160000000000000", + "a": "0x29251d80950ad366e0ab52b8", + "b": "0x3a7ff2154986fb55293803797aa55c14913f87b108d52aa741eb5e680f802", "cmp_a_b": -1 }, { - "a": "0x1efadb4bcf8d", - "b": "0x5c5012c", + "a": "0x18fda3bce3f115", + "b": "0x1ecef4b7132bb", "cmp_a_b": 1 }, { - "a": "0x7b595a29f07d", - "b": "0xb6b", - "cmp_a_b": 1 + "a": "0x7f15734980a691e1", + "b": "0x28cbc3e4051ac582ac414f4c44876ff9d8b07789c677397cdd62cb5554c", + "cmp_a_b": -1 }, { - "a": "0x1328622d6ade3f0000000000000000", - "b": "0x14e3fd29ba41be0000000000000000000000000", + "a": "0x14b8e45ff89", + "b": "0x6f91dec6362", "cmp_a_b": -1 }, { - "a": "0x45785ec8cd5d3c000000000000000", - "b": "0x3fb7729b49f060000000000000000000000000000000000", + "a": "0x29ba8685fd06d71d400f6cf4e7a", + "b": "0x48d05f8fa72998fc29640", + "cmp_a_b": 1 + }, + { + "a": "0x2", + "b": "0x30a03a8dccd312ee4b73fb3c5b32db8e54e8084cbd95d5b9fe39f296", "cmp_a_b": -1 }, { - "a": "0x43b290f9465fac0000000000000000", - "b": "0x29861bb4", + "a": "0x23735ccc4201507430c", + "b": "0x98113", "cmp_a_b": 1 }, { - "a": "0xb81c69577d28c80000000", - "b": "0xb81c69577d28c80000000", - "cmp_a_b": 0 + "a": "0x175bbefdd0124e0b4dce5d20309b", + "b": "0xe", + "cmp_a_b": 1 }, { - "a": "0x143f65d4ffdb87000000000000000000", - "b": "0x8b0764db6437a00000000000000000000000000000000000000", + "a": "0xa222d4f87897212193ebd9f68946", + "b": "0x21ba3128f0d", + "cmp_a_b": 1 + }, + { + "a": "0x3", + "b": "0x1230c62338f0e0f7f78823a89885976690bed40370bba870633e", "cmp_a_b": -1 }, { - "a": "0xb4c2e", - "b": "0x12bff10b918e9700000000000000000000", + "a": "0x536dd01f7835d9009d56482c2", + "b": "0xf73d221b44f12cf8151193cd737105c7957ef39062c2202f8", "cmp_a_b": -1 }, { - "a": "0x207ed4980f7580000", - "b": "0x207ed4980f7580000", - "cmp_a_b": 0 + "a": "0x6b7e432bd5fd0634c4a9f5", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x6d18fa01b1ad60", - "b": "0x6ddbb608fe03ac0", + "a": "0x3fbb96e", + "b": "0x1d2075e158bb0", "cmp_a_b": -1 }, { - "a": "0x3f9f89d67fdf340000000000000000", - "b": "0x2b44ece943544600000000", + "a": "0x43d49cd8ed7a487492bd06cf049fe", + "b": "0x2573d1978908785e15d", "cmp_a_b": 1 }, { - "a": "0x13e3c49b84", - "b": "0x0", + "a": "0x44d031ce6830", + "b": "0xf3c949", "cmp_a_b": 1 }, { - "a": "0x4280d4b4d", - "b": "0x2b30546f1bcca60000000000000000000000000", - "cmp_a_b": -1 + "a": "0x67671a8e322929ea511aa4d1b1938ec", + "b": "0x39be598153b1e791cbc90", + "cmp_a_b": 1 }, { - "a": "0xbbed61ce20196000000000000000000", - "b": "0x6f0f64c0cac81800000000000000", + "a": "0x463ed1576e97f5a76ab7e5ebc33f39", + "b": "0xa4e14b54d1f9c8b58c05823", "cmp_a_b": 1 }, { - "a": "0xc0", - "b": "0xecc9065dd27c0800", + "a": "0xc37498ce94614baef4aba0", + "b": "0x7d9f0903656ca02d2099bf7cf4c872fe266b2c5bd18aefaa00", "cmp_a_b": -1 }, { - "a": "0x75ffe160c633b0000000000000", - "b": "0x80e65204d1dd300000000000000000000000000000000000000000000000", + "a": "0x21dd406ec8fb72aa19d1f99b", + "b": "0x1ee73f8a274873333c32e958579ea0cce0637c7ff80a102394ef28c184ba0", "cmp_a_b": -1 }, { - "a": "0x8bcd7b80ec9e000000000000000", - "b": "0x40baad7c21031400000000000000000000000000000", + "a": "0x10d", + "b": "0x5f3c29", "cmp_a_b": -1 }, { - "a": "0x2c63210142c47200000000000", - "b": "0x1913b326e09c73000000000000000000000000000000000000000000", + "a": "0x30a0400cd6e1867015a0b1", + "b": "0x23ef6be95b3639a22084a4a694", "cmp_a_b": -1 }, { - "a": "0x41449e9421517c000000000", - "b": "0x41449e9421517c000000000", + "a": "0xd4078e21ca7ac7ee7dd07cc5b", + "b": "0xd4078e21ca7ac7ee7dd07cc5b", "cmp_a_b": 0 }, { - "a": "0x0", - "b": "0x5183b661a7c56400000000000000000000000000", + "a": "0x142e239a7300fed", + "b": "0x377be25bf5", + "cmp_a_b": 1 + }, + { + "a": "0x51772004e6e4c3830c66d14cf6", + "b": "0x67947b3f7cbbe257f2e9f3ed3e3a1265f64797", "cmp_a_b": -1 }, { - "a": "0x7028db", - "b": "0x9dc9cccb3fb0000000000000000000000000000", + "a": "0x20c7c874c1", + "b": "0x8c928eb584b24de88", "cmp_a_b": -1 }, { - "a": "0x1a76396f4cadba00", - "b": "0x1be", + "a": "0x2353a74cc164ccabbfcc661", + "b": "0x2353a74cc164ccabbfcc661", + "cmp_a_b": 0 + }, + { + "a": "0x81206ba85ed130eefd908", + "b": "0x3dcc4d7e632896e5a", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x10eb1465476c1800000000000000000000000000000", + "a": "0xeb292ebc06bbd", + "b": "0x1fb35d7bcf83e442107dc76d4c2d060a270d51239e5f692c331079454911", "cmp_a_b": -1 }, { - "a": "0x1c437", - "b": "0x2286d42c7ac7fa000000000000", + "a": "0x35ad5124e04647a0ae6", + "b": "0xa75bdd0678a", + "cmp_a_b": 1 + }, + { + "a": "0x1380f3987c2305c726049b", + "b": "0xe07b2ba64cccf2ae242e0ef4398", "cmp_a_b": -1 }, { - "a": "0xbd94f", - "b": "0x3872305cdfcb2", + "a": "0x1d", + "b": "0x3b2c7a16c7bffcbbc8fa7830499d6b86f447056dfc6ec40a0e1d0ad42fe4e5cc", "cmp_a_b": -1 }, { - "a": "0x10f954ead4927b00000000000000", + "a": "0x229763066255bd3ae962d297977977cf", "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x889371e35", - "b": "0x1e36b36ed39", + "a": "0xf71", + "b": "0x99fd1f5981c96a164cabc9486ca71825a", "cmp_a_b": -1 }, { - "a": "0x42e96eb7d148440000000000", - "b": "0x42e96eb7d148440000000000", + "a": "0xdf", + "b": "0xdf", "cmp_a_b": 0 }, { - "a": "0x57578a5d4978f00000000000", - "b": "0x8", + "a": "0xc63a52b3a560cb02d765f19c2a8dfc", + "b": "0x6fcfa4b1311705b3d0f3d1", "cmp_a_b": 1 }, { - "a": "0x14", - "b": "0x14", - "cmp_a_b": 0 + "a": "0xdff5fcc", + "b": "0x708023c2", + "cmp_a_b": -1 + }, + { + "a": "0x1603ec697d2a", + "b": "0x8d58f906eb87594247b7b4da46dfd053ed3bac6711dafe3b6ae679c6816c5d4", + "cmp_a_b": -1 }, { - "a": "0x179603ed", - "b": "0x179603ed", + "a": "0x6fb1f83d71b2", + "b": "0x6fb1f83d71b2", "cmp_a_b": 0 }, { - "a": "0x9bfa943fcb37b8000000", - "b": "0xf0a637e6fa04180000000000000000000000000000000000000000000", + "a": "0x594baca48ecb939278d4", + "b": "0x18f6e52466238d02db27325746ac84963570b4117eafad7265db081f7d48", "cmp_a_b": -1 }, { - "a": "0x25049ecdb74076000000000000", - "b": "0x1358cf29d1", + "a": "0xcd86cc36321cb3c8db89dfa6f04f52", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0xecee183dc86440", - "b": "0x19fdedc7ac91740000000000000000", + "a": "0x7dee40ee19b849", + "b": "0xd00571e3702a781e3dd927ed20701262daa4b1c95dc71ff1a78c85e15fb864", "cmp_a_b": -1 }, { - "a": "0xc781135936bf80000000000", - "b": "0xa", - "cmp_a_b": 1 + "a": "0x194f73a786760ab936a47e", + "b": "0x3af27da81f817998d299f65200203d17e", + "cmp_a_b": -1 }, { - "a": "0x7d06cc173b6ab400000", - "b": "0x224c1d4a2", - "cmp_a_b": 1 + "a": "0xe0b989ab57b18eaf27491f0a", + "b": "0xc5ac1ea8e52655d5ef02dc94e5f5b8b900f4b39301768ffd9", + "cmp_a_b": -1 + }, + { + "a": "0xc0b411ce74869c5a2863a5fb33bb5c50", + "b": "0xc0b411ce74869c5a2863a5fb33bb5c50", + "cmp_a_b": 0 }, { "a": "0x0", - "b": "0x55d29a8bc960cc0000000000000000", + "b": "0xaa366492b59ffa2ec7fb10c22fff72660a91c587671fa0c4ab24c409da0", "cmp_a_b": -1 }, { - "a": "0x16a324ef43647c", - "b": "0x12f5090fba22e10000000000000", + "a": "0x69bc13d32754e6de6559", + "b": "0xe84c75c4f", + "cmp_a_b": 1 + }, + { + "a": "0x3feeb04e67ee", + "b": "0x207bc2f0ac20f1ac9a5479346a9a2dd19af205c768a81", "cmp_a_b": -1 }, { - "a": "0x5", - "b": "0x4fcc60cb6e37680000000000000000000000000000", + "a": "0x0", + "b": "0xf26b7e77579521d8825986b42e2e", "cmp_a_b": -1 }, { - "a": "0x266", - "b": "0x266", - "cmp_a_b": 0 + "a": "0xea8fb025e2b7ec7d99fada69", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x1c08e8b7168a1700000000000000000", - "b": "0x1c08e8b7168a1700000000000000000", + "a": "0x15a12888dda338b2a968d9e58b63a9", + "b": "0x15a12888dda338b2a968d9e58b63a9", "cmp_a_b": 0 }, { - "a": "0x5a733", - "b": "0x7df7476d11fb480000000", + "a": "0x1f497575eb7b27723138a3038", + "b": "0x4b54cb64fc9d450d14a02d119eea", "cmp_a_b": -1 }, { - "a": "0x8b04f89997edd0000000000", - "b": "0x1f84197c7fd016000000000000000000000000000", + "a": "0xd2a8682608831f2120", + "b": "0x13b1e95453531bec176841344daf87d62cda9fd68d1fd84d9c7e", "cmp_a_b": -1 }, { - "a": "0x514b", - "b": "0xa02bc00613e828000000", + "a": "0x661", + "b": "0x1a5b9861b4cd866037", "cmp_a_b": -1 }, { - "a": "0x177ed9acd206d000", - "b": "0x5cc044225ca64800000000000000000000000000000", + "a": "0x28ca0e1acc814f5beb6db3564f152f7", + "b": "0x160beffceaec4cbae9fbec9e84dec40bd38bdadbd324dcfeec7a62", "cmp_a_b": -1 }, { - "a": "0x1c3a45264ef40", - "b": "0x1c3a45264ef40", - "cmp_a_b": 0 + "a": "0x8420a4d097a877e27484ba26", + "b": "0x30b556ed22d1ce8521e23577c6b9832f0d83af597eb69868ccb28", + "cmp_a_b": -1 }, { - "a": "0x6b7e4c88a07b", - "b": "0x32dcb3899f06cc000000000000000000000000000000000000000", + "a": "0x830146631ac1dcc1dfe93", + "b": "0x397a922a269788d27ec3bf3bf30fa6589ae44d4bf020f1ec9c5e489b6", "cmp_a_b": -1 }, { - "a": "0x5", - "b": "0x1086ca397918", + "a": "0x238c", + "b": "0x3ac5297c01f561d0b1e9e7933a3f007b0deef10f239", + "cmp_a_b": -1 + }, + { + "a": "0x650af0ce8d5f33aabfc", + "b": "0x715f6479d48ad10d0adb426f9d", "cmp_a_b": -1 }, { - "a": "0x10b0e090e7", - "b": "0x10b0e090e7", + "a": "0x52b22dc574b4ac696b9016930eb", + "b": "0x52b22dc574b4ac696b9016930eb", "cmp_a_b": 0 }, { - "a": "0x2a7314249301040000000000", - "b": "0x3e4f7f903ff9ba0000000000000000000", + "a": "0xbe5971683aab4c17dab5a6cf9c8c90da", + "b": "0x688535245897b0d1e203d820d3a3aa1c06", "cmp_a_b": -1 }, { - "a": "0x83f", - "b": "0x3dc7e91a4", + "a": "0x0", + "b": "0x1c82cef9ad9a065a1e3faa81215f", "cmp_a_b": -1 }, { - "a": "0x9", - "b": "0x44b78859", + "a": "0x65a8041026b631e03ae688c0", + "b": "0x65a8041026b631e03ae688c0", + "cmp_a_b": 0 + }, + { + "a": "0x9e", + "b": "0x1fa7e01b2e2ae8cb9f9a3def96", "cmp_a_b": -1 }, { - "a": "0xf439e7b6b926e80000000000000", - "b": "0x296e2d6add6a060000000000000000000000", + "a": "0x73c38e260acfdddf64196897c13", + "b": "0x2e914de4d05bbdd85c97bd9ea01c", "cmp_a_b": -1 }, { - "a": "0x39b35f39", - "b": "0x39b35f39", - "cmp_a_b": 0 + "a": "0xaf76d58d4f0f93d0c4e7043918838db9", + "b": "0x3862ebdb2dca1dbe010d0105d1203438da8", + "cmp_a_b": -1 }, { - "a": "0x2e0d27feec2fb20000000000000", - "b": "0x20599f285cd9ac00000000000000000", + "a": "0x7", + "b": "0x96", "cmp_a_b": -1 }, { - "a": "0x1b89c33fd1db0f000000000000000", - "b": "0x1cfbc4e2bc726f0000000000000", + "a": "0x54b98093d4786410d60421ef", + "b": "0x44fe", "cmp_a_b": 1 }, { - "a": "0x585498", - "b": "0x2e717643b74e0c000000000000000000000000000000000000000000000", + "a": "0x3cb", + "b": "0x747a937766912a927", "cmp_a_b": -1 }, { - "a": "0x1ea2f075fd79670000000000000", - "b": "0x1ea2f075fd79670000000000000", + "a": "0x4d12", + "b": "0x4d12", "cmp_a_b": 0 }, { - "a": "0x3956fb149e6b5a00000000000000000", - "b": "0x3956fb149e6b5a00000000000000000", - "cmp_a_b": 0 + "a": "0x5f728fcb96eccce6efa832393cb", + "b": "0x392cc069246019e5e41e5f1ecb028d3e962b4", + "cmp_a_b": -1 }, { - "a": "0x2c1d955", - "b": "0x28379f8c5960a200000000000000000", + "a": "0x51c592ebf7f77b", + "b": "0xcb4d5a21bd90f2f7e4956ed15a", "cmp_a_b": -1 }, { - "a": "0x127169b222", - "b": "0x7", - "cmp_a_b": 1 + "a": "0x92d21ac1b2e2d26fd8ff5d6850c2", + "b": "0x3015ae875469e5ab2714f63f9f41b41bfc863e9a6", + "cmp_a_b": -1 }, { - "a": "0x7212acf2ca29e000", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x7f69e2d2fb4", + "b": "0x8e39faa3ac5214c3c5d4a00bad57c23c5033", + "cmp_a_b": -1 }, { - "a": "0x3a5846c658c77400000", - "b": "0x7eb6ac976949e00000000000000000000000000000000000000000000000", + "a": "0x1ba7", + "b": "0x62825463daaf9146ce74fae9a8f5", "cmp_a_b": -1 }, { - "a": "0x953e2ad4fe9d180", - "b": "0x35c1b640f45e74000000000000000000000000000000000000", + "a": "0xd7ab3a70bb30c67c9a3c9a21e", + "b": "0x70083ef8028884016303b0708c0d5ce2cd8635", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x4a99112ab907600", + "a": "0x74af28e46515632364f35bf472c31ca", + "b": "0x17ce2d636f36cad34274cd1a381192c", + "cmp_a_b": 1 + }, + { + "a": "0x452059cd20", + "b": "0xebd5b34e58ffe2aa0969366519a1592397d3", "cmp_a_b": -1 }, { - "a": "0x991075e338f", - "b": "0x75483aac23", + "a": "0x9db48a9ca8e12", + "b": "0x7fc98fee", "cmp_a_b": 1 }, { - "a": "0x4c2cb9952b4f94000000000000000", - "b": "0x2d288a0ba6959200000000000000", - "cmp_a_b": 1 + "a": "0x2c9a556cf5284b6", + "b": "0x59205577a5a249ee16c87ca52a35bca77c2397a2d11aa387b", + "cmp_a_b": -1 }, { - "a": "0x2f5524a4e8b92a000000000", - "b": "0x1", + "a": "0xcb4bf05da3ccb0f68", + "b": "0x5606237", "cmp_a_b": 1 }, { "a": "0x0", - "b": "0x191232243c176a000000000000000000000000", + "b": "0x307b0cd3695f0daed3a1508e72be3edac6267f0898eea27a5", "cmp_a_b": -1 }, { - "a": "0x95dd7d7d31ddb00000000000000", - "b": "0x1e0c133205618e0000000000000000000000", + "a": "0x2050d9683ac6c575c6c8d2f75d823", + "b": "0x16520fdb1b4da58ceed7e4a3ddf5619224619b776c15aeb1fbc196b3c22", "cmp_a_b": -1 }, { - "a": "0x14f8d1653f29a3000000000", - "b": "0x1e767df82758bb00000000000000000000000000", + "a": "0x5d91e57204d391179863126ff3", + "b": "0x35cf8a292bed8a8bc01d3fcbfa1b48f3bf739d97cd2135815b8", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x2b3dc9d47f3a34000000000000", - "cmp_a_b": -1 + "a": "0x1a4ba9740c6781cfad65", + "b": "0x27fec6d02aeee23", + "cmp_a_b": 1 }, { - "a": "0x694402586030f0", - "b": "0x694402586030f0", - "cmp_a_b": 0 + "a": "0x3f437a83a1662fdcb0092b984c", + "b": "0xe5c501d77a752522bb11df", + "cmp_a_b": 1 }, { - "a": "0x3a1ed9e6d", - "b": "0x2c8d472723802800000000000000000000000000000000000000000", + "a": "0x6aea1372c380c140141cf6358066", + "b": "0x1545a285743e204498d108c72ee8a69e49b218020988974c40b314e97406", "cmp_a_b": -1 }, { - "a": "0x1a23f52698fe", - "b": "0xb36d3f4beccc600000000000000000000000", + "a": "0xbc0db9f9350f8768f", + "b": "0x10e4f43a43cf05a62e973d64742adef", "cmp_a_b": -1 }, { - "a": "0x10979dfd00b60a00000", - "b": "0x10979dfd00b60a00000", - "cmp_a_b": 0 - }, - { - "a": "0x6a1", - "b": "0x6a6de4d89f7", - "cmp_a_b": -1 + "a": "0x14b95d", + "b": "0x10801f", + "cmp_a_b": 1 }, { - "a": "0x51a6302f062da800000000", - "b": "0x2848d7cbb872ac000000000000000000000000000000000000", + "a": "0x6dc4c30", + "b": "0x3b66d7ab3f", "cmp_a_b": -1 }, { - "a": "0xe135fa42369f9800000", - "b": "0x4f1732b0321d100000000000000000000000000000000000000000000000000", + "a": "0x73552ee", + "b": "0x27f02c3e287", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x3a12fb5493c9", + "a": "0x5248170e1f496d15f755ba1", + "b": "0x1a6678b0c196a766c7d8d71728219dd346", "cmp_a_b": -1 }, { - "a": "0x2d7af605a", - "b": "0x2d7af605a", - "cmp_a_b": 0 - }, - { - "a": "0x10e51", - "b": "0x1b59b1a5a52ed70000000000000000000000000000000000000000000000000", + "a": "0x1dc13fe0371364ea816930b7d339f4", + "b": "0xca61c365dd87f89f4b61c2de428eebce64bb8eb03848ac7add5aad8917", "cmp_a_b": -1 }, { - "a": "0x7b1addaf29", - "b": "0x12dc190f50adf6000000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x1f561de475f6292b", + "b": "0x4784c39fd", + "cmp_a_b": 1 }, { - "a": "0x86f3b17c6d93500000000", - "b": "0x86f3b17c6d93500000000", - "cmp_a_b": 0 + "a": "0x34fe48b9c111b185a89758443871", + "b": "0xba468336ea449a73b", + "cmp_a_b": 1 }, { - "a": "0x1350ca496c0e490000000000", - "b": "0x1350ca496c0e490000000000", + "a": "0xa93d0c254d151bf9a75dc", + "b": "0xa93d0c254d151bf9a75dc", "cmp_a_b": 0 }, { - "a": "0x37df3bb", - "b": "0x92a5ff5", + "a": "0x1d83eecb40f1a94855a5f09c85", + "b": "0x1f4d02644cbf41c264c5685f48fdd49a815dc7f51b8de", "cmp_a_b": -1 }, { - "a": "0x54185d1", - "b": "0x324f82d44888920000000000000000000000000000", + "a": "0xf540318ac3907", + "b": "0x7f5f0944251ba5553fac55ca77cd2", "cmp_a_b": -1 }, { - "a": "0x664428599e738", - "b": "0x83735c2871f18000000000000000000000", + "a": "0x6f9eafd724c59432e6", + "b": "0x29c6681867a79470b93875ae83c9adcb5701ce8973c55", "cmp_a_b": -1 }, { - "a": "0x40a819a53df23", - "b": "0x100dcc7407cd7d000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x296034a3f964bd9", + "b": "0x296034a3f964bd9", + "cmp_a_b": 0 }, { - "a": "0xeeb9cdbe837b780000000000", - "b": "0xeeb9cdbe837b780000000000", - "cmp_a_b": 0 + "a": "0x7f24fcd9a153e62515c", + "b": "0xd1aac21c2", + "cmp_a_b": 1 }, { - "a": "0x1cdf5d27f7f0820000000000", - "b": "0x28c0276a30db66000000000000000000000000", + "a": "0x3078968e5e1a616ad7b0eb069f6", + "b": "0xc334eb875a67a41b2652b0c29d6457e69fd844e6bf1f3d7da0d24e", "cmp_a_b": -1 }, { - "a": "0xf71", - "b": "0x173c683415c108000000000000000000000000", - "cmp_a_b": -1 + "a": "0x3af0b45936932fcec1c4d5ce3b8e422", + "b": "0x983e536c126af89911612", + "cmp_a_b": 1 }, { - "a": "0x111b7029eb743", - "b": "0x2528d7b2395190000000", + "a": "0x6370b26f", + "b": "0x3fb929f0898ec85d1bbcaabfa761bede580cf182e86b5b2c34fac4", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x0", + "a": "0xf", + "b": "0xf", "cmp_a_b": 0 }, { - "a": "0x6cedb1dafc85e00000", - "b": "0x3da0c6130dd50c000000000000000000000", + "a": "0x709dc46f2", + "b": "0x38ca4785156ac812d3a1ae21c4499", "cmp_a_b": -1 }, { - "a": "0x72d267e8a24da4000000000", - "b": "0x3da3987d7bc6c4000000000000000000", + "a": "0x452dc897179688e7be6ea5f54593adb5", + "b": "0x5231b5261585b9d4c2e1d8ba0480a74b4fa022b691cc9f466e46fe", "cmp_a_b": -1 }, { - "a": "0x26a17a13c7ea540000000000000", - "b": "0x2f142646f751800", - "cmp_a_b": 1 - }, - { - "a": "0x89072a53f7c53", - "b": "0x1699be828e762100000000000000000000000000000000000000000", + "a": "0x879c2da74a4354", + "b": "0xf9c58ffcbe861c586b07ec16ce4ee7061cef6965bb", "cmp_a_b": -1 }, { - "a": "0x73f8706ae37c7c00000", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x13301adb1087", + "b": "0x2a919928eb4f1a046f48fb7fdf5feb40158586359bc58b914b6ce5", + "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0xd64c435c2f85480000000000000000000000000000", + "a": "0x3f8f770b46bcc5bcad3a52f3a119c869", + "b": "0x98d422d23e3aab8aa61fc20cec104a51904db", "cmp_a_b": -1 }, { - "a": "0x1e08eaeb1bd0dc0", - "b": "0x9137c5a609b4c8000000000000000000000000000000000000", + "a": "0x8a0c16d50", + "b": "0x3462b7e14206212ff765e8dd25", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x518ab19f5780ac00000", + "a": "0x1cf001ebb24418c05e2d0b", + "b": "0x19e34267eaa6c9b24153caef8e56a83fd917af2503", "cmp_a_b": -1 }, { - "a": "0x798ba52e1bab840000", - "b": "0xc7797f7f7553a800000000000000", + "a": "0x1a6f5cfa6179e7b9e", + "b": "0x33b02afd8b22b9a6284d6dd587ca07f96e17754786d4b8646af16", "cmp_a_b": -1 }, { - "a": "0x5711deea339bec0000000000000", - "b": "0x7f97c09de710a40000000000000000000000000000", + "a": "0xecbe143d8ae17b9a", + "b": "0x1523e41313cb2994f5bf6bee6252e411d046b9c6af30183fa7", "cmp_a_b": -1 }, { - "a": "0x18d9f05", - "b": "0x57b94163875614000000000000000000000000000000000000000000000000", + "a": "0x48f4111", + "b": "0xb60d16fe92a2b900c097a357a144db3f2ab17b0c75b33", "cmp_a_b": -1 }, { - "a": "0x6a5ed43dbec81800000000000", - "b": "0x953d357ceed1c00000000000000000000000", - "cmp_a_b": -1 + "a": "0x17444170fd67888cad176836557c50bd", + "b": "0x9bdb8cd56e", + "cmp_a_b": 1 }, { - "a": "0xa8a08304e2b9e0000000000000000", - "b": "0x36888326d3c50a00000000000000000", - "cmp_a_b": -1 + "a": "0x56bc4db29ae672615f8850e", + "b": "0x2972a4745dc319", + "cmp_a_b": 1 }, { - "a": "0x83e47480ce6e38", - "b": "0x15e8bd7f921c1400000000000000000000000000", + "a": "0x1db6ca727811", + "b": "0xbb49b6bc39f5d891b04ddeaa075547de5a105230b9c3bf0", "cmp_a_b": -1 }, { - "a": "0x5d6", - "b": "0x5d6", + "a": "0x116099fe02a147ae2a4d5", + "b": "0x116099fe02a147ae2a4d5", "cmp_a_b": 0 }, { - "a": "0x14e1e69", - "b": "0x8e602eb222af080000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x19bfe95dfe782297dd23de42bb", + "b": "0x31e9b768d931c4a0d36850f", + "cmp_a_b": 1 }, { - "a": "0x4a1fc53c3138a8000000000", - "b": "0x76efc28167910c00000000000000000000000000000000000000000", + "a": "0xb6e36eae6b", + "b": "0x1449ffe71a43dbfea9979285447a4f2d4b645bb5b01ac159a4ae7", "cmp_a_b": -1 }, { - "a": "0x48d82e426838e400000000000", - "b": "0xcc38047f2606700000000000000000000000000000000000000", + "a": "0xc95ff8b1305a152bf9466ba8", + "b": "0xd45cdf315f0a2ae6488666f820dbcda5161a86b", "cmp_a_b": -1 }, { - "a": "0x308a0c5d3", - "b": "0x415ead74aec", + "a": "0x5c15f4cb9a98a3a44c409a0a1", + "b": "0x6c387160c0f7434ad4d6b606f8c7bd0a3015314dc1", "cmp_a_b": -1 }, { - "a": "0x1f", - "b": "0xbafe5cd6a3f7c80000", + "a": "0x1b2500", + "b": "0xf5fe13e29a6fee22b7962f0698570b7bcab8eea10231", "cmp_a_b": -1 }, { "a": "0x0", - "b": "0x24e2a3aa502dda000000000000000000000000000000000000", + "b": "0x151fba49a1e", "cmp_a_b": -1 }, { "a": "0x0", - "b": "0x2fc826a0e6f2d200000000000000000000000000000000000000", + "b": "0x175a109eefd24b79095e1e8", "cmp_a_b": -1 }, { - "a": "0x95c90416183538000000000", - "b": "0x12cd51040c24ec00000000000000000000000000", - "cmp_a_b": -1 + "a": "0x1738316cde3b05e15f955a273522e267", + "b": "0xbf", + "cmp_a_b": 1 }, { - "a": "0x8d15736c7", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x94ccb33290", + "b": "0x94ccb33290", + "cmp_a_b": 0 }, { - "a": "0x419a1579275e34", - "b": "0x0", + "a": "0x19dc95a1febb36af0", + "b": "0x2514b0aeade49127690bc", + "cmp_a_b": -1 + }, + { + "a": "0x812910f7111c", + "b": "0x589b6f8426", "cmp_a_b": 1 }, { - "a": "0x69478738ec5a", - "b": "0x42ba636a761a08000000000000000000000000000000", + "a": "0x69a46c091fd530932ad", + "b": "0x12d5d87970da005e4b0ca097908c8e2bac", "cmp_a_b": -1 }, { - "a": "0x6ffbbc62a1aca0000", - "b": "0x563fac10111e68000000000000000000000000000000000", + "a": "0x176f237", + "b": "0x3184503d6905568d0dd7dda981a54959668", "cmp_a_b": -1 }, { - "a": "0x653fd87f3713", - "b": "0x114910efe50b61000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x6df9cbf15e8a5b5812f88fba54d8a", + "b": "0x6df9cbf15e8a5b5812f88fba54d8a", + "cmp_a_b": 0 }, { - "a": "0x10db72da5bbbea0000000000", - "b": "0x6d2e3a870c", - "cmp_a_b": 1 + "a": "0x12671ea7e118d034a", + "b": "0x18ab97267433147ef16af1e0087641ea", + "cmp_a_b": -1 }, { - "a": "0x255e3bf342e2980000000000", - "b": "0x255e3bf342e2980000000000", - "cmp_a_b": 0 + "a": "0x75dd630", + "b": "0x1d3681e911e87e159c5e0614b7d191e18d9800ee266fbaa242f99d8fc", + "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x4a", + "a": "0x7242761dbd37", + "b": "0x31daeb4aadec07226aa965101e20f17dfa39ee2d8b50409aef", "cmp_a_b": -1 }, { - "a": "0x60353e5a61c43c000000000", - "b": "0x297efb92ebf91e000000000000", + "a": "0x4e7f7d589c572b35f2b41cac92acb", + "b": "0xaf0b4470fd1ec0082575c290ffa665bfdff5199e5bd2f0e30975771acd9f6c04", "cmp_a_b": -1 }, { - "a": "0x179ee205c12fa400000000", - "b": "0x179ee205c12fa400000000", - "cmp_a_b": 0 + "a": "0x9", + "b": "0x117a6b1fc1c02cce9234f11fe202f45d25c", + "cmp_a_b": -1 }, { - "a": "0x6d73eba9cf", - "b": "0x6d73eba9cf", - "cmp_a_b": 0 + "a": "0x110441369aa", + "b": "0xde0345bb337d2751b4b46c9e6762b8ba0f2a4e48453dfe11f3a613e8a01c26cd", + "cmp_a_b": -1 }, { - "a": "0x53fee81308f53", - "b": "0x23", + "a": "0x78781ce3fea8ce3b9ce055296634b5", + "b": "0x3723ef888", "cmp_a_b": 1 }, { - "a": "0x12117378b4a10e000000000000000", - "b": "0x0", + "a": "0x2c7570d6743ba6c185518312ba", + "b": "0x2e6e78", "cmp_a_b": 1 }, { - "a": "0x12e40b99d40c3d0000000000000", - "b": "0x5cfbb44f34c9500000000000000000000000", - "cmp_a_b": -1 + "a": "0x51acb3a98d017c7de5502f74f31a7", + "b": "0x2b882c4f04ab0859d0594c9", + "cmp_a_b": 1 }, { - "a": "0x42a", + "a": "0x33680c0be3bd8b36", "b": "0x0", "cmp_a_b": 1 }, { - "a": "0xdf4c327f36b6000000", - "b": "0x30cd", + "a": "0x833fac822d1b42b", + "b": "0x1cb9afa970cd01ef8a59135c150718cf21f533", + "cmp_a_b": -1 + }, + { + "a": "0xdd788f097654b58038c213c1", + "b": "0xde142c4", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0xce583cf97d7228000000000000", + "a": "0x5914abc1cf41", + "b": "0x79165e11cde6b6047d73a", "cmp_a_b": -1 }, { - "a": "0x1b07300b76778a000000000000", - "b": "0x65503fe31401640000000000000000", + "a": "0x12fb3", + "b": "0x500979da4a848a9af86b284b58f3d0ed0071e", "cmp_a_b": -1 }, { - "a": "0x29bc914b0e0f7600000000", - "b": "0x92cb31e59e17080000000000000000000000000000000000", + "a": "0x40549940", + "b": "0x53b6aca773ae", "cmp_a_b": -1 }, { - "a": "0x225ded2c2af5360000000000", - "b": "0x225ded2c2af5360000000000", - "cmp_a_b": 0 + "a": "0x1d4dd66f437d4", + "b": "0x975d685cd360eb2", + "cmp_a_b": -1 }, { - "a": "0x29148829", - "b": "0x100839cc14", + "a": "0x269de6c8c", + "b": "0xaae0e4ba53466992bd6ad5bc", "cmp_a_b": -1 }, { - "a": "0x3ff8b0170414a2000000000000000", - "b": "0x8", - "cmp_a_b": 1 + "a": "0x7c5", + "b": "0x1cd0e36757957daf80f53492997e50f2b07781e9a986251", + "cmp_a_b": -1 }, { - "a": "0xbde735fb6bbac0", - "b": "0x2861680514beca000000000000000", + "a": "0x12735349", + "b": "0x14d700302ae9455b42ff31a4e85121e78b5351", "cmp_a_b": -1 }, { - "a": "0xbe4e", - "b": "0xe516e42fcdd0500000000", + "a": "0x9ef49bca9ece3a", + "b": "0xf32a47819ee73a64f4eddc0f0a6ad74fef7e58a98d63d6704ba3cd85d7602d", "cmp_a_b": -1 }, { - "a": "0x1508a592a4f46300000000000", - "b": "0xdf63d34d971", + "a": "0x56b30ff4a7f13732886", + "b": "0x1a9924bb0d3d88615", "cmp_a_b": 1 }, { - "a": "0x286bc4ddc91164000000000000000000", - "b": "0x24408d6f25bf8a000000000000000000000000000000", + "a": "0x7f3", + "b": "0x371e82ed354af53d420f4a1c2f44d8e", "cmp_a_b": -1 }, { - "a": "0x14161e68b1a456", - "b": "0x508dd23afc5cd0000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x3cbb33e3a", + "b": "0x37289de", + "cmp_a_b": 1 }, { - "a": "0xb", - "b": "0x103ec47", + "a": "0x16bc00e3e", + "b": "0x4ce4d007d952ccc9e95c0879cf7e1bfed334f15de887fcac79d", "cmp_a_b": -1 }, { - "a": "0x152d1c94084e9300000000000000", - "b": "0x449c5641bfec88000000000000000000000000000000000000000000000000", + "a": "0x3f2", + "b": "0x1d7189df609ff5e33f3ae116821c5e4f28f54440c45c67a50", "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0x24219ad674190e00000", + "a": "0x1b13759ffc3785d2f4ed", + "b": "0x93030868dd42d224646e43e21c716055ed90ef2dffee4a", "cmp_a_b": -1 }, { - "a": "0xb54364a65", - "b": "0x108f1acc10ac1000000000000000000000000", + "a": "0x5adad3042769c37da5", + "b": "0x1a6db306a11afad98a50c0f", "cmp_a_b": -1 }, { - "a": "0x6a2928f2fcd94400000", - "b": "0x6a2928f2fcd94400000", - "cmp_a_b": 0 - }, - { - "a": "0xed8ddd1fe1646000", - "b": "0x93be875e42a9f00000", - "cmp_a_b": -1 + "a": "0x168106cf8cd1912129", + "b": "0x44", + "cmp_a_b": 1 }, { - "a": "0x1ee979", - "b": "0x2676eeac34c1c00000000000000000000000000000000", + "a": "0x61f2ecc022da17e1c2547021aa1", + "b": "0x311e362880283cd1bff4e59a3cd9ea68dec75334cab1c", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0xb3655f29f45e5800000000000000000000", + "a": "0x1daba7dcc766a98782161b498", + "b": "0x3d605785b86a391be65f42c7e35ee897760d39572df7", "cmp_a_b": -1 }, { - "a": "0x519490ee231d1400000000000000000", - "b": "0x4692b50b5a90a800000000000000000000000000", + "a": "0x117a52ee6ea2676278aafc", + "b": "0xe5b604acba44be2bae57863b9ad3179fc80768ea39f4605d801d944a0f", "cmp_a_b": -1 }, { - "a": "0x1a014fc5fc55110", - "b": "0x10b41f2837d9fe0000000000000000000000", + "a": "0x1c7d01b3de08594ed9ca808385ad79f", + "b": "0x13740ac3b2332a668b9c8d5fb409e733ebb7f7f93642ebc0d05764a4639500f3", "cmp_a_b": -1 }, { - "a": "0x76459b9887", - "b": "0x389c226a1b6892000000000000000000000000000000000", + "a": "0x34a5c1cd707b2ef42", + "b": "0x79281acac55b27556e00b7f5d87495514522458cd8b62ec03", "cmp_a_b": -1 }, { - "a": "0xb6b6ad50ff184", - "b": "0x48002636877810000", - "cmp_a_b": -1 + "a": "0xf95819cbec38998ef64a8b022e00fa", + "b": "0xc2c829536ed53", + "cmp_a_b": 1 }, { - "a": "0x67ae777170bb6800000000", - "b": "0xcc87136621c0a000000000", + "a": "0x336e", + "b": "0x54925aaa2ef035867b3ba73531d8d43e66937f55cf82c7c7", "cmp_a_b": -1 }, { - "a": "0x1339911147d9e3000000000000000000", - "b": "0x2", + "a": "0xccf17", + "b": "0x1c57", "cmp_a_b": 1 }, { - "a": "0xcb22f36db738", - "b": "0x83bcd5007ba46000", + "a": "0x791c7325bb314603414f4b7a1f1e", + "b": "0x33975778b24b4be762471244b18dd9afa0f19", "cmp_a_b": -1 }, { - "a": "0x5a5ca86f3e0b80000000000", - "b": "0x69b9dd673c13fc000000000000", + "a": "0x439a0e2b272f2dd38964", + "b": "0x6b46a028117e104303bba128203a536a44cf0000f62390715cba7b83cf50", "cmp_a_b": -1 }, { - "a": "0x7e4e56cbe32c9", - "b": "0x3d427ee2fe6eae000000000000000000000000000000000000000000", + "a": "0x6dfc", + "b": "0x2539a25482844a208759e5b51e84dce", "cmp_a_b": -1 }, { - "a": "0x580e07eed8cd4000000000000", - "b": "0xf2c32d11b042800000000000000000000000000000000000000000000000000", + "a": "0x8a0fcd", + "b": "0x3c988c16989c844", "cmp_a_b": -1 }, { - "a": "0x2e3795ff839ca60000000000000", - "b": "0x3c3c280e9846580000000000000000000000000000000000", + "a": "0xbf482df32", + "b": "0x2902f49403a931d18f5a93647624e4f3210bbbb1993c791652ab552", "cmp_a_b": -1 }, { - "a": "0x25964a4a189f4e00000", - "b": "0x8cfed885497b4800000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x52043d6c9abfbb27", + "b": "0x2e82", + "cmp_a_b": 1 }, { - "a": "0x223b38", - "b": "0xc263e911f8939800000000000000000000000000000000000", + "a": "0xef40ef54db004d7", + "b": "0x6b6430b6a8855cf8c71ffbb864a4160863e2c", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0xa9e44ae6d79d8000000000000000000000000000000000000000000000000000", + "a": "0x42074f36f", + "b": "0x3c55567b113fc", "cmp_a_b": -1 }, { - "a": "0xa56aa555cc8d98000000000000000000", - "b": "0x4268bafda71dac00000000000000000000000000000000000", + "a": "0x1f4a8f2d58f8f4", + "b": "0x2c14e2227394c75e535f544d404b44966a9953e15058a189bb63130c7", "cmp_a_b": -1 }, { - "a": "0x3230d53e01720c000000000000", - "b": "0x833ffc99ad25b000000000000", + "a": "0xb", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x3c70b4f199bb840000000000", - "b": "0x1994e9618066450000000000000000000000000000000000000000", + "a": "0x78847465bf", + "b": "0x157d75f57b5e02f964cdef435", "cmp_a_b": -1 }, { - "a": "0xa", - "b": "0x115b17c37e45e80000000000000000000000000000000", + "a": "0x0", + "b": "0x1c08d8caa2ee0255b97f2b68f7ce9980ea86c8cfd8f6", "cmp_a_b": -1 }, { - "a": "0xe15774a0a5c430000000", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x2df95d37cc08d", + "b": "0x2d5d3ac1403e01bc54e364251ee3690339f0b749d4f2ac835097568ca65", + "cmp_a_b": -1 }, { - "a": "0x26c85145bf", - "b": "0x3c7604ee9c9aa80000000000000", - "cmp_a_b": -1 + "a": "0xb84e4121fb538a012a", + "b": "0xb84e4121fb538a012a", + "cmp_a_b": 0 }, { - "a": "0x179f87ca265b63", - "b": "0x117f3761684e030000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x412521c344626b294abe7992be43e4d", + "b": "0x9904c2758360722", + "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0xbf255e4fecbe80000000000000", - "cmp_a_b": -1 + "a": "0x54ed51147947f8875750ca545", + "b": "0x1fa7e072fbd806", + "cmp_a_b": 1 }, { - "a": "0x4613865e8041e00000000", - "b": "0x4613865e8041e00000000", - "cmp_a_b": 0 + "a": "0x55059", + "b": "0xa0200cf660386ef1504f46e22fe502e9", + "cmp_a_b": -1 }, { - "a": "0xc21835d085e658000000000000000", + "a": "0x2ad08046fd302c6", "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x3e606c80", - "b": "0x0", + "a": "0x121c34d6790", + "b": "0x2b51", "cmp_a_b": 1 }, { - "a": "0xf3d1d84e658ac8000", - "b": "0x3f5f1bbabdb17000", + "a": "0x17aa257dab03b0397295243", + "b": "0x616c42a7cade533a357faf87f12a", + "cmp_a_b": -1 + }, + { + "a": "0x1039", + "b": "0xb", "cmp_a_b": 1 }, { - "a": "0x2fd6b9288b", - "b": "0x23da276a6021e60000000000000000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x9e3f38ce72c17fa", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x1b48754aa3d81e000", - "b": "0xb87099c8bb28d000000000000000000000000000000000000000000000000000", + "a": "0x1dd9d9c7a278cbf90bd848e20f3b6479", + "b": "0x1f55894240798574d9123232ae2df2382fdcceb7e8cc9193f3ad7d64caf02", "cmp_a_b": -1 }, { - "a": "0x612733c547f0180", - "b": "0x17150bebda95e7000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0xcb9ec4343372b2048db18c67502ef", + "b": "0x17cc6b0bf2", + "cmp_a_b": 1 }, { - "a": "0x6607da7ca8", - "b": "0x558c9f33e4b9cc000000000000", + "a": "0x7aab43bdd814b97a8b397fc52e", + "b": "0xbcb6bf36b86146552215f3ed82637f03590be243537c6871e306e4658d8fe0", "cmp_a_b": -1 }, { - "a": "0x8ef1897aea4c08000000000000", - "b": "0x368694f4000d260000000000", + "a": "0x3dedc4f6b704b9f0612", + "b": "0xb51724639a09fd9e32", "cmp_a_b": 1 }, { - "a": "0x242", - "b": "0x116c69b22d22c300000000000000000000000000", + "a": "0x1c9993b2aab5", + "b": "0x21b4caccfede48654b32e4cbe57b6", "cmp_a_b": -1 }, { - "a": "0x2a82e712d", - "b": "0x945e48a9945820000000000000000000000000000000000000000000000", + "a": "0x2560832c3e571d77e3c7d4f3", + "b": "0x7b3a850e1", + "cmp_a_b": 1 + }, + { + "a": "0x8e090", + "b": "0x1f4e815183568db006835a20debd167a647feec8166f2c08c24", "cmp_a_b": -1 }, { - "a": "0x1c1976c39839ce000000000000000", - "b": "0x8725321df30ab8000000000000000", + "a": "0x14da189", + "b": "0x14bc18e1c7ec9308e54d65", "cmp_a_b": -1 }, { - "a": "0x3bb95e7", - "b": "0xd09c4ce764c528000000000000000000000000000000000000", + "a": "0xca5599cfc5b51f50", + "b": "0x1f08ea0e5f212ded40", "cmp_a_b": -1 }, { - "a": "0x8351eafeacfa980000000000000000", - "b": "0x0", + "a": "0x491a52bf9144c0dca91e53e", + "b": "0x1f8872a1f8fdc", "cmp_a_b": 1 }, { - "a": "0x842d0439c5bdd0000000000", - "b": "0x0", + "a": "0x12ae3e78b851", + "b": "0x772246ddbae1b976b2113c576787304de6db3a3c09cb54f7", + "cmp_a_b": -1 + }, + { + "a": "0x29adbf288e80f225a6deeae54f3", + "b": "0x68a65ce64ad88a08", "cmp_a_b": 1 }, { - "a": "0x476b02cc1b4ed", - "b": "0x476b02cc1b4ed", - "cmp_a_b": 0 + "a": "0x1b39fdbeaf", + "b": "0x4a2abd0591162847012ab1f8b9d0d6779d8987", + "cmp_a_b": -1 }, { - "a": "0x1b20cf842d97", - "b": "0x3ef5a47a078f380000", + "a": "0x17bd7aa54e62583c4f3a1dcbd372b4ad", + "b": "0xd2ed7b2074c9fca72a68b320b26e107022deaad7b309", "cmp_a_b": -1 }, { - "a": "0xbbc844796e5798000000000000000000", - "b": "0xd24767558a497000000000000000000000000", + "a": "0x16119cd5315ab0737772", + "b": "0x5991174ed1d6c5a932cffbee8c725d58bae4d166dd1bc", "cmp_a_b": -1 }, { - "a": "0x789b713e754ffc000000", - "b": "0x789b713e754ffc000000", + "a": "0xf6445c77429bf4cd60", + "b": "0xf6445c77429bf4cd60", "cmp_a_b": 0 }, { - "a": "0x18b534cdd", - "b": "0x3ea671df6384d4000000000000000000000000000000000000", + "a": "0xf15b79e962f8a56e12", + "b": "0x4292b96e0747853fecb853c0", "cmp_a_b": -1 }, { - "a": "0x65198cd35a034400000000000000000", - "b": "0x76a366c503c", - "cmp_a_b": 1 + "a": "0x20d", + "b": "0x141b4463", + "cmp_a_b": -1 }, { - "a": "0x68b5", - "b": "0x216a1203030ede000000000000000000000000000000000000000000", + "a": "0x68c670add6abedcc2a", + "b": "0x4d48529157291da08ba90c8a46dd8e", "cmp_a_b": -1 }, { - "a": "0x6b435ea", - "b": "0xab2ea5f2d91360000000000000000000000000000000", + "a": "0x20ca943bec5e3fc3c44f18", + "b": "0x49565eb48d3dd5da744c1b7921c326", "cmp_a_b": -1 }, { - "a": "0x11b417dc7ff94e00000000000000000", - "b": "0x538f8c001ef514000000000000000", - "cmp_a_b": 1 + "a": "0x1cae0b736f5bf068", + "b": "0x1321a1006f8bff2d584043938fe1ce4ca89a6a25f26653", + "cmp_a_b": -1 }, { - "a": "0x33ba22b7f74bb400000000000000", - "b": "0x1a626a2923570f0000000000000000000000", + "a": "0xc037", + "b": "0x6bf1a162830510878a9fc28a4d395ffad2688398e29", "cmp_a_b": -1 }, { - "a": "0x86db8f7584edf0000000", - "b": "0x211e2c932cd330000000000000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x1de77c3a384d4", + "b": "0x1de77c3a384d4", + "cmp_a_b": 0 }, { - "a": "0x8df4991cf11a88000000000000000", - "b": "0x1903fb746c01ee0000000000000000000000000000000000000000000", + "a": "0x20885f1f3593e331b", + "b": "0x110729693a3a8822dcf1339928f6017eabd7e60df46bddad95ca0760", "cmp_a_b": -1 }, { - "a": "0xb1c7d8cecf7c600", - "b": "0xe8701a24a28ac000000000", + "a": "0x77808a1ae8aade3144bf44ccbbb", + "b": "0x2fb5cade1cdae496b7265ecc8e1699739c0540ca345f00818c8", "cmp_a_b": -1 }, { - "a": "0x316600480d7b2a00000", - "b": "0x316600480d7b2a00000", - "cmp_a_b": 0 + "a": "0x49aa06d3f706248b", + "b": "0x6811", + "cmp_a_b": 1 }, { - "a": "0x43", - "b": "0xd4439adff0fa9000000000000000000000000000", + "a": "0xcf9862cb57aa73ed56a57", + "b": "0xc27a4fafc8fcb1d787cf243c318ed8f1fd751ec5b8c9963c0fcc7ff008a9e7", "cmp_a_b": -1 }, { - "a": "0x7182d9a2aba00800000000000000", - "b": "0xb5bb69ca39b03000000000000000000", + "a": "0x141e5", + "b": "0x202281a2f318d70048132c8e20ce705e", "cmp_a_b": -1 }, { - "a": "0x99e86aad534040000000", - "b": "0x49a6e185d91fd00000000000000", + "a": "0x763a0dda391fe84f82566", + "b": "0x5fc7cffc914bbb995ebfcd", "cmp_a_b": -1 }, { - "a": "0x44d64e1d3a4b200000", - "b": "0x42b5810580dfe8000000000000000000000", + "a": "0x457b5f280f37d6959a38f5dc", + "b": "0xf99216b50c6ae51e724938291d8f8f44286a4747334cadbf57f746bfc4", "cmp_a_b": -1 }, { - "a": "0x3b20bb99c0671400000", - "b": "0x4d1dbb40", - "cmp_a_b": 1 - }, - { - "a": "0x73e6a5cadeb3740000000", - "b": "0x17e1cdd325d323000000000000000000000000000000000000000000", + "a": "0xdb0b75afc16fc47a0866", + "b": "0x1d7f255bc8471569b6037c9a13bd8b93f0", "cmp_a_b": -1 }, { - "a": "0x5", - "b": "0x5c5c96dd27214000000000000", + "a": "0xa4f104d41d219288de2570c5bb", + "b": "0x2605329072bb82733a2e0a226dd7ac340e7e1db9295d6268355cf61e0", "cmp_a_b": -1 }, { - "a": "0x11bc46a7babe7600000000000000", - "b": "0x5175297306b350000000000000", + "a": "0x6072ed16b359484cc7881", + "b": "0x4", "cmp_a_b": 1 }, { - "a": "0x14fbc282c39f7900000000000", - "b": "0x14fbc282c39f7900000000000", + "a": "0x2b72ce4240b3aee3", + "b": "0x2b72ce4240b3aee3", "cmp_a_b": 0 }, { - "a": "0x0", - "b": "0x0", - "cmp_a_b": 0 + "a": "0x1256eb8ae1e", + "b": "0x21ee7c79fcd60982cbcf132d9b4ffa5c9e7fddc9ebb8f601f0c4548bd1a0dc4", + "cmp_a_b": -1 }, { - "a": "0x366cc4f2abf7fc000000000", - "b": "0x366cc4f2abf7fc000000000", - "cmp_a_b": 0 + "a": "0x59143e9d", + "b": "0xce88ddd149525dd88f5d03b16271da422109f5b4ebf168eb", + "cmp_a_b": -1 }, { - "a": "0x7b593fa2b", - "b": "0x15296d9a7aa22e000000000000000", + "a": "0x2404c1f498f7165cfe", + "b": "0x13d268d4bb23b3b40b32255869ee39e510149b043d62fa531", "cmp_a_b": -1 }, { - "a": "0x2f4ecc347c491e0000", - "b": "0xc", + "a": "0x18f06c150400bd8e", + "b": "0x29a0", "cmp_a_b": 1 }, { - "a": "0x26eb64a39c847c", - "b": "0x10e86f2e0c2f7e0000000000", + "a": "0x0", + "b": "0x10443c4120992635a317a709ac7e303e65922c3", "cmp_a_b": -1 }, { - "a": "0x5c06c940a860940000000000000000", - "b": "0xcc5de3ee4ee6a0000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x7b37748fa9c7f227112200b7300ba0", + "b": "0x3c3afe44d9af2a5e20c24", + "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x377d8436be959a", + "a": "0x10b06c", + "b": "0x23a1ee0564996d95a8b59b86f67fd3e44fe62e1adf1470ecb2", "cmp_a_b": -1 }, { - "a": "0x13c30ed22d584700000", - "b": "0x3bcb58f6defa5400000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x21b1d24ae5777d9c602ecdfad0400", + "b": "0x21b1d24ae5777d9c602ecdfad0400", + "cmp_a_b": 0 }, { - "a": "0x108019058", - "b": "0x65421a0507673000000000000000000000000", + "a": "0x0", + "b": "0x52e75c5a27aea3bd8f6f0b5eecf19031bfeab244199f37", "cmp_a_b": -1 }, { - "a": "0x111153c9f8c1c40000", - "b": "0x728ee3fb1", - "cmp_a_b": 1 + "a": "0x76c544947bbbbfdb701f6701a723", + "b": "0xb106fc013d158b56156a6cd7c18fc2b4df8038b1410aebf63", + "cmp_a_b": -1 }, { - "a": "0x300c09bafeb3600000000000", - "b": "0x4530330a6e0c", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x11987d0c2d1d5f5bb640bb3cc4056646f9bd5afc67a56a2ad", + "cmp_a_b": -1 }, { - "a": "0x2a78284236428600000000000000", - "b": "0x28cbddc17b2fb20000000000000000000000", + "a": "0x2be057dc8e7fb57649", + "b": "0x15bdd1dc3da60f9f2b99ee2c36f", "cmp_a_b": -1 }, { - "a": "0x1d58b0645fefa", - "b": "0x46ba1a4ad5cd400000000000000000000000000000000000000000000000", + "a": "0xfb5276fc", + "b": "0x4648f28191b23a661", "cmp_a_b": -1 }, { - "a": "0x10449b7e4da7d0000000000000000000", - "b": "0x10449b7e4da7d0000000000000000000", - "cmp_a_b": 0 + "a": "0x8635", + "b": "0xb08a3c2372f8d9038", + "cmp_a_b": -1 }, { - "a": "0x2a4d82f926e", - "b": "0x1919df4b4954040000000000000000", + "a": "0x0", + "b": "0x2a05f281a8cfe79581c232c44e2c6", "cmp_a_b": -1 }, { - "a": "0x1adddaf4826e9c000000000", - "b": "0x1adddaf4826e9c000000000", - "cmp_a_b": 0 + "a": "0xc", + "b": "0x804", + "cmp_a_b": -1 }, { - "a": "0x56721b1dcbed84000000000000000000", - "b": "0x1845eb746b8fb300000000000", + "a": "0x26e914ff7d46bb1dc57d0442813a87", + "b": "0x4a9c399c14a406c9acaea", "cmp_a_b": 1 }, { - "a": "0x15", - "b": "0x3dc64513c6e814000", + "a": "0x7ba52e84e5c", + "b": "0x15d86a4b40f8c6a9e0dd3a9e2f6162", "cmp_a_b": -1 }, { - "a": "0x5", - "b": "0xc6a78e9b51521000000000000000000000000000", + "a": "0x18fa6d856addf", + "b": "0x18fa6d856addf", + "cmp_a_b": 0 + }, + { + "a": "0x1866c432a0c9", + "b": "0x1e9d83999e9523e2f3d0b1c3", "cmp_a_b": -1 }, { - "a": "0x10101b", - "b": "0xacf24e4c6b6df0000000000000000000000000000000000000000000000000", + "a": "0x2ef374e", + "b": "0xa7b3bb429dd0f60946d7d1244e6ae910989c27f73e9a27a4a9b03dc5", "cmp_a_b": -1 }, { - "a": "0x2f", - "b": "0x33d6bda9dcb8f8000000000000000000000000000", + "a": "0x4", + "b": "0x1674b3567e7aaf443963cb5276b0a2", "cmp_a_b": -1 }, { - "a": "0x107ea64", - "b": "0xa14f64041c957800000000000000000000", + "a": "0x1309877372f88047f7bc2e8303315119", + "b": "0x3a795cfdc60cf42b98e44ecd4ece8a7bbcb2787f2ff27e57667877", "cmp_a_b": -1 }, { - "a": "0xeb03315e73833000", - "b": "0x67f92558eccde400000000000000000000", + "a": "0x3b3411a7056eef1e", + "b": "0x46bdc791a5500e875ca63423a4", "cmp_a_b": -1 }, { - "a": "0x2f9f6e2af7630a", - "b": "0x1e2fc927e0db43000000000000000000000000000000000000", + "a": "0x55122f1", + "b": "0x378cda56199d7ed39597fb1caee80ea", "cmp_a_b": -1 }, { - "a": "0x355049b38c8c8", - "b": "0x355049b38c8c8", - "cmp_a_b": 0 + "a": "0x3994f6a464e37e26550ab2912c9", + "b": "0x15f5b2f5cdffedf2ffce71e83cb", + "cmp_a_b": 1 }, { - "a": "0x5c", - "b": "0x5c", - "cmp_a_b": 0 + "a": "0x20493d217", + "b": "0x7ed021c0067653172bad92d87a6d4c3d74ff34d7576f3", + "cmp_a_b": -1 }, { - "a": "0x10e6c82cc2f40d0000000", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x26", + "b": "0xb1e650b76925ef69ff256a3ddba5defacf4d6f81ba33fc8676af8fd36c9f7b", + "cmp_a_b": -1 }, { - "a": "0x199499650761c80000000000", - "b": "0x70c8", + "a": "0x4219043f55219b8d9a2fb994", + "b": "0x16c354", "cmp_a_b": 1 }, { - "a": "0x3086d9f8f754840000000000000", - "b": "0x97212b9991a638000000000000000000000000000000000", + "a": "0x1898a7c61a5238cbc38a343722c5547c", + "b": "0xd9e656c5b4d6ca6254d15205cbf4e01b0fa2094ff50b75c24b6", "cmp_a_b": -1 }, { - "a": "0x53ed0e6b5d941c000000000000000", - "b": "0xf6d9f2a86e3928000000000000000000000000000", + "a": "0x28d", + "b": "0x2c69ce0bd962865b23d2", "cmp_a_b": -1 }, { - "a": "0xb40c92d0da0eb80000000000000", - "b": "0x5fd4b95617eed8000", - "cmp_a_b": 1 + "a": "0x46d2e", + "b": "0x46d2e", + "cmp_a_b": 0 }, { - "a": "0x1a64f524cb7fd900000000000000000", - "b": "0x5e86524096650800000", + "a": "0xb0fda442", + "b": "0x30649b", "cmp_a_b": 1 }, { - "a": "0x4a2867ea6d3b68000000", - "b": "0x54f80a64bf9db400000000000000000000000", + "a": "0xd5be357f1b30eea485", + "b": "0xeb2d48ec75ead13254960f160b679277e23cb", "cmp_a_b": -1 }, { - "a": "0xabc", - "b": "0xaa75d60ca852b0000000000000000000", + "a": "0x31", + "b": "0x8d6764e8fc093618ad559780990a05e0cbfcb1b4d365eb1ceaf379cb17f503", "cmp_a_b": -1 }, { - "a": "0x5149167", - "b": "0xadd", + "a": "0x331ca69caec77453500a4e", + "b": "0xd", "cmp_a_b": 1 }, { - "a": "0x3c417ca6dcde", - "b": "0x2f6648f4aeb76e0000000000000000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x5eee2f7a42db647d862fbc3a07aed4f", + "b": "0x1ce74114cf9f220e9da121e4a", + "cmp_a_b": 1 }, { - "a": "0x6e12ec89a15148000000000000000000", - "b": "0x6e12ec89a15148000000000000000000", - "cmp_a_b": 0 + "a": "0xa07ee8cdb62561", + "b": "0x46f1948941eba84afc9711a414a274e4f237b2c299cd70ee34767428ca551834", + "cmp_a_b": -1 }, { - "a": "0x8bf28b3b54ed000000000000", - "b": "0x1137b550e08feb00000000000000000000000000000000000000000000", + "a": "0x1370fa9c5b", + "b": "0x1a223a2a0425d4b0c4a97f51c7410b135946a5c257eba", "cmp_a_b": -1 }, { - "a": "0xbb4a8bef9668b80", - "b": "0xcd88718358f9d00000000", + "a": "0xad8aa8c19bb353f664fdf38636", + "b": "0x160faf6830599669528b1f947ab1835e0", "cmp_a_b": -1 }, { - "a": "0x13dd31d6c222c6000000", - "b": "0x13dd31d6c222c6000000", - "cmp_a_b": 0 + "a": "0x3f4d801ae817903099c4", + "b": "0xdd9a206f8b5", + "cmp_a_b": 1 }, { - "a": "0x160b24dd8d41e4000000000000", - "b": "0x10dbf8a86e400a000000000000000000", - "cmp_a_b": -1 + "a": "0xa5479f8c580afa541a13074877", + "b": "0xb62c26", + "cmp_a_b": 1 }, { - "a": "0x699a1d5c", - "b": "0x106f8cf2328c47000000000000000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x1c9bee686a65", + "b": "0x3569416e", + "cmp_a_b": 1 }, { - "a": "0x24d63a5a0a1c2200000000000000", - "b": "0xf6ee7a6681bf380000000000000000000000000000000", + "a": "0x41f6c05c897035b6f", + "b": "0xf8d1d86b64206e9690953e41169585799a0982e0a31ab50c837ca446e", "cmp_a_b": -1 }, { - "a": "0x18b", - "b": "0x366d0c8b34b2200000000000", + "a": "0xaa45a6eb0d6ea8d5", + "b": "0x112d1d01da85f3550034047988cbbfdf6d7a956894e48571b5c084a07146c", "cmp_a_b": -1 }, { - "a": "0xa8156273c2c10800", - "b": "0x2bc922", + "a": "0x1dbde52", + "b": "0x3c4", "cmp_a_b": 1 }, { - "a": "0xed4", - "b": "0xf", - "cmp_a_b": 1 - }, - { - "a": "0xcd5819b6de9aa8000000000000000000", - "b": "0xcd5819b6de9aa8000000000000000000", - "cmp_a_b": 0 - }, - { - "a": "0x19", - "b": "0x315d291c842ba40000000000000", + "a": "0x1c", + "b": "0x15982c12b26828ea9cd5d106fc5f1b744ed493949c3a6", "cmp_a_b": -1 }, { - "a": "0x485e0498a", - "b": "0x4d015f42caaed4000000000000000000000000000000000000000000", + "a": "0x4c5cef5f254f5ae518b9", + "b": "0x2c31874dcfd50a66e7302a4e", "cmp_a_b": -1 }, { - "a": "0x1efa52f949a5ff00000000", - "b": "0x8c3e0f7b17ef900000000000000000000000000000000000", + "a": "0x1b33feb946e003f8cb7328", + "b": "0x376b650a55a0253f81ad490cb5c1", "cmp_a_b": -1 }, { - "a": "0x5e4e9", - "b": "0x243", + "a": "0x3d6951770eb21d7da", + "b": "0x43487e4991ac83", "cmp_a_b": 1 }, { - "a": "0x1c220110c7dce000000", - "b": "0x4a2238de097e9800000000000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x1b61a2757aa165e", + "b": "0x1b44c3695f639dc", + "cmp_a_b": 1 }, { - "a": "0x11c9aea352", - "b": "0xd7522fe215f630000000000000", - "cmp_a_b": -1 + "a": "0x3a97c372ad6d7da5", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x2b2fa19e5bbb640000000000000000", - "b": "0x87459633f7f", + "a": "0x65971a5c03ab7eb1587e0773b0651", + "b": "0x10d97a96cdccbf1dc1676c93c", "cmp_a_b": 1 }, { - "a": "0x6333f3e1183e4800000000000000000", - "b": "0x510d78590ba0300000000000", + "a": "0x685c320b31b44880ea282", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x1477f18acbb827000000", - "b": "0x1477f18acbb827000000", - "cmp_a_b": 0 + "a": "0xcb1753898eacbad", + "b": "0xf7ed85a46efd1d211e96", + "cmp_a_b": -1 }, { - "a": "0xef7f9ef295f69800000000000", - "b": "0x2a0df4df4548da00000000000000000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0xbfe9720ff4d105", + "b": "0x2b71b11b954bc3", + "cmp_a_b": 1 }, { - "a": "0x17ef134211", - "b": "0x863307506191000000000000000000000", + "a": "0x7368adb021e46ba1c9b", + "b": "0xb204798a4f3fccc585ed814119b74", "cmp_a_b": -1 }, { - "a": "0x571d92", - "b": "0x2dae6a84ae7e540000000000000000000000000000000", + "a": "0x1053233b968", + "b": "0x1560b2d6842bdb46f3551abd773cb22e583953ab7f81e3c49eb4678ed1bd", "cmp_a_b": -1 }, { - "a": "0x1fb8e13af40bc80000000", - "b": "0x9d6866422619400000000000000000000000000000000000000000000000", + "a": "0xb44c15db13c3d3b", + "b": "0xbc15e4998c7ce940a2b77f74355359091e4fa8ad14f09d17c7b1", "cmp_a_b": -1 }, { - "a": "0x50b389d3a806fc0", - "b": "0x6df5ef", - "cmp_a_b": 1 + "a": "0x2055beefa4af8fadcc1ee2a8", + "b": "0x44e573a94a0cf8603f9aaddcc3e1670a950", + "cmp_a_b": -1 }, { - "a": "0x10b2392572d23b000", - "b": "0x1c3a851541f", + "a": "0x22742156c8e0c869b71", + "b": "0x267ab5f273f8b09", "cmp_a_b": 1 }, { - "a": "0x8cfbf87317fb4800000000000", - "b": "0x8a81abafd926a000000000000000000000000000000000000", + "a": "0x1b860f2e3f0c7bcb8393", + "b": "0x529dbf076e7a48216f04a3", "cmp_a_b": -1 }, { - "a": "0x681aa9e31d617000000000", - "b": "0x17a4ff70f603040000000000000000000000000000", + "a": "0xcd75f7d2b356", + "b": "0xcd75f7d2b356", + "cmp_a_b": 0 + }, + { + "a": "0x23352cfdf8135092b9751a81e1", + "b": "0x559c85350b81cb91c8", + "cmp_a_b": 1 + }, + { + "a": "0x63b56391e7", + "b": "0xe39ede50b92aaea49", "cmp_a_b": -1 }, { - "a": "0x753b5b463ccda40000000", - "b": "0x753b5b463ccda40000000", - "cmp_a_b": 0 + "a": "0x0", + "b": "0x77717ac031d3c93f531c004f1a560770bd3d569021a4b707d6026e39700d", + "cmp_a_b": -1 }, { - "a": "0x3a2067b7dcdea4000000000000000000", - "b": "0x0", + "a": "0x3dca0c977eb3c82bed0b946157911", + "b": "0x82478f67db8275", "cmp_a_b": 1 }, { - "a": "0x136346805492c8", - "b": "0x197a08b31946ff0000000000000000000000000000000000000000000000", + "a": "0x12a60c1f461c22a3882b57b2e0", + "b": "0x16643b55b739028633c9e6edaae54775184ea2c", "cmp_a_b": -1 }, { - "a": "0xf0ab9c1907347000000000000000000", - "b": "0x7a15cdb1cff0c8000000000000000000000000000000", + "a": "0xa5f854c5e635f474984e6058c29b", + "b": "0x31381a35a21409a88629ec2b657323bb41da251a38f3b09", "cmp_a_b": -1 }, { - "a": "0x13a95bef2d98240000000000000000", - "b": "0x123df500768d3c00000000000000000000000000000000000000000000", + "a": "0x59", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x3ef043", + "b": "0x832c294", "cmp_a_b": -1 }, { - "a": "0xa146afdc12f85800000000000000", - "b": "0xe83b3538a273c", - "cmp_a_b": 1 + "a": "0xf1df94558dcd82524b252af", + "b": "0xdd80f3ab501fc44eeac6f3463a7cc89ca0", + "cmp_a_b": -1 }, { - "a": "0x338ea10c1a0cc8000000000000000", - "b": "0x227cb892a4682e00000000000000000000000000000000000000000000000000", + "a": "0x1a3a2352", + "b": "0xdd5df4a81ef837194e69d62f0ab4ed62", "cmp_a_b": -1 }, { - "a": "0x0", + "a": "0x28a2d24b88c112cf", "b": "0x0", - "cmp_a_b": 0 + "cmp_a_b": 1 }, { - "a": "0x73b7f82aaa43d", - "b": "0xb791eb8701f7f80000000000", + "a": "0x0", + "b": "0x2255c8deeb99e61382656105af71b5", "cmp_a_b": -1 }, { - "a": "0x90def5834d95b000000000000000000", - "b": "0x44b584295b1364000000000000000000", + "a": "0x5b635872f4073cd40531927b", + "b": "0xa3221c3ffbf855b8d348acd65dd7833dd61a7c7f41bf301622", "cmp_a_b": -1 }, { - "a": "0xe066f4ee9ba2", - "b": "0x14e282987d42f700000000000000000000", - "cmp_a_b": -1 + "a": "0x1", + "b": "0x1", + "cmp_a_b": 0 }, { - "a": "0x1727", - "b": "0xe6ccf44f3cb740000000", + "a": "0x0", + "b": "0x1cbe04588906fe5b0d727f6873c7fb828c7a3", "cmp_a_b": -1 }, { - "a": "0x1f3123bce307e9000", - "b": "0x5ae5a481a8c73c000000000000000000000000000000000000000000000000", + "a": "0x147a4", + "b": "0x224723401a6312947d5c6ff64", "cmp_a_b": -1 }, { - "a": "0xf3107cb973c748000000000000", - "b": "0x6620f", - "cmp_a_b": 1 + "a": "0x98804ba13b23cb7b47d4e73", + "b": "0x98804ba13b23cb7b47d4e73", + "cmp_a_b": 0 }, { - "a": "0x68a6c73469b9d0000000000000000000", - "b": "0x78d89e54d81aac00000000000000000000000000000000000000000", + "a": "0x27bad30", + "b": "0x34b69bfd48f136cb", "cmp_a_b": -1 }, { - "a": "0x4b9dd8", - "b": "0x4984f17d4f34f800", + "a": "0x52ea5aedd7945f9", + "b": "0x7448a1e0d099e2d197cac3f6ac18104c18d880e9199dfc10e16574ea1d254", "cmp_a_b": -1 }, { - "a": "0xe9c887808d683", - "b": "0xb934a75350e430000000000000000000000000000000000", + "a": "0x95", + "b": "0x4b39", "cmp_a_b": -1 }, { - "a": "0x2e5ddeb17198300000000000", - "b": "0xaf255d10d0", - "cmp_a_b": 1 + "a": "0xc685f622dd", + "b": "0x35527840c22048b422b538de96e7bbb3f659464cf9", + "cmp_a_b": -1 }, { - "a": "0x25690dfc90a69", - "b": "0x1216660e3c818d0000000", + "a": "0x464919a99496c649fd11d2", + "b": "0x333cc2d9aedf8663dea676d0607a862845741f5dd", "cmp_a_b": -1 }, { - "a": "0x39e57b74cf43f", - "b": "0x323f9f1e3b76d20000000000000000000000000000000000000000000000000", + "a": "0xd00c837f93bb5e7e1255db", + "b": "0x7dc036fb78923961d815b30c6f", "cmp_a_b": -1 }, { - "a": "0x105bda142e9023000000", - "b": "0x105bda142e9023000000", + "a": "0x24f5c5ba0381160efd", + "b": "0x24f5c5ba0381160efd", "cmp_a_b": 0 }, { - "a": "0x291b80ce4e20080", - "b": "0x6", + "a": "0xe580abab29fcd57bce47fa6", + "b": "0x1d745b048", "cmp_a_b": 1 }, { - "a": "0x5b105919f214600000000000000000", - "b": "0x2be750456", - "cmp_a_b": 1 + "a": "0x15", + "b": "0x250aafd7fd99ff55f", + "cmp_a_b": -1 }, { - "a": "0x1e9c452734290500000000", - "b": "0x7fdd78bdd1cd100000000000000000000000000000000", + "a": "0x1e61cd63d662dbea4bab9878e82a", + "b": "0x347f6bcc733d7e4dec9bc319f039", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x289658356989d20000000000000000000000", + "a": "0x3c55d2", + "b": "0x126dd20dec7b44208d7a51227676ce0", "cmp_a_b": -1 }, { - "a": "0x209a0ecdec08120000000000000", - "b": "0x51876b3f8eb3900000000000000000000000000000000", + "a": "0x183ab274", + "b": "0x91dde99fb66a7357ff4fbbf0e16c104f1a4b8bb0630c4d8d", "cmp_a_b": -1 }, { - "a": "0xa6ec7289176418000000000", - "b": "0x211da92b4b2df600000000000000000000000000", + "a": "0xaedd0d72cdb8fbb88d8", + "b": "0xaee17c482269a39492c328b1a4c9a95", "cmp_a_b": -1 }, { - "a": "0x17e048f", - "b": "0x7f1985a", + "a": "0x91dee765", + "b": "0x19665641e15b1809a3b7846ebb9c5593281", "cmp_a_b": -1 }, { - "a": "0x538cc434ab1a600000", - "b": "0x17023e74c53bd500000000000000000000000000000000000", + "a": "0x6ff", + "b": "0x24dd77dc5c683e9f2647a996db270d8459aaeaae4d9f00d4cf11ca2", "cmp_a_b": -1 }, { - "a": "0x494bb", - "b": "0xa6efbf861f513800000000000000000000000000", + "a": "0x54c61a8cc82f46b82ea13f44418c", + "b": "0x2e4285875449ecc2c07162371ff45e7d87", "cmp_a_b": -1 }, { - "a": "0x140aed4bff37560", - "b": "0x593f61f7670e440000000000000000000000000", + "a": "0x510c5b7d9d0d6ed38", + "b": "0x5180879045bd4fbca24fb9da00846ef589552c672b9d8d114d9a2c4", "cmp_a_b": -1 }, { - "a": "0x438b01c6763d0c00000000", - "b": "0x22efa008f2a0fa0000000", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x4fb6eccc1e3181307eea78b6bbed47714fd963a406855cf36b9a1", + "cmp_a_b": -1 }, { - "a": "0x287217548867de0", - "b": "0x95e79de391cf40000000000000000000000000000000000000000000000000", + "a": "0x697abcf34efa485f6250e405a", + "b": "0xbbf95e87cdd7e134101947cbf9bb", "cmp_a_b": -1 }, { - "a": "0x2258121d9a36540", - "b": "0xd5eb359c79010000000000000000000000000000", + "a": "0x2d61ddfe9007e", + "b": "0x1b752e2816c738984cf4b97692af13a5da287ccb23c87a6ab415240ea4ba9", "cmp_a_b": -1 }, { - "a": "0xcd81fba849366800000000000000000", - "b": "0x1634e8cebc3941", - "cmp_a_b": 1 + "a": "0x160", + "b": "0x160", + "cmp_a_b": 0 }, { - "a": "0x79cee62f79425400000000", - "b": "0x2e88037ce396200000000000000000", + "a": "0xceab58642b36577bc7ec4985e", + "b": "0xb40683db364af48534717abe793595cfb111", "cmp_a_b": -1 }, { - "a": "0x4ef49997bb1fb800000000000", - "b": "0x52365e1d08bb800000000000000000000000000000000000000000000000000", + "a": "0xd27c80940a183962d8e60b6d0", + "b": "0x793c60772608fcb43124ee457b6475521688a4044113226714a60cf204b3", "cmp_a_b": -1 }, { - "a": "0x1130847", - "b": "0x146b50e", - "cmp_a_b": -1 + "a": "0x2e2", + "b": "0x2e2", + "cmp_a_b": 0 }, { - "a": "0x14ad50780", - "b": "0x688fa409c60d5000000000000000000000000000000000", + "a": "0x6cef9f64b9", + "b": "0x3e6ae741b799b0a516a6c965632d3a26efc828bbe3c89dc44d5aa4eca", "cmp_a_b": -1 }, { - "a": "0x1e1d1ccddd71e300", - "b": "0x12c175af157b5f000000000000000000000000000", + "a": "0x175aa26630cb00aa1d069d63694307f", + "b": "0x4521615027cd50cd8133bc9ee84aecc9dc69c0f1f50a82f9b6b3af0b0", "cmp_a_b": -1 }, { - "a": "0x72ec80df2", - "b": "0x6641e09e2aa3ac0000000000000000000000000000000000000000000000", + "a": "0x2f43798dad1b", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x7b21b48c", + "b": "0x2f5c117489900d6335ac5f56ef045c5d9508454d33", "cmp_a_b": -1 }, { - "a": "0x1e015c48d6e4b7000000000000000000", - "b": "0x1e015c48d6e4b7000000000000000000", - "cmp_a_b": 0 + "a": "0x7f43315c76761bbb1", + "b": "0x4d722cdcc", + "cmp_a_b": 1 }, { - "a": "0x10fe036610cfb0000000000000000", - "b": "0xa78a3bc1c91e9000000000000000000000000000000", + "a": "0x0", + "b": "0x157b7f94", "cmp_a_b": -1 }, { - "a": "0x3012d6bcbec3200000000000000", - "b": "0x141f15ccb6a08f0000000000000000000000000000000000000000000000", + "a": "0x3ea8bcd02459", + "b": "0x23a5a850dcf79c3627df26d326896d6e386662f99bd", "cmp_a_b": -1 }, { - "a": "0xed9694d8e", - "b": "0x92e31cf61d47380000000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x2d81f38a305f5d80f7fec2af1a75", + "b": "0x479", + "cmp_a_b": 1 }, { - "a": "0x1dd75ba4f33d0", - "b": "0x5bb163e130924000000000000000000000000", + "a": "0x61388d7f4edf704", + "b": "0xc7ed614b717463ee8154d92e0f26aaee19d3c5f5bb3ac357d92f19ba", "cmp_a_b": -1 }, { - "a": "0x188029", - "b": "0x129174efe88efd0000000000000", + "a": "0x1f7", + "b": "0x156a461a8897b96b2eb1bb52726c328f4237289fa08bfd0", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x2e331544bf05d2000000000000000000000000000000000000000", + "a": "0xd2f946", + "b": "0x2f87f29e8ec3f5aee781c48a702ed777fb16bdcab", "cmp_a_b": -1 }, { - "a": "0xf1395d130003200000000", - "b": "0x1c173706c244660000000000000000000000000000000000000000000000", + "a": "0x2240369bc98a", + "b": "0xe62d72b10b1e8ba8f", "cmp_a_b": -1 }, { - "a": "0x1a0c89c09e74", - "b": "0x290f51241773a2000000000000000000000000", - "cmp_a_b": -1 + "a": "0x4365df866f18f9127c95337803b32bcd", + "b": "0xa04732bcabb5f", + "cmp_a_b": 1 }, { - "a": "0x36a6abcec76b5e0000000000000", - "b": "0xc210e7415c4ea000000000000000000000000000000", + "a": "0x683b910df0b9e4ac8f06e357", + "b": "0xf4856b99e11fbcdee32d78127597c6a2c1222381b350c78650a45d26f44c74ea", "cmp_a_b": -1 }, { - "a": "0xb79fe", - "b": "0x322ca21a93ca2800000000", + "a": "0x5c", + "b": "0x54a6101e2c45ad55a019674368418a8d7e57609ad72bad", "cmp_a_b": -1 }, { - "a": "0x85afaaae69df58000000", - "b": "0xf25f462155", + "a": "0xee59fe26c3be51c94c3f3ef8d", + "b": "0x3765e4c59e261b2a8233", "cmp_a_b": 1 }, { - "a": "0xad", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x12", + "b": "0x7759c4125a0c2c4f06bc4f925a57f2dcbf76dcf01528706b0a22178f6d", + "cmp_a_b": -1 }, { - "a": "0xee", - "b": "0x36de7c0a8f67e80000000000000000000000000", + "a": "0xa36c9e52488", + "b": "0xe6b6b4ab19ae63101e0f170489712101ca3bf", "cmp_a_b": -1 }, { - "a": "0x3ad5ef4a25", - "b": "0x37e230e41b46100000000000000000000", - "cmp_a_b": -1 + "a": "0xfaee380a389e3162d4a89c7af8", + "b": "0xfaee380a389e3162d4a89c7af8", + "cmp_a_b": 0 }, { - "a": "0x16665bd7725b", - "b": "0x28", + "a": "0xc3efa6ce", + "b": "0xdccf78", "cmp_a_b": 1 }, { - "a": "0x5a48081dab6b6400000000000000", - "b": "0x12e3c52d9db0d50000000000000000000", + "a": "0x1fa2f3074bcbb", + "b": "0x3f098eea9cecd300f2e651086d1fcf36d", "cmp_a_b": -1 }, { - "a": "0x286457bc7f132e0", - "b": "0x4823025a4f8ca400000", + "a": "0xb9b55b1ddfb08a98e038a4d", + "b": "0x8778be99ab", + "cmp_a_b": 1 + }, + { + "a": "0x15c88b4ab0ff671c8d327", + "b": "0xe836a0b7bf492b0cb0d6fd412c98b28964f2ac651b9a396c1c7ced47f005ba", "cmp_a_b": -1 }, { - "a": "0xa61508a6352", - "b": "0xa61508a6352", + "a": "0x3caf04efaefbea0039d53", + "b": "0x17aeac5ca95fb871f2", + "cmp_a_b": 1 + }, + { + "a": "0x16", + "b": "0x16", "cmp_a_b": 0 }, { - "a": "0x8a3bdd17d6b", - "b": "0x210d1cafba780800000000000000000000000", - "cmp_a_b": -1 + "a": "0x4026bd55f3046226a215656", + "b": "0xc", + "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x38a4d3eb0d5af8", + "a": "0x2ecd483c84fc33d2a3", + "b": "0x3c61812dbb1d62e90c3", "cmp_a_b": -1 }, { - "a": "0x2b62d93d3", - "b": "0x4aed8d4d9d9a940000000000000000", - "cmp_a_b": -1 + "a": "0x1773", + "b": "0xf", + "cmp_a_b": 1 }, { - "a": "0x14be05ae5bb", + "a": "0xe909ec3b300289d97da22d", "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x13f6bd970e43dd00", - "b": "0x1161a317f1d69500000000", + "a": "0x5304be0d457097ad21c68", + "b": "0x83749c23bbd41f323101f233c", "cmp_a_b": -1 }, { - "a": "0x1d64dff0894953000000000000000000", - "b": "0x96df0ff86f0cf8000000000000000000000000000000000000000", + "a": "0x18625", + "b": "0xf3cb529581a651853a468a8", "cmp_a_b": -1 }, { - "a": "0x11ad69271caed", - "b": "0xee58252a79efa0000000000000000000000000000000000000", + "a": "0x78f22b6ffa13b6f", + "b": "0x62f964915ed5d40a91054d59f089aa", "cmp_a_b": -1 }, { - "a": "0xd385b12d3eb688000000000000000000", - "b": "0x1f4625aef6d3310000000000000000000", + "a": "0x152", + "b": "0x33dc20f68", "cmp_a_b": -1 }, { - "a": "0xb82223ed382ac8000000000000000", - "b": "0x1454862a0b794500000000", - "cmp_a_b": 1 + "a": "0x50ee5cd7c137474d33af16aea", + "b": "0x50ee5cd7c137474d33af16aea", + "cmp_a_b": 0 }, { - "a": "0xa45ff1a8cdfa", - "b": "0xbb5893dd5a84b800000000000000", + "a": "0x15", + "b": "0x7c1144e149471754526e870c74e660a083d49f7b1528cd6f", "cmp_a_b": -1 }, { - "a": "0x31f24cd9825dfe00000000", - "b": "0x2a3d8f0a44913e0000000000000000000000000000", + "a": "0x54302d5026e6dc60e", + "b": "0x382cd9002e9a78de6844556b493cc1b5829344df47fa9474e30195ad0b7811", "cmp_a_b": -1 }, { - "a": "0x226895af57027c000000000000000000", - "b": "0x5de3813f65d7500000000000", - "cmp_a_b": 1 + "a": "0x1058f48e55d6e650", + "b": "0x305107ce62baa2a6b331", + "cmp_a_b": -1 }, { - "a": "0xdb9ce6ce4b365800000000000000000", - "b": "0x5fc1f1a533fe", - "cmp_a_b": 1 + "a": "0x3f", + "b": "0x2d5c0f212713d402f92f099500c0d990be3a8687b1c47cea951f7f6120d1805", + "cmp_a_b": -1 }, { - "a": "0x218ebf44bce3f600000", - "b": "0x1610ff66e9f1f600000000000000000000000000000000000000000", + "a": "0x1", + "b": "0x6dd5021dd1b3ea69607a0f8290bdf865f0687a41897798", "cmp_a_b": -1 }, { - "a": "0x21ac0094f95af80000", - "b": "0x126d49d1a0", - "cmp_a_b": 1 + "a": "0x4", + "b": "0x81f4d1fb9", + "cmp_a_b": -1 }, { - "a": "0xd0d3281a955378000000000", - "b": "0x1a76b5fd56b9c700000000000000000000000", - "cmp_a_b": -1 + "a": "0x78f2", + "b": "0x59", + "cmp_a_b": 1 }, { - "a": "0x9e9c", - "b": "0x283abfee4d191200000000000000000", - "cmp_a_b": -1 + "a": "0xb78", + "b": "0x6a", + "cmp_a_b": 1 }, { - "a": "0xda953c11fa1ee000000000", - "b": "0xda953c11fa1ee000000000", + "a": "0x365412458d9f276a965682f403", + "b": "0x365412458d9f276a965682f403", "cmp_a_b": 0 }, { - "a": "0x43302870d11320000000000000000000", - "b": "0x6ea216893668580000000000000000000", + "a": "0x45995358a8da", + "b": "0x7203e11c6020d71c08029be162bb4b6eb1620a74369bc930af65f82eff53", "cmp_a_b": -1 }, { - "a": "0x20e34f", - "b": "0x27103b4cc0", + "a": "0x170b282704187c", + "b": "0x41ff26b628452f7e5c732d1110475101b", "cmp_a_b": -1 }, { - "a": "0x52bebabb5a4b380", - "b": "0xd1cdbf755f8290000000000000000000000000000000000", + "a": "0x14ffc4391a77348cfb008", + "b": "0x31bc68d3d80231b8012f29", "cmp_a_b": -1 }, { - "a": "0x14", - "b": "0x14", - "cmp_a_b": 0 - }, - { - "a": "0x0", - "b": "0x5d982c9ce338b00000000000000000000000000000000000000000000", + "a": "0x57628f2c87a7b9", + "b": "0xacb4fb7459283ad409a6efb2af597ede85238392919000a", "cmp_a_b": -1 }, { - "a": "0x4f21656c1939d8000", - "b": "0x13501669512fd100000", + "a": "0xe1", + "b": "0x3cbf8d9892601f3af9e9434", "cmp_a_b": -1 }, { - "a": "0x13e9", - "b": "0x19261a24beb68c000000000000000000000000", + "a": "0x3b5ca070e6988b277bfd834", + "b": "0x40bf15d041556bcd8468d69f28c1d8205170a3e67a2", "cmp_a_b": -1 }, { - "a": "0x4ace1a734b6b6c0000000000000", - "b": "0x56b2c5c375bd280000000000000000000000000000000000", + "a": "0x552718a1", + "b": "0xdf56ef53f", "cmp_a_b": -1 }, { - "a": "0x45631cf9826ffc000000000000000", - "b": "0x0", + "a": "0x5f9ec987a46", + "b": "0x13eff", "cmp_a_b": 1 }, { - "a": "0x124", - "b": "0x29809d4edfc11000000000000000000000000000000000000000000", - "cmp_a_b": -1 - }, - { - "a": "0x3ce4b9", - "b": "0x13b3abe15aab54000000000000000000000000000000000000000000000000", + "a": "0xbd2d9074f6660e32e6fbff76f9fe53d", + "b": "0xa820ca39625c7a2f2ae4cefba9fa2b22563f3b8a77780cb35802ebda2da3aeb3", "cmp_a_b": -1 }, { - "a": "0x6f7590a7f9e5b40000", - "b": "0x10dbe72ef41292000000000000000000000000000000000000000", + "a": "0xf68", + "b": "0x1cea2f07ca84426b167a2", "cmp_a_b": -1 }, { - "a": "0x10a9567f062dfb0000000000000000", - "b": "0x10a9567f062dfb0000000000000000", - "cmp_a_b": 0 - }, - { - "a": "0x34eda6aa7f2f7800000000000", - "b": "0x2e76bce18421c600000000000", + "a": "0x1d", + "b": "0x2", "cmp_a_b": 1 }, { - "a": "0x68ed62567", - "b": "0x16e93b4526346b000000000000", + "a": "0x0", + "b": "0x733bf584868badbab61d372658f608ec14f6fa97afc2cda7b43", "cmp_a_b": -1 }, { - "a": "0x1fb743b46651ea00000000", - "b": "0x591212553bc5d00000000000000000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x7e1f9b6a8b3", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x4", - "b": "0x71b687ab87", + "a": "0x1282d9d8a4f079f94", + "b": "0x46e3d1f4780766b6793", "cmp_a_b": -1 }, { - "a": "0x14fb93d2f2dab90000", - "b": "0xa9975f1", + "a": "0x39e14bb9a02ef0d19f3ecfc", + "b": "0x1f6f54a87a9164", "cmp_a_b": 1 }, { - "a": "0x73a97881356604000000000", - "b": "0x3f545c5919b7140000000000000", + "a": "0x11f113f0623872aaf8b15", + "b": "0x3905d885583031c386f710f9a41d4261d9e3c44a37139d3", "cmp_a_b": -1 }, { - "a": "0x102db6295f636f000000", - "b": "0x165fc03b235a550000000000000000000000000", + "a": "0x8e5a2d", + "b": "0x1449cea4dcf23befb15210a3d56a65c17346e301950fc0", "cmp_a_b": -1 }, { - "a": "0x10b3c8a6dc653700", - "b": "0xbcfcd40d4f3160000000000000000", + "a": "0xaa7e287019db3274b9bc0152b912fc6", + "b": "0xc93599e68d9cec4ea86f714cec22f33d8e6503e41a409652b", "cmp_a_b": -1 }, { - "a": "0x165e4f6125", - "b": "0x1017e3e1cb38e70000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x15a0b639231964ea378bf01cd", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x421923", - "b": "0x6ed2c76fa50ac8000000000000000000000", + "a": "0x7f4ac039fabed", + "b": "0xeed625bd85d388c6d27910", "cmp_a_b": -1 }, { - "a": "0x28cdc2a11043c80000000000000", - "b": "0x48d1bf394635640000000000000000000000", + "a": "0x2d6304", + "b": "0x1b508ae4cbc3799f79d1c6245430998613fad315574fac4495915c12603d", "cmp_a_b": -1 }, { - "a": "0x11e1eecff8716d", - "b": "0x6505ffe57aeacc00000000000000000000000000000000000000000000000", + "a": "0x674eb5cf28d78886118", + "b": "0x3a1ac0d956c8e785b7da186cf95685999489c6779b1687fe5c8bac90", "cmp_a_b": -1 }, { - "a": "0x614ba9e", - "b": "0x85c36ef32fdb300000000000000000000000000000000000000000000000", + "a": "0x80857f304a81f143a", + "b": "0x15f1b406c35bccaea72b1f003ec1f6e3af6e1d8da1572ea10e3cac4ebe", "cmp_a_b": -1 }, { - "a": "0x17acdb6eb6a4e600000", - "b": "0x17acdb6eb6a4e600000", + "a": "0x719cc183c3dd60b02e1", + "b": "0x719cc183c3dd60b02e1", "cmp_a_b": 0 }, { - "a": "0xa40f102a675318000000000000000000", - "b": "0x15a63060afca530000000000000000000000000", + "a": "0x11c6540de0223e172b9dbd", + "b": "0xa2511bb6c5d354be2a1d577f0a830b6c4f", "cmp_a_b": -1 }, { - "a": "0x22e20ba09ce0a0000000000000", - "b": "0x8f07f50f3787b000000", - "cmp_a_b": 1 - }, - { - "a": "0x512ada0ed61740000000000", - "b": "0x2bebca6f78f91a000000000000000000", + "a": "0x21", + "b": "0xd1f357e3b35324ec28ce013eabe5ca19410b4f9c2dec72", "cmp_a_b": -1 }, { - "a": "0x1aec5e51cb06f000000", - "b": "0x67c72a6ddf69fc00", + "a": "0x20276b9fdcc171dfe98629ecb6", + "b": "0x159da6450", "cmp_a_b": 1 }, { - "a": "0x307e54a3ffa21200", - "b": "0x142694c039269e00000000000000000000000000", + "a": "0x2fedbaca815c", + "b": "0x17e2d5dead59289a5a8f91887ec393c051cf1967b1cc3ef07aa", "cmp_a_b": -1 }, { - "a": "0x2f61f", - "b": "0x67aed986c5bc74000000000000000000", + "a": "0x34110abc3ad61d0fbe49b25193", + "b": "0xcfe945c480e9c25212750d605dd62b48de09e5e3", "cmp_a_b": -1 }, { - "a": "0x35505e0b553b780000000", - "b": "0x2a9d4aec94", + "a": "0x16dd5ee2588", + "b": "0xf4", "cmp_a_b": 1 }, { - "a": "0x32fdaf19bbf6e80000000000000000", - "b": "0x32fdaf19bbf6e80000000000000000", + "a": "0x1bf77e03", + "b": "0x1bf77e03", "cmp_a_b": 0 }, { - "a": "0x419a0", - "b": "0xae763990817aa80", + "a": "0x6", + "b": "0x10a451055a3fffa1", "cmp_a_b": -1 }, { - "a": "0x1b996b3ca6deed0", - "b": "0x20ecc5f5d8ccc200", + "a": "0xb", + "b": "0x1c38a0ffa83ca4f8f38572bf98ff73a241e88dd7068ca4c30d43", "cmp_a_b": -1 }, { - "a": "0x8830fb63ba", - "b": "0x5c64d890c69ddc000000000000000000000000000000000000", + "a": "0x1e2fb97fb073c", + "b": "0x1bda87ad905f49beba478be8d0c7c223e845adf", "cmp_a_b": -1 }, { - "a": "0xdad98b1144a", - "b": "0xf5", - "cmp_a_b": 1 + "a": "0x30eb4d700765a7e534ca14cce7", + "b": "0x72e0d9f67561f3c9a48c8da3c0373ad67dcf6bc89d21c3348941c94be01be95", + "cmp_a_b": -1 }, { - "a": "0x11a145cf68d40e00000000000", - "b": "0x21e35d6c9c133c0000000000000000000000000000000000000000000000", + "a": "0x179", + "b": "0x3aa0fdbc0f19dc64e8a891a465d2c3e306d49f", "cmp_a_b": -1 }, { - "a": "0x35f7", - "b": "0x2df8186c", + "a": "0xe7aada0a910245284afe5d5", + "b": "0x1deaa4b4630c1bf8688de739f251f202312692f", "cmp_a_b": -1 }, { - "a": "0x140db75abc46d20000000", - "b": "0x2a75ae5f7b34140000000000000000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x538b55d61f6e9cb8b917e772b0e5", + "b": "0x67f28", + "cmp_a_b": 1 + }, + { + "a": "0x184254825fa0ef3665", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 }, { - "a": "0x35b1ab", - "b": "0x76a8b418e5f8bc0000000000000", + "a": "0x3d40fad271576", + "b": "0x1c29f22f804fe3", "cmp_a_b": -1 }, { - "a": "0x1c324e169b3671000000", - "b": "0xaa9ad2390b1", + "a": "0xdd9d5e1e6d43317922317bb0804dc", + "b": "0x58d8b03904fff90f02b0c3d4bf", "cmp_a_b": 1 }, { - "a": "0x3ce55a8acddf7e", - "b": "0x8defe390689110000000000000", + "a": "0x39f806d21934aa53c139a6e6", + "b": "0x1126c7f5809765334f1526e8e673236682635ffda46b2a2ff315fab", "cmp_a_b": -1 }, { - "a": "0x493a5b1d7bef40000000000000", - "b": "0x493a5b1d7bef40000000000000", - "cmp_a_b": 0 + "a": "0x2308b526762a86a9028af5e6c", + "b": "0x25a23a90233220c675f5a7ae0111777d339530e39d78b87cd684b6f7516b4be", + "cmp_a_b": -1 }, { - "a": "0xb0e8002c05373800000000000", - "b": "0xb0e8002c05373800000000000", - "cmp_a_b": 0 + "a": "0xc5b082030d2", + "b": "0xec8b5a44e2947d92917493d57dc", + "cmp_a_b": -1 }, { - "a": "0x337848ae7ea84c0000000000000000", - "b": "0x31", - "cmp_a_b": 1 + "a": "0x7abdd541215e83a430b9c", + "b": "0xabb211a7f9d7c2d379af35da72821ce9ea83e9aeef9234202eb77", + "cmp_a_b": -1 }, { - "a": "0x27cf5b58ba", - "b": "0xe29527f5a19cd80000", + "a": "0x281c12d6e9ccddb3cb54d9b147af", + "b": "0x5cd37e919a07a9361e3830c78337de90bf274fda6d986af96", "cmp_a_b": -1 }, { - "a": "0x3da4149e036dc400000000000000", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x491f6d763213becd5462e1664d94", + "b": "0x260aec32345b961239c38bb93cdb4b6a6e1e2616bb6e47d946dd20f", + "cmp_a_b": -1 }, { - "a": "0x2602991dd2134c00000000000000", - "b": "0xf5b0ac138c213800000000", - "cmp_a_b": 1 + "a": "0xe26fe15c2da86dc", + "b": "0xace658f7b57b8a2dee3b969f5228c1861f57d72df6bb4f5ea21c1ecac", + "cmp_a_b": -1 }, { - "a": "0xe5e84", - "b": "0x1cc8598cf981de000000000000000000000000000000000000000000000", + "a": "0x27f860abf43366b6e8e87500c5189f4", + "b": "0x121722b423f625861597fc79162f502f401cc500c6b0714f654f2d5d1790", "cmp_a_b": -1 }, { - "a": "0x33f1a", - "b": "0x33f1a", + "a": "0x3187f400667ea039a347b17", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x85aecc483", + "b": "0x85aecc483", "cmp_a_b": 0 }, { - "a": "0xce47b5c5", - "b": "0x24859b", - "cmp_a_b": 1 + "a": "0xff6b14e", + "b": "0x3f092d96d62841e490adce9df3a23136fe2d7a0dee026f631ad", + "cmp_a_b": -1 }, { - "a": "0x1a07c2c9847cb1000000", - "b": "0x388a8b4ba2d7b6000000000000000000000000000000000000", + "a": "0xccc4eee611f3ac", + "b": "0xacca4a85f437a6b29e689c13c2f7bb", "cmp_a_b": -1 }, { - "a": "0x9baaa4f8ed40500000000000000000", - "b": "0x9baaa4f8ed40500000000000000000", - "cmp_a_b": 0 + "a": "0x6cf763fe1953f16ab9bb3039d5f4767d", + "b": "0x12798d5118f25943e29d9df0563526b824a8c541a247847bca19fff7", + "cmp_a_b": -1 + }, + { + "a": "0x3f6e917a148f3e2d02d", + "b": "0x31b933de12ee82", + "cmp_a_b": 1 }, { - "a": "0x1c930bf48781bf00000", - "b": "0xa165", + "a": "0x19004b393dd", + "b": "0x14c", "cmp_a_b": 1 }, { "a": "0x0", - "b": "0x7270128604460000000000000000000000000", + "b": "0x16d7047719debf222b651988e65e1466e20d99ba9b63c5b", "cmp_a_b": -1 }, { - "a": "0x3065e34", - "b": "0xd5324f0e8508d000000000000000000000000000000000000000000000", + "a": "0x8ca1e244", + "b": "0x3b0fb1105445939e736724cae06de0c3465601795184dd5455a0", "cmp_a_b": -1 }, { - "a": "0x968e7d698", - "b": "0x6", + "a": "0x36b7b303de14c47464", + "b": "0x9cf786a0502", "cmp_a_b": 1 }, { - "a": "0x8f779279bdf4", - "b": "0x14a5", - "cmp_a_b": 1 + "a": "0x6a90dca6ece3", + "b": "0x10ea691a9aabe5cccf", + "cmp_a_b": -1 }, { - "a": "0x2842e582bf59d00000000000000000", - "b": "0x111ed9232", - "cmp_a_b": 1 + "a": "0x2f533f15", + "b": "0xef47c23ff0e8a23ac935908d218664e7b0c2f2f761f36c4b6b82d5399", + "cmp_a_b": -1 }, { - "a": "0xb780a1fc597398000000", - "b": "0x85c1de2d8ee248000000000000000000000000000000000000000000000", + "a": "0x5", + "b": "0x71efd9a3e04", "cmp_a_b": -1 }, { - "a": "0x4929b0ac", - "b": "0x4929b0ac", - "cmp_a_b": 0 + "a": "0x8399b4e8c688e1640cd3ed6b9f6", + "b": "0x355978dbbc8a4b0fe5935a41aec5c35a3f6fdffcfabf808", + "cmp_a_b": -1 }, { - "a": "0x311b4feae35f5e00000000000000000", - "b": "0xdebd374b47d1680000000000000000000000000000", + "a": "0x13c442a5", + "b": "0x1812d5b3dfe7d1c9499ebcdb9d142a19", "cmp_a_b": -1 }, { - "a": "0x1990c7253db701000000000000000000", - "b": "0x13c0d35bc73e06000000000000000000000", + "a": "0x602970ae1164511424384a", + "b": "0x1a5adcf6773988eb2f38998ee060c54a9d40023861f", "cmp_a_b": -1 }, { - "a": "0x0", + "a": "0x4df1b34adee54a4b2dfc31ba02b450", "b": "0x0", - "cmp_a_b": 0 - }, - { - "a": "0x3b3e4ee4bf7d", - "b": "0x69be", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x137ca8e457fe23000000000000000000000000", + "a": "0x82", + "b": "0x9cd2b2f37d1cc8953b527a97021d5c9d0dc", "cmp_a_b": -1 }, { - "a": "0x58d58df9a90d500", - "b": "0x1382a1c378f43e", + "a": "0x924dcf45662435f648716", + "b": "0x1cd8c281f17655a6741e", "cmp_a_b": 1 }, { - "a": "0x78c8a6a", - "b": "0x1807840cdeff5f000000000000000000000000000000000000", + "a": "0x13fd521f7c177caaf8195490b08191c", + "b": "0x3c3799ba40d8671043eb0d58870275e1321025fa3e1f735eecbb349b2", "cmp_a_b": -1 }, { - "a": "0x293f12ee65986c0000000000000000", - "b": "0x293f12ee65986c0000000000000000", - "cmp_a_b": 0 + "a": "0x1884d76c50a52b3a0266696b", + "b": "0xb73460e6e9ef99a086dc03377878dea3d79aa24c6020942d9", + "cmp_a_b": -1 }, { - "a": "0x7876cdb5dc78ac0000000000000000", - "b": "0x76", + "a": "0x1a2ce637fcb8447564043c6e6d5020", + "b": "0x1c71c3967e02", "cmp_a_b": 1 }, { - "a": "0x5", - "b": "0x2b79f43760532c00000000000000000000000000000000", + "a": "0x7579c91e25ffda6b", + "b": "0x3b654b0a4add7c9da73dc2", "cmp_a_b": -1 }, { - "a": "0x5c5582352ab5", - "b": "0x4330e4444f26b400000000", + "a": "0x0", + "b": "0x620", "cmp_a_b": -1 }, { - "a": "0x19222ddda496d700000", - "b": "0x32129ba8c20cec000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x343012", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x69efd5301", - "b": "0x12", + "a": "0x9cd2772aa362cebb128ae6fa25", + "b": "0x7d2f6f2af7", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x1d3c77f5ca0544", + "a": "0x418ae", + "b": "0xc8bb75b9161cc550df315acf793adf2cd8a4262", "cmp_a_b": -1 }, { - "a": "0x26019146afc35c000000", - "b": "0x3fbf4635", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x1ce", + "cmp_a_b": -1 }, { - "a": "0x30e7def7014c", - "b": "0x1e3f2619710320000", + "a": "0x2c16c3868", + "b": "0x4fb637d8da84025640a98", "cmp_a_b": -1 }, { - "a": "0x21720d94db2cf000000000000000", - "b": "0x77f19a9cb2e0a40000000000000000", + "a": "0x6ccb90", + "b": "0x1dd47928b2e423a5a90f09b202c6145", "cmp_a_b": -1 }, { - "a": "0x50f67a", - "b": "0x14a5514746a02c00000000000000", + "a": "0x3ae98e3916df77f863", + "b": "0x3413d7ad267396c1e05c0bdf7a2549d3fd51df423c585655a5", "cmp_a_b": -1 }, { - "a": "0xa28", - "b": "0x303a0cd814d61c0000000000000000000", + "a": "0xedced60eb8078f9afa", + "b": "0xe3449ae68df85e3c42b192779dce68", "cmp_a_b": -1 }, { - "a": "0xcd0", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x7979a2b37146a8080fe45e579d8488", + "b": "0x30a2e423275901c71f6ffcde2b429f90db3d6594be9d5bff62", + "cmp_a_b": -1 }, { - "a": "0x7c482322", - "b": "0x57a2897020b0a0000000000000000000000000000000", + "a": "0x3", + "b": "0x644f197fee0f95addbbbbc3c4a4a979", "cmp_a_b": -1 }, { - "a": "0x585fab278f812c000000000000000", - "b": "0x104700f14f5edb00", + "a": "0x13d0134ea4ace8", + "b": "0x3", "cmp_a_b": 1 }, { - "a": "0x83a5d187665cf000", - "b": "0x56274e446f613400000000000000000000000000000", + "a": "0x9e7cbe86de99", + "b": "0x2728ae268ae748fdafe243f04ab81e256879af3", "cmp_a_b": -1 }, { - "a": "0x3cce", - "b": "0x3cce", - "cmp_a_b": 0 + "a": "0x32499db2", + "b": "0xbcc9e0cd75ab68e7c91f351dc2e134166eff44f84422b0a76e768dbc", + "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x3287", - "cmp_a_b": -1 + "a": "0x9b", + "b": "0x3f", + "cmp_a_b": 1 }, { - "a": "0x4b", - "b": "0x8afe4cdab0186000000000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x1f3d9d70a4fab459a83", + "b": "0x1f3d9d70a4fab459a83", + "cmp_a_b": 0 }, { - "a": "0xf1c9cf81f1fe100000000000000", - "b": "0x2", + "a": "0x399b3da0b5307e0a1cb94ba42788", + "b": "0xc476b33c4c6ad6061c9678e27", "cmp_a_b": 1 }, { - "a": "0x1e217f33f", - "b": "0x44a523d94ccae80000000000000", + "a": "0xe6", + "b": "0xe52d2c7d0a601de63217a3b594b9da36d24fc9e", "cmp_a_b": -1 }, { - "a": "0x10", - "b": "0x10", + "a": "0xbf4ee343ec6", + "b": "0x11f5ea7c1ff99277822ea6d2ed201e216c3e0aaacf46611ad", + "cmp_a_b": -1 + }, + { + "a": "0x1ef535b0be0d05bb6f30451509b4c4", + "b": "0x1ef535b0be0d05bb6f30451509b4c4", "cmp_a_b": 0 }, { - "a": "0x122b2da8907a940000000", - "b": "0x12e97", + "a": "0x7f7e101bea874c082d47a", + "b": "0x42447bfbfe8a0251665", "cmp_a_b": 1 }, { - "a": "0x3418217978ebc0000000000", - "b": "0x2640fd4f5932440000000000000000000000", - "cmp_a_b": -1 + "a": "0x4e616ce9aea0e12d3d27b13aecc", + "b": "0x4e616ce9aea0e12d3d27b13aecc", + "cmp_a_b": 0 }, { - "a": "0xe6987ce10dd5a00000000", - "b": "0x9155abecb3187000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0xd099d4ee4131ec893095d7a65eae", + "b": "0xd099d4ee4131ec893095d7a65eae", + "cmp_a_b": 0 }, { - "a": "0x262b75625a8ef600000000", - "b": "0x2019fae231e158000000000000000000000000000000000", + "a": "0x4d8577af", + "b": "0x3315a7755ac912e7c3ca0cb065dff388d", "cmp_a_b": -1 }, { - "a": "0x34771aafbebd58000000", - "b": "0xe31922fd0cd50800000000000000000000000000000000000000000000", + "a": "0xaecd2", + "b": "0x75610360b771198988bb8fd3525bac94a806f3fd13c026f0b080", "cmp_a_b": -1 }, { - "a": "0x37f301bebfcddc0000000000000", - "b": "0x1a6725f6b18dbf0000000000000000000000000000000000000000000000000", + "a": "0x0", + "b": "0x197e6e9747f895d6c81bca2e24461bf6254564d19b6d39be", "cmp_a_b": -1 }, { - "a": "0x2c0fc7d9", - "b": "0xb5d00d2bb0f4d000000000000000000", + "a": "0xb48f03c777ceb9ff163", + "b": "0x3040514151fd10e0fc429ef0e76fa9f58d028f14b6116", "cmp_a_b": -1 }, { - "a": "0x4076da80599df4000000000000000000", - "b": "0x1089eb041be137000", + "a": "0x3dd85f68b7552", + "b": "0xebe356f835a2", "cmp_a_b": 1 }, { - "a": "0xa330a8ed87bbb0000", - "b": "0x1b81b9efc54e580000000000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x1c40ad3858ef4a7d", + "b": "0x26", + "cmp_a_b": 1 }, { - "a": "0x97feed3ffd3", - "b": "0x18e0521fda6ec5000000000000000000000000000000000000000000000000", + "a": "0x146784b01e16d1cea1f5b5d4b938", + "b": "0x692cb18b51a7b40d56e0b2e793a9533a87993d0dbaf7293c2966d86f82fa", "cmp_a_b": -1 }, { - "a": "0xf121ba8c94b0c00000000000000000", - "b": "0x35c4", - "cmp_a_b": 1 + "a": "0x1f07555f193b10717dc7a2d", + "b": "0x1f07555f193b10717dc7a2d", + "cmp_a_b": 0 }, { - "a": "0xf27", - "b": "0x6c76bfdc62a5580000000000000000000000000000000", + "a": "0x39d4b0f42", + "b": "0x612c9b19c6c3c2956b1bd6c4", "cmp_a_b": -1 }, { - "a": "0x9d8dc59f51db480000", - "b": "0xf9f780723d30180000000000000", + "a": "0x1bedcd10", + "b": "0x7331410df2cb8b914bac31ef6ffc7776418e3", "cmp_a_b": -1 }, { - "a": "0x1ed8ca716c9d7400000000000000000", - "b": "0x0", - "cmp_a_b": 1 - }, - { - "a": "0x3ed3ea5b902", - "b": "0x1b576b", - "cmp_a_b": 1 - }, - { - "a": "0x1f5c36", - "b": "0x22e", - "cmp_a_b": 1 + "a": "0x1e56a740e88e41", + "b": "0x661b0d97ad73224fdf511ba439961ecd329", + "cmp_a_b": -1 }, { - "a": "0x2dcfb9fba54d8c00000000000000000", - "b": "0xb70eb53876bf00000000000000000000000", + "a": "0x7375", + "b": "0x1a65a05c26976fcb84a64c425c442987757815fb14adf9a2e98", "cmp_a_b": -1 }, { "a": "0x0", - "b": "0x1b7e6205d6679f0000000000000000000000", + "b": "0x295adfde08becdf1137ba3cd", "cmp_a_b": -1 }, { - "a": "0x5abdb4d4cca25400", - "b": "0x9d5df7cd7544e00000000000000000000000000000000000", + "a": "0x2663ab99fd4367", + "b": "0x31645e7d2a7ecee7a4d825d206038e13957cb", "cmp_a_b": -1 }, { - "a": "0x1a23483d1abf2", - "b": "0x1a23483d1abf2", - "cmp_a_b": 0 - }, - { - "a": "0x4653223f", - "b": "0x235b279cce9306000", + "a": "0x3a4b410b07cb3d709fcfa1f8", + "b": "0xea2602467d2be9f803b5e255661e8d8aaeeb70fe45107", "cmp_a_b": -1 }, { - "a": "0x19a2f5b6c9", - "b": "0x7462ae12", + "a": "0x3860be41eacf21d82c231a5a53992f", + "b": "0x5fd67ab8e9b89e78e05ee16f3f0", "cmp_a_b": 1 }, { - "a": "0x1390319b8a5631000000000", - "b": "0x2006a927c4ab500000000", - "cmp_a_b": 1 + "a": "0x28dfd", + "b": "0x28dfd", + "cmp_a_b": 0 }, { - "a": "0x13c93354ad765a000000000000000000", - "b": "0x3287e928b926700000000000000000000000000000000000000000000000000", + "a": "0x2", + "b": "0x8412f1a1cc45fd8f7106b8ec82ce61730eef8043e35d5", "cmp_a_b": -1 }, { - "a": "0x1a948fd", - "b": "0x0", - "cmp_a_b": 1 - }, - { - "a": "0x12f9f3e", - "b": "0x7a239dbe2f43d800000", + "a": "0xb01dd1eb60b73c399a2d24fc51716e96", + "b": "0x1f77da67536645555c233b8556726bc7c0e52ae0b27f0f244a828e9", "cmp_a_b": -1 }, { - "a": "0xc2096cebcca2180000", - "b": "0x136dce1", + "a": "0x303d5261387a74ffbdaf", + "b": "0x705782db462cd", "cmp_a_b": 1 }, { - "a": "0x3346633764deb4000000", - "b": "0xb781578745d9300000000000000000000000000000000000000000", + "a": "0x170fbf0e1111851b023fb56b1fa2", + "b": "0x43a1296af5aacc32ef77063e2c6f918bdcae6399af35ab", "cmp_a_b": -1 }, { - "a": "0x49eadd1a", - "b": "0xed95361b48314000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0xe878bc5d55c72cf0556b9cda3326198c", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0xe422eac34245e800000", - "b": "0x54ac", + "a": "0x20df31b796ae4a6b26961fefe836ace", + "b": "0x469862fbc7af901009", "cmp_a_b": 1 }, { - "a": "0x7cc36bf28fa", - "b": "0x17c027eb32d5340000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x4e1e7cffed96e4b78c682", + "b": "0x4e1e7cffed96e4b78c682", + "cmp_a_b": 0 }, { - "a": "0x77", - "b": "0x2235599f91de46000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x19176d377ab1147dc1", + "b": "0x374b8c3d1bbae6a", + "cmp_a_b": 1 }, { - "a": "0x4", - "b": "0xb27f225413b1a000000000000000000000000000000000000000000000", + "a": "0x2a681e7d2b81f46cdb35e9c32b", + "b": "0x23a54d3fa0f37b673c6e8cb89bfcbc0bc06453", "cmp_a_b": -1 }, { - "a": "0x16fce41a655a7f000", - "b": "0x13", - "cmp_a_b": 1 - }, - { - "a": "0x27f5570802f208000000", - "b": "0x3387907a11292e0000", + "a": "0x384e623de753", + "b": "0xc60", "cmp_a_b": 1 }, { - "a": "0x0", + "a": "0x14e24915", "b": "0x0", - "cmp_a_b": 0 + "cmp_a_b": 1 }, { - "a": "0x56e764b65ab6d8000000000000000", - "b": "0x5d8e43ac3c996000000000000000000000000000000", + "a": "0x4d8", + "b": "0xbbb162988ac52316c8432b7f190", "cmp_a_b": -1 }, { - "a": "0x23f8da4c9", - "b": "0x23f8da4c9", - "cmp_a_b": 0 - }, - { - "a": "0x4121f36ae42fa000", - "b": "0x6c89f71e0021b0000000000000000000", + "a": "0x1", + "b": "0xaba08cf8ef235b776", "cmp_a_b": -1 }, { - "a": "0x12ca9668b6d4b0000", - "b": "0x2aa0ed19eddb7e00000000000000000", + "a": "0x714ce", + "b": "0x37897029e5e5545889faeb7a", "cmp_a_b": -1 }, { - "a": "0x1d93c56b1e028a0000000000000000", - "b": "0x2a7d19ff48ab82000000000", + "a": "0x12d282a6f5479ceb251282dc05", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x828f", - "b": "0x828f", + "a": "0x605ed92427f662c981ed144f0d", + "b": "0x605ed92427f662c981ed144f0d", "cmp_a_b": 0 }, { - "a": "0x16fe44e5bf09570000", - "b": "0x705d2a73cbb978000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x7828f5d147844bad12b1", + "b": "0x19517737458f2071765", + "cmp_a_b": 1 }, { - "a": "0x11907cf8b7519a0000000", - "b": "0x0", + "a": "0x19be22acf4ffcd3df800001", + "b": "0xc49", "cmp_a_b": 1 }, { - "a": "0xbc0c", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x0", + "b": "0x389bd1c3068a342a8e9e1007af5", + "cmp_a_b": -1 }, { - "a": "0x1185b48eb75abd0000", - "b": "0x18b2", + "a": "0xf23ade22cd0a41d33e465c65c", + "b": "0x3a1ade0e855b8c14e2", "cmp_a_b": 1 }, { - "a": "0xb8c9812f2501b0000000000000", - "b": "0xa4cd932b9c46180000000000000000000000000000000000000000", + "a": "0x2dc2b7a9b4a6296e14c2", + "b": "0xf0bb90ecc622cdee48dc5177874dcfd73eb4fad19b52bce46008fd7bcfc", "cmp_a_b": -1 }, { - "a": "0x1fd10f4d8721c5000000", - "b": "0x40c2da736ead380", - "cmp_a_b": 1 + "a": "0x41e09b5f1c3ca03226", + "b": "0x41e09b5f1c3ca03226", + "cmp_a_b": 0 }, { - "a": "0x3", - "b": "0x72c53625fc8bd00000000000000000000000", + "a": "0x74ffbc5c5e7849d86a", + "b": "0xaeec7e76166a4d49cccd741050e6c96", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0xa8b423d4e839e1a7187829381d7d97", "cmp_a_b": -1 }, { - "a": "0xe261c9341a64e00000000", - "b": "0x1cacef5072306f0000000000000000000000000000000000000", + "a": "0x3fb34401027ae24ba6dc36b", + "b": "0x464428ad85e46178883f4820", "cmp_a_b": -1 }, { - "a": "0x86a64cf3efc7b80000", - "b": "0x4baf42a29976f4000000000000000000000000000000000000000", + "a": "0x242ad967", + "b": "0x3c8329ae9a9a6cfb8dc00ec954164906c4f5d802e53", "cmp_a_b": -1 }, { - "a": "0x888d11e28a1a2", - "b": "0x20e49c42feda8400000000000000000000000000000000", + "a": "0x1bbfb51388", + "b": "0x1e2b86862f61915b686865bbe7ab0db4498015d9b3dc4d9d31f01aa5e4e1c9", "cmp_a_b": -1 }, { - "a": "0x198e9a019117a0000000000000000", - "b": "0x358ee2347e5b1e0", + "a": "0x235e0903045098f9b6db033b1121b5", + "b": "0x13907e435e0806ab0", "cmp_a_b": 1 }, { - "a": "0x60e55bccb9a1b40000000000000", - "b": "0x161580ee5cc9510000000000000000000000", + "a": "0x0", + "b": "0xf7bf77b19fbdbf02cbc2851b0b092f98ac3b5db112fd6", "cmp_a_b": -1 }, { - "a": "0x3b50d64f2f5434000", - "b": "0x36f424caf12504000000000000000000", + "a": "0x219ec2302d9791f", + "b": "0x147d395766e9d99f42affc22ea9421ca7cfdd663be33125f504c275865c261", "cmp_a_b": -1 }, { - "a": "0xa38b540257ef0800000000", - "b": "0x19edac3d54ea350000000000000000000000000000000", + "a": "0xc0ab30f78730e2579aaf", + "b": "0x7053ef83f07561c3be9ad031e7c4728a737e18", "cmp_a_b": -1 }, { - "a": "0x42f1dbc2751fd400000000000000000", - "b": "0x41266b0d2b43f8000000000000000000000000000000000000000000000", + "a": "0x504546b262070", + "b": "0x240d508ecc184cc70d9f8ea0799d9a4c61e2892c96f15739a22f78fdbc90e", "cmp_a_b": -1 }, { - "a": "0xac48219db94ed80000000000000000", - "b": "0x3618dbd931f020000000", - "cmp_a_b": 1 + "a": "0x24ae0c952abd8fecfd7057720", + "b": "0x112e3a1b8d49be4ed4e820e46133352577cf0f66c9583b247b8f9b0e26ca27c", + "cmp_a_b": -1 }, { - "a": "0x5008da1f2aad6c0000000000", - "b": "0x107d3606f12a8500000000", - "cmp_a_b": 1 + "a": "0x9849e031dafcbc", + "b": "0x5246d0eeb570888721bbc64bfbf233fb7c22b571710dac7fd16", + "cmp_a_b": -1 }, { - "a": "0xa8b60", - "b": "0x0", + "a": "0x61eb6200d91ae0a3c", + "b": "0x287d54614a3", "cmp_a_b": 1 }, { - "a": "0xc", - "b": "0xc", - "cmp_a_b": 0 - }, - { - "a": "0x59cbac99079c4000000000000", - "b": "0xefa484", + "a": "0xcbbdcdf8b1ccf84e94de41e9c66a7c", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x8dc6b447d40de80000000000000000000", + "a": "0x932a285d62397013aefd30e74", + "b": "0x6d2420c36128bbbee357b1d6ee41e743656ff6c70479", "cmp_a_b": -1 }, { - "a": "0x4a2b22127baa1000000000", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x6efff9928905c72852c1", + "b": "0x2827b2e1c32086a83eb442fdf028e311f06d3e43711d9687", + "cmp_a_b": -1 }, { - "a": "0xafc", - "b": "0xb8b37beb3c43a000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x1ce49d27266d385d868f35a6f81", + "b": "0x1ce49d27266d385d868f35a6f81", + "cmp_a_b": 0 }, { - "a": "0x63b66f709251ec000000000000", - "b": "0x97909712c52728000000000000000000000000000000000000000000000", + "a": "0xd91229e32b7aa4a4", + "b": "0xbadb0021700f9806de5ff43e9b9dbfba06a5fc50362a1b98fffba99c5552", "cmp_a_b": -1 }, { - "a": "0xaa89", - "b": "0x7cd10fd", + "a": "0x91418cfb6fda3fa93a7d87", + "b": "0x7357936ea899a38daa9e829d88d483db9d3", "cmp_a_b": -1 }, { - "a": "0x7cba197a", - "b": "0x4be7cd4485be240000000000000000000000000000000000000000000", + "a": "0x0", + "b": "0x2aea36c41f5ce40205cdd325036c0", "cmp_a_b": -1 }, { - "a": "0xee6b681c48", - "b": "0x70c2da9f9f1e10000000000000000000000000000000000000000000", + "a": "0x31fa", + "b": "0x1d4380", "cmp_a_b": -1 }, { - "a": "0x7e488aa92f4e3c000000", - "b": "0x10", - "cmp_a_b": 1 + "a": "0x1c74ec3d67af58dcf57400865ed", + "b": "0x369fa77079e366ce573c957e1ff2ebef898d995525512f", + "cmp_a_b": -1 }, { - "a": "0x5c1918767843a00000000000000000", - "b": "0x1c62d", + "a": "0x1ec660bdb6601e87840650d18bb1a8b", + "b": "0x9", "cmp_a_b": 1 }, { - "a": "0x14", - "b": "0x4023091cd343f800000000000000000", + "a": "0xece4a91c03f2bafe58063d4abd9aba3", + "b": "0x1b2dc252bc3c0a28cd3f304fcee571252fc45c5673ed562b72b", "cmp_a_b": -1 }, { - "a": "0x6533", - "b": "0x997a955dfedf88000000000000000000000000000000", + "a": "0x67", + "b": "0xe2ee6d1", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x2acd81dc6dfe42000000000000", + "a": "0x1c608", + "b": "0xbdaca579cf8125e954ea", "cmp_a_b": -1 }, { - "a": "0x889090ed93dd7000000000", - "b": "0x5f2ba24e", + "a": "0x33eb9e2236f08dcd", + "b": "0x7cdf07bd9ac9", "cmp_a_b": 1 }, { - "a": "0x5853efa", - "b": "0x100714ede8b8c6000000000000", + "a": "0x42db214f5975671ba", + "b": "0xf80d7956a8e940c02e0125ad13586da6f2ff0966fa365d003", "cmp_a_b": -1 }, { - "a": "0x1448e69532d84d000000000000", - "b": "0x273c1f28191cea0", + "a": "0xebfb406da35ac3151914789e184cb36", + "b": "0x1a56503", "cmp_a_b": 1 }, { - "a": "0xb186b537e53da800000", - "b": "0xa96ae545cf461800000000000000000000000000", + "a": "0x66a3248d7997be13c8d4e", + "b": "0x4600a1f23283d4be0d2f79e680ac6ef086d030505cc16b90f3aebbbfe1fa61a", "cmp_a_b": -1 }, { - "a": "0x3dc406b9d2ff", - "b": "0xb16384106e65f00", - "cmp_a_b": -1 + "a": "0x1e", + "b": "0x1e", + "cmp_a_b": 0 }, { - "a": "0x1376bc742f59610000000000000000", - "b": "0x21a30658d498fe000000000000000000000000000000000000", + "a": "0x1c01f42cc0390e49", + "b": "0x1c9e8698305f2d54112caed5c1f28189bdbf5fd6c9029fd8fa93efcbf3e30c96", "cmp_a_b": -1 }, { - "a": "0x3", - "b": "0x391daa9fb4230a0000000000000000000000000000000", + "a": "0x594fc57bdc2e1502", + "b": "0x14dbb87fd00bb66a7db0202dff562215ee52047fb6c8", "cmp_a_b": -1 }, { - "a": "0x141f718ac9", - "b": "0x3e04fe724d729400000000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x18109278", + "b": "0x2926ca", + "cmp_a_b": 1 }, { - "a": "0xaaca69cedea8000000000000", - "b": "0xe850378aeabfd00000000000000000000000000000000000", + "a": "0x769b8e", + "b": "0x2eab4cbd3b0ad6a009047099c3f8e32ebeb056ae53383074b2", "cmp_a_b": -1 }, { - "a": "0x301656e5af847a", - "b": "0x27", + "a": "0xebbf74350", + "b": "0x2a8bbeb6", "cmp_a_b": 1 }, { - "a": "0x94c6e03c793e1800000000000", - "b": "0x6da28cbc5d53e000000000000000", + "a": "0xec75250f1e796", + "b": "0xc5a10296a10677068476fa83fd46a4ad108bcc1a", "cmp_a_b": -1 }, { - "a": "0x6c14f04bf", - "b": "0x6c14f04bf", + "a": "0x4afccff306121c69c8211736741bb30", + "b": "0x37c0cf79166d463b", + "cmp_a_b": 1 + }, + { + "a": "0x40562ff30cf0f3e2c141", + "b": "0x2d6e8", + "cmp_a_b": 1 + }, + { + "a": "0x1d4", + "b": "0x1d4", "cmp_a_b": 0 }, { - "a": "0xdef7c753728db800000000000000", - "b": "0x19a45751b8486300000000000000000000000", - "cmp_a_b": -1 + "a": "0x22e2a3dda5690d1723e68ab", + "b": "0xf92", + "cmp_a_b": 1 }, { - "a": "0x1998c2747bed530000", - "b": "0x59ca3ecc959ad4000000000000000000000000000000000000000000", + "a": "0xd16f29ac5fdf83fde1af2ca", + "b": "0xb75bf085297992b10faa022f841a58e2fd86b5a7e", "cmp_a_b": -1 }, { - "a": "0x3820b18", - "b": "0x20bf94527c115c0000000000000000000000000000000", + "a": "0x1212fb228bff8", + "b": "0x936a910b18807e73dfb3823f0bc3397b4cb9105", "cmp_a_b": -1 }, { - "a": "0x3bd5f8b17c0d520", - "b": "0x1e0ab41b0fef64000000000000000000000000000000000000000", + "a": "0x15ff55d4045a96c5b", + "b": "0x26544abdc4f108936cebc19d2f5d06b37dcc050aab5ed", "cmp_a_b": -1 }, { - "a": "0x326fef3fca4ac20000000000000000", - "b": "0x4006a5cb24d33c0000", + "a": "0x892ef2b4685af6931e04276f", + "b": "0xa9d311add", "cmp_a_b": 1 }, { - "a": "0xcf1", - "b": "0x37aaf67fefc76800000000000000000", - "cmp_a_b": -1 + "a": "0x694d64ba4f917a28950", + "b": "0x1333a99", + "cmp_a_b": 1 }, { - "a": "0x52524188b0ef380000000000000000", - "b": "0x52524188b0ef380000000000000000", - "cmp_a_b": 0 + "a": "0x477bf930ebe07f403d", + "b": "0x3ed34fc9f627921de4bdcfa19acef7", + "cmp_a_b": -1 }, { - "a": "0x2d54129e0", - "b": "0x1388ea557b7a120000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x1d8fd7dd0b02e16c7fa4", + "b": "0x74", + "cmp_a_b": 1 }, { - "a": "0x84a95023b15f400000", - "b": "0x204a148ef46d3c0000000000000000000000", + "a": "0x4761dfda6", + "b": "0xa9e096ead97c255", "cmp_a_b": -1 }, { "a": "0x0", - "b": "0x1c22cfa69a9d", + "b": "0x6e331546c2471a88aa0c4b9adb0ae", "cmp_a_b": -1 }, { - "a": "0x37e53ca438f292000000000000000000", - "b": "0xc147af535fbb00000000000000000000000", + "a": "0x532dd", + "b": "0x10d8e726b13535461786439f6fdaa413f454ea84a493b8d0179ac55575a32c14", "cmp_a_b": -1 }, { - "a": "0x7359d4817eef60000000000000000000", - "b": "0x26427f9", + "a": "0x2e3e4854e93381eb3043770cb23", + "b": "0x612ba3583699", "cmp_a_b": 1 }, { - "a": "0xb66", - "b": "0x90ec01b9f4b1c00000000000000000000000000000000000000000000000000", + "a": "0x2f2a4a868cf718c0d365b9b30d3", + "b": "0xebf42e4c7fa9e3d74544696322f", "cmp_a_b": -1 }, { - "a": "0x12ed80fb1c1e0600", - "b": "0x3dffbb381", - "cmp_a_b": 1 + "a": "0x87150ea18aa3532e1f8e2771cf5ea0d", + "b": "0x87150ea18aa3532e1f8e2771cf5ea0d", + "cmp_a_b": 0 }, { - "a": "0x280c09df3", - "b": "0x1874f25c01922", + "a": "0xcda6194c", + "b": "0xf8fae2db5510957d6e65fbb30", "cmp_a_b": -1 }, { - "a": "0x28", - "b": "0x28", - "cmp_a_b": 0 + "a": "0x59d378d0a636d6721", + "b": "0xb9f30587f8bd80c9c89457533bff507619669a2f1ca47e6b267", + "cmp_a_b": -1 }, { - "a": "0x22732949e874660000000000", - "b": "0xb12145f6da86d800000000000000000000000000", - "cmp_a_b": -1 + "a": "0x4086be745bf3", + "b": "0x1a28", + "cmp_a_b": 1 }, { - "a": "0x4584a753ca2b700000000000", - "b": "0x39bef8808e5e660000000000000000000000000", + "a": "0x68b6c0", + "b": "0x16b0ec5859d6b9315f64ce00", "cmp_a_b": -1 }, { - "a": "0x77d5b6689a980800000", - "b": "0x1ee03776f48df3", + "a": "0x120c520683b593a8358d5e84a6f31", + "b": "0x19c1e630", + "cmp_a_b": 1 + }, + { + "a": "0x86d275a13b2ed38bd0e7e62f1", + "b": "0x280c25a62145e7420705e69", "cmp_a_b": 1 }, { - "a": "0x8daba2b0c", - "b": "0x1a569dafbd674c0000000000000000000000000000000000000000000000000", + "a": "0x370d30bbf26aa4", + "b": "0x85a30a93c2f6bf81af245bfa0f4e6446", "cmp_a_b": -1 }, { - "a": "0xf1a3acb14a9100000000000000000000", - "b": "0x1ad3a060", + "a": "0xd24bbebd55ff3a40db74bd43f6c407ef", + "b": "0x762df06de48a08bde", "cmp_a_b": 1 }, { - "a": "0x54c6286", - "b": "0x412a3de81536f0000000000000", + "a": "0x5f8f29", + "b": "0x14c834ea6aca2dab849a2ca0", "cmp_a_b": -1 }, { - "a": "0x9d8a5a5c445a50000000", - "b": "0x269c033ea8c2fa00000000000000000000000000000000000000000000000", + "a": "0x3408a1e9b486bef31", + "b": "0x12601bec0835e81716fbb551c47d1064d6c529ac87fa7c5d568d18", "cmp_a_b": -1 }, { - "a": "0x2768dc347", - "b": "0x3bae8c558a54a40000000000000000000000000000000000000000000", + "a": "0x39", + "b": "0x26bc5b22d541a50e44e64e2cff", "cmp_a_b": -1 }, { - "a": "0x5cac105abbaf10000000", - "b": "0xab824bfbecea380000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x810de96054d738f196485b06f0a2edc", + "b": "0xc91cdf93a01b353085f4", + "cmp_a_b": 1 }, { - "a": "0xe1a279ce60ab8000", - "b": "0x1a9aa", + "a": "0x7d3b52b92b7436f0ab475", + "b": "0x1d38e379", "cmp_a_b": 1 }, { - "a": "0x3829bf19661bde000000000", - "b": "0x1f0a76eecb71f300", - "cmp_a_b": 1 + "a": "0x8044d7e94d28a24d14a2aee8d07e655", + "b": "0xd60d320bbfa13ecd73a34e5785cde3ea1b50c4b6daec844dee1531d1196c4", + "cmp_a_b": -1 }, { - "a": "0x365b2d8fbd834a000000000000", - "b": "0x181303903c34f", - "cmp_a_b": 1 + "a": "0x8116abd334c2929a", + "b": "0x8ebac2ff6293667be3756b051c42e2d3f5825", + "cmp_a_b": -1 + }, + { + "a": "0xc20f6c97c", + "b": "0x64dd9d0e59d4dd0eb90866fbeff22936c4f90a2649efbd0129bfe0e6181", + "cmp_a_b": -1 + }, + { + "a": "0x24e03e9cca392148cc722754c428", + "b": "0x176e8b8e5e62c838d5e906cb6be8aceffe", + "cmp_a_b": -1 }, { - "a": "0x1c4d30393a236a00000000000000", - "b": "0x1c4d30393a236a00000000000000", + "a": "0x25ddf233b376c47cd0", + "b": "0x25ddf233b376c47cd0", "cmp_a_b": 0 }, { - "a": "0x1f23aa", - "b": "0x17783a416f31f50000000000", + "a": "0x1a3e864736fffc5e817ddcf", + "b": "0x28a14b28aeb53fa200732433c", "cmp_a_b": -1 }, { - "a": "0x29d05c4fdb20da00000000", - "b": "0x7408138e3fcb940000000", + "a": "0x72b58abdd5d6626", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x2f3b7fc78dd6f600000000000000", - "b": "0x56f21930decf7c00000000000000", + "a": "0x7be8cea61a481ebdce639", + "b": "0x3e2b3bede2a055606c5d07870ebaf64154bbedf7d5295", "cmp_a_b": -1 }, { - "a": "0x4d1231e99c536800000000000000", - "b": "0x33ee6c27db933e00000000000000000000000000", + "a": "0x2110d7ceab96e4cd22532e2", + "b": "0x855732f34f86f354a5ad0b08a9e565da8967e729c34cd8ccfe", "cmp_a_b": -1 }, { - "a": "0x3a30112782db74", - "b": "0x3a30112782db74", + "a": "0x4b9150f333c479ade", + "b": "0x4b9150f333c479ade", "cmp_a_b": 0 }, { - "a": "0x36e", - "b": "0x8b277cde2", - "cmp_a_b": -1 + "a": "0x20055b5053bc006b527453b347b9", + "b": "0x20055b5053bc006b527453b347b9", + "cmp_a_b": 0 }, { - "a": "0x1db0bcd03debf600000", - "b": "0x13399456b8acc90000000000000000000000", + "a": "0xcf", + "b": "0x18b58e0fc6444", "cmp_a_b": -1 }, { - "a": "0x10e3", - "b": "0x280cd4dfe7e5e", + "a": "0x1efd0ba2b57dd17bdb16dd659", + "b": "0x1f651e58e7680dc1a100d3f178175ed08", "cmp_a_b": -1 }, { - "a": "0x2991b6ca893", - "b": "0x509f495703e1040000000000000000000000000000000000000000000000000", + "a": "0x6604a915cfc3", + "b": "0x1d4f9215f193d6c3465b1ab5028c188a5c0339e2aa902dbb2a3e9d095ad9ec3", "cmp_a_b": -1 }, { - "a": "0x1a8de11084bd0a00000", - "b": "0x18dfd345af45270000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x348a3565425b882", + "b": "0xab80188262b2b", + "cmp_a_b": 1 }, { - "a": "0x12ee970a591c6600", - "b": "0xd8987bb", - "cmp_a_b": 1 + "a": "0x1a835d153f2", + "b": "0x1b84660b17451f2d5ff2e58ab57925", + "cmp_a_b": -1 }, { - "a": "0x263d", - "b": "0x8c61007f6eddd80000000", + "a": "0x76", + "b": "0x829a8364b3cf187959e64a950d9d41067895d5cbf2e3d24bc3ea45f477009a4d", "cmp_a_b": -1 }, { - "a": "0x1a5be8a918", - "b": "0xeee4212a940dd800000000000000000000000000000000000000000", + "a": "0x10168f2d", + "b": "0xfc95887d1d44245399d5e526336f8de9357b228e199ed58e91c", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x0", - "cmp_a_b": 0 + "a": "0x123b31de8fec052b07d146b1b", + "b": "0x2272121496915a4001", + "cmp_a_b": 1 + }, + { + "a": "0x1e3585f222a4e5e93bc0", + "b": "0xd783bcfa4464", + "cmp_a_b": 1 }, { - "a": "0x880386e9", - "b": "0x44381764bb36000000000000000000000000000000000000", + "a": "0x132eea9d343b8", + "b": "0x7814259b5ab3d405e2c21298a", "cmp_a_b": -1 }, { - "a": "0xf2ff5e0560cb6000000000000000000", - "b": "0x55", - "cmp_a_b": 1 + "a": "0x1f498ad22bd09576eef3", + "b": "0x9154be50301e7d53953c3642380b46430e76a2b57f4c7805f3b5397aa85", + "cmp_a_b": -1 }, { - "a": "0x31a95", - "b": "0x53120aa7ea652400000000000000", + "a": "0x11", + "b": "0x7a8e523036dcf924183f8b14bf213316cc9c179885d972479cbfa0419e8", "cmp_a_b": -1 }, { - "a": "0xb38a2dd65ec4900000000000000", - "b": "0xe58d46c75b7958000", - "cmp_a_b": 1 + "a": "0x2148be2db", + "b": "0x4cdd5480a8cd23638040ea761", + "cmp_a_b": -1 }, { - "a": "0xe73112aff", - "b": "0x205e2769040b", + "a": "0x1f73b3078e1ba2", + "b": "0x307f02d4325120311c7cca8", "cmp_a_b": -1 }, { - "a": "0x26fbc0", - "b": "0x93d93e5a4c99f00000000", + "a": "0x4df62be2696b32ab3798849", + "b": "0x19ccd87ea59cb7825403021a77478d90f71aa365e4299826291bbde1365e3be1", "cmp_a_b": -1 }, { - "a": "0x94be47ba93", - "b": "0x321d50e97", - "cmp_a_b": 1 + "a": "0xc9a7f30e", + "b": "0x3acdd40745af25c179ca64c7c7158c6048a9ee93b6e9c471b6", + "cmp_a_b": -1 }, { - "a": "0x135e47cc86d3880000", - "b": "0x1f344", + "a": "0x1c9bbdf5239868", + "b": "0x77cdcab4c656", "cmp_a_b": 1 }, { - "a": "0x41c32f3ca035ac000000000000000", - "b": "0xd6a103027531b8000000000000000000000000000000000000000000000000", + "a": "0xaff23d535fe74d2dfc0fd63317d9f", + "b": "0x9ecd83bf4d23e33afb84ce303e0b6d5d311d619c6d6b8ace2f0bb1", "cmp_a_b": -1 }, { - "a": "0x1176d23e1bc0d000000000000000000", - "b": "0x24f815ae5e25be000000000000000000000000000000", + "a": "0x2944b8fb6", + "b": "0x1e95e62d6b827", "cmp_a_b": -1 }, { - "a": "0x10de6ecb7702", - "b": "0x7546f59f2273b4000000000000000000000000000000000000000000000000", + "a": "0x1dab1cbde9bb14288", + "b": "0x4df010cbd330f6387e95", "cmp_a_b": -1 }, { - "a": "0xbfe68", - "b": "0x4", + "a": "0x119a3122c7028224c2fa4fb9", + "b": "0x6913c6a514", "cmp_a_b": 1 }, { - "a": "0x30407945f35f1e0", - "b": "0x11433477892561000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x14789e", + "b": "0x14789e", + "cmp_a_b": 0 }, { - "a": "0x36e7241c02f35c0000000000000000", - "b": "0x95817fd3f38910000000000000", + "a": "0x179c2d4", + "b": "0x2c4", "cmp_a_b": 1 }, { - "a": "0x1748c6a7af6df70000000000000000", - "b": "0x960bbaadc331e00000000000000000000000000000000", + "a": "0x62c55be476cfc84c1e2ab4", + "b": "0xf04cc361c4ef7fdf9609b42cb827494863f393f786dbb3afded", "cmp_a_b": -1 }, { - "a": "0x6f2ce42244b9a40", - "b": "0x21bfab85673eaa0000000000000000000000000000000000000000000", + "a": "0x807d150994b3a2", + "b": "0x65d0a0af3630fa0645952bb3238d925f3f722", "cmp_a_b": -1 }, { - "a": "0x102", - "b": "0x374df306050d0c", + "a": "0x0", + "b": "0x6304ca74f5ca2a22436293dca6b89aad8c7c38a5b1e895af869c321d9", "cmp_a_b": -1 }, { - "a": "0xdd230b3917a3400000000000", - "b": "0xdd230b3917a3400000000000", - "cmp_a_b": 0 + "a": "0x37dfa9f3921", + "b": "0x4252fe23b84fd2cb866b981c3b9245557b82588a", + "cmp_a_b": -1 }, { - "a": "0x255", - "b": "0x5204d6f104856c00000000000000000000000000", + "a": "0x45e2f53796761717bae054a553", + "b": "0x1bdbba7f5e4d641bdad05c3a78c5f02b430a386a99c3a426", "cmp_a_b": -1 }, { - "a": "0x498a79", - "b": "0x637bf5332565e40000000000000000000000000000000000000000000", + "a": "0x518ce90ea33", + "b": "0x7d541563135470274595800879411292101b79846", "cmp_a_b": -1 }, { - "a": "0xfb81f5108b7", - "b": "0x408fc78d06bb7c0000000000000000000000000000000000000", + "a": "0xc", + "b": "0x367e45074412408d8cb4e635f62cd0fcb", "cmp_a_b": -1 }, { - "a": "0xd1bb5293b722700000000000", - "b": "0x19b739446a7", - "cmp_a_b": 1 + "a": "0x6d97b8f6ce1b079e7a047a5d", + "b": "0x7a59f240a508f2317b6742793096f259c78ca42d9dddf", + "cmp_a_b": -1 }, { - "a": "0x13f85f29815a7c0", - "b": "0x13f85f29815a7c0", - "cmp_a_b": 0 + "a": "0x59890a6f48b5e7c3212b37d5876b535", + "b": "0x193dd4436a9880e94e16b136cbf318928b1e8008d91f5a", + "cmp_a_b": -1 }, { - "a": "0x14dee747dcf6df", - "b": "0x69a68209edc1dc0000000000000000000000000000000000000000000000", + "a": "0x1ef53894481", + "b": "0x39fe1cbfc845c421241409", "cmp_a_b": -1 }, { - "a": "0x238f812e6e6a9a0000000000", - "b": "0x4e8c0", - "cmp_a_b": 1 + "a": "0x19bdc88af1a4b", + "b": "0x19bdc88af1a4b", + "cmp_a_b": 0 }, { - "a": "0x353c16244c1", - "b": "0x5114b3808", - "cmp_a_b": 1 + "a": "0x4fd714c5c5796b1", + "b": "0xa01ecd3fcc66dc0406bfb82c37fe4bb2a05d362f093528e0c0f0dcd8c", + "cmp_a_b": -1 }, { - "a": "0x795ad272381", - "b": "0x10c210", - "cmp_a_b": 1 + "a": "0x37bfb2f0", + "b": "0xc0e51c14487caac4c", + "cmp_a_b": -1 }, { - "a": "0xb84b461903", - "b": "0x1880bae434cbc4000000000000000000", + "a": "0x0", + "b": "0x4", "cmp_a_b": -1 }, { - "a": "0x4d6fdef3f7801000000", - "b": "0x49fbbacc467ff8000000000000", + "a": "0x36a6f4fc01211578279c0ab", + "b": "0xbba6e7875a63148288228f457", "cmp_a_b": -1 }, { - "a": "0x5aa44fd877b2e800000000000000000", - "b": "0x372dd298aaa46000000000000000000000000000000000000000000000", + "a": "0x1c65f9790f4dfcb9", + "b": "0x51bcc6c31de94e93e53b7a4f17c6ddb", "cmp_a_b": -1 }, { - "a": "0x30d86dcbf3", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x1dee0ecbd800", + "b": "0x7d0f5a843dbdf7190b33eb", + "cmp_a_b": -1 }, { - "a": "0x58b2821d4e09", - "b": "0xc00f911f80daf000000000000000000000000000000000000000000000", + "a": "0x0", + "b": "0xad35d4bee1b6cec8fcb4e38b42a8c646ea", "cmp_a_b": -1 }, { - "a": "0x1f0c9ba2", - "b": "0x393227aab9f9180000000000000000000000000000000000000", + "a": "0x259ece069b2", + "b": "0xacd5c239b5183f819adfa03", "cmp_a_b": -1 }, { "a": "0x0", - "b": "0xcad5d80a0094380000000000000000000000", + "b": "0x123ed40549511", "cmp_a_b": -1 }, { - "a": "0x13b413a35873b20000000", - "b": "0x13b413a35873b20000000", - "cmp_a_b": 0 + "a": "0x107", + "b": "0xac78f3e14e141cb6", + "cmp_a_b": -1 }, { - "a": "0x263673da", - "b": "0x4134d2dbb39ff4000000000000000000000000000000000000000000", + "a": "0x41269a", + "b": "0x7e52e79e1e59449ff6a69f4601f", "cmp_a_b": -1 }, { - "a": "0x3f48ed98db177800000", - "b": "0x26bd185c9915fa0000000000000000000000000000", + "a": "0xff6ddd1abf0a2d8b8ddf552", + "b": "0x3ef61f79b83997819cc95c91c9ed4", "cmp_a_b": -1 }, { - "a": "0x6bd755e9a93f88000000000", - "b": "0x148caffee6f7280000000000000000000000000000000000000000", + "a": "0xa345", + "b": "0x19b1d257c5c5e2f3", "cmp_a_b": -1 }, { - "a": "0x13c0020e25e9b8000000000000000000", - "b": "0x7d5", - "cmp_a_b": 1 + "a": "0x28efaab30a500ee420f0a37d8", + "b": "0x75072128824e194a9cda0709548416", + "cmp_a_b": -1 }, { - "a": "0x47d29c2f19a494000000000000", - "b": "0x1c9574d157d35d0000", - "cmp_a_b": 1 + "a": "0x9d0d20c70a5294", + "b": "0x14f533024a5b7bb487fd3650c0f719d2ac6edcbce795c39f97b10b4dcb", + "cmp_a_b": -1 }, { - "a": "0x1418dffdd7f8b30000", - "b": "0x1418dffdd7f8b30000", - "cmp_a_b": 0 + "a": "0x0", + "b": "0x4", + "cmp_a_b": -1 }, { - "a": "0xa50b64e57", - "b": "0x488ab72806e31800000000000000000000000000000000000", + "a": "0xa0437b", + "b": "0x1f42cedc6f3361f68d2b5de279c94b37c4ef858d81d11279", "cmp_a_b": -1 }, { - "a": "0x3", - "b": "0x24b7c2", + "a": "0x7bb90fe487c1f", + "b": "0x7ddfbced7967a00d4c951085e8485dec07c3d7c73ea8fea19ab", "cmp_a_b": -1 }, { - "a": "0x9d8d676b0a7ef000000", - "b": "0x52e2474a1547a00000000000", + "a": "0x41fe09e5d8928afb4c67d75e7101a4f", + "b": "0x71f06eb80dca358cebf0712717c83cfb784", "cmp_a_b": -1 }, { - "a": "0x1702296df2f2ab0000000000", - "b": "0xf456f2c383f2e000000000000000000000000000000000000000000000000000", + "a": "0x7d045bd4ba8d9f1e070", + "b": "0x22e3ac7f5cf31e9a34c889db4fa0bc16bb3dfed960b1d83fced36bc64", "cmp_a_b": -1 }, { - "a": "0x93a8afbd565f180", - "b": "0x52f8c8f3792cc0000000000000000000000000000000000000000000000", + "a": "0x80a9fcaa20dbdd04dc9c8b8a6bc63", + "b": "0x3d41cf75522c23fbd401815844ed8280ffd8580", "cmp_a_b": -1 }, { - "a": "0x36bad4557f484600000000", - "b": "0x1858d3916abbca00000000000000000000000000000000000000000", + "a": "0x130ac1f4f7f", + "b": "0x137a86fab3796a", "cmp_a_b": -1 }, { - "a": "0x20bc51314aa2c20", - "b": "0x9f85e7699980f0000000000000", + "a": "0x5f218e6265bb", + "b": "0x25531e404232b23939b04d4b913372b", "cmp_a_b": -1 }, { - "a": "0x38ba3", - "b": "0xc43b8eac6aedf800000000000", - "cmp_a_b": -1 + "a": "0xe94afec63119c78c6caaaebaef80ed3", + "b": "0x1512e17ef0640133bf9bbc170", + "cmp_a_b": 1 }, { "a": "0x0", - "b": "0x1352c2bf2955d5", + "b": "0x32be53316e4b36e6529fdad13f45e41b65785716875b73c6a54b669219c17a", "cmp_a_b": -1 }, { - "a": "0x67c99acb64", - "b": "0x1794bf036315c70000000000000000000000000000000000000000", + "a": "0x9b106ada1", + "b": "0x2b5c00242a13a57886f8c68fe59df", "cmp_a_b": -1 }, { - "a": "0x70afb", - "b": "0xf254c16ab903880000000000000", + "a": "0x9421", + "b": "0x208e11feb7da77d8f26a64443bdf8", "cmp_a_b": -1 }, { - "a": "0xc8eb71", - "b": "0x233", + "a": "0x249af19dfd518be58abdd65979352e", + "b": "0x401c95420aae4e63", "cmp_a_b": 1 }, { - "a": "0x2", - "b": "0x2", - "cmp_a_b": 0 - }, - { - "a": "0x0", - "b": "0x1c5c7d2531450d000000000000000000000000000000000000000000000", - "cmp_a_b": -1 - }, - { - "a": "0x3336c4d353835c0000000000000", - "b": "0x6aa402736da5240000000", + "a": "0x231256fa865ecc7579fdb", + "b": "0x19af0", "cmp_a_b": 1 }, { - "a": "0x141281991a27ce0", - "b": "0x901bca8c2742c000000000000000000000000000000000000000000000000000", + "a": "0x61e9b6d5e1399", + "b": "0x3803dafe4dc4c17cb4be73e570e133aaec6718f7e", "cmp_a_b": -1 }, { - "a": "0x7ef9ee9572", - "b": "0x20b18c86ef6f7a0000", + "a": "0x56cddc5ad", + "b": "0x47fd12879f2513145654dda43743d9bfd8c5ef", "cmp_a_b": -1 }, { - "a": "0x31de9a8d60eed60000000000", - "b": "0x9464cd", - "cmp_a_b": 1 - }, - { - "a": "0x7f2d943ff034a80000", - "b": "0xbfb28d8f750eb00000000000000000000000000000000000000000000000", + "a": "0x0", + "b": "0x3237a2ee49bb7fb8676550ec21cede2", "cmp_a_b": -1 }, { - "a": "0x38", - "b": "0x139", + "a": "0x7db1397de7fd1b664329", + "b": "0xa483810e23dd901f9deeca", "cmp_a_b": -1 }, { - "a": "0x1e054fcc338719000000000000000", - "b": "0x152186bcc", + "a": "0x44f5f8a3c", + "b": "0x6effb", "cmp_a_b": 1 }, { - "a": "0xd1", - "b": "0x31abf3e2ac2bcc000000000000000000000", + "a": "0x2affc3f59b607d20dc5a5d19c69", + "b": "0x10c7abfd1c01fce5705b44fb2347602313f7ccaec205fa4fb8d694", "cmp_a_b": -1 }, { - "a": "0x9e8b9cd71920080", - "b": "0x5d11a1a2fd70fc00000000000000000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x1e25ff0e2903614b42b4ea1e", + "b": "0x4d34a8fdf871fd0", + "cmp_a_b": 1 }, { - "a": "0x13e64beb5ebe370000000", - "b": "0x2e9dd248abfc6a000000", + "a": "0x378b5dada5d5683e8bcdfcf6ad559", + "b": "0x44cf2", "cmp_a_b": 1 }, { - "a": "0x7b", - "b": "0x2ae08da5fb12d80000000000", + "a": "0x964dee1278625995616236b8370db", + "b": "0x3db88def0fe7ab35156d20930fda786916aec50c5e9", "cmp_a_b": -1 }, { - "a": "0x2540f8b1", - "b": "0xba6e446ac78cb80000000000000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x33834fde1a77db30c5448c0e70ad63d", + "b": "0x33834fde1a77db30c5448c0e70ad63d", + "cmp_a_b": 0 }, { - "a": "0x22", - "b": "0x366bf27dbfaeb0000000000000000000", - "cmp_a_b": -1 + "a": "0x4812dfe93d", + "b": "0x4812dfe93d", + "cmp_a_b": 0 }, { - "a": "0x1ddea1", - "b": "0x34cf47bd081568000000000000000000000", + "a": "0x1a694c", + "b": "0x6b86562e82f00d1fce941ff6e7b35092c6e031525b8287d06", "cmp_a_b": -1 }, { - "a": "0x21e427b8260a22000000000000000000", - "b": "0x10dd1a8ed751e", + "a": "0xf75279974c7a8b8fed414fbfd95", + "b": "0x44cb02727a", "cmp_a_b": 1 }, { - "a": "0x109a6eac6860b500000000000000", - "b": "0x109a6eac6860b500000000000000", - "cmp_a_b": 0 + "a": "0x42b4264fbc", + "b": "0x3aadfc560ff5f64e", + "cmp_a_b": -1 }, { - "a": "0x3ba5180d9af2300000000000000", - "b": "0x27cc4f157", + "a": "0x3cd6d47f1262434", + "b": "0x90bf5c655", "cmp_a_b": 1 }, { - "a": "0x1423de8b08251c000000000000", - "b": "0x77d7cbb3030fc0000000000000000000000000000000000000000000000000", + "a": "0x4e54df50325", + "b": "0x79e43f4f358709e6051b629e21", "cmp_a_b": -1 }, { - "a": "0xd7", - "b": "0x5b67fa0bea471c000000000000000000000000000000", + "a": "0x6362885b64303b", + "b": "0x696e767339c9045b8d76c9523b62fb5d", "cmp_a_b": -1 }, { - "a": "0xa5ee9075ad8d10000000000000000000", - "b": "0xd4a4e505a1e0a80000000000000000000000000000000000000000000", + "a": "0x462b16af", + "b": "0x238d7064482c62", "cmp_a_b": -1 }, { - "a": "0xfa9a7d70", - "b": "0x10677720b77d94000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0xdca61644d885fc5d41cd7c9e1d2817", + "b": "0x1ad1e82efe6e1abac672fff", + "cmp_a_b": 1 }, { - "a": "0x0", - "b": "0x69e5bb631bb8bc000000", + "a": "0x24662a481135a8e85f", + "b": "0x1cfc4af86a77ead3116c8c12eb1abee657e3461be350968c6e6efbe2f9", "cmp_a_b": -1 }, { - "a": "0x1114", - "b": "0x1114", - "cmp_a_b": 0 + "a": "0x127633b4c9924bd7b4b4d5c", + "b": "0xdb93bc", + "cmp_a_b": 1 }, { - "a": "0x821621cde6a3f00000000000000", - "b": "0x3269f963a3fe4400000000000000000000", - "cmp_a_b": -1 + "a": "0x1819c28e51d50b5aa0527f647ae", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x131489cd6", - "b": "0x131489cd6", - "cmp_a_b": 0 + "a": "0x156d8c7f1571475ee3e68", + "b": "0xe52796e032f88f", + "cmp_a_b": 1 }, { - "a": "0x3aea38f4f", - "b": "0x635d84e83ad6ac00000000000000000000", + "a": "0x3429e12f2", + "b": "0x3a8403504665675da9a9612e", "cmp_a_b": -1 }, { - "a": "0x97a6b318598880000", - "b": "0x15b0b04cf18cdc00000000000000000000000000000", + "a": "0x4f0230dcef1102201b46716fb", + "b": "0x1481168591b806e5068c0015532e7e22dd31ed30bdddccecb92238bccc73c5", "cmp_a_b": -1 }, { - "a": "0x565cd5f6f227bc0000000", - "b": "0x22f6cb86ad84a8000000000000000", + "a": "0x9137", + "b": "0x20d96d91e82d2712f1756733ae", "cmp_a_b": -1 }, { - "a": "0x1acec50404ea", - "b": "0xd1e83", - "cmp_a_b": 1 - }, - { - "a": "0x225055361", - "b": "0x7c90c5193889940000000000000000000000", + "a": "0x1a35c75da15063", + "b": "0x20731fc5d0d2a289b74aa6e178ac1b6833545f1b03b4369ec7dfb2cb4", "cmp_a_b": -1 }, { - "a": "0x58205c0f1fe3", - "b": "0x28deb8aea5270400000000000000000000000000000000000000", + "a": "0x38d0707", + "b": "0x2aa192dcab5d2d7830cebcca5e77792a37", "cmp_a_b": -1 }, { - "a": "0x257c5bc1b5893000000000", - "b": "0x186176e41f06300000000000000000", + "a": "0x3866b3fb13ab47518501b", + "b": "0x2f12739fe82afca78d97523f917e32547c298adfeb36db3039e49161", "cmp_a_b": -1 }, { - "a": "0x206df57d32bec0000000000000", - "b": "0xe523755c252b2800000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x30390a10370fc0b", + "b": "0x258d543", + "cmp_a_b": 1 }, { - "a": "0x36a562aae97da4000000", - "b": "0x36a562aae97da4000000", - "cmp_a_b": 0 + "a": "0x1192f1c228cc9ad03aa392", + "b": "0x34c9b8e4320b2c76ea916598908927df0bed3811d35ee", + "cmp_a_b": -1 }, { - "a": "0x44c45", - "b": "0x1607b9f369a84a0000000000000000000000000000000", + "a": "0xe05f7f53158475", + "b": "0xb704d0f909ec8880", "cmp_a_b": -1 }, { - "a": "0xa41afbd2815d5000000", - "b": "0x35dc1b6196703800000000000000000000000000000000000", + "a": "0x0", + "b": "0xce4a9de9fe31a1e652cb1180459929d86509102dd6728fc43cb4725b", "cmp_a_b": -1 }, { - "a": "0x4486c10fa2", - "b": "0x1307b0a113e66e00000", + "a": "0x1498cda5ac6cebe4", + "b": "0xa81f8c2ddbfb019e4d56155b4175066c2b615ab765d317a", "cmp_a_b": -1 }, { - "a": "0x1dd9", - "b": "0x0", + "a": "0x1892e2c1310b1f1b68828389472f50", + "b": "0x12f51c157a62c0b41c1469e6", "cmp_a_b": 1 }, { - "a": "0x6fe9a796afa0340000000000", - "b": "0xac", - "cmp_a_b": 1 + "a": "0xe8d6d9b2b834d3", + "b": "0x64b116dc90b7aebfc944cad696f639ce4ce05eefe32c78d5a6b2", + "cmp_a_b": -1 }, { - "a": "0x3651d82f7cfcbe000000000000000000", - "b": "0x3651d82f7cfcbe000000000000000000", - "cmp_a_b": 0 + "a": "0x6c", + "b": "0x7f1191d3cfda0", + "cmp_a_b": -1 }, { - "a": "0x1620185c847f100", - "b": "0x1620185c847f100", + "a": "0x1ef04a2a0c4b", + "b": "0x1ef04a2a0c4b", "cmp_a_b": 0 }, { - "a": "0x4834728a9", - "b": "0x488c472580e6e40000000000000000000000000000000000", - "cmp_a_b": -1 - }, - { - "a": "0xa14570da0", - "b": "0xd8215ff95b9d1000000000000000000000000000000000000000000000000000", + "a": "0x344282441007a93d6fa2726", + "b": "0xcee65aeeb7fbcfa29b0ab3949c44e64282c7229fd5ea43c260960da", "cmp_a_b": -1 }, { - "a": "0x5f4360d14c9e74000000000000", - "b": "0x12edcad222cc28000000000000000000", + "a": "0x13cf84d6cc9786dcd56bf2", + "b": "0x9f479695532f73a5a4e9e6b0e9b7f5338f141962", "cmp_a_b": -1 }, { - "a": "0x6e36", - "b": "0x4a4c302dd63c2400000000000000000000000000000000", + "a": "0xf207119125055a452", + "b": "0x3f0e155f5475523cccf6634e01ea4f56", "cmp_a_b": -1 }, { - "a": "0xc2636a09168c90000000000000", - "b": "0x0", - "cmp_a_b": 1 - }, - { - "a": "0x55c60aa32981a8000", - "b": "0x55c60aa32981a8000", - "cmp_a_b": 0 - }, - { - "a": "0x6b9df52b818ad0000000000000", - "b": "0x33959694f4823e00000", + "a": "0x6bd421d07b442197ad08a", + "b": "0x197", "cmp_a_b": 1 }, { - "a": "0x11183a08b1cbbb00000000000", - "b": "0x540b816659c3f800000000000000000000", + "a": "0x10c131b4696534b", + "b": "0x2a3d4222752e3d8e2eb993f506371cad6d211a1f99153f09753", "cmp_a_b": -1 }, { - "a": "0x7", - "b": "0x439f9fb6fb30c0000000000000000000000000000", + "a": "0x22470b056a576134348f832e3e8912b", + "b": "0xfbcf2f44c40386387997c65bb92edf28", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x14654a131e4", - "cmp_a_b": -1 + "a": "0xc700ffc359d66", + "b": "0x15", + "cmp_a_b": 1 }, { - "a": "0x57d0c8b2613e64000000000000000", - "b": "0x57d0c8b2613e64000000000000000", + "a": "0x0", + "b": "0x0", "cmp_a_b": 0 }, { - "a": "0x3a621268", - "b": "0x9b8a37abc3c0680000000000000000000000000000000000000000", + "a": "0x86fcecbe1", + "b": "0x60b72c10c25ab88709b4c3c92337d5a17109b603499441", "cmp_a_b": -1 }, { - "a": "0x13e78eaf2beb36000", - "b": "0x13e78eaf2beb36000", - "cmp_a_b": 0 - }, - { - "a": "0x1eb09214bcbeae00000000000000", - "b": "0x22130f1b579c500000000000000000000", + "a": "0x3c3dba7f6b7fbe32f0126c571ce0cd9", + "b": "0xa74718e46a411ab0f832b40a67c57d0b5a65", "cmp_a_b": -1 }, { - "a": "0xfd85cfebc09ab000", - "b": "0x1915a", - "cmp_a_b": 1 + "a": "0x292099e5180a4dd7bc1d99339e6aec", + "b": "0x292099e5180a4dd7bc1d99339e6aec", + "cmp_a_b": 0 }, { - "a": "0x32dbf0b89", - "b": "0x1cfa1b6614fc4900", + "a": "0x21849", + "b": "0xce078a0f40ee7d67068081c45f856d19e283aba", "cmp_a_b": -1 }, { - "a": "0xb23c1ae959b900000000000000000000", - "b": "0xbb157242a7fc880000000000", - "cmp_a_b": 1 + "a": "0x7df4d79a", + "b": "0x10bc20e71f092456eaa73acc02191f704f8cb87", + "cmp_a_b": -1 }, { - "a": "0x4a4d07", - "b": "0xb370e52736e7080000000000", + "a": "0x0", + "b": "0x1f6bc82cff67432735f1582c68ec8f561a6c26ca21be803a6e2105ecd4", "cmp_a_b": -1 }, { - "a": "0x12c7e61dae3291000000000000000000", - "b": "0x7463c04b58d6ec00000000000000000000000000000000000000000000000", + "a": "0x48e65b1084", + "b": "0x11b557db845362e7d1", "cmp_a_b": -1 }, { - "a": "0x1741929dfa896d0000000000000", - "b": "0x8b578a0c364a900000000000000000000000000000000000000000000", + "a": "0x31342090c7cc8313b0", + "b": "0xec8fe16248dd1566670a594e48b608bf9a5e0e", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x1e0cc5", + "a": "0x38d9aa1cd49c026f0467edcbc3d0", + "b": "0x93e3699b6f802379bf16b9935a7370f1188897bee296a22b50", "cmp_a_b": -1 }, { - "a": "0x54cc08eb5659e800000000000000000", - "b": "0x8209261f0954280000000000000000000000000000", + "a": "0xbf541749292c6c", + "b": "0x5f46e886fcce86de4ab9cb5537e619cbbc4b6b0f7812113314", "cmp_a_b": -1 }, { - "a": "0x6b4f2be85163a4", - "b": "0x3a91f1f059585", - "cmp_a_b": 1 + "a": "0xe1f97d24acd1e495abd6dfbe", + "b": "0x522bb9000a48d1b2c980dd050cb6c054f96799ec9177631bc16a", + "cmp_a_b": -1 }, { - "a": "0x722bb21bcbdc000000", - "b": "0x11d743ee665f1b0000000000000000", + "a": "0x1b953cdcdf53ba766835", + "b": "0x3047bac08d74600fbde4b3ce0f15662bdc704d8db35f192d1bf", "cmp_a_b": -1 }, { - "a": "0x2beadd87e33f", - "b": "0x41a3d061c02a6800000000000", + "a": "0xfaf46a29064075b4b3", + "b": "0xcf8f409e143daaf6b32dd038861054a571ddca0c6e03c378abc", "cmp_a_b": -1 }, { - "a": "0x4c5ccea46d3d40000000000000000000", - "b": "0x3186161", + "a": "0xcc6d47f6c357dbc84d24", + "b": "0x288bcde431b6b88", "cmp_a_b": 1 }, { - "a": "0x954b737b1826200000000000000", - "b": "0x2ccd10e13d42d40000000000", - "cmp_a_b": 1 + "a": "0xe225cc72f7ea53a332", + "b": "0x6e00f7bdf32484f2d7aba085f144e3c005090", + "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x86b97fab9b8a080000000000000000000000000000000000000", + "a": "0x146a4c07b2917", + "b": "0xbf1d0524adfc67e8e1ad3b6e49973b968dffc41637b9ed5a5170", "cmp_a_b": -1 }, { - "a": "0x6b71ef", - "b": "0x22528130df329a0000000000000000000000000000000000000000000", + "a": "0x7f43a09c913c2f4875a582b8e082b", + "b": "0x40304a6edc45d832328d62e1c56f796e8e988092693df6f2772563", "cmp_a_b": -1 }, { - "a": "0x5518c177383da0000000", - "b": "0x51", + "a": "0x1afcac793c5d14b75c70ebefb83", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0xb9d748144f822000000000000", - "b": "0x543d70b22", + "a": "0x54d492f9c5b909e6259237eeb", + "b": "0x108a177", "cmp_a_b": 1 }, { - "a": "0xc0c08ab78fc070000000000000", - "b": "0x409ff", + "a": "0x2e84d9df46b60b22c3f5a312cb64", + "b": "0x14454d55b9bd8ecbca", "cmp_a_b": 1 }, { - "a": "0x8", - "b": "0x435df5bcfa9b44000000000000000", + "a": "0x15c508820f7fb1d", + "b": "0xd1fb8d62f5fb2cd52dbd368a17206f7764f428396c400b90267587d7", "cmp_a_b": -1 }, { - "a": "0x1cf", - "b": "0x4b47d2703d09f000000000000000000000000000000000000000000000000000", + "a": "0x7", + "b": "0x389525bb152c0aae026e2c6663ca8587dc6ccbf376b27", "cmp_a_b": -1 }, { - "a": "0x27a20345", - "b": "0x7544cd34f09a7400000000000000000000000000000000000", + "a": "0xc9e98f7d999b5cba6aa2e527381", + "b": "0xa813852115960aa5155cc60a46a8d2d7136340b64cdb0c51e5dc5ec24f0614", "cmp_a_b": -1 }, { - "a": "0xc708e142b", - "b": "0x1ddb64d480d4850000000000000000000000000000000", + "a": "0x1c40ad46cfa0269d7dd566b3", + "b": "0x529dccdb8b7e7d14a8bbbe3e702b6", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x5887fbc274dd2000000000000000000000", + "a": "0x7", + "b": "0xab10b2606b657a5097", "cmp_a_b": -1 }, { - "a": "0xfbec51ad8d2f280000000000000000", - "b": "0x3316a88573510a000000000000000000000000000", + "a": "0x1fd25f46a0ec3371f3f53f", + "b": "0xf8770088ab5f4f3b7e5beaf654fecd81df7030199896edd19f1182cfc18599", "cmp_a_b": -1 }, { - "a": "0x1dcb524014d4ff0000000000000000", - "b": "0x2699324f729408000000000000000000", - "cmp_a_b": -1 + "a": "0x306d5f2e", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x960f3a7c10c280000", - "b": "0x13959271c4fa23000000000000000000000", + "a": "0x0", + "b": "0x1a96affab38de8dde6b13d354de5ff7cae8fbcba9b8ad", "cmp_a_b": -1 }, { - "a": "0x6603405670d2ac0", - "b": "0x5d15e90908175400000", + "a": "0x7c27fcec9", + "b": "0xddb", + "cmp_a_b": 1 + }, + { + "a": "0x18255da1", + "b": "0x1bd9358c567dc6723569b504ff5e14179e0b89a857c840f83464a92", "cmp_a_b": -1 }, { - "a": "0x9103b3cdec8a980000000", - "b": "0x91684a746b71600000000000000000000000000000000", + "a": "0x104135b97b0c1", + "b": "0x99d8c52567622b3634965843ed94a7307a", "cmp_a_b": -1 }, { - "a": "0x37ebc17631936e000000000000", - "b": "0x2cc69e642730ca0", - "cmp_a_b": 1 + "a": "0x9dbc900", + "b": "0x330bbc8c2c936bb02d33a78ba78ef", + "cmp_a_b": -1 }, { - "a": "0x33ba3903612094", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x1d7d47712c7fbb1ab03036f", + "b": "0x1e013ce6c3b355ce8cf1f460f5f4f6dba1e2252d49201627a0fc8323e99fa0d9", + "cmp_a_b": -1 }, { - "a": "0x8a0fc990f73e30000", - "b": "0x6802f45c3b4b5", + "a": "0x31b87f01b8d3425", + "b": "0x1865806f11c4", "cmp_a_b": 1 }, { - "a": "0x682dff8c5786d800000", - "b": "0x8f63c1f347a2e800000000000000000000000000000000000000", + "a": "0x48e4e37a27e1fc0537c", + "b": "0xdc8f926e3ce5bdb7aeb859dee7e655ca4a9907dff63570f09e4021cf7540fc06", "cmp_a_b": -1 }, { - "a": "0x11b23a81957db900000000000000", - "b": "0xcf77daa358bc9000000000000000", + "a": "0xd85c8d", + "b": "0x170c6522dc65aec806cc916f072f0c09623217260726809b14f95219a05", "cmp_a_b": -1 }, { - "a": "0x37933c3fc9039e00000000000", - "b": "0x2d032ea69f090e0000000", - "cmp_a_b": 1 - }, - { - "a": "0x2759c9970b94240000000000000", - "b": "0x195ce20b310d3300000", - "cmp_a_b": 1 + "a": "0x520c34a9bc26", + "b": "0x520c34a9bc26", + "cmp_a_b": 0 }, { - "a": "0x1a67ae99d9a95a00000000", - "b": "0x16121ee6f57", - "cmp_a_b": 1 + "a": "0x1b4fca0409d5", + "b": "0x45597fc0b833d8e0", + "cmp_a_b": -1 }, { - "a": "0x4b920248d051c4000000", - "b": "0x77569da6c36044000000000000000000000000000000000000000000", + "a": "0x100b60", + "b": "0x1c68519566dc3f0f80", "cmp_a_b": -1 }, { - "a": "0x1f10d0bd62577a0000", - "b": "0x2d99434f3b3b440000000000000000", + "a": "0x0", + "b": "0xeb20a321a9436b61b4648f8736daeb1d1f93bd2a18308b", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x0", - "cmp_a_b": 0 + "a": "0x425d85f536e", + "b": "0xa604739568a861d0819f55e17b6", + "cmp_a_b": -1 }, { - "a": "0xbb105832a844780000000", - "b": "0x3b86309d7e6eca000000000000000000000000000000000000000000", + "a": "0x9c935d2833", + "b": "0x1ad636760068ec5604dc1ca0ea6a793d78926d1f072876ded9b01237210b", "cmp_a_b": -1 }, { - "a": "0x29208061b842b60000000000000000", - "b": "0xebad18aa29e44800000", + "a": "0x3f62dd7fe77d64c4d58f8da57aa8c5", + "b": "0x1494bcaa17265adf946fc", "cmp_a_b": 1 }, { - "a": "0xd0d1cd9cde1688", - "b": "0x24f448aae044c40000000000000000", + "a": "0x4145fdac", + "b": "0x19a32f3581510e6c39", "cmp_a_b": -1 }, { - "a": "0x19", - "b": "0x1a60caa82f0d180000000000", + "a": "0x6b71ef47", + "b": "0xf9eb9a25971a3732b5fc3f7b7826d952a3176216af61cbb6ecc64000c8e2", "cmp_a_b": -1 }, { - "a": "0x25bbe7cc3e41be0000000", - "b": "0x887d7d0e38", - "cmp_a_b": 1 - }, - { - "a": "0x303c5ad", - "b": "0x17290a92d7292f0000000000000000000000000000000000000", + "a": "0xa09dfd24b6567b63d4ff318dcaf3", + "b": "0x1a979697c4996622d8f129498c561d25", "cmp_a_b": -1 }, { - "a": "0x1c265477fc08650000", - "b": "0x1f00a24974fa190000000000000000", - "cmp_a_b": -1 + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 }, { - "a": "0x880185fd537", - "b": "0xcbab7632e1e7a000000000000000000000000000000", + "a": "0x59", + "b": "0x2d245e403a8aa2793d8fde967a04e3", "cmp_a_b": -1 }, { - "a": "0x273fb67fac78b400000000000", - "b": "0x1d6f0535d968f60000000000000000000000000000000000000000000000", + "a": "0x3958c5d10", + "b": "0x32ec7e2dbbbb964726b0eb1ccbb9d2aec40624cfd6b6", "cmp_a_b": -1 }, { - "a": "0x2fb5768c489b", - "b": "0xbab6f93ffdf270000000000000000000000000000000", + "a": "0x6da8", + "b": "0x6bb579e703aa4ca3b842f67c3ade4ea326d27001", "cmp_a_b": -1 }, { - "a": "0x4ee52e22123b40000000000000000", - "b": "0x111ef71a48769c000000000000000", + "a": "0xf5a4405db9313b28450c5633", + "b": "0x6f", "cmp_a_b": 1 }, { - "a": "0x194f7e4", - "b": "0x130d59aac2b3ba0000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x4a4c593b9cb94ddd41accc", + "b": "0x19e0e152d6", + "cmp_a_b": 1 }, { - "a": "0x7b2a1e0", - "b": "0x189379608f87c9000000000000000000000000", + "a": "0x579addfc4b0270b156e7f2504aa4", + "b": "0x2879a04423b74032a55fca3b1b89b786b981becad7486a7c96f24", "cmp_a_b": -1 }, { - "a": "0x25d1f156932e5000000000000", - "b": "0x3480eff649a95c0000000000000000000000", + "a": "0x1fcd02594acb696e3a4b", + "b": "0x52a6ba4754f05e69f92aaf1b7442debf1af3b56a177748d0f0d8b78223ece4", "cmp_a_b": -1 }, { - "a": "0x6f5fdc8c074df8000000", - "b": "0xb372cefd4ce740000", - "cmp_a_b": 1 + "a": "0x1cb26af5e9b04cc7ff2617805dc296", + "b": "0x185f87085147b20c0b3eb5a9b2852b93c9a37c186f1e4f1d", + "cmp_a_b": -1 }, { - "a": "0x13089b55eea7a400000000", - "b": "0x348d1b3bf079a80000000000000000000000000000000000000000000", + "a": "0x49c3180", + "b": "0x6e4f827d6f3ed", "cmp_a_b": -1 }, { - "a": "0x30ca904d6f4df80000000000000", - "b": "0x428474b839b9fc0000000000000", + "a": "0xd14", + "b": "0x2117d4ed953c7d74f78ab79337154c", "cmp_a_b": -1 }, { - "a": "0x98c11e2d0f049", - "b": "0x3037a0a9e56f4400000000000000000000000000000000", + "a": "0x84", + "b": "0x763f933a5d3e50012c6195463", "cmp_a_b": -1 }, { - "a": "0x277283fc1c00000000000000", - "b": "0x1aa71", - "cmp_a_b": 1 + "a": "0x9dfb", + "b": "0x9dfb", + "cmp_a_b": 0 }, { - "a": "0x108bdacfca27850000000000", - "b": "0x0", + "a": "0x305ea7690ca1638d8d984e02a19515", + "b": "0x5fb384f3ee8ec67dbd274f42a02", "cmp_a_b": 1 }, { - "a": "0x1613571ada1cfc00000000000000000", - "b": "0x4b8235c47941140000000000000000000000000", + "a": "0x3b9ce70ca356ec9ff", + "b": "0x5964665d1a9c429ce", "cmp_a_b": -1 }, { - "a": "0xa338616201b0", - "b": "0x7b2", - "cmp_a_b": 1 + "a": "0xa69aae8ec0fbb7047ead31f", + "b": "0x4dbbee3d54999b08b6236bc16884af6099165e7296d7d656894095bf3bc18e3b", + "cmp_a_b": -1 }, { - "a": "0xdc19de", - "b": "0x21a7e3a44ce7340000", + "a": "0x1b71fd8e1a732ed0", + "b": "0x75aec945d222135219ac9b44be1f4c7", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x0", + "a": "0x114d91", + "b": "0x114d91", "cmp_a_b": 0 }, { - "a": "0x1", - "b": "0x6297a8c73c6bf", + "a": "0x4206b45923e60661cd024b8", + "b": "0x168a76e313a6a4931c4c8e2ec0fbc8501a98310de3746f3", "cmp_a_b": -1 }, { - "a": "0x275fcf67fc5ed400000000000000000", - "b": "0xa716c16f23ecc800000000000000000000", + "a": "0x777a9304eb", + "b": "0x615f33cf6e0379f6ac9ec7c53bb8e5dd", "cmp_a_b": -1 }, { - "a": "0x17d760f521", - "b": "0x29e9370ee6033a0000000", - "cmp_a_b": -1 + "a": "0x262fac0a824", + "b": "0xe2ca77631f", + "cmp_a_b": 1 }, { - "a": "0xa1d7d7b7d32bf0000000000", - "b": "0x354ee39b36559c00000000000000000000000000000", + "a": "0x10901ccb9ef90048b2b2caf545c", + "b": "0x173f94e180c0a", + "cmp_a_b": 1 + }, + { + "a": "0x57cb3ec71d4e71", + "b": "0xcc095da7733b1b62b5df62d9098e3fb5c0c54cc68f39494293", "cmp_a_b": -1 }, { - "a": "0xfd9c68beb3b610000000000", - "b": "0xfd9c68beb3b610000000000", - "cmp_a_b": 0 + "a": "0xefc4023633bfc6b8618b1aec", + "b": "0x9b38cdf880fb0f6c4246dacd61a44ce3dabdf8cbd", + "cmp_a_b": -1 }, { - "a": "0x279c0addd67fca0000000", - "b": "0xa0e81d40", + "a": "0x76deabfe5554435bb0c", + "b": "0x641751a547aea5e396", "cmp_a_b": 1 }, { - "a": "0x890ae04d1b5700000", - "b": "0x39ad9f999101f80000000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x86a940e7fb0b", + "b": "0x86a940e7fb0b", + "cmp_a_b": 0 }, { - "a": "0x5030bed9", - "b": "0x672af34f4aec0400000000000000000000000", + "a": "0x2", + "b": "0xd6eec21119162090db188bbbaad8054c232f2c943c24", "cmp_a_b": -1 }, { - "a": "0x170f83735e40", - "b": "0xdc65480c50cfa00000000000000000000000000000000000000000000000", + "a": "0x4384620497861d", + "b": "0x122cd6ba36aafc551c565afac6b47d52e4b3243e826d9df4a8", "cmp_a_b": -1 }, { - "a": "0x2c466f028b03b6000000000000000", - "b": "0x4712e6c4908120", - "cmp_a_b": 1 + "a": "0x5cf3", + "b": "0x18c16f23acde60fe8a4b219386a76e102d45908e4ea8c4a3af7c60122e2", + "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0xb153ea5921b0b800000000000000000000000000000000000000000000000", + "a": "0xa442a", + "b": "0x525ecc9fcb5d5a0c8cdd1365fa08ffc23b473f", "cmp_a_b": -1 }, { - "a": "0xb345f4d4", - "b": "0x1d6e8721b6c", + "a": "0x3a41445638", + "b": "0x13f05a5b593eabcc034d70e1112eb2b07d035ffbb426c8b", "cmp_a_b": -1 }, { - "a": "0x129a82672d1ada000000000000000", - "b": "0x3ed81d51b353ec0000000000000000000000000000000", + "a": "0x7fb96cb8774a", + "b": "0x8cfde88c6c801834832c5bbc9cd7c0afab3abb242add286f2b43ce7", "cmp_a_b": -1 }, { - "a": "0x3b", - "b": "0x7b174791f2e26000000000000000000000000", + "a": "0x289b", + "b": "0x9dac93e75a60c9441dcfa5beada5f9dc51545d27c68d1234", "cmp_a_b": -1 }, { - "a": "0x2c807993e2cf6c000", - "b": "0xbc0043faeabae", + "a": "0x333655c3ecc90b83e6979655fe6632", + "b": "0x1ec76ff341bab9647d12b", "cmp_a_b": 1 }, { - "a": "0x4a1fa5dde5ce30000000", - "b": "0x142bb895a9e3fe0000000", - "cmp_a_b": -1 + "a": "0x1865c4f7af3edb5a75402a", + "b": "0x171a6ff307f8e65f85bad", + "cmp_a_b": 1 }, { - "a": "0xa087654779be1800000", - "b": "0x26ebebc09eab120000000000000000000000000", - "cmp_a_b": -1 + "a": "0x69b148299e38bef76cf0c", + "b": "0x69b148299e38bef76cf0c", + "cmp_a_b": 0 }, { - "a": "0x1748792b2c6", - "b": "0x182f9aa375d9", + "a": "0x15c0c251d276da6afd42e", + "b": "0x4488df0e07fd42d0030ba7c79cf20ca15488047c79", "cmp_a_b": -1 }, { - "a": "0xc60b4cf5c2e50000000000000000000", + "a": "0x366ab7", "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x160c20696583fc0000000000", - "b": "0x7c507", + "a": "0x170fa928571bdbe031b205059890462", + "b": "0x78c1f6fb10fe4464cf224", "cmp_a_b": 1 }, { - "a": "0x968cbdc348", - "b": "0x9952a0df0cf4580000000000000000", + "a": "0x280c9d9237d90d116ed", + "b": "0x1445f38bbd5446747962ebcab7175fab24c22d79489aa1", "cmp_a_b": -1 }, { - "a": "0x2eb5ae9926fc", - "b": "0x5c70ff1b84850800000000000000000000", + "a": "0xd536735", + "b": "0x15843b1663365083bc3f7cc4a7ec290b3ce2537341b589f816a80ef6e40f9410", "cmp_a_b": -1 }, { - "a": "0x20de53c8a60a140", - "b": "0x20de53c8a60a140", - "cmp_a_b": 0 + "a": "0xef58afec4b665ba171a31959bdbf", + "b": "0x1d6fbe0cbeeea6892c32b8de7ed458e197a6d5ca7227e4015", + "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0xc1fa9526d4d5800000000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x16468fea4d96f9215", + "b": "0x0", + "cmp_a_b": 1 }, { - "a": "0x4355a6082", - "b": "0x37bffef0441a9a000000000000000000", - "cmp_a_b": -1 + "a": "0x4ec0be25a7e7fc13080", + "b": "0x4ec0be25a7e7fc13080", + "cmp_a_b": 0 }, { - "a": "0x1a518bb52e88f00", - "b": "0x5ab02dd521626c000000000", - "cmp_a_b": -1 + "a": "0x3387deb32e837e80b245d5283b66", + "b": "0x72a", + "cmp_a_b": 1 }, { - "a": "0x356", - "b": "0x2c8925432d9fba000000000000000000000000000000000000000000", + "a": "0x17dfdf7173c24aa16674ae770", + "b": "0x5e869e8ab987cf346f0b4cfaa27411d3ca96c200e76f2c03a5974785ce9aacfe", "cmp_a_b": -1 }, { - "a": "0x50ff6061fa0c780000000", - "b": "0x8ba31e2774bb18000000000", + "a": "0x7bdcaef3b5fe68c", + "b": "0x1ccf2374ced79c681319c0786d", "cmp_a_b": -1 }, { - "a": "0x11a003cc0ae93a000000000000000", - "b": "0xc4b312fbe7abe0000000000000000000000000000000000000000000", + "a": "0x5cf", + "b": "0x679148877865c6797314c91d5d0c43dad83064a12888", "cmp_a_b": -1 }, { - "a": "0x387", - "b": "0x235470f26a25c200000000000", + "a": "0x1e89", + "b": "0x155a80402f4c9888d100b22627ea700202c9cb0d7", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0xb6d6", + "a": "0x984a55b830f72b", + "b": "0x145ebb09936eb587a331d", "cmp_a_b": -1 }, { - "a": "0xfdc", - "b": "0x87c", + "a": "0x2775", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x2ce4c04465186400000000000000", - "b": "0x2dcaa8a00104a6000000000000000000000000000000000000000", + "a": "0x75978c02b21c289c857", + "b": "0x38b60186a2521b5668fa1136fdb385faa84d67c31af3257691f", "cmp_a_b": -1 }, { - "a": "0x83eed85d2049100000000000000000", - "b": "0x27aa9bed5526ae00000000000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x1c0cf67dc08888974", + "b": "0x1c0cf67dc08888974", + "cmp_a_b": 0 }, { - "a": "0x7b4076e86176d40000000", - "b": "0x1c485cc578a96000000000000000000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x377c305d926e2e09d6a4316a8e42ef7", + "b": "0x1dac52b2e24f5f043d01f38c1fc", + "cmp_a_b": 1 }, { - "a": "0x31381c", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x2af89", + "b": "0x35714b6dca53d6d125d34ba554ec957b9204ada", + "cmp_a_b": -1 }, { - "a": "0xa97b361a41287", - "b": "0x27e694c", + "a": "0x60f1e933f2a1206ec537", + "b": "0xa9c7a491815c28ac", "cmp_a_b": 1 }, { - "a": "0x4603f65fb5390000000", - "b": "0x8144ac8f577ea800000000000000000000", - "cmp_a_b": -1 + "a": "0x1718684e3667376a54ddd7b460fc7e8", + "b": "0x1718684e3667376a54ddd7b460fc7e8", + "cmp_a_b": 0 }, { - "a": "0x13f1f20cd31ea5000000000", - "b": "0x13f1f20cd31ea5000000000", - "cmp_a_b": 0 + "a": "0xe57887fd9d0f1", + "b": "0xb81296cb432ceaa7f88536231fe0a7395904450c9b25b37a6", + "cmp_a_b": -1 }, { - "a": "0x43fb72190fe54c0000000000", - "b": "0xe1b", - "cmp_a_b": 1 + "a": "0x8d7333d1", + "b": "0x183607cbd711290c6334c5a207be4646a3e5fb9298579f64a87", + "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x6e4e3690d5bff4000000000000000000000000000000", + "a": "0x190ec9831a86613311fdcd5b4ac6321", + "b": "0x1f4b2b72db8f278400c99c1620d7c7f2e2d028e0228a42b", "cmp_a_b": -1 }, { - "a": "0x11820d5c3d3a100000000", - "b": "0x3a813ee73873ee000000", + "a": "0x6b2e74c24fd6cc987f89b12f827f", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x4", - "b": "0x199e65acf1324c00000000000000000000000000000000000000000000000000", + "a": "0x8e511f8dd5", + "b": "0x30e3dbc0d5366996f4e6f42097bc0ad9bb54", "cmp_a_b": -1 }, { - "a": "0x35ff", - "b": "0x34", - "cmp_a_b": 1 + "a": "0x14b6fe081a379697", + "b": "0xf60ac20b4aa8608acd5cfc10c5a048bb8af2cec59367bb1d", + "cmp_a_b": -1 }, { - "a": "0xca760d929e5a0000000", - "b": "0x42f8ff40cbee4000000000000000000000000000", + "a": "0xe3257692a64a207cd20306", + "b": "0x373b0830e897f96ca2f45f3073337754ea", "cmp_a_b": -1 }, { - "a": "0x9c5b3", - "b": "0xcb60fbc77ab6a00000000000000", + "a": "0x15a490061a0b51a25bd01a24", + "b": "0x4469d573e47cf617611c554bf2f8075d8", "cmp_a_b": -1 }, { - "a": "0x85819b948e60f00000000000", - "b": "0x1db47f11f8f119000000000000000000000000000000000000000000000", + "a": "0x315691cf8f71da5a843", + "b": "0x315691cf8f71da5a843", + "cmp_a_b": 0 + }, + { + "a": "0x3ecd15c256fa3d", + "b": "0x66535ef26bbe02b3d2a4ed8a58399fe059ca3b85b99b53ff7c", "cmp_a_b": -1 }, { - "a": "0xb1a54c3b6dad", - "b": "0x510b2e085c31e00000000000000000000000000000000000000000", + "a": "0xcdfecfa1a127f6958cc", + "b": "0x7395a74b848139c56b39a2f", "cmp_a_b": -1 }, { - "a": "0x32b175", - "b": "0x590782231e8ae8000000000000000000000000000000000", + "a": "0x533adf2e0b988824c4057b6d10a", + "b": "0x6195aa6a7f", + "cmp_a_b": 1 + }, + { + "a": "0xcdf61bbc81b3", + "b": "0x196eb415324919eae2141e97856d3b2ea5960ae3f15c", "cmp_a_b": -1 }, { - "a": "0xcd8f7d7578", - "b": "0x6791cd5a373f1000000000000000000000000000000", + "a": "0xd15036f72496c4f1143360e40ea6", + "b": "0x4b91012f82def266612a149baa4a81b9903", "cmp_a_b": -1 }, { - "a": "0x3", - "b": "0x6322c904531d1c000000000000000000000000000000000000000", + "a": "0x15", + "b": "0x916c17463", "cmp_a_b": -1 }, { - "a": "0x2", - "b": "0x59dcf99628f6a8000000000000000000000000", + "a": "0x3789a37", + "b": "0x1713516d2ff6aaabd27", "cmp_a_b": -1 }, { - "a": "0x675e2aebd1f98400000000000000000", - "b": "0x3cf516501594660000000000000000000000000000000000", + "a": "0x664d71", + "b": "0x1f7c77b8083de1199d2f1d66b6e6302f411eeb2aa", "cmp_a_b": -1 }, { - "a": "0x6c35c7155b1", - "b": "0x6c35c7155b1", - "cmp_a_b": 0 + "a": "0x64a93bc0e", + "b": "0x53f5b71fd78c93129e6b0e0ec", + "cmp_a_b": -1 }, { - "a": "0x3e70dc1886c3a6000", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x6d0f", + "b": "0x6d0f", + "cmp_a_b": 0 }, { - "a": "0x47a6199", - "b": "0x3158280", + "a": "0x3e172ed3d6a0170653", + "b": "0xc94e0ea33e453f8", "cmp_a_b": 1 }, { - "a": "0x3b95", - "b": "0x44f0c90715876000000000000000000000000000000000000000000000000000", + "a": "0x1a504f9c948d77365ff49dcf3", + "b": "0x884f922e34585954a853c4c68960203fa7", "cmp_a_b": -1 }, { - "a": "0x48a7921739", - "b": "0xb7b55251", + "a": "0x51531296c7d4faf7a2a9a3", + "b": "0xf77d9d", "cmp_a_b": 1 }, { - "a": "0x363dcc9f729912000000000", - "b": "0x279f1", - "cmp_a_b": 1 + "a": "0xdf4c12fd74c669f0c532d808f363616", + "b": "0xdf4c12fd74c669f0c532d808f363616", + "cmp_a_b": 0 }, { - "a": "0x13b912a9a1eada000000000", - "b": "0x12f5bd2ecf41440000000000000000000000", + "a": "0x1f9786ee89fbcec5", + "b": "0x1ea8f2c013c74bd12ac70876404e501782d5d1fca5", "cmp_a_b": -1 }, { - "a": "0x8fa7d", - "b": "0x3d7984d43d812a000000000000000000000000000", + "a": "0x0", + "b": "0x9b581cd7075bd9310ff6db8975", "cmp_a_b": -1 }, { - "a": "0x2f8275cd91751a0000000000", - "b": "0x34c56cb5eeccd000000000000000000000000000000000000000000000000", + "a": "0xb721c124007bad6d11b07b", + "b": "0xb6f8c4a7aa12dcd95fa557f0417e051a", "cmp_a_b": -1 }, { - "a": "0x3dd962ba2b", - "b": "0x27a3a4", + "a": "0x1a5cb89e54f", + "b": "0xd", "cmp_a_b": 1 }, { - "a": "0x1207f739d045c60000000000000", - "b": "0x3949054ce72b4a0000000000000000000000000", - "cmp_a_b": -1 - }, - { - "a": "0x2e1395cb09e2b6", - "b": "0xfa92d32fc89d080000000000000000000000000", + "a": "0xc59b0f8e9b42d131494", + "b": "0x26a5a2becb1035b262bf187", "cmp_a_b": -1 }, { - "a": "0x8951a2a439e7e8000000000000000000", - "b": "0xc4eb18ca825f3000000000000000000000000000000000", + "a": "0x18c87d282dc8e7db8476f98", + "b": "0x4d1572781ad1237b9cb0a710e8d468871be7b3", "cmp_a_b": -1 }, { - "a": "0x3f90cd58f70fb00", - "b": "0x7296b804ce9f7800000000000000000000000000000000000000", - "cmp_a_b": -1 + "a": "0x17dc29c17b107c09d01e4f9da016", + "b": "0x35e88bdb89adb499afe7", + "cmp_a_b": 1 }, { - "a": "0x16", + "a": "0x576d9ae539efbe217b708f89a3d17f9", "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x2b423a79aab804000", - "b": "0x81d2ce1211edc8000000000000000000000000000000000000000000000000", - "cmp_a_b": -1 - }, - { - "a": "0x3a774eceeb", - "b": "0x49f441122273bc000000000", + "a": "0x1fa87398d605286f98df9f", + "b": "0x1463ab4bbcea778672f2f04", "cmp_a_b": -1 }, { - "a": "0xd4e694a6", - "b": "0x209d93c3d7a83e0000000000000000", + "a": "0x0", + "b": "0x3173ff222fcbc41", "cmp_a_b": -1 }, { - "a": "0x108437222ad2be000000000", - "b": "0x822bec09f7", - "cmp_a_b": 1 - }, - { - "a": "0xb59c5089e", - "b": "0xa95deef2d42680000000000000000", + "a": "0x769c3f7c", + "b": "0x3f1dbe40d5f6b2a1f87eda697121769de8cdf60467ecff2c51e55a3b1", "cmp_a_b": -1 }, { - "a": "0x2698", - "b": "0x0", + "a": "0x145e487bdc5c16154", + "b": "0xa2ff", "cmp_a_b": 1 }, { - "a": "0xa61b4be834343800000000000000000", - "b": "0x5d517c8982fec8000000000000", - "cmp_a_b": 1 + "a": "0x319e730069cf40c308f491b8e1f180", + "b": "0x319e730069cf40c308f491b8e1f180", + "cmp_a_b": 0 }, { - "a": "0x0", - "b": "0x0", - "cmp_a_b": 0 + "a": "0x36348f999f877e763a31cb", + "b": "0x4864c0602a2fa763361dd7a167db7a95b0506ff65fbb42f850682d", + "cmp_a_b": -1 }, { - "a": "0x18c4ae349a", - "b": "0x18c4ae349a", + "a": "0x1cfc262f886c786032", + "b": "0x1cfc262f886c786032", "cmp_a_b": 0 }, { - "a": "0x30c9e4f89e3e2e00000000000000", - "b": "0x83a8484b2922f000000000000000000000000000000000", + "a": "0x6abd9524b386f77907951cdfe5fef", + "b": "0x219e877e260f6a3dbb1d2ffe649bdbe9c598af1f9231", "cmp_a_b": -1 }, { - "a": "0x3851c72933511", - "b": "0x22ab062cbe41ee0000000000000000000000", + "a": "0x4e3", + "b": "0x17f69a618cc6e14bb316c9962f5536b12795d8c6f6a89c114836c366df2", "cmp_a_b": -1 }, { - "a": "0xca37077035d7c800000000000", - "b": "0x1b263b6410711f0000", + "a": "0x143ae21fce4285660b15a6", + "b": "0x19", "cmp_a_b": 1 }, { - "a": "0x27b04c3a5097", - "b": "0x1e6bbc97e04b430000000000000000", + "a": "0x83cc1a", + "b": "0x216afa1504cd44544f217710c06098443e6fc", "cmp_a_b": -1 }, { - "a": "0x50baa4c327d7700000000000", - "b": "0x51dd3e8951ac28000000000000", + "a": "0xfde01025", + "b": "0x7306bd8f4528b55e3", "cmp_a_b": -1 }, { - "a": "0x12329f1494eea400000000000000", - "b": "0x8fa1c4010d47300000000000", - "cmp_a_b": 1 + "a": "0x24cd48c6fe70", + "b": "0x2a0b18c1478aa2e9cb07e424337ae6fd9", + "cmp_a_b": -1 }, { - "a": "0x13004772ecfd34000000", - "b": "0xe188358696efb800000000000000", + "a": "0x1ab93324fbfcc7c69fd7b", + "b": "0x1ab93324fbfcc7c69fd7b", + "cmp_a_b": 0 + }, + { + "a": "0x467148233f225", + "b": "0x10a15ab14f2303a65bcf31bb70e32a3fe5b348", "cmp_a_b": -1 }, { - "a": "0xa5f1c9179aae1", - "b": "0x0", + "a": "0x387277dbbd7f1f", + "b": "0x387277dbbd7f1f", + "cmp_a_b": 0 + }, + { + "a": "0x11389a758c9aba0bd9b99d09968dbf", + "b": "0xcb4e999c", "cmp_a_b": 1 }, { - "a": "0x65fa459784759c00000000000000000", - "b": "0xb345d8f73e82580000000000000000000000000000", + "a": "0x1fb3", + "b": "0x19134b0d2df78abe0c919b", "cmp_a_b": -1 }, { - "a": "0x11d8347", - "b": "0x5362bcebf7e608000000000000000000000000000000000000000000000000", + "a": "0x16ea79ccaa", + "b": "0x4f65006a22296c0fe488fccf2b9c24540f994", "cmp_a_b": -1 }, { - "a": "0x381472e460c16c000000000", - "b": "0x2647d15be268a2", - "cmp_a_b": 1 + "a": "0x1c", + "b": "0x1dccbda7eac1ccc006ff59cb41f7240466f292565742", + "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x1ccd2e68f", + "a": "0xd37bab", + "b": "0xb6d324d87f9a4eae00c5567c40ad8c9ba8a01f40d8bb29e09cc1cd5ec75ef22", "cmp_a_b": -1 }, { - "a": "0xc97f78e893c1f0000", - "b": "0xb2a3d5f4395e58", - "cmp_a_b": 1 + "a": "0x253bb045a69", + "b": "0x6a7645053803391bf", + "cmp_a_b": -1 }, { - "a": "0x8", - "b": "0x0", + "a": "0x4c5b41c97a3d3689f23e47e93de54ac", + "b": "0x2fded8", "cmp_a_b": 1 }, { - "a": "0x427c0709", - "b": "0x27e", + "a": "0x2a799ba61bc6a6a", + "b": "0x2858f6fa76a", "cmp_a_b": 1 }, { - "a": "0x26f730a22cb9ae0000000000000000", - "b": "0x1448657a4dce5b0000000000000000000000000000", + "a": "0x3ab26e1fe5", + "b": "0x13e93b55ce618853026e6f786cbdfb39b28c365", "cmp_a_b": -1 }, { - "a": "0xba00a", - "b": "0x13c", + "a": "0x13581f5", + "b": "0x2f41e7", "cmp_a_b": 1 }, { - "a": "0x148c0598972e5c000000000000000", - "b": "0xff0fe65522ce18", + "a": "0x7f60a4", + "b": "0x0", "cmp_a_b": 1 }, { - "a": "0x8ab45", - "b": "0x2b20170b8e1d48000000000000000000000000000000000000000", + "a": "0x5", + "b": "0xd4ae43ce2ead992238b5bee6b8f54c30af5d38020", "cmp_a_b": -1 }, + { + "a": "0x2cc16ce994741a", + "b": "0xc1d29e", + "cmp_a_b": 1 + }, { "a": "0x0", - "b": "0x26e0d0165dbe80000000", + "b": "0x4", "cmp_a_b": -1 }, { - "a": "0x98dd774e", - "b": "0xfd81324718cd70000000000000000000000", + "a": "0x18cc266bcd366c2bf", + "b": "0x1b1555f0bcb3fc83858c861e9ae8", "cmp_a_b": -1 }, { - "a": "0xba697d4cd5", - "b": "0xc2cce886ef0248", + "a": "0xa2", + "b": "0x2ac3cf4b8560435593346cc18ee924f891955ce36f560d231a7e2a14e6a", "cmp_a_b": -1 }, { - "a": "0xca3fc518ae70300000", - "b": "0xca3fc518ae70300000", - "cmp_a_b": 0 + "a": "0x1a5870a8965a1105ea1", + "b": "0x1a595789f56615a99384afa0f7f223d6244dee31df2ca35", + "cmp_a_b": -1 }, { - "a": "0x6454a9ee4655180000000000", - "b": "0x6c5a49218671880000000000000", + "a": "0x42feec565e63fac08146daaca149e", + "b": "0x58910fdf72f11b4d5e1c8a4bac6fe", "cmp_a_b": -1 }, { - "a": "0x6b892283e031a400000000000000", - "b": "0x6222df3e8b4870000000000000000000000000000000000", + "a": "0xb33ddab5abeb", + "b": "0xe207ef13dfa0cf984202be5fc6c7566f03d5f43", "cmp_a_b": -1 }, { - "a": "0x2dc9385b8b", - "b": "0x14b14f87fde584000", + "a": "0xd3b9ec2fe0a09ae80d49", + "b": "0xa728dfd6f94e3eb3d7a6621e989e19bd38fc", "cmp_a_b": -1 }, { - "a": "0x3fd784f", - "b": "0xcab3af75b88bc80000000000000000000000000", + "a": "0x132", + "b": "0x722bb5a3e7e614d304d15dea2fd66e", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x16cbb66b2d5a00000000000000000000000", + "a": "0xecfb426499d9815a0bdec45dc", + "b": "0x1fd4314dcbc91bfd8c56e54b4c797", "cmp_a_b": -1 }, { - "a": "0x14e7417", - "b": "0xa805e3ba9913e000000000000000000000000000000000", + "a": "0x32c5bfb", + "b": "0x3783f3f8d2826d2d7233ade97eabe224", "cmp_a_b": -1 }, { - "a": "0xba12962ecae05", - "b": "0x1a06", - "cmp_a_b": 1 + "a": "0xa1b66828431", + "b": "0xf0f941a3673c29053b9f85ec1a625", + "cmp_a_b": -1 }, { - "a": "0x2e0a6feee1d834000000000000000000", - "b": "0x255c39911caa22000000000000000000000000", + "a": "0x1a4feeb01c0e931b84d2c", + "b": "0x154b1bfeaced1d0f15aa8771e0705f02570eaec05ceef3419f0", "cmp_a_b": -1 }, { - "a": "0xd2e721a8e0f820000000000", - "b": "0x1f4e96d3cc9769000000000000000000000000000000000000000000000", + "a": "0x18e78801af00dc39269dd5fce7b6", + "b": "0x1c0a7be30c60f0fb9e7ed937f10504aaad0480ff3aeab", "cmp_a_b": -1 }, { - "a": "0xa9903f89af", - "b": "0x45404db6a8ae8c000000000000000000000000000000000", + "a": "0x3aaf9150643e0e670ff13", + "b": "0x3aaf9150643e0e670ff13", + "cmp_a_b": 0 + }, + { + "a": "0x3e35ae", + "b": "0x29377bab4f845be824be194e5fa74c", "cmp_a_b": -1 }, { - "a": "0x36", - "b": "0xc46a6ab37306980000000000000", + "a": "0x2c2ef960792efcde1e001f5675184884", + "b": "0x2a894b82cdea2eaa228a7b06adee50cb67f38e945", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x32cb93ccd", + "a": "0x4054f83bd4e54fcfd9cfd1495ee1", + "b": "0x4b48fd929aef31c8c8e70c32112d76317c3456203a9b70714", "cmp_a_b": -1 }, { - "a": "0x2cb2aa1bee5aa6000000000000", - "b": "0x25edee1770eec2000000000000000000000000000000000000", + "a": "0x2b4e", + "b": "0x7b1c43b6", "cmp_a_b": -1 }, { - "a": "0x281dbc436a35bc0000000000", - "b": "0xafc30", - "cmp_a_b": 1 + "a": "0xfa94e8c4e672e7d955b3e", + "b": "0xfa94e8c4e672e7d955b3e", + "cmp_a_b": 0 }, { - "a": "0xae6fb762f367580000000", - "b": "0xa9104bfe8531f000000000000000", + "a": "0xfec37e0678fece5f3e9795c7", + "b": "0xfb80f9fbbe94e5e9ccc3d72d89dbe0f8224e9d53b81793aa", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x0", - "cmp_a_b": 0 + "a": "0x40d9e2b83346aff263cc3ecb23cbd3b", + "b": "0x1cf05", + "cmp_a_b": 1 }, { - "a": "0x84b", - "b": "0x1ce2519129b67e0000000000000000000", - "cmp_a_b": -1 + "a": "0x9a6d650427d135e52bf91dcf", + "b": "0x9a6d650427d135e52bf91dcf", + "cmp_a_b": 0 }, { - "a": "0x17a67e0257ee7500000000000000", - "b": "0x1c3a474041e2900000000000000000000000000000000000000000000", + "a": "0x30d29a2737f98e33e", + "b": "0x397927cf741f2ba336459c2c0", "cmp_a_b": -1 }, { - "a": "0x0", - "b": "0x7c83eb3c974c8400000000", + "a": "0x1438f545dfde68", + "b": "0x75389071ff33b91ae5846557df05a099288c9636f71717897d0e5555603b8f7", "cmp_a_b": -1 }, { - "a": "0x1", - "b": "0x248ba10091f8200000000000", + "a": "0xedbe07bc6e473c6ef229140", + "b": "0x3ee095dc38023f8f2732df27323ad612dab1160be33", "cmp_a_b": -1 }, { - "a": "0x25d862a3a", - "b": "0x0", - "cmp_a_b": 1 + "a": "0x75732e2c8c68", + "b": "0x15c04d699a8d5551b56871aade84", + "cmp_a_b": -1 }, { - "a": "0x3e35a3185c784400000000000", - "b": "0x1fdaaf427b2a3a00000", + "a": "0x766a7a0ead7435635194", + "b": "0x271135c71085c269b7", "cmp_a_b": 1 }, { - "a": "0x192a4706ea54a90000000000000000", - "b": "0x192a4706ea54a90000000000000000", - "cmp_a_b": 0 - }, - { - "a": "0x14eedfb2aa3b6b00000000000000", - "b": "0x2002420c3fb7ce00000000", - "cmp_a_b": 1 + "a": "0x150be1", + "b": "0x2391b3e040a40d7582e0ab832e9e90e0445b04ef5b02d45649c5fe4a2a90", + "cmp_a_b": -1 } ] } \ No newline at end of file diff --git a/crypto3/libs/multiprecision/test/data/generate_test_data.py b/crypto3/libs/multiprecision/test/data/generate_test_data.py index 72c667598..baa3a7080 100644 --- a/crypto3/libs/multiprecision/test/data/generate_test_data.py +++ b/crypto3/libs/multiprecision/test/data/generate_test_data.py @@ -22,8 +22,8 @@ def generate_comparison_test_data(): def gen_arg(bits, rnd): if rnd.random() < ZERO_PROB: return 0 - log2 = rnd.random() * bits - result = math.floor(2**log2) + size = rnd.randint(1, bits) + result = rnd.randint(0 if size == 1 else 1 << (size - 1), (1 << size) - 1) assert result < 2**bits return result @@ -47,7 +47,7 @@ def gen_arg(bits, rnd): f.write(json.dumps(tests, indent=4)) -def generate_modular_comprehensive_test_data(): +def generate_modular_arithmetic_test_data(): ZERO_PROB = 0.05 MAX_BITS_PROB = 0.1 EQ_PROB = 0.1 @@ -57,9 +57,9 @@ def gen_arg(bits, m, rnd): if rnd.random() < ZERO_PROB: return 0 if rnd.random() < MAX_BITS_PROB: - return rnd.randint(2 ** (bits - 1), m - 1) - log2 = rnd.random() * bits - result = math.floor(2**log2) + return rnd.randint(1 << (bits - 1), m - 1) + size = rnd.randint(1, bits) + result = rnd.randint(0 if size == 1 else 1 << (size - 1), (1 << size) - 1) assert result < 2**bits return result @@ -73,7 +73,7 @@ def gen_arg(bits, m, rnd): ["montgomery_17", 0x1E241, 17], ] - with open(SOURCE_DIR / "modular_comprehensive.json", "w") as f: + with open(SOURCE_DIR / "modular_arithmetic.json", "w") as f: tests = {} for test_name, m, bits in params: assert math.ceil(math.log2(m)) == bits @@ -102,4 +102,4 @@ def gen_arg(bits, m, rnd): if __name__ == "__main__": generate_comparison_test_data() - generate_modular_comprehensive_test_data() + generate_modular_arithmetic_test_data() diff --git a/crypto3/libs/multiprecision/test/data/modular_arithmetic.json b/crypto3/libs/multiprecision/test/data/modular_arithmetic.json new file mode 100644 index 000000000..acbf386d3 --- /dev/null +++ b/crypto3/libs/multiprecision/test/data/modular_arithmetic.json @@ -0,0 +1,10012 @@ +{ + "prime_mod_montgomery_130": [ + { + "a": "0xfa0f7c1bd874da5e709d4713d60", + "b": "0xa48268673", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xfa0f7c1bd874da5e7141c97c3d3", + "a_m_sub_b_m": "0xfa0f7c1bd874da5e6ff8c4ab6ed", + "a_m_mul_b_m": "0xf4f50778fa99be5feb0268e19fad58df", + "a_eq_b": false, + "a_m_pow_b": "0x1e7293a2458dbb6ac7b9e7e8c1a5a670a" + }, + { + "a": "0x1e6f4590b9a164106", + "b": "0x1338f18f4ff31e78de5857", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x1338f376444c2a12f4995d", + "a_m_sub_b_m": "0x314107b9ef712bf8ff83405c7fe87316a", + "a_m_mul_b_m": "0x2a0524098f893293bad4b94983e631cd3", + "a_eq_b": false, + "a_m_pow_b": "0x18157a0e4b54e3412497ff27d79ef7bd7" + }, + { + "a": "0x1e2a8b7a1d5006", + "b": "0x9", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x1e2a8b7a1d500f", + "a_m_sub_b_m": "0x1e2a8b7a1d4ffd", + "a_m_mul_b_m": "0x10f7ee74b07d036", + "a_eq_b": false, + "a_m_pow_b": "0x1c58100bda8bcd0d7fab6ef89feac756b" + }, + { + "a": "0x1", + "b": "0x161d3", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x161d4", + "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fdadd4de6e9", + "a_m_mul_b_m": "0x161d3", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x1272ae2244", + "b": "0x1272ae2244", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x24e55c4488", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x15453dc5e8729062210", + "a_eq_b": true, + "a_m_pow_b": "0x27a267a006ee271ca41034a3c14f872f7" + }, + { + "a": "0x32a13ac08d1fd9b74d2b9deb1beb3711", + "b": "0x19347d966e1277", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x32a13ac08d1fd9b74d44d268b2594988", + "a_m_sub_b_m": "0x32a13ac08d1fd9b74d12696d857d249a", + "a_m_mul_b_m": "0x15123eb9ab84006176882e3bf9c546ce9", + "a_eq_b": false, + "a_m_pow_b": "0x127c709a36a17b2b3767771b8683f9f75" + }, + { + "a": "0x63dfabc08935ddd725129fb7c", + "b": "0x279fdef7c42930b33a81ad477fb3675b8", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x279fdef82808dc73c3b78b1ea4c607134", + "a_m_sub_b_m": "0x9a128c28f28da9548bd2a8d53342ce7f", + "a_m_mul_b_m": "0x12b7c80276dd665b6ac99411c88628243", + "a_eq_b": false, + "a_m_pow_b": "0xfc80d9bbe1bd09d33f2a2a4182c17eb7" + }, + { + "a": "0x44ec62b2c8", + "b": "0x18864a7a50b48d73f1d67e55fd", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x18864a7a50b48d7436c2e108c5", + "a_m_sub_b_m": "0x314107b8670db7e2eec022c2df333a586", + "a_m_mul_b_m": "0x49b09355ddb8142a62fe568cf6501ea1", + "a_eq_b": false, + "a_m_pow_b": "0x866cea796df2169fd9cad13686ccd5dc" + }, + { + "a": "0xeb5f52f323ca74", + "b": "0x84264653e37952d30bcab0e", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x84264653f22f48023e07582", + "a_m_sub_b_m": "0x314107b9eeee3941a63436a009fb66821", + "a_m_mul_b_m": "0xa83a6a8a5b0e2a5a712558f1d2d8b262", + "a_eq_b": false, + "a_m_pow_b": "0x1698f2a85e0010b268875e774b5d62f1" + }, + { + "a": "0x1aa422d2ba4b180", + "b": "0x125e2ebae3b16ec", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2d02518d9dfc86c", + "a_m_sub_b_m": "0x845f417d699a94", + "a_m_mul_b_m": "0x1e957948baedbbb19d37e4b94a200", + "a_eq_b": false, + "a_m_pow_b": "0x1cdbbdedef96a5f13aa00007ec1b7be8a" + }, + { + "a": "0x0", + "b": "0x109b0252440950fd131db53334", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x109b0252440950fd131db53334", + "a_m_sub_b_m": "0x314107b8e5c23a63b973ea2c7bf9a1587", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0xfaaf0e89", + "b": "0x3b", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xfaaf0ec4", + "a_m_sub_b_m": "0xfaaf0e4e", + "a_m_mul_b_m": "0x39c6585993", + "a_eq_b": false, + "a_m_pow_b": "0x240cb3ca052214958f84cc19c5bd36b76" + }, + { + "a": "0x2e221", + "b": "0x2e221", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x5c442", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x850424841", + "a_eq_b": true, + "a_m_pow_b": "0x1725b054b9bbcaac8df07dd473977caac" + }, + { + "a": "0xf795", + "b": "0xf795", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x1ef2a", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xef70dcb9", + "a_eq_b": true, + "a_m_pow_b": "0x50ae49883384ee748f8be576c3a9ea87" + }, + { + "a": "0xdbca4429817c5", + "b": "0x8edc470f0e7", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xdc592070908ac", + "a_m_sub_b_m": "0xdb3b67e2726de", + "a_m_mul_b_m": "0x7aa750a39fa4f4c4e7b622c3", + "a_eq_b": false, + "a_m_pow_b": "0x1380f6282309814709a567517904aa36d" + }, + { + "a": "0x278402d0baf", + "b": "0x19f75d9eae2025e82339e23dff3334b", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x19f75d9eae2025e8233a09c20203efa", + "a_m_sub_b_m": "0x3127105c50c43f6211e5c042f3d89211f", + "a_m_mul_b_m": "0x254d4ac94e6689981081abc6dec1b174f", + "a_eq_b": false, + "a_m_pow_b": "0x4aadb43956dddcd1d47fe361e6b7554e" + }, + { + "a": "0x18b5885ca0bb2c3f0", + "b": "0x2879efee464da90f534", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2892a576a2ee643b924", + "a_m_sub_b_m": "0x314107b9ef725f5f98ce941400e711777", + "a_m_mul_b_m": "0x2bd67f190cdb4161270525264f47c7014", + "a_eq_b": false, + "a_m_pow_b": "0x1b2cd6b5586c9cabb7185cc0ea1cdb66" + }, + { + "a": "0x40314aa451ca69cfb85d432f8db", + "b": "0x3cae3fca32c9b6f", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x40314aa451caa67df82775f944a", + "a_m_sub_b_m": "0x40314aa451ca2d2178931065d6c", + "a_m_mul_b_m": "0x22effdba37674f64450b181cb3b5a315f", + "a_eq_b": false, + "a_m_pow_b": "0x64b0e6b0786aa0d6b67abce456234a9e" + }, + { + "a": "0x7902a69acc70bf9c0efb5816b74", + "b": "0x7902a69acc70bf9c0efb5816b74", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xf2054d3598e17f381df6b02d6e8", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x1b6ef1298716d4a73bd092c809bc3fac4", + "a_eq_b": true, + "a_m_pow_b": "0x173608230a65c6fc7e97dfec832478152" + }, + { + "a": "0x1fd39f0909f6048fe245a4600004884c", + "b": "0x2cffa6cddf963a7efe00111e5d29dc5df", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2efce0be70359ac7fc246b645d2a24e2b", + "a_m_sub_b_m": "0x63e9adca07b8551fa2d432550ab60b28", + "a_m_mul_b_m": "0x1feb2c06cff1adfcaa670276da24a9196", + "a_eq_b": false, + "a_m_pow_b": "0x211f8f1195744b917dcc3d989d180709d" + }, + { + "a": "0x285a77", + "b": "0x1075136a98d7400de59f5", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x1075136a98d740106b46c", + "a_m_sub_b_m": "0x314107b9ef724f12e69e61266dc99493d", + "a_m_mul_b_m": "0x2981bd7e761eababf8a143f2e3", + "a_eq_b": false, + "a_m_pow_b": "0x2415048533c9d8f241f50eb70acbfb17c" + }, + { + "a": "0x29cb017c18741ae91acfebb4bd29e8693", + "b": "0x3e7019a5711b2ea60b99", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x29cb017c18741ed01c6a42c670144922c", + "a_m_sub_b_m": "0x29cb017c18741702193594a30a3f87afa", + "a_m_mul_b_m": "0x1cf03bbed440e552bf75181f9115b74f1", + "a_eq_b": false, + "a_m_pow_b": "0xb90a4d6e027f806c1300ea458fadac08" + }, + { + "a": "0x10b2f5", + "b": "0x20ad4041504c14982", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x20ad4041504d1fc77", + "a_m_sub_b_m": "0x314107b9ef725f87d95bb9bc5d89eb22e", + "a_m_mul_b_m": "0x221abc090ed1808a37bd6a", + "a_eq_b": false, + "a_m_pow_b": "0x2cf831bb7ca43c1a10a69e85f75bca431" + }, + { + "a": "0x1ead6e7180322a4e695c9", + "b": "0x2091c54a814d53", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x1ead6e73894e7ef67e31c", + "a_m_sub_b_m": "0x1ead6e6f7715d5a654876", + "a_m_mul_b_m": "0xe11139b38df7671a6c09cee61be7568f", + "a_eq_b": false, + "a_m_pow_b": "0x1fec4709eb48afbca50f418c7dc41fb38" + }, + { + "a": "0x45462309215f4f9edb95f2", + "b": "0x13ad3b3f4b1cb8bd2130260c", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x13f28162543e180cc00bbbfe", + "a_m_sub_b_m": "0x314107b9ee3be03635e94466d5afab8a1", + "a_m_mul_b_m": "0x258fb84f35ef468fecd08180e5485f1ad", + "a_eq_b": false, + "a_m_pow_b": "0x217f82ec6a767ed0a1e2e343b4a221665" + }, + { + "a": "0x19da", + "b": "0x24c9a0ae15419eefcd5e73e3f673617d9", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x24c9a0ae15419eefcd5e73e3f673631b3", + "a_m_sub_b_m": "0xc77670bda30c0982caa8619b76194abc", + "a_m_mul_b_m": "0x2f00ace5107690464275f3ff5dbd675d0", + "a_eq_b": false, + "a_m_pow_b": "0x1782f58232f2d7562f5a8ac139a165e6" + }, + { + "a": "0x9fd3c0157f98d1ecff4c56bf9ea2c64", + "b": "0x2590a38d8afcfdd2ed7a", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x9fd3c0157f9b2af73825068f7bd19de", + "a_m_sub_b_m": "0x9fd3c0157f9678e2c673a6efc173eea", + "a_m_mul_b_m": "0x28d590aa3251034754ad75d164a50c8e8", + "a_eq_b": false, + "a_m_pow_b": "0x2e41a879fcf59cd11c85aedc06212cddd" + }, + { + "a": "0x2628308690fa7ee0538974df5bff773ce", + "b": "0x2628308690fa7ee0538974df5bff773ce", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x1b0f595332829e38ad09efc10a29f9ee1", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xf857685685b5ed32563581f7bfe343c", + "a_eq_b": true, + "a_m_pow_b": "0x16ed4891114728e74357e208bd74e3378" + }, + { + "a": "0x3792be18156af4586c4c3935379deda1", + "b": "0x5896e648043", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x3792be18156af4586c4c3ebea6026de4", + "a_m_sub_b_m": "0x3792be18156af4586c4c33abc9396d5e", + "a_m_mul_b_m": "0xe298dc7bf7effeb5d8a9266cf29765b3", + "a_eq_b": false, + "a_m_pow_b": "0x216e8c56587e093a48711cccb67f9bdd7" + }, + { + "a": "0x307120911b3b68b57da54f267dd138266", + "b": "0x9ac902ee25777cf09f9821883744da64", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x8dca9060e2080fc8d95d74153709140f", + "a_m_sub_b_m": "0x26c4906238e3f0e673abcd0dfa5cea802", + "a_m_mul_b_m": "0x1d1133ea1ae1b759084999fe7eea8b490", + "a_eq_b": false, + "a_m_pow_b": "0x12b5a3b72c66d492ebfca719a851a46ae" + }, + { + "a": "0x527ce71b48", + "b": "0x69466120e345ac72eac39204ade7cef3", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x69466120e345ac72eac392572aceea3b", + "a_m_sub_b_m": "0x2aaca1a7e13e04c0cb5cc0e28ac4e9510", + "a_m_mul_b_m": "0x283ea4844988bcb6102de651bee107341", + "a_eq_b": false, + "a_m_pow_b": "0x20bc1606282bcbeec74808b5bfae241a2" + }, + { + "a": "0xb8018ee6a8e2f", + "b": "0xb8018ee6a8e2f", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x170031dcd51c5e", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x84423d6e00583df58971e42ca1", + "a_eq_b": true, + "a_m_pow_b": "0x20e02943d5767de555e70b8f18c1b8b71" + }, + { + "a": "0x2245152631db9d17034ce", + "b": "0xe1d7a3283c", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2245152631e9ba9135d0a", + "a_m_sub_b_m": "0x2245152631cd7f9cd0c92", + "a_m_mul_b_m": "0x1e3b9572b430b52dbb4001f3fb69048", + "a_eq_b": false, + "a_m_pow_b": "0x11de818629cc0cc069cbf90bfb496515f" + }, + { + "a": "0x121f93d0a1727f7ea5f24b6de6fec4b", + "b": "0x0", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x121f93d0a1727f7ea5f24b6de6fec4b", + "a_m_sub_b_m": "0x121f93d0a1727f7ea5f24b6de6fec4b", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x0", + "b": "0x5ac12ea9b8", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x5ac12ea9b8", + "a_m_sub_b_m": "0x314107b9ef725f87fa08f9f801c209f03", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x66b2e9583eabda17da2000fc63d", + "b": "0x2d334886ff164f9d84312ece2dc2151e1", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2d3348edb1ffa7dc300b46a84dc31181e", + "a_m_sub_b_m": "0x40dbf99a345682921b1e309a013dbd17", + "a_m_mul_b_m": "0x20bb85a6614e0e120b6426c3eacc0fa48", + "a_eq_b": false, + "a_m_pow_b": "0x1f76032b80616d48a9227c1bef1877be9" + }, + { + "a": "0x56af944e07b38785b0932f5b6", + "b": "0x745a4f4145", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x56af944e07b3878cf638236fb", + "a_m_sub_b_m": "0x56af944e07b3877e6aee3b471", + "a_m_mul_b_m": "0x26519b9cd2f98f413eabf430adf1b7b0a", + "a_eq_b": false, + "a_m_pow_b": "0x228230f5fc7ee77af128707978a15b534" + }, + { + "a": "0x0", + "b": "0x44052daad3", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x44052daad3", + "a_m_sub_b_m": "0x314107b9ef725f87fa08f9f96d8219de8", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x58f4e58bf3b9ea6245b59", + "b": "0xf799", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x58f4e58bf3b9ea62552f2", + "a_m_sub_b_m": "0x58f4e58bf3b9ea62363c0", + "a_m_mul_b_m": "0x560973d738cd0b41e5fdd7731", + "a_eq_b": false, + "a_m_pow_b": "0x2ed22cbfc34bdf4ec45289267b3ece13f" + }, + { + "a": "0xcbdffa7d", + "b": "0xdf171cff814645bd776", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xdf171cff815303bd1f3", + "a_m_sub_b_m": "0x314107b9ef725ea8e2ebfa7c744d36bc2", + "a_m_mul_b_m": "0xb1aa836a5eaf0284bd1f30b709e", + "a_eq_b": false, + "a_m_pow_b": "0x1f263850f8292e34d7c70ac302d687c9b" + }, + { + "a": "0x8b6d9", + "b": "0x0", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x8b6d9", + "a_m_sub_b_m": "0x8b6d9", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x281d1bf066b8c66f28611f583b2d10e3d", + "b": "0x135aef8d9ff015831feeec41e6f6", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x281d1d2615b1a06e29b9515729f12f533", + "a_m_sub_b_m": "0x281d1abab7bfec702708ed594c68f2747", + "a_m_mul_b_m": "0x1d4b82e41876a4fd445065625889c369c", + "a_eq_b": false, + "a_m_pow_b": "0x18b350fcdba89ebe35ae3fe069c6d1af1" + }, + { + "a": "0x2f45da406bbf9bb0127f9e728c618fc1e", + "b": "0xd3125ffdf655860bdd32e231eb561699", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xb35f8865bb29488d649d297fd41fc9fc", + "a_m_sub_b_m": "0x2214b4408c5a434f54ac704f6dac2e585", + "a_m_mul_b_m": "0x10042261ad4a3d45da7f82738e2bef864", + "a_eq_b": false, + "a_m_pow_b": "0x12f5c1a821556e8a7df48b020d97f005a" + }, + { + "a": "0x2b1182d235bf806761f12a0e912011caa", + "b": "0xdda53b3d1aa6c5e", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2b1182d235bf806762cecf49ce3ab8908", + "a_m_sub_b_m": "0x2b1182d235bf8067611384d354056b04c", + "a_m_mul_b_m": "0x5fef1ebcb0568e3e7b07f2305faa173d", + "a_eq_b": false, + "a_m_pow_b": "0x1a2afcb50d781db8561df7829e503a947" + }, + { + "a": "0x2d1b4a00d3d1af", + "b": "0x3", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2d1b4a00d3d1b2", + "a_m_sub_b_m": "0x2d1b4a00d3d1ac", + "a_m_mul_b_m": "0x8751de027b750d", + "a_eq_b": false, + "a_m_pow_b": "0x1317ecd0d97bffe79d024f13af44138d4" + }, + { + "a": "0x22452bc39dbf2eed13b9cea959ad7558f", + "b": "0x65cbbc08035475c5e", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x22452bc39dbf2eed79858ab15d01eb1ed", + "a_m_sub_b_m": "0x22452bc39dbf2eecadee12a15658ff931", + "a_m_mul_b_m": "0xb5721e7473288377aaa5a584da8cc092", + "a_eq_b": false, + "a_m_pow_b": "0x2f4d29b8d99f43ad68d382ed18b92065a" + }, + { + "a": "0xa80a04ec985ff94b28b9d", + "b": "0x2f256433e2aad3e", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xa80a051bbdc42d2dd38db", + "a_m_sub_b_m": "0xa80a04bd72fbc5687de5f", + "a_m_mul_b_m": "0x1b875a225fcbc808b7ccf6bd2437ae987", + "a_eq_b": false, + "a_m_pow_b": "0x2ee16bc2e3d382d63ec07a63dcc9f7309" + }, + { + "a": "0xa1ddc68d4fd0bd7696fa9c72e7b", + "b": "0x36b944e09", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xa1ddc68d4fd0bd76973155b7c84", + "a_m_sub_b_m": "0xa1ddc68d4fd0bd7696c3e32e072", + "a_m_mul_b_m": "0x16f75e74d349f021b3c752f03cc41bec4", + "a_eq_b": false, + "a_m_pow_b": "0x1f303ba05c5271e933593898a0de740bd" + }, + { + "a": "0x1d9750ca7e", + "b": "0x744ddd32605dd4d60ecfb95b", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x744ddd32605dd4f3a62083d9", + "a_m_sub_b_m": "0x314107b9e82d81b4d4031cb2265d059de", + "a_m_mul_b_m": "0x1214ec205937b4ef3690a502d56b1e5de", + "a_eq_b": false, + "a_m_pow_b": "0x19a0a70210f87adc7c309ad1da3d02fda" + }, + { + "a": "0x0", + "b": "0xf88c161ef3cc9d8a4b1678e4", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xf88c161ef3cc9d8a4b1678e4", + "a_m_sub_b_m": "0x314107b9dfe99e260acc302509238cfd7", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0xc6e785a", + "b": "0x5fbd12cbb93c26e84f8ea6bf4d047", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x5fbd12cbb93c26e84f8ea786348a1", + "a_m_sub_b_m": "0x3140a7fcdca6a64bd320aa6f07dc8f0ce", + "a_m_mul_b_m": "0x30fe3e4671d8e0b78f33a232ca7b05303", + "a_eq_b": false, + "a_m_pow_b": "0x63d0d3108eca01edf1e74fa30708da84" + }, + { + "a": "0x1e5af95c78", + "b": "0xf649e65736c72f774b1", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xf649e65738acdf0d129", + "a_m_sub_b_m": "0x314107b9ef725e91b022a2c8cc5513082", + "a_m_mul_b_m": "0x1d342ee00a20d92ef929b8c174ef8", + "a_eq_b": false, + "a_m_pow_b": "0x2c997c3bb8db4329c4b909a39b5398f68" + }, + { + "a": "0x0", + "b": "0xf8c058a332", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xf8c058a332", + "a_m_sub_b_m": "0x314107b9ef725f87fa08f9ee21cf6a589", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0xc7b3df467c21355", + "b": "0x0", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xc7b3df467c21355", + "a_m_sub_b_m": "0xc7b3df467c21355", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x1", + "b": "0x36a5040aaec7abf1df6871a1ec042", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x36a5040aaec7abf1df6871a1ec043", + "a_m_sub_b_m": "0x3140d114eb67b0c04e171a953c330887a", + "a_m_mul_b_m": "0x36a5040aaec7abf1df6871a1ec042", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x4ae9c986cc8d5", + "b": "0x4ae9c986cc8d5", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x95d3930d991aa", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x15ebfe026446ffac4f01458139", + "a_eq_b": true, + "a_m_pow_b": "0xef9099086cbbdd49607842da73962c02" + }, + { + "a": "0x916e8a29deb984c31277fd", + "b": "0x26bd5788083ebc", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x916e8a2a0576dc4b1ab6b9", + "a_m_sub_b_m": "0x916e8a29b7fc2d3b0a3941", + "a_m_mul_b_m": "0x8b045dfaf810e9a9ff002680ddc57b0a", + "a_eq_b": false, + "a_m_pow_b": "0x2352405b92895c45e1d645a2adb30bbc7" + }, + { + "a": "0xdf713eceb14ad12b4c47534952", + "b": "0x70d29fee", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xdf713eceb14ad12b4cb825e940", + "a_m_sub_b_m": "0xdf713eceb14ad12b4bd680a964", + "a_m_mul_b_m": "0x30b62fec47b56115deabd381c42a24997", + "a_eq_b": false, + "a_m_pow_b": "0x29e4afe63a62198c391bf346bcdeffb45" + }, + { + "a": "0x1f20a1d20ebc5aa3892a", + "b": "0x1f55b2e5ca6ed0ac07e22e1b751783032", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x1f55b2e5ca6ed29e11ff4f073ac1bb95c", + "a_m_sub_b_m": "0x11eb54d4250390cdfc43eccdfe67aa1b3", + "a_m_mul_b_m": "0x22796e32d17224a32e053018eab4ee91a", + "a_eq_b": false, + "a_m_pow_b": "0x28d0d6f3f3c2e7b774a44f1e838b335be" + }, + { + "a": "0x5b9c83b59f032cdce32866d30d6a78b0", + "b": "0x5b9c83b59f032cdce32866d30d6a78b0", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xb739076b3e0659b9c650cda61ad4f160", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x207fad09f7338500c61855e07f49047e8", + "a_eq_b": true, + "a_m_pow_b": "0x2684654aabeeb074eccb9c57227cf708a" + }, + { + "a": "0x4", + "b": "0x270a8aa1e45c7cbc6201a4f7a1", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x270a8aa1e45c7cbc6201a4f7a5", + "a_m_sub_b_m": "0x314107b77ec9b569b4412e378dbaa511e", + "a_m_mul_b_m": "0x9c2a2a879171f2f1880693de84", + "a_eq_b": false, + "a_m_pow_b": "0x929e346da6b6da47c15826ea9203ff67" + }, + { + "a": "0x5d0e695f8baba2338fe", + "b": "0xe2565487b5c3b7626f4975fd3537", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xe2565487bb949df8680430206e35", + "a_m_sub_b_m": "0x3140f9948a29e488ccfc3294c21754c82", + "a_m_mul_b_m": "0x3fcaf05d6a15d59de016933795283815", + "a_eq_b": false, + "a_m_pow_b": "0x2540b9c7545e1fdefef4a5e6e0552d6bb" + }, + { + "a": "0xa11450ea1324862f78e125c29b6a", + "b": "0xe7df0fe6bce8d75f26d62e40c", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xa122cedb119054bceed393257f76", + "a_m_sub_b_m": "0xa105d2f914b8b7a202eeb85fb75e", + "a_m_mul_b_m": "0x1f1f4bf92ab7b3cce3a9de7e4488ce6be", + "a_eq_b": false, + "a_m_pow_b": "0x2554c454a599e9525001f5b3ac9825137" + }, + { + "a": "0x11109636abf8ce7e3f52c0cbf404d", + "b": "0x5631", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x11109636abf8ce7e3f52c0cbf967e", + "a_m_sub_b_m": "0x11109636abf8ce7e3f52c0cbeea1c", + "a_m_mul_b_m": "0x5bed6a31e3c7ffdef6feb9b6b0352cbd", + "a_eq_b": false, + "a_m_pow_b": "0x164cabc5912e68bbe60f6729b330d3197" + }, + { + "a": "0x646801", + "b": "0x3b8f", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x64a390", + "a_m_sub_b_m": "0x642c72", + "a_m_mul_b_m": "0x175c0e538f", + "a_eq_b": false, + "a_m_pow_b": "0xae7b9a76a6ccb20f3f57339df253aed" + }, + { + "a": "0x22b3fae441030ae56525ce03725bd0c", + "b": "0x22b3fae441030ae56525ce03725bd0c", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x4567f5c8820615caca4b9c06e4b7a18", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x2880eae584b84960c36da243565a6c75e", + "a_eq_b": true, + "a_m_pow_b": "0x296c46efc7b216bccc1da95abb374bd7c" + }, + { + "a": "0x3104dff6623f1b67e01d34690a795ac54", + "b": "0x162bd017425f4e9", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x3104dff6623f1b67e033603921bbba13d", + "a_m_sub_b_m": "0x3104dff6623f1b67e0070898f336fb76b", + "a_m_mul_b_m": "0x16c102556143b4180d736c05e5c8c40a7", + "a_eq_b": false, + "a_m_pow_b": "0x5fb72e651f5005f02f5f3d0bc9fe788a" + }, + { + "a": "0x346afd", + "b": "0x8b", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x346b88", + "a_m_sub_b_m": "0x346a72", + "a_m_mul_b_m": "0x1c76175f", + "a_eq_b": false, + "a_m_pow_b": "0x2fa727bfe2858175772e9dc4292b1ab61" + }, + { + "a": "0x2dc2897c6845398134fee71444d236555", + "b": "0xce4", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2dc2897c6845398134fee71444d237239", + "a_m_sub_b_m": "0x2dc2897c6845398134fee71444d235871", + "a_m_mul_b_m": "0x2c1ec68c4bff828e9061b310eb20874d1", + "a_eq_b": false, + "a_m_pow_b": "0x505a3653dacce55bfdddce4f032fad46" + }, + { + "a": "0x2702dc88ab97fb3bb7ecc040c75ff93f0", + "b": "0x17b7714dbad2215eae9d21e3d59d0", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2702f4401ce5b60dd94b6edde943cedc0", + "a_m_sub_b_m": "0x2702c4d13a4a4069968e11a3a57c23a20", + "a_m_mul_b_m": "0x14af9e5512dadf15fc3f0cb98b7ac0251", + "a_eq_b": false, + "a_m_pow_b": "0x2a823b394984fedf504d2613a31f9c6c1" + }, + { + "a": "0x3c336a5be06eb52ee01e25e6512", + "b": "0x172e2dffdff57b8a920a12f3b3", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x3da64d3bde6e0ce7893ec7158c5", + "a_m_sub_b_m": "0x3ac0877be26f5d7636fd84b715f", + "a_m_mul_b_m": "0x30714e628d7fdba21d15e0cc8caacc24c", + "a_eq_b": false, + "a_m_pow_b": "0x18ee6b030158af599d8ccd6bb5e02862c" + }, + { + "a": "0xd15a23754bef38d426", + "b": "0xcbf0ab6088c97", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xd15a303456a54160bd", + "a_m_sub_b_m": "0xd15a16b6413930478f", + "a_m_mul_b_m": "0xa6c74ac56887263e5ca3ab2d3b9ea6a", + "a_eq_b": false, + "a_m_pow_b": "0x27f0e9b18ac5cb1c947ecc8f025e65e16" + }, + { + "a": "0x62e2cb42d01ba3a2652c9e89421c6d", + "b": "0x2b0b7cf", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x62e2cb42d01ba3a2652c9e8bf2d43c", + "a_m_sub_b_m": "0x62e2cb42d01ba3a2652c9e8691649e", + "a_m_mul_b_m": "0x195ed2bf0037305063109f3288124aefa", + "a_eq_b": false, + "a_m_pow_b": "0x1a1f5608946f923df2ed2078f33cef555" + }, + { + "a": "0x1db83e9973b89181ba3", + "b": "0x6df09684", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x1db83e9973bf708b227", + "a_m_sub_b_m": "0x1db83e9973b1b27851f", + "a_m_mul_b_m": "0xcc360db4dd043ea765206fc20c", + "a_eq_b": false, + "a_m_pow_b": "0x30f18ee888940574d57173ab3d6e9b71d" + }, + { + "a": "0x1213d798f0be6cd3595", + "b": "0x5192a6c2bdfb7279501e917496dc27b", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x5192a6c2bdfb848d27b7823303af810", + "a_m_sub_b_m": "0x30ef75132cb464279490745cf7aaebbd5", + "a_m_mul_b_m": "0xd447668f129aa780f0f40dd852b0b7db", + "a_eq_b": false, + "a_m_pow_b": "0x2dbbefb0001267d5b12c1fc6b94bc79d4" + }, + { + "a": "0xa13c1cfdef30306792b47", + "b": "0xa2b56", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xa13c1cfdef3030683569d", + "a_m_sub_b_m": "0xa13c1cfdef303066efff1", + "a_m_mul_b_m": "0x667a464fbbc5d565d637bf76da", + "a_eq_b": false, + "a_m_pow_b": "0x161eddf566574a4e3dc0279a63f145bdb" + }, + { + "a": "0xa1d32e24bb8917463c3da91136a52df9", + "b": "0x3a1057256", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xa1d32e24bb8917463c3da914d7aaa04f", + "a_m_sub_b_m": "0xa1d32e24bb8917463c3da90d959fbba3", + "a_m_mul_b_m": "0x1c5d25264be996acac98bc81499fa3faa", + "a_eq_b": false, + "a_m_pow_b": "0x29491cacf8b545ebd91758a396684a278" + }, + { + "a": "0x6d", + "b": "0x250d9082a42", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x250d9082aaf", + "a_m_sub_b_m": "0x314107b9ef725f87fa08f9d8a04471ee6", + "a_m_mul_b_m": "0xfc6c6879fe1a", + "a_eq_b": false, + "a_m_pow_b": "0x2f9e839084b8cdf17fa17683022ccc8b" + }, + { + "a": "0x1a201d25ab049", + "b": "0x239d5b552a867a0f0a8e6a772b9cde60c", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x239d5b552a867a0f0a8e849748c289655", + "a_m_sub_b_m": "0xda3ac64c4ebe578ef7aa9a69f5dc12f8", + "a_m_mul_b_m": "0x1da02c9d1c6672a9173f5fddad99d2bb8", + "a_eq_b": false, + "a_m_pow_b": "0x247581971ef34db7f2b451df9b1e91f75" + }, + { + "a": "0x1b", + "b": "0x5ee86430649def50fb2de1e", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x5ee86430649def50fb2de39", + "a_m_sub_b_m": "0x314107b9ef137723c9a45c0e5cd9c6ab8", + "a_m_mul_b_m": "0xa0282911a9ca83d8a7dd6d2a", + "a_eq_b": false, + "a_m_pow_b": "0xdf18c0f2fc69dbff8f4bd82ef12db260" + }, + { + "a": "0x0", + "b": "0x2a9fa4ea6f8db1a4d584d3c020ff9d318", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2a9fa4ea6f8db1a4d584d3c020ff9d318", + "a_m_sub_b_m": "0x6a162cf7fe4ade32484263d8cd5575a3", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x67ee05ba830dc245db6ca6f6a2196", + "b": "0x179547e39181463c5f825ee54ab", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x68059b02669f438c17cc295587641", + "a_m_sub_b_m": "0x67d670729f7c40ff9f0d2497bcceb", + "a_m_mul_b_m": "0x19ea285ef6d193fd422fb5efa728edec8", + "a_eq_b": false, + "a_m_pow_b": "0x2279409077b59328f999f2ce8ac029c09" + }, + { + "a": "0x85a02c72f22a4fc6", + "b": "0x941b7c144fb", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x85a035b4a9eb94c1", + "a_m_sub_b_m": "0x85a023313a690acb", + "a_m_mul_b_m": "0x4d4ef25b53c372b25395af2cf22", + "a_eq_b": false, + "a_m_pow_b": "0xb8de207151af97f29f3d5bc10f0e03f8" + }, + { + "a": "0x7a8fbf2", + "b": "0x2bb937826bcee9d29ce4f1ca0571aa4f6", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2bb937826bcee9d29ce4f1ca05ec3a0e8", + "a_m_sub_b_m": "0x587d03783a375b55d240833a8ddd9fb7", + "a_m_mul_b_m": "0x83048e0479a7168e5f7d8bfe25e15c4b", + "a_eq_b": false, + "a_m_pow_b": "0x27a59e69be0d879f13d5805569e6e51b6" + }, + { + "a": "0x0", + "b": "0x0", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x0", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x0", + "a_eq_b": true, + "a_m_pow_b": "0x1" + }, + { + "a": "0x5e754724dd", + "b": "0x7f041ecda6a326451437d6", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x7f041ecda6a384ba5b5cb3", + "a_m_sub_b_m": "0x314107b9ef6a6f460d2e8fd130d8235c2", + "a_m_mul_b_m": "0x2eddb37e05f2fd5812682074c4a84bbe", + "a_eq_b": false, + "a_m_pow_b": "0x1ff0b7fe23693bf5d8483c4af425af70c" + }, + { + "a": "0x28cea309b49c94aa5e689e5e887c47eb8", + "b": "0x8afd4fc7bef208346", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x28cea309b49c94aae965ee26476e501fe", + "a_m_sub_b_m": "0x28cea309b49c94a9d36b4e96c98a3fb72", + "a_m_mul_b_m": "0xa218e9ffc42574f253db5a745978d863", + "a_eq_b": false, + "a_m_pow_b": "0x38e32e18c3b6d4e1a4125fbb2448114" + }, + { + "a": "0x850d18533e7efa2faf58ba0bf3", + "b": "0x716571c9d788429aeae", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x850d185a54d616cd27dce3baa1", + "a_m_sub_b_m": "0x850d184c2827dd9236d4905d45", + "a_m_mul_b_m": "0x26d561c4e2335b02719c9b5d27cc835e3", + "a_eq_b": false, + "a_m_pow_b": "0x2cc0e817bd65211f2aaaa103f5c325abf" + }, + { + "a": "0x351596fb52451d", + "b": "0x6a53043272eaa36e642965c", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x6a530432763bfcde194db79", + "a_m_sub_b_m": "0x314107b9ef080c83c79960b3af25ef77c", + "a_m_mul_b_m": "0x249674a6cea435f113602044a8d62a81f", + "a_eq_b": false, + "a_m_pow_b": "0x25fbd62c619d9ebf649021c09242e2fbb" + }, + { + "a": "0x29fe", + "b": "0x73ab1c8649f787eaf1679", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x73ab1c8649f787eaf4077", + "a_m_sub_b_m": "0x314107b9ef71ebdcdd82b00625ea05c40", + "a_m_mul_b_m": "0x12f92b57cf16085d7bc51ad0e", + "a_eq_b": false, + "a_m_pow_b": "0x8bcd6b3e7cc8b918f99846406c596027" + }, + { + "a": "0x0", + "b": "0x7", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x7", + "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fdadd4f48b4", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x29cb9f9aabf4ddeaa", + "b": "0x29cb9f9aabf4ddeaa", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x53973f3557e9bbd54", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xaaba1ecff458899bde1c7803a550b76e", + "a_eq_b": true, + "a_m_pow_b": "0x1f77cb284a9e29aa0a4664d63b5d46da0" + }, + { + "a": "0x156f878f40ed", + "b": "0x156f878f40ed", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2adf0f1e81da", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x1cb7cd456a996298f3d5b69", + "a_eq_b": true, + "a_m_pow_b": "0x2511c0db024fc901edc51e9b8c36ba065" + }, + { + "a": "0x39ae445e08b1dc2f8cbf1f93ca1d33772", + "b": "0x29f082e7448cc003745701847803", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x86d3f43216df0f05eb65cdb8c60866ba", + "a_m_sub_b_m": "0x86d3a051111085ec6b5ee50ac2ff76b4", + "a_m_mul_b_m": "0x164b2901339ed485d0d0b2aedba1b5e50", + "a_eq_b": false, + "a_m_pow_b": "0xf87931dba7ae963a5e8246eff6d3910" + }, + { + "a": "0x4f313c0b076d142d05c66a9bb", + "b": "0x4202326e65a3ae4", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x4f313c0b07af165f742c0e49f", + "a_m_sub_b_m": "0x4f313c0b072b11fa9760c6ed7", + "a_m_mul_b_m": "0xeefedc1f06c89c91e324a8453cf90935", + "a_eq_b": false, + "a_m_pow_b": "0x13050cb3f5a1c1261fd72fe8f6e08c528" + }, + { + "a": "0x163ae2562ca", + "b": "0xc643d7053df8eeef", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xc643d868ec1e51b9", + "a_m_sub_b_m": "0x314107b9ef725f87eda4bca394d7bbc96", + "a_m_mul_b_m": "0x11376f23cbafdec28aa2c6f0696", + "a_eq_b": false, + "a_m_pow_b": "0xc1e166c0bf9a95f14f592618b4d4161a" + }, + { + "a": "0xbc972bbe7b392b9573113f2dc86", + "b": "0x2c0cc51", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xbc972bbe7b392b9573116b3a8d7", + "a_m_sub_b_m": "0xbc972bbe7b392b9573111321035", + "a_m_mul_b_m": "0x1aabef2b2906f31709f7a4fbea2f9b718", + "a_eq_b": false, + "a_m_pow_b": "0x62c45feb4624ba10c7f9d018a649c9fd" + }, + { + "a": "0x3166f0bd7405650dd400a27ee80d", + "b": "0x87b6e4e98ce2517337a7c", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x3166f0c5ef73b3a6a225b9b26289", + "a_m_sub_b_m": "0x3166f0b4f897167505db8b4b6d91", + "a_m_mul_b_m": "0x9b6fabc548392e7aa7bf3f3171a0d06d", + "a_eq_b": false, + "a_m_pow_b": "0x1982c83dccd6eafb39447d1e857b43d22" + }, + { + "a": "0xe5dcac329870a", + "b": "0x8d2928f4be1514a0db27516ea", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x8d2928f4be15fa7d8759e9df4", + "a_m_sub_b_m": "0x314107b9624936933bf4cb397ee03b8db", + "a_m_mul_b_m": "0x1287091f95a5c9052e5b2daba3572e9ad", + "a_eq_b": false, + "a_m_pow_b": "0x1309b8989ea37d675e7540311f921b5b7" + }, + { + "a": "0x14741ee56", + "b": "0x40aa56583", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x551e753d9", + "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fd819ebd18e", + "a_m_mul_b_m": "0x52aa3bbea7332e402", + "a_eq_b": false, + "a_m_pow_b": "0x2c1ea4133e67d2d010d40d5169aaa3e2e" + }, + { + "a": "0x2", + "b": "0xd08", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xd0a", + "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fdadd4f3bb5", + "a_m_mul_b_m": "0x1a10", + "a_eq_b": false, + "a_m_pow_b": "0x20385c26ac3740f7906a1f4693995a57b" + }, + { + "a": "0x68", + "b": "0x52abbf66c7680aee2a", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x52abbf66c7680aee92", + "a_m_sub_b_m": "0x314107b9ef725f82cf4d0391375445af9", + "a_m_mul_b_m": "0x2195c5c1c1024470c110", + "a_eq_b": false, + "a_m_pow_b": "0xe9833c4c819edf97d3f543f064a6b6b9" + }, + { + "a": "0x54da0f52361d82f1240d", + "b": "0x8b2", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x54da0f52361d82f12cbf", + "a_m_sub_b_m": "0x54da0f52361d82f11b5b", + "a_m_mul_b_m": "0x2e1d01938da8c9c94cb790a", + "a_eq_b": false, + "a_m_pow_b": "0x11e24283c5622033cdb03476db11d50e4" + }, + { + "a": "0x9153251c9d020baee95fc7389", + "b": "0x6c846bf9040fe6898", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x9153251d098677a7ed6fadc21", + "a_m_sub_b_m": "0x9153251c307d9fb5e54fe0af1", + "a_m_mul_b_m": "0x89d2aa4f918ce9194488256050d6e9d4", + "a_eq_b": false, + "a_m_pow_b": "0x106381e67ba08f13b855edd8a0179999d" + }, + { + "a": "0x89271f2772", + "b": "0x124aef25dcb50d15b5985", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x124aef25dcbd9f87a80f7", + "a_m_sub_b_m": "0x314107b9ef724d3d0ae31d513331316a8", + "a_m_mul_b_m": "0x9cce59f9666e69304f06c23f6c203a", + "a_eq_b": false, + "a_m_pow_b": "0x1242bfc72be48665567bf954f9f42d5ac" + }, + { + "a": "0x3d5adb03cff0c8ac", + "b": "0x48e50c79a", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x3d5adb085e419046", + "a_m_sub_b_m": "0x3d5adaff41a00112", + "a_m_mul_b_m": "0x117872dc65733642d60966b78", + "a_eq_b": false, + "a_m_pow_b": "0x3e6163f6880d1f8353334d91e58cba4b" + }, + { + "a": "0xed7fe91a9e8547147a08ac", + "b": "0x11e6cbd83a2f62516dc88b09c", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x11f5a3d6cbd94aa5df102b948", + "a_m_sub_b_m": "0x314107b9dd9a6bae51838000b1540a0cb", + "a_m_mul_b_m": "0x23c2e579f2c4e7696b31e9b435a267a9b", + "a_eq_b": false, + "a_m_pow_b": "0x2af9d24cf83473fd901dce8f7d550843c" + }, + { + "a": "0x2cbf8e26a4fae667bb2e74e770fe1cedf", + "b": "0xe8813d1ea49", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2cbf8e26a4fae667bb2e75cff23b3b928", + "a_m_sub_b_m": "0x2cbf8e26a4fae667bb2e73feefc0fe496", + "a_m_mul_b_m": "0x2ca9ba2302836f3fc7650e945e6fe84bf", + "a_eq_b": false, + "a_m_pow_b": "0x60def1468c0e69c641b8be559fde5bab" + }, + { + "a": "0x3cdc39412d95e17e1", + "b": "0x0", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x3cdc39412d95e17e1", + "a_m_sub_b_m": "0x3cdc39412d95e17e1", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x918a775945b8c4949106861d3", + "b": "0x918a775945b8c4949106861d3", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x12314eeb28b718929220d0c3a6", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x10545c5d42f2cbdec98d94116dcc261f1", + "a_eq_b": true, + "a_m_pow_b": "0x2ecbef52532a74c838671e25853a4f360" + }, + { + "a": "0x0", + "b": "0x4a4c379fe0a1b7efbe877", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x4a4c379fe0a1b7efbe877", + "a_m_sub_b_m": "0x314107b9ef72153bc269195bf5e536044", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x4ad39a4bb0d62b68d41880fa4b", + "b": "0x14e", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x4ad39a4bb0d62b68d41880fb99", + "a_m_sub_b_m": "0x4ad39a4bb0d62b68d41880f8fd", + "a_m_mul_b_m": "0x61a0134ec0b76ca2c4b7f8468dda", + "a_eq_b": false, + "a_m_pow_b": "0x2bcbf09d0c1cd4ea75b09446e6b87cd92" + }, + { + "a": "0x200096bfafff5b7751f", + "b": "0x2b291a58af", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x200096bfb2b1ed1cdce", + "a_m_sub_b_m": "0x200096bfad4cc9d1c70", + "a_m_mul_b_m": "0x5653cb57ca6c51429408e4d1b831", + "a_eq_b": false, + "a_m_pow_b": "0x964332f9a42997ed0e2f09173de4e6b6" + }, + { + "a": "0x7dd037ac061ae8d1", + "b": "0x350746a4815642c", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x8120ac164e304cfd", + "a_m_sub_b_m": "0x7a7fc341be0584a5", + "a_m_mul_b_m": "0x1a0faeefeb24c19d54ff02d70b6a7ec", + "a_eq_b": false, + "a_m_pow_b": "0x2e61d8317006d4af5fd57b153782b0819" + }, + { + "a": "0x3da02246bb6204e", + "b": "0xa", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x3da02246bb62058", + "a_m_sub_b_m": "0x3da02246bb62044", + "a_m_mul_b_m": "0x2684156c351d430c", + "a_eq_b": false, + "a_m_pow_b": "0x1dacf723faa1d0c7bc423028b9c418de" + }, + { + "a": "0x2d2f744290671493804fe973d261cec19", + "b": "0x0", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2d2f744290671493804fe973d261cec19", + "a_m_sub_b_m": "0x2d2f744290671493804fe973d261cec19", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x29c7405255", + "b": "0x2afb9f3a8e9e7e1ba916b51ee6faefeda", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2afb9f3a8e9e7e1ba916b521836ef512f", + "a_m_sub_b_m": "0x645687f60d3e16c50f244e1634e09c36", + "a_m_mul_b_m": "0x2d70f678b0c01c990b4093714991db3d6", + "a_eq_b": false, + "a_m_pow_b": "0x1a40b04b2731143725c97cee96997786b" + }, + { + "a": "0x284e9ab612b34a24667fceeb", + "b": "0x7c4e3ee29e686fa00319e54ce0de", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x7c4e6731391e82534d3e4bccafc9", + "a_m_sub_b_m": "0x3140fff50e091f4cd43a2e6e55e8236c8", + "a_m_mul_b_m": "0x1f6b030d2de51000f27fbdef834cc4268", + "a_eq_b": false, + "a_m_pow_b": "0x1c58f329f3d4fa549581e0ce8036b617d" + }, + { + "a": "0x3ecbb3f1a53011a2", + "b": "0x6f86ce563de291f5e1", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x6fc59a0a2f87c20783", + "a_m_sub_b_m": "0x314107b9ef725f810588cfd8e9fed647c", + "a_m_mul_b_m": "0x2bae06611cc22a7c8de320b074667438a", + "a_eq_b": false, + "a_m_pow_b": "0x27f02fdca5751f6bb4479a1acf26c3ecd" + }, + { + "a": "0x229457a46ba68553cad275ae072caae", + "b": "0x8c78c2f", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x229457a46ba68553cad275ae93a56dd", + "a_m_sub_b_m": "0x229457a46ba68553cad275ad7ab3e7f", + "a_m_mul_b_m": "0x2d72db2e4e9ca076c206500c86a5ca749", + "a_eq_b": false, + "a_m_pow_b": "0x24beff4c42d18c33a41eb573204dd1ddd" + }, + { + "a": "0xe4af9fb4010dec772b7bb22fa31", + "b": "0x7cb7cc572abb532b6b7b4229502326", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x7cc6175125fb640a32edf9e4731d57", + "a_m_sub_b_m": "0x31393d21d99f67d3d53eb97506f221fc6", + "a_m_mul_b_m": "0x1186922d313ebed727f8ba4e4a6620bf9", + "a_eq_b": false, + "a_m_pow_b": "0x253c44effe31b7649c4fc8b0084786e25" + }, + { + "a": "0x13980e97f74c30759a4", + "b": "0x23732efc0e0d55b84caa7c8a1595b4f", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x23732efc0e0d69505b4273d6460b4f3", + "a_m_sub_b_m": "0x311d948af3645245d9cae7786fefd4710", + "a_m_mul_b_m": "0x10a42966ffd56798c435c8076a7c74d50", + "a_eq_b": false, + "a_m_pow_b": "0x30f323c08cd6e88998d49e9922385a521" + }, + { + "a": "0x32f2531da6ac", + "b": "0x0", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x32f2531da6ac", + "a_m_sub_b_m": "0x32f2531da6ac", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x2ba5612f7600aa45e44e1b08c69199a8a", + "b": "0x77107fe6a4e", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2ba5612f7600aa45e44e1b7fd711804d8", + "a_m_sub_b_m": "0x2ba5612f7600aa45e44e1a91b611b303c", + "a_m_mul_b_m": "0xd4d5c91fa0c008eb9d65dc09b82fc471", + "a_eq_b": false, + "a_m_pow_b": "0x7d75165398bb4035563edec05948cd65" + }, + { + "a": "0xece8d", + "b": "0x2e9ba32a1ace85", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2e9ba32a299d12", + "a_m_sub_b_m": "0x314107b9ef725f87fa0610437b34348c3", + "a_m_mul_b_m": "0x2b21dd552370e38c541", + "a_eq_b": false, + "a_m_pow_b": "0xdfdddea46ea7e942d353f49fae9a6d69" + }, + { + "a": "0x0", + "b": "0x357cb10cf68b7691470", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x357cb10cf68b7691470", + "a_m_sub_b_m": "0x314107b9ef725f527d57ed07225e6344b", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x19c8e33dcabbe684e2bbd637b3a", + "b": "0xc82f4b48a78a55d6bf2ded00f", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x1a911289136370dab97b0424b49", + "a_m_sub_b_m": "0x1900b3f282145c2f0bfca84ab2b", + "a_m_mul_b_m": "0x2915d570ad0dccad71b0ea7abaa4c723d", + "a_eq_b": false, + "a_m_pow_b": "0x2863569a471d76402f3cb7e8d493e05c2" + }, + { + "a": "0x29db5f8", + "b": "0xb475a52", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xde5104a", + "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fdad4a5a461", + "a_m_mul_b_m": "0x1d817b68457970", + "a_eq_b": false, + "a_m_pow_b": "0x23f2886d7a6635f5d87843c0cadd5f5bb" + }, + { + "a": "0x1888a2fd", + "b": "0x20a", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x1888a507", + "a_m_sub_b_m": "0x1888a0f3", + "a_m_mul_b_m": "0x32069c57e2", + "a_eq_b": false, + "a_m_pow_b": "0x1c4bf4da9e846a10606db2d00394ab4a7" + }, + { + "a": "0xf3df770ad0cabfc1baf01f1517fa07e", + "b": "0x545ba79ec3826bc", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xf3df770ad0cabfc20f4bc6b3db7c73a", + "a_m_sub_b_m": "0xf3df770ad0cabfc16694777654779c2", + "a_m_mul_b_m": "0x2ba1efe41bb6ee9d467821a264a2894bb", + "a_eq_b": false, + "a_m_pow_b": "0xa79bd306b8aeced76a9c657ff9c08f4d" + }, + { + "a": "0xab022", + "b": "0xab022", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x156044", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x723bd6c484", + "a_eq_b": true, + "a_m_pow_b": "0x194c0ebb21dd9388ce22fa7e30be4f1f6" + }, + { + "a": "0x1e03544f189a92046339bb68cd2", + "b": "0x2ea8fd23d0dbc321b90a00ee170e2ee61", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2ea8fd41d430123a539c055150c997b33", + "a_m_sub_b_m": "0x2980ab421eaeb7edb90fd72d0822e72c", + "a_m_mul_b_m": "0x603e534715ff58c088e347f64f16dd5e", + "a_eq_b": false, + "a_m_pow_b": "0x23dd58f013aff629a1802a357afe68c5d" + }, + { + "a": "0x281eb88e5d549faad44c8fd001a0ff218", + "b": "0x6ea21c18a7f03ae", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x281eb88e5d549faad4bb31ec1a48ef5c6", + "a_m_sub_b_m": "0x281eb88e5d549faad3ddedb3e8f90ee6a", + "a_m_mul_b_m": "0x4f5249895d31ef0c843d0ece6450967f", + "a_eq_b": false, + "a_m_pow_b": "0x193211194af0fb9a0f41b1b6fff85dae" + }, + { + "a": "0x1274f8c57b", + "b": "0x1f643f98cbd179d221d8e5f37fa", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x1f643f98cbd179d22300357fd75", + "a_m_sub_b_m": "0x3141079a8b32c6bc288f27dcfc3e8d63c", + "a_m_mul_b_m": "0x1489047be7d88d6ab3e51f8b9347ed7ad", + "a_eq_b": false, + "a_m_pow_b": "0x2e300d7a780de431a872ae36b8d84328c" + }, + { + "a": "0x14181a218e", + "b": "0x443b601ce5fc6", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x443ca19e88154", + "a_m_sub_b_m": "0x314107b9ef725f87fa08b5c38f39b0a83", + "a_m_mul_b_m": "0x55b100a3df0898e4eda5d4", + "a_eq_b": false, + "a_m_pow_b": "0x308ece2c3bd9935b6d28324a68a3182f1" + }, + { + "a": "0x263df926df61c53457d1d37cc7afae8f", + "b": "0x824b398071b14642cddb", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x263df926df62477f9152452e0df27c6a", + "a_m_sub_b_m": "0x263df926df6142e91e5161cb816ce0b4", + "a_m_mul_b_m": "0x1f6f8a5f78e86ff500a90dcb006d0ba19", + "a_eq_b": false, + "a_m_pow_b": "0x1c1b26c435c4d8755f85749cd9b3b51d8" + }, + { + "a": "0xce051e13d7284617776c3a", + "b": "0x2253df737c2185e77dc58ea6a", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2260bfc55d5ef86bdf3d056a4", + "a_m_sub_b_m": "0x314107b9cd2b60665f24e69a9186dca8b", + "a_m_mul_b_m": "0x1b5e1bbfa3595ea998a04fe772639e367", + "a_eq_b": false, + "a_m_pow_b": "0x2e0435761bb6d0c86796d78c3264caa14" + }, + { + "a": "0xdbf26ecc814ed3ce166c6aba8f614bd", + "b": "0x735a47e3", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xdbf26ecc814ed3ce166c6ac1c505ca0", + "a_m_sub_b_m": "0xdbf26ecc814ed3ce166c6ab359bccda", + "a_m_mul_b_m": "0x27cb24cddf176e4e3c67743ae6f7a7c63", + "a_eq_b": false, + "a_m_pow_b": "0x1889fc9d6ea3fe9c300a4777de779aee9" + }, + { + "a": "0x6deb8eeea75e34d", + "b": "0x1f51af4321addd3e779", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x1f521d2eb09c849cac6", + "a_m_sub_b_m": "0x314107b9ef725f68a8c7a26aee9f1448f", + "a_m_mul_b_m": "0x12257297dbc56cca2b0fba3478e0cc779", + "a_eq_b": false, + "a_m_pow_b": "0x2bb012c0f556f444c069b838e79966ee9" + }, + { + "a": "0xd6f4b445aa", + "b": "0xf4fab2ad88091a21d6637c09f", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xf4fab2ad88091a2f45aec0649", + "a_m_sub_b_m": "0x314107b8fa77acda71ffdfe946bcbcdc6", + "a_m_mul_b_m": "0x72f8ee01f52adaf89e5d16d9bfaa0fb7", + "a_eq_b": false, + "a_m_pow_b": "0xd65195aaac6a9aea1d5624e01553bcb8" + }, + { + "a": "0x0", + "b": "0x61b917ee2fe6681091fe0a5a0322", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x61b917ee2fe6681091fe0a5a0322", + "a_m_sub_b_m": "0x3141019e5df37c899387f0ddcd2f54599", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x15c94dcf", + "b": "0x821", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x15c955f0", + "a_m_sub_b_m": "0x15c945ae", + "a_m_mul_b_m": "0xb119617faf", + "a_eq_b": false, + "a_m_pow_b": "0x26a424c05efc714189cb4c4181ef0f2b2" + }, + { + "a": "0x2bdb62ff314e167063309a536e998952c", + "b": "0x0", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2bdb62ff314e167063309a536e998952c", + "a_m_sub_b_m": "0x2bdb62ff314e167063309a536e998952c", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x2b562", + "b": "0x2d725666f9179cf00183cfeceb09220", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2d725666f9179cf00183cfeceb34782", + "a_m_sub_b_m": "0x31139563887947eb0a07762dc0ea16bfd", + "a_m_mul_b_m": "0x269760b709ca6b5eddfe51bc0b242057b", + "a_eq_b": false, + "a_m_pow_b": "0x2d84aad462179f416cba3bd01f75c7571" + }, + { + "a": "0x1b95331356074f3be0", + "b": "0x61790a6b7", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x1b9533135c1edfe297", + "a_m_sub_b_m": "0x1b9533134fefbe9529", + "a_m_mul_b_m": "0xa8092fedf28cf43d6f68770d20", + "a_eq_b": false, + "a_m_pow_b": "0x25655fecae5ef8420ac0865ab9d116ed0" + }, + { + "a": "0x29b13de531062d7f7a", + "b": "0x3e113729bd820e4ad24e2", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x3e13d23d9bd51eadaa45c", + "a_m_sub_b_m": "0x314107b9ef7221795df31aceafecfa353", + "a_m_mul_b_m": "0x1fa0268fcca6ff1b36fd7653960b89a7", + "a_eq_b": false, + "a_m_pow_b": "0x1db0608352c1a98ff34d6a66a1f06508f" + }, + { + "a": "0x16a8d3e84", + "b": "0xbf9bbcf742c5905", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xbf9bbd0deb99789", + "a_m_sub_b_m": "0x314107b9ef725f87f9495e40cd3b02e3a", + "a_m_mul_b_m": "0x10f5bf0c73cac768be2e1c94", + "a_eq_b": false, + "a_m_pow_b": "0x8706b3d1d4fb07f5cefc9ffc085856c5" + }, + { + "a": "0x2e572323dc9c67781b2c3a31607", + "b": "0x644a6cf70df67b9", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2e572323dc9ccbc288234827dc0", + "a_m_sub_b_m": "0x2e572323dc9c032dae352c3ae4e", + "a_m_mul_b_m": "0x2aae35c70c06a2b1a4f038443fb29ad37", + "a_eq_b": false, + "a_m_pow_b": "0x8bbf0f160769f00e60828f74aae956c7" + }, + { + "a": "0x58166a1a98", + "b": "0xa7b5", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x58166ac24d", + "a_m_sub_b_m": "0x58166972e3", + "a_m_mul_b_m": "0x39b4e7105df578", + "a_eq_b": false, + "a_m_pow_b": "0x18db1a6ba67dc4b8ef57d7e4c3b11ef83" + }, + { + "a": "0x38f77f63854", + "b": "0x1553fb2ed1b9534807300961c3", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x1553fb2ed1b9534b96a7ff9a17", + "a_m_sub_b_m": "0x314107b89a32ac9ade73c5b63253c1f4c", + "a_m_mul_b_m": "0x2fadfc517cc315fa37057f32a0160e7ce", + "a_eq_b": false, + "a_m_pow_b": "0x19fe9dea42138136edd83cc7dcd65f80d" + }, + { + "a": "0xf0fe991ab513369fe284edc641cd", + "b": "0xf0fe991ab513369fe284edc641cd", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x1e1fd32356a266d3fc509db8c839a", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xa7ac7bdbccb2c9f7e2f700258a4a9006", + "a_eq_b": true, + "a_m_pow_b": "0xd67f5329b2ece4b4372a73a38199f0c7" + }, + { + "a": "0x2c91abb2966398e4a295d", + "b": "0x2c91abb2966398e4a295d", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x592357652cc731c9452ba", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xe265e6ae010d6d25b0472bbec507eed3", + "a_eq_b": true, + "a_m_pow_b": "0x798a2886be1b89b68b11ceaf7bafedec" + }, + { + "a": "0x3b3bd79840658d1", + "b": "0x58983faf7975467e5168dc", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x58983fb32d32c00257c1ad", + "a_m_sub_b_m": "0x314107b9ef6cd603ff4c9e80de30438b0", + "a_m_mul_b_m": "0x20de7d800a9e2e89429ce7a7603805013", + "a_eq_b": false, + "a_m_pow_b": "0x222c111e193307bd231a7ed2dd81a3f98" + }, + { + "a": "0xe40ca20702a5b67b7ae7758", + "b": "0xf6c0c6f361c49764e0dab3efb80c63", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xf6c0c701a28eb7d50b361ba76683bb", + "a_m_sub_b_m": "0x31319bad81204fe08abd9208ea545b3b0", + "a_m_mul_b_m": "0x2bf7139bd9a448f8431862d3824be36e", + "a_eq_b": false, + "a_m_pow_b": "0xfae5ef912c5ee5e7c23dfc4ba18e8b72" + }, + { + "a": "0x42b93dda0bee2ebdb44788bd", + "b": "0x204a225183835e1392e8a74bec5", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x204e4de561241cf67ec3ebc4782", + "a_m_sub_b_m": "0x31410799a97ba1e21769c956a072212b3", + "a_m_mul_b_m": "0x6f28709b8c526608763c8fed61f5699c", + "a_eq_b": false, + "a_m_pow_b": "0x1ccd232b03329fe50b0cc1417c4a6279" + }, + { + "a": "0x20fa80e3c095e0997e240205bb00d206", + "b": "0x217cae", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x20fa80e3c095e0997e240205bb224eb4", + "a_m_sub_b_m": "0x20fa80e3c095e0997e240205badf5558", + "a_m_mul_b_m": "0x26cf1b1cceac15acf6c0c8ba772822b4a", + "a_eq_b": false, + "a_m_pow_b": "0x2b6ce04c1615988d2846e3a6baaf0258a" + }, + { + "a": "0xde", + "b": "0xe261f9c40838330558", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xe261f9c40838330636", + "a_m_sub_b_m": "0x314107b9ef725f79d3e95dbd2a51c4441", + "a_m_mul_b_m": "0xc450f697ff20bc3ea250", + "a_eq_b": false, + "a_m_pow_b": "0x17922813bb554fe98318536e00f9fea6c" + }, + { + "a": "0x45a21b016c7354a", + "b": "0x1f579", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x45a21b016c92ac3", + "a_m_sub_b_m": "0x45a21b016c53fd1", + "a_m_mul_b_m": "0x886728788ce9f7201fa", + "a_eq_b": false, + "a_m_pow_b": "0x1b2a5db46decc71a34df7e986ef34181e" + }, + { + "a": "0x4e", + "b": "0x10e299cb48", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x10e299cb96", + "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fc9fab57dc1", + "a_m_mul_b_m": "0x5250adbeff0", + "a_eq_b": false, + "a_m_pow_b": "0x205d3ecb95bb893792ab70ee1c03ecf40" + }, + { + "a": "0x18b", + "b": "0x1ad700f424ffa", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x1ad700f425185", + "a_m_sub_b_m": "0x314107b9ef725f87fa08df26ace0cfa4c", + "a_m_mul_b_m": "0x2969be78b5166be", + "a_eq_b": false, + "a_m_pow_b": "0x254df960b807b589ed0e447991890a4f1" + }, + { + "a": "0x3059ebb2ed1cae1937ed61f4ee8751766", + "b": "0x3abad68", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x3059ebb2ed1cae1937ed61f4eec20c4ce", + "a_m_sub_b_m": "0x3059ebb2ed1cae1937ed61f4ee4c969fe", + "a_m_mul_b_m": "0x256fca7d9cbf859987d6bde3c53ef3bf5", + "a_eq_b": false, + "a_m_pow_b": "0x217df662521960c8ae4408b3cbd2ef29" + }, + { + "a": "0x120d5c16e961139cf", + "b": "0x120d5c16e961139cf", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x241ab82dd2c22739e", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x145e1a5b445d468c73a65fccb4e8bd561", + "a_eq_b": true, + "a_m_pow_b": "0x1b37cd42c507375862cbdd8bcdea5ad37" + }, + { + "a": "0x16f1612", + "b": "0x6228702bb15931c9b4706146ff", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x6228702bb15931c9b471d05d11", + "a_m_sub_b_m": "0x314107b3cceb5ccce475dd6266e5d17ce", + "a_m_mul_b_m": "0x8cc06f2f1ee32e82b682cbcd0a81e7ee", + "a_eq_b": false, + "a_m_pow_b": "0x13d3c852cf3ecc6dabb3bac0f1645e705" + }, + { + "a": "0xf73a137503d77", + "b": "0x0", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xf73a137503d77", + "a_m_sub_b_m": "0xf73a137503d77", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x59c7cfaa2cbad467a6bdf", + "b": "0x745d4dc2301882ab92580b2db0c", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x745d4e1bf7e82cd84d2c72d46eb", + "a_m_sub_b_m": "0x314107459224f71fb1307b262a316d98e", + "a_m_mul_b_m": "0x4995ac30740bf03e4cff92a71f5f58d9", + "a_eq_b": false, + "a_m_pow_b": "0xe491a69de1bee739f4eb5f873ed895a8" + }, + { + "a": "0x65f5e72c94151d52fa3935ff283550", + "b": "0x10b", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x65f5e72c94151d52fa3935ff28365b", + "a_m_sub_b_m": "0x65f5e72c94151d52fa3935ff283445", + "a_m_mul_b_m": "0x6a57781b7e7205958af9ab511eef9a70", + "a_eq_b": false, + "a_m_pow_b": "0x7135ad0acc9e433d58d6ab23c4db6e54" + }, + { + "a": "0x1a5028361fa94501d7", + "b": "0xc2734d1c23d83f22", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x1b129b833bcd1d40f9", + "a_m_sub_b_m": "0x198db4e903856cc2b5", + "a_m_mul_b_m": "0x18435825b0f789253ccd55bb9392a732c", + "a_eq_b": false, + "a_m_pow_b": "0x239e18e4f5db3ea49d0054cade748138" + }, + { + "a": "0xc0e39b66d71951a051847e77e2b", + "b": "0x6feea6c749cf41f7550bcb550f221", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x70af8a62b0a65b48f55d4fd38704c", + "a_m_sub_b_m": "0x3140988c2c467c8fd163454366fe5d4c5", + "a_m_mul_b_m": "0xf94700ff9eb9edd893422fd428cb1ae3", + "a_eq_b": false, + "a_m_pow_b": "0x5271d34204492a64a9d425f5713308a6" + }, + { + "a": "0x2623a35ae7a31a27cced4dd7cb4ca0142", + "b": "0x1f5d61476", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2623a35ae7a31a27cced4dd7eaaa015b8", + "a_m_sub_b_m": "0x2623a35ae7a31a27cced4dd7abef3eccc", + "a_m_mul_b_m": "0x5901ebcd999eb71cf1a3164f3ff0bb1f", + "a_eq_b": false, + "a_m_pow_b": "0xe2500f54e3b1c963d2f53d2de1ea3f5b" + }, + { + "a": "0x0", + "b": "0xc81ce3f97ff5101d", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xc81ce3f97ff5101d", + "a_m_sub_b_m": "0x314107b9ef725f87ed872bbe15d5a389e", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x5505", + "b": "0xb8a7ac5426b1caba", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xb8a7ac5426b21fbf", + "a_m_sub_b_m": "0x314107b9ef725f87ee7e7f386b69dd306", + "a_m_mul_b_m": "0x3d53477e4e7dc9c8b7a2", + "a_eq_b": false, + "a_m_pow_b": "0x2bc356fd7acbb54596550303c60dc911c" + }, + { + "a": "0xae6606f9f4e6", + "b": "0x1418f5a5ade", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xafa796544fc4", + "a_m_sub_b_m": "0xad24779f9a08", + "a_m_mul_b_m": "0xdb0f974b1743007fb73b74", + "a_eq_b": false, + "a_m_pow_b": "0x1a26fe1fd1aba1d752513b9e8c3d45529" + }, + { + "a": "0xbf7beb778d6", + "b": "0x3d", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xbf7beb77913", + "a_m_sub_b_m": "0xbf7beb77899", + "a_m_mul_b_m": "0x2da0871b7cafe", + "a_eq_b": false, + "a_m_pow_b": "0xd5e51f1ca81cfd9620c00939e6250047" + }, + { + "a": "0xe97b", + "b": "0x4b00c663db160641207417e71a608f0d", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x4b00c663db160641207417e71a617888", + "a_m_sub_b_m": "0x2c90fb53b1c0ff23e801b87f3c2efa329", + "a_m_mul_b_m": "0x1efb5805dfb9cf41cca610c2654ff9557", + "a_eq_b": false, + "a_m_pow_b": "0xe2878a88c26471746ac8651c4c36a965" + }, + { + "a": "0x105667", + "b": "0xe9967fc145cfe469a1289ac91c01e", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xe9967fc145cfe469a1289aca21685", + "a_m_sub_b_m": "0x31401e236fb119b8159f58d5130cddf04", + "a_m_mul_b_m": "0x17af339fabce78144079f69a4d6357fd3", + "a_eq_b": false, + "a_m_pow_b": "0xff3e9d68a61c9de8f46f6703046f7c3c" + }, + { + "a": "0x5bda314883e1fa8ac", + "b": "0x2723dc8f5b17078ee112930f2cf21ae6a", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2723dc8f5b17078f3cecc457b0d415716", + "a_m_sub_b_m": "0xa1d2b2a945b57f974d0983704c4d42fd", + "a_m_mul_b_m": "0x22668867197b7517ab9719dddc4b86981", + "a_eq_b": false, + "a_m_pow_b": "0xeecf1b720f27dfe209663802f2d33cee" + }, + { + "a": "0x44a0609aa", + "b": "0x10b82234c40f40e5e8fa", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x10b82234c4138aebf2a4", + "a_m_sub_b_m": "0x314107b9ef725e7c77e5adbcfe66f696b", + "a_m_mul_b_m": "0x47b627a8b1a096a45a0ce7b98004", + "a_eq_b": false, + "a_m_pow_b": "0xf441a250aefe052f09310576c88afea9" + }, + { + "a": "0xe59ba9bcae27d", + "b": "0xd9554f5edf7e9bf79f4", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xd95550447b2858a5c71", + "a_m_sub_b_m": "0x314107b9ef725eaea4ba80b9d8f5ab144", + "a_m_mul_b_m": "0xc2ed76c06c4346ea8a2bdd9d22aff424", + "a_eq_b": false, + "a_m_pow_b": "0x79cc7fee446c7e97d50cee321a1957b2" + }, + { + "a": "0x2fd7e239089090d244c1d44db0", + "b": "0xc577aa515", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2fd7e239089090d251194ef2c5", + "a_m_sub_b_m": "0x2fd7e239089090d2386a59a89b", + "a_m_mul_b_m": "0x27f980e0efcfcc35b10d6761a74358beb", + "a_eq_b": false, + "a_m_pow_b": "0x110cbe13f7d421d7950a63deeac0b6298" + }, + { + "a": "0x2c6f", + "b": "0x2db0dff111a6c3c2598e16bc0338589c7", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2db0dff111a6c3c2598e16bc03385b636", + "a_m_sub_b_m": "0x39027c8ddcb9bc5a07ae341aa9c9eb63", + "a_m_mul_b_m": "0x5b810899ea29bdf1e83dbbdf2e971561", + "a_eq_b": false, + "a_m_pow_b": "0x1a371280805a23cc990aeed23f2d852ae" + }, + { + "a": "0xc4864dcfd09276", + "b": "0xc4864dcfd09276", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x1890c9b9fa124ec", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x96dded9bc4954a2e99c5278ace64", + "a_eq_b": true, + "a_m_pow_b": "0x1c623c91a6233240edd675959b0c6fcbe" + }, + { + "a": "0x2d273dcbef65a1a2a4f768aacdec22e0c", + "b": "0x7749afd9502e1d5167ad089", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2d273dcbefdceb527e4796c81f53cfe95", + "a_m_sub_b_m": "0x2d273dcbeeee57f2cba73a8d7c8475d83", + "a_m_mul_b_m": "0x1af7e2fb1fdda77e39e995ea26eb13739", + "a_eq_b": false, + "a_m_pow_b": "0x17d1479ab2c90ac2912ded3458a600c67" + }, + { + "a": "0x18b8881d0ee1", + "b": "0x579ce51bb91c1", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x59286d9d8a0a2", + "a_m_sub_b_m": "0x314107b9ef725f87fa08a3ec513b0c5db", + "a_m_mul_b_m": "0x875dcd490dbf193422b0a8a1", + "a_eq_b": false, + "a_m_pow_b": "0x2e95d8a60a468c48f2746eda10d2de2c1" + }, + { + "a": "0x74817131eb", + "b": "0x0", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x74817131eb", + "a_m_sub_b_m": "0x74817131eb", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x480a17176", + "b": "0x11f78b6e4d16e", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x11f7d378642e4", + "a_m_sub_b_m": "0x314107b9ef725f87fa08e8066a70be8c3", + "a_m_mul_b_m": "0x50e5481597eb6041816b4", + "a_eq_b": false, + "a_m_pow_b": "0x21332a88447ec93beadd8b7a9db0263a8" + }, + { + "a": "0x7dfa2225d77c6d8ae1", + "b": "0xf56aa", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x7dfa2225d77c7ce18b", + "a_m_sub_b_m": "0x7dfa2225d77c5e3437", + "a_m_mul_b_m": "0x78c4dafcb03cf509094cf6a", + "a_eq_b": false, + "a_m_pow_b": "0x26e12fabc74b881fdd85a7627dad06607" + }, + { + "a": "0xc24a289", + "b": "0x139c99d5f9e", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x139d5c20227", + "a_m_sub_b_m": "0x314107b9ef725f87fa08f9ea11fd68ba6", + "a_m_mul_b_m": "0xee25af41f55f2278e", + "a_eq_b": false, + "a_m_pow_b": "0x2dbadf4d389daef948a8f9fb62be3c528" + }, + { + "a": "0xcb517b768615", + "b": "0x9c8fe0b2d46b01630", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x9c8fed67ec2269c45", + "a_m_sub_b_m": "0x314107b9ef725f875d7925fff1215b8a0", + "a_m_mul_b_m": "0x7c57ec35844db5dd4e2ba422ef1f0", + "a_eq_b": false, + "a_m_pow_b": "0x4325ad01009d808433276e3ca51fa61e" + }, + { + "a": "0x82115", + "b": "0x82115", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x10422a", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x4215966bb9", + "a_eq_b": true, + "a_m_pow_b": "0x104f8925eefe866a7d03c7114c75329f5" + }, + { + "a": "0x0", + "b": "0x7b3f175d015c7a82023f3e5ae", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x7b3f175d015c7a82023f3e5ae", + "a_m_sub_b_m": "0x314107b97433482af8ac7f7bab95b630d", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x2d6428b0c780f2f", + "b": "0x2681d30de4c15514db40eb501bb2c2c42", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2681d30de4c15514db6e4f78cc7a43b71", + "a_m_sub_b_m": "0xabf34ac0ab10a731ef572d642e9b2ba8", + "a_m_mul_b_m": "0x1f95c4623205324487581b631506a3408", + "a_eq_b": false, + "a_m_pow_b": "0x147c381e3e4ddac3f16a83dedd222f60b" + }, + { + "a": "0x790c", + "b": "0x1a4ed017b", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x1a4ed7a87", + "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fd93862c04c", + "a_m_mul_b_m": "0xc707c0cf34c4", + "a_eq_b": false, + "a_m_pow_b": "0xb39b62414dd87b2147ebd96caa0ca55e" + }, + { + "a": "0x7c1bf2", + "b": "0x4", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x7c1bf6", + "a_m_sub_b_m": "0x7c1bee", + "a_m_mul_b_m": "0x1f06fc8", + "a_eq_b": false, + "a_m_pow_b": "0xe243952caa27e5248501610" + }, + { + "a": "0x6", + "b": "0x4550c54d4", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x4550c54da", + "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fd68842f3ed", + "a_m_mul_b_m": "0x19fe49fcf8", + "a_eq_b": false, + "a_m_pow_b": "0x2a593bf880aaa4a192ce41aaaa051255e" + }, + { + "a": "0x24c045883b", + "b": "0x24c045883b", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x49808b1076", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x546a3f6afd3384cbd99", + "a_eq_b": true, + "a_m_pow_b": "0x1acbbfc11855ddb856e6e742a169cd5f3" + }, + { + "a": "0x12b30e6986c52c1b8923cba17874166b", + "b": "0x12b30e6986c52c1b8923cba17874166b", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x25661cd30d8a583712479742f0e82cd6", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x30ee70ca3b3187dcdebad15cc6779213", + "a_eq_b": true, + "a_m_pow_b": "0xec0e9a05cd6bbcb8dbeb24ba26ca87be" + }, + { + "a": "0x4979bc584c650276d05f2e38d20dbea", + "b": "0x12414e11a15c325efc3a9", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x4979bc584c7743c4e2008a6b3109f93", + "a_m_sub_b_m": "0x4979bc584c52c128bebdd2067311841", + "a_m_mul_b_m": "0x163bff2b8b41ec12fc141e4f55e6ca8a7", + "a_eq_b": false, + "a_m_pow_b": "0x11ff2a49e30528db8eb5296fba8aea8e2" + }, + { + "a": "0x2aa0cc3271daa42fc90b15e3da5005582", + "b": "0x68dad5bd09e1abb976ae5fb66f1b0a0", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x2b09a7082ee485db8281c44390bf20622", + "a_m_sub_b_m": "0x2a37f15cb4d0c2840f94678423e0ea4e2", + "a_m_mul_b_m": "0xd973adf5d0e45efaf1e59c1e8d6b4bc6", + "a_eq_b": false, + "a_m_pow_b": "0x12f99de6ed0a846b9853daed4bf7e874f" + }, + { + "a": "0xe245b7b9a6edc1099fb91b808ea422", + "b": "0x2", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0xe245b7b9a6edc1099fb91b808ea424", + "a_m_sub_b_m": "0xe245b7b9a6edc1099fb91b808ea420", + "a_m_mul_b_m": "0x1c48b6f734ddb82133f7237011d4844", + "a_eq_b": false, + "a_m_pow_b": "0x253e3bdeb68281d7c54ad1894bc1eaf74" + }, + { + "a": "0x431bed4f8bb62aff3e6fdeb2", + "b": "0x25da23c06f146b0800a2cf6a95bd38392", + "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", + "a_m_add_b_m": "0x25da23c0734629dcf95e321a89a436244", + "a_m_sub_b_m": "0xb66e3f9848fb354f2218d430bfeba3db", + "a_m_mul_b_m": "0x191fb5760ed4bcde8238b81c51ef712be", + "a_eq_b": false, + "a_m_pow_b": "0x219bb4b2fdb2f577fa0e4a86feccd6c14" + } + ], + "even_mod_130": [ + { + "a": "0xfa3a78c1cdaa78388373c74dbc2", + "b": "0x22cec0959b8", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xfa3a78c1cdaa7838a64287e357a", + "a_m_sub_b_m": "0xfa3a78c1cdaa783860a506b820a", + "a_m_mul_b_m": "0x2e4e7425c26a016dea6ac8d9b19b987de", + "a_eq_b": false, + "a_m_pow_b": "0xec0af8aa272855a718eda24f6c7eb292" + }, + { + "a": "0x715d545de36", + "b": "0x437e67e9e4f06c", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x43857dbf2acea2", + "a_m_sub_b_m": "0x314107b9ef725f87fa04c2888c8b03684", + "a_m_mul_b_m": "0x1de3670838fd2fa5a87e45ec8", + "a_eq_b": false, + "a_m_pow_b": "0x1a9fc22b761f4d6ba2f41e528d65e4d9c" + }, + { + "a": "0x1e229c8fe812", + "b": "0x1d832cb6a7", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x1e401fbc9eb9", + "a_m_sub_b_m": "0x1e051963316b", + "a_m_mul_b_m": "0x3795cb5de1a6989f52fbe", + "a_eq_b": false, + "a_m_pow_b": "0x1ee40888488b298560f4a57560431e550" + }, + { + "a": "0xc14361c57ab3d992624", + "b": "0xbcf87ff0749df1fff13a9049", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xbcf88c04aaba49ab2ed3b66d", + "a_m_sub_b_m": "0x314107b9e3a2d84a3620e058629adde95", + "a_m_mul_b_m": "0xa689d11ef98aae63fec8c667ff89a0d4", + "a_eq_b": false, + "a_m_pow_b": "0xb6d564c58c0de4b63bfce4d1ffd61ce6" + }, + { + "a": "0x2f52722246", + "b": "0x3c99e105", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2f8f0c034b", + "a_m_sub_b_m": "0x2f15d84141", + "a_m_mul_b_m": "0xb33c49ea1d030315e", + "a_eq_b": false, + "a_m_pow_b": "0xd91fa2e34322947606674c18e8ed1e42" + }, + { + "a": "0xb5d5870e79d1be27f29e86c", + "b": "0x116054f0566bb1a48e250b91e51", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x11610ac5dd7a2b764c4cfe306bd", + "a_m_sub_b_m": "0x314107a88fd344b89cd1272db0bc012d5", + "a_m_mul_b_m": "0x212dabf54638221d11065300868b2c9f4", + "a_eq_b": false, + "a_m_pow_b": "0x181b510db0eeb9bde8ef4b1ca1c28976e" + }, + { + "a": "0x25275555ded", + "b": "0x11be162a77dc7b27338fc", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x11be162a7801a27c896e9", + "a_m_sub_b_m": "0x314107b9ef724dc9e3de82465a0316dab", + "a_m_mul_b_m": "0x293331394b5d7f444f81fb9280b4d4c", + "a_eq_b": false, + "a_m_pow_b": "0x102f9a747bd308fffe8b4ab9c65cb5015" + }, + { + "a": "0xd5ab", + "b": "0x1d469e62a3fb58c46e2bc4f12b0d5", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x1d469e62a3fb58c46e2bc4f138680", + "a_m_sub_b_m": "0x3140ea73510fbb8ca1448bd1e8e3d6d90", + "a_m_mul_b_m": "0x186f4ff3de53a9bfbae0021935e9d5747", + "a_eq_b": false, + "a_m_pow_b": "0xdc3ed5cf99966ac52f2dc7487ba04e47" + }, + { + "a": "0x12eb7e8a0ce5b5f", + "b": "0x0", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x12eb7e8a0ce5b5f", + "a_m_sub_b_m": "0x12eb7e8a0ce5b5f", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x1784839", + "b": "0x1784839", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2f09072", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x229143bd01cb1", + "a_eq_b": true, + "a_m_pow_b": "0x2e07ab106cfbd6ea08f066b62dbd54a4d" + }, + { + "a": "0xcba44718e12c32a564ff", + "b": "0xc3a72a669", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xcba44718e1386d180b68", + "a_m_sub_b_m": "0xcba44718e11ff832be96", + "a_m_mul_b_m": "0x9ba31c0cde6a5f41fc674c4e1c697", + "a_eq_b": false, + "a_m_pow_b": "0x11afda3f8335d638210915f1ad7f2bf3f" + }, + { + "a": "0x2814147ca83455f1f6", + "b": "0x423396bad500", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x281414bedbcb10c6f6", + "a_m_sub_b_m": "0x2814143a749d9b1cf6", + "a_m_mul_b_m": "0xa5d40e13c23a2c218f5c5730dae00", + "a_eq_b": false, + "a_m_pow_b": "0x226570ab00c2cd4dd862ba4465175aaa8" + }, + { + "a": "0x1bdc5a588", + "b": "0x1bdc5a588", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x37b8b4b10", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x30838ba12fe589840", + "a_eq_b": true, + "a_m_pow_b": "0x10a8fba85340e8b4d990e35abb47efdc" + }, + { + "a": "0xb5d2ebe96b24b7d424", + "b": "0x3d2ca5f0cb", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xb5d2ebe9a8515dc4ef", + "a_m_sub_b_m": "0xb5d2ebe92df811e359", + "a_m_mul_b_m": "0x2b72f853229f081259e85fdaf88c", + "a_eq_b": false, + "a_m_pow_b": "0x1ec8b05b42cdfc8fee2d857440687b9aa" + }, + { + "a": "0xb0519f6b51e3a7b", + "b": "0x15910c313bd6478a399", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x1591bc82db41996de14", + "a_m_sub_b_m": "0x314107b9ef725f7269ad1a6142df4df9c", + "a_m_mul_b_m": "0x28a56c659f367719b0f141d2b7eb8219b", + "a_eq_b": false, + "a_m_pow_b": "0x3f655a2ac072ca9d9650013b003caf09" + }, + { + "a": "0x146e6c4", + "b": "0x15afca92720ac2e8fae231f0e150", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x15afca92720ac2e8fae23337c814", + "a_m_sub_b_m": "0x3141065ef2c938674dda6a4f8aca54e2e", + "a_m_mul_b_m": "0x310e4a41c2b196c0d0355e7f4a8401b70", + "a_eq_b": false, + "a_m_pow_b": "0x289c1e4c5a102a4632715bf687f36a144" + }, + { + "a": "0x8d1f9830a2393604c83ca", + "b": "0x591b92f8b8a849529b662f7ed", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x591c201850d8eb8bd16af7bb7", + "a_m_sub_b_m": "0x314107b9965759aed99152e448738d497", + "a_m_mul_b_m": "0x6ba9b22a83417eb2d5a8288b47aebb84", + "a_eq_b": false, + "a_m_pow_b": "0x525b620f22e3f778390cce7893670d46" + }, + { + "a": "0x2d05477fd7fd135cb60f26a75e179", + "b": "0xf770ca8d", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2d05477fd7fd135cb60f361e6ac06", + "a_m_sub_b_m": "0x2d05477fd7fd135cb60f1730516ec", + "a_m_mul_b_m": "0xdeb1e4ece401dc83067b4ca602f1f5ad", + "a_eq_b": false, + "a_m_pow_b": "0x266679531f86a3cd80252a4472c990c0b" + }, + { + "a": "0xbd9f33ba68577", + "b": "0xbd9f33ba68577", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x17b3e6774d0aee", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x8c7475628a12854bc035e8dd51", + "a_eq_b": true, + "a_m_pow_b": "0xce7fa5420fb73a6e06198e97175ab2ff" + }, + { + "a": "0x286901942366e3cca8c479390d41cc2bc", + "b": "0x28559b5", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x286901942366e3cca8c479390d6a21c71", + "a_m_sub_b_m": "0x286901942366e3cca8c479390d1976907", + "a_m_mul_b_m": "0x94c6b651a3de5dc5347f25390c1b8f88", + "a_eq_b": false, + "a_m_pow_b": "0x1c2e8af59567409b20f9b85ffb1a3c168" + }, + { + "a": "0x6c3559cd83d907647513c9e6e630", + "b": "0x165", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x6c3559cd83d907647513c9e6e795", + "a_m_sub_b_m": "0x6c3559cd83d907647513c9e6e4cb", + "a_m_mul_b_m": "0x96e6663b98dda74f1744988eff00f0", + "a_eq_b": false, + "a_m_pow_b": "0x1606404b435218f0232163c5054082282" + }, + { + "a": "0x40e5ecd35f581e", + "b": "0x24a3eacf0a622053dd5ff789446ac3201", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x24a3eacf0a622053dd6405e811a0b8a1f", + "a_m_sub_b_m": "0xc9d1ceae5103f341cad10d336a026ed7", + "a_m_mul_b_m": "0xacdcf496defc532efb5f9d76eef22b7a", + "a_eq_b": false, + "a_m_pow_b": "0x25b5882b8ab98e354e4967efda7c815da" + }, + { + "a": "0x12d6abbd2fe0e095bbfd", + "b": "0x5d73d5", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x12d6abbd2fe0e0f32fd2", + "a_m_sub_b_m": "0x12d6abbd2fe0e0384828", + "a_m_mul_b_m": "0x6e0827f7d459c71636af11081", + "a_eq_b": false, + "a_m_pow_b": "0x6fcffb16273f466d914b50237795b943" + }, + { + "a": "0x2124190bdb5bf01f", + "b": "0x52a2a714ad5ac10cbd3ccd61", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x52a2a714ce7eda189898bd80", + "a_m_sub_b_m": "0x314107b9ea483516b1458f7d9fb6e6b78", + "a_m_mul_b_m": "0x8dd52ffb8c4302f24dd2cca5ea9d31ef", + "a_eq_b": false, + "a_m_pow_b": "0x66369a49914916e6c5ee17023b4c376b" + }, + { + "a": "0xdc07d", + "b": "0xec8b2835bff857d114b", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xec8b2835bff858ad1c8", + "a_m_sub_b_m": "0x314107b9ef725e9b6ee0c43db57dff7ec", + "a_m_mul_b_m": "0xcb4ece8d5b1d573bdbd8b19f", + "a_eq_b": false, + "a_m_pow_b": "0x2a6d3d3cc8e9b0065b9418221edbe3d07" + }, + { + "a": "0x2470dd4704248988cf091523be", + "b": "0x2982bbbc95dd24bd27c4bf8d59949066", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2982bbe106ba6bc14c4e485c62a9b424", + "a_m_sub_b_m": "0x2ea8dc006d2261ac69d54691c8ccfdc12", + "a_m_mul_b_m": "0x1afeda6ffad22d9143f7f44a0a09b0e4e", + "a_eq_b": false, + "a_m_pow_b": "0x1fe2396e4a3cc9d152e199ecffce461e4" + }, + { + "a": "0x51d4752864120e", + "b": "0x2273d6cadf41", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x51f6e8ff2ef14f", + "a_m_sub_b_m": "0x51b201519932cd", + "a_m_mul_b_m": "0xb033ea87160687e46602ec78e", + "a_eq_b": false, + "a_m_pow_b": "0x15a5f91faf93ff2a0ac2a7c7c032619c4" + }, + { + "a": "0x37778b", + "b": "0x43d", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x377bc8", + "a_m_sub_b_m": "0x37734e", + "a_m_mul_b_m": "0xeb15a81f", + "a_eq_b": false, + "a_m_pow_b": "0x1bfd437ccaec059cd8511346ea323293b" + }, + { + "a": "0x7b9a83", + "b": "0x1a013e55e3cd2aad82997e899", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x1a013e55e3cd2aad82a13831c", + "a_m_sub_b_m": "0x314107b9d5712132163bcf502b432faa4", + "a_m_mul_b_m": "0xc8e4b016704907f06f719f6c2b104b", + "a_eq_b": false, + "a_m_pow_b": "0x169925a6d67b32c822ad08fef87212115" + }, + { + "a": "0x1fef4634a81", + "b": "0x21162ce262d64584a9ee08eef978ff2cb", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x21162ce262d64584a9ee090ee8bf33d4c", + "a_m_sub_b_m": "0x102adad78c9c1a03501af12ea3a22a070", + "a_m_mul_b_m": "0x2c620ff73d4493b38e0bd469c516c87bd", + "a_eq_b": false, + "a_m_pow_b": "0x2b2908c90a607f7a424378f18bddbf3ef" + }, + { + "a": "0xd5362158d776da0f013f4e73961f8e", + "b": "0xb653deaf9a0a724dc8f", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xd5362158d7823f4cec38ef1abafc1d", + "a_m_sub_b_m": "0xd5362158d76b74d11645adcc7142ff", + "a_m_mul_b_m": "0xd60d09e4fe52f2ed52f41250ff4b099c", + "a_eq_b": false, + "a_m_pow_b": "0x2305f87ad4762998db296b2d3c86dfc5a" + }, + { + "a": "0x1685dc1819", + "b": "0x2fcfd32468884b81da7e1572891c9992f", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2fcfd32468884b81da7e1573f17a5b148", + "a_m_sub_b_m": "0x171349586ea14061f8ae48c8d161c7a4", + "a_m_mul_b_m": "0x28110070b1c457f7c3890ef99ae7d3f19", + "a_eq_b": false, + "a_m_pow_b": "0x15d4a97201348613252426c4d6c41db25" + }, + { + "a": "0x2f2964509a7a7a2bc5350a627e31d", + "b": "0x378c0a", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2f2964509a7a7a2bc5350a65f6f27", + "a_m_sub_b_m": "0x2f2964509a7a7a2bc5350a5f05713", + "a_m_mul_b_m": "0x93a6e4c9d437bd950182f6464793aca0", + "a_eq_b": false, + "a_m_pow_b": "0x2f0d229a841e6c4a63bd50dca6212ac59" + }, + { + "a": "0x30d4ddaab72824622a4b0c73bf74e21a1", + "b": "0x152131d4f7df847eabd3be5c1933", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x30d4defcca4573e02292f730fb5aa3ad4", + "a_m_sub_b_m": "0x30d4dc58a40ad4e4320321b6838f2086e", + "a_m_mul_b_m": "0x1e8b25a08e3b9388facb6801bb3fff4e1", + "a_eq_b": false, + "a_m_pow_b": "0x14d41e8a1012bc21e9b85aa0a05ab3e8f" + }, + { + "a": "0x732a59e3741d1240bb53c9022", + "b": "0xac075d2cdf9e407af3531a5244a4514b", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xac075d341243deb235243e5df9e0e16d", + "a_m_sub_b_m": "0x268091e794a2d563bef0da9944de78791", + "a_m_mul_b_m": "0x856589913bc427bd33ce6ad7d31c272e", + "a_eq_b": false, + "a_m_pow_b": "0x17142df5f1068cd15be3e90558e1bae44" + }, + { + "a": "0x66fa2be1307fce776", + "b": "0x36e3ffd9bf21fb99669a416c71d", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x36e3ffd9bf88f5c547cac13ae93", + "a_m_sub_b_m": "0x314107830b7285c93f078c78441356913", + "a_m_mul_b_m": "0x2096f17a1a07fad4a2ba68ad8e9014d0c", + "a_eq_b": false, + "a_m_pow_b": "0x20158de22074e075e5f54c83401707306" + }, + { + "a": "0x36a88d67ca257afed8aae2c7bf199", + "b": "0x9679ddc", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x36a88d67ca257afed8aae35e38f75", + "a_m_sub_b_m": "0x36a88d67ca257afed8aae231453bd", + "a_m_mul_b_m": "0x26fe4576883f6b1168f4f63c7c505a7d6", + "a_eq_b": false, + "a_m_pow_b": "0xdf3bee00e9391b527e149b320561a8a5" + }, + { + "a": "0x107f691", + "b": "0x55d045199ccda394bdc511ad7461872", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x55d045199ccda394bdc511ad84e0f03", + "a_m_sub_b_m": "0x30eb3774d5d591e4654b34ec0071126d9", + "a_m_mul_b_m": "0x26f56bec1f53972247cc51a5a254d20ea", + "a_eq_b": false, + "a_m_pow_b": "0x175c7b1f8d65576780084d3868362b041" + }, + { + "a": "0x527d48f80159870008cccf", + "b": "0x527d48f80159870008cccf", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xa4fa91f002b30e0011999e", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x133c751f0fb493533a51854eeaf7237ab", + "a_eq_b": true, + "a_m_pow_b": "0x173c9fbda5fa3ebf7aba8d5ab00977ad7" + }, + { + "a": "0x6fef23e2598d6", + "b": "0xf32f0022e2e", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x70e252e27c704", + "a_m_sub_b_m": "0x6efbf4e236aa8", + "a_m_mul_b_m": "0x6a548c06b2857611bde3ea74", + "a_eq_b": false, + "a_m_pow_b": "0x11363cdf73ecb45e76ec7cd0ea722fd9a" + }, + { + "a": "0xd462a18", + "b": "0x268d17afa026e389adef", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x268d17afa026f0cfd807", + "a_m_sub_b_m": "0x314107b9ef725d1f288dfffb4070bc4e3", + "a_m_mul_b_m": "0x1ffbb1f2844cced9a749dcb8468", + "a_eq_b": false, + "a_m_pow_b": "0x7727cddfca3ce2d19bd8280c00eee56a" + }, + { + "a": "0xbeef", + "b": "0x7b82a6c56cb", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x7b82a6d15ba", + "a_m_sub_b_m": "0x314107b9ef725f87fa08f9822b2e3b0de", + "a_m_mul_b_m": "0x5c1e46c038fb185", + "a_eq_b": false, + "a_m_pow_b": "0x1339f573b93b097d1226394629e224437" + }, + { + "a": "0x42160e63d0e", + "b": "0x25e366dc5d641ba418f4b9bf78132a1c9", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x25e366dc5d641ba418f4ba018e218ded7", + "a_m_sub_b_m": "0xb5da0dd920e43e3e11440804bd02e3ff", + "a_m_mul_b_m": "0xb654bf0ff4f3c69977b299cc84efa0b8", + "a_eq_b": false, + "a_m_pow_b": "0x2267841268ba35eb1bd55cf111a0f9578" + }, + { + "a": "0xbbd9a3bb7bef26bf956f871af48", + "b": "0xb8e4c4e108e5d92fbed0dc29ef5907", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xb8f0827b449d98222aca332261084f", + "a_m_sub_b_m": "0x31357a297b058ca65633cc855abd19efb", + "a_m_mul_b_m": "0x9974c548baabbd862090413b9ec44434", + "a_eq_b": false, + "a_m_pow_b": "0xbcbb060599178319a0e97c7eec5b7c74" + }, + { + "a": "0x37", + "b": "0xf593afba1a172460", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xf593afba1a172497", + "a_m_sub_b_m": "0x314107b9ef725f87eaafbf020c3382491", + "a_m_mul_b_m": "0x34c2bac0fb9af8d0a0", + "a_eq_b": false, + "a_m_pow_b": "0x1a2db5b27ceb3234ea635e342e5ac0bfb" + }, + { + "a": "0x443622057b91", + "b": "0x18ed19d0a4fac67aaa0688dcfb198", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x18ed19d0a4fac67aae49eafd52d29", + "a_m_sub_b_m": "0x3140eeccd5a1ba8d338e543a8718512b3", + "a_m_mul_b_m": "0x6e8338a5a2be31515a09d40920a31f4c", + "a_eq_b": false, + "a_m_pow_b": "0x12400879d94516cea85962c762775038f" + }, + { + "a": "0x759de26cd4a30f2c5062250e33725ee", + "b": "0x258", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x759de26cd4a30f2c5062250e3372846", + "a_m_sub_b_m": "0x759de26cd4a30f2c5062250e3372396", + "a_m_mul_b_m": "0x1d64e40d65224de7fa3924e4e36b47a2e", + "a_eq_b": false, + "a_m_pow_b": "0x207f66450230bd8a3702bb9bc7771c772" + }, + { + "a": "0x33b71e722c579009ca3efb3de", + "b": "0x2ac606a5d49dd3b0ea29d06e06f5714d7", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2ac606a60854f22316816077d1346c8b5", + "a_m_sub_b_m": "0x67b01144e8baa493c36b999711e7e7c1", + "a_m_mul_b_m": "0x26e4e0ab2ea0c8ac55a5a8b8c5bdf5018", + "a_eq_b": false, + "a_m_pow_b": "0x8d64aaec0eaeeb1634ee00277b2413b8" + }, + { + "a": "0x7c1e4d4e4e2999c5e64cb8c6773e", + "b": "0x89858beb667", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x7c1e4d4e4e2999c5eee511852da5", + "a_m_sub_b_m": "0x7c1e4d4e4e2999c5ddb46007c0d7", + "a_m_mul_b_m": "0x1f2531bc53444d145a7997967206bea70", + "a_eq_b": false, + "a_m_pow_b": "0x8c19b6929f644289355e6c2112fcea56" + }, + { + "a": "0xba0cae84f77810d9e38d", + "b": "0x2c696ebab11b2332ee0934e387f42af90", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2c696ebab11b2ed3b8f1845b0901c931d", + "a_m_sub_b_m": "0x4d798ff3e5747f5d6e81491a6ee67cb7", + "a_m_mul_b_m": "0x10470553281f9fb641bcb48d75c371408", + "a_eq_b": false, + "a_m_pow_b": "0x14275935f80cf8504669167d9059bcf83" + }, + { + "a": "0x4144c872dd218eb", + "b": "0xca182df4a7486e7703aeacd85b9f", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xca182df4a748728b5035daaa748a", + "a_m_sub_b_m": "0x3140fb186c9315137362ce8b35e490606", + "a_m_mul_b_m": "0x1f83f033c041297a144fd81f29b2fa1b3", + "a_eq_b": false, + "a_m_pow_b": "0x27243e4fa507ce019a1328b17ff7270b" + }, + { + "a": "0x2a3", + "b": "0x3e4f7503", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x3e4f77a6", + "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fda9effd65a", + "a_m_mul_b_m": "0xa44b8186e9", + "a_eq_b": false, + "a_m_pow_b": "0x2f58a847905fc677177e813d08b433bc5" + }, + { + "a": "0x44226424d7ef4d433c1f", + "b": "0x23d49", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x44226424d7ef4d457968", + "a_m_sub_b_m": "0x44226424d7ef4d40fed6", + "a_m_mul_b_m": "0x989467f505d4332c85bd87d7", + "a_eq_b": false, + "a_m_pow_b": "0x1b1ac9e4b7d5c1b99aa45a16eb6ea4aab" + }, + { + "a": "0xcf3a2334974746c8933", + "b": "0x196d01cf7f935e6cc9e41768599d", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x196d01cf8c8700a013588bd4e2d0", + "a_m_sub_b_m": "0x314106231f55685dfe4561f6b3a537850", + "a_m_mul_b_m": "0x24f7ac019f5da0a758be0913a78cd6919", + "a_eq_b": false, + "a_m_pow_b": "0x1779f22f22048e36e1b04ce5d0bfc4823" + }, + { + "a": "0x2a63cca7578405abf2b535d23de2d64b9", + "b": "0x0", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2a63cca7578405abf2b535d23de2d64b9", + "a_m_sub_b_m": "0x2a63cca7578405abf2b535d23de2d64b9", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x49d5a16", + "b": "0x99a0fd2197d93", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x99a0fd6b6d7a9", + "a_m_sub_b_m": "0x314107b9ef725f87fa08605cb0fd3253d", + "a_m_mul_b_m": "0x2c4f1bf90cd1537d78a2", + "a_eq_b": false, + "a_m_pow_b": "0x51f83fe3436b36be256e8f70805556c2" + }, + { + "a": "0x3e4f235e", + "b": "0x9a18a34065b", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x9a1c88329b9", + "a_m_sub_b_m": "0x314107b9ef725f87fa08f9639916a65bd", + "a_m_mul_b_m": "0x25819a6decddc0dc66a", + "a_eq_b": false, + "a_m_pow_b": "0x1361fd991e2b58f6bf02df44537b80776" + }, + { + "a": "0x13043f84747c8d943a55e11a4073", + "b": "0x5384a176f9018b18646ce", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x13043f89acc6a503ca6e92a08741", + "a_m_sub_b_m": "0x13043f7f3c327624aa3d2f93f9a5", + "a_m_mul_b_m": "0xff15ba7a113a246c1197d5340c909cae", + "a_eq_b": false, + "a_m_pow_b": "0x3077ee8befb04b19dcfc3c8aafa69e097" + }, + { + "a": "0x37e9f2c0816241bd5a57cde5", + "b": "0x37e9f2c0816241bd5a57cde5", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x6fd3e58102c4837ab4af9bca", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x15676776010cb8d65e712548077827557", + "a_eq_b": true, + "a_m_pow_b": "0x1c9b99a89172266d6a3494b6835af0597" + }, + { + "a": "0x0", + "b": "0x92fabcae1", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x92fabcae1", + "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fd1ada37dd9", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x10a73a9a9", + "b": "0xfeb78cb110ef8", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xfeb79d584b8a1", + "a_m_sub_b_m": "0x314107b9ef725f87fa07fb4631cb1e36b", + "a_m_mul_b_m": "0x1091dcd7382303ba8c99b8", + "a_eq_b": false, + "a_m_pow_b": "0xffb11b72f529e490e1e6e8604c87e9a5" + }, + { + "a": "0x13b42a281becd", + "b": "0x63f51994841a67b2f9c4fa5577", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x63f51994841a68ee3c677c1444", + "a_m_sub_b_m": "0x314107b3b020c63fb86292823bad6b210", + "a_m_mul_b_m": "0x2dab437d6921cf803c18b875310d98d57", + "a_eq_b": false, + "a_m_pow_b": "0xb640897b6ba7d69a6e8779e718e77b51" + }, + { + "a": "0xd4fe81ba3455904083087b4", + "b": "0x0", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xd4fe81ba3455904083087b4", + "a_m_sub_b_m": "0xd4fe81ba3455904083087b4", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x186eb76dbed", + "b": "0x186eb76dbed", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x30dd6edb7da", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x254f246b98510996b5969", + "a_eq_b": true, + "a_m_pow_b": "0x1b5890c2e45c76ff092f415334336a6b7" + }, + { + "a": "0x207f8b6aa066f7a607dc9d", + "b": "0x37a240de6794", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x207f8b6aa09e99e6e64431", + "a_m_sub_b_m": "0x207f8b6aa02f5565297509", + "a_m_mul_b_m": "0xe7deef029cfdd1bae2ad3395fbd62450", + "a_eq_b": false, + "a_m_pow_b": "0x20150d26d81d0a4e45f3c500d5d13fb59" + }, + { + "a": "0x2af0e378", + "b": "0x7439b", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2af82713", + "a_m_sub_b_m": "0x2ae99fdd", + "a_m_mul_b_m": "0x137ed43aa21a8", + "a_eq_b": false, + "a_m_pow_b": "0x44d94c1840ab9688834de25d464cd0ba" + }, + { + "a": "0x610", + "b": "0x610", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xc20", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x24c100", + "a_eq_b": true, + "a_m_pow_b": "0x24675529426ff3e4b180a0826bc7b9e64" + }, + { + "a": "0x1cf1e3cc4a04", + "b": "0x161", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x1cf1e3cc4b65", + "a_m_sub_b_m": "0x1cf1e3cc48a3", + "a_m_mul_b_m": "0x27e98b1cb20f84", + "a_eq_b": false, + "a_m_pow_b": "0x2e50930a22c8c7c2c695bdb20ddee48d2" + }, + { + "a": "0xd5b26f634dbae9e7be7ad97d8c97d", + "b": "0x1d", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xd5b26f634dbae9e7be7ad97d8c99a", + "a_m_sub_b_m": "0xd5b26f634dbae9e7be7ad97d8c960", + "a_m_mul_b_m": "0x1835369e3fce2c7f4093eaa338ed329", + "a_eq_b": false, + "a_m_pow_b": "0x2abbbeb801ccb9e27ae99d6a500774f5d" + }, + { + "a": "0x7148cd0ebbd383a", + "b": "0x0", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x7148cd0ebbd383a", + "a_m_sub_b_m": "0x7148cd0ebbd383a", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x54b42d07646e18a9c1f1011b69d36af7", + "b": "0x4815e740b0dc2a", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x54b42d07646e18a9c2391702aa844721", + "a_m_sub_b_m": "0x54b42d07646e18a9c1a8eb3429228ecd", + "a_m_mul_b_m": "0x1b82d7cde1cfc6fcd267ac18457a9471c", + "a_eq_b": false, + "a_m_pow_b": "0x15d0125c2ac2065e33d5eb595f440e32b" + }, + { + "a": "0x1", + "b": "0x265decf1a2d26904840131e33277b20ad", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x265decf1a2d26904840131e33277b20ae", + "a_m_sub_b_m": "0xae31ac84c9ff6837607c81a7b5d4280e", + "a_m_mul_b_m": "0x265decf1a2d26904840131e33277b20ad", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x7650eba71d93589d9a401", + "b": "0x3b8c0ace840a08643", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x765127332861dca7a2a44", + "a_m_sub_b_m": "0x7650b01b12c4d49391dbe", + "a_m_mul_b_m": "0xeb2fb532b260046523837bce2fc9c6bf", + "a_eq_b": false, + "a_m_pow_b": "0x1b9278354d186f2d5f11937ffd423e323" + }, + { + "a": "0xc5b259f26c002fe033f78404808b20f6", + "b": "0x3a", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xc5b259f26c002fe033f78404808b2130", + "a_m_sub_b_m": "0xc5b259f26c002fe033f78404808b20bc", + "a_m_mul_b_m": "0x1b1819e3af3f741d0fe392b0d052f7d90", + "a_eq_b": false, + "a_m_pow_b": "0x248583c58fd46f498dcea674e4cd01e3e" + }, + { + "a": "0x86cfb99a06b6649e79", + "b": "0x86cfb99a06b6649e79", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x10d9f73340d6cc93cf2", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x276c86628e21f4917866f32d725739c4b", + "a_eq_b": true, + "a_m_pow_b": "0x204709a701abec74c1f0d1d3faf1aa643" + }, + { + "a": "0x2bd757194028d9a799335bc", + "b": "0x3b8c344ed00818", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2bd7571943e19cec8633dd4", + "a_m_sub_b_m": "0x2bd757193c701662ac32da4", + "a_m_mul_b_m": "0x2d3231f3d70ec6f0aecbd26a1862c67a0", + "a_eq_b": false, + "a_m_pow_b": "0x1e54d733933ce85e116ee371ade1a660a" + }, + { + "a": "0x2a0fe190074020ea19b39285ec9cf17ba", + "b": "0xfd409b0a7a", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2a0fe190074020ea19b39295c0a6a2234", + "a_m_sub_b_m": "0x2a0fe190074020ea19b39276189340d40", + "a_m_mul_b_m": "0x1298a017a90cb60622f32b55cb5398d1a", + "a_eq_b": false, + "a_m_pow_b": "0x40954a941fe527a0775601090c096f4a" + }, + { + "a": "0x22dfffbc676a324", + "b": "0x19d0a19", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x22dfffbc813ad3d", + "a_m_sub_b_m": "0x22dfffbc4d9990b", + "a_m_mul_b_m": "0x3844bfbad02bc35095684", + "a_eq_b": false, + "a_m_pow_b": "0x2b4aa5e702d3d611e8a8e9fd28deeba44" + }, + { + "a": "0x2c5707f76c", + "b": "0x2c5707f76c", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x58ae0feed8", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x7ae0853778adf099590", + "a_eq_b": true, + "a_m_pow_b": "0xf77f07521d0802938e5a3693468b5b44" + }, + { + "a": "0x2a0fdd91b23a838090cf040518606ebc4", + "b": "0x2e1b9f50e216d9a63eb8313a85b53cd42", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x26ea7528a4defd9ed57e3b41f040b704c", + "a_m_sub_b_m": "0x2d3545fabf9609624c1fccc840802673c", + "a_m_mul_b_m": "0x28cbe49493921c895a7e9400c6aaccb88", + "a_eq_b": false, + "a_m_pow_b": "0x1d5772792d9bab004053d83262afd6c9e" + }, + { + "a": "0x2c54101742e34cc4c5d83c6579482b15d", + "b": "0x757933176151c2", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2c54101742e34cc4c5df93f8aabe4031f", + "a_m_sub_b_m": "0x2c54101742e34cc4c5d0e4d247d215f9b", + "a_m_mul_b_m": "0x29d1b7d0c051f72bbe9ef51dee6570534", + "a_eq_b": false, + "a_m_pow_b": "0xef0950e1edc47ecfc94f836cdbe92a9" + }, + { + "a": "0x703ae309b6b27e282b78ab5c3122", + "b": "0x2496d4483cf58", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x703ae309b6b27e2a74e5efe0007a", + "a_m_sub_b_m": "0x703ae309b6b27e25e20b66d861ca", + "a_m_mul_b_m": "0x192a839f63f1dccd8768a496f0782290a", + "a_eq_b": false, + "a_m_pow_b": "0xd215ff3e2baa326ee3d75551845ff114" + }, + { + "a": "0x17df923e57f599d1732ae464", + "b": "0x14f06cc7f49db7a", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x17df923e5944a09df274bfde", + "a_m_sub_b_m": "0x17df923e56a69304f3e108ea", + "a_m_mul_b_m": "0x2b973f48caea04d28663c766e12b86d82", + "a_eq_b": false, + "a_m_pow_b": "0x2a84b997433e2c7a13ca91f8667c8ecce" + }, + { + "a": "0x259942c97f169516bb4edbaaafc6c", + "b": "0x273267f3", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x259942c97f169516bb4ede1dd645f", + "a_m_sub_b_m": "0x259942c97f169516bb4ed93789479", + "a_m_mul_b_m": "0x2bcdf041f7b5343fb83f35ca199f039c6", + "a_eq_b": false, + "a_m_pow_b": "0x1cfb57020ef967b890dc46ed83dadb028" + }, + { + "a": "0xb070006287fadd330a90", + "b": "0x1283da104bc", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xb070006289231ad40f4c", + "a_m_sub_b_m": "0xb070006286d29f9205d4", + "a_m_mul_b_m": "0xcc2bfa1bb844afe0fa44cd323601c0", + "a_eq_b": false, + "a_m_pow_b": "0x1fefb6377ed55b63011d39f12f9419fc6" + }, + { + "a": "0x8d0d82f", + "b": "0x14b4f6783a", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x14bdc75069", + "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fc63129a8af", + "a_m_mul_b_m": "0xb68c3880add102a6", + "a_eq_b": false, + "a_m_pow_b": "0x2ecbb5a12842d35b08a5f398aa56a66d9" + }, + { + "a": "0x73b835f7", + "b": "0x2d370bdf9d85d37fe4d5866cee64f0edb", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2d370bdf9d85d37fe4d5866cf5a0744d2", + "a_m_sub_b_m": "0x409fbda51ec8c0815337390c6ab86fd6", + "a_m_mul_b_m": "0x9ec6b78992a10506a145c9427319d463", + "a_eq_b": false, + "a_m_pow_b": "0x2c51eb687c04ce06b20161c28fbdc1edf" + }, + { + "a": "0x1e4d628581ff6dc856", + "b": "0x2ecb47feded54e3", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x1e504f3a01ed5b1d39", + "a_m_sub_b_m": "0x1e4a75d10211807373", + "a_m_mul_b_m": "0x589f796beb51ddee2897ffd999b2dc42", + "a_eq_b": false, + "a_m_pow_b": "0x160dc0250953ba62b36212e36b13c98dc" + }, + { + "a": "0x144995286369e1eff10783985577f", + "b": "0x84aa72d14bc61ffdc61053ed451b1c8c", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x84abb76a9e4c569be50f64657ea0740b", + "a_m_sub_b_m": "0x28f674d66fde60f1ff97e5c65d1b983ad", + "a_m_mul_b_m": "0x21fe59d24c8a8c7d88c7738676d4d6318", + "a_eq_b": false, + "a_m_pow_b": "0x141aa4971ed37750ebd37399528d9ddc1" + }, + { + "a": "0x590d4586ce14", + "b": "0x1e91f0c6d93b71c141ab52c8aee2d", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x1e91f0c6d93b71c1473c27211bc41", + "a_m_sub_b_m": "0x3140e927feab864c8847bde32f64b28a1", + "a_m_mul_b_m": "0x1739ae014b18418052dd3d173524fb80e", + "a_eq_b": false, + "a_m_pow_b": "0xd92f7fc33a36e3cb3ead99a314bf13da" + }, + { + "a": "0x17e8fed3dfde60dd454b3f5c1", + "b": "0x223ca4739ce5e761b7b59a1c0bd08b032", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x223ca473b4cee6359793faf9511bca5f3", + "a_m_sub_b_m": "0xf0463466a7576fa2231c0bee74fa8e49", + "a_m_mul_b_m": "0x19e5b4fee0afffa45ec9cee28d5f1556a", + "a_eq_b": false, + "a_m_pow_b": "0x26dc8a6b82e5034a48bd2bf19231acb85" + }, + { + "a": "0x81c00f946", + "b": "0x11888", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x81c0211ce", + "a_m_sub_b_m": "0x81bffe0be", + "a_m_mul_b_m": "0x8e2eff128fd30", + "a_eq_b": false, + "a_m_pow_b": "0x2ecfb3a3c2d62fce2a89d3e1d08ecc8ca" + }, + { + "a": "0x1d66321ee55ef7495e3fafbf", + "b": "0x207877691a7859b", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x1d66321ee7667ebfefe7355a", + "a_m_sub_b_m": "0x1d66321ee3576fd2cc982a24", + "a_m_mul_b_m": "0x13d062cede5b1f2c167747cd716dbfe1f", + "a_eq_b": false, + "a_m_pow_b": "0x63f0db7cf33dcaa42f4741cd954331ef" + }, + { + "a": "0x481337faf64c6839f4a2749913f", + "b": "0x3519a7dbcc5f769d144d1", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x481338300ff44406541911ad610", + "a_m_sub_b_m": "0x481337c5dca48c6d952bd784c6e", + "a_m_mul_b_m": "0x15abc724a42f528d115a53c6ec1801667", + "a_eq_b": false, + "a_m_pow_b": "0x1c6b09e34e7db8c71ae64b0792fa75e5d" + }, + { + "a": "0x39d4ee08db6155d8e17f", + "b": "0xb", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x39d4ee08db6155d8e18a", + "a_m_sub_b_m": "0x39d4ee08db6155d8e174", + "a_m_mul_b_m": "0x27c263a616d2eb051b075", + "a_eq_b": false, + "a_m_pow_b": "0x297faae689bcb149986a7ac28fe113faf" + }, + { + "a": "0x16177a31daf12dcbb10e", + "b": "0x3152dee874f00", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x16177a34f01f1c53000e", + "a_m_sub_b_m": "0x16177a2ec5c33f44620e", + "a_m_mul_b_m": "0x441a5251a359d715e5d1379d3e055200", + "a_eq_b": false, + "a_m_pow_b": "0x5749e1df9955bf6468818a3ebda38e0a" + }, + { + "a": "0xfc26a94f30d6", + "b": "0x8dedf059a06d", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x18a1499a8d143", + "a_m_sub_b_m": "0x6e38b8f59069", + "a_m_mul_b_m": "0x8bcba7c7e264b4b62fa38b1e", + "a_eq_b": false, + "a_m_pow_b": "0xeedf4e91334b55662bd9af7936f833fa" + }, + { + "a": "0x982f02", + "b": "0x36fb84a5660feb", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x36fb84a5fe3eed", + "a_m_sub_b_m": "0x314107b9ef725f87fa058a456388167d1", + "a_m_mul_b_m": "0x20af6f5d86007b4044d6", + "a_eq_b": false, + "a_m_pow_b": "0x22b9ec2bebbf4cc27b37336983e41e3fc" + }, + { + "a": "0x29a614ac871a953e291f1955c98e19c4a", + "b": "0x29a614ac871a953e291f1955c98e19c4a", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x220b219f1ec2caf4583538ade5473efda", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x1f635df5812aac4dd37b083456f5b1910", + "a_eq_b": true, + "a_m_pow_b": "0x14cb109e6a61e3fb287ddcb8f190ab8ba" + }, + { + "a": "0x15b1921583621", + "b": "0x9720bc12c9c8d199c4745", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x9720bc12df7a63af47d66", + "a_m_sub_b_m": "0x314107b9ef71c8673df645e66e50b3796", + "a_m_mul_b_m": "0x7e415e76302dff472332e1d133a89afd", + "a_eq_b": false, + "a_m_pow_b": "0x2b97fb4f1d5553bd3ba8d4d7c92a48dad" + }, + { + "a": "0x296d53ecf6d6fee53ed1a474854b58fb5", + "b": "0x478fa0f9b6ec93b4", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x296d53ecf6d6fee5434a9e8420ba22369", + "a_m_sub_b_m": "0x296d53ecf6d6fee53a58aa64e9dc8fc01", + "a_m_mul_b_m": "0x461c8538f8814ac69f99aaea6942d01e", + "a_eq_b": false, + "a_m_pow_b": "0x14f034d82a15163c11ed765ce16730a5f" + }, + { + "a": "0x6356b0", + "b": "0x0", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x6356b0", + "a_m_sub_b_m": "0x6356b0", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x1ebe767191", + "b": "0x214881f40077dd2307", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x214881f41f36539498", + "a_m_sub_b_m": "0x314107b9ef725f85e580dabf923e89744", + "a_m_mul_b_m": "0x3ff42713ae84b66e3ebd7f0edf7", + "a_eq_b": false, + "a_m_pow_b": "0x1934caf1ed3522eede278f406b91f8ed7" + }, + { + "a": "0x21c7db21ecfa243f774a44022e7b15c59", + "b": "0x8171d6ec10", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x21c7db21ecfa243f774a440a459884869", + "a_m_sub_b_m": "0x21c7db21ecfa243f774a43fa175da7049", + "a_m_mul_b_m": "0x2e734d69321bc60571bb77f55f37e2d40", + "a_eq_b": false, + "a_m_pow_b": "0x2f561d1ff17960eee0ba76564e90773e5" + }, + { + "a": "0x75e140895d0281bb255cfc76634", + "b": "0xee8471a9a", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x75e140895d0281bb264b80e80ce", + "a_m_sub_b_m": "0x75e140895d0281bb246e7804b9a", + "a_m_mul_b_m": "0x196713df21956dc1563dcf754513b2f96", + "a_eq_b": false, + "a_m_pow_b": "0x2c4e65beb6cb88950344ab8822dec56ac" + }, + { + "a": "0x1564878b9743dbc8fba435db", + "b": "0x58827bef1525077a7806577d864fd60", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x58827bf06b6d8033ec44140d409333b", + "a_m_sub_b_m": "0x30e8853e01b382f939053162c008e8135", + "a_m_mul_b_m": "0x21896a8c1c8f3357ae9495de1098dbad2", + "a_eq_b": false, + "a_m_pow_b": "0xbf3f60baf19380b950ebf2c707e5cff3" + }, + { + "a": "0x0", + "b": "0x1900e7701f888932e", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x1900e7701f888932e", + "a_m_sub_b_m": "0x314107b9ef725f87e108128d8e4c6b58c", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0xda1e682c1ff26b659b", + "b": "0x73edd761afc", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xda1e68335ecfe18097", + "a_m_sub_b_m": "0xda1e6824e114f54a9f", + "a_m_mul_b_m": "0x62c64e7507f4613d0fad32e7bc294", + "a_eq_b": false, + "a_m_pow_b": "0x1af9a71781de08829dcc149813f73b1ad" + }, + { + "a": "0x0", + "b": "0x9892324d63ffdd31f91c73e1d", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x9892324d63ffdd31f91c73e1d", + "a_m_sub_b_m": "0x314107b956e02d3a96091ccbb4b880a9d", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x2ad9d6b", + "b": "0x1e03", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2adbb6e", + "a_m_sub_b_m": "0x2ad7f68", + "a_m_mul_b_m": "0x50607b6241", + "a_eq_b": false, + "a_m_pow_b": "0x14022ebb643306e84be3186047fd69cb7" + }, + { + "a": "0xfe5c", + "b": "0xfe5c", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x1fcb8", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xfcbab110", + "a_eq_b": true, + "a_m_pow_b": "0x1f89ae914267416999ae4f3ac6f732b02" + }, + { + "a": "0xb30a8964ce0", + "b": "0x533e74", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xb30a8e98b54", + "a_m_sub_b_m": "0xb30a8430e6c", + "a_m_mul_b_m": "0x3a381839bb7591580", + "a_eq_b": false, + "a_m_pow_b": "0x23e27b46078c7416d6fe50ba46550f428" + }, + { + "a": "0x1", + "b": "0x3a6892ecd51d031e3c42", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x3a6892ecd51d031e3c43", + "a_m_sub_b_m": "0x314107b9ef725be170da2cabdda310c79", + "a_m_mul_b_m": "0x3a6892ecd51d031e3c42", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0xd8c43b5096d39e4b11", + "b": "0x20e", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xd8c43b5096d39e4d1f", + "a_m_sub_b_m": "0xd8c43b5096d39e4903", + "a_m_mul_b_m": "0x1bd6331df95e6cf3e3cee", + "a_eq_b": false, + "a_m_pow_b": "0x1048297b1735d96857a45e8856f1ba6e9" + }, + { + "a": "0x65770bd8a791fd78156e3f32e8", + "b": "0x20e05", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x65770bd8a791fd78156e4140ed", + "a_m_sub_b_m": "0x65770bd8a791fd78156e3d24e3", + "a_m_mul_b_m": "0xd07c95aa63893ca6af60f101d4ae88", + "a_eq_b": false, + "a_m_pow_b": "0x1e1f49ebef4e1385de8879011abf59ef0" + }, + { + "a": "0x164b57def", + "b": "0x87a1cfb", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x16d2f9aea", + "a_m_sub_b_m": "0x15c3b60f4", + "a_m_mul_b_m": "0xbcfd2cf139e9d55", + "a_eq_b": false, + "a_m_pow_b": "0x238ac0d485c7aa769cab6c40e7a2495ff" + }, + { + "a": "0x1c2d79d92bc2bd11b15", + "b": "0x1c2d79d92bc2bd11b15", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x385af3b257857a2362a", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x2c455d9f56d521ebecff32ea8895cf2fb", + "a_eq_b": true, + "a_m_pow_b": "0x20e5b424dd2a1fad0b03e299eaa989e3f" + }, + { + "a": "0xdb34acfc250da", + "b": "0x1666", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xdb34acfc26740", + "a_m_sub_b_m": "0xdb34acfc23a74", + "a_m_mul_b_m": "0x132dddda97a5ef2dc", + "a_eq_b": false, + "a_m_pow_b": "0x1b645f430ead083624e8b96aacf2bb022" + }, + { + "a": "0x44912365d3eed", + "b": "0x571a24d592f6cb574070", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x571a24d9dc0901b47f5d", + "a_m_sub_b_m": "0x314107b9ef725a1657bbe55f648554737", + "a_m_mul_b_m": "0x175453a2d07754969751f91e36a11c7b0", + "a_eq_b": false, + "a_m_pow_b": "0x125fe8ec3ca4eb4938b44e00eb7b3d5d9" + }, + { + "a": "0x70f8", + "b": "0xe31c3308c3007cb168f76fd638d34dd6", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xe31c3308c3007cb168f76fd638d3bece", + "a_m_sub_b_m": "0x230f4489634257bce37983004a47c6bdc", + "a_m_mul_b_m": "0x1290cd4bb48e69eececfc0952d3af7024", + "a_eq_b": false, + "a_m_pow_b": "0xa3e7a1df919ed44a39962e2fb297a3d6" + }, + { + "a": "0x174979558659cf439de8ddf4", + "b": "0x138da1", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x174979558659cf439dfc6b95", + "a_m_sub_b_m": "0x174979558659cf439dd55053", + "a_m_mul_b_m": "0x1c7561e62627357a84fc80acefa74", + "a_eq_b": false, + "a_m_pow_b": "0x2aa813bd310de0f90f2123e6afee9de1c" + }, + { + "a": "0xd1", + "b": "0x75438be6aeb4", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x75438be6af85", + "a_m_sub_b_m": "0x314107b9ef725f87fa08f2a9751689ad7", + "a_m_mul_b_m": "0x5fbc253754a0f4", + "a_eq_b": false, + "a_m_pow_b": "0x31197538886a4fbdac8f6d8cd15d5161f" + }, + { + "a": "0x3c76c1e1b71df25e3756af51", + "b": "0xbfc9", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x3c76c1e1b71df25e37576f1a", + "a_m_sub_b_m": "0x3c76c1e1b71df25e3755ef88", + "a_m_mul_b_m": "0x2d4c13e5a1d81e5797431fdd1599", + "a_eq_b": false, + "a_m_pow_b": "0x108279e550ce4367d32353609570895c1" + }, + { + "a": "0x6250ea6", + "b": "0x25bf2b6a11b95cd28b276417343ce0b81", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x25bf2b6a11b95cd28b276417349f31a27", + "a_m_sub_b_m": "0xb81dc4fddb902b56ee195e679fa64bdf", + "a_m_mul_b_m": "0xe9f3c7b2c0b861fb66e12c532d70dfcc", + "a_eq_b": false, + "a_m_pow_b": "0x1c05da6c1722aa853f57db2f0fdb22b24" + }, + { + "a": "0x2c08722b3302a5ca", + "b": "0x86e64032ee1", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2c087a999705d4ab", + "a_m_sub_b_m": "0x2c0869bcceff76e9", + "a_m_mul_b_m": "0x173406640ea6eb049b9287c028a", + "a_eq_b": false, + "a_m_pow_b": "0x169ea852bf6d82d7696affd113114558" + }, + { + "a": "0xccf482dcf73633744da6b58e2a1c", + "b": "0x15be5a5915c28d87b7e8ac91b72f", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xe2b2dd360cf8c0fc058f621fe14b", + "a_m_sub_b_m": "0xb7362883e173a5ec95be08fc72ed", + "a_m_mul_b_m": "0x2ae7b4c04752cf48c271fb5fd45108f96", + "a_eq_b": false, + "a_m_pow_b": "0x3ad14fee5f5c50e59b52573883e2ef5c" + }, + { + "a": "0xfa413e34b3d3d946990", + "b": "0xe6ab275fe000cc40732b4", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xe7a5689e14b4a019b9c44", + "a_m_sub_b_m": "0x314107b9ef7179d713e74eb0b56dc7f96", + "a_m_mul_b_m": "0x193f6f5e21a37ff2f8fcfe29646a9df62", + "a_eq_b": false, + "a_m_pow_b": "0x1b62cc345973e3852439e71e43a173c48" + }, + { + "a": "0xc88d2415f2a37bef34f0", + "b": "0xc88d2415f2a37bef34f0", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x1911a482be546f7de69e0", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x12ffd7c3ada41bf9c519edc8c02a80e64", + "a_eq_b": true, + "a_m_pow_b": "0x1e00999cb7ecdd76cff39b888f5273508" + }, + { + "a": "0x2c34c3f471171c2942d71602397ec1a40", + "b": "0x119190e79b9407f819dbe8d7025b", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2c34c50d8a2595e28356979ff80c31c9b", + "a_m_sub_b_m": "0x2c34c2db5808a270025794647af1517e5", + "a_m_mul_b_m": "0x2a419dbb2d7de4c926ba99afc628273c0", + "a_eq_b": false, + "a_m_pow_b": "0x12e40f9e85d4c473e0f5147848e67d086" + }, + { + "a": "0x6dddea0c4bc3915a2539ed26", + "b": "0xd776f8c03d19", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x6dddea0c4bc468d11dfa2a3f", + "a_m_sub_b_m": "0x6dddea0c4bc2b9e32c79b00d", + "a_m_mul_b_m": "0x2cb8ab72315d21440ac7daabe0a5adc2c", + "a_eq_b": false, + "a_m_pow_b": "0x26a4e5a773fd8cf92582114acaaf0ed1e" + }, + { + "a": "0x35", + "b": "0x9a9af2a3ec6b2ea2", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x9a9af2a3ec6b2ed7", + "a_m_sub_b_m": "0x314107b9ef725f87f05f4ad36f0e41a4d", + "a_m_mul_b_m": "0x2002143beff230a78a", + "a_eq_b": false, + "a_m_pow_b": "0x30858f826a7e0071e31d2fa32c27b7cdb" + }, + { + "a": "0x61534cd2571cf04de771edcc969a2550", + "b": "0xd5b3bc34920a7fcfa3a3b47f050aa", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x6160a80e1a6610f5e46c2807de8a75fa", + "a_m_sub_b_m": "0x6145f19693d3cfa5ea77b3914ea9d4a6", + "a_m_mul_b_m": "0x2b63ea9bb01862580106cd1d58d9f080", + "a_eq_b": false, + "a_m_pow_b": "0x30c26ac115f241f62f42dcd6f4cc41148" + }, + { + "a": "0x2fa29fad95cae1234bb10d4065a55805d", + "b": "0x1d0631d91b5073039f1e6ad906", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2fa29faf662dfeb500b83d7a578c05963", + "a_m_sub_b_m": "0x2fa29fabc567c39196a9dd0673beaa757", + "a_m_mul_b_m": "0x1fc05106c9cf77cebd8bfa613a3f5b8f0", + "a_eq_b": false, + "a_m_pow_b": "0x1a48194e70f8eaf213ca17c93e11c364b" + }, + { + "a": "0x1956", + "b": "0x2e45d6", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2e5f2c", + "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fdadd211c3a", + "a_m_mul_b_m": "0x4945d5be4", + "a_eq_b": false, + "a_m_pow_b": "0x255d72f80a1c1bb0c82c5256b7c74e822" + }, + { + "a": "0x3d710a15299054efa50", + "b": "0x80ac3dd82ab3e28685bdd02c81d11", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x80ac3dd82af153909ae7608171761", + "a_m_sub_b_m": "0x3140870db19a3511888c89696dfd625f9", + "a_m_mul_b_m": "0x26aa35fae443a4b44bf92dcde9948517c", + "a_eq_b": false, + "a_m_pow_b": "0x2a074cc8b2b4fc340de593b2344bccdb4" + }, + { + "a": "0x12f0", + "b": "0x3057f537f137c0d", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x3057f537f138efd", + "a_m_sub_b_m": "0x314107b9ef725f87f9d8a20875e3bdf9d", + "a_m_mul_b_m": "0x39381b3d3680fd3630", + "a_eq_b": false, + "a_m_pow_b": "0x8190e74852ebcb0c80a1c6ca48994b5a" + }, + { + "a": "0x142833e6836da0cc9b533", + "b": "0x28f43392b99b87f5c0aa1ee6f1b04eaa4", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x28f43392b99b9c1df490a254927ce9fd7", + "a_m_sub_b_m": "0x84cd42735d6ebba6d455e845cf141349", + "a_m_mul_b_m": "0x157ceb031c06579c1831e13d0bad3bba6", + "a_eq_b": false, + "a_m_pow_b": "0x2f48d820dbff05ea87df139acd942e46f" + }, + { + "a": "0xe53d732d6cfea681dd8c740214c3", + "b": "0xe53d732d6cfea681dd8c740214c3", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x1ca7ae65ad9fd4d03bb18e8042986", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x15e09639d75a41ad7b180e8a9912c387f", + "a_eq_b": true, + "a_m_pow_b": "0x1594ea4bf91ba23a79349004591a48b5f" + }, + { + "a": "0x2d7ca85aa157bb409e558", + "b": "0x46c1e75ade858e8dfb98468947", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x46c1ea32a90b38a3774c506e9f", + "a_m_sub_b_m": "0x314107b583541756ba0ab275af912a4cb", + "a_m_mul_b_m": "0x219fcaf85c98a38fa7497075cdc39efbc", + "a_eq_b": false, + "a_m_pow_b": "0x1011138f314b4f0d624a1d9800da667da" + }, + { + "a": "0x19a9988bcc8e83e494438fa430", + "b": "0x373c43ceb44678179", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x19a9988bd00248217f87f725a9", + "a_m_sub_b_m": "0x19a9988bc91abfa7a8ff2822b7", + "a_m_mul_b_m": "0x26ddec2eb02fd5e17fbd873f75c335606", + "a_eq_b": false, + "a_m_pow_b": "0x3f8c56ee24658a527cffc511da0a13d8" + }, + { + "a": "0x9384b020b8d4529beb35", + "b": "0xd43e882", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x9384b020b8d45fdfd3b7", + "a_m_sub_b_m": "0x9384b020b8d4455802b3", + "a_m_mul_b_m": "0x7a4dea6eaf23fe1d06f803478ea", + "a_eq_b": false, + "a_m_pow_b": "0x29d47d53d9f6bff36b75f488a90b388a5" + }, + { + "a": "0x40a45aaf35967", + "b": "0x0", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x40a45aaf35967", + "a_m_sub_b_m": "0x40a45aaf35967", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x3f", + "b": "0x30e7ebfc2aa5c8c7e955", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x30e7ebfc2aa5c8c7e994", + "a_m_sub_b_m": "0x314107b9ef725c797b493753514875fa4", + "a_m_mul_b_m": "0xc0913130e7ecc69326beb", + "a_eq_b": false, + "a_m_pow_b": "0x2a6154596032b25d896e88f106e560a6d" + }, + { + "a": "0x6a5da4e8b1b517a0cd3b5e85c7c1b", + "b": "0x6a5da4e8b1b517a0cd3b5e85c7c1b", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xd4bb49d1636a2f419a76bd0b8f836", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xb6698395b67b4a8e376b258e6013a451", + "a_eq_b": true, + "a_m_pow_b": "0x121ad5e4db5d6ec80177ffc097c26cbc3" + }, + { + "a": "0xe2827503d1e1756e0d4", + "b": "0x15dba9ab5a99074", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xe2828adf7b8cd007148", + "a_m_sub_b_m": "0xe2825f2828361ad5060", + "a_m_mul_b_m": "0xdeac6d6d3e194eff795dfc7a91ed6bb4", + "a_eq_b": false, + "a_m_pow_b": "0x10cf962e2ef2063410406617a5470229c" + }, + { + "a": "0x4180f723279cb26d2", + "b": "0x15c273f31551a9eb6", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x57436b163cee5c588", + "a_m_sub_b_m": "0x2bbe8330124b0881c", + "a_m_mul_b_m": "0x27d4530add094221a0ee5a5eac667ec92", + "a_eq_b": false, + "a_m_pow_b": "0x214566ce2657886179705bac23691133e" + }, + { + "a": "0x11679e32aa0e2238f55", + "b": "0x21449d4443d7f595af0cf", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x215604e2768203b7e8024", + "a_m_sub_b_m": "0x314107b9ef723e54c462e8cfc6617e740", + "a_m_mul_b_m": "0x1eb43efda93e279a1c77075faf4823cfb", + "a_eq_b": false, + "a_m_pow_b": "0xa5a9ec1e8ddca7ba6809697e5518536d" + }, + { + "a": "0x196d9d930454", + "b": "0x4e87b2693bbaa05b", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x4e87cbd6d94da4af", + "a_m_sub_b_m": "0x314107b9ef725f87f520806df3f27acb3", + "a_m_mul_b_m": "0x7cce0898f4d877e19b766ff09dc", + "a_eq_b": false, + "a_m_pow_b": "0x18bd25ca427769265fd025968f03e9974" + }, + { + "a": "0x2530d9dac09650fe0d5df6c49994269b4", + "b": "0x269277183b11", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2530d9dac09650fe0d5df92dc105aa4c5", + "a_m_sub_b_m": "0x2530d9dac09650fe0d5df45b7222a2ea3", + "a_m_mul_b_m": "0x112763e976d5d7df6267bfd30bec6f112", + "a_eq_b": false, + "a_m_pow_b": "0x1eadf41804fe8789c22329034822b655a" + }, + { + "a": "0x61d5", + "b": "0x1aa1177fc2ccd51ace5", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x1aa1177fc2ccd520eba", + "a_m_sub_b_m": "0x314107b9ef725f6d58f17a3ae0ffdfdaa", + "a_m_mul_b_m": "0xa2d31eff61cb12c7779f89", + "a_eq_b": false, + "a_m_pow_b": "0x7b844915a9f592e60fea50a73ecab68f" + }, + { + "a": "0x3c4d1f3cf2d95c851a3e66", + "b": "0x0", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x3c4d1f3cf2d95c851a3e66", + "a_m_sub_b_m": "0x3c4d1f3cf2d95c851a3e66", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x87b5c3e6d8be4", + "b": "0x3f842e219271c546", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x3f8ca97dd0df512a", + "a_m_sub_b_m": "0x314107b9ef725f87f6113ed15894b0f58", + "a_m_mul_b_m": "0x21abcd6347a249163bfca263eb458", + "a_eq_b": false, + "a_m_pow_b": "0x309c51bfe87e308f9bb2cc996fd7999ba" + }, + { + "a": "0x6e2b309d230412c05fec343305aa1", + "b": "0xbaa086462e8578a05206d2", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x6e2b30a8cd0c77234843be3826173", + "a_m_sub_b_m": "0x6e2b309178fbae5d7794aa2de53cf", + "a_m_mul_b_m": "0x14b61c8f694c137cc5e52ecdeb84bd5a0", + "a_eq_b": false, + "a_m_pow_b": "0x2e2ee310b96ce56e5fbb1da08d7f4a7fb" + }, + { + "a": "0x2f26093e5ae1c4447c43097a8e212335f", + "b": "0x45504f56749", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2f26093e5ae1c4447c4309bfde7079aa8", + "a_m_sub_b_m": "0x2f26093e5ae1c4447c4309353dd1ccc16", + "a_m_mul_b_m": "0x52cb02b441c66f0cde07231fd8f78f8b", + "a_eq_b": false, + "a_m_pow_b": "0x1d63b46cea77fdb7d20de9b1d5923991d" + }, + { + "a": "0xa3141ba7b1", + "b": "0x420bb060c3a577a29041f147", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x420bb060c3a57845a45d98f8", + "a_m_sub_b_m": "0x314107b9eb51a481edcea28db6128ff24", + "a_m_mul_b_m": "0x20dcb12d0790f305b3a8ea366837371a5", + "a_eq_b": false, + "a_m_pow_b": "0x1a764a9db9c75a95437b88ad6a4615ad1" + }, + { + "a": "0x6f051d5ec50613abc67518c9", + "b": "0x74685bde109122085d81778a", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xe36d793cd59735b423f69053", + "a_m_sub_b_m": "0x314107b9ef1c2ba005504917e4642e9f9", + "a_m_mul_b_m": "0x86baa6fc04e282d752cb3f83e02a154e", + "a_eq_b": false, + "a_m_pow_b": "0x2c27018163d7ad7cba2d66fd18b02fcd5" + }, + { + "a": "0x1267aeae2ccc0ae2d", + "b": "0x29ee3efdba012368c8f40f920952dea73", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x29ee3efdba012368db5bbe40361ee98a0", + "a_m_sub_b_m": "0x752c8bc35713c1f437c9919d14e20c74", + "a_m_mul_b_m": "0x308dce18495e39e3d5c58b9ace36cd7f7", + "a_eq_b": false, + "a_m_pow_b": "0x2709675cb61d142c9fa3bbf3c6729c71" + }, + { + "a": "0xe51bf72f571c547257d90043240b2d", + "b": "0x3ca5560e409d", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xe51bf72f571c54725815a599324bca", + "a_m_sub_b_m": "0xe51bf72f571c5472579c5aed15ca90", + "a_m_mul_b_m": "0x2209175a8e0d312327a9b81ea05e08d9f", + "a_eq_b": false, + "a_m_pow_b": "0x611dc585cb4b32bcc2dcc2804eacd573" + }, + { + "a": "0xa60098e5d1bfe2265a11091c", + "b": "0x2fa16fb4095a99962cd344cbbce468", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2fa1705a09f37f67ecb56b25cded84", + "a_m_sub_b_m": "0x313e0da2fe91d36cbdc22aebc6ba36d6e", + "a_m_mul_b_m": "0x2ed1c275c6d5651f7911a0ec35a460a3e", + "a_eq_b": false, + "a_m_pow_b": "0x251637f6b9dcb993cd3c83996ffdbf908" + }, + { + "a": "0xf0", + "b": "0x11abc11", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x11abd01", + "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fdadc348d99", + "a_m_mul_b_m": "0x109104ff0", + "a_eq_b": false, + "a_m_pow_b": "0xffa0db81553b1e921a7cc1c3c5288b16" + }, + { + "a": "0x80c996e4dd42f", + "b": "0x15a236934f5a41c70fa0ab3567b113de", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x15a236934f5a41c70fa8b7ced5fee80d", + "a_m_sub_b_m": "0x2fe6e450ba7cbb6b890f7013ee3ec090b", + "a_m_mul_b_m": "0x79ac31e6fa3b203e6437f8fb59ffce44", + "a_eq_b": false, + "a_m_pow_b": "0x194295a98b33692dc70843ff0b2a464bd" + }, + { + "a": "0xf303ca03", + "b": "0x14167fa2f", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2346bc432", + "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fda8eeb188e", + "a_m_mul_b_m": "0x1311a74525b2e048d", + "a_eq_b": false, + "a_m_pow_b": "0x1dcf9603fcd07b9c4a00062a013b24959" + }, + { + "a": "0x1b23ddd4f1ac37ad8ae0b", + "b": "0xfd", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x1b23ddd4f1ac37ad8af08", + "a_m_sub_b_m": "0x1b23ddd4f1ac37ad8ad0e", + "a_m_mul_b_m": "0x1ad2723b72d7330682400df", + "a_eq_b": false, + "a_m_pow_b": "0xf00820decaa321e2da579afebe0e9567" + }, + { + "a": "0xc972e2d0dcdef04303f9c3a3", + "b": "0x2", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xc972e2d0dcdef04303f9c3a5", + "a_m_sub_b_m": "0xc972e2d0dcdef04303f9c3a1", + "a_m_mul_b_m": "0x192e5c5a1b9bde08607f38746", + "a_eq_b": false, + "a_m_pow_b": "0x1a00d440567942f7dc13fa69e800be0e9" + }, + { + "a": "0x6dc371dfb", + "b": "0xa0168c55752ec", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xa016fa18e70e7", + "a_m_sub_b_m": "0x314107b9ef725f87fa0859e78f42f13c9", + "a_m_mul_b_m": "0x44a3d2231da2a201b70964", + "a_eq_b": false, + "a_m_pow_b": "0x30612312e7c5c493e3b71037a6b10a45" + }, + { + "a": "0x7fd678ff50524584a459825247b34f7", + "b": "0x59dca1f25dcd20ee526cf5ced15cd3", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x8574431e762f1793898051af34c91ca", + "a_m_sub_b_m": "0x7a38aee02a757375bf32b2f55a9d824", + "a_m_mul_b_m": "0x18e38a9868d48495c903ff98175b76d49", + "a_eq_b": false, + "a_m_pow_b": "0xd88981a4b2acd6fc1796582925e8ff75" + }, + { + "a": "0x1d9c5ddd295d4db0b033504adf1f86", + "b": "0x28582b4ead1428", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x1d9c5ddd295d4db0d88b7b998c33ae", + "a_m_sub_b_m": "0x1d9c5ddd295d4db087db24fc320b5e", + "a_m_mul_b_m": "0x1bc9299229d7d6cb355d3cc64cd3b382a", + "a_eq_b": false, + "a_m_pow_b": "0x26ca5ca5d11d2e0314be674e789c16568" + }, + { + "a": "0x1350f5b7dd9", + "b": "0x18e0fa300b32f8b977b", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x18e0fa301e83ee71554", + "a_m_sub_b_m": "0x314107b9ef725f6f190eca05cbd1f2f18", + "a_m_mul_b_m": "0x1e090c0eda351fb7c021084037643", + "a_eq_b": false, + "a_m_pow_b": "0x15157a5f8b3bb901c57d405f4b8a02771" + }, + { + "a": "0xe9e5ab7", + "b": "0x40e7bdcaccf1d04cc", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x40e7bdcacddbb5f83", + "a_m_sub_b_m": "0x314107b9ef725f87b9213c32e1cd09ea5", + "a_m_mul_b_m": "0x3b4d26818c1aea845f5625d4", + "a_eq_b": false, + "a_m_pow_b": "0x1b6d57ec40e1e2c91b92da1c005a8a789" + }, + { + "a": "0x9e8be9c3a98eb14cd1fe22d965d6317", + "b": "0x2025e816b0a53381b267739f7fe90db0b", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x20c47400744ec232ff3971c2594ee3e22", + "a_m_sub_b_m": "0x11b9ab8d0276bab7947384810751bd0c6", + "a_m_mul_b_m": "0x2c88b6af69a9efe3e92ad2f180264d46f", + "a_eq_b": false, + "a_m_pow_b": "0x1d6783feeaa40e36e17f1c137d2c21547" + }, + { + "a": "0xdf", + "b": "0x4524f1b0a6670645a88e106701", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x4524f1b0a6670645a88e1067e0", + "a_m_sub_b_m": "0x314107b59d23447d939895a324f3ee298", + "a_m_mul_b_m": "0x3c3b2e88e0f3be76add3c049b9df", + "a_eq_b": false, + "a_m_pow_b": "0x2699a903ef64ab214e979fd417311485d" + }, + { + "a": "0x2a54b260fb1d48b0391f2ad426965ff94", + "b": "0xb45f8ba73", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2a54b260fb1d48b0391f2ad4daf5eba07", + "a_m_sub_b_m": "0x2a54b260fb1d48b0391f2ad37236d4521", + "a_m_mul_b_m": "0x161ac18dc8e8a4e3cd579085fbded4b32", + "a_eq_b": false, + "a_m_pow_b": "0x2790a0cd2a20b3977266ad28bd5654a0e" + }, + { + "a": "0xe27d92685d2", + "b": "0x2ff555ae5553da58add28c2a1a2786875", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2ff555ae5553da58add28d0c97b9eee47", + "a_m_sub_b_m": "0x14bb20b9a1e852f4c366eb6113fd6617", + "a_m_mul_b_m": "0x22bc52adf193259d50b72d1d46368bac8", + "a_eq_b": false, + "a_m_pow_b": "0x3af5f9d11fbe1ec1fc4f101a248e9f68" + }, + { + "a": "0x468c4390eee951", + "b": "0x22657a6", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x468c43931540f7", + "a_m_sub_b_m": "0x468c438ec891ab", + "a_m_mul_b_m": "0x97a980934b5a703bd186", + "a_eq_b": false, + "a_m_pow_b": "0xeac71ca06a0d85ebc3a909db79aaa40f" + }, + { + "a": "0x132fe27a780f7b2b3d7", + "b": "0x13185", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x132fe27a780f7b3e55c", + "a_m_sub_b_m": "0x132fe27a780f7b18252", + "a_m_mul_b_m": "0x16e604b492aad1c981a95b3", + "a_eq_b": false, + "a_m_pow_b": "0x2d63b9e1b2641710acfd132ac3914ab39" + }, + { + "a": "0xbcee721653fa639989ec0", + "b": "0x23c3163e18d40d5428c0f53727a03ee5c", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x23c3163e18d4ca429ad749318b39c8d1c", + "a_m_sub_b_m": "0xd7df17bd69f0f22435e58c0e9ce3f91e", + "a_m_mul_b_m": "0x317be67af758fc87c273838b074ab2e4", + "a_eq_b": false, + "a_m_pow_b": "0x11fdd76f6aff4a408192b76fdd8a6a068" + }, + { + "a": "0x1aa34d9", + "b": "0xc309279dac846", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xc30927b84fd1f", + "a_m_sub_b_m": "0x314107b9ef725f87fa0836f48651eb54d", + "a_m_mul_b_m": "0x144b57f1b2faff9dfb56", + "a_eq_b": false, + "a_m_pow_b": "0x3127d1a4a8075fd24a08c0cff2a8a9c9d" + }, + { + "a": "0xb6c839a4ac3d928e4f627ab48e297", + "b": "0xde76ba1659bcb160a3c0294d5", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xb6c9181b6653ec4b00c31e74b776c", + "a_m_sub_b_m": "0xb6c75b2df22738d19e01d6f464dc2", + "a_m_mul_b_m": "0xc1fd34c905edac5367afc8ad9727395f", + "a_eq_b": false, + "a_m_pow_b": "0xa3e0873e8752aa33922e3c195c7f4eb3" + }, + { + "a": "0x3", + "b": "0x34944e13df4a12d0df3988ba0f", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x34944e13df4a12d0df3988ba12", + "a_m_sub_b_m": "0x314107b6a62d7e4a0567ccefba3c68eae", + "a_m_mul_b_m": "0x9dbcea3b9dde38729dac9a2e2d", + "a_eq_b": false, + "a_m_pow_b": "0x213762b6df1289aca5ab54292fa3eae5f" + }, + { + "a": "0x0", + "b": "0x42", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x42", + "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fdadd4f4878", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x273fa5ecd4cfec3f69f8ae5f5f4931c8c", + "b": "0x8b2bc881f9fcb8e679346009b52", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x273fa67800986e3966b194d893a93b7de", + "a_m_sub_b_m": "0x273fa561a9076a456d3fc7e62ae92813a", + "a_m_mul_b_m": "0x14c1abdb46f0d2ef10f7b32f74dbdd57e", + "a_eq_b": false, + "a_m_pow_b": "0x3d4fa568f52b61a6286ef792ffedb62c" + }, + { + "a": "0x219c87c0747951f79d3f5481769707573", + "b": "0xe66f6fa4289e5b6", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x219c87c0747951f79e25c3f11abfa5b29", + "a_m_sub_b_m": "0x219c87c0747951f79c58e511d26e68fbd", + "a_m_mul_b_m": "0x2836115b3d79b3a9ab9f101ef3549e03a", + "a_eq_b": false, + "a_m_pow_b": "0x1cb3b43e1e267efc49b6286178abbe6ab" + }, + { + "a": "0x174ff711df29a50e133d9e6fd9d7b48a", + "b": "0x17e14", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x174ff711df29a50e133d9e6fd9d9329e", + "a_m_sub_b_m": "0x174ff711df29a50e133d9e6fd9d63676", + "a_m_mul_b_m": "0x166a6f4f69b72ab85fc29cb75eb4728d6", + "a_eq_b": false, + "a_m_pow_b": "0x2c5dd342f4da2ef05e6bcc6a4e4673ea2" + }, + { + "a": "0x53e52249", + "b": "0x225d28ca57731", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x225d2e08a997a", + "a_m_sub_b_m": "0x314107b9ef725f87fa08d7a08a48ef3d2", + "a_m_mul_b_m": "0xb42f6294356096d87ef9", + "a_eq_b": false, + "a_m_pow_b": "0x2f225f6211293298e2c42c7962dc2ef71" + }, + { + "a": "0x8238b0af3cf0d39bb92a7d8b4", + "b": "0x1d77a9cd8df058be046bc798ad2354", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x1d77b1f118fb4c8d11a5832b54fc08", + "a_m_sub_b_m": "0x313f303fd4d23131ab1986dced749fe1a", + "a_m_mul_b_m": "0x2b2b1723882d47b27ec694246da8d5492", + "a_eq_b": false, + "a_m_pow_b": "0x1a493d60a5256a4849ec0be2daed0ce4a" + }, + { + "a": "0x906cb11d7a750e8", + "b": "0x32b045ba13ab6f311406", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x32b04ec0debd46d864ee", + "a_m_sub_b_m": "0x314107b9ef725c5cf63dc574145c5859c", + "a_m_mul_b_m": "0x1f14304d8f57fb3114e3dd2cf42cff9e8", + "a_eq_b": false, + "a_m_pow_b": "0x2530b5d7a9d25788cbe03f3a7b8e315ac" + }, + { + "a": "0x261c1d7d9cd2c352abdc0", + "b": "0x2d950d25fde", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x261c1d7d9d00585fd1d9e", + "a_m_sub_b_m": "0x261c1d7d9ca52e4585de2", + "a_m_mul_b_m": "0x6c92181540818de879aa42c9efacc80", + "a_eq_b": false, + "a_m_pow_b": "0x2807a0780dc61db2339499fb8f4c88acc" + }, + { + "a": "0x6ea98d53f032172d", + "b": "0x15551fc22453f18c407a8adfd429f", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x15551fc22453f876d94fc9e2f59cc", + "a_m_sub_b_m": "0x3140f264cfb03b340f67525861f841d48", + "a_m_mul_b_m": "0x20e88f3c7949b89195d595ad79988a4c5", + "a_eq_b": false, + "a_m_pow_b": "0x2564c9e6ec20fd82ca643eea3961e7e6d" + }, + { + "a": "0x1c02352cfc43d3c1cd", + "b": "0x0", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x1c02352cfc43d3c1cd", + "a_m_sub_b_m": "0x1c02352cfc43d3c1cd", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x2091223431611d688e843acb103a17a29", + "b": "0x2fcb057c88ad60ec35be28", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2091223431641a18e64cc5a11efd73851", + "a_m_sub_b_m": "0x20912234315e20b836bbaff50176bbc01", + "a_m_mul_b_m": "0x29143d0033dec0f5e18ade22419d623d8", + "a_eq_b": false, + "a_m_pow_b": "0x32fee38ed2860a548a05b208da3ee89b" + }, + { + "a": "0x289bb3f162267", + "b": "0x289bb3f162267", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x513767e2c44ce", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x67106eed374506752a0538571", + "a_eq_b": true, + "a_m_pow_b": "0x13fa7120f8999b58e1fd44875c28414cf" + }, + { + "a": "0x214d86ae3731ba72ec89", + "b": "0x55609d9bf3b", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x214d86ae3c87c44cabc4", + "a_m_sub_b_m": "0x214d86ae31dbb0992d4e", + "a_m_mul_b_m": "0xb1b4f4b2ee51506f440b530817ba93", + "a_eq_b": false, + "a_m_pow_b": "0xbb11ffed54ac9de005f1be74f56187ab" + }, + { + "a": "0x23b6ef9a882562466b86dbb5d7650b755", + "b": "0x39971508ec5f3b268f230a71d925c7f9", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x275060eb16eb55f8d4790c5cf4f767f4e", + "a_m_sub_b_m": "0x201d7e49f95f6e940294ab0eb9d2aef5c", + "a_m_mul_b_m": "0x1f7185e1643f4c9652f205058580f26a5", + "a_eq_b": false, + "a_m_pow_b": "0x23ffd70e9c37945e07909cbdae398a6ff" + }, + { + "a": "0xd192", + "b": "0xf5821b812e5f", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0xf5821b81fff1", + "a_m_sub_b_m": "0x314107b9ef725f87fa08eaa58c1ceebed", + "a_m_mul_b_m": "0xc8fb3ca82688012e", + "a_eq_b": false, + "a_m_pow_b": "0x13b371086a958daee0c12f51363e79b2c" + }, + { + "a": "0x1e777592e6f599e20", + "b": "0x1e777592e6f599e20", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x3ceeeb25cdeb33c40", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x8c26d153bcbdd647a5c64a24369c3b46", + "a_eq_b": true, + "a_m_pow_b": "0x6146b9647b5e66fd5162265eea5831b2" + }, + { + "a": "0x46ff0d1b85c99427ad92882debde", + "b": "0x7a37406241fb9b2acfeeb9b0", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x46ff8752c62bd62348bd581ca58e", + "a_m_sub_b_m": "0x46fe92e44567522c1267b83f322e", + "a_m_mul_b_m": "0x59cf5cbe6e2f131916e0406f22c8d886", + "a_eq_b": false, + "a_m_pow_b": "0x954e13de073a909b866a8bdc6213faae" + }, + { + "a": "0x1a9864bdc2a476dd8a4", + "b": "0x22a1926e5274e7c9afcbbb96c18edf59e", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x22a1926e5274e7e4483079596605bce42", + "a_m_sub_b_m": "0xe9f754b9cfd77d8e2a1fc2990bcf2bc0", + "a_m_mul_b_m": "0x24c06e8b2580562e839501688427eb172", + "a_eq_b": false, + "a_m_pow_b": "0x17333c990fe349d166bca5dab1987dd7e" + }, + { + "a": "0x60806105a9ba498a0647f1b", + "b": "0x1d74e", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x60806105a9ba498a0665669", + "a_m_sub_b_m": "0x60806105a9ba498a062a7cd", + "a_m_mul_b_m": "0xb1a9999efaff740f599c479673a", + "a_eq_b": false, + "a_m_pow_b": "0xc77dd16e1e5041a44987aca7b519fa79" + }, + { + "a": "0xecf581e00f808b2ace5f544412b", + "b": "0x2e14bd555637d0b489eb1ef93a4f7", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x2f01b2d73647513fb4b97e4d7e622", + "a_m_sub_b_m": "0x3140da92279ee95fa9df9ae0ee2ffe4ee", + "a_m_mul_b_m": "0x2bc0c4c46d18e33a29815a076b477f181", + "a_eq_b": false, + "a_m_pow_b": "0x21fce369f03330bbcca088652323d96cb" + }, + { + "a": "0x28a34d6d48dc78aa722ee475c688a1c81", + "b": "0xd8371eb470e1ee981", + "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", + "a_m_add_b_m": "0x28a34d6d48dc78ab4a66032a376a90602", + "a_m_sub_b_m": "0x28a34d6d48dc78a999f7c5c155a6b3300", + "a_m_mul_b_m": "0x1abcd1f68791dac7b14cbcf051e023c55", + "a_eq_b": false, + "a_m_pow_b": "0x212803e8406c4c24a3acfea6165154ecf" + } + ], + "goldilock": [ + { + "a": "0x112d6", + "b": "0x2200d2870b", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x2200d399e1", + "a_m_sub_b_m": "0xffffffdcff2e8bcc", + "a_m_mul_b_m": "0x24814e0486a932", + "a_eq_b": false, + "a_m_pow_b": "0x1679e8c542afcd99" + }, + { + "a": "0x2", + "b": "0x7c4e813db", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x7c4e813dd", + "a_m_sub_b_m": "0xfffffff73b17ec28", + "a_m_mul_b_m": "0xf89d027b6", + "a_eq_b": false, + "a_m_pow_b": "0x7fffffff8000000" + }, + { + "a": "0xd3d", + "b": "0x0", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xd3d", + "a_m_sub_b_m": "0xd3d", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0xb3f377baa", + "b": "0x25", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xb3f377bcf", + "a_m_sub_b_m": "0xb3f377b85", + "a_m_mul_b_m": "0x1a02304df92", + "a_eq_b": false, + "a_m_pow_b": "0xa58fc2d77c7e2c0" + }, + { + "a": "0x52a167071001c5", + "b": "0x2d", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x52a167071001f2", + "a_m_sub_b_m": "0x52a16707100198", + "a_m_mul_b_m": "0xe865f1c3dd04fa1", + "a_eq_b": false, + "a_m_pow_b": "0xcad7e50922755367" + }, + { + "a": "0x1ba37532b6d7", + "b": "0x3d82a8adc7e3", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x59261de07eba", + "a_m_sub_b_m": "0xffffde1fcc84eef5", + "a_m_mul_b_m": "0xa7ea2f9ff8c03381", + "a_eq_b": false, + "a_m_pow_b": "0x96a41b57329aa15b" + }, + { + "a": "0x1018", + "b": "0x1018", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x2030", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x1030240", + "a_eq_b": true, + "a_m_pow_b": "0xa073f680c6b4aba0" + }, + { + "a": "0x3fb2f35", + "b": "0xf907f84eb42d3", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xf907f88e67208", + "a_m_sub_b_m": "0xfff06f7f7f0fec63", + "a_m_mul_b_m": "0xa56a637b3da54b8", + "a_eq_b": false, + "a_m_pow_b": "0xf344db5a501eafa4" + }, + { + "a": "0x1", + "b": "0x1", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x2", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x1", + "a_eq_b": true, + "a_m_pow_b": "0x1" + }, + { + "a": "0x1292ddf659f", + "b": "0x1fa8313", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x1292fd9e8b2", + "a_m_sub_b_m": "0x1292be4e28c", + "a_m_mul_b_m": "0x4bfcd41894dae7cb", + "a_eq_b": false, + "a_m_pow_b": "0xc9c47efbde1c5085" + }, + { + "a": "0x18033b", + "b": "0x807ea2970ea1aa", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x807ea29726a4e5", + "a_m_sub_b_m": "0xff7f815c69096192", + "a_m_mul_b_m": "0x7e574caa24343421", + "a_eq_b": false, + "a_m_pow_b": "0xdfa231fc5dde21a9" + }, + { + "a": "0x1bbbc3498de20f22", + "b": "0x7591192", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x1bbbc349953b20b4", + "a_m_sub_b_m": "0x1bbbc3498688fd90", + "a_m_mul_b_m": "0x314c8ce51df41adf", + "a_eq_b": false, + "a_m_pow_b": "0x81be57e3410deb17" + }, + { + "a": "0x7da86", + "b": "0x51564ff", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x51d3f85", + "a_m_sub_b_m": "0xfffffffefaf27588", + "a_m_mul_b_m": "0x27eca42d037a", + "a_eq_b": false, + "a_m_pow_b": "0x7e093a2181ad12ea" + }, + { + "a": "0x56a", + "b": "0x639002a7b9ba35c", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x639002a7b9ba8c6", + "a_m_sub_b_m": "0xf9c6ffd48464620f", + "a_m_mul_b_m": "0xb09ae62238a26ff7", + "a_eq_b": false, + "a_m_pow_b": "0x3bc1d85b35da7e90" + }, + { + "a": "0xcd41c15a1a0983", + "b": "0xb62c6b693fa8122d", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xb6f9ad2a99c21bb0", + "a_m_sub_b_m": "0x4aa0d6571a71f757", + "a_m_mul_b_m": "0xcc182a9e437bff87", + "a_eq_b": false, + "a_m_pow_b": "0x53f17ca6ba206988" + }, + { + "a": "0x38", + "b": "0x5", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x3d", + "a_m_sub_b_m": "0x33", + "a_m_mul_b_m": "0x118", + "a_eq_b": false, + "a_m_pow_b": "0x20d38000" + }, + { + "a": "0xa0300d0604da2f4c", + "b": "0x16f1fe", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xa0300d0604f1214a", + "a_m_sub_b_m": "0xa0300d0604c33d4e", + "a_m_mul_b_m": "0x4a825cd7477b1ddb", + "a_eq_b": false, + "a_m_pow_b": "0x8005f9dbac9375ff" + }, + { + "a": "0x4", + "b": "0x23f", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x243", + "a_m_sub_b_m": "0xfffffffefffffdc6", + "a_m_mul_b_m": "0x8fc", + "a_eq_b": false, + "a_m_pow_b": "0xbfffffff40000001" + }, + { + "a": "0xba", + "b": "0x3", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xbd", + "a_m_sub_b_m": "0xb7", + "a_m_mul_b_m": "0x22e", + "a_eq_b": false, + "a_m_pow_b": "0x623028" + }, + { + "a": "0x947ce", + "b": "0x2d879d7", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x2e1c1a5", + "a_m_sub_b_m": "0xfffffffefd30cdf8", + "a_m_mul_b_m": "0x1a689c8bac02", + "a_eq_b": false, + "a_m_pow_b": "0x4928e083a87a8237" + }, + { + "a": "0xa86c6c4a", + "b": "0x608bad822fcf7a", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x608bae2a9c3bc4", + "a_m_sub_b_m": "0xff9f7452263c9cd1", + "a_m_mul_b_m": "0xa1b763f46491ecb7", + "a_eq_b": false, + "a_m_pow_b": "0x7069beaf2e275483" + }, + { + "a": "0x744910c9aaa56", + "b": "0x0", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x744910c9aaa56", + "a_m_sub_b_m": "0x744910c9aaa56", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x11c04551cbe", + "b": "0x0", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x11c04551cbe", + "a_m_sub_b_m": "0x11c04551cbe", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0xc8e", + "b": "0x61e6183bdc85dc", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x61e6183bdc926a", + "a_m_sub_b_m": "0xff9e19e6c42386b3", + "a_m_mul_b_m": "0xcd16c4438a989004", + "a_eq_b": false, + "a_m_pow_b": "0x7c928d679932dd79" + }, + { + "a": "0x5147", + "b": "0x6eae9c546", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x6eaea168d", + "a_m_sub_b_m": "0xfffffff815168c02", + "a_m_mul_b_m": "0x2323f1e40dc6a", + "a_eq_b": false, + "a_m_pow_b": "0xc91ff35416d700fb" + }, + { + "a": "0x40e8e5bc560f", + "b": "0x4956b8a9400bdb", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x4997a18efc61ea", + "a_m_sub_b_m": "0xffb6ea2f3c7c4a35", + "a_m_mul_b_m": "0x83d8c3f97229b192", + "a_eq_b": false, + "a_m_pow_b": "0x68876664c040bc8d" + }, + { + "a": "0x25aec130", + "b": "0x16e325b786208", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x16e3281272338", + "a_m_sub_b_m": "0xfffe91ccca365f29", + "a_m_mul_b_m": "0x41cb684bb1ea3399", + "a_eq_b": false, + "a_m_pow_b": "0xf8fe245b0c0243c7" + }, + { + "a": "0x9a12406815c77ed", + "b": "0x1a059b99a16a", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x9a13e0c1cf61957", + "a_m_sub_b_m": "0x9a10a00e5c2d683", + "a_m_mul_b_m": "0x4b3c6e024fb1feb3", + "a_eq_b": false, + "a_m_pow_b": "0x83489f64491dcb4" + }, + { + "a": "0xe", + "b": "0x37eed6c10e433", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x37eed6c10e441", + "a_m_sub_b_m": "0xfffc811193ef1bdc", + "a_m_mul_b_m": "0x30f0fbe8ec7aca", + "a_eq_b": false, + "a_m_pow_b": "0x44225ecfa18ae9a" + }, + { + "a": "0xe00bef6c5999", + "b": "0x16a47c2", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xe00bf0d6a15b", + "a_m_sub_b_m": "0xe00bee0211d7", + "a_m_mul_b_m": "0xfada8e62f4f53b5", + "a_eq_b": false, + "a_m_pow_b": "0x7e0a2678338871a0" + }, + { + "a": "0x577360b", + "b": "0x12046a68c27c6", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x12046ac035dd1", + "a_m_sub_b_m": "0xfffedfb85eeb0e46", + "a_m_mul_b_m": "0x9ef3783f1373735b", + "a_eq_b": false, + "a_m_pow_b": "0x7ef79edd0f8884a8" + }, + { + "a": "0x37", + "b": "0x76527f3113", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x76527f314a", + "a_m_sub_b_m": "0xffffff88ad80cf25", + "a_m_mul_b_m": "0x196bb9538b15", + "a_eq_b": false, + "a_m_pow_b": "0xabb2e87efb5ee28f" + }, + { + "a": "0x3db1a", + "b": "0x10f1f3750f4", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x10f1f3b2c0e", + "a_m_sub_b_m": "0xfffffeefe0cc8a27", + "a_m_mul_b_m": "0x41568e370baf4c8", + "a_eq_b": false, + "a_m_pow_b": "0x8a6806878513417b" + }, + { + "a": "0x27d33417ccdf", + "b": "0x1e03", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x27d33417eae2", + "a_m_sub_b_m": "0x27d33417aedc", + "a_m_mul_b_m": "0x4ab37946649889d", + "a_eq_b": false, + "a_m_pow_b": "0xbd11dc6613a736bc" + }, + { + "a": "0x210e5f92", + "b": "0xf525fa633501fab6", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xf525fa6356105a48", + "a_m_sub_b_m": "0xada059bec0c64dd", + "a_m_mul_b_m": "0x827d6d8c0376dced", + "a_eq_b": false, + "a_m_pow_b": "0x58d8c7721a70ee53" + }, + { + "a": "0x36ca26a", + "b": "0x3", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x36ca26d", + "a_m_sub_b_m": "0x36ca267", + "a_m_mul_b_m": "0xa45e73e", + "a_eq_b": false, + "a_m_pow_b": "0x961d186b63ecdc41" + }, + { + "a": "0x1ddfd6aaa6eef9", + "b": "0x683674aa51550ef", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x6a147214fbc3fe8", + "a_m_sub_b_m": "0xf99a788b05919e0b", + "a_m_mul_b_m": "0x68e17cedf3549464", + "a_eq_b": false, + "a_m_pow_b": "0x66927a8acfb60c6b" + }, + { + "a": "0x0", + "b": "0x0", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x0", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x0", + "a_eq_b": true, + "a_m_pow_b": "0x1" + }, + { + "a": "0x8eebc740", + "b": "0xeccbf25f209fd447", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xeccbf25faf8b9b87", + "a_m_sub_b_m": "0x13340da06e4bf2fa", + "a_m_mul_b_m": "0x82035c9120f20aca", + "a_eq_b": false, + "a_m_pow_b": "0xde50bf57ebfffd0d" + }, + { + "a": "0x7192931f54", + "b": "0x7192931f54", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xe325263ea8", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xb9cdfed2ce4d412e", + "a_eq_b": true, + "a_m_pow_b": "0xb3d5ad9683a56d77" + }, + { + "a": "0xf6d1c297378f48ec", + "b": "0x20b4f0b30ea1704", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xf8dd11a268795ff0", + "a_m_sub_b_m": "0xf4c6738c06a531e8", + "a_m_mul_b_m": "0x915acbea93623e2b", + "a_eq_b": false, + "a_m_pow_b": "0xe91e9a30bae1d797" + }, + { + "a": "0xbc3e89f182519225", + "b": "0x7948b590a648b77", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xc3d3154a8cb61d9c", + "a_m_sub_b_m": "0xb4a9fe9877ed06ae", + "a_m_mul_b_m": "0xa8f847b398ae0c90", + "a_eq_b": false, + "a_m_pow_b": "0x7bfb6b7a879791b9" + }, + { + "a": "0x44018b0bf3d445", + "b": "0x42f45c6c966f92d4", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x43385df7a2636719", + "a_m_sub_b_m": "0xbd4fa51d75844172", + "a_m_mul_b_m": "0xcb6ad0cb8dd18335", + "a_eq_b": false, + "a_m_pow_b": "0x192eda8688789b9c" + }, + { + "a": "0x58de0c260f6", + "b": "0xefdab2", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x58de1b23ba8", + "a_m_sub_b_m": "0x58ddfd28644", + "a_m_mul_b_m": "0x343383895362e707", + "a_eq_b": false, + "a_m_pow_b": "0xb954c7f3a0ff1cce" + }, + { + "a": "0x3066", + "b": "0x7eb2f8903086f", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x7eb2f890338d5", + "a_m_sub_b_m": "0xfff814cf76fd27f8", + "a_m_mul_b_m": "0x7f409ea228ca2c39", + "a_eq_b": false, + "a_m_pow_b": "0x872388d5e164cb62" + }, + { + "a": "0x36c3662cd6c6", + "b": "0x0", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x36c3662cd6c6", + "a_m_sub_b_m": "0x36c3662cd6c6", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0xd11", + "b": "0xd11", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x1a22", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xaabb21", + "a_eq_b": true, + "a_m_pow_b": "0x5999c4a54a819121" + }, + { + "a": "0x5fc9e4fc14b7ea", + "b": "0x276c745177fbcf", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x8736594d8cb3b9", + "a_m_sub_b_m": "0x385d70aa9cbc1b", + "a_m_mul_b_m": "0xd7d0863356441c6d", + "a_eq_b": false, + "a_m_pow_b": "0x261520538ccd0b27" + }, + { + "a": "0x0", + "b": "0x5a3", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x5a3", + "a_m_sub_b_m": "0xfffffffefffffa5e", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0xd34baca338ccfd", + "b": "0xfc63770821a2d9a0", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xfd36c2b4c4dba69d", + "a_m_sub_b_m": "0x46fd4a38195f35e", + "a_m_mul_b_m": "0x9b7aab70a39d95a", + "a_eq_b": false, + "a_m_pow_b": "0xa74c959a3c144e4a" + }, + { + "a": "0xebfa492d4ec1a13d", + "b": "0x35cff", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xebfa492d4ec4fe3c", + "a_m_sub_b_m": "0xebfa492d4ebe443e", + "a_m_mul_b_m": "0xdc26325aec856e1c", + "a_eq_b": false, + "a_m_pow_b": "0xfaaadaf439f55f4f" + }, + { + "a": "0x32eb54cf8e1", + "b": "0x61ccc1f35951baf", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x61ccf4deae21490", + "a_m_sub_b_m": "0xf9e3370e7fb7dd33", + "a_m_mul_b_m": "0xc3373cab09ed9eb0", + "a_eq_b": false, + "a_m_pow_b": "0xa5712bdf6211dd91" + }, + { + "a": "0x8fca4c7d929293", + "b": "0x69", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x8fca4c7d9292fc", + "a_m_sub_b_m": "0x8fca4c7d92922a", + "a_m_mul_b_m": "0x3af9f95f811e1e4b", + "a_eq_b": false, + "a_m_pow_b": "0x46dc256b428fa11b" + }, + { + "a": "0x1227cf4e73295ca", + "b": "0x1b1c8b9032", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x1227d1003be25fc", + "a_m_sub_b_m": "0x1227cd9caa70598", + "a_m_mul_b_m": "0xc26298e4ea0d4f98", + "a_eq_b": false, + "a_m_pow_b": "0x4f991e30906ac41c" + }, + { + "a": "0x110dc08be0b176", + "b": "0xf321bdb2c63c3d08", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xf332cb73521cee7e", + "a_m_sub_b_m": "0xcef500cc5a4746f", + "a_m_mul_b_m": "0x6b3d9f85973e3b2d", + "a_eq_b": false, + "a_m_pow_b": "0x7d43b128cf0229de" + }, + { + "a": "0x0", + "b": "0x11e2e7b1", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x11e2e7b1", + "a_m_sub_b_m": "0xfffffffeee1d1850", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x16f564d", + "b": "0x61", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x16f56ae", + "a_m_sub_b_m": "0x16f55ec", + "a_m_mul_b_m": "0x8b2fb32d", + "a_eq_b": false, + "a_m_pow_b": "0xd9f96a86e877a269" + }, + { + "a": "0xdd59198faf794372", + "b": "0xfca975b8a6c754b3", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xda028f4956409824", + "a_m_sub_b_m": "0xe0afa3d608b1eec0", + "a_m_mul_b_m": "0x6eb01f6498ff5f5", + "a_eq_b": false, + "a_m_pow_b": "0x6e68c7a320541959" + }, + { + "a": "0x17b6fbe55", + "b": "0x2f298257ba", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x30a4f2160f", + "a_m_sub_b_m": "0xffffffd151ed669c", + "a_m_mul_b_m": "0xe70a0820ed092c7d", + "a_eq_b": false, + "a_m_pow_b": "0xa6a066cfd4be0a9e" + }, + { + "a": "0x5f11e534bd48b258", + "b": "0x14c553710d59", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x5f11f9fa10b9bfb1", + "a_m_sub_b_m": "0x5f11d06f69d7a4ff", + "a_m_mul_b_m": "0x400ce31e12822757", + "a_eq_b": false, + "a_m_pow_b": "0x518565e872fa9523" + }, + { + "a": "0x5ab3717", + "b": "0x4a9d7c6677", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x4aa3279d8e", + "a_m_sub_b_m": "0xffffffb4682ed0a1", + "a_m_mul_b_m": "0xa6faaea3a4adc5b0", + "a_eq_b": false, + "a_m_pow_b": "0x5cc3b33ad3e707a8" + }, + { + "a": "0xdb67d1fcfc72dd60", + "b": "0x0", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xdb67d1fcfc72dd60", + "a_m_sub_b_m": "0xdb67d1fcfc72dd60", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x3f4fd27dc0", + "b": "0x34c4", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x3f4fd2b284", + "a_m_sub_b_m": "0x3f4fd248fc", + "a_m_mul_b_m": "0xd0cafdeb34700", + "a_eq_b": false, + "a_m_pow_b": "0xc1814824be89aaf3" + }, + { + "a": "0x7ccf8", + "b": "0x1888cc4c1717", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x1888cc53e40f", + "a_m_sub_b_m": "0xffffe77633bbb5e2", + "a_m_mul_b_m": "0xbf625d672dbdb248", + "a_eq_b": false, + "a_m_pow_b": "0x7f8a09aa772f590e" + }, + { + "a": "0x29d", + "b": "0x29d", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x53a", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x6d449", + "a_eq_b": true, + "a_m_pow_b": "0x595dc86d14bc8c1" + }, + { + "a": "0x0", + "b": "0x38efba7bb4f2", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x38efba7bb4f2", + "a_m_sub_b_m": "0xffffc70f45844b0f", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x3e14", + "b": "0x3e14", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x7c28", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xf0db190", + "a_eq_b": true, + "a_m_pow_b": "0x2cc3ccff1b7a9a3a" + }, + { + "a": "0x7", + "b": "0x2523", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x252a", + "a_m_sub_b_m": "0xfffffffeffffdae5", + "a_m_mul_b_m": "0x103f5", + "a_eq_b": false, + "a_m_pow_b": "0x6dc49cb1098a291d" + }, + { + "a": "0xb6a609567c", + "b": "0x1bfa5e8461", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xd2a067dadd", + "a_m_sub_b_m": "0x9aabaad21b", + "a_m_mul_b_m": "0x2490bbbe93a9a106", + "a_eq_b": false, + "a_m_pow_b": "0x828f9d9ba8c2905e" + }, + { + "a": "0x1", + "b": "0x48", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x49", + "a_m_sub_b_m": "0xfffffffeffffffba", + "a_m_mul_b_m": "0x48", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0xcd2b2d82e311df5d", + "b": "0x54b232eb", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xcd2b2d8337c41248", + "a_m_sub_b_m": "0xcd2b2d828e5fac72", + "a_m_mul_b_m": "0xa0eb12fa7dd1389c", + "a_eq_b": false, + "a_m_pow_b": "0x6199a123fe8f1c6b" + }, + { + "a": "0x357dc069bfca", + "b": "0x12d9fce36d1329", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x130f7aa3d6d2f3", + "a_m_sub_b_m": "0xffed5b7fdcfcaca2", + "a_m_mul_b_m": "0xc46c943180c9be7f", + "a_eq_b": false, + "a_m_pow_b": "0x14eb93ea410a12a1" + }, + { + "a": "0xcdbd90cf6903040", + "b": "0xcdbd90cf6903040", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x19b7b219ed206080", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x559ccdd205205cf9", + "a_eq_b": true, + "a_m_pow_b": "0x61317a4f51359c3f" + }, + { + "a": "0x4de9b3cd98", + "b": "0xcf8529", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x4dea8352c1", + "a_m_sub_b_m": "0x4de8e4486f", + "a_m_mul_b_m": "0x3f287f481583e558", + "a_eq_b": false, + "a_m_pow_b": "0x8fb676563b5eb2fe" + }, + { + "a": "0x38408b1b395ad189", + "b": "0x3", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x38408b1b395ad18c", + "a_m_sub_b_m": "0x38408b1b395ad186", + "a_m_mul_b_m": "0xa8c1a151ac10749b", + "a_eq_b": false, + "a_m_pow_b": "0x9456befa06e653f1" + }, + { + "a": "0x3d42fa234481bf8", + "b": "0xfa5d926db8b178", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x4ce8d34a200cd70", + "a_m_sub_b_m": "0x2d9d20fc68f6a80", + "a_m_mul_b_m": "0xeb130eb745039447", + "a_eq_b": false, + "a_m_pow_b": "0x7733276ae771a3c8" + }, + { + "a": "0x115d5d7", + "b": "0x0", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x115d5d7", + "a_m_sub_b_m": "0x115d5d7", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x4f8a", + "b": "0x1c16ef", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x1c6679", + "a_m_sub_b_m": "0xfffffffeffe4389c", + "a_m_mul_b_m": "0x8ba381dd6", + "a_eq_b": false, + "a_m_pow_b": "0x3bf1c059dc1c02da" + }, + { + "a": "0x47a750320d7", + "b": "0x4a2", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x47a75032579", + "a_m_sub_b_m": "0x47a75031c35", + "a_m_mul_b_m": "0x14bf52187e240e", + "a_eq_b": false, + "a_m_pow_b": "0x1492ef20b4e7ef9b" + }, + { + "a": "0x0", + "b": "0x67934", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x67934", + "a_m_sub_b_m": "0xfffffffefff986cd", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x1a4ea0fb", + "b": "0xd44f3ff82a8a24c0", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xd44f3ff844d8c5bb", + "a_m_sub_b_m": "0x2bb0c006efc47c3c", + "a_m_mul_b_m": "0x796f12e0a918c61a", + "a_eq_b": false, + "a_m_pow_b": "0xd28a28e65dcf8328" + }, + { + "a": "0x503a8cc9", + "b": "0xae", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x503a8d77", + "a_m_sub_b_m": "0x503a8c1b", + "a_m_mul_b_m": "0x3687cbb09e", + "a_eq_b": false, + "a_m_pow_b": "0x807b5b4712fab4c0" + }, + { + "a": "0xe95223a21930e973", + "b": "0xe95223a21930e973", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xd2a447453261d2e5", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x128c644c16b304a1", + "a_eq_b": true, + "a_m_pow_b": "0x1594dc7576d9afbe" + }, + { + "a": "0x0", + "b": "0x82856475317bf366", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x82856475317bf366", + "a_m_sub_b_m": "0x7d7a9b89ce840c9b", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x18c7e5b535000026", + "b": "0x423f3cd91abc79", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x190a24f20e1abc9f", + "a_m_sub_b_m": "0x1885a6785be543ad", + "a_m_mul_b_m": "0x35738b5ff8d46f88", + "a_eq_b": false, + "a_m_pow_b": "0xcfb5a7740801ffb9" + }, + { + "a": "0x16417607708e308a", + "b": "0x854d2acc3ee9ca9a", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x9b8ea0d3af77fb24", + "a_m_sub_b_m": "0x90f44b3a31a465f1", + "a_m_mul_b_m": "0x7208409599233121", + "a_eq_b": false, + "a_m_pow_b": "0xd17d5ceee28dfcf5" + }, + { + "a": "0x18d81a486b6", + "b": "0x5f2ee62", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x18d87977518", + "a_m_sub_b_m": "0x18d7bb19854", + "a_m_mul_b_m": "0x3cbeeae47c44c5a3", + "a_eq_b": false, + "a_m_pow_b": "0x5b44828264dfd543" + }, + { + "a": "0x4", + "b": "0x4", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x8", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x10", + "a_eq_b": true, + "a_m_pow_b": "0x100" + }, + { + "a": "0x390f", + "b": "0x2e02a75756132a4", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x2e02a7575616bb3", + "a_m_sub_b_m": "0xfd1fd5898a9f066c", + "a_m_mul_b_m": "0x1496a4a884f87af8", + "a_eq_b": false, + "a_m_pow_b": "0xbbcf1b4dfaefdcc6" + }, + { + "a": "0x9fd419", + "b": "0x234f33a4e", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x235930e67", + "a_m_sub_b_m": "0xfffffffccbac99cc", + "a_m_mul_b_m": "0x160b721ce7b499e", + "a_eq_b": false, + "a_m_pow_b": "0xf8dab31a084543b4" + }, + { + "a": "0x67a554a", + "b": "0x0", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x67a554a", + "a_m_sub_b_m": "0x67a554a", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x956d2344227b748a", + "b": "0xb8dd43bd", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x956d2344db58b847", + "a_m_sub_b_m": "0x956d2343699e30cd", + "a_m_mul_b_m": "0xb84ff6c423df8fc8", + "a_eq_b": false, + "a_m_pow_b": "0xae4a02d3725b4caa" + }, + { + "a": "0xec9d94e85ccc0c1d", + "b": "0x0", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xec9d94e85ccc0c1d", + "a_m_sub_b_m": "0xec9d94e85ccc0c1d", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x14339", + "b": "0x2d11705", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x2d25a3e", + "a_m_sub_b_m": "0xfffffffefd302c35", + "a_m_mul_b_m": "0x38e70996f1d", + "a_eq_b": false, + "a_m_pow_b": "0xd8154fa726f63337" + }, + { + "a": "0x8cc45f9aed9e2e72", + "b": "0xb38ad4d523ac49a", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x97fd0ce83fd8f30c", + "a_m_sub_b_m": "0x818bb24d9b6369d8", + "a_m_mul_b_m": "0x886f161f45622c3a", + "a_eq_b": false, + "a_m_pow_b": "0x6735e9c17b85087" + }, + { + "a": "0x3f6de248f01", + "b": "0xadaa08987a6fd", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xade9767ac35fe", + "a_m_sub_b_m": "0xfff52955549ce805", + "a_m_mul_b_m": "0xf0585278065b96f9", + "a_eq_b": false, + "a_m_pow_b": "0xf205ee4f8c459603" + }, + { + "a": "0xd970ec241d87667a", + "b": "0x369cec5333", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xd970ec5aba73b9ad", + "a_m_sub_b_m": "0xd970ebed809b1347", + "a_m_mul_b_m": "0x3f03740e358f9dd7", + "a_eq_b": false, + "a_m_pow_b": "0xbea8fe992bd310af" + }, + { + "a": "0x83331736980beaa8", + "b": "0x95f33", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x83331736981549db", + "a_m_sub_b_m": "0x8333173698028b75", + "a_m_mul_b_m": "0xe9bb084cf65749e3", + "a_eq_b": false, + "a_m_pow_b": "0x400e029b4785984" + }, + { + "a": "0x240", + "b": "0x1a", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x25a", + "a_m_sub_b_m": "0x226", + "a_m_mul_b_m": "0x3a80", + "a_eq_b": false, + "a_m_pow_b": "0xaa78561e4904b6c" + }, + { + "a": "0xfcca581bbc44d83", + "b": "0xb", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xfcca581bbc44d8e", + "a_m_sub_b_m": "0xfcca581bbc44d78", + "a_m_mul_b_m": "0xadcb1c93116f54a1", + "a_eq_b": false, + "a_m_pow_b": "0x7080591e1005ca6c" + }, + { + "a": "0x3adb5d", + "b": "0xfb15e4f2e30a3df1", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xfb15e4f2e345194e", + "a_m_sub_b_m": "0x4ea1b0c1d309d6d", + "a_m_mul_b_m": "0xd1111ee44615f171", + "a_eq_b": false, + "a_m_pow_b": "0x7dc7c6d571f21d15" + }, + { + "a": "0x41fc2f5a79", + "b": "0x4", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x41fc2f5a7d", + "a_m_sub_b_m": "0x41fc2f5a75", + "a_m_mul_b_m": "0x107f0bd69e4", + "a_eq_b": false, + "a_m_pow_b": "0x75d0c94e75f29bb9" + }, + { + "a": "0xb961a", + "b": "0x49fbbc5fd4007", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x49fbbc608d621", + "a_m_sub_b_m": "0xfffb60433a0e5614", + "a_m_mul_b_m": "0x9321c12b3f899a81", + "a_eq_b": false, + "a_m_pow_b": "0xbff725f9c6c81acf" + }, + { + "a": "0x390b89776", + "b": "0x3f60b9ad71", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x42f17244e7", + "a_m_sub_b_m": "0xffffffc32ffeea06", + "a_m_mul_b_m": "0xf6487f7c541b9835", + "a_eq_b": false, + "a_m_pow_b": "0x34fa11ccd24954c" + }, + { + "a": "0xfcf5b08e327706c7", + "b": "0x631893a", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xfcf5b08e38a89001", + "a_m_sub_b_m": "0xfcf5b08e2c457d8d", + "a_m_mul_b_m": "0xf1ab40ec11905354", + "a_eq_b": false, + "a_m_pow_b": "0x880189b606d0d53" + }, + { + "a": "0x1e1c58da566875b", + "b": "0x1af22c5d96be2f7", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x390e8537ed26a52", + "a_m_sub_b_m": "0x32a2c7cbfaa464", + "a_m_mul_b_m": "0x96c66a5fc5644a5d", + "a_eq_b": false, + "a_m_pow_b": "0xccb0a86d5752737f" + }, + { + "a": "0x216b4cfeea430e3e", + "b": "0x216b4cfeea430e3e", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x42d699fdd4861c7c", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x945d31489c3c898a", + "a_eq_b": true, + "a_m_pow_b": "0x1b8594b89feebd35" + }, + { + "a": "0x3b0dae07", + "b": "0xa5d52e267b90669d", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xa5d52e26b69e14a4", + "a_m_sub_b_m": "0x5a2ad1d8bf7d476b", + "a_m_mul_b_m": "0xcae1f735c569861a", + "a_eq_b": false, + "a_m_pow_b": "0x9d0eaba9e7c8a78b" + }, + { + "a": "0xcf", + "b": "0xf9589eef3cee", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xf9589eef3dbd", + "a_m_sub_b_m": "0xffff06a66110c3e2", + "a_m_mul_b_m": "0xc99ea883724472", + "a_eq_b": false, + "a_m_pow_b": "0x8d7837b3535f1741" + }, + { + "a": "0x79", + "b": "0x22370f52", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x22370fcb", + "a_m_sub_b_m": "0xfffffffeddc8f128", + "a_m_mul_b_m": "0x102c063dc2", + "a_eq_b": false, + "a_m_pow_b": "0x42f97658b9669035" + }, + { + "a": "0x291fc65875de0f", + "b": "0x226ed9b6", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x291fc67ae4b7c5", + "a_m_sub_b_m": "0x291fc636070459", + "a_m_mul_b_m": "0xf82aea2835730da4", + "a_eq_b": false, + "a_m_pow_b": "0x609db88272c559c0" + }, + { + "a": "0x613805b544ee3e6", + "b": "0x32b665a", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x613805b577a4a40", + "a_m_sub_b_m": "0x613805b51237d8c", + "a_m_mul_b_m": "0x8966dbd40c1880a7", + "a_eq_b": false, + "a_m_pow_b": "0x554f01d464cb62e2" + }, + { + "a": "0xf9e731291d025dad", + "b": "0x9a80d8241f", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xf9e731c39dda81cc", + "a_m_sub_b_m": "0xf9e7308e9c2a398e", + "a_m_mul_b_m": "0x1560e89a8f9381b8", + "a_eq_b": false, + "a_m_pow_b": "0x14f514844b4f9352" + }, + { + "a": "0x0", + "b": "0xd52bce0790d7", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xd52bce0790d7", + "a_m_sub_b_m": "0xffff2ad331f86f2a", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0xe0", + "b": "0x800d88620ec168c9", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x800d88620ec169a9", + "a_m_sub_b_m": "0x7ff2779cf13e9818", + "a_m_mul_b_m": "0xbd7563ce93baf70", + "a_eq_b": false, + "a_m_pow_b": "0xaa6620ae9fce0e40" + }, + { + "a": "0x1749f", + "b": "0x0", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x1749f", + "a_m_sub_b_m": "0x1749f", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x152c22e7a6", + "b": "0x9eac1be95b893524", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x9eac1bfe87ac1cca", + "a_m_sub_b_m": "0x6153e42ad099b283", + "a_m_mul_b_m": "0xa33e4599493a6feb", + "a_eq_b": false, + "a_m_pow_b": "0x791eb2ba904d6e27" + }, + { + "a": "0xa7ab3", + "b": "0x1afb619", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x1ba30cc", + "a_m_sub_b_m": "0xfffffffefe5ac49b", + "a_m_mul_b_m": "0x11ac079e3d7b", + "a_eq_b": false, + "a_m_pow_b": "0xc7163e160f9138d9" + }, + { + "a": "0x171f45", + "b": "0x19d2a6107c63", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x19d2a6279ba8", + "a_m_sub_b_m": "0xffffe62c5a06a2e3", + "a_m_mul_b_m": "0x5514635fee6683ad", + "a_eq_b": false, + "a_m_pow_b": "0x648a2bc87031c82b" + }, + { + "a": "0xf2ecd9607544b5", + "b": "0x1be8ea734", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xf2ecdb1f03ebe9", + "a_m_sub_b_m": "0xf2ecd7a1e69d81", + "a_m_mul_b_m": "0xc22178d3886247c4", + "a_eq_b": false, + "a_m_pow_b": "0xb41de04e4f3b48f4" + }, + { + "a": "0x74", + "b": "0xa042353398d230cf", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xa042353398d23143", + "a_m_sub_b_m": "0x5fbdcacb672dcfa6", + "a_m_mul_b_m": "0x9e001ba93f3e1d84", + "a_eq_b": false, + "a_m_pow_b": "0x2207bc826ff7d698" + }, + { + "a": "0xa2e9fd1608268550", + "b": "0x0", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xa2e9fd1608268550", + "a_m_sub_b_m": "0xa2e9fd1608268550", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x17f59c88ba627", + "b": "0x263df91bda48e", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x3e3395a494ab5", + "a_m_sub_b_m": "0xffff1b7936ce019a", + "a_m_mul_b_m": "0x69c1348de1701286", + "a_eq_b": false, + "a_m_pow_b": "0x545010632fb82fdd" + }, + { + "a": "0x517a", + "b": "0xd5d9295580e", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xd5d9295a988", + "a_m_sub_b_m": "0xfffff2a16d6af96d", + "a_m_mul_b_m": "0x440f9f91c0864ac", + "a_eq_b": false, + "a_m_pow_b": "0x2553885d3ff3ddf3" + }, + { + "a": "0x9ca1efa703b8bbaa", + "b": "0x17a8f", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x9ca1efa703ba3639", + "a_m_sub_b_m": "0x9ca1efa703b7411b", + "a_m_mul_b_m": "0x9a526167d948f058", + "a_eq_b": false, + "a_m_pow_b": "0x1bde360e5978c803" + }, + { + "a": "0x1783e6bd", + "b": "0x1fa364a", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x197e1d07", + "a_m_sub_b_m": "0x1589b073", + "a_m_mul_b_m": "0x2e7fb2b05e90a2", + "a_eq_b": false, + "a_m_pow_b": "0x2100a0601535a6e0" + }, + { + "a": "0x1680f28e7edeb19d", + "b": "0x27bd37b1", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x1680f28ea69be94e", + "a_m_sub_b_m": "0x1680f28e572179ec", + "a_m_mul_b_m": "0xf4a304b988c4181", + "a_eq_b": false, + "a_m_pow_b": "0x80d893ca4e267c56" + }, + { + "a": "0x316ebdbb7e21bf", + "b": "0x1fd6f51e", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x316ebddb5516dd", + "a_m_sub_b_m": "0x316ebd9ba72ca1", + "a_m_mul_b_m": "0xe11bb61c05b79978", + "a_eq_b": false, + "a_m_pow_b": "0x9ff1b4876ff90c8b" + }, + { + "a": "0xc35de3ce2f8186dc", + "b": "0x2205e5f", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xc35de3ce31a1e53b", + "a_m_sub_b_m": "0xc35de3ce2d61287d", + "a_m_mul_b_m": "0x1141a1bcc276641b", + "a_eq_b": false, + "a_m_pow_b": "0x92083e4d3f084bfa" + }, + { + "a": "0xd255ff60d6", + "b": "0xd255ff60d6", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x1a4abfec1ac", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x33df20f92af48613", + "a_eq_b": true, + "a_m_pow_b": "0xee9978791e794b31" + }, + { + "a": "0x68b9ae7ba3d2f88e", + "b": "0x8f67653bbf30c85e", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xf82113b76303c0ec", + "a_m_sub_b_m": "0xd952493ee4a23031", + "a_m_mul_b_m": "0xc2d355ed5481f0be", + "a_eq_b": false, + "a_m_pow_b": "0x40e36811655b81cc" + }, + { + "a": "0x43213df629a3", + "b": "0x43213df629a3", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x86427bec5346", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xf3dbb550a86f330a", + "a_eq_b": true, + "a_m_pow_b": "0xef135a5f8aa3820c" + }, + { + "a": "0x3e8ac526d076c", + "b": "0x3e8ac526d076c", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x7d158a4da0ed8", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xee8a78423aac5d8f", + "a_eq_b": true, + "a_m_pow_b": "0xc63b825632b1d300" + }, + { + "a": "0x69cdcb204dc", + "b": "0x69cdcb204dc", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xd39b96409b8", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xf9e6abae1dbe29a", + "a_eq_b": true, + "a_m_pow_b": "0x57050ee59f44583e" + }, + { + "a": "0xc8edb9afdc21b3e8", + "b": "0x5b8d82d8ae", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xc8edba0b69a48c96", + "a_m_sub_b_m": "0xc8edb9544e9edb3a", + "a_m_mul_b_m": "0x695a878256f163d6", + "a_eq_b": false, + "a_m_pow_b": "0xa58809451059214e" + }, + { + "a": "0x3820aa4e1a21c48", + "b": "0x354496139", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x3820aa835eb7d81", + "a_m_sub_b_m": "0x3820aa18d58bb0f", + "a_m_mul_b_m": "0xe19e82644ea9c732", + "a_eq_b": false, + "a_m_pow_b": "0x8c6cba19305785f8" + }, + { + "a": "0x108e8e2", + "b": "0x68484", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x10f6d66", + "a_m_sub_b_m": "0x102645e", + "a_m_mul_b_m": "0x6be95f89c88", + "a_eq_b": false, + "a_m_pow_b": "0x315d1dec167705af" + }, + { + "a": "0x1f783", + "b": "0x0", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x1f783", + "a_m_sub_b_m": "0x1f783", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x71a7e", + "b": "0x71a7e", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xe34fc", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x3275a1d604", + "a_eq_b": true, + "a_m_pow_b": "0xbc35e25c29afcb42" + }, + { + "a": "0x7555ac8a2cd8317", + "b": "0x6", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x7555ac8a2cd831d", + "a_m_sub_b_m": "0x7555ac8a2cd8311", + "a_m_mul_b_m": "0x2c0020b3d0d1128a", + "a_eq_b": false, + "a_m_pow_b": "0xb0ed99cafe59993b" + }, + { + "a": "0x1758f359", + "b": "0x52ae67", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x17aba1c0", + "a_m_sub_b_m": "0x170644f2", + "a_m_mul_b_m": "0x78a65ccb266cf", + "a_eq_b": false, + "a_m_pow_b": "0x1012fa619481f43e" + }, + { + "a": "0x1021", + "b": "0x9893f82d0a964cb9", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x9893f82d0a965cda", + "a_m_sub_b_m": "0x676c07d1f569c369", + "a_m_mul_b_m": "0xea95d813c22b6a3d", + "a_eq_b": false, + "a_m_pow_b": "0xe432d2b1e89d9f78" + }, + { + "a": "0x129f9f6888ddde", + "b": "0x23553536ff84c", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x14d4f2bbf8d62a", + "a_m_sub_b_m": "0x106a4c1518e592", + "a_m_mul_b_m": "0xb920d23ac784974", + "a_eq_b": false, + "a_m_pow_b": "0xc969962a8e96832e" + }, + { + "a": "0xdafd58cf4c3838a2", + "b": "0xdafd58cf4c3838a2", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xb5fab19f98707143", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x8f1bf7ca91b73cb4", + "a_eq_b": true, + "a_m_pow_b": "0xb2547a9100d9432f" + }, + { + "a": "0x2afb48d79878", + "b": "0x97ef9816", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x2afbe0c7308e", + "a_m_sub_b_m": "0x2afab0e80062", + "a_m_mul_b_m": "0x72192a90651640ce", + "a_eq_b": false, + "a_m_pow_b": "0x200704884da88380" + }, + { + "a": "0x56d3e51e8aa5c6c", + "b": "0x108e", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x56d3e51e8aa6cfa", + "a_m_sub_b_m": "0x56d3e51e8aa4bde", + "a_m_mul_b_m": "0xd67db052b446038f", + "a_eq_b": false, + "a_m_pow_b": "0xb8e788c5dbdc8e4" + }, + { + "a": "0x468921a3d1c", + "b": "0x468921a3d1c", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x8d124347a38", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xdaafe66b6832ebc9", + "a_eq_b": true, + "a_m_pow_b": "0xcde8497c037ae64f" + }, + { + "a": "0x354ca3907", + "b": "0x1d4cb0ffb0", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x20a17b38b7", + "a_m_sub_b_m": "0xffffffe508193958", + "a_m_mul_b_m": "0x9a621de102a52d6f", + "a_eq_b": false, + "a_m_pow_b": "0x4dd0790f010d62d7" + }, + { + "a": "0x8df9a847f5", + "b": "0x16", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x8df9a8480b", + "a_m_sub_b_m": "0x8df9a847df", + "a_m_mul_b_m": "0xc3374762f0e", + "a_eq_b": false, + "a_m_pow_b": "0x3ca7d1e2da9dcf5b" + }, + { + "a": "0x161951c4", + "b": "0xb6b7e566b1c08c4", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xb6b7e5681355a88", + "a_m_sub_b_m": "0xf49481a8aafd4901", + "a_m_mul_b_m": "0x85e74e8b92645c10", + "a_eq_b": false, + "a_m_pow_b": "0xa6235f8ca76754a" + }, + { + "a": "0xddbb671", + "b": "0xe8a08de338b9cd", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xe8a08df114703e", + "a_m_sub_b_m": "0xff175f712aa2fca5", + "a_m_mul_b_m": "0x56cb98effb7429af", + "a_eq_b": false, + "a_m_pow_b": "0xcd44deab9b6dd741" + }, + { + "a": "0x281662cd63", + "b": "0x281662cd63", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x502cc59ac6", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xd556a5e893ae02", + "a_eq_b": true, + "a_m_pow_b": "0x7cc1a5de7c049952" + }, + { + "a": "0x138", + "b": "0x0", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x138", + "a_m_sub_b_m": "0x138", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0xf007c8f851", + "b": "0x2", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xf007c8f853", + "a_m_sub_b_m": "0xf007c8f84f", + "a_m_mul_b_m": "0x1e00f91f0a2", + "a_eq_b": false, + "a_m_pow_b": "0x990f14475d6c2893" + }, + { + "a": "0x3df0540c5", + "b": "0x685f5e7326e1f", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x685f9c637aee4", + "a_m_sub_b_m": "0xfff97a0cf7d2d2a7", + "a_m_mul_b_m": "0x2e658d02acd83d26", + "a_eq_b": false, + "a_m_pow_b": "0x7dbaeabe0c20f9c1" + }, + { + "a": "0x7ca6d", + "b": "0xc281", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x88cee", + "a_m_sub_b_m": "0x707ec", + "a_m_mul_b_m": "0x5eb539aed", + "a_eq_b": false, + "a_m_pow_b": "0x8b114737ca81bac9" + }, + { + "a": "0x18a1eff0", + "b": "0x5c0e7f171b38bdd", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x5c0e7f18a557bcd", + "a_m_sub_b_m": "0xfa3f180da6ee6414", + "a_m_mul_b_m": "0xff72ebfce555b8bc", + "a_eq_b": false, + "a_m_pow_b": "0x121d0507bf0b1572" + }, + { + "a": "0x2cd686645e83f9", + "b": "0x85123151", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x2cd686e970b54a", + "a_m_sub_b_m": "0x2cd685df4c52a8", + "a_m_mul_b_m": "0x8aef11947d951c26", + "a_eq_b": false, + "a_m_pow_b": "0x88e564bd5809f93c" + }, + { + "a": "0xb41bb943b79cdee6", + "b": "0x22ed", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xb41bb943b79d01d3", + "a_m_sub_b_m": "0xb41bb943b79cbbf9", + "a_m_mul_b_m": "0x6c459aa5d1d4ce5c", + "a_eq_b": false, + "a_m_pow_b": "0x5c7b6d205dea80ac" + }, + { + "a": "0xce60aedf6a1985", + "b": "0x29e0494573a69", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xd0feb373c153ee", + "a_m_sub_b_m": "0xcbc2aa4b12df1c", + "a_m_mul_b_m": "0x5c51cbe517c4d1c7", + "a_eq_b": false, + "a_m_pow_b": "0xd37383555e09c46f" + }, + { + "a": "0x85664d862c464f3d", + "b": "0xe6ae3133e57e85", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x864cfbb7602bcdc2", + "a_m_sub_b_m": "0x847f9f54f860d0b8", + "a_m_mul_b_m": "0x32155aed0c3342e", + "a_eq_b": false, + "a_m_pow_b": "0xfd83e735e603ef4e" + }, + { + "a": "0x3d51ca836270a", + "b": "0x563f", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x3d51ca8367d49", + "a_m_sub_b_m": "0x3d51ca835d0cb", + "a_m_mul_b_m": "0x4a8912909670f775", + "a_eq_b": false, + "a_m_pow_b": "0xbf0f58b90f12d740" + }, + { + "a": "0xa3a4141eae059", + "b": "0x77c0123520", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xa3ab901fd1579", + "a_m_sub_b_m": "0xa39c981d8ab39", + "a_m_mul_b_m": "0xd2549fb35f47b760", + "a_eq_b": false, + "a_m_pow_b": "0xd7c2cb95e9dcbf40" + }, + { + "a": "0x16cabd877d", + "b": "0x16cabd877d", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x2d957b0efa", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x7922f1a59a471102", + "a_eq_b": true, + "a_m_pow_b": "0x2569b18810eeb4bf" + }, + { + "a": "0x1d02", + "b": "0x680235d1f3f4", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x680235d210f6", + "a_m_sub_b_m": "0xffff97fcca2e290f", + "a_m_mul_b_m": "0xbc9101d34468be8", + "a_eq_b": false, + "a_m_pow_b": "0x6bde65a5e1b3133" + }, + { + "a": "0xcfbd212d1a266e6c", + "b": "0x7512", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xcfbd212d1a26e37e", + "a_m_sub_b_m": "0xcfbd212d1a25f95a", + "a_m_mul_b_m": "0xb76511f672ac098", + "a_eq_b": false, + "a_m_pow_b": "0xcad06ef3cb71dfb5" + }, + { + "a": "0x6f4590b57d9", + "b": "0xca31a2285", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x700fc257a5e", + "a_m_sub_b_m": "0x6e7b5f13554", + "a_m_mul_b_m": "0x76fbcae9db991ddb", + "a_eq_b": false, + "a_m_pow_b": "0x11087ca3f82de812" + }, + { + "a": "0x5d6c91ac45edb", + "b": "0x191bc", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x5d6c91ac5f097", + "a_m_sub_b_m": "0x5d6c91ac2cd1f", + "a_m_mul_b_m": "0x29babea640cab3cb", + "a_eq_b": false, + "a_m_pow_b": "0x67ffb71e21eb9e57" + }, + { + "a": "0x41", + "b": "0x79c3", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x7a04", + "a_m_sub_b_m": "0xfffffffeffff867f", + "a_m_mul_b_m": "0x1eea83", + "a_eq_b": false, + "a_m_pow_b": "0x7cdfd4ca626f6c3c" + }, + { + "a": "0x5d2c0b0a37630524", + "b": "0xddbfdee880", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x5d2c0be7f741eda4", + "a_m_sub_b_m": "0x5d2c0a2c77841ca4", + "a_m_mul_b_m": "0x378ba4f40a88acd1", + "a_eq_b": false, + "a_m_pow_b": "0xebe7fa96ac136842" + }, + { + "a": "0x9e0", + "b": "0x2aff2abd86", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x2aff2ac766", + "a_m_sub_b_m": "0xffffffd400d54c5b", + "a_m_mul_b_m": "0x1a897c60f8b40", + "a_eq_b": false, + "a_m_pow_b": "0x44c3caee6a9cb196" + }, + { + "a": "0xdfb7d803", + "b": "0x6122cbdb877", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x6130c75907a", + "a_m_sub_b_m": "0xfffff9edb2fa1f8d", + "a_m_mul_b_m": "0x3116ac931fee8c17", + "a_eq_b": false, + "a_m_pow_b": "0xcfa1d29a0407f500" + }, + { + "a": "0x35af9667c4de7", + "b": "0xec9e0129d772d31b", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xeca15c233def2102", + "a_m_sub_b_m": "0x136559ce8f097acd", + "a_m_mul_b_m": "0xbf8fc855e0dd4ba4", + "a_eq_b": false, + "a_m_pow_b": "0x2b0aa16840c1789d" + }, + { + "a": "0x1b867b4", + "b": "0x0", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x1b867b4", + "a_m_sub_b_m": "0x1b867b4", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0xc92671bd78ea", + "b": "0x41ef578b202", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xcd4567362aec", + "a_m_sub_b_m": "0xc5077c44c6e8", + "a_m_mul_b_m": "0xee12b37f3e00b8ac", + "a_eq_b": false, + "a_m_pow_b": "0xc2ad5e702602445e" + }, + { + "a": "0x13d9b7adb627a3d", + "b": "0x12a2347fc46e1738", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x13dfcffa9fd09175", + "a_m_sub_b_m": "0xee9b66fa16f46306", + "a_m_mul_b_m": "0x51c149cbe7608f20", + "a_eq_b": false, + "a_m_pow_b": "0x2af6e4b0610d4142" + }, + { + "a": "0x0", + "b": "0x2582f5aa72461d4b", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x2582f5aa72461d4b", + "a_m_sub_b_m": "0xda7d0a548db9e2b6", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x3fc4d84f439433", + "b": "0x4eb", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x3fc4d84f43991e", + "a_m_sub_b_m": "0x3fc4d84f438f48", + "a_m_mul_b_m": "0x399d13ced159d6d0", + "a_eq_b": false, + "a_m_pow_b": "0x54c796777ba8ab74" + }, + { + "a": "0xd8060aa93f0bf534", + "b": "0x5", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xd8060aa93f0bf539", + "a_m_sub_b_m": "0xd8060aa93f0bf52f", + "a_m_mul_b_m": "0x381e35523b3bca00", + "a_eq_b": false, + "a_m_pow_b": "0x2d9264b0d876fde3" + }, + { + "a": "0x1a973faedb5e9e", + "b": "0x2ad77ae2645d327b", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x2af2122213389119", + "a_m_sub_b_m": "0xd5431c5c4a7e2c24", + "a_m_mul_b_m": "0x98f849f4b67ebaa6", + "a_eq_b": false, + "a_m_pow_b": "0x2431ccc12ef12de5" + }, + { + "a": "0x14df", + "b": "0x0", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x14df", + "a_m_sub_b_m": "0x14df", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0xaeafa6b45", + "b": "0x428bf8e95ef6a", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x428ca79905aaf", + "a_m_sub_b_m": "0xfffbd74a5c647bdc", + "a_m_mul_b_m": "0x33961a6ccad16cc6", + "a_eq_b": false, + "a_m_pow_b": "0xffef97e6587af15d" + }, + { + "a": "0x9cb4291cf06ba", + "b": "0x3c146672ad", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x9cb7ea6357967", + "a_m_sub_b_m": "0x9cb067d68940d", + "a_m_mul_b_m": "0xc1de44ebedb5f44c", + "a_eq_b": false, + "a_m_pow_b": "0x3e8300e75f64ce25" + }, + { + "a": "0x5", + "b": "0x66357", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x6635c", + "a_m_sub_b_m": "0xfffffffefff99caf", + "a_m_mul_b_m": "0x1ff0b3", + "a_eq_b": false, + "a_m_pow_b": "0xa8b182c7b8ffa0d9" + }, + { + "a": "0x19dc", + "b": "0x1c45181ec", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x1c4519bc8", + "a_m_sub_b_m": "0xfffffffd3bae97f1", + "a_m_mul_b_m": "0x2db0abbbb2d0", + "a_eq_b": false, + "a_m_pow_b": "0x3a8fff2644bb2910" + }, + { + "a": "0xef7b83a06d", + "b": "0x132254aa07", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x1029dd84a74", + "a_m_sub_b_m": "0xdc592ef666", + "a_m_mul_b_m": "0x48600b0de6e5b315", + "a_eq_b": false, + "a_m_pow_b": "0x7dd9508803be97a8" + }, + { + "a": "0x1346e98b75", + "b": "0x0", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x1346e98b75", + "a_m_sub_b_m": "0x1346e98b75", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x1880b83a6e8", + "b": "0x30727b", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x1880bb41963", + "a_m_sub_b_m": "0x1880b53346d", + "a_m_mul_b_m": "0x4a317a2d74148178", + "a_eq_b": false, + "a_m_pow_b": "0x3ff08ac8c3c7de33" + }, + { + "a": "0x15cf36ff7ce", + "b": "0x8c2008bbe0091eab", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x8c200a18d3791679", + "a_m_sub_b_m": "0x73dff8a01366d924", + "a_m_mul_b_m": "0x56845a11b04718a5", + "a_eq_b": false, + "a_m_pow_b": "0x255fd30c21e3f004" + }, + { + "a": "0xbf614d99ed5c684b", + "b": "0xbf614d99ed5c684b", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x7ec29b34dab8d095", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xb477bb18d8f6f634", + "a_eq_b": true, + "a_m_pow_b": "0xedb2c69abe05c9fc" + }, + { + "a": "0x5eca40c5dc925a", + "b": "0x3d0e26", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x5eca40c619a080", + "a_m_sub_b_m": "0x5eca40c59f8434", + "a_m_mul_b_m": "0x6e90cc994e308ec1", + "a_eq_b": false, + "a_m_pow_b": "0x114cf246c2c0d074" + }, + { + "a": "0x76", + "b": "0x2b0", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x326", + "a_m_sub_b_m": "0xfffffffefffffdc7", + "a_m_mul_b_m": "0x13d20", + "a_eq_b": false, + "a_m_pow_b": "0x64ae3d7833040a36" + }, + { + "a": "0x1d89dcc668f", + "b": "0x2e5f39f01688e4", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x2e61128de2ef73", + "a_m_sub_b_m": "0xffd1a29dadb5ddac", + "a_m_mul_b_m": "0xfd69f78dab35271d", + "a_eq_b": false, + "a_m_pow_b": "0x472393ceaa79478a" + }, + { + "a": "0xd79ed357af5ba308", + "b": "0x3effbbbb0c9", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0xd79ed747ab1753d1", + "a_m_sub_b_m": "0xd79ecf67b39ff23f", + "a_m_mul_b_m": "0x9e3a9ab4a01858eb", + "a_eq_b": false, + "a_m_pow_b": "0x28e75e518e1a449" + }, + { + "a": "0x1287b8a1f9", + "b": "0x1287b8a1f9", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x250f7143f2", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x5deb0858da6b22da", + "a_eq_b": true, + "a_m_pow_b": "0xd2dd5a558bf0e2d7" + }, + { + "a": "0xc5ef60", + "b": "0x985203f4923e267e", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x985203f4930415de", + "a_m_sub_b_m": "0x67adfc0a6e87c8e3", + "a_m_mul_b_m": "0xbc1d1f9c7bbe4bb6", + "a_eq_b": false, + "a_m_pow_b": "0x6ea4778ca0819967" + }, + { + "a": "0x0", + "b": "0x10", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x10", + "a_m_sub_b_m": "0xfffffffefffffff1", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x766", + "b": "0x169f1397f163", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x169f1397f8c9", + "a_m_sub_b_m": "0xffffe95fec681604", + "a_m_mul_b_m": "0xa75ceaf623e272", + "a_eq_b": false, + "a_m_pow_b": "0x2fa36848ca15c83c" + }, + { + "a": "0xb91", + "b": "0x6ff28b19a726e89", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x6ff28b19a727a1a", + "a_m_sub_b_m": "0xf900d74d658d9d09", + "a_m_mul_b_m": "0xed45ae8b65907e49", + "a_eq_b": false, + "a_m_pow_b": "0xd5d93b1645dbb50" + }, + { + "a": "0x5bd0b8b86721f589", + "b": "0x2034bc92f4d5b", + "m": "0xffffffff00000001", + "a_m_add_b_m": "0x5bd2bc04305142e4", + "a_m_sub_b_m": "0x5bceb56c9df2a82e", + "a_m_mul_b_m": "0xb76431517329d64b", + "a_eq_b": false, + "a_m_pow_b": "0x169bf68765911f18" + } + ], + "even_mod_17": [ + { + "a": "0x87e", + "b": "0x38", + "m": "0x1e240", + "a_m_add_b_m": "0x8b6", + "a_m_sub_b_m": "0x846", + "a_m_mul_b_m": "0x1db90", + "a_eq_b": false, + "a_m_pow_b": "0x18a00" + }, + { + "a": "0x132f5", + "b": "0x3324", + "m": "0x1e240", + "a_m_add_b_m": "0x16619", + "a_m_sub_b_m": "0xffd1", + "a_m_mul_b_m": "0x5c34", + "a_eq_b": false, + "a_m_pow_b": "0x144f1" + }, + { + "a": "0x198", + "b": "0xb2", + "m": "0x1e240", + "a_m_add_b_m": "0x24a", + "a_m_sub_b_m": "0xe6", + "a_m_mul_b_m": "0x11bb0", + "a_eq_b": false, + "a_m_pow_b": "0x3b40" + }, + { + "a": "0x1c", + "b": "0x55", + "m": "0x1e240", + "a_m_add_b_m": "0x71", + "a_m_sub_b_m": "0x1e207", + "a_m_mul_b_m": "0x94c", + "a_eq_b": false, + "a_m_pow_b": "0x1d80" + }, + { + "a": "0x447", + "b": "0x2", + "m": "0x1e240", + "a_m_add_b_m": "0x449", + "a_m_sub_b_m": "0x445", + "a_m_mul_b_m": "0x88e", + "a_eq_b": false, + "a_m_pow_b": "0x15771" + }, + { + "a": "0x763c", + "b": "0xa4d8", + "m": "0x1e240", + "a_m_add_b_m": "0x11b14", + "a_m_sub_b_m": "0x1b3a4", + "a_m_mul_b_m": "0x8420", + "a_eq_b": false, + "a_m_pow_b": "0x11bc0" + }, + { + "a": "0x143f", + "b": "0x143f", + "m": "0x1e240", + "a_m_add_b_m": "0x287e", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x11f41", + "a_eq_b": true, + "a_m_pow_b": "0xffbf" + }, + { + "a": "0x16c0", + "b": "0xc", + "m": "0x1e240", + "a_m_add_b_m": "0x16cc", + "a_m_sub_b_m": "0x16b4", + "a_m_mul_b_m": "0x11100", + "a_eq_b": false, + "a_m_pow_b": "0x6400" + }, + { + "a": "0x7de", + "b": "0x1b", + "m": "0x1e240", + "a_m_add_b_m": "0x7f9", + "a_m_sub_b_m": "0x7c3", + "a_m_mul_b_m": "0xd46a", + "a_eq_b": false, + "a_m_pow_b": "0xd300" + }, + { + "a": "0x5", + "b": "0x7", + "m": "0x1e240", + "a_m_add_b_m": "0xc", + "a_m_sub_b_m": "0x1e23e", + "a_m_mul_b_m": "0x23", + "a_eq_b": false, + "a_m_pow_b": "0x1312d" + }, + { + "a": "0x5e0", + "b": "0x5d", + "m": "0x1e240", + "a_m_add_b_m": "0x63d", + "a_m_sub_b_m": "0x583", + "a_m_mul_b_m": "0x4020", + "a_eq_b": false, + "a_m_pow_b": "0xae40" + }, + { + "a": "0x17c14", + "b": "0x13a08", + "m": "0x1e240", + "a_m_add_b_m": "0xd3dc", + "a_m_sub_b_m": "0x420c", + "a_m_mul_b_m": "0x16ae0", + "a_eq_b": false, + "a_m_pow_b": "0xea40" + }, + { + "a": "0x7", + "b": "0x2", + "m": "0x1e240", + "a_m_add_b_m": "0x9", + "a_m_sub_b_m": "0x5", + "a_m_mul_b_m": "0xe", + "a_eq_b": false, + "a_m_pow_b": "0x31" + }, + { + "a": "0x9", + "b": "0x19b63", + "m": "0x1e240", + "a_m_add_b_m": "0x19b6c", + "a_m_sub_b_m": "0x46e6", + "a_m_mul_b_m": "0x146bb", + "a_eq_b": false, + "a_m_pow_b": "0x17019" + }, + { + "a": "0xd38c", + "b": "0x10a", + "m": "0x1e240", + "a_m_add_b_m": "0xd496", + "a_m_sub_b_m": "0xd282", + "a_m_mul_b_m": "0x14a78", + "a_eq_b": false, + "a_m_pow_b": "0xc900" + }, + { + "a": "0x3", + "b": "0x2f", + "m": "0x1e240", + "a_m_add_b_m": "0x32", + "a_m_sub_b_m": "0x1e214", + "a_m_mul_b_m": "0x8d", + "a_eq_b": false, + "a_m_pow_b": "0x1bb2b" + }, + { + "a": "0x15478", + "b": "0x16", + "m": "0x1e240", + "a_m_add_b_m": "0x1548e", + "a_m_sub_b_m": "0x15462", + "a_m_mul_b_m": "0x10090", + "a_eq_b": false, + "a_m_pow_b": "0xd6c0" + }, + { + "a": "0xb", + "b": "0x0", + "m": "0x1e240", + "a_m_add_b_m": "0xb", + "a_m_sub_b_m": "0xb", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x2", + "b": "0x6143", + "m": "0x1e240", + "a_m_add_b_m": "0x6145", + "a_m_sub_b_m": "0x180ff", + "a_m_mul_b_m": "0xc286", + "a_eq_b": false, + "a_m_pow_b": "0x14000" + }, + { + "a": "0xe", + "b": "0x58b", + "m": "0x1e240", + "a_m_add_b_m": "0x599", + "a_m_sub_b_m": "0x1dcc3", + "a_m_mul_b_m": "0x4d9a", + "a_eq_b": false, + "a_m_pow_b": "0x6980" + }, + { + "a": "0xb25c", + "b": "0xb25c", + "m": "0x1e240", + "a_m_add_b_m": "0x164b8", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x8550", + "a_eq_b": true, + "a_m_pow_b": "0x14b80" + }, + { + "a": "0x3e", + "b": "0x0", + "m": "0x1e240", + "a_m_add_b_m": "0x3e", + "a_m_sub_b_m": "0x3e", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x39", + "b": "0x1", + "m": "0x1e240", + "a_m_add_b_m": "0x3a", + "a_m_sub_b_m": "0x38", + "a_m_mul_b_m": "0x39", + "a_eq_b": false, + "a_m_pow_b": "0x39" + }, + { + "a": "0x69d", + "b": "0x179a2", + "m": "0x1e240", + "a_m_add_b_m": "0x1803f", + "a_m_sub_b_m": "0x6f3b", + "a_m_mul_b_m": "0x15f1a", + "a_eq_b": false, + "a_m_pow_b": "0x13549" + }, + { + "a": "0x5ab", + "b": "0x1b06", + "m": "0x1e240", + "a_m_add_b_m": "0x20b1", + "a_m_sub_b_m": "0x1cce5", + "a_m_mul_b_m": "0x94c2", + "a_eq_b": false, + "a_m_pow_b": "0x1cba9" + }, + { + "a": "0x6a4", + "b": "0xc", + "m": "0x1e240", + "a_m_add_b_m": "0x6b0", + "a_m_sub_b_m": "0x698", + "a_m_mul_b_m": "0x4fb0", + "a_eq_b": false, + "a_m_pow_b": "0x9a00" + }, + { + "a": "0x52e7", + "b": "0x6", + "m": "0x1e240", + "a_m_add_b_m": "0x52ed", + "a_m_sub_b_m": "0x52e1", + "a_m_mul_b_m": "0xf2a", + "a_eq_b": false, + "a_m_pow_b": "0x53d1" + }, + { + "a": "0x420", + "b": "0x9a25", + "m": "0x1e240", + "a_m_add_b_m": "0x9e45", + "a_m_sub_b_m": "0x14c3b", + "a_m_mul_b_m": "0x10260", + "a_eq_b": false, + "a_m_pow_b": "0x1c80" + }, + { + "a": "0xc3", + "b": "0xc3", + "m": "0x1e240", + "a_m_add_b_m": "0x186", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x9489", + "a_eq_b": true, + "a_m_pow_b": "0x1bf1b" + }, + { + "a": "0x1a3", + "b": "0x1", + "m": "0x1e240", + "a_m_add_b_m": "0x1a4", + "a_m_sub_b_m": "0x1a2", + "a_m_mul_b_m": "0x1a3", + "a_eq_b": false, + "a_m_pow_b": "0x1a3" + }, + { + "a": "0xcaba", + "b": "0x2420", + "m": "0x1e240", + "a_m_add_b_m": "0xeeda", + "a_m_sub_b_m": "0xa69a", + "a_m_mul_b_m": "0x13580", + "a_eq_b": false, + "a_m_pow_b": "0x22c0" + }, + { + "a": "0x6", + "b": "0x4d", + "m": "0x1e240", + "a_m_add_b_m": "0x53", + "a_m_sub_b_m": "0x1e1f9", + "a_m_mul_b_m": "0x1ce", + "a_eq_b": false, + "a_m_pow_b": "0x14b80" + }, + { + "a": "0x6f", + "b": "0x164", + "m": "0x1e240", + "a_m_add_b_m": "0x1d3", + "a_m_sub_b_m": "0x1e14b", + "a_m_mul_b_m": "0x9a5c", + "a_eq_b": false, + "a_m_pow_b": "0x13b81" + }, + { + "a": "0x5", + "b": "0xbce9", + "m": "0x1e240", + "a_m_add_b_m": "0xbcee", + "a_m_sub_b_m": "0x1255c", + "a_m_mul_b_m": "0x1ce4d", + "a_eq_b": false, + "a_m_pow_b": "0x148e5" + }, + { + "a": "0x1", + "b": "0x1a615", + "m": "0x1e240", + "a_m_add_b_m": "0x1a616", + "a_m_sub_b_m": "0x3c2c", + "a_m_mul_b_m": "0x1a615", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x1b0d8", + "b": "0x1b", + "m": "0x1e240", + "a_m_add_b_m": "0x1b0f3", + "a_m_sub_b_m": "0x1b0bd", + "a_m_mul_b_m": "0x70c8", + "a_eq_b": false, + "a_m_pow_b": "0x3600" + }, + { + "a": "0x3f", + "b": "0x3f", + "m": "0x1e240", + "a_m_add_b_m": "0x7e", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xf81", + "a_eq_b": true, + "a_m_pow_b": "0x94bf" + }, + { + "a": "0x304e", + "b": "0xc39c", + "m": "0x1e240", + "a_m_add_b_m": "0xf3ea", + "a_m_sub_b_m": "0x14ef2", + "a_m_mul_b_m": "0x1a5c8", + "a_eq_b": false, + "a_m_pow_b": "0x17640" + }, + { + "a": "0x1a7a9", + "b": "0xefb9", + "m": "0x1e240", + "a_m_add_b_m": "0xb522", + "a_m_sub_b_m": "0xb7f0", + "a_m_mul_b_m": "0x37e1", + "a_eq_b": false, + "a_m_pow_b": "0x1c069" + }, + { + "a": "0x9f9f", + "b": "0x1b0", + "m": "0x1e240", + "a_m_add_b_m": "0xa14f", + "a_m_sub_b_m": "0x9def", + "a_m_mul_b_m": "0x1dcd0", + "a_eq_b": false, + "a_m_pow_b": "0x9441" + }, + { + "a": "0x1a", + "b": "0x159de", + "m": "0x1e240", + "a_m_add_b_m": "0x159f8", + "a_m_sub_b_m": "0x887c", + "a_m_mul_b_m": "0x1380c", + "a_eq_b": false, + "a_m_pow_b": "0x9940" + }, + { + "a": "0x521", + "b": "0x1b7", + "m": "0x1e240", + "a_m_add_b_m": "0x6d8", + "a_m_sub_b_m": "0x36a", + "a_m_mul_b_m": "0x14297", + "a_eq_b": false, + "a_m_pow_b": "0xe21" + }, + { + "a": "0xb", + "b": "0x558b", + "m": "0x1e240", + "a_m_add_b_m": "0x5596", + "a_m_sub_b_m": "0x18cc0", + "a_m_mul_b_m": "0x1cab9", + "a_eq_b": false, + "a_m_pow_b": "0x9f53" + }, + { + "a": "0x1e8d0", + "b": "0x887", + "m": "0x1e240", + "a_m_add_b_m": "0xf17", + "a_m_sub_b_m": "0x1e049", + "a_m_mul_b_m": "0x154b0", + "a_eq_b": false, + "a_m_pow_b": "0xb340" + }, + { + "a": "0x1d7c8", + "b": "0x1125", + "m": "0x1e240", + "a_m_add_b_m": "0x6ad", + "a_m_sub_b_m": "0x1c6a3", + "a_m_mul_b_m": "0x15ca8", + "a_eq_b": false, + "a_m_pow_b": "0xf680" + }, + { + "a": "0x30", + "b": "0x4cc8", + "m": "0x1e240", + "a_m_add_b_m": "0x4cf8", + "a_m_sub_b_m": "0x195a8", + "a_m_mul_b_m": "0x135c0", + "a_eq_b": false, + "a_m_pow_b": "0x3840" + }, + { + "a": "0xe7", + "b": "0x4de3", + "m": "0x1e240", + "a_m_add_b_m": "0x4eca", + "a_m_sub_b_m": "0x19544", + "a_m_mul_b_m": "0x9495", + "a_eq_b": false, + "a_m_pow_b": "0x2ab7" + }, + { + "a": "0x789", + "b": "0x716", + "m": "0x1e240", + "a_m_add_b_m": "0xe9f", + "a_m_sub_b_m": "0x73", + "a_m_mul_b_m": "0xa5c6", + "a_eq_b": false, + "a_m_pow_b": "0x134f1" + }, + { + "a": "0x1f", + "b": "0x27", + "m": "0x1e240", + "a_m_add_b_m": "0x46", + "a_m_sub_b_m": "0x1e238", + "a_m_mul_b_m": "0x4b9", + "a_eq_b": false, + "a_m_pow_b": "0x1ab9f" + }, + { + "a": "0xa0d", + "b": "0x5c6f", + "m": "0x1e240", + "a_m_add_b_m": "0x667c", + "a_m_sub_b_m": "0x18fde", + "a_m_mul_b_m": "0x5263", + "a_eq_b": false, + "a_m_pow_b": "0x1b005" + }, + { + "a": "0x22", + "b": "0x8", + "m": "0x1e240", + "a_m_add_b_m": "0x2a", + "a_m_sub_b_m": "0x1a", + "a_m_mul_b_m": "0x110", + "a_eq_b": false, + "a_m_pow_b": "0x6340" + }, + { + "a": "0x1f4", + "b": "0x1f4", + "m": "0x1e240", + "a_m_add_b_m": "0x3e8", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xc10", + "a_eq_b": true, + "a_m_pow_b": "0x181c0" + }, + { + "a": "0xd624", + "b": "0x113", + "m": "0x1e240", + "a_m_add_b_m": "0xd737", + "a_m_sub_b_m": "0xd511", + "a_m_mul_b_m": "0x362c", + "a_eq_b": false, + "a_m_pow_b": "0x5140" + }, + { + "a": "0x13a6d", + "b": "0x566", + "m": "0x1e240", + "a_m_add_b_m": "0x13fd3", + "a_m_sub_b_m": "0x13507", + "a_m_mul_b_m": "0x1d2e", + "a_eq_b": false, + "a_m_pow_b": "0x54f9" + }, + { + "a": "0x12d31", + "b": "0x12d31", + "m": "0x1e240", + "a_m_add_b_m": "0x7822", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x8461", + "a_eq_b": true, + "a_m_pow_b": "0x182b1" + }, + { + "a": "0x1f30", + "b": "0x1f30", + "m": "0x1e240", + "a_m_add_b_m": "0x3e60", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xa000", + "a_eq_b": true, + "a_m_pow_b": "0x19b40" + }, + { + "a": "0xc", + "b": "0xf821", + "m": "0x1e240", + "a_m_add_b_m": "0xf82d", + "a_m_sub_b_m": "0xea2b", + "a_m_mul_b_m": "0x540c", + "a_eq_b": false, + "a_m_pow_b": "0x18900" + }, + { + "a": "0x2f", + "b": "0x3a", + "m": "0x1e240", + "a_m_add_b_m": "0x69", + "a_m_sub_b_m": "0x1e235", + "a_m_mul_b_m": "0xaa6", + "a_eq_b": false, + "a_m_pow_b": "0x61" + }, + { + "a": "0x742", + "b": "0x388", + "m": "0x1e240", + "a_m_add_b_m": "0xaca", + "a_m_sub_b_m": "0x3ba", + "a_m_mul_b_m": "0x123d0", + "a_eq_b": false, + "a_m_pow_b": "0x19780" + }, + { + "a": "0x1e0de", + "b": "0x0", + "m": "0x1e240", + "a_m_add_b_m": "0x1e0de", + "a_m_sub_b_m": "0x1e0de", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x200", + "b": "0x1a9b2", + "m": "0x1e240", + "a_m_add_b_m": "0x1abb2", + "a_m_sub_b_m": "0x3a8e", + "a_m_mul_b_m": "0x1cd40", + "a_eq_b": false, + "a_m_pow_b": "0x58c0" + }, + { + "a": "0x6", + "b": "0x6", + "m": "0x1e240", + "a_m_add_b_m": "0xc", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x24", + "a_eq_b": true, + "a_m_pow_b": "0xb640" + }, + { + "a": "0x49c", + "b": "0xbef", + "m": "0x1e240", + "a_m_add_b_m": "0x108b", + "a_m_sub_b_m": "0x1daed", + "a_m_mul_b_m": "0x6064", + "a_eq_b": false, + "a_m_pow_b": "0x1bf40" + }, + { + "a": "0x76c", + "b": "0x8", + "m": "0x1e240", + "a_m_add_b_m": "0x774", + "a_m_sub_b_m": "0x764", + "a_m_mul_b_m": "0x3b60", + "a_eq_b": false, + "a_m_pow_b": "0xeb00" + }, + { + "a": "0x92f", + "b": "0x133c", + "m": "0x1e240", + "a_m_add_b_m": "0x1c6b", + "a_m_sub_b_m": "0x1d833", + "a_m_mul_b_m": "0x172c4", + "a_eq_b": false, + "a_m_pow_b": "0x8281" + }, + { + "a": "0x16933", + "b": "0x2", + "m": "0x1e240", + "a_m_add_b_m": "0x16935", + "a_m_sub_b_m": "0x16931", + "a_m_mul_b_m": "0xf026", + "a_eq_b": false, + "a_m_pow_b": "0x12e29" + }, + { + "a": "0x3d", + "b": "0x663", + "m": "0x1e240", + "a_m_add_b_m": "0x6a0", + "a_m_sub_b_m": "0x1dc1a", + "a_m_mul_b_m": "0x18597", + "a_eq_b": false, + "a_m_pow_b": "0x126e5" + }, + { + "a": "0x3f", + "b": "0x3f", + "m": "0x1e240", + "a_m_add_b_m": "0x7e", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xf81", + "a_eq_b": true, + "a_m_pow_b": "0x94bf" + }, + { + "a": "0xb1c", + "b": "0xb1c", + "m": "0x1e240", + "a_m_add_b_m": "0x1638", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xf8d0", + "a_eq_b": true, + "a_m_pow_b": "0x1b9c0" + }, + { + "a": "0xb", + "b": "0x21", + "m": "0x1e240", + "a_m_add_b_m": "0x2c", + "a_m_sub_b_m": "0x1e22a", + "a_m_mul_b_m": "0x16b", + "a_eq_b": false, + "a_m_pow_b": "0x1d28b" + }, + { + "a": "0xf54", + "b": "0x1b0", + "m": "0x1e240", + "a_m_add_b_m": "0x1104", + "a_m_sub_b_m": "0xda4", + "a_m_mul_b_m": "0x16080", + "a_eq_b": false, + "a_m_pow_b": "0x180" + }, + { + "a": "0x273b", + "b": "0x7e", + "m": "0x1e240", + "a_m_add_b_m": "0x27b9", + "a_m_sub_b_m": "0x26bd", + "a_m_mul_b_m": "0x788a", + "a_eq_b": false, + "a_m_pow_b": "0x8b69" + }, + { + "a": "0x5d3", + "b": "0xbfe6", + "m": "0x1e240", + "a_m_add_b_m": "0xc5b9", + "a_m_sub_b_m": "0x1282d", + "a_m_mul_b_m": "0x9252", + "a_eq_b": false, + "a_m_pow_b": "0x39" + }, + { + "a": "0x1a2", + "b": "0x191d5", + "m": "0x1e240", + "a_m_add_b_m": "0x19377", + "a_m_sub_b_m": "0x520d", + "a_m_mul_b_m": "0x8eca", + "a_eq_b": false, + "a_m_pow_b": "0xa840" + }, + { + "a": "0x154f", + "b": "0x177c8", + "m": "0x1e240", + "a_m_add_b_m": "0x18d17", + "a_m_sub_b_m": "0x7fc7", + "a_m_mul_b_m": "0x14438", + "a_eq_b": false, + "a_m_pow_b": "0x1b601" + }, + { + "a": "0x1dd4", + "b": "0x2fe", + "m": "0x1e240", + "a_m_add_b_m": "0x20d2", + "a_m_sub_b_m": "0x1ad6", + "a_m_mul_b_m": "0xb698", + "a_eq_b": false, + "a_m_pow_b": "0xa300" + }, + { + "a": "0x0", + "b": "0xe2de", + "m": "0x1e240", + "a_m_add_b_m": "0xe2de", + "a_m_sub_b_m": "0xff62", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x1b", + "b": "0x67", + "m": "0x1e240", + "a_m_add_b_m": "0x82", + "a_m_sub_b_m": "0x1e1f4", + "a_m_mul_b_m": "0xadd", + "a_eq_b": false, + "a_m_pow_b": "0x11373" + }, + { + "a": "0xa", + "b": "0x2", + "m": "0x1e240", + "a_m_add_b_m": "0xc", + "a_m_sub_b_m": "0x8", + "a_m_mul_b_m": "0x14", + "a_eq_b": false, + "a_m_pow_b": "0x64" + }, + { + "a": "0x62", + "b": "0x62", + "m": "0x1e240", + "a_m_add_b_m": "0xc4", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x2584", + "a_eq_b": true, + "a_m_pow_b": "0x8d40" + }, + { + "a": "0x6a1", + "b": "0x6a1", + "m": "0x1e240", + "a_m_add_b_m": "0xd42", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x9d81", + "a_eq_b": true, + "a_m_pow_b": "0x13121" + }, + { + "a": "0x3", + "b": "0xd", + "m": "0x1e240", + "a_m_add_b_m": "0x10", + "a_m_sub_b_m": "0x1e236", + "a_m_mul_b_m": "0x27", + "a_eq_b": false, + "a_m_pow_b": "0x1b8d3" + }, + { + "a": "0x74", + "b": "0x1", + "m": "0x1e240", + "a_m_add_b_m": "0x75", + "a_m_sub_b_m": "0x73", + "a_m_mul_b_m": "0x74", + "a_eq_b": false, + "a_m_pow_b": "0x74" + }, + { + "a": "0x173bb", + "b": "0x2215", + "m": "0x1e240", + "a_m_add_b_m": "0x195d0", + "a_m_sub_b_m": "0x151a6", + "a_m_mul_b_m": "0xd917", + "a_eq_b": false, + "a_m_pow_b": "0xa0b" + }, + { + "a": "0x0", + "b": "0x0", + "m": "0x1e240", + "a_m_add_b_m": "0x0", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x0", + "a_eq_b": true, + "a_m_pow_b": "0x1" + }, + { + "a": "0x3436", + "b": "0x2b", + "m": "0x1e240", + "a_m_add_b_m": "0x3461", + "a_m_sub_b_m": "0x340b", + "a_m_mul_b_m": "0x13c12", + "a_eq_b": false, + "a_m_pow_b": "0x8140" + }, + { + "a": "0x97fa", + "b": "0x62b", + "m": "0x1e240", + "a_m_add_b_m": "0x9e25", + "a_m_sub_b_m": "0x91cf", + "a_m_mul_b_m": "0x124be", + "a_eq_b": false, + "a_m_pow_b": "0x1dc00" + }, + { + "a": "0x1", + "b": "0x2", + "m": "0x1e240", + "a_m_add_b_m": "0x3", + "a_m_sub_b_m": "0x1e23f", + "a_m_mul_b_m": "0x2", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0xdb", + "b": "0xb9", + "m": "0x1e240", + "a_m_add_b_m": "0x194", + "a_m_sub_b_m": "0x22", + "a_m_mul_b_m": "0x9e43", + "a_eq_b": false, + "a_m_pow_b": "0x176bb" + }, + { + "a": "0x4", + "b": "0x4", + "m": "0x1e240", + "a_m_add_b_m": "0x8", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x10", + "a_eq_b": true, + "a_m_pow_b": "0x100" + }, + { + "a": "0x1cec", + "b": "0x121c7", + "m": "0x1e240", + "a_m_add_b_m": "0x13eb3", + "a_m_sub_b_m": "0xdd65", + "a_m_mul_b_m": "0x1cf74", + "a_eq_b": false, + "a_m_pow_b": "0x16380" + }, + { + "a": "0x1d", + "b": "0x36", + "m": "0x1e240", + "a_m_add_b_m": "0x53", + "a_m_sub_b_m": "0x1e227", + "a_m_mul_b_m": "0x61e", + "a_eq_b": false, + "a_m_pow_b": "0x19" + }, + { + "a": "0x835", + "b": "0x5", + "m": "0x1e240", + "a_m_add_b_m": "0x83a", + "a_m_sub_b_m": "0x830", + "a_m_mul_b_m": "0x2909", + "a_eq_b": false, + "a_m_pow_b": "0x11ae5" + }, + { + "a": "0x12d9a", + "b": "0x26e", + "m": "0x1e240", + "a_m_add_b_m": "0x13008", + "a_m_sub_b_m": "0x12b2c", + "a_m_mul_b_m": "0xec", + "a_eq_b": false, + "a_m_pow_b": "0x178c0" + }, + { + "a": "0x0", + "b": "0x3", + "m": "0x1e240", + "a_m_add_b_m": "0x3", + "a_m_sub_b_m": "0x1e23d", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x2", + "b": "0x11134", + "m": "0x1e240", + "a_m_add_b_m": "0x11136", + "a_m_sub_b_m": "0xd10e", + "a_m_mul_b_m": "0x4028", + "a_eq_b": false, + "a_m_pow_b": "0x1dd40" + }, + { + "a": "0x0", + "b": "0x8260", + "m": "0x1e240", + "a_m_add_b_m": "0x8260", + "a_m_sub_b_m": "0x15fe0", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x10b", + "b": "0x3f", + "m": "0x1e240", + "a_m_add_b_m": "0x14a", + "a_m_sub_b_m": "0xcc", + "a_m_mul_b_m": "0x41b5", + "a_eq_b": false, + "a_m_pow_b": "0xbd63" + }, + { + "a": "0x176e2", + "b": "0x176e2", + "m": "0x1e240", + "a_m_add_b_m": "0x10b84", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xcec4", + "a_eq_b": true, + "a_m_pow_b": "0x1d640" + }, + { + "a": "0xe", + "b": "0x33f1", + "m": "0x1e240", + "a_m_add_b_m": "0x33ff", + "a_m_sub_b_m": "0x1ae5d", + "a_m_mul_b_m": "0xf4ee", + "a_eq_b": false, + "a_m_pow_b": "0x1c400" + }, + { + "a": "0x13d", + "b": "0x6", + "m": "0x1e240", + "a_m_add_b_m": "0x143", + "a_m_sub_b_m": "0x137", + "a_m_mul_b_m": "0x76e", + "a_eq_b": false, + "a_m_pow_b": "0x15a99" + }, + { + "a": "0x18a9f", + "b": "0xdb10", + "m": "0x1e240", + "a_m_add_b_m": "0x836f", + "a_m_sub_b_m": "0xaf8f", + "a_m_mul_b_m": "0x17cb0", + "a_eq_b": false, + "a_m_pow_b": "0x15301" + }, + { + "a": "0x17d0d", + "b": "0x17d0d", + "m": "0x1e240", + "a_m_add_b_m": "0x117da", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x10129", + "a_eq_b": true, + "a_m_pow_b": "0xab3d" + }, + { + "a": "0x303", + "b": "0xa2", + "m": "0x1e240", + "a_m_add_b_m": "0x3a5", + "a_m_sub_b_m": "0x261", + "a_m_mul_b_m": "0x5a6", + "a_eq_b": false, + "a_m_pow_b": "0x1bc9" + }, + { + "a": "0xfffe", + "b": "0xfffe", + "m": "0x1e240", + "a_m_add_b_m": "0x1dbc", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xa144", + "a_eq_b": true, + "a_m_pow_b": "0x1600" + }, + { + "a": "0x2", + "b": "0x93", + "m": "0x1e240", + "a_m_add_b_m": "0x95", + "a_m_sub_b_m": "0x1e1af", + "a_m_mul_b_m": "0x126", + "a_eq_b": false, + "a_m_pow_b": "0x18980" + }, + { + "a": "0x291", + "b": "0x6592", + "m": "0x1e240", + "a_m_add_b_m": "0x6823", + "a_m_sub_b_m": "0x17f3f", + "a_m_mul_b_m": "0xb532", + "a_eq_b": false, + "a_m_pow_b": "0xfda1" + }, + { + "a": "0xea", + "b": "0x1c78b", + "m": "0x1e240", + "a_m_add_b_m": "0x1c875", + "a_m_sub_b_m": "0x1b9f", + "a_m_mul_b_m": "0x13ce", + "a_eq_b": false, + "a_m_pow_b": "0x1c740" + }, + { + "a": "0xb8f", + "b": "0x0", + "m": "0x1e240", + "a_m_add_b_m": "0xb8f", + "a_m_sub_b_m": "0xb8f", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x43", + "b": "0x30ab", + "m": "0x1e240", + "a_m_add_b_m": "0x30ee", + "a_m_sub_b_m": "0x1b1d8", + "a_m_mul_b_m": "0x16f41", + "a_eq_b": false, + "a_m_pow_b": "0xe3b" + }, + { + "a": "0x653", + "b": "0x653", + "m": "0x1e240", + "a_m_add_b_m": "0xca6", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x6fa9", + "a_eq_b": true, + "a_m_pow_b": "0x16ecb" + }, + { + "a": "0xe", + "b": "0xddb5", + "m": "0x1e240", + "a_m_add_b_m": "0xddc3", + "a_m_sub_b_m": "0x10499", + "a_m_mul_b_m": "0xd266", + "a_eq_b": false, + "a_m_pow_b": "0xba80" + }, + { + "a": "0x1", + "b": "0x16", + "m": "0x1e240", + "a_m_add_b_m": "0x17", + "a_m_sub_b_m": "0x1e22b", + "a_m_mul_b_m": "0x16", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x173", + "b": "0xd5a", + "m": "0x1e240", + "a_m_add_b_m": "0xecd", + "a_m_sub_b_m": "0x1d659", + "a_m_mul_b_m": "0x82ee", + "a_eq_b": false, + "a_m_pow_b": "0x1fc9" + }, + { + "a": "0x7d", + "b": "0x1d19", + "m": "0x1e240", + "a_m_add_b_m": "0x1d96", + "a_m_sub_b_m": "0x1c5a4", + "a_m_mul_b_m": "0x10575", + "a_eq_b": false, + "a_m_pow_b": "0x78dd" + }, + { + "a": "0x0", + "b": "0x69", + "m": "0x1e240", + "a_m_add_b_m": "0x69", + "a_m_sub_b_m": "0x1e1d7", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x7acb", + "b": "0x12645", + "m": "0x1e240", + "a_m_add_b_m": "0x1a110", + "a_m_sub_b_m": "0x136c6", + "a_m_mul_b_m": "0x14577", + "a_eq_b": false, + "a_m_pow_b": "0xd79b" + }, + { + "a": "0x4", + "b": "0x4", + "m": "0x1e240", + "a_m_add_b_m": "0x8", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x10", + "a_eq_b": true, + "a_m_pow_b": "0x100" + }, + { + "a": "0x0", + "b": "0x0", + "m": "0x1e240", + "a_m_add_b_m": "0x0", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x0", + "a_eq_b": true, + "a_m_pow_b": "0x1" + }, + { + "a": "0x6", + "b": "0x6", + "m": "0x1e240", + "a_m_add_b_m": "0xc", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x24", + "a_eq_b": true, + "a_m_pow_b": "0xb640" + }, + { + "a": "0x13327", + "b": "0xfc", + "m": "0x1e240", + "a_m_add_b_m": "0x13423", + "a_m_sub_b_m": "0x1322b", + "a_m_mul_b_m": "0xf264", + "a_eq_b": false, + "a_m_pow_b": "0x196e1" + }, + { + "a": "0x8db", + "b": "0x8db", + "m": "0x1e240", + "a_m_add_b_m": "0x11b6", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x12f19", + "a_eq_b": true, + "a_m_pow_b": "0x19943" + }, + { + "a": "0x117c", + "b": "0x117c", + "m": "0x1e240", + "a_m_add_b_m": "0x22f8", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x8790", + "a_eq_b": true, + "a_m_pow_b": "0x171c0" + }, + { + "a": "0x5", + "b": "0x17a58", + "m": "0x1e240", + "a_m_add_b_m": "0x17a5d", + "a_m_sub_b_m": "0x67ed", + "a_m_mul_b_m": "0x1bcf8", + "a_eq_b": false, + "a_m_pow_b": "0x16aa1" + }, + { + "a": "0x11", + "b": "0x987d", + "m": "0x1e240", + "a_m_add_b_m": "0x988e", + "a_m_sub_b_m": "0x149d4", + "a_m_mul_b_m": "0xb50d", + "a_eq_b": false, + "a_m_pow_b": "0x5f51" + }, + { + "a": "0x770", + "b": "0x91", + "m": "0x1e240", + "a_m_add_b_m": "0x801", + "a_m_sub_b_m": "0x6df", + "a_m_mul_b_m": "0x71f0", + "a_eq_b": false, + "a_m_pow_b": "0x13f40" + }, + { + "a": "0x15c5", + "b": "0x102", + "m": "0x1e240", + "a_m_add_b_m": "0x16c7", + "a_m_sub_b_m": "0x14c3", + "a_m_mul_b_m": "0x137ca", + "a_eq_b": false, + "a_m_pow_b": "0x799" + }, + { + "a": "0xf7", + "b": "0xf7", + "m": "0x1e240", + "a_m_add_b_m": "0x1ee", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xee51", + "a_eq_b": true, + "a_m_pow_b": "0x180c7" + }, + { + "a": "0x7", + "b": "0x7", + "m": "0x1e240", + "a_m_add_b_m": "0xe", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x31", + "a_eq_b": true, + "a_m_pow_b": "0x14377" + }, + { + "a": "0x3", + "b": "0x181", + "m": "0x1e240", + "a_m_add_b_m": "0x184", + "a_m_sub_b_m": "0x1e0c2", + "a_m_mul_b_m": "0x483", + "a_eq_b": false, + "a_m_pow_b": "0x1bcc3" + }, + { + "a": "0xe", + "b": "0x6", + "m": "0x1e240", + "a_m_add_b_m": "0x14", + "a_m_sub_b_m": "0x8", + "a_m_mul_b_m": "0x54", + "a_eq_b": false, + "a_m_pow_b": "0x1dd40" + }, + { + "a": "0x1db", + "b": "0x303c", + "m": "0x1e240", + "a_m_add_b_m": "0x3217", + "a_m_sub_b_m": "0x1b3df", + "a_m_mul_b_m": "0xf594", + "a_eq_b": false, + "a_m_pow_b": "0x1d3d1" + }, + { + "a": "0x1d", + "b": "0x199b", + "m": "0x1e240", + "a_m_add_b_m": "0x19b8", + "a_m_sub_b_m": "0x1c8c2", + "a_m_mul_b_m": "0x1044f", + "a_eq_b": false, + "a_m_pow_b": "0xdfe5" + }, + { + "a": "0x0", + "b": "0x0", + "m": "0x1e240", + "a_m_add_b_m": "0x0", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x0", + "a_eq_b": true, + "a_m_pow_b": "0x1" + }, + { + "a": "0x0", + "b": "0x57", + "m": "0x1e240", + "a_m_add_b_m": "0x57", + "a_m_sub_b_m": "0x1e1e9", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x269e", + "b": "0x2077", + "m": "0x1e240", + "a_m_add_b_m": "0x4715", + "a_m_sub_b_m": "0x627", + "a_m_mul_b_m": "0xfb32", + "a_eq_b": false, + "a_m_pow_b": "0x85c0" + }, + { + "a": "0xd55c", + "b": "0xd55c", + "m": "0x1e240", + "a_m_add_b_m": "0x1aab8", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x75d0", + "a_eq_b": true, + "a_m_pow_b": "0x10480" + }, + { + "a": "0x39", + "b": "0xde", + "m": "0x1e240", + "a_m_add_b_m": "0x117", + "a_m_sub_b_m": "0x1e19b", + "a_m_mul_b_m": "0x316e", + "a_eq_b": false, + "a_m_pow_b": "0x18591" + }, + { + "a": "0x32e3", + "b": "0x8", + "m": "0x1e240", + "a_m_add_b_m": "0x32eb", + "a_m_sub_b_m": "0x32db", + "a_m_mul_b_m": "0x19718", + "a_eq_b": false, + "a_m_pow_b": "0x16aa1" + }, + { + "a": "0x0", + "b": "0x47", + "m": "0x1e240", + "a_m_add_b_m": "0x47", + "a_m_sub_b_m": "0x1e1f9", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x1", + "b": "0x2", + "m": "0x1e240", + "a_m_add_b_m": "0x3", + "a_m_sub_b_m": "0x1e23f", + "a_m_mul_b_m": "0x2", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0xc6dd", + "b": "0x12e", + "m": "0x1e240", + "a_m_add_b_m": "0xc80b", + "a_m_sub_b_m": "0xc5af", + "a_m_mul_b_m": "0x101b6", + "a_eq_b": false, + "a_m_pow_b": "0x1a839" + }, + { + "a": "0x5d6", + "b": "0x8c0", + "m": "0x1e240", + "a_m_add_b_m": "0xe96", + "a_m_sub_b_m": "0x1df56", + "a_m_mul_b_m": "0x33c0", + "a_eq_b": false, + "a_m_pow_b": "0xfd80" + }, + { + "a": "0x9", + "b": "0x1594", + "m": "0x1e240", + "a_m_add_b_m": "0x159d", + "a_m_sub_b_m": "0x1ccb5", + "a_m_mul_b_m": "0xc234", + "a_eq_b": false, + "a_m_pow_b": "0x1e021" + }, + { + "a": "0x67", + "b": "0xab", + "m": "0x1e240", + "a_m_add_b_m": "0x112", + "a_m_sub_b_m": "0x1e1fc", + "a_m_mul_b_m": "0x44cd", + "a_eq_b": false, + "a_m_pow_b": "0x97b7" + }, + { + "a": "0x135", + "b": "0x94c", + "m": "0x1e240", + "a_m_add_b_m": "0xa81", + "a_m_sub_b_m": "0x1da29", + "a_m_mul_b_m": "0x1cd7c", + "a_eq_b": false, + "a_m_pow_b": "0xa191" + }, + { + "a": "0xb54", + "b": "0x978", + "m": "0x1e240", + "a_m_add_b_m": "0x14cc", + "a_m_sub_b_m": "0x1dc", + "a_m_mul_b_m": "0x1c560", + "a_eq_b": false, + "a_m_pow_b": "0x70c0" + }, + { + "a": "0x0", + "b": "0x92", + "m": "0x1e240", + "a_m_add_b_m": "0x92", + "a_m_sub_b_m": "0x1e1ae", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0xc", + "b": "0x16b4", + "m": "0x1e240", + "a_m_add_b_m": "0x16c0", + "a_m_sub_b_m": "0x1cb98", + "a_m_mul_b_m": "0x11070", + "a_eq_b": false, + "a_m_pow_b": "0x7980" + }, + { + "a": "0x53", + "b": "0xa", + "m": "0x1e240", + "a_m_add_b_m": "0x5d", + "a_m_sub_b_m": "0x49", + "a_m_mul_b_m": "0x33e", + "a_eq_b": false, + "a_m_pow_b": "0xd489" + }, + { + "a": "0x56", + "b": "0x1", + "m": "0x1e240", + "a_m_add_b_m": "0x57", + "a_m_sub_b_m": "0x55", + "a_m_mul_b_m": "0x56", + "a_eq_b": false, + "a_m_pow_b": "0x56" + }, + { + "a": "0x2", + "b": "0x2e", + "m": "0x1e240", + "a_m_add_b_m": "0x30", + "a_m_sub_b_m": "0x1e214", + "a_m_mul_b_m": "0x5c", + "a_eq_b": false, + "a_m_pow_b": "0x17740" + }, + { + "a": "0x419c", + "b": "0x1603", + "m": "0x1e240", + "a_m_add_b_m": "0x579f", + "a_m_sub_b_m": "0x2b99", + "a_m_mul_b_m": "0x13154", + "a_eq_b": false, + "a_m_pow_b": "0x16940" + }, + { + "a": "0x11ea3", + "b": "0x67", + "m": "0x1e240", + "a_m_add_b_m": "0x11f0a", + "a_m_sub_b_m": "0x11e3c", + "a_m_mul_b_m": "0x6a55", + "a_eq_b": false, + "a_m_pow_b": "0xefab" + }, + { + "a": "0x0", + "b": "0x1", + "m": "0x1e240", + "a_m_add_b_m": "0x1", + "a_m_sub_b_m": "0x1e23f", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x12", + "b": "0x31", + "m": "0x1e240", + "a_m_add_b_m": "0x43", + "a_m_sub_b_m": "0x1e221", + "a_m_mul_b_m": "0x372", + "a_eq_b": false, + "a_m_pow_b": "0x1ca40" + }, + { + "a": "0x1a7a2", + "b": "0x4eb", + "m": "0x1e240", + "a_m_add_b_m": "0x1ac8d", + "a_m_sub_b_m": "0x1a2b7", + "a_m_mul_b_m": "0x1d376", + "a_eq_b": false, + "a_m_pow_b": "0x19500" + }, + { + "a": "0x73", + "b": "0xb9", + "m": "0x1e240", + "a_m_add_b_m": "0x12c", + "a_m_sub_b_m": "0x1e1fa", + "a_m_mul_b_m": "0x531b", + "a_eq_b": false, + "a_m_pow_b": "0x19f93" + }, + { + "a": "0x327e", + "b": "0x16445", + "m": "0x1e240", + "a_m_add_b_m": "0x196c3", + "a_m_sub_b_m": "0xb079", + "a_m_mul_b_m": "0x86b6", + "a_eq_b": false, + "a_m_pow_b": "0x16100" + }, + { + "a": "0x1", + "b": "0x10b4e", + "m": "0x1e240", + "a_m_add_b_m": "0x10b4f", + "a_m_sub_b_m": "0xd6f3", + "a_m_mul_b_m": "0x10b4e", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x0", + "b": "0x1f", + "m": "0x1e240", + "a_m_add_b_m": "0x1f", + "a_m_sub_b_m": "0x1e221", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x3", + "b": "0x4", + "m": "0x1e240", + "a_m_add_b_m": "0x7", + "a_m_sub_b_m": "0x1e23f", + "a_m_mul_b_m": "0xc", + "a_eq_b": false, + "a_m_pow_b": "0x51" + }, + { + "a": "0x78", + "b": "0x82a", + "m": "0x1e240", + "a_m_add_b_m": "0x8a2", + "a_m_sub_b_m": "0x1da8e", + "a_m_mul_b_m": "0xf30", + "a_eq_b": false, + "a_m_pow_b": "0xf000" + }, + { + "a": "0xea8c", + "b": "0x1cd2a", + "m": "0x1e240", + "a_m_add_b_m": "0xd576", + "a_m_sub_b_m": "0xffa2", + "a_m_mul_b_m": "0x13078", + "a_eq_b": false, + "a_m_pow_b": "0x15e80" + }, + { + "a": "0x1f", + "b": "0x3", + "m": "0x1e240", + "a_m_add_b_m": "0x22", + "a_m_sub_b_m": "0x1c", + "a_m_mul_b_m": "0x5d", + "a_eq_b": false, + "a_m_pow_b": "0x745f" + }, + { + "a": "0x1", + "b": "0x728", + "m": "0x1e240", + "a_m_add_b_m": "0x729", + "a_m_sub_b_m": "0x1db19", + "a_m_mul_b_m": "0x728", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x5f", + "b": "0xcc", + "m": "0x1e240", + "a_m_add_b_m": "0x12b", + "a_m_sub_b_m": "0x1e1d3", + "a_m_mul_b_m": "0x4bb4", + "a_eq_b": false, + "a_m_pow_b": "0x1ab81" + }, + { + "a": "0x0", + "b": "0x1ac41", + "m": "0x1e240", + "a_m_add_b_m": "0x1ac41", + "a_m_sub_b_m": "0x35ff", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x5769", + "b": "0x44", + "m": "0x1e240", + "a_m_add_b_m": "0x57ad", + "a_m_sub_b_m": "0x5725", + "a_m_mul_b_m": "0x9ce4", + "a_eq_b": false, + "a_m_pow_b": "0x51e1" + }, + { + "a": "0xd", + "b": "0x6", + "m": "0x1e240", + "a_m_add_b_m": "0x13", + "a_m_sub_b_m": "0x7", + "a_m_mul_b_m": "0x4e", + "a_eq_b": false, + "a_m_pow_b": "0x2ef9" + }, + { + "a": "0x24b", + "b": "0x9", + "m": "0x1e240", + "a_m_add_b_m": "0x254", + "a_m_sub_b_m": "0x242", + "a_m_mul_b_m": "0x14a3", + "a_eq_b": false, + "a_m_pow_b": "0x1326b" + }, + { + "a": "0x1a", + "b": "0x36", + "m": "0x1e240", + "a_m_add_b_m": "0x50", + "a_m_sub_b_m": "0x1e224", + "a_m_mul_b_m": "0x57c", + "a_eq_b": false, + "a_m_pow_b": "0x94c0" + }, + { + "a": "0x17d", + "b": "0x136d6", + "m": "0x1e240", + "a_m_add_b_m": "0x13853", + "a_m_sub_b_m": "0xace7", + "a_m_mul_b_m": "0x1153e", + "a_eq_b": false, + "a_m_pow_b": "0x17a99" + }, + { + "a": "0x60b", + "b": "0xcd", + "m": "0x1e240", + "a_m_add_b_m": "0x6d8", + "a_m_sub_b_m": "0x53e", + "a_m_mul_b_m": "0x1124f", + "a_eq_b": false, + "a_m_pow_b": "0x1dbbb" + }, + { + "a": "0xd3", + "b": "0xd662", + "m": "0x1e240", + "a_m_add_b_m": "0xd735", + "a_m_sub_b_m": "0x10cb1", + "a_m_mul_b_m": "0x18186", + "a_eq_b": false, + "a_m_pow_b": "0x158e9" + }, + { + "a": "0x13bb4", + "b": "0x103e9", + "m": "0x1e240", + "a_m_add_b_m": "0x5d5d", + "a_m_sub_b_m": "0x37cb", + "a_m_mul_b_m": "0x5d54", + "a_eq_b": false, + "a_m_pow_b": "0x1aa00" + }, + { + "a": "0x0", + "b": "0x0", + "m": "0x1e240", + "a_m_add_b_m": "0x0", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x0", + "a_eq_b": true, + "a_m_pow_b": "0x1" + }, + { + "a": "0x28ad", + "b": "0xe", + "m": "0x1e240", + "a_m_add_b_m": "0x28bb", + "a_m_sub_b_m": "0x289f", + "a_m_mul_b_m": "0x5736", + "a_eq_b": false, + "a_m_pow_b": "0x5d9" + }, + { + "a": "0x9a35", + "b": "0xe", + "m": "0x1e240", + "a_m_add_b_m": "0x9a43", + "a_m_sub_b_m": "0x9a27", + "a_m_mul_b_m": "0xe5e6", + "a_eq_b": false, + "a_m_pow_b": "0x1a649" + }, + { + "a": "0x39", + "b": "0x25", + "m": "0x1e240", + "a_m_add_b_m": "0x5e", + "a_m_sub_b_m": "0x14", + "a_m_mul_b_m": "0x83d", + "a_eq_b": false, + "a_m_pow_b": "0x10659" + }, + { + "a": "0x32f", + "b": "0x3", + "m": "0x1e240", + "a_m_add_b_m": "0x332", + "a_m_sub_b_m": "0x32c", + "a_m_mul_b_m": "0x98d", + "a_eq_b": false, + "a_m_pow_b": "0x1b68f" + }, + { + "a": "0x8514", + "b": "0x5", + "m": "0x1e240", + "a_m_add_b_m": "0x8519", + "a_m_sub_b_m": "0x850f", + "a_m_mul_b_m": "0xb724", + "a_eq_b": false, + "a_m_pow_b": "0xc540" + }, + { + "a": "0x85", + "b": "0x95", + "m": "0x1e240", + "a_m_add_b_m": "0x11a", + "a_m_sub_b_m": "0x1e230", + "a_m_mul_b_m": "0x4d69", + "a_eq_b": false, + "a_m_pow_b": "0x1ac35" + }, + { + "a": "0x161a9", + "b": "0x4", + "m": "0x1e240", + "a_m_add_b_m": "0x161ad", + "a_m_sub_b_m": "0x161a5", + "a_m_mul_b_m": "0x1c224", + "a_eq_b": false, + "a_m_pow_b": "0x163a1" + }, + { + "a": "0xff4", + "b": "0x14", + "m": "0x1e240", + "a_m_add_b_m": "0x1008", + "a_m_sub_b_m": "0xfe0", + "a_m_mul_b_m": "0x13f10", + "a_eq_b": false, + "a_m_pow_b": "0x1d680" + }, + { + "a": "0x29", + "b": "0x7", + "m": "0x1e240", + "a_m_add_b_m": "0x30", + "a_m_sub_b_m": "0x22", + "a_m_mul_b_m": "0x11f", + "a_eq_b": false, + "a_m_pow_b": "0x15899" + }, + { + "a": "0xf2", + "b": "0x31c0", + "m": "0x1e240", + "a_m_add_b_m": "0x32b2", + "a_m_sub_b_m": "0x1b172", + "a_m_mul_b_m": "0x1d180", + "a_eq_b": false, + "a_m_pow_b": "0x7000" + }, + { + "a": "0x1a498", + "b": "0x1", + "m": "0x1e240", + "a_m_add_b_m": "0x1a499", + "a_m_sub_b_m": "0x1a497", + "a_m_mul_b_m": "0x1a498", + "a_eq_b": false, + "a_m_pow_b": "0x1a498" + }, + { + "a": "0xa", + "b": "0xa", + "m": "0x1e240", + "a_m_add_b_m": "0x14", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x64", + "a_eq_b": true, + "a_m_pow_b": "0xfa00" + }, + { + "a": "0x11", + "b": "0x3c0", + "m": "0x1e240", + "a_m_add_b_m": "0x3d1", + "a_m_sub_b_m": "0x1de91", + "a_m_mul_b_m": "0x3fc0", + "a_eq_b": false, + "a_m_pow_b": "0x14d01" + }, + { + "a": "0x0", + "b": "0x0", + "m": "0x1e240", + "a_m_add_b_m": "0x0", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x0", + "a_eq_b": true, + "a_m_pow_b": "0x1" + }, + { + "a": "0x2190", + "b": "0x68d8", + "m": "0x1e240", + "a_m_add_b_m": "0x8a68", + "a_m_sub_b_m": "0x19af8", + "a_m_mul_b_m": "0x1c8c0", + "a_eq_b": false, + "a_m_pow_b": "0x9780" + }, + { + "a": "0x7ddc", + "b": "0x7ddc", + "m": "0x1e240", + "a_m_add_b_m": "0xfbb8", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x1af10", + "a_eq_b": true, + "a_m_pow_b": "0x16a40" + }, + { + "a": "0x4", + "b": "0x2c11", + "m": "0x1e240", + "a_m_add_b_m": "0x2c15", + "a_m_sub_b_m": "0x1b633", + "a_m_mul_b_m": "0xb044", + "a_eq_b": false, + "a_m_pow_b": "0x136c0" + }, + { + "a": "0x8adf", + "b": "0x0", + "m": "0x1e240", + "a_m_add_b_m": "0x8adf", + "a_m_sub_b_m": "0x8adf", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x1a5", + "b": "0x6a", + "m": "0x1e240", + "a_m_add_b_m": "0x20f", + "a_m_sub_b_m": "0x13b", + "a_m_mul_b_m": "0xae52", + "a_eq_b": false, + "a_m_pow_b": "0x17d79" + }, + { + "a": "0x56b", + "b": "0x56b", + "m": "0x1e240", + "a_m_add_b_m": "0xad6", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x118f9", + "a_eq_b": true, + "a_m_pow_b": "0x3d33" + }, + { + "a": "0x172", + "b": "0x13ef", + "m": "0x1e240", + "a_m_add_b_m": "0x1561", + "a_m_sub_b_m": "0x1cfc3", + "a_m_mul_b_m": "0x8dae", + "a_eq_b": false, + "a_m_pow_b": "0x1a200" + }, + { + "a": "0x3a7e", + "b": "0x3a7e", + "m": "0x1e240", + "a_m_add_b_m": "0x74fc", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x6004", + "a_eq_b": true, + "a_m_pow_b": "0x18dc0" + }, + { + "a": "0x0", + "b": "0x15", + "m": "0x1e240", + "a_m_add_b_m": "0x15", + "a_m_sub_b_m": "0x1e22b", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + } + ], + "montgomery_17": [ + { + "a": "0x2293", + "b": "0x0", + "m": "0x1e241", + "a_m_add_b_m": "0x2293", + "a_m_sub_b_m": "0x2293", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x0", + "b": "0x2cb3", + "m": "0x1e241", + "a_m_add_b_m": "0x2cb3", + "a_m_sub_b_m": "0x1b58e", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x137f9", + "b": "0x1203d", + "m": "0x1e241", + "a_m_add_b_m": "0x75f5", + "a_m_sub_b_m": "0x17bc", + "a_m_mul_b_m": "0xf25f", + "a_eq_b": false, + "a_m_pow_b": "0x7ba5" + }, + { + "a": "0x7", + "b": "0x7b47", + "m": "0x1e241", + "a_m_add_b_m": "0x7b4e", + "a_m_sub_b_m": "0x16701", + "a_m_mul_b_m": "0x17cb0", + "a_eq_b": false, + "a_m_pow_b": "0xcffc" + }, + { + "a": "0x8", + "b": "0x19a82", + "m": "0x1e241", + "a_m_add_b_m": "0x19a8a", + "a_m_sub_b_m": "0x47c7", + "a_m_mul_b_m": "0x1868a", + "a_eq_b": false, + "a_m_pow_b": "0x1815c" + }, + { + "a": "0xb4ed", + "b": "0xb4ed", + "m": "0x1e241", + "a_m_add_b_m": "0x169da", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x12789", + "a_eq_b": true, + "a_m_pow_b": "0x12dda" + }, + { + "a": "0x0", + "b": "0x4", + "m": "0x1e241", + "a_m_add_b_m": "0x4", + "a_m_sub_b_m": "0x1e23d", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x19", + "b": "0x3b", + "m": "0x1e241", + "a_m_add_b_m": "0x54", + "a_m_sub_b_m": "0x1e21f", + "a_m_mul_b_m": "0x5c3", + "a_eq_b": false, + "a_m_pow_b": "0xd271" + }, + { + "a": "0x8e7", + "b": "0x133c", + "m": "0x1e241", + "a_m_add_b_m": "0x1c23", + "a_m_sub_b_m": "0x1d7ec", + "a_m_mul_b_m": "0x1b04a", + "a_eq_b": false, + "a_m_pow_b": "0x1a2ca" + }, + { + "a": "0x175", + "b": "0x5c1", + "m": "0x1e241", + "a_m_add_b_m": "0x736", + "a_m_sub_b_m": "0x1ddf5", + "a_m_mul_b_m": "0xd931", + "a_eq_b": false, + "a_m_pow_b": "0x13667" + }, + { + "a": "0x21cd", + "b": "0x9", + "m": "0x1e241", + "a_m_add_b_m": "0x21d6", + "a_m_sub_b_m": "0x21c4", + "a_m_mul_b_m": "0x13035", + "a_eq_b": false, + "a_m_pow_b": "0x1609c" + }, + { + "a": "0x8534", + "b": "0x7f", + "m": "0x1e241", + "a_m_add_b_m": "0x85b3", + "a_m_sub_b_m": "0x84b5", + "a_m_mul_b_m": "0x25e9", + "a_eq_b": false, + "a_m_pow_b": "0x81e2" + }, + { + "a": "0x11f84", + "b": "0x925f", + "m": "0x1e241", + "a_m_add_b_m": "0x1b1e3", + "a_m_sub_b_m": "0x8d25", + "a_m_mul_b_m": "0x1abf9", + "a_eq_b": false, + "a_m_pow_b": "0xa165" + }, + { + "a": "0xb", + "b": "0x27c", + "m": "0x1e241", + "a_m_add_b_m": "0x287", + "a_m_sub_b_m": "0x1dfd0", + "a_m_mul_b_m": "0x1b54", + "a_eq_b": false, + "a_m_pow_b": "0xde43" + }, + { + "a": "0x1615", + "b": "0x104d7", + "m": "0x1e241", + "a_m_add_b_m": "0x11aec", + "a_m_sub_b_m": "0xf37f", + "a_m_mul_b_m": "0x11572", + "a_eq_b": false, + "a_m_pow_b": "0xef20" + }, + { + "a": "0x4ad", + "b": "0x236f", + "m": "0x1e241", + "a_m_add_b_m": "0x281c", + "a_m_sub_b_m": "0x1c37f", + "a_m_mul_b_m": "0x1c9ec", + "a_eq_b": false, + "a_m_pow_b": "0x10620" + }, + { + "a": "0x1dff4", + "b": "0x1dff4", + "m": "0x1e241", + "a_m_add_b_m": "0x1dda7", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x186a7", + "a_eq_b": true, + "a_m_pow_b": "0x1da1a" + }, + { + "a": "0x7", + "b": "0x4", + "m": "0x1e241", + "a_m_add_b_m": "0xb", + "a_m_sub_b_m": "0x3", + "a_m_mul_b_m": "0x1c", + "a_eq_b": false, + "a_m_pow_b": "0x961" + }, + { + "a": "0x3", + "b": "0xcd7a", + "m": "0x1e241", + "a_m_add_b_m": "0xcd7d", + "a_m_sub_b_m": "0x114ca", + "a_m_mul_b_m": "0x862d", + "a_eq_b": false, + "a_m_pow_b": "0x15683" + }, + { + "a": "0x101", + "b": "0x98", + "m": "0x1e241", + "a_m_add_b_m": "0x199", + "a_m_sub_b_m": "0x69", + "a_m_mul_b_m": "0x9898", + "a_eq_b": false, + "a_m_pow_b": "0x1413e" + }, + { + "a": "0xf2", + "b": "0x142c4", + "m": "0x1e241", + "a_m_add_b_m": "0x143b6", + "a_m_sub_b_m": "0xa06f", + "a_m_mul_b_m": "0x1d267", + "a_eq_b": false, + "a_m_pow_b": "0xedfc" + }, + { + "a": "0x38", + "b": "0xb256", + "m": "0x1e241", + "a_m_add_b_m": "0xb28e", + "a_m_sub_b_m": "0x13023", + "a_m_mul_b_m": "0x155bc", + "a_eq_b": false, + "a_m_pow_b": "0x185" + }, + { + "a": "0x3", + "b": "0x1f1", + "m": "0x1e241", + "a_m_add_b_m": "0x1f4", + "a_m_sub_b_m": "0x1e053", + "a_m_mul_b_m": "0x5d3", + "a_eq_b": false, + "a_m_pow_b": "0x1970" + }, + { + "a": "0x705", + "b": "0x1977b", + "m": "0x1e241", + "a_m_add_b_m": "0x19e80", + "a_m_sub_b_m": "0x51cb", + "a_m_mul_b_m": "0xb4f9", + "a_eq_b": false, + "a_m_pow_b": "0x9596" + }, + { + "a": "0x914d", + "b": "0x1cc", + "m": "0x1e241", + "a_m_add_b_m": "0x9319", + "a_m_sub_b_m": "0x8f81", + "a_m_mul_b_m": "0x11f52", + "a_eq_b": false, + "a_m_pow_b": "0xc8ca" + }, + { + "a": "0x23a", + "b": "0x22a5", + "m": "0x1e241", + "a_m_add_b_m": "0x24df", + "a_m_sub_b_m": "0x1c1d6", + "a_m_mul_b_m": "0x1c93a", + "a_eq_b": false, + "a_m_pow_b": "0x1c012" + }, + { + "a": "0x31a", + "b": "0x54b9", + "m": "0x1e241", + "a_m_add_b_m": "0x57d3", + "a_m_sub_b_m": "0x190a2", + "a_m_mul_b_m": "0xec7f", + "a_eq_b": false, + "a_m_pow_b": "0x978d" + }, + { + "a": "0x476", + "b": "0x0", + "m": "0x1e241", + "a_m_add_b_m": "0x476", + "a_m_sub_b_m": "0x476", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0xed6", + "b": "0xed6", + "m": "0x1e241", + "a_m_add_b_m": "0x1dac", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x19570", + "a_eq_b": true, + "a_m_pow_b": "0x1b405" + }, + { + "a": "0xd79", + "b": "0x50f1", + "m": "0x1e241", + "a_m_add_b_m": "0x5e6a", + "a_m_sub_b_m": "0x19ec9", + "a_m_mul_b_m": "0x1a827", + "a_eq_b": false, + "a_m_pow_b": "0x318e" + }, + { + "a": "0xcf07", + "b": "0x76", + "m": "0x1e241", + "a_m_add_b_m": "0xcf7d", + "a_m_sub_b_m": "0xce91", + "a_m_mul_b_m": "0x13c88", + "a_eq_b": false, + "a_m_pow_b": "0xfe33" + }, + { + "a": "0x2979", + "b": "0x4e", + "m": "0x1e241", + "a_m_add_b_m": "0x29c7", + "a_m_sub_b_m": "0x292b", + "a_m_mul_b_m": "0x15558", + "a_eq_b": false, + "a_m_pow_b": "0x159b8" + }, + { + "a": "0x2288", + "b": "0x1a9", + "m": "0x1e241", + "a_m_add_b_m": "0x2431", + "a_m_sub_b_m": "0x20df", + "a_m_mul_b_m": "0xd02a", + "a_eq_b": false, + "a_m_pow_b": "0x2c4f" + }, + { + "a": "0x8", + "b": "0x0", + "m": "0x1e241", + "a_m_add_b_m": "0x8", + "a_m_sub_b_m": "0x8", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0xe3", + "b": "0x108", + "m": "0x1e241", + "a_m_add_b_m": "0x1eb", + "a_m_sub_b_m": "0x1e21c", + "a_m_mul_b_m": "0xea18", + "a_eq_b": false, + "a_m_pow_b": "0x4f07" + }, + { + "a": "0xe7d", + "b": "0xe", + "m": "0x1e241", + "a_m_add_b_m": "0xe8b", + "a_m_sub_b_m": "0xe6f", + "a_m_mul_b_m": "0xcad6", + "a_eq_b": false, + "a_m_pow_b": "0xdcfb" + }, + { + "a": "0xa", + "b": "0x1b351", + "m": "0x1e241", + "a_m_add_b_m": "0x1b35b", + "a_m_sub_b_m": "0x2efa", + "a_m_mul_b_m": "0xce1", + "a_eq_b": false, + "a_m_pow_b": "0x1b0c7" + }, + { + "a": "0x36", + "b": "0x25", + "m": "0x1e241", + "a_m_add_b_m": "0x5b", + "a_m_sub_b_m": "0x11", + "a_m_mul_b_m": "0x7ce", + "a_eq_b": false, + "a_m_pow_b": "0x14034" + }, + { + "a": "0x6", + "b": "0x6", + "m": "0x1e241", + "a_m_add_b_m": "0xc", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x24", + "a_eq_b": true, + "a_m_pow_b": "0xb640" + }, + { + "a": "0xe", + "b": "0xc6b", + "m": "0x1e241", + "a_m_add_b_m": "0xc79", + "a_m_sub_b_m": "0x1d5e4", + "a_m_mul_b_m": "0xadda", + "a_eq_b": false, + "a_m_pow_b": "0x1976e" + }, + { + "a": "0x2", + "b": "0x1", + "m": "0x1e241", + "a_m_add_b_m": "0x3", + "a_m_sub_b_m": "0x1", + "a_m_mul_b_m": "0x2", + "a_eq_b": false, + "a_m_pow_b": "0x2" + }, + { + "a": "0x1813f", + "b": "0x1813f", + "m": "0x1e241", + "a_m_add_b_m": "0x1203d", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xe9c1", + "a_eq_b": true, + "a_m_pow_b": "0x12224" + }, + { + "a": "0x0", + "b": "0xe", + "m": "0x1e241", + "a_m_add_b_m": "0xe", + "a_m_sub_b_m": "0x1e233", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x57c0", + "b": "0x4386", + "m": "0x1e241", + "a_m_add_b_m": "0x9b46", + "a_m_sub_b_m": "0x143a", + "a_m_mul_b_m": "0x9df7", + "a_eq_b": false, + "a_m_pow_b": "0x1cc3b" + }, + { + "a": "0x4", + "b": "0x4", + "m": "0x1e241", + "a_m_add_b_m": "0x8", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x10", + "a_eq_b": true, + "a_m_pow_b": "0x100" + }, + { + "a": "0x540c", + "b": "0x0", + "m": "0x1e241", + "a_m_add_b_m": "0x540c", + "a_m_sub_b_m": "0x540c", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x0", + "b": "0x8", + "m": "0x1e241", + "a_m_add_b_m": "0x8", + "a_m_sub_b_m": "0x1e239", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x3d", + "b": "0x3d", + "m": "0x1e241", + "a_m_add_b_m": "0x7a", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xe89", + "a_eq_b": true, + "a_m_pow_b": "0xeb79" + }, + { + "a": "0x0", + "b": "0x9", + "m": "0x1e241", + "a_m_add_b_m": "0x9", + "a_m_sub_b_m": "0x1e238", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x86", + "b": "0x10a06", + "m": "0x1e241", + "a_m_add_b_m": "0x10a8c", + "a_m_sub_b_m": "0xd8c1", + "a_m_mul_b_m": "0x1ba9b", + "a_eq_b": false, + "a_m_pow_b": "0x14491" + }, + { + "a": "0x6e", + "b": "0x3", + "m": "0x1e241", + "a_m_add_b_m": "0x71", + "a_m_sub_b_m": "0x6b", + "a_m_mul_b_m": "0x14a", + "a_eq_b": false, + "a_m_pow_b": "0x178ae" + }, + { + "a": "0x7d2", + "b": "0xa29", + "m": "0x1e241", + "a_m_add_b_m": "0x11fb", + "a_m_sub_b_m": "0x1dfea", + "a_m_mul_b_m": "0x55f8", + "a_eq_b": false, + "a_m_pow_b": "0xbae2" + }, + { + "a": "0x12bdb", + "b": "0x5f5", + "m": "0x1e241", + "a_m_add_b_m": "0x131d0", + "a_m_sub_b_m": "0x125e6", + "a_m_mul_b_m": "0x66e3", + "a_eq_b": false, + "a_m_pow_b": "0x1d52f" + }, + { + "a": "0x422", + "b": "0x18", + "m": "0x1e241", + "a_m_add_b_m": "0x43a", + "a_m_sub_b_m": "0x40a", + "a_m_mul_b_m": "0x6330", + "a_eq_b": false, + "a_m_pow_b": "0x2884" + }, + { + "a": "0x17d5a", + "b": "0x8214", + "m": "0x1e241", + "a_m_add_b_m": "0x1d2d", + "a_m_sub_b_m": "0xfb46", + "a_m_mul_b_m": "0x1292c", + "a_eq_b": false, + "a_m_pow_b": "0x8f68" + }, + { + "a": "0xbd", + "b": "0xa", + "m": "0x1e241", + "a_m_add_b_m": "0xc7", + "a_m_sub_b_m": "0xb3", + "a_m_mul_b_m": "0x762", + "a_eq_b": false, + "a_m_pow_b": "0xadbc" + }, + { + "a": "0x2ac", + "b": "0x74d7", + "m": "0x1e241", + "a_m_add_b_m": "0x7783", + "a_m_sub_b_m": "0x17016", + "a_m_mul_b_m": "0x15a8f", + "a_eq_b": false, + "a_m_pow_b": "0x1a5ba" + }, + { + "a": "0x4", + "b": "0x3a58", + "m": "0x1e241", + "a_m_add_b_m": "0x3a5c", + "a_m_sub_b_m": "0x1a7ed", + "a_m_mul_b_m": "0xe960", + "a_eq_b": false, + "a_m_pow_b": "0x6136" + }, + { + "a": "0x88", + "b": "0x15008", + "m": "0x1e241", + "a_m_add_b_m": "0x15090", + "a_m_sub_b_m": "0x92c1", + "a_m_mul_b_m": "0x17062", + "a_eq_b": false, + "a_m_pow_b": "0x19a45" + }, + { + "a": "0x11", + "b": "0x2ec", + "m": "0x1e241", + "a_m_add_b_m": "0x2fd", + "a_m_sub_b_m": "0x1df66", + "a_m_mul_b_m": "0x31ac", + "a_eq_b": false, + "a_m_pow_b": "0x1dd3e" + }, + { + "a": "0x31a8", + "b": "0x31a8", + "m": "0x1e241", + "a_m_add_b_m": "0x6350", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x1ba24", + "a_eq_b": true, + "a_m_pow_b": "0x9d80" + }, + { + "a": "0x0", + "b": "0x17", + "m": "0x1e241", + "a_m_add_b_m": "0x17", + "a_m_sub_b_m": "0x1e22a", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x4", + "b": "0x17ddf", + "m": "0x1e241", + "a_m_add_b_m": "0x17de3", + "a_m_sub_b_m": "0x6466", + "a_m_mul_b_m": "0x50b9", + "a_eq_b": false, + "a_m_pow_b": "0xafc3" + }, + { + "a": "0x387b", + "b": "0x0", + "m": "0x1e241", + "a_m_add_b_m": "0x387b", + "a_m_sub_b_m": "0x387b", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x49", + "b": "0xc", + "m": "0x1e241", + "a_m_add_b_m": "0x55", + "a_m_sub_b_m": "0x3d", + "a_m_mul_b_m": "0x36c", + "a_eq_b": false, + "a_m_pow_b": "0xfc99" + }, + { + "a": "0x70", + "b": "0x1d0eb", + "m": "0x1e241", + "a_m_add_b_m": "0x1d15b", + "a_m_sub_b_m": "0x11c6", + "a_m_mul_b_m": "0x1d5a5", + "a_eq_b": false, + "a_m_pow_b": "0x18596" + }, + { + "a": "0x28", + "b": "0x6", + "m": "0x1e241", + "a_m_add_b_m": "0x2e", + "a_m_sub_b_m": "0x22", + "a_m_mul_b_m": "0xf0", + "a_eq_b": false, + "a_m_pow_b": "0x10627" + }, + { + "a": "0x3ab4", + "b": "0x9368", + "m": "0x1e241", + "a_m_add_b_m": "0xce1c", + "a_m_sub_b_m": "0x1898d", + "a_m_mul_b_m": "0xe4ef", + "a_eq_b": false, + "a_m_pow_b": "0x185cb" + }, + { + "a": "0x2", + "b": "0x16f", + "m": "0x1e241", + "a_m_add_b_m": "0x171", + "a_m_sub_b_m": "0x1e0d4", + "a_m_mul_b_m": "0x2de", + "a_eq_b": false, + "a_m_pow_b": "0x1415d" + }, + { + "a": "0x4", + "b": "0x28", + "m": "0x1e241", + "a_m_add_b_m": "0x2c", + "a_m_sub_b_m": "0x1e21d", + "a_m_mul_b_m": "0xa0", + "a_eq_b": false, + "a_m_pow_b": "0x25b2" + }, + { + "a": "0xe", + "b": "0x8", + "m": "0x1e241", + "a_m_add_b_m": "0x16", + "a_m_sub_b_m": "0x6", + "a_m_mul_b_m": "0x70", + "a_eq_b": false, + "a_m_pow_b": "0x1a40f" + }, + { + "a": "0x1", + "b": "0x12d70", + "m": "0x1e241", + "a_m_add_b_m": "0x12d71", + "a_m_sub_b_m": "0xb4d2", + "a_m_mul_b_m": "0x12d70", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x6", + "b": "0x6", + "m": "0x1e241", + "a_m_add_b_m": "0xc", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x24", + "a_eq_b": true, + "a_m_pow_b": "0xb640" + }, + { + "a": "0x12e5", + "b": "0x14e18", + "m": "0x1e241", + "a_m_add_b_m": "0x160fd", + "a_m_sub_b_m": "0xa70e", + "a_m_mul_b_m": "0x1cce2", + "a_eq_b": false, + "a_m_pow_b": "0xee7e" + }, + { + "a": "0x0", + "b": "0x0", + "m": "0x1e241", + "a_m_add_b_m": "0x0", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x0", + "a_eq_b": true, + "a_m_pow_b": "0x1" + }, + { + "a": "0x1ca0f", + "b": "0x7f", + "m": "0x1e241", + "a_m_add_b_m": "0x1ca8e", + "a_m_sub_b_m": "0x1c990", + "a_m_mul_b_m": "0x12ef9", + "a_eq_b": false, + "a_m_pow_b": "0x5d58" + }, + { + "a": "0x2", + "b": "0x5d7a", + "m": "0x1e241", + "a_m_add_b_m": "0x5d7c", + "a_m_sub_b_m": "0x184c9", + "a_m_mul_b_m": "0xbaf4", + "a_eq_b": false, + "a_m_pow_b": "0x198ff" + }, + { + "a": "0x189", + "b": "0x1c2c4", + "m": "0x1e241", + "a_m_add_b_m": "0x1c44d", + "a_m_sub_b_m": "0x2106", + "a_m_mul_b_m": "0xa3b5", + "a_eq_b": false, + "a_m_pow_b": "0x141d0" + }, + { + "a": "0x1253b", + "b": "0x5a", + "m": "0x1e241", + "a_m_add_b_m": "0x12595", + "a_m_sub_b_m": "0x124e1", + "a_m_mul_b_m": "0x15d08", + "a_eq_b": false, + "a_m_pow_b": "0x12113" + }, + { + "a": "0x62", + "b": "0x1f5", + "m": "0x1e241", + "a_m_add_b_m": "0x257", + "a_m_sub_b_m": "0x1e0ae", + "a_m_mul_b_m": "0xbfca", + "a_eq_b": false, + "a_m_pow_b": "0xd4fc" + }, + { + "a": "0xbf4c", + "b": "0xbf4c", + "m": "0x1e241", + "a_m_add_b_m": "0x17e98", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x1986f", + "a_eq_b": true, + "a_m_pow_b": "0x2884" + }, + { + "a": "0xe7c3", + "b": "0x0", + "m": "0x1e241", + "a_m_add_b_m": "0xe7c3", + "a_m_sub_b_m": "0xe7c3", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0xe7", + "b": "0xe7", + "m": "0x1e241", + "a_m_add_b_m": "0x1ce", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xd071", + "a_eq_b": true, + "a_m_pow_b": "0x41ce" + }, + { + "a": "0x71", + "b": "0x4", + "m": "0x1e241", + "a_m_add_b_m": "0x75", + "a_m_sub_b_m": "0x6d", + "a_m_mul_b_m": "0x1c4", + "a_eq_b": false, + "a_m_pow_b": "0x14899" + }, + { + "a": "0xb", + "b": "0x3", + "m": "0x1e241", + "a_m_add_b_m": "0xe", + "a_m_sub_b_m": "0x8", + "a_m_mul_b_m": "0x21", + "a_eq_b": false, + "a_m_pow_b": "0x533" + }, + { + "a": "0x0", + "b": "0x1a00a", + "m": "0x1e241", + "a_m_add_b_m": "0x1a00a", + "a_m_sub_b_m": "0x4237", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x24a", + "b": "0x42", + "m": "0x1e241", + "a_m_add_b_m": "0x28c", + "a_m_sub_b_m": "0x208", + "a_m_mul_b_m": "0x9714", + "a_eq_b": false, + "a_m_pow_b": "0x1781c" + }, + { + "a": "0x16140", + "b": "0x6bb9", + "m": "0x1e241", + "a_m_add_b_m": "0x1ccf9", + "a_m_sub_b_m": "0xf587", + "a_m_mul_b_m": "0x2e58", + "a_eq_b": false, + "a_m_pow_b": "0x1e3f" + }, + { + "a": "0x7", + "b": "0x50", + "m": "0x1e241", + "a_m_add_b_m": "0x57", + "a_m_sub_b_m": "0x1e1f8", + "a_m_mul_b_m": "0x230", + "a_eq_b": false, + "a_m_pow_b": "0xb6ae" + }, + { + "a": "0xdbc4", + "b": "0x3", + "m": "0x1e241", + "a_m_add_b_m": "0xdbc7", + "a_m_sub_b_m": "0xdbc1", + "a_m_mul_b_m": "0xb10b", + "a_eq_b": false, + "a_m_pow_b": "0xb670" + }, + { + "a": "0xdb", + "b": "0xdb", + "m": "0x1e241", + "a_m_add_b_m": "0x1b6", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xbb59", + "a_eq_b": true, + "a_m_pow_b": "0x87fd" + }, + { + "a": "0x16d3b", + "b": "0x613", + "m": "0x1e241", + "a_m_add_b_m": "0x1734e", + "a_m_sub_b_m": "0x16728", + "a_m_mul_b_m": "0x14088", + "a_eq_b": false, + "a_m_pow_b": "0x1c714" + }, + { + "a": "0x38", + "b": "0x13", + "m": "0x1e241", + "a_m_add_b_m": "0x4b", + "a_m_sub_b_m": "0x25", + "a_m_mul_b_m": "0x428", + "a_eq_b": false, + "a_m_pow_b": "0x6f2b" + }, + { + "a": "0x0", + "b": "0x0", + "m": "0x1e241", + "a_m_add_b_m": "0x0", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x0", + "a_eq_b": true, + "a_m_pow_b": "0x1" + }, + { + "a": "0x6bd7", + "b": "0xd39", + "m": "0x1e241", + "a_m_add_b_m": "0x7910", + "a_m_sub_b_m": "0x5e9e", + "a_m_mul_b_m": "0x1c5eb", + "a_eq_b": false, + "a_m_pow_b": "0x9cae" + }, + { + "a": "0x6", + "b": "0x6b", + "m": "0x1e241", + "a_m_add_b_m": "0x71", + "a_m_sub_b_m": "0x1e1dc", + "a_m_mul_b_m": "0x282", + "a_eq_b": false, + "a_m_pow_b": "0x13fd3" + }, + { + "a": "0x15", + "b": "0x12c94", + "m": "0x1e241", + "a_m_add_b_m": "0x12ca9", + "a_m_sub_b_m": "0xb5c2", + "a_m_mul_b_m": "0x2ad7", + "a_eq_b": false, + "a_m_pow_b": "0x19739" + }, + { + "a": "0x3", + "b": "0x2d", + "m": "0x1e241", + "a_m_add_b_m": "0x30", + "a_m_sub_b_m": "0x1e217", + "a_m_mul_b_m": "0x87", + "a_eq_b": false, + "a_m_pow_b": "0x44c6" + }, + { + "a": "0x19", + "b": "0x1db31", + "m": "0x1e241", + "a_m_add_b_m": "0x1db4a", + "a_m_sub_b_m": "0x729", + "a_m_mul_b_m": "0x131b1", + "a_eq_b": false, + "a_m_pow_b": "0x15215" + }, + { + "a": "0x1", + "b": "0x1", + "m": "0x1e241", + "a_m_add_b_m": "0x2", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x1", + "a_eq_b": true, + "a_m_pow_b": "0x1" + }, + { + "a": "0xa1", + "b": "0x1420", + "m": "0x1e241", + "a_m_add_b_m": "0x14c1", + "a_m_sub_b_m": "0x1cec2", + "a_m_mul_b_m": "0x15a9a", + "a_eq_b": false, + "a_m_pow_b": "0x4ec0" + }, + { + "a": "0xb096", + "b": "0xbc3", + "m": "0x1e241", + "a_m_add_b_m": "0xbc59", + "a_m_sub_b_m": "0xa4d3", + "a_m_mul_b_m": "0x10074", + "a_eq_b": false, + "a_m_pow_b": "0x12f37" + }, + { + "a": "0x0", + "b": "0x396", + "m": "0x1e241", + "a_m_add_b_m": "0x396", + "a_m_sub_b_m": "0x1deab", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x0", + "b": "0x62", + "m": "0x1e241", + "a_m_add_b_m": "0x62", + "a_m_sub_b_m": "0x1e1df", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x3", + "b": "0x1b286", + "m": "0x1e241", + "a_m_add_b_m": "0x1b289", + "a_m_sub_b_m": "0x2fbe", + "a_m_mul_b_m": "0x15310", + "a_eq_b": false, + "a_m_pow_b": "0x230" + }, + { + "a": "0x1fda", + "b": "0x1fda", + "m": "0x1e241", + "a_m_add_b_m": "0x3fb4", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x1090a", + "a_eq_b": true, + "a_m_pow_b": "0xca1d" + }, + { + "a": "0xd326", + "b": "0x90", + "m": "0x1e241", + "a_m_add_b_m": "0xd3b6", + "a_m_sub_b_m": "0xd296", + "a_m_mul_b_m": "0x1761", + "a_eq_b": false, + "a_m_pow_b": "0xd72a" + }, + { + "a": "0x0", + "b": "0x1f", + "m": "0x1e241", + "a_m_add_b_m": "0x1f", + "a_m_sub_b_m": "0x1e222", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x181f9", + "b": "0x7", + "m": "0x1e241", + "a_m_add_b_m": "0x18200", + "a_m_sub_b_m": "0x181f2", + "a_m_mul_b_m": "0x1228a", + "a_eq_b": false, + "a_m_pow_b": "0x16a3" + }, + { + "a": "0x1d65b", + "b": "0xaf", + "m": "0x1e241", + "a_m_add_b_m": "0x1d70a", + "a_m_sub_b_m": "0x1d5ac", + "a_m_mul_b_m": "0x1490b", + "a_eq_b": false, + "a_m_pow_b": "0x1a3de" + }, + { + "a": "0x113", + "b": "0x4d5", + "m": "0x1e241", + "a_m_add_b_m": "0x5e8", + "a_m_sub_b_m": "0x1de7f", + "a_m_mul_b_m": "0x16c4d", + "a_eq_b": false, + "a_m_pow_b": "0x15a9a" + }, + { + "a": "0x21", + "b": "0x3b07", + "m": "0x1e241", + "a_m_add_b_m": "0x3b28", + "a_m_sub_b_m": "0x1a75b", + "a_m_mul_b_m": "0x12e3", + "a_eq_b": false, + "a_m_pow_b": "0x13686" + }, + { + "a": "0x3f28", + "b": "0x3f28", + "m": "0x1e241", + "a_m_add_b_m": "0x7e50", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xb2bb", + "a_eq_b": true, + "a_m_pow_b": "0x1dab" + }, + { + "a": "0x7842", + "b": "0x5e2", + "m": "0x1e241", + "a_m_add_b_m": "0x7e24", + "a_m_sub_b_m": "0x7260", + "a_m_mul_b_m": "0x1070d", + "a_eq_b": false, + "a_m_pow_b": "0x1893c" + }, + { + "a": "0x1", + "b": "0x1", + "m": "0x1e241", + "a_m_add_b_m": "0x2", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x1", + "a_eq_b": true, + "a_m_pow_b": "0x1" + }, + { + "a": "0xd98", + "b": "0x68e1", + "m": "0x1e241", + "a_m_add_b_m": "0x7679", + "a_m_sub_b_m": "0x186f8", + "a_m_mul_b_m": "0x18aa4", + "a_eq_b": false, + "a_m_pow_b": "0x15dea" + }, + { + "a": "0x3", + "b": "0x3", + "m": "0x1e241", + "a_m_add_b_m": "0x6", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x9", + "a_eq_b": true, + "a_m_pow_b": "0x1b" + }, + { + "a": "0x1d", + "b": "0x12033", + "m": "0x1e241", + "a_m_add_b_m": "0x12050", + "a_m_sub_b_m": "0xc22b", + "a_m_mul_b_m": "0x9f76", + "a_eq_b": false, + "a_m_pow_b": "0x14d61" + }, + { + "a": "0x1daac", + "b": "0x753", + "m": "0x1e241", + "a_m_add_b_m": "0x1e1ff", + "a_m_sub_b_m": "0x1d359", + "a_m_mul_b_m": "0xfb4f", + "a_eq_b": false, + "a_m_pow_b": "0x830c" + }, + { + "a": "0x0", + "b": "0x104", + "m": "0x1e241", + "a_m_add_b_m": "0x104", + "a_m_sub_b_m": "0x1e13d", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x149", + "b": "0xccaf", + "m": "0x1e241", + "a_m_add_b_m": "0xcdf8", + "a_m_sub_b_m": "0x116db", + "a_m_mul_b_m": "0x1339c", + "a_eq_b": false, + "a_m_pow_b": "0x1017f" + }, + { + "a": "0x0", + "b": "0x13fab", + "m": "0x1e241", + "a_m_add_b_m": "0x13fab", + "a_m_sub_b_m": "0xa296", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x49", + "b": "0x73", + "m": "0x1e241", + "a_m_add_b_m": "0xbc", + "a_m_sub_b_m": "0x1e217", + "a_m_mul_b_m": "0x20cb", + "a_eq_b": false, + "a_m_pow_b": "0x2c41" + }, + { + "a": "0x4", + "b": "0x20b", + "m": "0x1e241", + "a_m_add_b_m": "0x20f", + "a_m_sub_b_m": "0x1e03a", + "a_m_mul_b_m": "0x82c", + "a_eq_b": false, + "a_m_pow_b": "0x121d8" + }, + { + "a": "0x7f55", + "b": "0x181ed", + "m": "0x1e241", + "a_m_add_b_m": "0x1f01", + "a_m_sub_b_m": "0xdfa9", + "a_m_mul_b_m": "0x1ad8c", + "a_eq_b": false, + "a_m_pow_b": "0x1a97d" + }, + { + "a": "0x1263f", + "b": "0x62", + "m": "0x1e241", + "a_m_add_b_m": "0x126a1", + "a_m_sub_b_m": "0x125dd", + "a_m_mul_b_m": "0x17f23", + "a_eq_b": false, + "a_m_pow_b": "0x151e4" + }, + { + "a": "0x9e2", + "b": "0x6", + "m": "0x1e241", + "a_m_add_b_m": "0x9e8", + "a_m_sub_b_m": "0x9dc", + "a_m_mul_b_m": "0x3b4c", + "a_eq_b": false, + "a_m_pow_b": "0x32e" + }, + { + "a": "0xd056", + "b": "0x5a", + "m": "0x1e241", + "a_m_add_b_m": "0xd0b0", + "a_m_sub_b_m": "0xcffc", + "a_m_mul_b_m": "0x1a896", + "a_eq_b": false, + "a_m_pow_b": "0xaa63" + }, + { + "a": "0x291", + "b": "0x5b", + "m": "0x1e241", + "a_m_add_b_m": "0x2ec", + "a_m_sub_b_m": "0x236", + "a_m_mul_b_m": "0xe98b", + "a_eq_b": false, + "a_m_pow_b": "0x7ea8" + }, + { + "a": "0x198", + "b": "0x0", + "m": "0x1e241", + "a_m_add_b_m": "0x198", + "a_m_sub_b_m": "0x198", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x10d7", + "b": "0x3", + "m": "0x1e241", + "a_m_add_b_m": "0x10da", + "a_m_sub_b_m": "0x10d4", + "a_m_mul_b_m": "0x3285", + "a_eq_b": false, + "a_m_pow_b": "0x12ec7" + }, + { + "a": "0xf", + "b": "0x11f", + "m": "0x1e241", + "a_m_add_b_m": "0x12e", + "a_m_sub_b_m": "0x1e131", + "a_m_mul_b_m": "0x10d1", + "a_eq_b": false, + "a_m_pow_b": "0x16ff6" + }, + { + "a": "0x581", + "b": "0x6f33", + "m": "0x1e241", + "a_m_add_b_m": "0x74b4", + "a_m_sub_b_m": "0x1788f", + "a_m_mul_b_m": "0x1ad6f", + "a_eq_b": false, + "a_m_pow_b": "0x6709" + }, + { + "a": "0x1c", + "b": "0x3", + "m": "0x1e241", + "a_m_add_b_m": "0x1f", + "a_m_sub_b_m": "0x19", + "a_m_mul_b_m": "0x54", + "a_eq_b": false, + "a_m_pow_b": "0x55c0" + }, + { + "a": "0x45e", + "b": "0x96", + "m": "0x1e241", + "a_m_add_b_m": "0x4f4", + "a_m_sub_b_m": "0x3c8", + "a_m_mul_b_m": "0xacd3", + "a_eq_b": false, + "a_m_pow_b": "0x1b50c" + }, + { + "a": "0x0", + "b": "0xe", + "m": "0x1e241", + "a_m_add_b_m": "0xe", + "a_m_sub_b_m": "0x1e233", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x2", + "b": "0x30", + "m": "0x1e241", + "a_m_add_b_m": "0x32", + "a_m_sub_b_m": "0x1e213", + "a_m_mul_b_m": "0x60", + "a_eq_b": false, + "a_m_pow_b": "0xda35" + }, + { + "a": "0xf3f", + "b": "0x4c2", + "m": "0x1e241", + "a_m_add_b_m": "0x1401", + "a_m_sub_b_m": "0xa7d", + "a_m_mul_b_m": "0xf418", + "a_eq_b": false, + "a_m_pow_b": "0xfa1c" + }, + { + "a": "0x1c76", + "b": "0x1", + "m": "0x1e241", + "a_m_add_b_m": "0x1c77", + "a_m_sub_b_m": "0x1c75", + "a_m_mul_b_m": "0x1c76", + "a_eq_b": false, + "a_m_pow_b": "0x1c76" + }, + { + "a": "0x199", + "b": "0x1c", + "m": "0x1e241", + "a_m_add_b_m": "0x1b5", + "a_m_sub_b_m": "0x17d", + "a_m_mul_b_m": "0x2cbc", + "a_eq_b": false, + "a_m_pow_b": "0xb461" + }, + { + "a": "0x4", + "b": "0xf", + "m": "0x1e241", + "a_m_add_b_m": "0x13", + "a_m_sub_b_m": "0x1e236", + "a_m_mul_b_m": "0x3c", + "a_eq_b": false, + "a_m_pow_b": "0x8dc7" + }, + { + "a": "0x15", + "b": "0xfae6", + "m": "0x1e241", + "a_m_add_b_m": "0xfafb", + "a_m_sub_b_m": "0xe770", + "a_m_mul_b_m": "0x1be54", + "a_eq_b": false, + "a_m_pow_b": "0xfdae" + }, + { + "a": "0x12da4", + "b": "0x1f", + "m": "0x1e241", + "a_m_add_b_m": "0x12dc3", + "a_m_sub_b_m": "0x12d85", + "a_m_mul_b_m": "0xbc09", + "a_eq_b": false, + "a_m_pow_b": "0xea1c" + }, + { + "a": "0x0", + "b": "0x12519", + "m": "0x1e241", + "a_m_add_b_m": "0x12519", + "a_m_sub_b_m": "0xbd28", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x19471", + "b": "0x19471", + "m": "0x1e241", + "a_m_add_b_m": "0x146a1", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x3cf2", + "a_eq_b": true, + "a_m_pow_b": "0xfb6" + }, + { + "a": "0x9e1e", + "b": "0x0", + "m": "0x1e241", + "a_m_add_b_m": "0x9e1e", + "a_m_sub_b_m": "0x9e1e", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x2", + "b": "0x496a", + "m": "0x1e241", + "a_m_add_b_m": "0x496c", + "a_m_sub_b_m": "0x198d9", + "a_m_mul_b_m": "0x92d4", + "a_eq_b": false, + "a_m_pow_b": "0xc796" + }, + { + "a": "0x1b739", + "b": "0x5a20", + "m": "0x1e241", + "a_m_add_b_m": "0x2f18", + "a_m_sub_b_m": "0x15d19", + "a_m_mul_b_m": "0x8fcb", + "a_eq_b": false, + "a_m_pow_b": "0x1c6d7" + }, + { + "a": "0x6ec", + "b": "0x50", + "m": "0x1e241", + "a_m_add_b_m": "0x73c", + "a_m_sub_b_m": "0x69c", + "a_m_mul_b_m": "0x477f", + "a_eq_b": false, + "a_m_pow_b": "0xc5f9" + }, + { + "a": "0x669b", + "b": "0x2", + "m": "0x1e241", + "a_m_add_b_m": "0x669d", + "a_m_sub_b_m": "0x6699", + "a_m_mul_b_m": "0xcd36", + "a_eq_b": false, + "a_m_pow_b": "0x12f05" + }, + { + "a": "0x358", + "b": "0x358", + "m": "0x1e241", + "a_m_add_b_m": "0x6b0", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x1c2fb", + "a_eq_b": true, + "a_m_pow_b": "0x16354" + }, + { + "a": "0x25c6", + "b": "0x6", + "m": "0x1e241", + "a_m_add_b_m": "0x25cc", + "a_m_sub_b_m": "0x25c0", + "a_m_mul_b_m": "0xe2a4", + "a_eq_b": false, + "a_m_pow_b": "0xd906" + }, + { + "a": "0x12a64", + "b": "0x1c650", + "m": "0x1e241", + "a_m_add_b_m": "0x10e73", + "a_m_sub_b_m": "0x14655", + "a_m_mul_b_m": "0x43a6", + "a_eq_b": false, + "a_m_pow_b": "0x1dfb9" + }, + { + "a": "0x1d70b", + "b": "0x2", + "m": "0x1e241", + "a_m_add_b_m": "0x1d70d", + "a_m_sub_b_m": "0x1d709", + "a_m_mul_b_m": "0x1cbd5", + "a_eq_b": false, + "a_m_pow_b": "0x15aa2" + }, + { + "a": "0x15a49", + "b": "0x294", + "m": "0x1e241", + "a_m_add_b_m": "0x15cdd", + "a_m_sub_b_m": "0x157b5", + "a_m_mul_b_m": "0x1ba1b", + "a_eq_b": false, + "a_m_pow_b": "0x479a" + }, + { + "a": "0xa", + "b": "0xf08", + "m": "0x1e241", + "a_m_add_b_m": "0xf12", + "a_m_sub_b_m": "0x1d343", + "a_m_mul_b_m": "0x9650", + "a_eq_b": false, + "a_m_pow_b": "0xdc0b" + }, + { + "a": "0x163d8", + "b": "0x1303a", + "m": "0x1e241", + "a_m_add_b_m": "0xb1d1", + "a_m_sub_b_m": "0x339e", + "a_m_mul_b_m": "0x89b5", + "a_eq_b": false, + "a_m_pow_b": "0x128dd" + }, + { + "a": "0x13e95", + "b": "0x55c", + "m": "0x1e241", + "a_m_add_b_m": "0x143f1", + "a_m_sub_b_m": "0x13939", + "a_m_mul_b_m": "0xac82", + "a_eq_b": false, + "a_m_pow_b": "0x89b9" + }, + { + "a": "0x4", + "b": "0x4", + "m": "0x1e241", + "a_m_add_b_m": "0x8", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x10", + "a_eq_b": true, + "a_m_pow_b": "0x100" + }, + { + "a": "0x5", + "b": "0x9", + "m": "0x1e241", + "a_m_add_b_m": "0xe", + "a_m_sub_b_m": "0x1e23d", + "a_m_mul_b_m": "0x2d", + "a_eq_b": false, + "a_m_pow_b": "0x18b96" + }, + { + "a": "0x6a0", + "b": "0x2", + "m": "0x1e241", + "a_m_add_b_m": "0x6a2", + "a_m_sub_b_m": "0x69e", + "a_m_mul_b_m": "0xd40", + "a_eq_b": false, + "a_m_pow_b": "0x9029" + }, + { + "a": "0x1", + "b": "0xc", + "m": "0x1e241", + "a_m_add_b_m": "0xd", + "a_m_sub_b_m": "0x1e236", + "a_m_mul_b_m": "0xc", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x5", + "b": "0x1c693", + "m": "0x1e241", + "a_m_add_b_m": "0x1c698", + "a_m_sub_b_m": "0x1bb3", + "a_m_mul_b_m": "0x157db", + "a_eq_b": false, + "a_m_pow_b": "0x11ac4" + }, + { + "a": "0x59", + "b": "0x5f", + "m": "0x1e241", + "a_m_add_b_m": "0xb8", + "a_m_sub_b_m": "0x1e23b", + "a_m_mul_b_m": "0x2107", + "a_eq_b": false, + "a_m_pow_b": "0x15af1" + }, + { + "a": "0x4a", + "b": "0x3d7", + "m": "0x1e241", + "a_m_add_b_m": "0x421", + "a_m_sub_b_m": "0x1deb4", + "a_m_mul_b_m": "0x11c26", + "a_eq_b": false, + "a_m_pow_b": "0xa8ab" + }, + { + "a": "0x2a", + "b": "0x2e9", + "m": "0x1e241", + "a_m_add_b_m": "0x313", + "a_m_sub_b_m": "0x1df82", + "a_m_mul_b_m": "0x7a3a", + "a_eq_b": false, + "a_m_pow_b": "0x14541" + }, + { + "a": "0x3", + "b": "0xd", + "m": "0x1e241", + "a_m_add_b_m": "0x10", + "a_m_sub_b_m": "0x1e237", + "a_m_mul_b_m": "0x27", + "a_eq_b": false, + "a_m_pow_b": "0x1b8c7" + }, + { + "a": "0x162", + "b": "0x192ba", + "m": "0x1e241", + "a_m_add_b_m": "0x1941c", + "a_m_sub_b_m": "0x50e9", + "a_m_mul_b_m": "0x12c4d", + "a_eq_b": false, + "a_m_pow_b": "0x12235" + }, + { + "a": "0x1b69", + "b": "0x1b69", + "m": "0x1e241", + "a_m_add_b_m": "0x36d2", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x19003", + "a_eq_b": true, + "a_m_pow_b": "0xc0e8" + }, + { + "a": "0x5", + "b": "0x9", + "m": "0x1e241", + "a_m_add_b_m": "0xe", + "a_m_sub_b_m": "0x1e23d", + "a_m_mul_b_m": "0x2d", + "a_eq_b": false, + "a_m_pow_b": "0x18b96" + }, + { + "a": "0x19bc", + "b": "0xef65", + "m": "0x1e241", + "a_m_add_b_m": "0x10921", + "a_m_sub_b_m": "0x10c98", + "a_m_mul_b_m": "0xa0e6", + "a_eq_b": false, + "a_m_pow_b": "0x1c63f" + }, + { + "a": "0x2e", + "b": "0x558", + "m": "0x1e241", + "a_m_add_b_m": "0x586", + "a_m_sub_b_m": "0x1dd17", + "a_m_mul_b_m": "0xf5d0", + "a_eq_b": false, + "a_m_pow_b": "0x1a603" + }, + { + "a": "0x7", + "b": "0x2", + "m": "0x1e241", + "a_m_add_b_m": "0x9", + "a_m_sub_b_m": "0x5", + "a_m_mul_b_m": "0xe", + "a_eq_b": false, + "a_m_pow_b": "0x31" + }, + { + "a": "0x2b56", + "b": "0xc9", + "m": "0x1e241", + "a_m_add_b_m": "0x2c1f", + "a_m_sub_b_m": "0x2a8d", + "a_m_mul_b_m": "0x1df4", + "a_eq_b": false, + "a_m_pow_b": "0x543b" + }, + { + "a": "0x25f1", + "b": "0x657", + "m": "0x1e241", + "a_m_add_b_m": "0x2c48", + "a_m_sub_b_m": "0x1f9a", + "a_m_mul_b_m": "0x14ca8", + "a_eq_b": false, + "a_m_pow_b": "0xe298" + }, + { + "a": "0x0", + "b": "0x7c0", + "m": "0x1e241", + "a_m_add_b_m": "0x7c0", + "a_m_sub_b_m": "0x1da81", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x0" + }, + { + "a": "0x10a04", + "b": "0x10a04", + "m": "0x1e241", + "a_m_add_b_m": "0x31c7", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x11654", + "a_eq_b": true, + "a_m_pow_b": "0x94b1" + }, + { + "a": "0x23ac", + "b": "0x1053f", + "m": "0x1e241", + "a_m_add_b_m": "0x128eb", + "a_m_sub_b_m": "0x100ae", + "a_m_mul_b_m": "0x1d782", + "a_eq_b": false, + "a_m_pow_b": "0x195a0" + }, + { + "a": "0x1cd3", + "b": "0x3358", + "m": "0x1e241", + "a_m_add_b_m": "0x502b", + "a_m_sub_b_m": "0x1cbbc", + "a_m_mul_b_m": "0x12837", + "a_eq_b": false, + "a_m_pow_b": "0x1aeaf" + }, + { + "a": "0x12916", + "b": "0x175d0", + "m": "0x1e241", + "a_m_add_b_m": "0xbca5", + "a_m_sub_b_m": "0x19587", + "a_m_mul_b_m": "0x6798", + "a_eq_b": false, + "a_m_pow_b": "0x70f0" + }, + { + "a": "0xb", + "b": "0xbd17", + "m": "0x1e241", + "a_m_add_b_m": "0xbd22", + "a_m_sub_b_m": "0x12535", + "a_m_mul_b_m": "0x96f9", + "a_eq_b": false, + "a_m_pow_b": "0x18fd3" + }, + { + "a": "0x11c3", + "b": "0x0", + "m": "0x1e241", + "a_m_add_b_m": "0x11c3", + "a_m_sub_b_m": "0x11c3", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x3d", + "b": "0x3d", + "m": "0x1e241", + "a_m_add_b_m": "0x7a", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0xe89", + "a_eq_b": true, + "a_m_pow_b": "0xeb79" + }, + { + "a": "0x18939", + "b": "0x2496", + "m": "0x1e241", + "a_m_add_b_m": "0x1adcf", + "a_m_sub_b_m": "0x164a3", + "a_m_mul_b_m": "0x1b092", + "a_eq_b": false, + "a_m_pow_b": "0x3380" + }, + { + "a": "0x7", + "b": "0x7", + "m": "0x1e241", + "a_m_add_b_m": "0xe", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x31", + "a_eq_b": true, + "a_m_pow_b": "0x14371" + }, + { + "a": "0x19bbf", + "b": "0x11", + "m": "0x1e241", + "a_m_add_b_m": "0x19bd0", + "a_m_sub_b_m": "0x19bae", + "a_m_mul_b_m": "0xf821", + "a_eq_b": false, + "a_m_pow_b": "0x3d97" + }, + { + "a": "0x32", + "b": "0x32", + "m": "0x1e241", + "a_m_add_b_m": "0x64", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x9c4", + "a_eq_b": true, + "a_m_pow_b": "0xe9cc" + }, + { + "a": "0x22", + "b": "0xd727", + "m": "0x1e241", + "a_m_add_b_m": "0xd749", + "a_m_sub_b_m": "0x10b3c", + "a_m_mul_b_m": "0x515f", + "a_eq_b": false, + "a_m_pow_b": "0xee88" + }, + { + "a": "0x10", + "b": "0x593", + "m": "0x1e241", + "a_m_add_b_m": "0x5a3", + "a_m_sub_b_m": "0x1dcbe", + "a_m_mul_b_m": "0x5930", + "a_eq_b": false, + "a_m_pow_b": "0x1622d" + }, + { + "a": "0x1913b", + "b": "0x50", + "m": "0x1e241", + "a_m_add_b_m": "0x1918b", + "a_m_sub_b_m": "0x190eb", + "a_m_mul_b_m": "0x10dae", + "a_eq_b": false, + "a_m_pow_b": "0x1d9f8" + }, + { + "a": "0x1", + "b": "0x1", + "m": "0x1e241", + "a_m_add_b_m": "0x2", + "a_m_sub_b_m": "0x0", + "a_m_mul_b_m": "0x1", + "a_eq_b": true, + "a_m_pow_b": "0x1" + }, + { + "a": "0x164ed", + "b": "0x0", + "m": "0x1e241", + "a_m_add_b_m": "0x164ed", + "a_m_sub_b_m": "0x164ed", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0x18d", + "b": "0x1c322", + "m": "0x1e241", + "a_m_add_b_m": "0x1c4af", + "a_m_sub_b_m": "0x20ac", + "a_m_mul_b_m": "0xb787", + "a_eq_b": false, + "a_m_pow_b": "0x14a60" + }, + { + "a": "0x13f42", + "b": "0x1dbb", + "m": "0x1e241", + "a_m_add_b_m": "0x15cfd", + "a_m_sub_b_m": "0x12187", + "a_m_mul_b_m": "0x11408", + "a_eq_b": false, + "a_m_pow_b": "0xbd8a" + }, + { + "a": "0x32b", + "b": "0x0", + "m": "0x1e241", + "a_m_add_b_m": "0x32b", + "a_m_sub_b_m": "0x32b", + "a_m_mul_b_m": "0x0", + "a_eq_b": false, + "a_m_pow_b": "0x1" + }, + { + "a": "0xbc", + "b": "0xbb9", + "m": "0x1e241", + "a_m_add_b_m": "0xc75", + "a_m_sub_b_m": "0x1d744", + "a_m_mul_b_m": "0x112d8", + "a_eq_b": false, + "a_m_pow_b": "0x1239e" + }, + { + "a": "0x8aee", + "b": "0x11f57", + "m": "0x1e241", + "a_m_add_b_m": "0x1aa45", + "a_m_sub_b_m": "0x14dd8", + "a_m_mul_b_m": "0x565b", + "a_eq_b": false, + "a_m_pow_b": "0x2f7c" + }, + { + "a": "0x101", + "b": "0x5abe", + "m": "0x1e241", + "a_m_add_b_m": "0x5bbf", + "a_m_sub_b_m": "0x18884", + "a_m_mul_b_m": "0xac8e", + "a_eq_b": false, + "a_m_pow_b": "0x1d160" + }, + { + "a": "0x1330", + "b": "0x13ac1", + "m": "0x1e241", + "a_m_add_b_m": "0x14df1", + "a_m_sub_b_m": "0xbab0", + "a_m_mul_b_m": "0x1bf6b", + "a_eq_b": false, + "a_m_pow_b": "0xbad9" + }, + { + "a": "0x42", + "b": "0x19", + "m": "0x1e241", + "a_m_add_b_m": "0x5b", + "a_m_sub_b_m": "0x29", + "a_m_mul_b_m": "0x672", + "a_eq_b": false, + "a_m_pow_b": "0xe9ae" + } + ] +} \ No newline at end of file diff --git a/crypto3/libs/multiprecision/test/data/modular_comprehensive.json b/crypto3/libs/multiprecision/test/data/modular_comprehensive.json deleted file mode 100644 index 4f385d33e..000000000 --- a/crypto3/libs/multiprecision/test/data/modular_comprehensive.json +++ /dev/null @@ -1,10012 +0,0 @@ -{ - "prime_mod_montgomery_130": [ - { - "a": "0x66220d5b2e9bc0", - "b": "0x3b756edf80e616000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x3b756edf80e67c220d5b2e9bc0", - "a_m_sub_b_m": "0x314107b6381b718febadfc1e8387de47b", - "a_m_mul_b_m": "0x81036b15093a27ef25a78ace142f1cec", - "a_eq_b": false, - "a_m_pow_b": "0x2d1b5ec2675d4678e52a7c194641e47e3" - }, - { - "a": "0xe512bfe70e1e6000000", - "b": "0x4c5977eb01977c00000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x4c5978d01457630e1e6000000", - "a_m_sub_b_m": "0x314107b9a318e8820b31650bcc34f48bb", - "a_m_mul_b_m": "0xd9ab7be35b2dfedf49421b2e4a5df604", - "a_eq_b": false, - "a_m_pow_b": "0x14cf7740bcd0b5b08c0c99195bdc7c60" - }, - { - "a": "0x4d0319238294cc0000000000000000", - "b": "0x13f6454f486", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x4d0319238294cc0000013f6454f486", - "a_m_sub_b_m": "0x4d0319238294cbfffffec09bab0b7a", - "a_m_mul_b_m": "0x687939d2a1317de5608d2c6a3ae385a3", - "a_eq_b": false, - "a_m_pow_b": "0xaa3b3c3896603d4cdb1081f94e3c0282" - }, - { - "a": "0x1e3ae42131ebce000000000", - "b": "0xaab2d0b7dbf018000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x1e458f4e3d698d018000000", - "a_m_sub_b_m": "0x1e3038f4266e0efe8000000", - "a_m_mul_b_m": "0xeb7b80f947c9c311e37df0ed7f03c5ef", - "a_eq_b": false, - "a_m_pow_b": "0xa16b054c446db47e74cebc6ae87f69b" - }, - { - "a": "0x408080081ff39c00", - "b": "0xa0ffca078dbf000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0xa1404a8795def39c00", - "a_m_sub_b_m": "0x314107b9ef725f7dee14618553e42e4bb", - "a_m_mul_b_m": "0x8beca4d5c3f75d0142fc8f46c2f94e81", - "a_eq_b": false, - "a_m_pow_b": "0x137a95f2516dfd4675735af15d81069e1" - }, - { - "a": "0x0", - "b": "0x7427dc0d76c5ac00000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x7427dc0d76c5ac00000000", - "a_m_sub_b_m": "0x314107b9ef6b1d0a39318da2edd4f48bb", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x0", - "b": "0x4d8616f502c", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x4d8616f502c", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f9b027bdff88f", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x36cfa47e082c7200000", - "b": "0x4b60670b8fd4040", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x36cfefde6f3801d4040", - "a_m_sub_b_m": "0x36cf591da120e22bfc0", - "a_m_mul_b_m": "0xbf26b485ba809c5b25a87dd375739459", - "a_eq_b": false, - "a_m_pow_b": "0x20e0a574daf095a01dcdd8c48dfb76fd2" - }, - { - "a": "0x4172c2f007c1c8000", - "b": "0xe7329cf691e038000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0xe7329d3804a32807c1c8000", - "a_m_sub_b_m": "0x314107b9ee8b2ceb44e9dcb5b596bc8bb", - "a_m_mul_b_m": "0x7fc8734498eaf509c3ae434124fe3db9", - "a_eq_b": false, - "a_m_pow_b": "0x1cda5634f33708815b387389a73bc36dc" - }, - { - "a": "0x4b6b6f66d193c40000", - "b": "0x399f7e5cda40060", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x4b6f095eb761680060", - "a_m_sub_b_m": "0x4b67d56eebc61fffa0", - "a_m_mul_b_m": "0x10f9e8c251430f02b45b12c2769800000", - "a_eq_b": false, - "a_m_pow_b": "0xfcfbcf1f6893434aa83ae3d47c0174a1" - }, - { - "a": "0x722341a14828dc00000", - "b": "0xca529342553c38000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0xd174c75c69bec5c00000", - "a_m_sub_b_m": "0x314107b9ef725354f41675f21330f48bb", - "a_m_mul_b_m": "0x1a21f7ee41b9e00fd4c45a5c11adeeb8a", - "a_eq_b": false, - "a_m_pow_b": "0x265a3f3deedd34d8162bc935045ef7ef9" - }, - { - "a": "0xcca", - "b": "0x2de191b6ca289a00000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2de191b6ca289a00000000000cca", - "a_m_sub_b_m": "0x314104dbd656f2e57068f9fdadd4f5585", - "a_m_mul_b_m": "0x24ac6d18bb56b418400000000000000", - "a_eq_b": false, - "a_m_pow_b": "0x1c8fc1e590db6e7b559223b26a2c4eca4" - }, - { - "a": "0x4d99acf93e5a140000", - "b": "0x2d9fd569ec1f8a0000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2d9fd569f0f924cf93e5a140000", - "a_m_sub_b_m": "0x3141078c4f9cf5a0b419c9919376348bb", - "a_m_mul_b_m": "0x3023f05201c365461a2ea1ccb21a72f29", - "a_eq_b": false, - "a_m_pow_b": "0x12c2607e936b0a1c43e8f09a0029ec455" - }, - { - "a": "0x1987d3744d2dac000000", - "b": "0x38f5fb6eab678c00000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x390f83421fb4b9ac000000", - "a_m_sub_b_m": "0x314107b9ef6ed1c0c0558857c894f48bb", - "a_m_mul_b_m": "0x2a6aae379327d7b3e6863bebfb21d8f0c", - "a_eq_b": false, - "a_m_pow_b": "0x1b4bfb1543dad1eb1d710a53760f9dae" - }, - { - "a": "0x8c4a0e18ef74a0000000000000", - "b": "0x8c4a0e18ef74a0000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x118941c31dee940000000000000", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x164d46f4689ca1f9eddd807091db31c03", - "a_eq_b": true, - "a_m_pow_b": "0xc5582b9c31d101bfa5696c31a20b29fb" - }, - { - "a": "0x3c831fdfd42c480000000", - "b": "0x95db", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x3c831fdfd42c4800095db", - "a_m_sub_b_m": "0x3c831fdfd42c47fff6a25", - "a_m_mul_b_m": "0x236c15b98af847c9980000000", - "a_eq_b": false, - "a_m_pow_b": "0x27296ab7f412bfbd67360e9fc3c959f4f" - }, - { - "a": "0x961772e6ae1", - "b": "0x67c3f8a78698ac000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x67c3f8a78699421772e6ae1", - "a_m_sub_b_m": "0x314107b9ef0a9b8f528261e7c547db39c", - "a_m_mul_b_m": "0x2591bb378ec6ac24ccc0d9581931d9a1f", - "a_eq_b": false, - "a_m_pow_b": "0x861e2a3419e76c77dfd3101416f4e027" - }, - { - "a": "0x0", - "b": "0x16435f3825dade000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x16435f3825dade000000000", - "a_m_sub_b_m": "0x314107b9ef5c1c28c1e31f1fadd4f48bb", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x0", - "b": "0x73f067f72fbca", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x73f067f72fbca", - "a_m_sub_b_m": "0x314107b9ef725f87fa08860d45ddc4cf1", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x1a", - "b": "0x1a", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x34", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x2a4", - "a_eq_b": true, - "a_m_pow_b": "0x4a1a02108f971a7f069357024000000" - }, - { - "a": "0x11396", - "b": "0x7", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x1139d", - "a_m_sub_b_m": "0x1138f", - "a_m_mul_b_m": "0x7891a", - "a_eq_b": false, - "a_m_pow_b": "0x1ace74af4c5be740329a76b1c0180" - }, - { - "a": "0x375082bad", - "b": "0xadce1f", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x375b5f9cc", - "a_m_sub_b_m": "0x3745a5d8e", - "a_m_mul_b_m": "0x258df1d430b7ff3", - "a_eq_b": false, - "a_m_pow_b": "0x12e05bb9b134e10ba03545539b72682ce" - }, - { - "a": "0x2642aad48fcfcfa81b306d70019d5f970", - "b": "0x276263ee888f2e0000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x264520faceb8589afb306d70019d5f970", - "a_m_sub_b_m": "0x264034ae50e746b53b306d70019d5f970", - "a_m_mul_b_m": "0x27dabdac847470962b6784d130ab7c686", - "a_eq_b": false, - "a_m_pow_b": "0x189dec865c44bdb85f9f1551048eb7c8e" - }, - { - "a": "0x570ee99", - "b": "0x21389b", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x5922734", - "a_m_sub_b_m": "0x54fb5fe", - "a_m_mul_b_m": "0xb4c2c14aeea3", - "a_eq_b": false, - "a_m_pow_b": "0x5dfccd1740b833c4fb7f7e27c676b133" - }, - { - "a": "0xdc76788ba6d4880000000000000000", - "b": "0x0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0xdc76788ba6d4880000000000000000", - "a_m_sub_b_m": "0xdc76788ba6d4880000000000000000", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x34e0e78e54b2e0000000000000000", - "b": "0x2cf20ec63f02f800000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x34e0e79123d3cc63f02f800000000", - "a_m_sub_b_m": "0x34e0e78b8591f39c0fd0800000000", - "a_m_mul_b_m": "0x20fe57b228dd22dfaf7bda111972406b4", - "a_eq_b": false, - "a_m_pow_b": "0x17097b70dfc329d6930efc2d0c42f19f6" - }, - { - "a": "0xb957910343ad500", - "b": "0xb957910343ad500", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x172af2206875aa00", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x862fad8a9a2d30215c940d35390000", - "a_eq_b": true, - "a_m_pow_b": "0x124148703991aa112c9d536758e67c5d5" - }, - { - "a": "0x2e2b8", - "b": "0xba6cbd91d57cd000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0xba6cbd91d57cd00002e2b8", - "a_m_sub_b_m": "0x314107b9ef66b8bc20eba230add522b73", - "a_m_mul_b_m": "0x219f378a6aa4341558000000000", - "a_eq_b": false, - "a_m_pow_b": "0x27cdb5ba02c2efa318f36442564413d9f" - }, - { - "a": "0x7f2cc28c3740d800000000000000", - "b": "0xd85edb3ecde6680000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x8cb2b040241f3e80000000000000", - "a_m_sub_b_m": "0x71a6d4d84a627180000000000000", - "a_m_mul_b_m": "0x2f015435eaa2976773ee143df26f4f5cb", - "a_eq_b": false, - "a_m_pow_b": "0x1be85ab34547a111cda86dad65776e8ab" - }, - { - "a": "0x70a7521f359dd4000000000", - "b": "0x145454a1451e9a0000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x1b5ec9c33878774000000000", - "a_m_sub_b_m": "0x314107b9ee9dc19004ecae31add4f48bb", - "a_m_mul_b_m": "0x1337f8d13aa1b3d9898d5588e51dd20bb", - "a_eq_b": false, - "a_m_pow_b": "0x171c4123b0c147e5e99e13efd13360a78" - }, - { - "a": "0x11", - "b": "0x1202bef31d6fdd0000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x1202bef31d6fdd0000000011", - "a_m_sub_b_m": "0x314107b9ee523398c831fc2dadd4f48cc", - "a_m_mul_b_m": "0x1322eae24f46dad0000000000", - "a_eq_b": false, - "a_m_pow_b": "0xbd32fd08360cd6f9e460263b63114fbe" - }, - { - "a": "0x27e9cf84f09f6048fe245a4600004884c", - "b": "0x35e5895edca704000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x27ea056a79fe3cf002245a4600004884c", - "a_m_sub_b_m": "0x27e9999f674083a1fa245a4600004884c", - "a_m_mul_b_m": "0xc0a87c79b495b340ae57332fc1190166", - "a_eq_b": false, - "a_m_pow_b": "0x7b913019073ee0dd4f92b5fdb94f78af" - }, - { - "a": "0x3cbe368ca4232c0000000000000000000", - "b": "0x1384d00d46ca340000000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x1f01fedffb7b007805f70602522b0b745", - "a_m_sub_b_m": "0x2939667f5d58f80000000000000000000", - "a_m_mul_b_m": "0x129d2a6cbd424607c43be951f1a158a86", - "a_eq_b": false, - "a_m_pow_b": "0x177c83aa8680e9ae44cac986484434920" - }, - { - "a": "0x225e6a16991", - "b": "0x29cb017c18741ae91acfebb4bd29e8693", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x29cb017c18741ae91acfebd71b93ff024", - "a_m_sub_b_m": "0x776063dd6fe449edf390e6b4f1522bb9", - "a_m_mul_b_m": "0x8f9a861290ec59284a0e62eda7a8518a", - "a_eq_b": false, - "a_m_pow_b": "0x821da1b92b17285af4186c2dead4a163" - }, - { - "a": "0x37fdc0d", - "b": "0x38d5ce5ce13a2e00", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x38d5ce5ce4ba0a0d", - "a_m_sub_b_m": "0x314107b9ef725f87f67b9d17dff94f6c8", - "a_m_mul_b_m": "0xc6e45716eab6ac417c5600", - "a_eq_b": false, - "a_m_pow_b": "0x281bbfeee4c9e5ae9e8ca32463514a8f6" - }, - { - "a": "0x7", - "b": "0x289a8dde4", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x289a8ddeb", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fd853a66ade", - "a_m_mul_b_m": "0x11c39e113c", - "a_eq_b": false, - "a_m_pow_b": "0x1529f9cb9425c63b4b65a3d3fc7c7699c" - }, - { - "a": "0xe57d6becc3d4280000000", - "b": "0x2d", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0xe57d6becc3d428000002d", - "a_m_sub_b_m": "0xe57d6becc3d427fffffd3", - "a_m_mul_b_m": "0x28570bf89e6c4b080000000", - "a_eq_b": false, - "a_m_pow_b": "0x2f099299df90aad2131391e80ba8ce1e6" - }, - { - "a": "0x1e1f1878781", - "b": "0x413314d7c2dfec00000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x413314d7c2dfec0001e1f1878781", - "a_m_sub_b_m": "0x314103a6be24e359fb48fa1bcced6d03c", - "a_m_mul_b_m": "0x2db940c9fa071bbb9afd73420a8c0e06c", - "a_eq_b": false, - "a_m_pow_b": "0x1de5ade8f4ce3e4db37b6a56ce072f7ca" - }, - { - "a": "0x13782b96b24182000", - "b": "0x26f21e9e4a8438000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x26f21e9e4a844b782b96b24182000", - "a_m_sub_b_m": "0x3140e0c7d0d41503d58125946016768bb", - "a_m_mul_b_m": "0x1bf945dc87401364edc9b86c028b0eb50", - "a_eq_b": false, - "a_m_pow_b": "0x13a81901d85adada042dfa877959c310a" - }, - { - "a": "0x391171378e", - "b": "0xd5380c56e261", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0xd5711dc819ef", - "a_m_sub_b_m": "0x314107b9ef725f87fa08ecadbe2699de8", - "a_m_mul_b_m": "0x2f8801c42ceeb8e0a568ce", - "a_eq_b": false, - "a_m_pow_b": "0x1e701e05fdb16bd2cad8a226582d76008" - }, - { - "a": "0x18", - "b": "0x78ea74ae3993", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x78ea74ae39ab", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f26f068a10f40", - "a_m_mul_b_m": "0xb55faf05565c8", - "a_eq_b": false, - "a_m_pow_b": "0x2fedf7740a54699105dae5e4a892a7412" - }, - { - "a": "0x7a7d", - "b": "0xaaa21f699b0b1000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0xaaa21f699b0b1000000000007a7d", - "a_m_sub_b_m": "0x3140fd0fcd7bc5d74908f9fdadd4fc338", - "a_m_mul_b_m": "0x51a49421aa73fa06d000000000000000", - "a_eq_b": false, - "a_m_pow_b": "0x2e33f3c99ca3d3bf306b3b98b26b70e69" - }, - { - "a": "0x18a31eaf5d221000000000000000", - "b": "0x5ddb7e9fb072f000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x18a31eaf5d226ddb7e9fb072f000", - "a_m_sub_b_m": "0x18a31eaf5d21b22481604f8d1000", - "a_m_mul_b_m": "0x50b5817e30911d4f9d5b268fbfcdc281", - "a_eq_b": false, - "a_m_pow_b": "0x29ba51615dde8da0763974779de6e4a4" - }, - { - "a": "0x30983be79add4e0000000000000", - "b": "0x1e", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x30983be79add4e000000000001e", - "a_m_sub_b_m": "0x30983be79add4dfffffffffffe2", - "a_m_mul_b_m": "0x5b1d7052425ef240000000000000", - "a_eq_b": false, - "a_m_pow_b": "0x1538468378f96a7b1617055197cf83b3d" - }, - { - "a": "0x12d911", - "b": "0x1dc0ca369613ea0000000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x1dc0ca369613ea000000000000012d911", - "a_m_sub_b_m": "0x13803d83595e7587fa08f9fdadd6221cc", - "a_m_mul_b_m": "0x23e26960ebbc5159f82898eb1a4fed7fa", - "a_eq_b": false, - "a_m_pow_b": "0x24a0bbca451f5f0384177a52a8bd2bcca" - }, - { - "a": "0x35a3d58", - "b": "0x25e4af862156af4586c4c3935379deda1", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x25e4af862156af4586c4c39353af82af9", - "a_m_sub_b_m": "0xb5c5833ce1bb0427344366a5a90b9872", - "a_m_mul_b_m": "0xbce63ac49f5f2f4747e66622fa6acb82", - "a_eq_b": false, - "a_m_pow_b": "0x892fec77eb1c21152eea9a5d4c28d26a" - }, - { - "a": "0x2083c333268bca000000000000", - "b": "0x307120911b3b68b57da54f267dd138266", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x3071209323779be7e661ef267dd138266", - "a_m_sub_b_m": "0xcfe72adc732a04e5204ad73003bc655", - "a_m_mul_b_m": "0x1a8ffc638420ba1429b5e7bfc05b71cd7", - "a_eq_b": false, - "a_m_pow_b": "0x1350f2adfffc87e11e724c0136039ca8b" - }, - { - "a": "0x4a8372c", - "b": "0x3104d277c158f00000000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x3104d277c158f00000000000004a8372c", - "a_m_sub_b_m": "0x3c35422e196f87fa08f9fdae1f77fe7", - "a_m_mul_b_m": "0xba8049f39c7fe8fff9dbbfbde9c509cb", - "a_eq_b": false, - "a_m_pow_b": "0x10a4d554da1ce206c84a818fd303d21eb" - }, - { - "a": "0x3090", - "b": "0x3114", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x61a4", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fdadd4f4837", - "a_m_mul_b_m": "0x94f5b40", - "a_eq_b": false, - "a_m_pow_b": "0x14be619241aab348dc518101adc8c3ac8" - }, - { - "a": "0x279a598a801e6e00000", - "b": "0x13dabad28c5d84000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x13dae26ce5e8041e6e00000", - "a_m_sub_b_m": "0x314107b9ef5e84f4c1d626f9cc42f48bb", - "a_m_mul_b_m": "0xc1972d6ce327d980915065007af28555", - "a_eq_b": false, - "a_m_pow_b": "0xff4f07b46b72980d7ea5815a54630784" - }, - { - "a": "0x3655a0084ec0da0000000000000000000", - "b": "0x219bb4dd41ba2800000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x53634033c9034a005f70602522b0b745", - "a_m_sub_b_m": "0x4f2fc99820cc05005f70602522b0b745", - "a_m_mul_b_m": "0x106699bf6da92ec06f0857e886f33a038", - "a_eq_b": false, - "a_m_pow_b": "0x292b9cc3f48f57c95c95fd06f49102b3c" - }, - { - "a": "0x0", - "b": "0x392c03e65f9", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x392c03e65f9", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f9c481d10e2c2", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x50cca66556eae0000000", - "b": "0xe34f561e33d4b0000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0xe35462e89a2a1eae0000000", - "a_m_sub_b_m": "0x314107b9ee8f153ea63b7abc5bd4f48bb", - "a_m_mul_b_m": "0x262f66033aa5e6e8edf68df8ac1c4ca43", - "a_eq_b": false, - "a_m_pow_b": "0x2e99c944fbcbb4ba680147008ad46cebf" - }, - { - "a": "0x8de376536d7240000", - "b": "0x8546c41441", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x8de3765bc1de81441", - "a_m_sub_b_m": "0x8de3764b1905febbf", - "a_m_mul_b_m": "0x49de6559131027d8b4b70240000", - "a_eq_b": false, - "a_m_pow_b": "0x189ab84088b2a7aec26ec6e5195003be9" - }, - { - "a": "0x1088ed7b275586000000000000000", - "b": "0x13514d457303e", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x1088ed7b2755860013514d457303e", - "a_m_sub_b_m": "0x1088ed7b275585ffecaeb2ba8cfc2", - "a_m_mul_b_m": "0x1be318befa490e87cded2c65e72922b00", - "a_eq_b": false, - "a_m_pow_b": "0x2717eb5b3e597960388edffab4067eb02" - }, - { - "a": "0x14", - "b": "0x14", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x28", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x190", - "a_eq_b": true, - "a_m_pow_b": "0x56bc75e2d6310000000000" - }, - { - "a": "0x40d36a3123b4a4000000", - "b": "0x40d36a3123b4a4000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x81a6d462476948000000", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x11883c333171b7f11c43bdc6ae98c9e98", - "a_eq_b": true, - "a_m_pow_b": "0xc2be3aafbfe9bf767d89e9cb7097d2e4" - }, - { - "a": "0x326f38f5cc", - "b": "0x3c4b6ccd633d9600000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x3c4b6ccd633d960000326f38f5cc", - "a_m_sub_b_m": "0x314103f538a5895420a8fa00d4c883e87", - "a_m_mul_b_m": "0x22059ba14f17c0367332f2ba52f9f8369", - "a_eq_b": false, - "a_m_pow_b": "0x4863d49361e1e4f2281c2dc4cbe69c00" - }, - { - "a": "0x52619390", - "b": "0x0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x52619390", - "a_m_sub_b_m": "0x52619390", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x9f81845cab", - "b": "0x42c35bb4d", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0xa3adba17f8", - "a_m_sub_b_m": "0x9b554ea15e", - "a_m_mul_b_m": "0x29991ceb69637e7c86f", - "a_eq_b": false, - "a_m_pow_b": "0x25e29338d8fd9589d98e5851fad0beb0f" - }, - { - "a": "0x3d6cea29f704a", - "b": "0x85c7bc7c", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x3d6cf28672cc6", - "a_m_sub_b_m": "0x3d6ce1cd7b3ce", - "a_m_mul_b_m": "0x2019828b90aca9736bbd8", - "a_eq_b": false, - "a_m_pow_b": "0xea4dfa0461d33a74d826efd55ec3fecd" - }, - { - "a": "0x56f29055ed8ef400000000000000000", - "b": "0x4c68b86b68b790000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x56f29055ed93ba8b86b68b790000000", - "a_m_sub_b_m": "0x56f29055ed8a2d74794974870000000", - "a_m_mul_b_m": "0x25b93b05a373712cbb953aac05b7294ee", - "a_eq_b": false, - "a_m_pow_b": "0x62c91a00337969d9807a849288d55f27" - }, - { - "a": "0x286f285dad425c0000000000000", - "b": "0x0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x286f285dad425c0000000000000", - "a_m_sub_b_m": "0x286f285dad425c0000000000000", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x2491", - "b": "0x0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2491", - "a_m_sub_b_m": "0x2491", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x44ff687ad5c", - "b": "0x3972e7c6ef92aa000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x3972e7c6ef92aa044ff687ad5c", - "a_m_sub_b_m": "0x314107b65843e31900de5a42ad3d6f617", - "a_m_mul_b_m": "0xb102c3eb50b6c8dc30b16c89c17ce6e2", - "a_eq_b": false, - "a_m_pow_b": "0x978c4abfac0923bcec9e7c15fa71fc92" - }, - { - "a": "0xe2", - "b": "0x179c665fd6a58300000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x179c665fd6a583000000e2", - "a_m_sub_b_m": "0x314107b9ef70e5c1940b8fa57dd4f499d", - "a_m_mul_b_m": "0x14d812609b7e1da600000000", - "a_eq_b": false, - "a_m_pow_b": "0x3742ff267d77eb437bbfda6efc49d34c" - }, - { - "a": "0x5c6d1e2d27", - "b": "0x493c22bd29", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0xa5a940ea50", - "a_m_sub_b_m": "0x1330fb6ffe", - "a_m_mul_b_m": "0x1a70d3b8bc12e459063f", - "a_eq_b": false, - "a_m_pow_b": "0x207daf965c956f689daf9cd638f678287" - }, - { - "a": "0xe56790a0f132a8000000000000000000", - "b": "0x1f", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0xe56790a0f132a800000000000000001f", - "a_m_sub_b_m": "0xe56790a0f132a7ffffffffffffffffe1", - "a_m_mul_b_m": "0x12f62ae684cc9b835af3614e3836716d", - "a_eq_b": false, - "a_m_pow_b": "0x1dd991ee66eb3ca59692a014fc218b3fb" - }, - { - "a": "0x1b228f3", - "b": "0x2611e3657490760000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2611e3657490760000000001b228f3", - "a_m_sub_b_m": "0x313ea69bb91b16809a08f9fdadf0171ae", - "a_m_mul_b_m": "0x9cbfd96310eae3539bd06ad48c33a61d", - "a_eq_b": false, - "a_m_pow_b": "0xecd8cdfb6917aeacb59c349819307756" - }, - { - "a": "0x0", - "b": "0x0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x0", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x0", - "a_eq_b": true, - "a_m_pow_b": "0x1" - }, - { - "a": "0x3a3e900179e414000000000000000", - "b": "0x2f5c409c0c26760000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x3a3e9001a940549c0c26760000000", - "a_m_sub_b_m": "0x3a3e90014a87d363f3d98a0000000", - "a_m_mul_b_m": "0x15cbd15d70a262531cceae741ae6f57df", - "a_eq_b": false, - "a_m_pow_b": "0x2114a626d65e5dc975bd31ea2ff53c093" - }, - { - "a": "0x3cb5e321212082000", - "b": "0x74c16bc6757274", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x3cbd2f37dd87d9274", - "a_m_sub_b_m": "0x3cae970a64b92ad8c", - "a_m_mul_b_m": "0x1bb0499a55737e31eb4a2ae69ee8000", - "a_eq_b": false, - "a_m_pow_b": "0x9fa82c5b454f49f9b51ec7317ff99d36" - }, - { - "a": "0x122", - "b": "0x755771fadd65c0000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x755771fadd65c0000000000122", - "a_m_sub_b_m": "0x314107b299fb3fda23acf9fdadd4f49dd", - "a_m_mul_b_m": "0x84ed0f1e2ecd4380000000000000", - "a_eq_b": false, - "a_m_pow_b": "0xad79d50451d43128572aa77876141739" - }, - { - "a": "0x179bb7e26aaafc000", - "b": "0x38b45eecbeff", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x179bbb6db099c7eff", - "a_m_sub_b_m": "0x179bb45724bc30101", - "a_m_mul_b_m": "0x53ab277d53825d483db775904000", - "a_eq_b": false, - "a_m_pow_b": "0x2cd3dfd919ea8751836767ade81e3818d" - }, - { - "a": "0x1e052ec800b5", - "b": "0xbbf716f682a3", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0xd9fc45be8358", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f01e8f520c6cd", - "a_m_mul_b_m": "0x160ac2dd95cec8f195a25d3f", - "a_eq_b": false, - "a_m_pow_b": "0x14c95a090e667ea419f87f8eb66d48f5b" - }, - { - "a": "0x1", - "b": "0x25b680b4c332a400000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x25b680b4c332a400000000001", - "a_m_sub_b_m": "0x314107b9c9bbded336d655fdadd4f48bc", - "a_m_mul_b_m": "0x25b680b4c332a400000000000", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x2662616baee1c200000000000000000", - "b": "0x3eb1231094ac5c00", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2662616baee1c203eb1231094ac5c00", - "a_m_sub_b_m": "0x2662616baee1c1fc14edcef6b53a400", - "a_m_mul_b_m": "0x13c5ebb9908301840cd6d997212028860", - "a_eq_b": false, - "a_m_pow_b": "0x287e1109725ec4077517ba083d3e20ca8" - }, - { - "a": "0xc", - "b": "0x5c188623ce", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x5c188623da", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f9f7ec4c924f9", - "a_m_mul_b_m": "0x4512649ada8", - "a_eq_b": false, - "a_m_pow_b": "0xf2dcd9d38cecb1fe6e8a19f18bc0af36" - }, - { - "a": "0x5b0250c1e8d", - "b": "0x1019fcf9a44", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x6b1c4dbb8d1", - "a_m_sub_b_m": "0x4ae853c8449", - "a_m_mul_b_m": "0x5b9623508a066689bef74", - "a_eq_b": false, - "a_m_pow_b": "0x14a2883e65cd2ef6ef3545c058cb9da9d" - }, - { - "a": "0x136fa", - "b": "0xf0fb19", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0xf23213", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fdadc5f849c", - "a_m_mul_b_m": "0x124bb657c6a", - "a_eq_b": false, - "a_m_pow_b": "0x27e601f7f5fa302e258cb2b30271bff65" - }, - { - "a": "0xf3515f99ef4f9000000000000000", - "b": "0x23d18", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0xf3515f99ef4f9000000000023d18", - "a_m_sub_b_m": "0xf3515f99ef4f8ffffffffffdc2e8", - "a_m_mul_b_m": "0x220b3f29c831384c58000000000000000", - "a_eq_b": false, - "a_m_pow_b": "0x212f4994146857330d6258563f0b88f11" - }, - { - "a": "0x159421d1237c3f00000000000000000", - "b": "0x12fee9ced", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x159421d1237c3f0000000012fee9ced", - "a_m_sub_b_m": "0x159421d1237c3effffffffed0116313", - "a_m_mul_b_m": "0x2f215b2f52b06b467609c8b6582351f72", - "a_eq_b": false, - "a_m_pow_b": "0x243a80c170df052c4cd660184739a26a1" - }, - { - "a": "0x1bcc7b881d1dff0000", - "b": "0x0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x1bcc7b881d1dff0000", - "a_m_sub_b_m": "0x1bcc7b881d1dff0000", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x29511feab378540", - "b": "0x246e785ad1bce35d8cbe88a3f2f7a304f", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x246e785ad1bce35d8ce7d9c3ddab1b58f", - "a_m_sub_b_m": "0xcd28f5f1db57c2a6d73c279a590c9dac", - "a_m_mul_b_m": "0x2bd50e95210b19329ae330a0a98d9afb9", - "a_eq_b": false, - "a_m_pow_b": "0x10525be74f1b44622356305d771571ca0" - }, - { - "a": "0xad18a0871bcc80000000000000", - "b": "0x116cfa7391eec10", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0xad18a0871bcd96cfa7391eec10", - "a_m_sub_b_m": "0xad18a0871bcb693058c6e113f0", - "a_m_mul_b_m": "0x25c7847419cce071fee2f6217640bfdf3", - "a_eq_b": false, - "a_m_pow_b": "0xb9d61884a109e6d36b923d7e1413ce2c" - }, - { - "a": "0x38a2611a20842400000000000000000", - "b": "0x7191ee11803dbc00", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x38a2611a20842407191ee11803dbc00", - "a_m_sub_b_m": "0x38a2611a208423f8e6e11ee7fc24400", - "a_m_mul_b_m": "0x84c53035f2280926a6838a2e58f99e9c", - "a_eq_b": false, - "a_m_pow_b": "0x6032b79725387533bb93622fa342c8df" - }, - { - "a": "0x2764657ca9e65736c72f774b1b2f11ef9", - "b": "0x8e1728aecc", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2764657ca9e65736c72f7753fca19cdc5", - "a_m_sub_b_m": "0x2764657ca9e65736c72f774239bc8702d", - "a_m_mul_b_m": "0x2851f7ae8725834bd0ace86a686b586b", - "a_eq_b": false, - "a_m_pow_b": "0x2f5986c7c286d10543d23f02a088e5c97" - }, - { - "a": "0x331ecd5de31ee200000000000", - "b": "0x331ecd5de31ee200000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x663d9abbc63dc400000000000", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x1114e4ff8b4d64d85094208f7455c4d32", - "a_eq_b": true, - "a_m_pow_b": "0xe08c15f267ed1f9a67aaa5fa1d555ebb" - }, - { - "a": "0x66fc75f835f6540000", - "b": "0x20a614be3ab2212c9e23b580e4523dbbb", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x20a614be3ab221330deb150443b77dbbb", - "a_m_sub_b_m": "0x109af2fbb4c03e61cbaca40028e7f6d00", - "a_m_mul_b_m": "0x8be2547096057e594eba136a83477878", - "a_eq_b": false, - "a_m_pow_b": "0x1375e2e2290f3a5aa552271a7444a09ad" - }, - { - "a": "0xc3600fd71e749800000", - "b": "0x1cabe7744f", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0xc3600fd7203f567744f", - "a_m_sub_b_m": "0xc3600fd71ca9d988bb1", - "a_m_mul_b_m": "0x15e1b38a8e230759ec62dae800000", - "a_eq_b": false, - "a_m_pow_b": "0x582847b93efca74a217e3e5b649f4769" - }, - { - "a": "0x2a5214735aef92000000", - "b": "0x2a5214735aef92000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x54a428e6b5df24000000", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x78d28bfafe3fbada31a47efacb2841a3", - "a_eq_b": true, - "a_m_pow_b": "0x1bb01044fe089fc60b12b2f43b8b30f76" - }, - { - "a": "0x1232d53141f7", - "b": "0x266029", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x1232d557a220", - "a_m_sub_b_m": "0x1232d50ae1ce", - "a_m_mul_b_m": "0x2ba619f66684a308f", - "a_eq_b": false, - "a_m_pow_b": "0x16e4673221afafb8a98dd420418beaf8f" - }, - { - "a": "0xbf220e196b5118000", - "b": "0x2a5bd1a3472476", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0xbf24b3d685858a476", - "a_m_sub_b_m": "0xbf1f685c511ca5b8a", - "a_m_mul_b_m": "0x1fa023efe3f3d95ccc109486c110000", - "a_eq_b": false, - "a_m_pow_b": "0x22949f3d8f2281b6effc81d9c26890b0d" - }, - { - "a": "0x250dab09a5b16e000000000000", - "b": "0x35a58ebd706be80000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x250dae63fe9d4506be80000000", - "a_m_sub_b_m": "0x250da7af4cc596f94180000000", - "a_m_mul_b_m": "0x1877bd5379f893e5ea66147f320e998d1", - "a_eq_b": false, - "a_m_pow_b": "0x69023944826e01a7f4ab031a0fd8fe8" - }, - { - "a": "0x30057f8ccd182", - "b": "0x413b8d9bf380", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x341938668c502", - "a_m_sub_b_m": "0x2bf1c6b30de02", - "a_m_mul_b_m": "0xc3c91376dc866b8444fd2700", - "a_eq_b": false, - "a_m_pow_b": "0x1696822a39cde302f9056a90b4fedd764" - }, - { - "a": "0x3ed0070003f67a00", - "b": "0xe3", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x3ed0070003f67ae3", - "a_m_sub_b_m": "0x3ed0070003f6791d", - "a_m_mul_b_m": "0x37b2763503838e2e00", - "a_eq_b": false, - "a_m_pow_b": "0x10868de76a1c0306fbe9f294f895622b0" - }, - { - "a": "0x70", - "b": "0x0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x70", - "a_m_sub_b_m": "0x70", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x2", - "b": "0x253be60b9cbe5a000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x253be60b9cbe5a000000002", - "a_m_sub_b_m": "0x314107b9ef4d23a1ee6c3ba3add4f48bd", - "a_m_mul_b_m": "0x4a77cc17397cb4000000000", - "a_eq_b": false, - "a_m_pow_b": "0xfeeb27c3555abb00e2c5db944d4d19f9" - }, - { - "a": "0x1", - "b": "0x1", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x1", - "a_eq_b": true, - "a_m_pow_b": "0x1" - }, - { - "a": "0x2d8ae03e07d4a0000000000000000", - "b": "0x3456c187a51af200000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2d8b1494c95c451af200000000000", - "a_m_sub_b_m": "0x2d8aabe7464cfae50e00000000000", - "a_m_mul_b_m": "0x2f1a1a4e72423bf72b64a320bbc178220", - "a_eq_b": false, - "a_m_pow_b": "0x2c52d4db1631a54e749a38d2598529109" - }, - { - "a": "0xf193969dfb1d280", - "b": "0x18ddcdcdfcdd410000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x18ddcdcdfcdd410f193969dfb1d280", - "a_m_sub_b_m": "0x313f79dd129291b3eafa8d944bd011b3b", - "a_m_mul_b_m": "0x2e4f417f3b8979f6b5e07493284cd351c", - "a_eq_b": false, - "a_m_pow_b": "0x1db5db7ce5f65f486b50e50620727c949" - }, - { - "a": "0x11b944dabd7b3f0000000000", - "b": "0x354dbf1b4f1b7c0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x11b944dac0d01af1b4f1b7c0", - "a_m_sub_b_m": "0x11b944daba26630e4b0e4840", - "a_m_mul_b_m": "0x2d18c0f9967f4e76f6b7f4b3e77a81a1a", - "a_eq_b": false, - "a_m_pow_b": "0x1c16673ff2b154e84061e34880d85c402" - }, - { - "a": "0x1da6845d48f2b30000000000000", - "b": "0x49bf1e44eeeed000000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x49bf3beb734c18f2b30000000000000", - "a_m_sub_b_m": "0x30f748b95107ce00ecbbf9fdadd4f48bb", - "a_m_mul_b_m": "0x200f002b66debdf179638b4039b315e37", - "a_eq_b": false, - "a_m_pow_b": "0x29fc64ffd3df008688f0bf52837550a1a" - }, - { - "a": "0x2a217cf253be957670884fd16636abf8c", - "b": "0x10d7b154cb1281000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2a217cf253cf6d27c55362526636abf8c", - "a_m_sub_b_m": "0x2a217cf253adbdc51bbd3d506636abf8c", - "a_m_mul_b_m": "0x2472695217ed1a9cf583111c7d1ae230", - "a_eq_b": false, - "a_m_pow_b": "0x3ce7802414cf67ba632627ce0e674c90" - }, - { - "a": "0x997", - "b": "0x6e2e1d0b80b2f4000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x6e2e1d0b80b2f4000000000000997", - "a_m_sub_b_m": "0x3140998bd266ded50608f9fdadd4f5252", - "a_m_mul_b_m": "0x4209c38894f3421ec000000000000000", - "a_eq_b": false, - "a_m_pow_b": "0x1c8917014789d40d4bb867ebb0f746816" - }, - { - "a": "0x27d7de1f57460d20d94b9cdb56e3c18c9", - "b": "0x33", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x27d7de1f57460d20d94b9cdb56e3c18fc", - "a_m_sub_b_m": "0x27d7de1f57460d20d94b9cdb56e3c1896", - "a_m_mul_b_m": "0xc97037709a350c43ea03611784464a18", - "a_eq_b": false, - "a_m_pow_b": "0x4c77fe8e6cc2867fc80dedf3f94ad7c0" - }, - { - "a": "0x3104dff6623f1b67e01d34690a795ac54", - "b": "0x16c886a2ae1f4400000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x3104dff6623f1b7ea8a3d71729bd5ac54", - "a_m_sub_b_m": "0x3104dff6623f1b51179691baeb355ac54", - "a_m_mul_b_m": "0x24b25cfbe83e7b440a9999ce274f6871d", - "a_eq_b": false, - "a_m_pow_b": "0x1257cf14caf12f62b10d3624ba09dd612" - }, - { - "a": "0x876f187cdb6158000000", - "b": "0x32d0591d4bdfb60000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x87a1e8d5f8ad37b60000", - "a_m_sub_b_m": "0x873c4823be15784a0000", - "a_m_mul_b_m": "0x1ecccab947012114ab0e73ae5761f3515", - "a_eq_b": false, - "a_m_pow_b": "0x1eb1e57d723ccb1b97a4cd3c01993a738" - }, - { - "a": "0xe81f403475c270000", - "b": "0x1ed943fd2232", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0xe81f42220a0242232", - "a_m_sub_b_m": "0xe81f3e46e1829ddce", - "a_m_mul_b_m": "0x1bf8a9a945f6463cb65b82d9e0000", - "a_eq_b": false, - "a_m_pow_b": "0x184dabca2f926c3b161a25039f5d6c2b9" - }, - { - "a": "0x6d64ae38c86c380000000000", - "b": "0x65e6546b8ae77800", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x6d64ae392e528c6b8ae77800", - "a_m_sub_b_m": "0x6d64ae386285e39475188800", - "a_m_mul_b_m": "0x10460f3661669e0f52043d49145771720", - "a_eq_b": false, - "a_m_pow_b": "0x463c8f2763d22d9b3b47a9bfe01d5faa" - }, - { - "a": "0xd82744ecb4", - "b": "0x0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0xd82744ecb4", - "a_m_sub_b_m": "0xd82744ecb4", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x960ba0e008e6880000000000000000", - "b": "0x8c1", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x960ba0e008e68800000000000008c1", - "a_m_sub_b_m": "0x960ba0e008e687fffffffffffff73f", - "a_m_mul_b_m": "0x20d6b4faa36c414085f70602522b0b745", - "a_eq_b": false, - "a_m_pow_b": "0x2cb07d2e8ff07a6471ec33fbc7bcce58b" - }, - { - "a": "0xfed69", - "b": "0x511256f3f80b840000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x511256f3f80b8400000000fed69", - "a_m_sub_b_m": "0x31410768dd1b6b8fee84f9fdadd5f3624", - "a_m_mul_b_m": "0x50b4253510f6021ed240000000000000", - "a_eq_b": false, - "a_m_pow_b": "0x115a63abbf7033fd1de6c322e16f5b5b7" - }, - { - "a": "0x9b8cc56fb6031", - "b": "0x264f82e12077c800000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x264f82e12077c809b8cc56fb6031", - "a_m_sub_b_m": "0x31410554f7444d807d89958a7344aa8ec", - "a_m_mul_b_m": "0x8e7be13632bb030c1961f4921c841ccc", - "a_eq_b": false, - "a_m_pow_b": "0x2e41ea1a8ab2ad8fae94ad45adfc67eb4" - }, - { - "a": "0x279683fcb4f23e0000000000000000000", - "b": "0x5f553af3bb486c000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x27968402aa45ed3bb486c000000000000", - "a_m_sub_b_m": "0x279683f6bf9e8ec44b794000000000000", - "a_m_mul_b_m": "0x1be82286334cde1e0fcbf6f6b906de8db", - "a_eq_b": false, - "a_m_pow_b": "0x86f0df78d116083145d4159f95253d7f" - }, - { - "a": "0x7159005b3337e0000", - "b": "0x4", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x7159005b3337e0004", - "a_m_sub_b_m": "0x7159005b3337dfffc", - "a_m_mul_b_m": "0x1c564016cccdf80000", - "a_eq_b": false, - "a_m_pow_b": "0x12fa21d3a9e92244e4c4a3d1e85274cd5" - }, - { - "a": "0x568439", - "b": "0x3180ebb22516be0000000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x3fe3f835a45e7805f70602523073b7e", - "a_m_sub_b_m": "0x310123c1b9ce010ff411f3fb5baf515af", - "a_m_mul_b_m": "0x2a4bb1fc145e2a1e1e827dcf7728d60ba", - "a_eq_b": false, - "a_m_pow_b": "0xfcfe181ec32f59cda257c5ab53b00c54" - }, - { - "a": "0x0", - "b": "0x2a91da2cd8bf06f64b4178592b76fc5b2", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2a91da2cd8bf06f64b4178592b76fc5b2", - "a_m_sub_b_m": "0x6af2d8d16b35891aec781a4825df8309", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x94d8f702", - "b": "0x343842590663940000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x3438425906639d4d8f702", - "a_m_sub_b_m": "0x314107b9ef722b4fb7aff39a232283fbd", - "a_m_mul_b_m": "0x1e5cc83623435f710093280000000", - "a_eq_b": false, - "a_m_pow_b": "0xe98efd63ec1ca007fe13deb27d1e8812" - }, - { - "a": "0x2683d59ea9cd200000000000000", - "b": "0x9", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2683d59ea9cd200000000000009", - "a_m_sub_b_m": "0x2683d59ea9cd1fffffffffffff7", - "a_m_mul_b_m": "0x15aa28293f836200000000000000", - "a_eq_b": false, - "a_m_pow_b": "0xb502a66a603ebd6ae238cbdf5e5e3d63" - }, - { - "a": "0x733a87187e4648000000000000000000", - "b": "0x30175db054e620000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x733a874895a3f854e620000000000000", - "a_m_sub_b_m": "0x733a86e866e897ab19e0000000000000", - "a_m_mul_b_m": "0x25d2b602fe2ec9a941c0d280b91ebb892", - "a_eq_b": false, - "a_m_pow_b": "0x4d681f5140cf93edeab5533f549636aa" - }, - { - "a": "0x56df7cce2c99ec000000000", - "b": "0x6f1852af59623400000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x6f6f322c278ecdec000000000", - "a_m_sub_b_m": "0x314107b980b0ec556ed35fe9add4f48bb", - "a_m_mul_b_m": "0x157beac228d4492ffb3503fdc205326cc", - "a_eq_b": false, - "a_m_pow_b": "0x12fd32daa2d1a3eea8912992b97cc5eef" - }, - { - "a": "0x36842e0a749ffa0000000", - "b": "0x15a7a8818c00b40000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x36858884fcb8ba0b40000", - "a_m_sub_b_m": "0x3682d38fec8739f4c0000", - "a_m_mul_b_m": "0x14d7d65ad46f3bc1370a0f54ea0631af5", - "a_eq_b": false, - "a_m_pow_b": "0x84e27c8471d5a697f608904b12fdebaf" - }, - { - "a": "0x3", - "b": "0x13d8e0e27a93b2000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x13d8e0e27a93b2003", - "a_m_sub_b_m": "0x314107b9ef725f87e630191b3341428be", - "a_m_mul_b_m": "0x3b8aa2a76fbb16000", - "a_eq_b": false, - "a_m_pow_b": "0x19277741a9423cf6f65ce857b9bc80799" - }, - { - "a": "0x1c1a7c35360", - "b": "0xae2e902f35abd0000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0xae2e902f35abec1a7c35360", - "a_m_sub_b_m": "0x314107b9eec430f7cad34e49c85129c1b", - "a_m_mul_b_m": "0xa6ba1cd717e48f6ce0f020ded0244b9e", - "a_eq_b": false, - "a_m_pow_b": "0x2c19b9c2e18d35670a9aba083682c4b21" - }, - { - "a": "0x3d0db4963ae3e", - "b": "0x3d0db4963ae3e", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x7a1b692c75c7c", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0xe8f88cb6eb62ede43968c5704", - "a_eq_b": true, - "a_m_pow_b": "0x26289882ee8f54dd6874c4c62d092ee77" - }, - { - "a": "0x0", - "b": "0x28f015abccc3680", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x28f015abccc3680", - "a_m_sub_b_m": "0x314107b9ef725f87f9e009e802083123b", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x3840c0715", - "b": "0x465cbc53b900140000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x465cbc53bc84200715", - "a_m_sub_b_m": "0x314107b9ef725f83943d34c2561474fd0", - "a_m_mul_b_m": "0xf76154617912af3e1d8da40000", - "a_eq_b": false, - "a_m_pow_b": "0x1681dd8ffbf349973dcd52b534646de30" - }, - { - "a": "0x7", - "b": "0x0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x7", - "a_m_sub_b_m": "0x7", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x0", - "b": "0x2a9fa4ea6f8db1a4d584d3c020ff9d318", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2a9fa4ea6f8db1a4d584d3c020ff9d318", - "a_m_sub_b_m": "0x6a162cf7fe4ade32484263d8cd5575a3", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x5276c0a3f6d17c0", - "b": "0x644fe2485f9e300000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x644fe24864c59c0a3f6d17c0", - "a_m_sub_b_m": "0x314107b9e92d616374618dbe51cbc607b", - "a_m_mul_b_m": "0x108fc912badb5b4548965769e67953c53", - "a_eq_b": false, - "a_m_pow_b": "0x54733fb1ac91585cff8b678b81672a36" - }, - { - "a": "0x2", - "b": "0xb2b9ab426a8568000000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0xb2b9ab426a8568000000000000000002", - "a_m_sub_b_m": "0x26156d05c8ca0907fa08f9fdadd4f48bd", - "a_m_mul_b_m": "0x165735684d50ad0000000000000000000", - "a_eq_b": false, - "a_m_pow_b": "0x2696550c584ede1359ac52868cb3abc26" - }, - { - "a": "0x2aa81e412c52cc00000", - "b": "0x21a389f9d4061a000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2ac9c1cb2626d21a000", - "a_m_sub_b_m": "0x2a867ab7327ec5e6000", - "a_m_mul_b_m": "0x65ee3be28d55b8b05ff0345125ad9b9a", - "a_eq_b": false, - "a_m_pow_b": "0xc43b8a95f7af5a49650ec21a8f3fac0e" - }, - { - "a": "0x24ee4ea130b20600000000000000", - "b": "0xcc1d4ef93d4cb80000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x31b02390c486d180000000000000", - "a_m_sub_b_m": "0x182c79b19cdd3a80000000000000", - "a_m_mul_b_m": "0x19d385af620df0c21783faca51539f63e", - "a_eq_b": false, - "a_m_pow_b": "0x306894a93287b8124cdf68fdfb9f9d329" - }, - { - "a": "0x1470d4fb6b628c000000000000000000", - "b": "0x1fa0d4b50af9c900000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x1470d4fb6b628dfa0d4b50af9c900000", - "a_m_sub_b_m": "0x1470d4fb6b628a05f2b4af5063700000", - "a_m_mul_b_m": "0x26962d11f8c743479eecca3763e02d14e", - "a_eq_b": false, - "a_m_pow_b": "0x2681f716b31cb411f8225ad7aedde8538" - }, - { - "a": "0x1534d83a3d72c2000000000000000", - "b": "0xf5e1df237cd120000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x1534d83a4cd0dff237cd120000000", - "a_m_sub_b_m": "0x1534d83a2e14a40dc832ee0000000", - "a_m_mul_b_m": "0x9467b068a90d0a05b9eb6b50c37c526e", - "a_eq_b": false, - "a_m_pow_b": "0x125588b67967ba9c5491d97ffc262ac7d" - }, - { - "a": "0x0", - "b": "0x28c470508e45720000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x28c470508e45720000000", - "a_m_sub_b_m": "0x314107b9ef7236c389b86bb83bd4f48bb", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x602acb42a9cc", - "b": "0x2239d6", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x602acb64e3a2", - "a_m_sub_b_m": "0x602acb206ff6", - "a_m_mul_b_m": "0xcdb68e9e24ea05c88", - "a_eq_b": false, - "a_m_pow_b": "0x232348b8645c380e3b6ff79e1d89e3b38" - }, - { - "a": "0x15965a020754ce0000000000000", - "b": "0x0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x15965a020754ce0000000000000", - "a_m_sub_b_m": "0x15965a020754ce0000000000000", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x1f1c02a115425e00", - "b": "0x1f1c02a115425e00", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x3e3805422a84bc00", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x3c7cbb39669a2f958b630a09a840000", - "a_eq_b": true, - "a_m_pow_b": "0x1e52406e83c22eabd39fa5aa2f5bc8719" - }, - { - "a": "0x2b2968fda10fd800000000000000000", - "b": "0x2b2968fda10fd800000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x5652d1fb421fb000000000000000000", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x2a97946fec2698c627a15b635a4500ffd", - "a_eq_b": true, - "a_m_pow_b": "0x7665f5ca617689362e33ad47b2985197" - }, - { - "a": "0x21477b6a4829", - "b": "0x21477b6a4829", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x428ef6d49052", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x45381c7170de6353c4b1691", - "a_eq_b": true, - "a_m_pow_b": "0x1d66ef8147f20e0089b35d8226081f14a" - }, - { - "a": "0x2036aedbd", - "b": "0x28915816ff329e0000000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x28915816ff329e00000000002036aedbd", - "a_m_sub_b_m": "0x8afafa2f03fc187fa08f9fdce0ba3678", - "a_m_mul_b_m": "0x1fb0efa6eefcce17081c73d16fb2c793b", - "a_eq_b": false, - "a_m_pow_b": "0x11f9ce180a3c1ef2be7c86c882d7400e7" - }, - { - "a": "0x8a84af4cb031f8000", - "b": "0x873e", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x8a84af4cb0320073e", - "a_m_sub_b_m": "0x8a84af4cb031ef8c2", - "a_m_mul_b_m": "0x492d8493e57d05e210000", - "a_eq_b": false, - "a_m_pow_b": "0x20c493be91d5dc8ca2c409f73fbdf69bb" - }, - { - "a": "0x6137e5028e77dc00000000000000000", - "b": "0x390881a2c41032000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x6170ed84313bec32000000000000000", - "a_m_sub_b_m": "0x60fedc80ebb3cbce000000000000000", - "a_m_mul_b_m": "0x21c8e0bf8e1170d2ac486157d1e5aa444", - "a_eq_b": false, - "a_m_pow_b": "0x19ef44f8fb2022931b889959159b2b9af" - }, - { - "a": "0xee66f", - "b": "0x65", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0xee6d4", - "a_m_sub_b_m": "0xee60a", - "a_m_mul_b_m": "0x5e0e9cb", - "a_eq_b": false, - "a_m_pow_b": "0x1c09ad8a53e473b09e349628722700b97" - }, - { - "a": "0x39df172ba4", - "b": "0x10582fc6f7866c0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x10583364e8f9264", - "a_m_sub_b_m": "0x314107b9ef725f87f9f8a1d184cee0d9f", - "a_m_mul_b_m": "0x3b1e0efa101f16831da41300", - "a_eq_b": false, - "a_m_pow_b": "0x21572ee1c1ab6bec51147d50d59ee22a3" - }, - { - "a": "0x3c7a9479e7749600000", - "b": "0x2d48457dff3254f2d47595b016c835975", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2d48457dff32552f4f0a0f978b5e35975", - "a_m_sub_b_m": "0x3f8c23bf0400ad1a027de350ba2bef46", - "a_m_mul_b_m": "0x99bd11ae2fc4d47b5853129ebb3511b6", - "a_eq_b": false, - "a_m_pow_b": "0x1de765c78da3b1da1ea46cbff7630a36d" - }, - { - "a": "0x24408c04c6f446806c1378e75627b9de7", - "b": "0x2834fb5192e64e0000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x24408c04c97796358541ddc75627b9de7", - "a_m_sub_b_m": "0x24408c04c470f6cb52e514075627b9de7", - "a_m_mul_b_m": "0x1765c322ac7d450d1711bfd38e4a0451d", - "a_eq_b": false, - "a_m_pow_b": "0xc42db8c63848e0eedb89244ea96a567b" - }, - { - "a": "0x1110124382161000000", - "b": "0x7729d32e9ee0c4000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x7729d32fafe1e8382161000000", - "a_m_sub_b_m": "0x314107b27cd52caf1c0efd7fc3e4f48bb", - "a_m_mul_b_m": "0x220c93c2e101de17b1dfeb164dfe66dea", - "a_eq_b": false, - "a_m_pow_b": "0x11659a9246852804703e8bb7b89470e1" - }, - { - "a": "0x124b3e", - "b": "0x794bf3c09c48", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x794bf3d2e786", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f268ee9a0f7b1", - "a_m_mul_b_m": "0x8aafdc459737ef170", - "a_eq_b": false, - "a_m_pow_b": "0x91825745b22e54707b40fcf49bbddfd3" - }, - { - "a": "0x2da7ecf999bd72", - "b": "0x4", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2da7ecf999bd76", - "a_m_sub_b_m": "0x2da7ecf999bd6e", - "a_m_mul_b_m": "0xb69fb3e666f5c8", - "a_eq_b": false, - "a_m_pow_b": "0x153b004349063d3b5b8ebd082b957554c" - }, - { - "a": "0x159bce9f494b5e000000000", - "b": "0x81be071d8a0f800000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x8317c4077ea435e000000000", - "a_m_sub_b_m": "0x314107b9e76c1ae4c0b14d5badd4f48bb", - "a_m_mul_b_m": "0x20c9f929d9c418250427ded9a0e9eafa9", - "a_eq_b": false, - "a_m_pow_b": "0x17120d8e0e1e78e748763206ae86b22e6" - }, - { - "a": "0xcd4788007", - "b": "0x2b6bca2a2be7929653c9a923672bbe7b3", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2b6bca2a2be7929653c9a9243473467ba", - "a_m_sub_b_m": "0x5d53d8fc38accf1a63f50db13f0be10f", - "a_m_mul_b_m": "0x3105bcad3f2923d311c7d90ae06a0e294", - "a_eq_b": false, - "a_m_pow_b": "0x61248a8bc0d652457088056876409062" - }, - { - "a": "0x2884b5178c487e0000000000000", - "b": "0x165", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2884b5178c487e0000000000165", - "a_m_sub_b_m": "0x2884b5178c487dffffffffffe9b", - "a_m_mul_b_m": "0x38811089d6a117b60000000000000", - "a_eq_b": false, - "a_m_pow_b": "0xccb9bc0dd9dcdbc5d5c370dc01074021" - }, - { - "a": "0xa21cf7575", - "b": "0x619e032bf7b", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x624020234f0", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f99cb1eebfeb5", - "a_m_mul_b_m": "0x3dd1099aebd05829ba37", - "a_eq_b": false, - "a_m_pow_b": "0x6e91ef2f22ea029cc881fa1dfec409a3" - }, - { - "a": "0x8bec3e31c6d30000000000000", - "b": "0x60e7e8358f43f80000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x8bec9f19af088f43f80000000", - "a_m_sub_b_m": "0x8bebdd49de9d70bc080000000", - "a_m_mul_b_m": "0x19ed3ca56aed26cd83ecf5027f49d01b7", - "a_eq_b": false, - "a_m_pow_b": "0x1aee18acd49979f369b5d583a22d42c89" - }, - { - "a": "0x7a0d32927c12b40000000000000", - "b": "0x297841b8aeba7e00000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x7a0d3292a58af5b8aeba7e00000", - "a_m_sub_b_m": "0x7a0d3292529a724751458200000", - "a_m_mul_b_m": "0x22638525dafe1d8fccd7ac7d5f1d3fa79", - "a_eq_b": false, - "a_m_pow_b": "0x25b45d37cde4744484c0aaefb1b87f44a" - }, - { - "a": "0xd7936a8f387a1", - "b": "0x2012677895c6be59658f16c91dd6d47e4", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2012677895c6be59658fee5c88660cf85", - "a_m_sub_b_m": "0x112ea04159aba12e947abac7fa8d58878", - "a_m_mul_b_m": "0x16bacfc0418c329ce985ec173be722845", - "a_eq_b": false, - "a_m_pow_b": "0x2c1de73367dac991189297543cdbf4244" - }, - { - "a": "0x4dc1265f8bf8980000", - "b": "0x4dc1265f8bf8980000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x9b824cbf17f1300000", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x2e86c7013f953b18489281701010d4e17", - "a_eq_b": true, - "a_m_pow_b": "0x2f31c138dd3879eced16b10866aff9970" - }, - { - "a": "0x767ef533f7397400000000000000000", - "b": "0xaaac263246886800000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x767ef5dea35fa646886800000000000", - "a_m_sub_b_m": "0x767ef4894b1341b9779800000000000", - "a_m_mul_b_m": "0x26f450463cd620322b7cea36e6e7b3889", - "a_eq_b": false, - "a_m_pow_b": "0x1277a1428b8a2b4e70e84d20158d1612b" - }, - { - "a": "0x2b4c25598c9d62000000", - "b": "0x2e91e70af224af354e4907635201910c6", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2e91e70af224b1ea109ea02d2821910c6", - "a_m_sub_b_m": "0x2af20aefd4db3076e158b6431f3637f5", - "a_m_mul_b_m": "0xe58d3a639c80ecb17c3b64526b438202", - "a_eq_b": false, - "a_m_pow_b": "0x2af7b49d67030f7305b8fbde1998b2b8" - }, - { - "a": "0x42eeee0c276ffc0000000000", - "b": "0x39dc4b87cf12c2000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x468cb2c4a461282000000000", - "a_m_sub_b_m": "0x3f512953aa7ecfe000000000", - "a_m_mul_b_m": "0x1e15bb041ac2a868b869c61213151b10b", - "a_eq_b": false, - "a_m_pow_b": "0x65af0360a9baeb157e8d2793b6aef610" - }, - { - "a": "0xac4cd9", - "b": "0x2b56b9357b34dc8b053f3c15842ce91c0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2b56b9357b34dc8b053f3c158437ade99", - "a_m_sub_b_m": "0x5ea4e84743d82fcf4c9bde829b2d03d4", - "a_m_mul_b_m": "0x2b4ef14b0d01caaeb46105f637514ac85", - "a_eq_b": false, - "a_m_pow_b": "0x22a4105b37df613b2638215289a57798b" - }, - { - "a": "0xa24516401b76600", - "b": "0xe95f2", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0xa24516401c5fbf2", - "a_m_sub_b_m": "0xa24516401a8d00e", - "a_m_mul_b_m": "0x93ed2d2c3d90f1bc6c00", - "a_eq_b": false, - "a_m_pow_b": "0x6f8ec5e30535303166462b753447553a" - }, - { - "a": "0x604364637119f8000", - "b": "0x21b7010", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x60436463713baf010", - "a_m_sub_b_m": "0x6043646370f840ff0", - "a_m_mul_b_m": "0xcad807dd80e95f961f80000", - "a_eq_b": false, - "a_m_pow_b": "0xfd0a7d80305c9f7513093b0ca579e777" - }, - { - "a": "0x305438386f922c0000000000000", - "b": "0x2e54c", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x305438386f922c000000002e54c", - "a_m_sub_b_m": "0x305438386f922bffffffffd1ab4", - "a_m_mul_b_m": "0x8bf21fbc0bb338c1100000000000000", - "a_eq_b": false, - "a_m_pow_b": "0x257ae4962cdf6db2ae9e1890a3a543184" - }, - { - "a": "0x257e7ef7b848610cfd21276c21519401c", - "b": "0x37c713d2a0fb", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x257e7ef7b848610cfd212ae8928ebe117", - "a_m_sub_b_m": "0x257e7ef7b848610cfd2123efb01469f21", - "a_m_mul_b_m": "0x29b2441626f1218d14807abc032c0c2d9", - "a_eq_b": false, - "a_m_pow_b": "0x273f04e68890b863cf9c8abe920598673" - }, - { - "a": "0x61cf9175d758a0000", - "b": "0x24a76e032a9", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x61cf919a7ec6a32a9", - "a_m_sub_b_m": "0x61cf91512fea9cd57", - "a_m_mul_b_m": "0xe0128e4dc5a5ad922678c1a0000", - "a_eq_b": false, - "a_m_pow_b": "0x2f75d26092c12573901448308c4a890be" - }, - { - "a": "0x0", - "b": "0x0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x0", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x0", - "a_eq_b": true, - "a_m_pow_b": "0x1" - }, - { - "a": "0x37aa6dd68d60d2", - "b": "0x37aa6dd68d60d2", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x6f54dbad1ac1a4", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0xc1aaca840d3c70806c6e3f22c44", - "a_eq_b": true, - "a_m_pow_b": "0x145e685091838e9cce41f0480429cf6c1" - }, - { - "a": "0x6e", - "b": "0x17d5da95f0377500000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x17d5da95f037750000000000006e", - "a_m_sub_b_m": "0x3141063c91c9008482b8f9fdadd4f4929", - "a_m_mul_b_m": "0xa3de3ec6d37d44600000000000000", - "a_eq_b": false, - "a_m_pow_b": "0x954a50b402f8c15a2f71e10275a87d3a" - }, - { - "a": "0x22e4025346987b05274219d3ecdc39412", - "b": "0x142", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x22e4025346987b05274219d3ecdc39554", - "a_m_sub_b_m": "0x22e4025346987b05274219d3ecdc392d0", - "a_m_mul_b_m": "0x4e00b2589eda760b125d6a11b5637818", - "a_eq_b": false, - "a_m_pow_b": "0x1da9c3d0a0fc64a3e3f60a277f82b1a6a" - }, - { - "a": "0x252a33c33037e5725e5a1bdaea747795e", - "b": "0x3dc983a887c21400", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x252a33c33037e5726236b41572f098d5e", - "a_m_sub_b_m": "0x252a33c33037e5725a7d83a061f85655e", - "a_m_mul_b_m": "0x21a6d596be8e104a7b3e55b3783df8097", - "a_eq_b": false, - "a_m_pow_b": "0xe7249c64051117f30e6d7f693e0a6939" - }, - { - "a": "0x130b6bbc0addc6", - "b": "0x2d39a4bb0d62b68d41880fa4b840fbb0b", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2d39a4bb0d62b68d4189405b7401a98d1", - "a_m_sub_b_m": "0x40762fee20fa8fab8821b0fb154a6b76", - "a_m_mul_b_m": "0x269195668f82d6569d97ac645818ed33b", - "a_eq_b": false, - "a_m_pow_b": "0x14fef800fbce52b95f48eab88bd5224f3" - }, - { - "a": "0x26d8d8f1326ab000", - "b": "0x26d8d8f1326ab000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x4db1b1e264d56000", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x5e5181669d4a89cffcd393639000000", - "a_eq_b": true, - "a_m_pow_b": "0x1d0643aa72f5d932b25ad9ab07d8c141f" - }, - { - "a": "0x27f65853ae", - "b": "0x27f65853ae", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x4fecb0a75c", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x63cfbf75e500afa4a44", - "a_eq_b": true, - "a_m_pow_b": "0x228a787ee28109cf52f3c64b19bdd8b66" - }, - { - "a": "0x9b08b1b45dcf580000", - "b": "0x94a1e2a776d6a80000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x94ab9332921c84f580000", - "a_m_sub_b_m": "0x314107b9ef71caefc7ec9e6ce2ca748bb", - "a_m_mul_b_m": "0xe1473774b97ee8804afc05d9344bcfcc", - "a_eq_b": false, - "a_m_pow_b": "0xa8cc8121b2d58714d694b64c211fb636" - }, - { - "a": "0x2517b1eb40b2a00000000", - "b": "0x12598e9846ab0b000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x127ea64a31ebbda00000000", - "a_m_sub_b_m": "0x314107b9ef602b1113ad8fa54dd4f48bb", - "a_m_mul_b_m": "0x24ec6944ccfc65756270605290f27da13", - "a_eq_b": false, - "a_m_pow_b": "0x10bdf3d96cb30ed88cd4749c1e3072d1" - }, - { - "a": "0x0", - "b": "0x7cdf2c7d", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x7cdf2c7d", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fda60701c3e", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x1216265a8ad27d00", - "b": "0x3", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x1216265a8ad27d03", - "a_m_sub_b_m": "0x1216265a8ad27cfd", - "a_m_mul_b_m": "0x3642730fa0777700", - "a_eq_b": false, - "a_m_pow_b": "0x16a72a34c13607b8da0747b811e4de723" - }, - { - "a": "0x2d2f744290671493804fe973d261cec19", - "b": "0x0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2d2f744290671493804fe973d261cec19", - "a_m_sub_b_m": "0x2d2f744290671493804fe973d261cec19", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0xb3f9553dbdaf58000000", - "b": "0xa", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0xb3f9553dbdaf5800000a", - "a_m_sub_b_m": "0xb3f9553dbdaf57fffff6", - "a_m_mul_b_m": "0x707bd546968d970000000", - "a_eq_b": false, - "a_m_pow_b": "0x2ab9befcd481856ef3ba16120a34d411d" - }, - { - "a": "0x9b6bc5c0024", - "b": "0x285f2d46c36f8e0000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x285f2d507a2bea0024", - "a_m_sub_b_m": "0x314107b9ef725f857416262ce2a1d48df", - "a_m_mul_b_m": "0x18829f614a7c7a37a5283aff80000", - "a_eq_b": false, - "a_m_pow_b": "0x1cd3a8052af3ed62f73acc49669d3f42" - }, - { - "a": "0x317942b2eeeaae00000000", - "b": "0x25fc8def604b6a00", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x317942d8eb789d604b6a00", - "a_m_sub_b_m": "0x3179428cf25cbe9fb49600", - "a_m_mul_b_m": "0x248e397d2b4a02521ac8ddaf027ac9df6", - "a_eq_b": false, - "a_m_pow_b": "0x1259aa23c7a182e385cb0f85fa6bc83c8" - }, - { - "a": "0xec4a394de2d5900000000", - "b": "0x354a29099b84240000000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x409214fac12b0c23f44e8d7e22b0b745", - "a_m_sub_b_m": "0x2d37e66a4361875a2d5fd6d0eba9e9176", - "a_m_mul_b_m": "0x2b06ba47612c6c2f859a2ee1228366c24", - "a_eq_b": false, - "a_m_pow_b": "0x92ef4fbe9e2f18216337f22947ff7e7f" - }, - { - "a": "0x7", - "b": "0x25", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2c", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fdadd4f489d", - "a_m_mul_b_m": "0x103", - "a_eq_b": false, - "a_m_pow_b": "0xea496e6af6c04ef2c300b8bea7" - }, - { - "a": "0x286093b8de0e5a000000000000000000", - "b": "0x2c48ae37406dc1579647640a1b6a659ef", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2eceb772ce4ea6f79647640a1b6a659ef", - "a_m_sub_b_m": "0x77e62be3ce583d063c195f3926a8eecc", - "a_m_mul_b_m": "0x9791b577e1c7d5939271105fbc7a5e4d", - "a_eq_b": false, - "a_m_pow_b": "0x158312a2211c43b63ca3bca72f8105eef" - }, - { - "a": "0x137c65b6cd36e00", - "b": "0x4237b3", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x137c65b6d15a5b3", - "a_m_sub_b_m": "0x137c65b6c91364d", - "a_m_mul_b_m": "0x50a4f92f64d0e077ea00", - "a_eq_b": false, - "a_m_pow_b": "0x1a3d0c5a13f7a60c023b685eb3bb7e8e9" - }, - { - "a": "0xa825fb926267c80000000000000000", - "b": "0xeb088d71c59b", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0xa825fb926267c80000eb088d71c59b", - "a_m_sub_b_m": "0xa825fb926267c7ffff14f7728e3a65", - "a_m_mul_b_m": "0x30cd0a2dab9de2f56d71aa733fc51013a", - "a_eq_b": false, - "a_m_pow_b": "0x14a4ca372ad3dd53ed5c7ce93171cacca" - }, - { - "a": "0x2ba8844439e6b800", - "b": "0x2d02cd7e3", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2ba884470a138fe3", - "a_m_sub_b_m": "0x2ba8844169b9e01d", - "a_m_mul_b_m": "0x7ad199c7dc156e47bc1d2800", - "a_eq_b": false, - "a_m_pow_b": "0x108342cb5b0eef0e97bea441983cf0769" - }, - { - "a": "0x2aa880354277c", - "b": "0x2aa880354277c", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x5551006a84ef8", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x71bb8f9ffebd5b856d7770410", - "a_eq_b": true, - "a_m_pow_b": "0x2cdef543b96cfbbaaae4181d795533cd3" - }, - { - "a": "0x2ba5612f7600aa45e44e1b08c69199a8a", - "b": "0x2ecdb0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2ba5612f7600aa45e44e1b08c6948683a", - "a_m_sub_b_m": "0x2ba5612f7600aa45e44e1b08c68eaccda", - "a_m_mul_b_m": "0x864335197455514daf65804187f88ef3", - "a_eq_b": false, - "a_m_pow_b": "0x245eec7b0e38305e97f5f7837d2d2e50" - }, - { - "a": "0x3bc", - "b": "0x7275ef574b0e340000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x7275ef574b0e3403bc", - "a_m_sub_b_m": "0x314107b9ef725f80d2aa0488fcf1b4c77", - "a_m_mul_b_m": "0x1ab7069c9fc490a300000", - "a_eq_b": false, - "a_m_pow_b": "0x1c3fece2316e62d98ebbe22964f8c0ef9" - }, - { - "a": "0x7d6478b", - "b": "0x54d6798d5ad4", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x54d68163a25f", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f4b046b983572", - "a_m_mul_b_m": "0x298e05205cfed291d1c", - "a_eq_b": false, - "a_m_pow_b": "0x21f541f5eeff6bcb427f2a3a5af923a40" - }, - { - "a": "0x23371af07dfe4a0000000000", - "b": "0x8920d8e7190c6800000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x8920fc1e33fce5fe4a0000000000", - "a_m_sub_b_m": "0x3140ff27e4175fa63b68de9dadd4f48bb", - "a_m_mul_b_m": "0x7009cc73f7d2359d0ab35aaf4ab7b581", - "a_eq_b": false, - "a_m_pow_b": "0x2eb258fe89b31c4090f54825bd4d2b4cf" - }, - { - "a": "0x1dd202024363f80000000000000000", - "b": "0x52bce88239d8c4000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x1dd202076f3280239d8c4000000000", - "a_m_sub_b_m": "0x1dd201fd17956fdc6273c000000000", - "a_m_mul_b_m": "0x2b6800bd53d097eb1380b696bad46681b", - "a_eq_b": false, - "a_m_pow_b": "0x749cf65bbc24731ab4f96aba31342828" - }, - { - "a": "0x19d5df9a658e2d00000000000", - "b": "0x21177f56b90b", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x19d5df9a658e2f1177f56b90b", - "a_m_sub_b_m": "0x19d5df9a658e2aee880a946f5", - "a_m_mul_b_m": "0x1d42c06b1e99e32bbfd63948110fcba87", - "a_eq_b": false, - "a_m_pow_b": "0x15ae10c45fd860364698619a8beab064a" - }, - { - "a": "0x2a4cf691a143ee000000000000000000", - "b": "0x103e98", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x2a4cf691a143ee000000000000103e98", - "a_m_sub_b_m": "0x2a4cf691a143edffffffffffffefc168", - "a_m_mul_b_m": "0x6b393bb4f033c737c4556157864d3218", - "a_eq_b": false, - "a_m_pow_b": "0x117f2cd45d63f93e80448e3a7be951495" - }, - { - "a": "0x0", - "b": "0x95aa14598b7180000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48bb", - "a_m_add_b_m": "0x95aa14598b7180000", - "a_m_sub_b_m": "0x314107b9ef725f87645ee5a42263748bb", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - } - ], - "even_mod_130": [ - { - "a": "0x63b4dfd", - "b": "0x2d96d8c4bb744a000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x2d96d8c4bb744a0063b4dfd", - "a_m_sub_b_m": "0x314107b9ef44c8af354d85b3ae38a96b7", - "a_m_mul_b_m": "0x11c18bbff0354584a2f22000000000", - "a_eq_b": false, - "a_m_pow_b": "0x1fbf7663788416877c17f5ccd65422ea1" - }, - { - "a": "0x8c937e52e82748000000000000", - "b": "0x8c937e52e82748000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x11926fca5d04e90000000000000", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x1d6c54700b3282ffa9e5bba4fff004350", - "a_eq_b": true, - "a_m_pow_b": "0x1592e4d2faa000b861f524f2f919bf912" - }, - { - "a": "0x59fc682bd865d000", - "b": "0x201b9937a", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x59fc682dda1f637a", - "a_m_sub_b_m": "0x59fc6829d6ac3c86", - "a_m_mul_b_m": "0xb49407fdf66e398ae6f52000", - "a_eq_b": false, - "a_m_pow_b": "0x229835d3fd5d5e7d935ad2ba098f2d1c0" - }, - { - "a": "0xf82940b0f4c8480000000000000000", - "b": "0x2e2cd159aebba80d2820bc51ddb3aefa6", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x2e3c53edb9caf491a820bc51ddb3aefa6", - "a_m_sub_b_m": "0x323b8f44bc603ff51e83dabd02145914", - "a_m_mul_b_m": "0x21b5fc4b57b80c90b976e93925733af96", - "a_eq_b": false, - "a_m_pow_b": "0x2a19fd7bc369251f453afcdc39a048996" - }, - { - "a": "0x0", - "b": "0x23aeedeb178176", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x23aeedeb178176", - "a_m_sub_b_m": "0x314107b9ef725f87fa06bf0ecf237c744", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x1d6267a97f6f4f000000000", - "b": "0x4d5c9b", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x1d6267a97f6f4f0004d5c9b", - "a_m_sub_b_m": "0x1d6267a97f6f4efffb2a365", - "a_m_mul_b_m": "0x8e13a55d101e6ebc8d5000000000", - "a_eq_b": false, - "a_m_pow_b": "0x12120e65bf9fd9fb95c1932a8542460a8" - }, - { - "a": "0x281eb88e5d549faad44c8fd001a0ff218", - "b": "0x3a7e1e5f", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x281eb88e5d549faad44c8fd00548e1077", - "a_m_sub_b_m": "0x281eb88e5d549faad44c8fcffdf91d3b9", - "a_m_mul_b_m": "0xe76e06db892cd4c2f317b4243ca53684", - "a_eq_b": false, - "a_m_pow_b": "0x134e17c060096750cbbfbca327f425f7e" - }, - { - "a": "0x8e2f6fee957008000000", - "b": "0x473c940132402800", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x8e2fb72b29713a402800", - "a_m_sub_b_m": "0x8e2f28b2016ed5bfd800", - "a_m_mul_b_m": "0xf188c5371ec1a02d171f1e7fd313599c", - "a_eq_b": false, - "a_m_pow_b": "0x38a230d28e4ca702973f3eae6b845210" - }, - { - "a": "0xfe7", - "b": "0x6a2a5e75a241", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x6a2a5e75b228", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f35b07ed9b660", - "a_m_mul_b_m": "0x69847c420a737a7", - "a_eq_b": false, - "a_m_pow_b": "0x28f565776cb96cf44ca8a72744581b2b7" - }, - { - "a": "0xa5", - "b": "0x13", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xb8", - "a_m_sub_b_m": "0x92", - "a_m_mul_b_m": "0xc3f", - "a_eq_b": false, - "a_m_pow_b": "0xe99e6e467cff979c9403fff1f83961f1" - }, - { - "a": "0x4abf6d9ec40d7c000000", - "b": "0x236b62d2f122", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x4abf6d9ee778ded2f122", - "a_m_sub_b_m": "0x4abf6d9ea0a2192d0ede", - "a_m_mul_b_m": "0xa5786da6590a07fd62e738678000000", - "a_eq_b": false, - "a_m_pow_b": "0x9e4c86ecefe36b01f0a18861989c2828" - }, - { - "a": "0x2368d50b355170000000000", - "b": "0xccfcb8159", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x2368d50b355170ccfcb8159", - "a_m_sub_b_m": "0x2368d50b35516f330347ea7", - "a_m_mul_b_m": "0x1c5a7e6cfa29e17e762bff0000000000", - "a_eq_b": false, - "a_m_pow_b": "0x2dbc8f900bb49ec653a4ad3fedfdd2e76" - }, - { - "a": "0x0", - "b": "0xf19", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xf19", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fdadd4f39a1", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x10be6135dc7a6f00000000000", - "b": "0x2b08554bda", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x10be6135dc7a6f02b08554bda", - "a_m_sub_b_m": "0x10be6135dc7a6efd4f7aab426", - "a_m_mul_b_m": "0x1ef76f16eeaf0324cd49da207e5aa05d4", - "a_eq_b": false, - "a_m_pow_b": "0x734ff7dfc07a3e56285e21198c4a2090" - }, - { - "a": "0x37bd659caf433200000000", - "b": "0x108fe6b571fe5600000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x108fe6ed2f63f2af433200000000", - "a_m_sub_b_m": "0x314106b0f10a843e6e73ee30cdd4f48ba", - "a_m_mul_b_m": "0x25a7c0e83c2e7de1876b408f996e3db3a", - "a_eq_b": false, - "a_m_pow_b": "0xaeaf71c1019e8778bd63b25e28f9f12" - }, - { - "a": "0x1e5ea918a403e7000000000000000", - "b": "0x63922376dbd8", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x1e5ea918a403e700063922376dbd8", - "a_m_sub_b_m": "0x1e5ea918a403e6fff9c6ddc892428", - "a_m_mul_b_m": "0x2020eda4bd3614a95be5e08527d48f80", - "a_eq_b": false, - "a_m_pow_b": "0x1e5a30ef394fc7321b2ea9fb0cb3cca30" - }, - { - "a": "0xd795f2c5013b8800000000000", - "b": "0x2c41ebadbbe4140000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x2c41f9271b106413b8800000000000", - "a_m_sub_b_m": "0x313e439c0c2c940bbb4481fdadd4f48ba", - "a_m_mul_b_m": "0x53f824dd0b500358d45a342e3d67737e", - "a_eq_b": false, - "a_m_pow_b": "0x889b7c5d3c822e01178d119eff98ab24" - }, - { - "a": "0x26b58a97c971c400000000000000000", - "b": "0x351933d5", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x26b58a97c971c4000000000351933d5", - "a_m_sub_b_m": "0x26b58a97c971c3fffffffffcae6cc2b", - "a_m_mul_b_m": "0x2266f51964f595ef73b0e6eeeb577908c", - "a_eq_b": false, - "a_m_pow_b": "0x2ed3ed2645c10a18f9286e0dd6ef3adc4" - }, - { - "a": "0x158082d706d3de00", - "b": "0xd0a4d05d33fb000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xd0a4d05d33fc58082d706d3de00", - "a_m_sub_b_m": "0x314106e94aa202540061022b1e42326ba", - "a_m_mul_b_m": "0x177bed0f68d150f2e5220553acb00539c", - "a_eq_b": false, - "a_m_pow_b": "0x36f6a762813d096976b95be1336c7602" - }, - { - "a": "0x15f56eb93d0", - "b": "0x20a5a0322c57842a9934c472a0c72fe13", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x20a5a0322c57842a9934c4889635e91e3", - "a_m_sub_b_m": "0x109b6787c31adb5d60d435a1027c7de77", - "a_m_mul_b_m": "0x1a0f926e84bb65d2ec70b7099eab66ca4", - "a_eq_b": false, - "a_m_pow_b": "0x25a4ab0e7734d61deb9894ac9d22bf950" - }, - { - "a": "0x599ad3364ce", - "b": "0x5398dac7", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x59a00cc3f95", - "a_m_sub_b_m": "0x599599a8a07", - "a_m_mul_b_m": "0x1d42b2fb8260b1ac822", - "a_eq_b": false, - "a_m_pow_b": "0x9b94d3eb88f0a4d97540a29b361501f0" - }, - { - "a": "0x0", - "b": "0x0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x0", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x0", - "a_eq_b": true, - "a_m_pow_b": "0x1" - }, - { - "a": "0x2e9ef02c46643800000000000000000", - "b": "0x1", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x2e9ef02c46643800000000000000001", - "a_m_sub_b_m": "0x2e9ef02c466437fffffffffffffffff", - "a_m_mul_b_m": "0x2e9ef02c46643800000000000000000", - "a_eq_b": false, - "a_m_pow_b": "0x2e9ef02c46643800000000000000000" - }, - { - "a": "0x19a", - "b": "0x323d996f31d65", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x323d996f31eff", - "a_m_sub_b_m": "0x314107b9ef725f87fa08c7c01465c2cef", - "a_m_mul_b_m": "0x5076a7bc15d13c2", - "a_eq_b": false, - "a_m_pow_b": "0xb85190334cc0ad09ef967759ea0400f6" - }, - { - "a": "0x2f3c58d8cc6ff", - "b": "0xd9938a000fc21800000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xd9938a2f4c1af0cc6ff", - "a_m_sub_b_m": "0x314107b9ef725eae667f292a4495c0fb9", - "a_m_mul_b_m": "0x2825606d54957e48d7f9cf0e5e800000", - "a_eq_b": false, - "a_m_pow_b": "0x626d3f8843ec9d66a76c5bc9cfafe4f" - }, - { - "a": "0x105f95d978104a000000000", - "b": "0x21a7e256db6ffe12c1a6f0c9af1f7e90f", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x21a7e256db805da89b1f0113af1f7e90f", - "a_m_sub_b_m": "0xf9925631412c10b11da197dfeb575fab", - "a_m_mul_b_m": "0x17f7a198e6b750b68d98abd29df53199e", - "a_eq_b": false, - "a_m_pow_b": "0x22d7acdf6cf36ed4bd94c4bd03bd3580c" - }, - { - "a": "0x0", - "b": "0x7939992", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x7939992", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fdad5bbaf28", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x6bd00134ea66c0", - "b": "0x33f6a4566e085e00", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x34627457a2f2c4c0", - "a_m_sub_b_m": "0x314107b9ef725f87f6d04cb85a431517a", - "a_m_mul_b_m": "0x15e24f545a88eb88385567c7ba8000", - "a_eq_b": false, - "a_m_pow_b": "0x31678b9cd85710f6035674dee003ea7e" - }, - { - "a": "0x95e73f", - "b": "0x4a1", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x95ebe0", - "a_m_sub_b_m": "0x95e29e", - "a_m_mul_b_m": "0x2b5e36a9f", - "a_eq_b": false, - "a_m_pow_b": "0x2d6f8176259fc59414a977e4002bb0d87" - }, - { - "a": "0x12b49fde96473a000000000000000", - "b": "0x2868fd769c01ea", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x12b49fde96473a02868fd769c01ea", - "a_m_sub_b_m": "0x12b49fde964739fd797028963fe16", - "a_m_mul_b_m": "0x2519a6920549d317aa20c385268c52f36", - "a_eq_b": false, - "a_m_pow_b": "0x9709d93b35911474157330019fa6da68" - }, - { - "a": "0xe204be894f5ab80000", - "b": "0xa1c3289f", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xe204be894ffc7b289f", - "a_m_sub_b_m": "0xe204be894eb8f4d761", - "a_m_mul_b_m": "0x8ed1494e9c374b809e18480000", - "a_eq_b": false, - "a_m_pow_b": "0x20a32b7f59e8d2040d281f8a779b145c8" - }, - { - "a": "0x27e54204ca86c20", - "b": "0xa2968", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x27e54204cb29588", - "a_m_sub_b_m": "0x27e54204c9e42b8", - "a_m_mul_b_m": "0x1956880e57fa56fd0d00", - "a_eq_b": false, - "a_m_pow_b": "0x2b1288794136e3350ed94ab85396770a2" - }, - { - "a": "0x14f3369", - "b": "0xcb", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x14f3434", - "a_m_sub_b_m": "0x14f329e", - "a_m_mul_b_m": "0x109cdc443", - "a_eq_b": false, - "a_m_pow_b": "0x269511450b44d7c7148874a4e09b82601" - }, - { - "a": "0x1c7c65fb3f0ce90000000", - "b": "0x14ff5e7", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x1c7c65fb3f0ce914ff5e7", - "a_m_sub_b_m": "0x1c7c65fb3f0ce8eb00a19", - "a_m_mul_b_m": "0x25622635a0faf226a33f0000000", - "a_eq_b": false, - "a_m_pow_b": "0xe0fe1c0e898244546807fc4bfb24557a" - }, - { - "a": "0x45", - "b": "0x6dd6033f19cc6c00000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x6dd6033f19cc6c00000000045", - "a_m_sub_b_m": "0x314107b9819c5c48e03c8dfdadd4f48ff", - "a_m_mul_b_m": "0x1d9aaee001f4191c00000000000", - "a_eq_b": false, - "a_m_pow_b": "0x1c3b856b3498e95fa5bd720f0d2a3bfd1" - }, - { - "a": "0x643268b6cc4", - "b": "0xd74f278e3710a000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xd74f278e9b4308b6cc4", - "a_m_sub_b_m": "0x314107b9ef725eb0aae16c2acf9dab57e", - "a_m_mul_b_m": "0x544550fb2d6a0c885e40c3a8000000", - "a_eq_b": false, - "a_m_pow_b": "0x22dcce713212613d2b8ebc32e76973a2e" - }, - { - "a": "0x11b9c2c830ca41000", - "b": "0x13", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x11b9c2c830ca41013", - "a_m_sub_b_m": "0x11b9c2c830ca40fed", - "a_m_mul_b_m": "0x150c974db9f02d3000", - "a_eq_b": false, - "a_m_pow_b": "0x25304faec40ee454b8b1668312100e450" - }, - { - "a": "0x2761222f6b4", - "b": "0x0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x2761222f6b4", - "a_m_sub_b_m": "0x2761222f6b4", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x31e0e36f2fd222000000000000000", - "b": "0x2e5ca781e4d012000000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x2e5fc5901bc30f222000000000000000", - "a_m_sub_b_m": "0x2e5b6f22b4948e3a1c08f9fdadd4f48ba", - "a_m_mul_b_m": "0x1fc4c5c57145fe41e4c6ff0a86bd7537e", - "a_eq_b": false, - "a_m_pow_b": "0x2d300a90a464bb1bec1c54e892500e208" - }, - { - "a": "0x56228be88787b40000000", - "b": "0x1f89a70", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x56228be88787b41f89a70", - "a_m_sub_b_m": "0x56228be88787b3e076590", - "a_m_mul_b_m": "0xa9c7f9e911ea6d4da6c00000000", - "a_eq_b": false, - "a_m_pow_b": "0xd90443f86eefbd32ec52b4ae311bbd4c" - }, - { - "a": "0x26bd88c22ef8a00000000000", - "b": "0x1eb474b948dd180000000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x1eb474b94b48f08c22ef8a00000000000", - "a_m_sub_b_m": "0x128c9300a90120141cf883fdadd4f48ba", - "a_m_mul_b_m": "0x25077e5c8c31cb0e0ee320339c945dea6", - "a_eq_b": false, - "a_m_pow_b": "0x1083bcb8d243a4b13ee2ea576f23b8ba0" - }, - { - "a": "0x6a0c", - "b": "0x1016e287cde1630000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x1016e287cde1630000006a0c", - "a_m_sub_b_m": "0x314107b9ee70f15f7d2ae3cdadd4fb2c6", - "a_m_mul_b_m": "0x6aa3aded99cf98ea40000000000", - "a_eq_b": false, - "a_m_pow_b": "0x2747a8f1577241abb1b27f95eb823dd54" - }, - { - "a": "0x42", - "b": "0x423c22726d695c00000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x423c22726d695c00042", - "a_m_sub_b_m": "0x314107b9ef725f45bde687904478f48fc", - "a_m_mul_b_m": "0x111380e1803529b800000", - "a_eq_b": false, - "a_m_pow_b": "0xa319b9ace16768faac34df410931bd54" - }, - { - "a": "0x50f6c18a06efa80000000", - "b": "0x391ce8855cc4300000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x391ce88561d39c18a06efa80000000", - "a_m_sub_b_m": "0x313d75eb671ce43bbb9300ed55d4f48ba", - "a_m_mul_b_m": "0x1c62ec3f7e746ba8f67d460ee31bd28f0", - "a_eq_b": false, - "a_m_pow_b": "0x20db0c676e2b0926179c15c122bb075c0" - }, - { - "a": "0x180", - "b": "0x5b6a10d", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x5b6a28d", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fdad798a92d", - "a_m_mul_b_m": "0x891f19380", - "a_eq_b": false, - "a_m_pow_b": "0x2964743a85d4f75f69e60ebab06dbc9e4" - }, - { - "a": "0x760", - "b": "0x760", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xec0", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x366400", - "a_eq_b": true, - "a_m_pow_b": "0x1977fc11d0a1fe766559409f8147afab6" - }, - { - "a": "0x16fbf7d895cc1c000000000000000", - "b": "0x176381bba5b7f300", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x16fbf7d895cc1d76381bba5b7f300", - "a_m_sub_b_m": "0x16fbf7d895cc1a89c7e445a480d00", - "a_m_mul_b_m": "0x15ffbacaa7bea469680cd1cc9923d6764", - "a_eq_b": false, - "a_m_pow_b": "0x2cda2a4590053e25fc3cbe5bab76d589e" - }, - { - "a": "0x46b8997ff2a994000000000000000", - "b": "0x179f2c1208d1dc00000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x17e5e4ab88c48594000000000000000", - "a_m_sub_b_m": "0x3129af4676e980558e08f9fdadd4f48ba", - "a_m_mul_b_m": "0x20ac17dc000a74450da11bbeca4b91222", - "a_eq_b": false, - "a_m_pow_b": "0x2e17135169ad99218ec676d6b85d142fe" - }, - { - "a": "0x3167af3861a7d200000000000000000", - "b": "0x3167af3861a7d200000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x62cf5e70c34fa400000000000000000", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x1ccd89f17a2f428a002ec809b2f2a1c38", - "a_eq_b": true, - "a_m_pow_b": "0x20a1ff4805235494921962133772799f8" - }, - { - "a": "0x84fde69c34a7f000", - "b": "0x4581c38404e90", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x85023eb86ce83e90", - "a_m_sub_b_m": "0x84f98e7ffc67a170", - "a_m_mul_b_m": "0x241bd8ab4b08b3a857664c9970000", - "a_eq_b": false, - "a_m_pow_b": "0x2d9f4c553f11fe2535f6e5837d6a280aa" - }, - { - "a": "0x79f37a0c7d5d48000000", - "b": "0x10", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x79f37a0c7d5d48000010", - "a_m_sub_b_m": "0x79f37a0c7d5d47fffff0", - "a_m_mul_b_m": "0x79f37a0c7d5d480000000", - "a_eq_b": false, - "a_m_pow_b": "0x2178a80fabfe6d88e53d56940738cdf18" - }, - { - "a": "0x382af26b78b9e20000000", - "b": "0x112f293fbc05030000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x495a1bab34bee50000000", - "a_m_sub_b_m": "0x26fbc92bbcb4df0000000", - "a_m_mul_b_m": "0xe77f8bf21f21a5b911282a76bae2e508", - "a_eq_b": false, - "a_m_pow_b": "0x2db27609fb7654e6a15473aa9917291d6" - }, - { - "a": "0x55d3eb5ed6fb000000", - "b": "0x55d3eb5ed6fb000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xaba7d6bdadf6000000", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x2efb7bc2b06cb7e585c1b5afc23307610", - "a_eq_b": true, - "a_m_pow_b": "0x1fdb868e003c83f94e99fb19aa35b04c0" - }, - { - "a": "0x3059ebb2ed1cae1937ed61f4ee8751766", - "b": "0x295930d929f77a0000000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x287214d227a1c8913de467f740b25ceac", - "a_m_sub_b_m": "0x700bad9c325341937ed61f4ee8751766", - "a_m_mul_b_m": "0x18c3f896bff0ddf049b8612edf0d2e65e", - "a_eq_b": false, - "a_m_pow_b": "0x29908d8dc2134e67db8a34d2a351f21da" - }, - { - "a": "0x6e4e75a12e4f7c000000000000", - "b": "0x6e4e75a12e4f7c000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xdc9ceb425c9ef8000000000000", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x1861ac776ff78607f6895d52c6e909126", - "a_eq_b": true, - "a_m_pow_b": "0x10c2ce32e1c0797e51dbac0e8b10dbac2" - }, - { - "a": "0xf8f0f9a4c3e3f000000000000000", - "b": "0x3218cfdd6f957c000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xf9231274a153857c000000000000", - "a_m_sub_b_m": "0xf8bee0d4e6745a84000000000000", - "a_m_mul_b_m": "0x145cb6d2f1458069d03428ea5f0a916aa", - "a_eq_b": false, - "a_m_pow_b": "0xaf7ddd06123bc699a1c738f266d82f1a" - }, - { - "a": "0xf9206b13f4c4c8000000000", - "b": "0xeaa160203dd34", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xf9206b13f5af6960203dd34", - "a_m_sub_b_m": "0xf9206b13f3da269fdfc22cc", - "a_m_mul_b_m": "0x763deae48602aeca82254c690b59bc08", - "a_eq_b": false, - "a_m_pow_b": "0x8e5cd3d6237cb76737b65b18e71cb94a" - }, - { - "a": "0x273c305e3a80", - "b": "0x3f70f21e7807c20000000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xe2fea648895627805f708761530ef1c6", - "a_m_sub_b_m": "0x23111d5566dcfd0ff411f66f1eafccbf4", - "a_m_mul_b_m": "0x36681287de5d568563f029c1605f3590", - "a_eq_b": false, - "a_m_pow_b": "0x7dcfb6a9f1eff7be67938eee52be8326" - }, - { - "a": "0xcb720f85201ed80000000000000", - "b": "0x108675e0e91f36000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xcc7a76e32eb0cb6000000000000", - "a_m_sub_b_m": "0xca69a827118ce4a000000000000", - "a_m_mul_b_m": "0x2de03891615d7be7c83bcc8297d38bb12", - "a_eq_b": false, - "a_m_pow_b": "0xe7ff579f46539c8f6e0182e54a1053b8" - }, - { - "a": "0x10fe49b649e", - "b": "0x2cda840fd4adb0798039d60ba9c993735", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x2cda840fd4adb0798039d61ca81349bd3", - "a_m_sub_b_m": "0x46683aa1ac4af0e79cf2403025517623", - "a_m_mul_b_m": "0x283ec487113033bd51892d612bea38e4c", - "a_eq_b": false, - "a_m_pow_b": "0x1345b8873d13b5cfc6b43a4bcfe31c822" - }, - { - "a": "0x48a9635", - "b": "0x268bfbf7ed4dc2301882ab92580b2db0c", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x268bfbf7ed4dc2301882ab925853d7141", - "a_m_sub_b_m": "0xab50bc202249d57e1864e6b5612703e3", - "a_m_mul_b_m": "0x240e76b28c110c622998bc6825d4357d2", - "a_eq_b": false, - "a_m_pow_b": "0x163e1edbd7acd5a82e7474c418ccc0309" - }, - { - "a": "0x2f91a2124078080000000000000000000", - "b": "0x72306c62ae859c000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x2f91a21240ea386c62ae859c000000000", - "a_m_sub_b_m": "0x2f91a2124005d7939d517a64000000000", - "a_m_mul_b_m": "0x1597eff9052f8f2434edaad61cd3b1cc", - "a_eq_b": false, - "a_m_pow_b": "0x3041ce893545aa59d2559926c24fe299e" - }, - { - "a": "0x0", - "b": "0x251596e30f439c000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x251596e30f439c000000000000000", - "a_m_sub_b_m": "0x3140e2a4588f50445e08f9fdadd4f48ba", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x9515710bf188c80000", - "b": "0x0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x9515710bf188c80000", - "a_m_sub_b_m": "0x9515710bf188c80000", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x400d861ed5e8d4000000000", - "b": "0x557a2d0705c9b0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x400d861edb4076d0705c9b0", - "a_m_sub_b_m": "0x400d861ed091312f8fa3650", - "a_m_mul_b_m": "0x2abb763d0ec62091893677bd80b13fcf0", - "a_eq_b": false, - "a_m_pow_b": "0x2ac0d9b1c03536f6099f0effdb5b9d8dc" - }, - { - "a": "0x193bf8236a8", - "b": "0xfb95", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x193bf83323d", - "a_m_sub_b_m": "0x193bf813b13", - "a_m_mul_b_m": "0x18cc7c3226087c8", - "a_eq_b": false, - "a_m_pow_b": "0x11a79c04b3adcbba2a8ecdc616f89de6c" - }, - { - "a": "0x416addb1", - "b": "0x10e5919a9a7", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x10e9a848758", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f9eccc5a07cc4", - "a_m_mul_b_m": "0x45157a868a68597777", - "a_eq_b": false, - "a_m_pow_b": "0x9d1fb326f8f37f222dd7438dcdb48457" - }, - { - "a": "0x1c9d8b6ec08c0e000000000000000000", - "b": "0x1c9d8b6ec08c0e000000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x393b16dd81181c000000000000000000", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x24ce86ba10cc9bb931da166255d0d06de", - "a_eq_b": true, - "a_m_pow_b": "0x16e79bfdcd124c50a06d159d9de26364a" - }, - { - "a": "0x1249a", - "b": "0x24998f1093f68200", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x24998f1093f7a69a", - "a_m_sub_b_m": "0x314107b9ef725f87f7bf610ca4959eb54", - "a_m_mul_b_m": "0x29d52b8ef8be2e923400", - "a_eq_b": false, - "a_m_pow_b": "0x331af6242b3a16fdd25414f502b5d8de" - }, - { - "a": "0x286343347daa6b26ae30d04fdb58c1e9f", - "b": "0x5de657342dc460000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x2863433a5c0fde698a76d04fdb58c1e9f", - "a_m_sub_b_m": "0x2863432e9f44f7e3d1ead04fdb58c1e9f", - "a_m_mul_b_m": "0x2740e99624563b59a4b3a19c39d62730a", - "a_eq_b": false, - "a_m_pow_b": "0x155bb9d967c49728262a0cac5886feabf" - }, - { - "a": "0x6b0a9ac12d81280000", - "b": "0x1374b5e886cfdb00000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x1374b5e886cfe1b0a9ac12d81280000", - "a_m_sub_b_m": "0x312d930406eb8fb3aab2a61085e7748ba", - "a_m_mul_b_m": "0x133fa6ed7da806b4b47854a84b3f153b0", - "a_eq_b": false, - "a_m_pow_b": "0x52c0b9b13f32fbaa6d035c6857e212" - }, - { - "a": "0x5f3fd1781ee8fc00000000000", - "b": "0x1cce703d00eb9000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x7c0e41b51fd48c00000000000", - "a_m_sub_b_m": "0x4271613b1dfd6c00000000000", - "a_m_mul_b_m": "0x2af40e595df0a7f8a330a7477dab3a556", - "a_eq_b": false, - "a_m_pow_b": "0x2a9e65c606132e4edbc50b0cf1504996e" - }, - { - "a": "0xe1b747830933f0000000000000", - "b": "0x2d8efb5c9e7a2d2d0ca3c405075fc1b10", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x2d8efb6ab9eea55d9fe2c405075fc1b10", - "a_m_sub_b_m": "0x3b20c6b6c6caa8b80a435f8a67532daa", - "a_m_mul_b_m": "0x1add78154a771fe664de6db6d605d06ac", - "a_eq_b": false, - "a_m_pow_b": "0x2710fb370abd7036d567d6717d3c343de" - }, - { - "a": "0x34aa9c3334f530000", - "b": "0x16520", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x34aa9c3334f546520", - "a_m_sub_b_m": "0x34aa9c3334f519ae0", - "a_m_mul_b_m": "0x49788126ef408a9600000", - "a_eq_b": false, - "a_m_pow_b": "0x1c24d3ea715e8449a5ea60884a5b6e708" - }, - { - "a": "0x302b33be214ed05bde4d08ebed335914c", - "b": "0xc67b74a148342800000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x302b33be215b381328618c2e6d335914c", - "a_m_sub_b_m": "0x302b33be214268a4943885a96d335914c", - "a_m_mul_b_m": "0x224675b99036f79f1c0621361c1adb71a", - "a_eq_b": false, - "a_m_pow_b": "0x2df13ae996752c60241927975619198e6" - }, - { - "a": "0x41bf3c83da9ae000000000", - "b": "0x122d7c15ff83d8000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x41d169fff09a63d8000000", - "a_m_sub_b_m": "0x41ad0f07c49b5c28000000", - "a_m_mul_b_m": "0x2e7affebbd017ae8b8e502f44636d68fa", - "a_eq_b": false, - "a_m_pow_b": "0x1e09772370a2c492bbec304d66ccd2a08" - }, - { - "a": "0x80c87dc3a1b02000000000000", - "b": "0x80c87dc3a1b02000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x10190fb8743604000000000000", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x1ab3f99da0819d0b56a0ce4444474aa52", - "a_eq_b": true, - "a_m_pow_b": "0x107729ec725390f586ef4804a2932d57e" - }, - { - "a": "0x14a7cc5ac", - "b": "0x3efb8cff8b30c8000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x3efb8cff8b32127cc5ac", - "a_m_sub_b_m": "0x314107b9ef725b984139014ab5fcc0e66", - "a_m_mul_b_m": "0x514ef63b99b7af3eeeae60000000", - "a_eq_b": false, - "a_m_pow_b": "0x310eb99bfe5846ee385f08e64f14536fc" - }, - { - "a": "0x373c6704a14a70000000", - "b": "0x64d74d41cc", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x373c6704a1af474d41cc", - "a_m_sub_b_m": "0x373c6704a0e598b2be34", - "a_m_mul_b_m": "0x15c20ca3b13b380c181dc140000000", - "a_eq_b": false, - "a_m_pow_b": "0xb6fdf7bce80fddcfd586ed83e38eff0" - }, - { - "a": "0x7", - "b": "0x8a774a9ec1b550000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x8a774a9ec1b550000007", - "a_m_sub_b_m": "0x314107b9ef7256e0855f0de258d4f48c1", - "a_m_mul_b_m": "0x3c9430a574bf530000000", - "a_eq_b": false, - "a_m_pow_b": "0x1cfc918cc79e1f4d303de2a59578b2b47" - }, - { - "a": "0x45292", - "b": "0x8d71a2455c1", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x8d71a28a853", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f9703c32f458b", - "a_m_mul_b_m": "0x2636599de334ba12", - "a_eq_b": false, - "a_m_pow_b": "0x1f0a915ac27b58b83a62cfe74cd148fc0" - }, - { - "a": "0xb05180fcaf206", - "b": "0x3d272d15eeb7e20000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x3d272d15eeb7e2b05180fcaf206", - "a_m_sub_b_m": "0x3141077cc84549994227aa4f2ed1a3ac0", - "a_m_mul_b_m": "0x136d439680818ea0d35dc9150d9c5e8cc", - "a_eq_b": false, - "a_m_pow_b": "0xc44f5ef3d2deb92b17e5655c65cf7096" - }, - { - "a": "0x10d1eee5eda7b90", - "b": "0x3278381147bcba000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x3278391e66ab18da7b90", - "a_m_sub_b_m": "0x314107b9ef725c607698b770c8229c44a", - "a_m_mul_b_m": "0xb953c9a35594fe657ca8cdfdedbc2ba6", - "a_eq_b": false, - "a_m_pow_b": "0x1198809a80c4976d63deaf20a9fba266" - }, - { - "a": "0x585d3c42d64e240000000000000000", - "b": "0x32cbcf2a2", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x585d3c42d64e24000000032cbcf2a2", - "a_m_sub_b_m": "0x585d3c42d64e23fffffffcd3430d5e", - "a_m_mul_b_m": "0x7ed117928bfa9db64377106bddcb832e", - "a_eq_b": false, - "a_m_pow_b": "0x2bb68f6fcf739113758fc69943e7c0ce" - }, - { - "a": "0x163a11265b6de40000", - "b": "0x3ad6694bd656e2000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x3ad66aaf776947b6de40000", - "a_m_sub_b_m": "0x314107b9ef37892011d3b58164b3348ba", - "a_m_mul_b_m": "0x1558782784b464b91df2e1172e6e2fdc8", - "a_eq_b": false, - "a_m_pow_b": "0x56bff2725c5393f880fba8485927845e" - }, - { - "a": "0x0", - "b": "0x62c1465e58846400000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x62c1465e58846400000000000000000", - "a_m_sub_b_m": "0x30de46739119db23fa08f9fdadd4f48ba", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x162be7b26127db0000000000000000", - "b": "0x9543535fc2f308000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x162be7b261bd1e535fc2f308000000", - "a_m_sub_b_m": "0x162be7b2609297aca03d0cf8000000", - "a_m_mul_b_m": "0x3046e2d0b29c3ccbf1d8f057f66eb1a46", - "a_eq_b": false, - "a_m_pow_b": "0x22bd27cb88c66d61bf719cda14bda610" - }, - { - "a": "0x2941b11047e7ac00000000", - "b": "0x2941b11047e7ac00000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x528362208fcf5800000000", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x138d2632097e27c7aa0e7dea0cdc31faa", - "a_eq_b": true, - "a_m_pow_b": "0x27719df36333c596e354e72564e5b17ec" - }, - { - "a": "0x22c3ceb0736dee000000000000000", - "b": "0xfd300d01168ef80000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x22c3de83743dff68ef80000000000", - "a_m_sub_b_m": "0x22c3bedd729ddc971080000000000", - "a_m_mul_b_m": "0x24617d37693fd7868dd0339084c595d42", - "a_eq_b": false, - "a_m_pow_b": "0x86762b94914f6ca31f5fcd4d3202d56a" - }, - { - "a": "0x2b311d9c41d86fd12c8359b916e935faf", - "b": "0x0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x2b311d9c41d86fd12c8359b916e935faf", - "a_m_sub_b_m": "0x2b311d9c41d86fd12c8359b916e935faf", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x8b185b6", - "b": "0x97c787", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x9494d3d", - "a_m_sub_b_m": "0x819be2f", - "a_m_mul_b_m": "0x5277c72e7fcfa", - "a_eq_b": false, - "a_m_pow_b": "0x6b0196035ea3f8f8b4db6fb791c64528" - }, - { - "a": "0x3529bb39526c14000", - "b": "0x369ffb638bbc580000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x369ffb638bbc5b529bb39526c14000", - "a_m_sub_b_m": "0x313d9dba3939a3c2af32b5370041088ba", - "a_m_mul_b_m": "0x7b558860a9fe7f3a15c618de5a6c870e", - "a_eq_b": false, - "a_m_pow_b": "0x6c3dee5e363367ac9dbc0895eb65ab52" - }, - { - "a": "0x10", - "b": "0x5b3eeefd8a90f4", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x5b3eeefd8a9104", - "a_m_sub_b_m": "0x314107b9ef725f87fa03460ebdfc4b7d6", - "a_m_mul_b_m": "0x5b3eeefd8a90f40", - "a_eq_b": false, - "a_m_pow_b": "0x30ebc962974632004d983201805488e54" - }, - { - "a": "0x14c38dd02ccfc200000000000000000", - "b": "0x3e5e0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x14c38dd02ccfc20000000000003e5e0", - "a_m_sub_b_m": "0x14c38dd02ccfc1ffffffffffffc1a20", - "a_m_mul_b_m": "0x2111bac7d4af98a9c945dbcece9ecaed8", - "a_eq_b": false, - "a_m_pow_b": "0x196cc192ee778f4f376e574b4058415c" - }, - { - "a": "0xcbb610b01", - "b": "0x15f169a37fd86a0000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x15f169a37fd86a0000000cbb610b01", - "a_m_sub_b_m": "0x313fa8a3553a62015a08f9fe798b053bb", - "a_m_mul_b_m": "0x1e427b4dc8b4b6774c58f998c62209496", - "a_eq_b": false, - "a_m_pow_b": "0x282fab8a3d5ee244824a854390af9b489" - }, - { - "a": "0x1ad215", - "b": "0x83b26f7e3dfad0000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x83b26f7e3dfad01ad215", - "a_m_sub_b_m": "0x314107b9ef72574cd311161e00d6a1acf", - "a_m_mul_b_m": "0xdcc327feaffabf43310000000", - "a_eq_b": false, - "a_m_pow_b": "0xbd6f3055265084961dd79153547d4b83" - }, - { - "a": "0x1100d7d835af1b00000000000000000", - "b": "0x1923b6119d5bf3000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x1100d96a711034d5bf3000000000000", - "a_m_sub_b_m": "0x1100d645fa4e012a40d000000000000", - "a_m_mul_b_m": "0x2684ee257165f16f196f89367d434e132", - "a_eq_b": false, - "a_m_pow_b": "0x25140e5ab1734235275f3fb2199852868" - }, - { - "a": "0x20c522b1f5e82e00000000000000", - "b": "0x2005", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x20c522b1f5e82e00000000002005", - "a_m_sub_b_m": "0x20c522b1f5e82dffffffffffdffb", - "a_m_mul_b_m": "0x419482fec36d348e600000000000000", - "a_eq_b": false, - "a_m_pow_b": "0x1f0c04e3ba664b4f04a504ca8bd45ddd8" - }, - { - "a": "0x43041209380910000000000000", - "b": "0x348", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x43041209380910000000000348", - "a_m_sub_b_m": "0x4304120938090ffffffffffcb8", - "a_m_mul_b_m": "0xdbe55b2e3fddbc80000000000000", - "a_eq_b": false, - "a_m_pow_b": "0x5027ba17b767aaad0adab730b1d82ba2" - }, - { - "a": "0x0", - "b": "0x0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x0", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x0", - "a_eq_b": true, - "a_m_pow_b": "0x1" - }, - { - "a": "0xfb31", - "b": "0x1a7e5ea8941", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x1a7e5eb8472", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f9e32f765baaa", - "a_m_mul_b_m": "0x19fef8ff6770071", - "a_eq_b": false, - "a_m_pow_b": "0x4e0894116577e1b803c62c8dfbb1e77f" - }, - { - "a": "0x30c1333ce07117e78e70a26e9eb6b96ec", - "b": "0x63759e2070", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x30c1333ce07117e78e70a274d6109b75c", - "a_m_sub_b_m": "0x30c1333ce07117e78e70a268675cd767c", - "a_m_mul_b_m": "0x231a4c677ac619f63f6d9920b80def1d8", - "a_eq_b": false, - "a_m_pow_b": "0x147b0d7a894679f9d83e9ce90d21c22e2" - }, - { - "a": "0x142ea378a0a3ae00000000000000", - "b": "0x5b4392db249d980000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x142ea378a0fef192db249d980000", - "a_m_sub_b_m": "0x142ea378a0486a6d24db62680000", - "a_m_mul_b_m": "0x312db41aac5d53211d6bd9e02393b9052", - "a_eq_b": false, - "a_m_pow_b": "0x22cd8031dcbaa5b234672077a4f61132e" - }, - { - "a": "0xd779e2a5b35e880000000", - "b": "0x240b1f64d44933c8649adce957837e506", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x240b1f64d44a0b4247409047df837e506", - "a_m_sub_b_m": "0xd35e8551b2a03397813d072de51763b4", - "a_m_mul_b_m": "0x1e5a9c997f3e34fc1d85f4a1f029d4a30", - "a_eq_b": false, - "a_m_pow_b": "0xbf29755dd5d742165041cc655b923978" - }, - { - "a": "0x302a007fce04ee43c11f63e9bc7361a75", - "b": "0x3dcadf201dafa0000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x302a007fce04ee43feea4309da2301a75", - "a_m_sub_b_m": "0x302a007fce04ee43835484c99ec3c1a75", - "a_m_mul_b_m": "0x26bd95dad3da7bbd444157d6490c0d872", - "a_eq_b": false, - "a_m_pow_b": "0x725b609e72693438a377f3a745f5db1d" - }, - { - "a": "0x91de4b18029", - "b": "0x91b44b2196155000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x91b44b2227f39b18029", - "a_m_sub_b_m": "0x314107b9ef725ef645bdd8f976d00c8e3", - "a_m_mul_b_m": "0x5305a3a4a98178ea3680169d000000", - "a_eq_b": false, - "a_m_pow_b": "0xaf1f89b103ccc2648edc53b3397a1c77" - }, - { - "a": "0x2010b0733", - "b": "0x7d0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x2010b0f03", - "a_m_sub_b_m": "0x2010aff63", - "a_m_mul_b_m": "0xfa826283e70", - "a_eq_b": false, - "a_m_pow_b": "0x181c07672fcc07bb3efc7a083935ec781" - }, - { - "a": "0x158ca207a58930", - "b": "0x208d17e6327e8aeae24a703e3120a202f", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x208d17e6327e8aeae24bc908519afa95f", - "a_m_sub_b_m": "0x10b3efd3bcf3d49d17bfe2899d2eab1bb", - "a_m_mul_b_m": "0x1b0e868adb7ae58b4f8964353b8902bac", - "a_eq_b": false, - "a_m_pow_b": "0x134d4c7ed2cabc8de23ce2b7802ce8048" - }, - { - "a": "0x1ce", - "b": "0x205de46c3d07c6000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x205de46c3d07c60000000000001ce", - "a_m_sub_b_m": "0x3140e75c0b0622803408f9fdadd4f4a88", - "a_m_mul_b_m": "0x3a69723b56240754000000000000000", - "a_eq_b": false, - "a_m_pow_b": "0x2a9395da646d597e50bcd135fee692cce" - }, - { - "a": "0x2d0a9a942d4", - "b": "0x496fde28", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x2d0f31920fc", - "a_m_sub_b_m": "0x2d0603964ac", - "a_m_mul_b_m": "0xcebb4c382db8524920", - "a_eq_b": false, - "a_m_pow_b": "0x10de48f03a376b4ef0e7ebab9f006682" - }, - { - "a": "0x310074ed1d54be000000000000", - "b": "0x21c67556d79acd84313b2cc1593098549", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x21c67559e7a21c5606870cc1593098549", - "a_m_sub_b_m": "0xf7a926627dee0d59e19ad3c54a45c371", - "a_m_mul_b_m": "0x1336ada2b357bc6f7688d4364eb189044", - "a_eq_b": false, - "a_m_pow_b": "0x50c51e0177d72a07ac0a48231aeec988" - }, - { - "a": "0x7b6875f5267ae40000", - "b": "0x25da23c06f146b0800a2cf6a95bd38392", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x25da23c06f146b0fb72a2ebcfd6b78392", - "a_m_sub_b_m": "0xb66e3f9805df487afed89e57fc5fc528", - "a_m_mul_b_m": "0x14a55d6a74f0297255f7c14d905575ffe", - "a_eq_b": false, - "a_m_pow_b": "0x2b142e04a415f719a265c50d9f623bb80" - }, - { - "a": "0x4d84ed691c42f400000000000", - "b": "0x1089e85dbb2528000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x156237344ce957400000000000", - "a_m_sub_b_m": "0x314107b93458c71563f96dfdadd4f48ba", - "a_m_mul_b_m": "0x1f94e482c6369062a5de606e9038275a4", - "a_eq_b": false, - "a_m_pow_b": "0x2d3e2e3b4e39c2262a15fd37455593e6e" - }, - { - "a": "0x4df8f0a97d06e40000000000", - "b": "0x50a3cc798b13f80000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x9e9cbd23081adc0000000000", - "a_m_sub_b_m": "0x314107b9ef47b1caf92828bdadd4f48ba", - "a_m_mul_b_m": "0x1bce3e4545c066f914b15e5b76523cf1c", - "a_eq_b": false, - "a_m_pow_b": "0x17168d41ccd9637fe2512ef5758a2e68e" - }, - { - "a": "0x56456b4fc8b84800", - "b": "0x54228bc9c5f128000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x54228bcf2a47dcfc8b84800", - "a_m_sub_b_m": "0x314107b9ef1e3cfc35a75f8aaa60790ba", - "a_m_mul_b_m": "0x260e780ea3cb591d2c770ccc2c5968b44", - "a_eq_b": false, - "a_m_pow_b": "0x307bb33ab1c901a5954d3f9227d7a85ce" - }, - { - "a": "0xcf09627", - "b": "0xcf09627", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x19e12c4e", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0xa7702d8931b9f1", - "a_eq_b": true, - "a_m_pow_b": "0x13f619db0f1c4cde7eba1a4429f73a61b" - }, - { - "a": "0xa4ec54527863100000000000000", - "b": "0x619c2a411de", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xa4ec545278631000619c2a411de", - "a_m_sub_b_m": "0xa4ec545278630fff9e63d5bee22", - "a_m_mul_b_m": "0x2f7485408a5bfe2b27caf756354bed6ce", - "a_eq_b": false, - "a_m_pow_b": "0x22fd35cfb677c8c66682153826ed08496" - }, - { - "a": "0x15fe0ddcccc6e1000000000000000", - "b": "0x2e21d669e9c31", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x15fe0ddcccc6e1002e21d669e9c31", - "a_m_sub_b_m": "0x15fe0ddcccc6e0ffd1de2996163cf", - "a_m_mul_b_m": "0x2abdb882eab8e4f86eb7f0d8a73d3a5b8", - "a_eq_b": false, - "a_m_pow_b": "0x2971c8c09f4ec17076968f75c0e0be890" - }, - { - "a": "0xace3b62c", - "b": "0x950a411845ede00", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x950a4123142942c", - "a_m_sub_b_m": "0x314107b9ef725f87f973efbca05d420e6", - "a_m_mul_b_m": "0x64a775e2ef8c4650c222800", - "a_eq_b": false, - "a_m_pow_b": "0xff83162f2fe1be3d4dccad42663bba88" - }, - { - "a": "0x839f9", - "b": "0x59afb6", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x61e9af", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fdadcfdd2fd", - "a_m_mul_b_m": "0x2e1cd0b6e06", - "a_eq_b": false, - "a_m_pow_b": "0x173b406ca69b46bad921e42c2085f5f83" - }, - { - "a": "0x121a0cc60f7ef70000000000000000", - "b": "0x5c887a342bbc", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x121a0cc60f7ef700005c887a342bbc", - "a_m_sub_b_m": "0x121a0cc60f7ef6ffffa37785cbd444", - "a_m_mul_b_m": "0x1c672da60c32090dd7ff9c3435963237a", - "a_eq_b": false, - "a_m_pow_b": "0x22b1b845bdbdae1d22bae7b0e74e99272" - }, - { - "a": "0x4f24281337da5c0000", - "b": "0x4ce0826", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x4f24281337df2a0826", - "a_m_sub_b_m": "0x4f24281337d58df7da", - "a_m_mul_b_m": "0x17c423d6cf4e7bf2549a80000", - "a_eq_b": false, - "a_m_pow_b": "0x2a8a9f2ec0017b6e5ee9e2b8bcbc2125e" - }, - { - "a": "0x6", - "b": "0x4476389592809c00000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x4476389592809c00000000000006", - "a_m_sub_b_m": "0x314103728be9065ff048f9fdadd4f48c0", - "a_m_mul_b_m": "0x19ac553816f03a800000000000000", - "a_eq_b": false, - "a_m_pow_b": "0x262d0cd74586ecc8774189437c99c8ce2" - }, - { - "a": "0x2a8145b54a", - "b": "0x1782d61444672b00000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x1782d61444672b02a8145b54a", - "a_m_sub_b_m": "0x314107b9d7ef8973b5a1cf0055e94fe04", - "a_m_mul_b_m": "0xe41d996bb1a3a12c585e62e6b5ce5178", - "a_eq_b": false, - "a_m_pow_b": "0x14485a7a65120b93cf6c4d5162aa68a3a" - }, - { - "a": "0x87", - "b": "0x1b256e", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x1b25f5", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fdadd3423d3", - "a_m_mul_b_m": "0xe50bd02", - "a_eq_b": false, - "a_m_pow_b": "0x2079fd1cb61b9e0647d28673097edbf07" - }, - { - "a": "0x1f0a2604707dc40", - "b": "0x1ad9b17fd149b", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x1f24ffb5f04f0db", - "a_m_sub_b_m": "0x1eef4c52f0ac7a5", - "a_m_mul_b_m": "0x3416cfc30e246c358260a375ac0", - "a_eq_b": false, - "a_m_pow_b": "0x2d652eaaf99d5124f516b4c56486eda18" - }, - { - "a": "0x3047cd56efd6cc3648191cbeb175bf448", - "b": "0x47f4f7208398880000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x3047cd9ee4cdecb9e0a11cbeb175bf448", - "a_m_sub_b_m": "0x3047cd0efadfabb2af911cbeb175bf448", - "a_m_mul_b_m": "0x7b83efa7bb57f4640dd7b8cab2fc43e4", - "a_eq_b": false, - "a_m_pow_b": "0x1b31acf76595ad51225337b517e402a6" - }, - { - "a": "0x5d1435c0", - "b": "0x5d1435c0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xba286b80", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x21d7b0a5f1491000", - "a_eq_b": true, - "a_m_pow_b": "0x26cc41eec6d1660dae35d4479778c0bce" - }, - { - "a": "0x17c7589a6b0", - "b": "0x14d8e45c80b353000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x14d8e45c80b353017c7589a6b0", - "a_m_sub_b_m": "0x314107b8a1e419bfeed3ca15752d8ef6a", - "a_m_mul_b_m": "0x19f7362e8c4ef6eee75d775ad12343060", - "a_eq_b": false, - "a_m_pow_b": "0xf7bde0b1aaa33ca410acf3dad0eed916" - }, - { - "a": "0xae4420071645b8000000", - "b": "0x18e18e", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xae4420071645b818e18e", - "a_m_sub_b_m": "0xae4420071645b7e71e72", - "a_m_mul_b_m": "0x10efed8a9a150ae16410000000", - "a_eq_b": false, - "a_m_pow_b": "0x29973d4c49b2dafbaa841e1440b977ff8" - }, - { - "a": "0x379f6", - "b": "0x762fd", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xadcf3", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fdadd4b5fb3", - "a_m_mul_b_m": "0x19add9b41e", - "a_eq_b": false, - "a_m_pow_b": "0x5178a6b79108ab316702f384ec9352f8" - }, - { - "a": "0x34eb1", - "b": "0x39d4696", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x3a09547", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fdad9b550d5", - "a_m_mul_b_m": "0xbf43f0181b6", - "a_eq_b": false, - "a_m_pow_b": "0x28dea5bcb3aac75124c49c7497949bd6b" - }, - { - "a": "0x30a14088479eec00000000", - "b": "0x613", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x30a14088479eec00000613", - "a_m_sub_b_m": "0x30a14088479eebfffff9ed", - "a_m_mul_b_m": "0x127637afbcb0a538400000000", - "a_eq_b": false, - "a_m_pow_b": "0x3119cfafe64c652cbf83d1b3178c7c05c" - }, - { - "a": "0x3a36fce1fd20b2000000000", - "b": "0x130d73b5df2ff00000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x130d73b9829fbe1fd20b2000000000", - "a_m_sub_b_m": "0x313fd6e2b44ea385dc061aafadd4f48ba", - "a_m_mul_b_m": "0x1b67337fafed177ebb9c6df00de47dd60", - "a_eq_b": false, - "a_m_pow_b": "0x517900200d6d96d88ac1b0e3c4468f26" - }, - { - "a": "0xe027157f750b9000000000", - "b": "0x2b299c69fa73e8000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xe02718320ed22fa73e8000", - "a_m_sub_b_m": "0xe02712ccdb44f058c18000", - "a_m_mul_b_m": "0xa0968580dce89331459dcd32a72476f4", - "a_eq_b": false, - "a_m_pow_b": "0xb93ca3bd3410e21ac7e5c242e14b1a9e" - }, - { - "a": "0xa46e80a677fdc00", - "b": "0x73ade66f5012c80000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x73ade713be936e77fdc00", - "a_m_sub_b_m": "0x314107b9ef71ebda143e186b8c4cf24ba", - "a_m_mul_b_m": "0xca2b16caaa936bb9ef65e544f579e92", - "a_eq_b": false, - "a_m_pow_b": "0x752fd3f7f5845be60ab6d689eb1fc260" - }, - { - "a": "0x211f", - "b": "0x1afc2e706a", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x1afc2e9189", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fbfe120f96f", - "a_m_mul_b_m": "0x37dc6861d46d6", - "a_eq_b": false, - "a_m_pow_b": "0x2bfd9ac5a7f884d366c5ed5014b650959" - }, - { - "a": "0x6d9981", - "b": "0x92d55b65931638000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x92d55b65931d11981", - "a_m_sub_b_m": "0x314107b9ef725f8767339e981ac59623b", - "a_m_mul_b_m": "0x3edce36b62638d3daa38000", - "a_eq_b": false, - "a_m_pow_b": "0x2cb4dfb4c120c5afebdc737fcc9d1b059" - }, - { - "a": "0x7eb54bb3008e240000000000000000", - "b": "0x2916701", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x7eb54bb3008e240000000002916701", - "a_m_sub_b_m": "0x7eb54bb3008e23fffffffffd6e98ff", - "a_m_mul_b_m": "0x787beb38541bf00bd3027531bcbbdbf2", - "a_eq_b": false, - "a_m_pow_b": "0x1151a75076b549ef674b49c2e51d2c398" - }, - { - "a": "0x57e7a9443", - "b": "0x26a75e179fd14f9d493510969c2ebbadc", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x26a75e179fd14f9d49351096f41664f1f", - "a_m_sub_b_m": "0xa99a9a24fa10feab0d3e967698de2221", - "a_m_mul_b_m": "0x237dfd278ef6a5173addf381319424a76", - "a_eq_b": false, - "a_m_pow_b": "0x45706ba0c73877b26fda0cac142bdcf7" - }, - { - "a": "0xa96", - "b": "0x2af17effd0ba9400000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x2af17effd0ba9400000000a96", - "a_m_sub_b_m": "0x314107b9c480e088294e65fdadd4f5350", - "a_m_mul_b_m": "0x1c69876680b971ab800000000000", - "a_eq_b": false, - "a_m_pow_b": "0x37253a49b3570126db1c08452579ef90" - }, - { - "a": "0x9cc375f4", - "b": "0x96b87204b942f80000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x96b87204b9dfbb75f4", - "a_m_sub_b_m": "0x314107b9ef725f7e8e81d9b22371abeae", - "a_m_mul_b_m": "0x5c4b796bae66c24f172c600000", - "a_eq_b": false, - "a_m_pow_b": "0x11f33602d05d2fb26bed11984d615341a" - }, - { - "a": "0xe0a", - "b": "0x29ef63e", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x29f0448", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fdadab06086", - "a_m_mul_b_m": "0x24cbad026c", - "a_eq_b": false, - "a_m_pow_b": "0x281e796b3269d2bfb7201ac981fd5b730" - }, - { - "a": "0x114cf03ff8c1a70", - "b": "0x10a9acb370c1ea0000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x10a9acb370c1fb4cf03ff8c1a70", - "a_m_sub_b_m": "0x314107a945c5ac17383046ededcdb632a", - "a_m_mul_b_m": "0x1eac63ac0958af292d1580a16ac3876fc", - "a_eq_b": false, - "a_m_pow_b": "0x1a64d73865ad8b078cc634aa1924852c" - }, - { - "a": "0xd", - "b": "0xdc70aaa61441c00000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xdc70aaa61441c0000000d", - "a_m_sub_b_m": "0x314107b9ef7183174f62e5bbedd4f48c7", - "a_m_mul_b_m": "0xb31b8aa6f0756c00000000", - "a_eq_b": false, - "a_m_pow_b": "0x24b66965d90e0269a85e156930adddfb3" - }, - { - "a": "0xa13facf69bc250000", - "b": "0x0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xa13facf69bc250000", - "a_m_sub_b_m": "0xa13facf69bc250000", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x5e0b7f69b12c28000000", - "b": "0x336c1da1c6a3020000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x336c7bad460cb32c28000000", - "a_m_sub_b_m": "0x314107b9ec3ba38e959564f07054f48ba", - "a_m_mul_b_m": "0x7553704e2192938ce1e6f8870e2d63a8", - "a_eq_b": false, - "a_m_pow_b": "0x148b318c296e2e8ffbb1dedf0b68f29ba" - }, - { - "a": "0x421ec55d9555dc000000000000000", - "b": "0x421ec55d9555dc000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x843d8abb2aabb8000000000000000", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x1067ebf639478e9ffaf185967c5104a0", - "a_eq_b": true, - "a_m_pow_b": "0x2c777ed6210e2128b1d60e004c38391ea" - }, - { - "a": "0xc745b2caa32d38000000", - "b": "0xdccf5f9e58f6400000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xdccf5f9e59bd85b2caa32d38000000", - "a_m_sub_b_m": "0x31333ac3f58cdc985535a4308154f48ba", - "a_m_mul_b_m": "0x26833d888800b2ba500564d4c139ccffe", - "a_eq_b": false, - "a_m_pow_b": "0x7e14fa869616d1620984f96cddfd3a88" - }, - { - "a": "0x225454e29ad5ac10cbd3ccd615ec2abf6", - "b": "0x6a7750dd3b9f", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x225454e29ad5ac10cbd3d37d8af9fe795", - "a_m_sub_b_m": "0x225454e29ad5ac10cbd3c62ea0de57057", - "a_m_mul_b_m": "0xbf8c81b319f496ed64935854c19d2c52", - "a_eq_b": false, - "a_m_pow_b": "0x125dd82388dc541bedfa52a99d42154f4" - }, - { - "a": "0x27b4908702f1b60000000000000000000", - "b": "0x260d42d7d4433", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x27b4908702f1b6000000260d42d7d4433", - "a_m_sub_b_m": "0x27b4908702f1b5ffffffd9f2bd282bbcd", - "a_m_mul_b_m": "0x2ec5a5fc2671db47a88e36513088ed2de", - "a_eq_b": false, - "a_m_pow_b": "0x26a590029ef0d2fad9947753f0a2cf3b8" - }, - { - "a": "0x0", - "b": "0x1634cd5095918a0000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x1634cd5095918a0000", - "a_m_sub_b_m": "0x314107b9ef725f8696bc24f454bc548ba", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x1250ad", - "b": "0xb603a01", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xb728aae", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fdad2015f66", - "a_m_mul_b_m": "0xd059d63982ad", - "a_eq_b": false, - "a_m_pow_b": "0x1c41a58990f5e63c2e4a508682cd28cf9" - }, - { - "a": "0x882911f97347580000000000000000", - "b": "0x73b1d4dc8e", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x882911f973475800000073b1d4dc8e", - "a_m_sub_b_m": "0x882911f9734757ffffff8c4e2b2372", - "a_m_mul_b_m": "0x2786c573fa57704ee1dbc5cb53d2a1d62", - "a_eq_b": false, - "a_m_pow_b": "0xadf6b962a5ded7fcb245db29511fa452" - }, - { - "a": "0x21938d096ed3dffdfa5bb23895dde2c6a", - "b": "0x296df541fcdd592a0aeff988bb5eca796", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x19c07a917c3ed9a00b42b1c3a367b8b46", - "a_m_sub_b_m": "0x29669f816168e65be974b2ad88540cd8e", - "a_m_mul_b_m": "0x23f9dacd6bb0c21940c2b5c8e28210cd0", - "a_eq_b": false, - "a_m_pow_b": "0xdd11f705ba7a8a875d82f25ad10e2ca0" - }, - { - "a": "0x11df54105270f6000000", - "b": "0x271c2912aea8a80000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x283a1e53b3cfb76000000", - "a_m_sub_b_m": "0x314107b9ef723989c637507c1534f48ba", - "a_m_mul_b_m": "0x262ed385be30a989fcf981b4fbc69f29e", - "a_eq_b": false, - "a_m_pow_b": "0x2248f73068d5cb082af189e9ff39d3136" - }, - { - "a": "0x618c691643e9600000000000", - "b": "0x3214cb383ba4a80000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x618f8a62f76d1a4a80000000", - "a_m_sub_b_m": "0x618947c99065a5b580000000", - "a_m_mul_b_m": "0xbd8525d2f8f82704e97b3ccb8cb52c5c", - "a_eq_b": false, - "a_m_pow_b": "0x1ba29f13e30e99aed585a6e224136d31e" - }, - { - "a": "0x0", - "b": "0x6be67", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x6be67", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fdadd488a53", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x94ba30c57fce8800000000000", - "b": "0x29f7a46b8450000a118700fd547894708", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x29f7a46c190a30cf915588fd547894708", - "a_m_sub_b_m": "0x749634effdc904368508100595c601b2", - "a_m_mul_b_m": "0x25cd4571d11c3c602852eefe61fe85784", - "a_eq_b": false, - "a_m_pow_b": "0x2552c0f4a051768815d8ce27910690424" - }, - { - "a": "0x5faf040ecf6d90", - "b": "0x5faf040ecf6d90", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xbf5e081d9edb20", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x23c35ca98a436001a48e1dc3f100", - "a_eq_b": true, - "a_m_pow_b": "0x100ccbc980f5363800ac75bcffb6951ce" - }, - { - "a": "0x67b263a7318c340", - "b": "0x34dd0237df3f220000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x34dd0237df3f22067b263a7318c340", - "a_m_sub_b_m": "0x313db9e9cbf46b95da70ac61550680bfa", - "a_m_mul_b_m": "0x13e7d811ca11a8f60233ea7613cb68eae", - "a_eq_b": false, - "a_m_pow_b": "0x28207c3f7334dc67bc15aa369c3cdf1f2" - }, - { - "a": "0xc1da425", - "b": "0xc1da425", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x183b484a", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x92cad211a16d59", - "a_eq_b": true, - "a_m_pow_b": "0xdd14dbf13cabbd6d991b4f327bdd953d" - }, - { - "a": "0xfbb728a5891818000", - "b": "0x2fcfd32468884b81da7e1572891c9992f", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x2fcfd32468884b82d6353e181234b192f", - "a_m_sub_b_m": "0x171349586ea14071b420d30add072f8b", - "a_m_mul_b_m": "0xfa807aece04bf7b1cd2abca9d88f4792", - "a_eq_b": false, - "a_m_pow_b": "0x3ffb796d10d8b9ff6369935313657802" - }, - { - "a": "0x3a81c31e8398b00", - "b": "0x2af9f30a92299a0000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x2af9f30a92299a03a81c31e8398b00", - "a_m_sub_b_m": "0x313e581abec93cee5a437bc0cc588d3ba", - "a_m_mul_b_m": "0x14ce3354ba55f4d6193b85e3fe9e4f9f0", - "a_eq_b": false, - "a_m_pow_b": "0x1a4bb7890d903c3b6dfdf90c1ad2e0dbc" - }, - { - "a": "0x5a04ca4bfca39c0", - "b": "0x231d4f7df847eabd3be5c193391a69f34", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x231d4f7df847eabd3c3fc65d85170d8f4", - "a_m_sub_b_m": "0xe23b83bf72a74cabe7d3d34c0b72e346", - "a_m_mul_b_m": "0x1019d24afb25d064d7b5037aea37be320", - "a_eq_b": false, - "a_m_pow_b": "0x23479fe513fd590f08f3c3e29ad33eaa" - }, - { - "a": "0x2400b2638c594600000000000000", - "b": "0x55656024c", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x2400b2638c59460000055656024c", - "a_m_sub_b_m": "0x2400b2638c5945fffffaa9a9fdb4", - "a_m_mul_b_m": "0x26f99a2a2bf1a1ad1e3412dec4c3f8e42", - "a_eq_b": false, - "a_m_pow_b": "0x204ea6e58eb896d2781927fcba87a9442" - }, - { - "a": "0x73efe289e", - "b": "0x4105325a4", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xb4f514e42", - "a_m_sub_b_m": "0x32eab02fa", - "a_m_mul_b_m": "0x1d7243022821eadb38", - "a_eq_b": false, - "a_m_pow_b": "0x1abb5b46ff227d12465233f5e652097a8" - }, - { - "a": "0x2cade6f656229400000000", - "b": "0x20ac1f6", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x2cade6f6562294020ac1f6", - "a_m_sub_b_m": "0x2cade6f6562293fdf53e0a", - "a_m_mul_b_m": "0x5b3c72fc874a289ece3800000000", - "a_eq_b": false, - "a_m_pow_b": "0x223c1d4ed3cf2890be98c708b23d70f80" - }, - { - "a": "0x21b9dab860d7de000000000000000000", - "b": "0x2a7eedf7af9d8400", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x21b9dab860d7de002a7eedf7af9d8400", - "a_m_sub_b_m": "0x21b9dab860d7ddffd581120850627c00", - "a_m_mul_b_m": "0x3081ee1cea44738f13ee575eebe7b642e", - "a_eq_b": false, - "a_m_pow_b": "0x1525debe80a1db941376fcd87dabb9036" - }, - { - "a": "0xc1ee10b817a0d8", - "b": "0xaa7", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xc1ee10b817ab7f", - "a_m_sub_b_m": "0xc1ee10b8179631", - "a_m_mul_b_m": "0x811cef41903b25ce8", - "a_eq_b": false, - "a_m_pow_b": "0x2db89c2056f30d1ca643a61bc238099b6" - }, - { - "a": "0x4", - "b": "0x547d57085587b400", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x547d57085587b404", - "a_m_sub_b_m": "0x314107b9ef725f87f4c1248d287c794be", - "a_m_mul_b_m": "0x151f55c21561ed000", - "a_eq_b": false, - "a_m_pow_b": "0x1a8e356649bf5f2e1ed0906259ae5bd88" - }, - { - "a": "0x72ac8b12ee0758", - "b": "0x128b524c88", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x72ac9d9e4053e0", - "a_m_sub_b_m": "0x72ac78879bbad0", - "a_m_mul_b_m": "0x84e8a5464b4c5ebdad206c0", - "a_eq_b": false, - "a_m_pow_b": "0xc61bbdef9bb7ca579683784de56d98d2" - }, - { - "a": "0xe82bad36cfa", - "b": "0x0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xe82bad36cfa", - "a_m_sub_b_m": "0xe82bad36cfa", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x4459a2c330ee5800000000000000", - "b": "0x3feff6dfc", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x4459a2c330ee58000003feff6dfc", - "a_m_sub_b_m": "0x4459a2c330ee57fffffc01009204", - "a_m_mul_b_m": "0x2e005d578ecd6daaa39423ec2d0b48196", - "a_eq_b": false, - "a_m_pow_b": "0x42ac73ddb9eb2230b9a1d72cbd4ae4fc" - }, - { - "a": "0x3", - "b": "0x3", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x6", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x9", - "a_eq_b": true, - "a_m_pow_b": "0x1b" - }, - { - "a": "0x7106686edd0ad00000", - "b": "0x2bd90a53d49e78dcc9dd3d9c38b75471e", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x2bd90a53d49e78e3da43c48a09645471e", - "a_m_sub_b_m": "0x567fd661ad3e6b24092434f45caa019c", - "a_m_mul_b_m": "0x1f13dc413db1a59e892a7afa359af7cc8", - "a_eq_b": false, - "a_m_pow_b": "0x1d541505e33b3ad195d52c7afbe30ddf8" - }, - { - "a": "0x1e4ec7558e2f3a000000000", - "b": "0xe3adf400e8fef80000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xe3ae124fb054862f3a000000000", - "a_m_sub_b_m": "0x314106d6419cad66509f2937add4f48ba", - "a_m_mul_b_m": "0x858af6363b72fc48db839d8f520fc4d4", - "a_eq_b": false, - "a_m_pow_b": "0x2842a77c9b30110e13cfd9b5059a663b6" - }, - { - "a": "0x4aac900bcaf35000000", - "b": "0x0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x4aac900bcaf35000000", - "a_m_sub_b_m": "0x4aac900bcaf35000000", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x3d8321c9ae496a0000000", - "b": "0x12718fbf7bb08700", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x3d8322f0c74561bb08700", - "a_m_sub_b_m": "0x3d8320a2954d7244f7900", - "a_m_mul_b_m": "0x201268629f5ae97bea91fc5a6f5fd0430", - "a_eq_b": false, - "a_m_pow_b": "0x2f983156378b57a4500eaf6befa0d3390" - }, - { - "a": "0xe57fac085f97", - "b": "0x47a7dee6e193a0000000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x47a7dee6e193a0000000e57fac085f97", - "a_m_sub_b_m": "0x2cc689cb81592587fa090855a8957a851", - "a_m_mul_b_m": "0x20cc325ceee5b989337bb680d2b6ff1dc", - "a_eq_b": false, - "a_m_pow_b": "0xf5e76e35d615eb9cc5b3b9d99ec68ae3" - }, - { - "a": "0x6854c2815b5a6c000", - "b": "0x590ab02b1afdd8000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x590ab02b1afe4054c2815b5a6c000", - "a_m_sub_b_m": "0x3140aeaf3f47448a8a5dbc7f092f608ba", - "a_m_mul_b_m": "0x127c6f5dc316dab7495e8fd05657f6c0a", - "a_eq_b": false, - "a_m_pow_b": "0x1623dddf0b6a8e8dbea9c6f158f57e7ec" - }, - { - "a": "0xb0cd41e55", - "b": "0x42dfb4093fc", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x4390814b251", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f9bb7eee2d313", - "a_m_mul_b_m": "0x2e2f6a203af45a78aaac", - "a_eq_b": false, - "a_m_pow_b": "0x2ae85ab9a71da630f26f20cbd15bd5125" - }, - { - "a": "0x0", - "b": "0xe34dfef08cc45800000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xe34dfef08cc45800000000", - "a_m_sub_b_m": "0x314107b9ef642aa80b002db82dd4f48ba", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x0", - "b": "0xce410e", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xce410e", - "a_m_sub_b_m": "0x314107b9ef725f87fa08f9fdadc8107ac", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x4a2833e1819448000000", - "b": "0x0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x4a2833e1819448000000", - "a_m_sub_b_m": "0x4a2833e1819448000000", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0xf71d18231b14b000000000000000000", - "b": "0x0", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xf71d18231b14b000000000000000000", - "a_m_sub_b_m": "0xf71d18231b14b000000000000000000", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x23536763b4768a5c99d0a4fac67aaa068", - "b": "0x17814af8e768", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x23536763b4768a5c99d0a672db2a387d0", - "a_m_sub_b_m": "0x23536763b4768a5c99d0a382b1cb1b900", - "a_m_mul_b_m": "0x239e7e5550a96f4212c1e1f47d7b0d8ea", - "a_eq_b": false, - "a_m_pow_b": "0x20d639ccdcc10ea59ce3ee0bfccec023e" - }, - { - "a": "0x52cba12c1a", - "b": "0x51cd069a08c4400", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x51cd0bc6c2d701a", - "a_m_sub_b_m": "0x314107b9ef725f87f9b72cfc4086430d4", - "a_m_mul_b_m": "0x1a74bd319ba6a4c752deee800", - "a_eq_b": false, - "a_m_pow_b": "0xbd2e0a16325a074bbc58fe0f52220e90" - }, - { - "a": "0xd270eeb0dcdb38000000000000000000", - "b": "0xd270eeb0dcdb38000000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x1a4e1dd61b9b670000000000000000000", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x25ced01c2423d46aedee7d8ca69c09bd0", - "a_eq_b": true, - "a_m_pow_b": "0x223e79190060e467e6c8d7a89043806a0" - }, - { - "a": "0x30c2e3c601d810000000000000", - "b": "0x810c74096f51d000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x30c2e3c602591c74096f51d000", - "a_m_sub_b_m": "0x30c2e3c60157038bf690ae3000", - "a_m_mul_b_m": "0x5ec74f3b9f1d18383ceab8ea4b1d4ecc", - "a_eq_b": false, - "a_m_pow_b": "0x610b814ef4e56639dbf981e9035ed5f4" - }, - { - "a": "0x2ac606a5d49dd3b0ea29d06e06f5714d7", - "b": "0x3cf44f1f26196a000000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x2e954b97c6ff6a50ea29d06e06f5714d7", - "a_m_sub_b_m": "0x26f6c1b3e23c3d10ea29d06e06f5714d7", - "a_m_mul_b_m": "0x214e1edd2b8e107a6a98e2a0e9931856e", - "a_eq_b": false, - "a_m_pow_b": "0x1f39b1029c61d5fcabc0f301547a019d3" - }, - { - "a": "0x1c98fa418e6b880000000000000000000", - "b": "0x21566dfed2636a00", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x1c98fa418e6b8800021566dfed2636a00", - "a_m_sub_b_m": "0x1c98fa418e6b87fffdea992012d9c9600", - "a_m_mul_b_m": "0x6293403f38da2108592008a14576da10", - "a_eq_b": false, - "a_m_pow_b": "0x2998dd19fc6ba917bc548361d519e03e6" - }, - { - "a": "0x6bf010509228dc0000000000000000", - "b": "0x24f73efb170dc9c84f56962c2706c360e", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x24fdfdfc1c16ec560f56962c2706c360e", - "a_m_sub_b_m": "0xc5087bfdd6db84d6ab263d186ce312ac", - "a_m_mul_b_m": "0x1b61b3717c640b37d8a72e011bdcffcba", - "a_eq_b": false, - "a_m_pow_b": "0x8835bab4134befc74afb9e2cf7d7245a" - }, - { - "a": "0x4192ad4c", - "b": "0x4192ad4c", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x83255a98", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x10cbd00ab7ffce90", - "a_eq_b": true, - "a_m_pow_b": "0x286ef25d8107c8b37fa01778789085616" - }, - { - "a": "0xe1c7cdb7eda178000000000000000", - "b": "0x5b50faa61a7324000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xe1c7cdb7f35687aa61a7324000000", - "a_m_sub_b_m": "0xe1c7cdb7e7ec68559e58cdc000000", - "a_m_mul_b_m": "0x1d8d7fb7abc47fbaceea3e493d573e7a8", - "a_eq_b": false, - "a_m_pow_b": "0xae3e0748a52d836c3a104972a40ef57a" - }, - { - "a": "0x2", - "b": "0xdab7bba328047800000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0xdab7bba328047800000002", - "a_m_sub_b_m": "0x314107b9ef64b40c3fd679b62dd4f48bc", - "a_m_mul_b_m": "0x1b56f77465008f000000000", - "a_eq_b": false, - "a_m_pow_b": "0x2d71de11f75d8393dbdbb615cc3655e6a" - }, - { - "a": "0x169373b3d32", - "b": "0x16a7ba5e6ebf490000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x16a7ba5e6ebf4900000169373b3d32", - "a_m_sub_b_m": "0x313f9d3e498b73936a08fa144148a85ec", - "a_m_mul_b_m": "0x12611c061b290fab159db07bd0c4f963c", - "a_eq_b": false, - "a_m_pow_b": "0xe5974e146c2b0b171923266c58b5de1e" - }, - { - "a": "0x9caaee15a966900000000000", - "b": "0x1215688d77e6d6000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x9cab002b11f407e6d6000000", - "a_m_sub_b_m": "0x9caadc0040d918192a000000", - "a_m_mul_b_m": "0x2488544e56adb2174ccfc723379b60580", - "a_eq_b": false, - "a_m_pow_b": "0x2221db3596945a2b83d04637cb084e0e6" - }, - { - "a": "0x1c2", - "b": "0x1defd2093c05f500000000000000000", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x1defd2093c05f5000000000000001c2", - "a_m_sub_b_m": "0x312317e7e6365992fa08f9fdadd4f4a7c", - "a_m_mul_b_m": "0x35e877a4c10192205f70602522b0b746", - "a_eq_b": false, - "a_m_pow_b": "0x26e24ec4a7ea12d6dc79121596e587d8e" - }, - { - "a": "0x17cf8cf419dfcf00000000000000000", - "b": "0x25e6cc9e41768599decffd101cb622873", - "m": "0x314107b9ef725f87fa08f9fdadd4f48ba", - "a_m_add_b_m": "0x25fe9c2b35906568decffd101cb622873", - "a_m_sub_b_m": "0xb720aa8a215b9bd1b38fced911ed2047", - "a_m_mul_b_m": "0x4b4a55c3504ab5067b758397bf1db958", - "a_eq_b": false, - "a_m_pow_b": "0x77f9f17c06150c9e7bff6a37e88469c4" - } - ], - "goldilock": [ - { - "a": "0xcff72ccd0878f6db", - "b": "0xcff72ccd0878f6db", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x9fee599b10f1edb5", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0xbaa983155336de7c", - "a_eq_b": true, - "a_m_pow_b": "0x1e84dcc388c2556c" - }, - { - "a": "0x42d97c54", - "b": "0x42d97c54", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x85b2f8a8", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x1174dcdf52c97b90", - "a_eq_b": true, - "a_m_pow_b": "0xb1cc3f5a3418d90a" - }, - { - "a": "0xec7870cda", - "b": "0xd49cf0c8c6f1c3ad", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xd49cf0d78e78d087", - "a_m_sub_b_m": "0x2b630f450095492e", - "a_m_mul_b_m": "0x9cf953f223fc69b0", - "a_eq_b": false, - "a_m_pow_b": "0x8dd96023f7efbbd5" - }, - { - "a": "0xdf98d37dcea0d00", - "b": "0x170170b4", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xdf98d37f3eb7db4", - "a_m_sub_b_m": "0xdf98d37c5e89c4c", - "a_m_mul_b_m": "0x94921fd2c5ffa430", - "a_eq_b": false, - "a_m_pow_b": "0xf807d4d82c63401a" - }, - { - "a": "0x5dc0f8857", - "b": "0x1a95bb345", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x7856b3b9c", - "a_m_sub_b_m": "0x432b3d512", - "a_m_mul_b_m": "0xbc6f1d5a1271946a", - "a_eq_b": false, - "a_m_pow_b": "0xe951a2a3f307464d" - }, - { - "a": "0x4", - "b": "0xc9d9e5988785d800", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xc9d9e5988785d804", - "a_m_sub_b_m": "0x36261a66787a2805", - "a_m_mul_b_m": "0x276796651e175ffd", - "a_eq_b": false, - "a_m_pow_b": "0xffffffff" - }, - { - "a": "0x1ad2cc", - "b": "0xb4eb", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x1b87b7", - "a_m_sub_b_m": "0x1a1de1", - "a_m_mul_b_m": "0x12f4d6f144", - "a_eq_b": false, - "a_m_pow_b": "0xf8385fc7a12d75bb" - }, - { - "a": "0x3ccbb8a", - "b": "0x600d5c", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x42cc8e6", - "a_m_sub_b_m": "0x36cae2e", - "a_m_mul_b_m": "0x16cf916d96798", - "a_eq_b": false, - "a_m_pow_b": "0x6011a2bce929bd61" - }, - { - "a": "0xa0ffb7b124a3b635", - "b": "0x1b1", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xa0ffb7b124a3b7e6", - "a_m_sub_b_m": "0xa0ffb7b124a3b484", - "a_m_mul_b_m": "0x5085b3aef8e72e95", - "a_eq_b": false, - "a_m_pow_b": "0x49b1f9a7fbeeb529" - }, - { - "a": "0x7d5ab564", - "b": "0xe2446c90fee5d0", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xe2446d0e599b34", - "a_m_sub_b_m": "0xff1dbb92ec5bcf95", - "a_m_mul_b_m": "0x6429b85536bf09ab", - "a_eq_b": false, - "a_m_pow_b": "0x8400187f70f20ce0" - }, - { - "a": "0x1086f808998e5e", - "b": "0xbf5bc1a8cb110ef8", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xbf6c48a0d3aa9d56", - "a_m_sub_b_m": "0x40b4c54e3d887f67", - "a_m_mul_b_m": "0x4c6f3fb72f806741", - "a_eq_b": false, - "a_m_pow_b": "0xa52867960705eeca" - }, - { - "a": "0x117f", - "b": "0x8e3d9793d6f1b", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x8e3d9793d809a", - "a_m_sub_b_m": "0xfff71c2586c2a265", - "a_m_mul_b_m": "0x9b8a79f039dae965", - "a_eq_b": false, - "a_m_pow_b": "0xe59cac050da0a7e8" - }, - { - "a": "0x2fd824cdcb59a", - "b": "0x9da40a3454fe81bb", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x9da707b6a1db3755", - "a_m_sub_b_m": "0x625ef34cf7de33e0", - "a_m_mul_b_m": "0x40239927a4653db7", - "a_eq_b": false, - "a_m_pow_b": "0x552f95f04b66d7a" - }, - { - "a": "0x7bd6879", - "b": "0x7", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x7bd6880", - "a_m_sub_b_m": "0x7bd6872", - "a_m_mul_b_m": "0x362ddb4f", - "a_eq_b": false, - "a_m_pow_b": "0x5a3b7929f866986d" - }, - { - "a": "0xd407f0248ca87000", - "b": "0x0", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xd407f0248ca87000", - "a_m_sub_b_m": "0xd407f0248ca87000", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x997578a7b29f1000", - "b": "0x12997", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x997578a7b2a03997", - "a_m_sub_b_m": "0x997578a7b29de669", - "a_m_mul_b_m": "0xcd456b87e561bd9d", - "a_eq_b": false, - "a_m_pow_b": "0x8e86620b13a900fa" - }, - { - "a": "0x17c696e5912", - "b": "0x3ebbf7e4d6", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x1bb25663de8", - "a_m_sub_b_m": "0x13dad76743c", - "a_m_mul_b_m": "0xda1b50027ff01fd4", - "a_eq_b": false, - "a_m_pow_b": "0xab165d61a8ae638a" - }, - { - "a": "0xaacc3362454", - "b": "0x0", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xaacc3362454", - "a_m_sub_b_m": "0xaacc3362454", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x1ee63717ed01a90", - "b": "0x3a82fe9b1720dc00", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x3c71620c95f0f690", - "a_m_sub_b_m": "0xc76b64d567af3e91", - "a_m_mul_b_m": "0xc61012312fd7b8de", - "a_eq_b": false, - "a_m_pow_b": "0x7c2316c0e09da244" - }, - { - "a": "0x20547fc48900a00", - "b": "0xc4db49b7e3", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x20548c123d9c1e3", - "a_m_sub_b_m": "0x20547376d46521d", - "a_m_mul_b_m": "0x635f4e59b18a74d", - "a_eq_b": false, - "a_m_pow_b": "0x7cc3dab115991b57" - }, - { - "a": "0xa5df43", - "b": "0x0", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xa5df43", - "a_m_sub_b_m": "0xa5df43", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x32d1ba673048fc0", - "b": "0x3223f52d2e01440", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x64f5af945e4a400", - "a_m_sub_b_m": "0xadc53a0247b80", - "a_m_mul_b_m": "0x1c178652a4020d96", - "a_eq_b": false, - "a_m_pow_b": "0x1f5c3d89fd624c13" - }, - { - "a": "0x7a57bd548a57e00", - "b": "0x0", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x7a57bd548a57e00", - "a_m_sub_b_m": "0x7a57bd548a57e00", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0xee323cad7630", - "b": "0xae876d0", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xee324795ed00", - "a_m_sub_b_m": "0xee3231c4ff60", - "a_m_mul_b_m": "0x42727ec03cea1cda", - "a_eq_b": false, - "a_m_pow_b": "0x8559ec78489aa8c1" - }, - { - "a": "0x8e2af53d1df7", - "b": "0x94427773eec6c987", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x9443059ee403e77e", - "a_m_sub_b_m": "0x6bbe16b606765471", - "a_m_mul_b_m": "0x2d6462445f9a80f1", - "a_eq_b": false, - "a_m_pow_b": "0xd4e30b765a501c1b" - }, - { - "a": "0xfe8b1737e93cef4b", - "b": "0x9c3", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xfe8b1737e93cf90e", - "a_m_sub_b_m": "0xfe8b1737e93ce588", - "a_m_mul_b_m": "0xc7c3b07dcdd3df6d", - "a_eq_b": false, - "a_m_pow_b": "0x581af1f53620faf4" - }, - { - "a": "0x7c1d07b", - "b": "0x10953", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x7c2d9ce", - "a_m_sub_b_m": "0x7c0c728", - "a_m_mul_b_m": "0x80a24a5eae1", - "a_eq_b": false, - "a_m_pow_b": "0x1025aa8356598105" - }, - { - "a": "0x4b3d8", - "b": "0x0", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x4b3d8", - "a_m_sub_b_m": "0x4b3d8", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x11947e7ec", - "b": "0x4b25f85dd06d", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x4b2711a5b859", - "a_m_sub_b_m": "0xffffb4da20ea1780", - "a_m_mul_b_m": "0xc93bb87b10c92ceb", - "a_eq_b": false, - "a_m_pow_b": "0xdee6e2d01cafd86f" - }, - { - "a": "0x2c", - "b": "0xd6e07e6f7e297815", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xd6e07e6f7e297841", - "a_m_sub_b_m": "0x291f818f81d68818", - "a_m_mul_b_m": "0xee95bb4daf20a378", - "a_eq_b": false, - "a_m_pow_b": "0x7eb040e54f9a0026" - }, - { - "a": "0x5342db", - "b": "0x2078862de352", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x20788681262d", - "a_m_sub_b_m": "0xffffdf867a255f8a", - "a_m_mul_b_m": "0x8f8e5a9d51729b1c", - "a_eq_b": false, - "a_m_pow_b": "0x6845339cee4a00db" - }, - { - "a": "0x2fbc8b848e", - "b": "0x2fbc8b848e", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x5f7917091c", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0xc617ebc3c6d6b5de", - "a_eq_b": true, - "a_m_pow_b": "0x4cb07662599a6c60" - }, - { - "a": "0x13", - "b": "0x13", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x26", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x169", - "a_eq_b": true, - "a_m_pow_b": "0x582eb56bedb76899" - }, - { - "a": "0x12d", - "b": "0x162203cb09a1", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x162203cb0ace", - "a_m_sub_b_m": "0xffffe9dcfc34f78d", - "a_m_mul_b_m": "0x1a05fe75ba524d", - "a_eq_b": false, - "a_m_pow_b": "0xdf8aa01b17053b64" - }, - { - "a": "0x449dea6d3ac020", - "b": "0xb27b93816ebb5800", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xb2c0316bdbf61820", - "a_m_sub_b_m": "0x4dc90a67fe7f6821", - "a_m_mul_b_m": "0x6ab700dfe046f658", - "a_eq_b": false, - "a_m_pow_b": "0x630c3d2238c2a6c" - }, - { - "a": "0x19b5a3d8c", - "b": "0x47", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x19b5a3dd3", - "a_m_sub_b_m": "0x19b5a3d45", - "a_m_mul_b_m": "0x72160711d4", - "a_eq_b": false, - "a_m_pow_b": "0xf6a4f80e4caeeeeb" - }, - { - "a": "0x278", - "b": "0x89fb06ff788afa15", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x89fb06ff788afc8d", - "a_m_sub_b_m": "0x7604f8ff87750864", - "a_m_mul_b_m": "0xa3b9480597196284", - "a_eq_b": false, - "a_m_pow_b": "0x23cd4a08488ef175" - }, - { - "a": "0xbbb4c240a0fdd91b", - "b": "0xf5c189d45b53cd42", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xb1764c15fc51a65c", - "a_m_sub_b_m": "0xc5f3386b45aa0bda", - "a_m_mul_b_m": "0x8580f86653733abc", - "a_eq_b": false, - "a_m_pow_b": "0x427e3dd4289a5753" - }, - { - "a": "0xd2cd1d", - "b": "0x83", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xd2cda0", - "a_m_sub_b_m": "0xd2cc9a", - "a_m_mul_b_m": "0x6bdef5d7", - "a_eq_b": false, - "a_m_pow_b": "0x811de4e87cff7578" - }, - { - "a": "0xa66b8c", - "b": "0x3b7c99d", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x45e3529", - "a_m_sub_b_m": "0xfffffffefceea1f0", - "a_m_mul_b_m": "0x26abc9594e0dc", - "a_eq_b": false, - "a_m_pow_b": "0xbf70fcd1d14323af" - }, - { - "a": "0x21bb3", - "b": "0x279", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x21e2c", - "a_m_sub_b_m": "0x2193a", - "a_m_mul_b_m": "0x5367d9b", - "a_eq_b": false, - "a_m_pow_b": "0x64fe7d88b7f7b929" - }, - { - "a": "0x12557e38ee0", - "b": "0x18399a", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x12557fbc87a", - "a_m_sub_b_m": "0x12557cb5546", - "a_m_mul_b_m": "0x1bc23e5deeb3d2c0", - "a_eq_b": false, - "a_m_pow_b": "0x75502b2ef37a236d" - }, - { - "a": "0x3f8d12", - "b": "0xaa4716fee9ba2", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xaa471702e28b4", - "a_m_sub_b_m": "0xfff55b8d9050f171", - "a_m_mul_b_m": "0x553c98fc975d28c0", - "a_eq_b": false, - "a_m_pow_b": "0xd8df4bc761a42c17" - }, - { - "a": "0xcd61a966961516b5", - "b": "0x94e2ef1550ecb7bf", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x6244987ce701ce73", - "a_m_sub_b_m": "0x387eba5145285ef6", - "a_m_mul_b_m": "0x17914cddf1f6046c", - "a_eq_b": false, - "a_m_pow_b": "0x3d4eda513d00cf8" - }, - { - "a": "0x3254c7ee4680", - "b": "0xe1fb0", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x3254c7fc6630", - "a_m_sub_b_m": "0x3254c7e026d0", - "a_m_mul_b_m": "0xc6ddcd892959f7fe", - "a_eq_b": false, - "a_m_pow_b": "0xf869f8d12269cced" - }, - { - "a": "0x1145", - "b": "0xcf9b505e2", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xcf9b51727", - "a_m_sub_b_m": "0xfffffff2064b0b64", - "a_m_mul_b_m": "0xe014532e97ea", - "a_eq_b": false, - "a_m_pow_b": "0x5681cca2b84bba8d" - }, - { - "a": "0x319645b2da56", - "b": "0x12fb52f", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x319646e28f85", - "a_m_sub_b_m": "0x319644832527", - "a_m_mul_b_m": "0xd3f4d8c8abfee390", - "a_eq_b": false, - "a_m_pow_b": "0xa3844c26985a43d6" - }, - { - "a": "0x57097a6e18a", - "b": "0x15fc398384a", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x6d05b3f19d4", - "a_m_sub_b_m": "0x410d40ea940", - "a_m_mul_b_m": "0xed6712575f7be85d", - "a_eq_b": false, - "a_m_pow_b": "0x94eb5cb8640162cf" - }, - { - "a": "0x40", - "b": "0x40", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x80", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x1000", - "a_eq_b": true, - "a_m_pow_b": "0x1" - }, - { - "a": "0xe677a53d3d47", - "b": "0x3f77c479e", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xe67b9cb984e5", - "a_m_sub_b_m": "0xe673adc0f5a9", - "a_m_mul_b_m": "0x4296d67e272af09e", - "a_eq_b": false, - "a_m_pow_b": "0x19222b411233b463" - }, - { - "a": "0x113b34d0566", - "b": "0xa21", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x113b34d0f87", - "a_m_sub_b_m": "0x113b34cfb45", - "a_m_mul_b_m": "0xae88b1f23ae26", - "a_eq_b": false, - "a_m_pow_b": "0x35df5448a58b84fa" - }, - { - "a": "0x2e3c", - "b": "0x8738cfbf07b0", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x8738cfbf35ec", - "a_m_sub_b_m": "0xffff78c63041268d", - "a_m_mul_b_m": "0x186be6a504276d40", - "a_eq_b": false, - "a_m_pow_b": "0xc43c70a83da9ce3b" - }, - { - "a": "0x38", - "b": "0x28e7c82f", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x28e7c867", - "a_m_sub_b_m": "0xfffffffed718380a", - "a_m_mul_b_m": "0x8f2b3ca48", - "a_eq_b": false, - "a_m_pow_b": "0xc0c8af2c7abbc3d8" - }, - { - "a": "0xfa5e1720", - "b": "0x11db4328", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x10c395a48", - "a_m_sub_b_m": "0xe882d3f8", - "a_m_mul_b_m": "0x1176afb4a720fd00", - "a_eq_b": false, - "a_m_pow_b": "0x2d7e114302ba0dcf" - }, - { - "a": "0xd7", - "b": "0x4ca89ba36ae", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x4ca89ba3785", - "a_m_sub_b_m": "0xfffffb347645ca2a", - "a_m_mul_b_m": "0x40619ab63ec22", - "a_eq_b": false, - "a_m_pow_b": "0x9248e6a9ef294dce" - }, - { - "a": "0x1bd8362a070", - "b": "0x26c26", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x1bd83650c96", - "a_m_sub_b_m": "0x1bd8360344a", - "a_m_mul_b_m": "0x4373c545d3310a0", - "a_eq_b": false, - "a_m_pow_b": "0xf4ca76db53d98003" - }, - { - "a": "0xdd8776140d", - "b": "0x2827877847bf5a", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x282864ffbdd367", - "a_m_sub_b_m": "0xffd7d9550f2e54b4", - "a_m_mul_b_m": "0xc6af6e433d546042", - "a_eq_b": false, - "a_m_pow_b": "0x574aa45d4c8622b4" - }, - { - "a": "0x8", - "b": "0x7e41c3676", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x7e41c367e", - "a_m_sub_b_m": "0xfffffff71be3c993", - "a_m_mul_b_m": "0x3f20e1b3b0", - "a_eq_b": false, - "a_m_pow_b": "0xfffffffb00000005" - }, - { - "a": "0x13f906", - "b": "0xc78ae8bb", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xc79ee1c1", - "a_m_sub_b_m": "0xfffffffe3889104c", - "a_m_mul_b_m": "0xf916a0f805762", - "a_eq_b": false, - "a_m_pow_b": "0x503d7330aa6c67c4" - }, - { - "a": "0x3", - "b": "0xecc77f638fdeab3c", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xecc77f638fdeab3f", - "a_m_sub_b_m": "0x1338809b702154c8", - "a_m_mul_b_m": "0xc6567e2caf9c01b2", - "a_eq_b": false, - "a_m_pow_b": "0x172d35495db1723d" - }, - { - "a": "0x0", - "b": "0xa7ea1a21e84b60ec", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xa7ea1a21e84b60ec", - "a_m_sub_b_m": "0x5815e5dd17b49f15", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x9483d939b38", - "b": "0x82b2cb", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x9483e164e03", - "a_m_sub_b_m": "0x9483d10e86d", - "a_m_mul_b_m": "0xbd2adc1248690564", - "a_eq_b": false, - "a_m_pow_b": "0x9e1b78ac0ef6b406" - }, - { - "a": "0x3cfd8865c", - "b": "0x22383c4", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x3d1fc0a20", - "a_m_sub_b_m": "0x3cdb50298", - "a_m_mul_b_m": "0x82711ee051bf270", - "a_eq_b": false, - "a_m_pow_b": "0xa7826460346ec80b" - }, - { - "a": "0x0", - "b": "0x95b622365b28", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x95b622365b28", - "a_m_sub_b_m": "0xffff6a48ddc9a4d9", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x10", - "b": "0x13076a", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x13077a", - "a_m_sub_b_m": "0xfffffffeffecf8a7", - "a_m_mul_b_m": "0x13076a0", - "a_eq_b": false, - "a_m_pow_b": "0xfffffeff00000101" - }, - { - "a": "0x1ad3f2156b62ce0", - "b": "0x20dd5", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x1ad3f2156b83ab5", - "a_m_sub_b_m": "0x1ad3f2156b41f0b", - "a_m_mul_b_m": "0xaf9ce901bf9ab2ef", - "a_eq_b": false, - "a_m_pow_b": "0xd4e1d7aeda98f03b" - }, - { - "a": "0x48ff136b2", - "b": "0x26a86bbaef2a9e0", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x26a86c03ee3e092", - "a_m_sub_b_m": "0xfd957947e0fe8cd3", - "a_m_mul_b_m": "0x9ab70f3ad5697ac2", - "a_eq_b": false, - "a_m_pow_b": "0x372ca20c02438785" - }, - { - "a": "0x33f8", - "b": "0xac44ba3", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xac47f9b", - "a_m_sub_b_m": "0xfffffffef53be856", - "a_m_mul_b_m": "0x22f893abee8", - "a_eq_b": false, - "a_m_pow_b": "0xf025fc4045a19a30" - }, - { - "a": "0x101166d362a82b", - "b": "0x1d41b0130f64a700", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x1d51c179e2c74f2b", - "a_m_sub_b_m": "0xe2ce6152c3fe012c", - "a_m_mul_b_m": "0x81f945df73476a83", - "a_eq_b": false, - "a_m_pow_b": "0xb9100100f984e88d" - }, - { - "a": "0x1463", - "b": "0x598", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x19fb", - "a_m_sub_b_m": "0xecb", - "a_m_mul_b_m": "0x7209c8", - "a_eq_b": false, - "a_m_pow_b": "0xae5cda138facbe2c" - }, - { - "a": "0xda", - "b": "0x3fc56fa92e8af0", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x3fc56fa92e8bca", - "a_m_sub_b_m": "0xffc03a8f56d175eb", - "a_m_mul_b_m": "0x364e211611a25060", - "a_eq_b": false, - "a_m_pow_b": "0x1a1e6f4b4d4e9a70" - }, - { - "a": "0xff4f2ec1bcbbf1f9", - "b": "0xff4f2ec1bcbbf1f9", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xfe9e5d847977e3f1", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0xe946055045c2d20f", - "a_eq_b": true, - "a_m_pow_b": "0xfc93f567bcd15c91" - }, - { - "a": "0xcbaf1561f08df7c1", - "b": "0xad50c0", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xcbaf1561f13b4881", - "a_m_sub_b_m": "0xcbaf1561efe0a701", - "a_m_mul_b_m": "0xedb81a2134c93b30", - "a_eq_b": false, - "a_m_pow_b": "0x8224c652b3c93c14" - }, - { - "a": "0x2cb01a", - "b": "0x4a8f443348", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x4a8f70e362", - "a_m_sub_b_m": "0xffffffb470e87cd3", - "a_m_mul_b_m": "0xd03e9ca408eb550", - "a_eq_b": false, - "a_m_pow_b": "0x830b4fe2fd4252d3" - }, - { - "a": "0x1f9", - "b": "0x123b31f02533cd00", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x123b31f02533cef9", - "a_m_sub_b_m": "0xedc4ce0edacc34fa", - "a_m_mul_b_m": "0xf6c582dc632f64dd", - "a_eq_b": false, - "a_m_pow_b": "0x2a5ab8d896b275d9" - }, - { - "a": "0x201f0", - "b": "0x2c5ee430068e", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x2c5ee432087e", - "a_m_sub_b_m": "0xffffd3a01bd1fb63", - "a_m_mul_b_m": "0x5913c03a2a28b320", - "a_eq_b": false, - "a_m_pow_b": "0x69f94ecac053c6f2" - }, - { - "a": "0x292d0cb", - "b": "0x292d0cb", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x525a196", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x69f75fdd680f9", - "a_eq_b": true, - "a_m_pow_b": "0xc9e83decdb7efa98" - }, - { - "a": "0xa308f50a7b5b2", - "b": "0x71bfee8a", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xa308fc267a43c", - "a_m_sub_b_m": "0xa308edee7c728", - "a_m_mul_b_m": "0xfc2f25a3871ce6e2", - "a_eq_b": false, - "a_m_pow_b": "0x40d1adbfe2694299" - }, - { - "a": "0xd8ef0e4d84f818", - "b": "0xd8ef0e4d84f818", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x1b1de1c9b09f030", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0xc91fbadbf1cf447f", - "a_eq_b": true, - "a_m_pow_b": "0xf6caf3bdd9c29ae7" - }, - { - "a": "0xe8a60fc61", - "b": "0x0", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xe8a60fc61", - "a_m_sub_b_m": "0xe8a60fc61", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x7033d1a971a0b4", - "b": "0xc42151dd8b85", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x70f7f2fb4f2c39", - "a_m_sub_b_m": "0x6f6fb05794152f", - "a_m_mul_b_m": "0x6009a53736723ed", - "a_eq_b": false, - "a_m_pow_b": "0xd62a4fa46ced51de" - }, - { - "a": "0x63cf0c66b0dfa", - "b": "0x3b28896", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x63cf0ca1d9690", - "a_m_sub_b_m": "0x63cf0c2b88564", - "a_m_mul_b_m": "0x85c4ed26c7fae96c", - "a_eq_b": false, - "a_m_pow_b": "0xa9b6cc27e821fcbd" - }, - { - "a": "0x0", - "b": "0x14fb691cc2f24a", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x14fb691cc2f24a", - "a_m_sub_b_m": "0xffeb0495e33d0db7", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x9e88eebf", - "b": "0x5aad549", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xa433c408", - "a_m_sub_b_m": "0x98de1976", - "a_m_mul_b_m": "0x38277ad6986ff77", - "a_eq_b": false, - "a_m_pow_b": "0xc0a3039828bdaf77" - }, - { - "a": "0x0", - "b": "0x413", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x413", - "a_m_sub_b_m": "0xfffffffefffffbee", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x9a763d22fa7068", - "b": "0x1d5", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x9a763d22fa723d", - "a_m_sub_b_m": "0x9a763d22fa6e93", - "a_m_mul_b_m": "0x1afa9e0214cfee87", - "a_eq_b": false, - "a_m_pow_b": "0x1d668dc8ae081e5e" - }, - { - "a": "0x160", - "b": "0x10b0cbb34ae335", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x10b0cbb34ae495", - "a_m_sub_b_m": "0xffef4f334cb51e2c", - "a_m_mul_b_m": "0x16f3181686f868e0", - "a_eq_b": false, - "a_m_pow_b": "0xf3876b08a96e7ee1" - }, - { - "a": "0x620e5fd3", - "b": "0x1317", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x620e72ea", - "a_m_sub_b_m": "0x620e4cbc", - "a_m_mul_b_m": "0x74fe06744f5", - "a_eq_b": false, - "a_m_pow_b": "0x8089b99d66cd1d8b" - }, - { - "a": "0x1e2ff", - "b": "0x44ffd2aa4667f800", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x44ffd2aa4669daff", - "a_m_sub_b_m": "0xbb002d54b999eb00", - "a_m_mul_b_m": "0x6577f259e27f85d2", - "a_eq_b": false, - "a_m_pow_b": "0xd07c4dee91d07a94" - }, - { - "a": "0x0", - "b": "0x10c81f5a74967e0", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x10c81f5a74967e0", - "a_m_sub_b_m": "0xfef37e0958b69821", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x29f7f8500", - "b": "0x68443788a04248", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x68443a281fc748", - "a_m_sub_b_m": "0xff97bbca16df42b9", - "a_m_mul_b_m": "0x932b2df3db15e943", - "a_eq_b": false, - "a_m_pow_b": "0xf7cbdebadec7c0d3" - }, - { - "a": "0x10284d7212", - "b": "0x3f8a5", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x1028516ab7", - "a_m_sub_b_m": "0x102849796d", - "a_m_mul_b_m": "0x402a5d56a1f59a", - "a_eq_b": false, - "a_m_pow_b": "0xbae299b75e292177" - }, - { - "a": "0x5e5842", - "b": "0xf14087f145c9d800", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xf14087f146283042", - "a_m_sub_b_m": "0xebf780dba948043", - "a_m_mul_b_m": "0x4c4e852caff0c722", - "a_eq_b": false, - "a_m_pow_b": "0xcbf54c3bef2ef779" - }, - { - "a": "0x3", - "b": "0x9df2cb295109800", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x9df2cb295109803", - "a_m_sub_b_m": "0xf620d34c6aef6804", - "a_m_mul_b_m": "0x1d9d8617bf31c800", - "a_eq_b": false, - "a_m_pow_b": "0xfa7ee0d96dbe59e5" - }, - { - "a": "0x9ffee98f91c73e1d", - "b": "0x84ab3b0a8799b000", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x24aa249b1960ee1c", - "a_m_sub_b_m": "0x1b53ae850a2d8e1d", - "a_m_mul_b_m": "0xfa52cf04b384ae91", - "a_eq_b": false, - "a_m_pow_b": "0xd76109518a30fbea" - }, - { - "a": "0x2bdeb23ab9653", - "b": "0x7a22858808", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x2be6546311e5b", - "a_m_sub_b_m": "0x2bd7101260e4b", - "a_m_mul_b_m": "0x5bf5b0ac6308e9e2", - "a_eq_b": false, - "a_m_pow_b": "0xd145dda4189581c0" - }, - { - "a": "0x191f7", - "b": "0xcc0f92f60c7c9761", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xcc0f92f60c7e2958", - "a_m_sub_b_m": "0x33f06d08f384fa97", - "a_m_mul_b_m": "0x483b755e3553bf2e", - "a_eq_b": false, - "a_m_pow_b": "0xaf2250d004cce6fa" - }, - { - "a": "0x46daa0cd1ce", - "b": "0x30", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x46daa0cd1fe", - "a_m_sub_b_m": "0x46daa0cd19e", - "a_m_mul_b_m": "0xd48fe26756a0", - "a_eq_b": false, - "a_m_pow_b": "0xa465b4c8bc6f2587" - }, - { - "a": "0x61202429425a0", - "b": "0x25c0d02ba23e400", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x2621f04fcb809a0", - "a_m_sub_b_m": "0xfdaa04fe887041a1", - "a_m_mul_b_m": "0x1f99ed018a12b0cf", - "a_eq_b": false, - "a_m_pow_b": "0x432c8528cf4fbcc4" - }, - { - "a": "0x1", - "b": "0x1df3ba3a7d7cf5", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x1df3ba3a7d7cf6", - "a_m_sub_b_m": "0xffe20c44c582830d", - "a_m_mul_b_m": "0x1df3ba3a7d7cf5", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x112aa367ee", - "b": "0x49da60b331", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x5b05041b1f", - "a_m_sub_b_m": "0xffffffc65042b4be", - "a_m_mul_b_m": "0xcd63cfb21032499b", - "a_eq_b": false, - "a_m_pow_b": "0x2aed118d5531de9b" - }, - { - "a": "0xe91214603bc3f21f", - "b": "0x965", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xe91214603bc3fb84", - "a_m_sub_b_m": "0xe91214603bc3e8ba", - "a_m_mul_b_m": "0x96d9749e77d194ae", - "a_eq_b": false, - "a_m_pow_b": "0xaebeacee98dedce9" - }, - { - "a": "0x2c2b58db0a5", - "b": "0x2c2b58db0a5", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x5856b1b614a", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0xe24b9736619dab6c", - "a_eq_b": true, - "a_m_pow_b": "0xe2bfd5c495884207" - }, - { - "a": "0x0", - "b": "0x0", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x0", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x0", - "a_eq_b": true, - "a_m_pow_b": "0x1" - }, - { - "a": "0x7ded21b8627e", - "b": "0x2603f04", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x7ded2418a182", - "a_m_sub_b_m": "0x7ded1f58237a", - "a_m_mul_b_m": "0x322f6a15d25e8acd", - "a_eq_b": false, - "a_m_pow_b": "0x745b29d1eaf9df6" - }, - { - "a": "0x143bc2c", - "b": "0x876133882e66500", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x8761338842a212c", - "a_m_sub_b_m": "0xf789ecc67e5d572d", - "a_m_mul_b_m": "0x6ac0a9bb20baa8ce", - "a_eq_b": false, - "a_m_pow_b": "0x17ea313c4650c777" - }, - { - "a": "0xa57cbd75724", - "b": "0x304e378ce27f3e", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x30588f58b9d662", - "a_m_sub_b_m": "0xffcfbc1f3ef4d7e7", - "a_m_mul_b_m": "0xdc4faeeadc8abfad", - "a_eq_b": false, - "a_m_pow_b": "0x15d418fca00f8712" - }, - { - "a": "0xdb9", - "b": "0x0", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xdb9", - "a_m_sub_b_m": "0xdb9", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x22b34f", - "b": "0x5eb6845", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x60e1b94", - "a_m_sub_b_m": "0xfffffffefa374b0b", - "a_m_mul_b_m": "0xcd6946b76c4b", - "a_eq_b": false, - "a_m_pow_b": "0xd12a4464648898c0" - }, - { - "a": "0xce10c17e45c0d", - "b": "0xe71241eb", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xce10cfef69df8", - "a_m_sub_b_m": "0xce10b30d21a22", - "a_m_mul_b_m": "0xd6b05461dde2cf2", - "a_eq_b": false, - "a_m_pow_b": "0xdb6307f1fbf14cd3" - }, - { - "a": "0x4bab5c0", - "b": "0xe9a0476094", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xe9a5021654", - "a_m_sub_b_m": "0xffffff156473552d", - "a_m_mul_b_m": "0x50e56eed285912fc", - "a_eq_b": false, - "a_m_pow_b": "0xb53d1de391f5dbb0" - }, - { - "a": "0x2412f81d6c7", - "b": "0x51ac", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x2412f822873", - "a_m_sub_b_m": "0x2412f81851b", - "a_m_mul_b_m": "0xb823d4003144b4", - "a_eq_b": false, - "a_m_pow_b": "0xb673826ce7ddcb27" - }, - { - "a": "0x381", - "b": "0x0", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x381", - "a_m_sub_b_m": "0x381", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x1c08d97ad0c", - "b": "0x1543e", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x1c08d99014a", - "a_m_sub_b_m": "0x1c08d9658ce", - "a_m_mul_b_m": "0x25428afbc8fd8e8", - "a_eq_b": false, - "a_m_pow_b": "0x8e60dd6231ef1f70" - }, - { - "a": "0x7", - "b": "0x3b3fdd0206724", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x3b3fdd020672b", - "a_m_sub_b_m": "0xfffc4c012fdf98e4", - "a_m_mul_b_m": "0x19ebf0b0e2d1fc", - "a_eq_b": false, - "a_m_pow_b": "0x5a77702170d1723b" - }, - { - "a": "0x1111cf58ea8dc", - "b": "0x15b60853ab91", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x126d2fde2546d", - "a_m_sub_b_m": "0xfb66ed3afd4b", - "a_m_mul_b_m": "0x8988c7f9e8c304ff", - "a_eq_b": false, - "a_m_pow_b": "0x313916e74c9c2a33" - }, - { - "a": "0x6fd16", - "b": "0x1614", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x7132a", - "a_m_sub_b_m": "0x6e702", - "a_m_mul_b_m": "0x9a4ba9b8", - "a_eq_b": false, - "a_m_pow_b": "0xc4b2bade43bb050b" - }, - { - "a": "0x240017e51c01b0", - "b": "0x110db", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x240017e51d128b", - "a_m_sub_b_m": "0x240017e51af0d5", - "a_m_mul_b_m": "0x5ee57804c0c0716a", - "a_eq_b": false, - "a_m_pow_b": "0x35c465015ec6cd3f" - }, - { - "a": "0x3915a75d4ded3a0", - "b": "0x3915a75d4ded3a0", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x722b4eba9bda740", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0xc92b2dfe5bf4fc10", - "a_eq_b": true, - "a_m_pow_b": "0xb2ddac3f14bdce32" - }, - { - "a": "0xd7ab6bdd6f086f65", - "b": "0x9706c", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xd7ab6bdd6f11dfd1", - "a_m_sub_b_m": "0xd7ab6bdd6efefef9", - "a_m_mul_b_m": "0xc6533d0672d03ae0", - "a_eq_b": false, - "a_m_pow_b": "0x981079489fed8439" - }, - { - "a": "0x10169d7c2", - "b": "0x83a07630003ff", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x83a086469dbc1", - "a_m_sub_b_m": "0xfff7c5f89e69d3c4", - "a_m_mul_b_m": "0x266b126aabecea96", - "a_eq_b": false, - "a_m_pow_b": "0x3be0ffb108b5a2b1" - }, - { - "a": "0x9e60a1200321", - "b": "0x12088fd37209ce00", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x12092e341329d121", - "a_m_sub_b_m": "0xedf80e8c2f163522", - "a_m_mul_b_m": "0x4a15c3ca79596f6d", - "a_eq_b": false, - "a_m_pow_b": "0xb2065ff4d24a1269" - }, - { - "a": "0x11ab75c35b4d", - "b": "0x11ab75c35b4d", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x2356eb86b69a", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x7c8091e098a59caf", - "a_eq_b": true, - "a_m_pow_b": "0xcc31f8886fe7430d" - }, - { - "a": "0x24750", - "b": "0x8cb0485fafe2f000", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x8cb0485fafe53750", - "a_m_sub_b_m": "0x734fb79f501f5751", - "a_m_mul_b_m": "0x6be9c805c779bf6f", - "a_eq_b": false, - "a_m_pow_b": "0xe94fdffa3cc8fd5c" - }, - { - "a": "0x157c2c17e", - "b": "0x157c2c17e", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x2af8582fc", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0xcd9b76aa79373a03", - "a_eq_b": true, - "a_m_pow_b": "0x745911bf68dd4487" - }, - { - "a": "0x73cd2df1", - "b": "0x7", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x73cd2df8", - "a_m_sub_b_m": "0x73cd2dea", - "a_m_mul_b_m": "0x32a9c4197", - "a_eq_b": false, - "a_m_pow_b": "0xfc4e5ff00826fca3" - }, - { - "a": "0x96b8b01197ec1a40", - "b": "0x96b8b01197ec1a40", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x2d7160242fd8347f", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x1807217a5f88d82b", - "a_eq_b": true, - "a_m_pow_b": "0xdf8c460dd0af12b7" - }, - { - "a": "0x668c2", - "b": "0x30dcb9068dd2c600", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x30dcb9068dd92ec2", - "a_m_sub_b_m": "0xcf2346f87233a2c3", - "a_m_mul_b_m": "0x8976cb0be28d2d5", - "a_eq_b": false, - "a_m_pow_b": "0x10a7c072647d59d3" - }, - { - "a": "0x12b739da1c", - "b": "0x5da6", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x12b73a37c2", - "a_m_sub_b_m": "0x12b7397c76", - "a_m_mul_b_m": "0x6d8b2d3bf9a28", - "a_eq_b": false, - "a_m_pow_b": "0xb24bd289ec1456d1" - }, - { - "a": "0x34809fff9dd", - "b": "0x7a3a43", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x3480a7a3420", - "a_m_sub_b_m": "0x3480985bf9a", - "a_m_mul_b_m": "0x9113f21cafec76d6", - "a_eq_b": false, - "a_m_pow_b": "0xef8e78f156a75080" - }, - { - "a": "0x2e9", - "b": "0xc32", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xf1b", - "a_m_sub_b_m": "0xfffffffefffff6b8", - "a_m_mul_b_m": "0x237d82", - "a_eq_b": false, - "a_m_pow_b": "0x5136f9f6c6c67b1f" - }, - { - "a": "0x8d2a5659265a9190", - "b": "0x81fd679647bd", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x8d2ad8568df0d94d", - "a_m_sub_b_m": "0x8d29d45bbec449d3", - "a_m_mul_b_m": "0x933f7f09822f618", - "a_eq_b": false, - "a_m_pow_b": "0xd88c76908e57ac1b" - }, - { - "a": "0x64", - "b": "0xd58c96f2cb09c00", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xd58c96f2cb09c64", - "a_m_sub_b_m": "0xf2a7368fd34f6465", - "a_m_mul_b_m": "0x36aeaf7274fceffb", - "a_eq_b": false, - "a_m_pow_b": "0xfc366c68b3d715ed" - }, - { - "a": "0x37", - "b": "0x37", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x6e", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0xbd1", - "a_eq_b": true, - "a_m_pow_b": "0xdf5f6c9fd0b9698" - }, - { - "a": "0x2cad7d0c0ad6", - "b": "0x4d466ab231b1", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x79f3e7be3c87", - "a_m_sub_b_m": "0xffffdf661259d926", - "a_m_mul_b_m": "0xcd1dd4eddab5fb4b", - "a_eq_b": false, - "a_m_pow_b": "0x16e3b34031aa0b59" - }, - { - "a": "0xaac2b7e772e27", - "b": "0x114a9574", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xaac2b8fc1c39b", - "a_m_sub_b_m": "0xaac2b6d2c98b3", - "a_m_mul_b_m": "0xe304855e9a22e422", - "a_eq_b": false, - "a_m_pow_b": "0x4c7350ec46350a75" - }, - { - "a": "0x2afa08", - "b": "0xb790", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x2bb198", - "a_m_sub_b_m": "0x2a4278", - "a_m_mul_b_m": "0x1ed0e85c80", - "a_eq_b": false, - "a_m_pow_b": "0xc651246e50a9bcc2" - }, - { - "a": "0x7ab88f", - "b": "0xd071c6ebf7003585", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xd071c6ebf77aee14", - "a_m_sub_b_m": "0x2f8e3913097a830b", - "a_m_mul_b_m": "0x35f59efa09390cc", - "a_eq_b": false, - "a_m_pow_b": "0xbf784ba8c88faf2c" - }, - { - "a": "0x6f84d68db4488", - "b": "0x6f84d68db4488", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xdf09ad1b68910", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0xde789a243e918b38", - "a_eq_b": true, - "a_m_pow_b": "0x8e2db7910fe11a6" - }, - { - "a": "0x2", - "b": "0xc735c0d1e9edc59c", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xc735c0d1e9edc59e", - "a_m_sub_b_m": "0x38ca3f2d16123a67", - "a_m_mul_b_m": "0x8e6b81a4d3db8b37", - "a_eq_b": false, - "a_m_pow_b": "0xefffffff00000001" - }, - { - "a": "0x3ca750c8195", - "b": "0x6a4c670d7dd", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xa6f3b7d5972", - "a_m_sub_b_m": "0xfffffd24ae9ba9b9", - "a_m_mul_b_m": "0x8972e09b7bb6d140", - "a_eq_b": false, - "a_m_pow_b": "0x4494fb5dd4693ffc" - }, - { - "a": "0x12f1ebb78f6", - "b": "0x12f1ebb78f6", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x25e3d76f1ec", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0xc37a36e0988a257b", - "a_eq_b": true, - "a_m_pow_b": "0x61a75e812a978e70" - }, - { - "a": "0x156c98c", - "b": "0x805618bddd82ab3e", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x805618bdded974ca", - "a_m_sub_b_m": "0x7fa9e74123d41e4f", - "a_m_mul_b_m": "0xd6d45f5f80117bda", - "a_eq_b": false, - "a_m_pow_b": "0x7e31d9d00746b50f" - }, - { - "a": "0x4deb64f204187c0", - "b": "0x4deb64f204187c0", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x9bd6c9e40830f80", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0xb699d36d0b51c056", - "a_eq_b": true, - "a_m_pow_b": "0x90d82c84e3b8561f" - }, - { - "a": "0xa1ae74822f4fc8", - "b": "0x8c1651945af9", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xa23a8ad3c3aac1", - "a_m_sub_b_m": "0xa1225e309af4cf", - "a_m_mul_b_m": "0xb65656f93030ae16", - "a_eq_b": false, - "a_m_pow_b": "0xd8948fd3e065a5e7" - }, - { - "a": "0x25f59df5637bc", - "b": "0x3e347feb49d450", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x4093d9caa00c0c", - "a_m_sub_b_m": "0xffc42ad8f40c636d", - "a_m_mul_b_m": "0xb4ab81815634621", - "a_eq_b": false, - "a_m_pow_b": "0x24a9118578d30fe0" - }, - { - "a": "0x0", - "b": "0x1fb", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x1fb", - "a_m_sub_b_m": "0xfffffffefffffe06", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x0", - "b": "0xa33a8d893b", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xa33a8d893b", - "a_m_sub_b_m": "0xffffff5bc57276c6", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x1", - "b": "0x2ecee06610e18400", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x2ecee06610e18401", - "a_m_sub_b_m": "0xd1311f98ef1e7c02", - "a_m_mul_b_m": "0x2ecee06610e18400", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x873dcc6f03", - "b": "0x1640c8dc46192", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x16493cb90d095", - "a_m_sub_b_m": "0xfffe9c79b0080d72", - "a_m_mul_b_m": "0x1579edeb59375a24", - "a_eq_b": false, - "a_m_pow_b": "0x75d2056627461e52" - }, - { - "a": "0x9754db94dae7c00", - "b": "0x1781e3c0e1926d", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x98ccf9d0e900e6d", - "a_m_sub_b_m": "0x95dcbd58ccce993", - "a_m_mul_b_m": "0xab8e737d100d57bb", - "a_eq_b": false, - "a_m_pow_b": "0x33f8c45f48374d87" - }, - { - "a": "0x316ec70ff9aad000", - "b": "0x2fc931b7ad", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x316ec73fc2dc87ad", - "a_m_sub_b_m": "0x316ec6e030791853", - "a_m_mul_b_m": "0x4dcb282c68ee7011", - "a_eq_b": false, - "a_m_pow_b": "0x74fc564089c158db" - }, - { - "a": "0x393232d8e77c", - "b": "0x38e5e353e6b446", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x391f1586bf9bc2", - "a_m_sub_b_m": "0xffc7534ddef23337", - "a_m_mul_b_m": "0x48bbf18be122aaab", - "a_eq_b": false, - "a_m_pow_b": "0xc81230c8fbe4b017" - }, - { - "a": "0x337d546a9d", - "b": "0xf98ee607e1d2700", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xf98ee93fb71919d", - "a_m_sub_b_m": "0xf06711d1ff37439e", - "a_m_mul_b_m": "0x7ba4d64c12ec9cb2", - "a_eq_b": false, - "a_m_pow_b": "0x51b315c277d26384" - }, - { - "a": "0x0", - "b": "0x41d01308548cbc0", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x41d01308548cbc0", - "a_m_sub_b_m": "0xfbe2fece7ab73441", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x7497856b88c300", - "b": "0x16472d20005de100", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x16bbc4a56be6a400", - "a_m_sub_b_m": "0xea2d6a646b2ae201", - "a_m_mul_b_m": "0x1f77d737ffe4b78a", - "a_eq_b": false, - "a_m_pow_b": "0x758f0363cfcb14f" - }, - { - "a": "0x5b4c873b", - "b": "0x62973a570e", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x62f286de49", - "a_m_sub_b_m": "0xffffff9cc412302e", - "a_m_mul_b_m": "0x293ab6df70827217", - "a_eq_b": false, - "a_m_pow_b": "0xd0f961b5c65c30bf" - }, - { - "a": "0x3a7eae", - "b": "0x3a7eae", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x74fd5c", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0xd5da587be44", - "a_eq_b": true, - "a_m_pow_b": "0x9dcdb0a2b23dcd8a" - }, - { - "a": "0x4f9f85", - "b": "0x4851", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x4fe7d6", - "a_m_sub_b_m": "0x4f5734", - "a_m_mul_b_m": "0x167e0ee115", - "a_eq_b": false, - "a_m_pow_b": "0x5e73a3f7c8b5cd2d" - }, - { - "a": "0x39daadf5", - "b": "0x837", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x39dab62c", - "a_m_sub_b_m": "0x39daa5be", - "a_m_mul_b_m": "0x1db436b07a3", - "a_eq_b": false, - "a_m_pow_b": "0xa944408feb004e19" - }, - { - "a": "0x39082849bf0b9200", - "b": "0x8cc", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x39082849bf0b9acc", - "a_m_sub_b_m": "0x39082849bf0b8934", - "a_m_mul_b_m": "0xb3c26ab199c8560b", - "a_eq_b": false, - "a_m_pow_b": "0xd25f04c18c5cfde0" - }, - { - "a": "0x60dfceb41", - "b": "0x1155d9e47ab", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x11b6b9b32ec", - "a_m_sub_b_m": "0xfffffeefb05ea397", - "a_m_mul_b_m": "0x597dc9604c4e24dc", - "a_eq_b": false, - "a_m_pow_b": "0x512957e3951142c7" - }, - { - "a": "0x218346f4c48f1e", - "b": "0x2e4bd0e816e7c80", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x306405576330b9e", - "a_m_sub_b_m": "0xfd3cc6377356129f", - "a_m_mul_b_m": "0xe23a3ea1fb90aba7", - "a_eq_b": false, - "a_m_pow_b": "0xd2e8072405088e6d" - }, - { - "a": "0x1", - "b": "0xf65d8428ce3280", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xf65d8428ce3281", - "a_m_sub_b_m": "0xff09a27ad731cd82", - "a_m_mul_b_m": "0xf65d8428ce3280", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x0", - "b": "0x2c448fcbcd2568", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x2c448fcbcd2568", - "a_m_sub_b_m": "0xffd3bb6f3432da99", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x29ec1b15", - "b": "0x16df34c5f27e", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x16df5eb20d93", - "a_m_sub_b_m": "0xffffe91ff5262898", - "a_m_mul_b_m": "0xd7a3c8efeef82a98", - "a_eq_b": false, - "a_m_pow_b": "0xb26522d087332db3" - }, - { - "a": "0x1e378", - "b": "0x0", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x1e378", - "a_m_sub_b_m": "0x1e378", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x1e021e2132dda7", - "b": "0x32a47b", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x1e021e21658222", - "a_m_sub_b_m": "0x1e021e2100392c", - "a_m_mul_b_m": "0xb1a8d39cd40d754e", - "a_eq_b": false, - "a_m_pow_b": "0x41f0039fa04be792" - }, - { - "a": "0x9e796cae851a3e66", - "b": "0x166f29f", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x9e796cae86813105", - "a_m_sub_b_m": "0x9e796cae83b34bc7", - "a_m_mul_b_m": "0x3313d0e9bc0ef95b", - "a_eq_b": false, - "a_m_pow_b": "0xe937871d298bdc29" - }, - { - "a": "0x0", - "b": "0xf401b9b85", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xf401b9b85", - "a_m_sub_b_m": "0xffffffefbfe4647c", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x0", - "b": "0x370843721700", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x370843721700", - "a_m_sub_b_m": "0xffffc8f6bc8de901", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0xd67bfa7", - "b": "0x961b3470929", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x961c0aec8d0", - "a_m_sub_b_m": "0xfffff69d5a20b67f", - "a_m_mul_b_m": "0xc36fc106b7ab9042", - "a_eq_b": false, - "a_m_pow_b": "0xdf72787cd57f4a4e" - }, - { - "a": "0x10e9dba78ef", - "b": "0x0", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x10e9dba78ef", - "a_m_sub_b_m": "0x10e9dba78ef", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x1827f48644fa0a00", - "b": "0x10f189c89b", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x1827f4973683d29b", - "a_m_sub_b_m": "0x1827f47553704165", - "a_m_mul_b_m": "0x2eec64edbea2818", - "a_eq_b": false, - "a_m_pow_b": "0x9ff29889c3d1bd58" - }, - { - "a": "0x0", - "b": "0x3c5", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x3c5", - "a_m_sub_b_m": "0xfffffffefffffc3c", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x437ed07", - "b": "0x437ed07", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x86fda0e", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x11cb9fec77f631", - "a_eq_b": true, - "a_m_pow_b": "0x5b2364fad46dbc5b" - }, - { - "a": "0x1e190d8d3fd53", - "b": "0x263623de65462", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x444f316ba51b5", - "a_m_sub_b_m": "0xffff7e2d9aeda8f2", - "a_m_mul_b_m": "0x3f62c89671c2b25c", - "a_eq_b": false, - "a_m_pow_b": "0x37ccfbbc7032ccc2" - }, - { - "a": "0x9b2925d09cf", - "b": "0x188998d754140900", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x1889a289e67112cf", - "a_m_sub_b_m": "0xe77670da3e4900d0", - "a_m_mul_b_m": "0x20219e4001710a4d", - "a_eq_b": false, - "a_m_pow_b": "0xd89c6bb0393f67bc" - }, - { - "a": "0x3127", - "b": "0x147e79afc", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x147e7cc23", - "a_m_sub_b_m": "0xfffffffdb818962c", - "a_m_mul_b_m": "0x3ef548f2d864", - "a_eq_b": false, - "a_m_pow_b": "0x9457f4df2d9fede1" - }, - { - "a": "0x27418652a6", - "b": "0x1457d", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x2741879823", - "a_m_sub_b_m": "0x2741850d29", - "a_m_mul_b_m": "0x31e95a8583190e", - "a_eq_b": false, - "a_m_pow_b": "0x39fa2fe85370161b" - }, - { - "a": "0x6ea6e95", - "b": "0x6ea6e95", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xdd4dd2a", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x2fd3dd542862b9", - "a_eq_b": true, - "a_m_pow_b": "0x91b5d9cf5d344d5f" - }, - { - "a": "0xb22", - "b": "0x23ac1", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x245e3", - "a_m_sub_b_m": "0xfffffffefffdd062", - "a_m_mul_b_m": "0x18d218a2", - "a_eq_b": false, - "a_m_pow_b": "0x7809d365539c692c" - }, - { - "a": "0x5a5a0d2", - "b": "0x4277b66374", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x427d5c0446", - "a_m_sub_b_m": "0xffffffbc8def3d5f", - "a_m_mul_b_m": "0x775779d88f8a1527", - "a_eq_b": false, - "a_m_pow_b": "0xb05bab937d6d69ac" - }, - { - "a": "0xc62b", - "b": "0xc62b", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x18c56", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x99668b39", - "a_eq_b": true, - "a_m_pow_b": "0x5e2dafdc281385d7" - }, - { - "a": "0x40753be47c34f400", - "b": "0xd631ce7d734e1000", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x16a70a62ef8303ff", - "a_m_sub_b_m": "0x6a436d6608e6e401", - "a_m_mul_b_m": "0x906383c60e48ff3c", - "a_eq_b": false, - "a_m_pow_b": "0x673075ab8fc101b6" - }, - { - "a": "0xbecfc02", - "b": "0x14a00fb0c24d5c00", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x14a00fb0ce3a5802", - "a_m_sub_b_m": "0xeb5ff04e499fa003", - "a_m_mul_b_m": "0xc8f489727a34bf78", - "a_eq_b": false, - "a_m_pow_b": "0xc4944c52cd8574d7" - }, - { - "a": "0x9434a98", - "b": "0x68b", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x9435123", - "a_m_sub_b_m": "0x943440d", - "a_m_mul_b_m": "0x3c9b491088", - "a_eq_b": false, - "a_m_pow_b": "0xc8acda3a739e94df" - }, - { - "a": "0xe935dc3e95", - "b": "0x108", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xe935dc3f9d", - "a_m_sub_b_m": "0xe935dc3d8d", - "a_m_mul_b_m": "0xf07f8b2089a8", - "a_eq_b": false, - "a_m_pow_b": "0xbb69e6537b7df89a" - }, - { - "a": "0x0", - "b": "0xa09764afb44928", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xa09764afb44928", - "a_m_sub_b_m": "0xff5f689a504bb6d9", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x140c24d81b", - "b": "0x140c24d81b", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x281849b036", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0xe6553f5906059148", - "a_eq_b": true, - "a_m_pow_b": "0x2dd4ffe08de316a3" - }, - { - "a": "0xf2c5ea", - "b": "0x5ab9", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xf320a3", - "a_m_sub_b_m": "0xf26b31", - "a_m_mul_b_m": "0x5609054a1a", - "a_eq_b": false, - "a_m_pow_b": "0x817fa8f37cbbea1d" - }, - { - "a": "0x0", - "b": "0x12afb", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x12afb", - "a_m_sub_b_m": "0xfffffffefffed506", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0xad7937d1e", - "b": "0x1b3eb2c0be95a0", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x1b3ebd985212be", - "a_m_sub_b_m": "0xffe4c15716d4e77f", - "a_m_mul_b_m": "0xf9ec9abdef1d446b", - "a_eq_b": false, - "a_m_pow_b": "0x24b689df20b2d39e" - }, - { - "a": "0x6b52bdf0", - "b": "0x3da7c33c5a55", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x3da82e8f1845", - "a_m_sub_b_m": "0xffffc257a816639c", - "a_m_mul_b_m": "0xc15855a0d7f56d7", - "a_eq_b": false, - "a_m_pow_b": "0xfc6f12ac6e77b975" - }, - { - "a": "0x29065d0", - "b": "0x5ee02", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x29653d2", - "a_m_sub_b_m": "0x28a77ce", - "a_m_mul_b_m": "0xf3440d82ba0", - "a_eq_b": false, - "a_m_pow_b": "0x8310243d91a0b8dd" - }, - { - "a": "0xda0828bf73154800", - "b": "0x181c5838ff0e0600", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0xf22480f872234e00", - "a_m_sub_b_m": "0xc1ebd08674074200", - "a_m_mul_b_m": "0x3d361b3d9a67b77d", - "a_eq_b": false, - "a_m_pow_b": "0xd61a0e3ca31acab0" - }, - { - "a": "0x13498bf3add21c00", - "b": "0x13498bf3add21c00", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x269317e75ba43800", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0xde97a6faa8532768", - "a_eq_b": true, - "a_m_pow_b": "0x201910badd9d78d" - }, - { - "a": "0x1f1d", - "b": "0x275d5", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x294f2", - "a_m_sub_b_m": "0xfffffffefffda949", - "a_m_mul_b_m": "0x4c8c2421", - "a_eq_b": false, - "a_m_pow_b": "0xf4ee3232bcb879fd" - }, - { - "a": "0x145", - "b": "0x48e", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x5d3", - "a_m_sub_b_m": "0xfffffffefffffcb8", - "a_m_mul_b_m": "0x5c846", - "a_eq_b": false, - "a_m_pow_b": "0x6dec2d245260eb1a" - }, - { - "a": "0x11c8e", - "b": "0x15efb68f483cfb00", - "m": "0xffffffff00000001", - "a_m_add_b_m": "0x15efb68f483e178e", - "a_m_sub_b_m": "0xea10496fb7c4218f", - "a_m_mul_b_m": "0x197e4fffb847219e", - "a_eq_b": false, - "a_m_pow_b": "0xcec85d71800cc886" - } - ], - "even_mod_17": [ - { - "a": "0x33", - "b": "0x3", - "m": "0x1e240", - "a_m_add_b_m": "0x36", - "a_m_sub_b_m": "0x30", - "a_m_mul_b_m": "0x99", - "a_eq_b": false, - "a_m_pow_b": "0x23eb" - }, - { - "a": "0x1", - "b": "0x2a", - "m": "0x1e240", - "a_m_add_b_m": "0x2b", - "a_m_sub_b_m": "0x1e217", - "a_m_mul_b_m": "0x2a", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x4", - "b": "0x71db", - "m": "0x1e240", - "a_m_add_b_m": "0x71df", - "a_m_sub_b_m": "0x17069", - "a_m_mul_b_m": "0x1c76c", - "a_eq_b": false, - "a_m_pow_b": "0x1d080" - }, - { - "a": "0x88a3", - "b": "0x162ef", - "m": "0x1e240", - "a_m_add_b_m": "0x952", - "a_m_sub_b_m": "0x107f4", - "a_m_mul_b_m": "0xb22d", - "a_eq_b": false, - "a_m_pow_b": "0xf3cb" - }, - { - "a": "0x50", - "b": "0x5122", - "m": "0x1e240", - "a_m_add_b_m": "0x5172", - "a_m_sub_b_m": "0x1916e", - "a_m_mul_b_m": "0xdd60", - "a_eq_b": false, - "a_m_pow_b": "0x82c0" - }, - { - "a": "0xb77d", - "b": "0x2c", - "m": "0x1e240", - "a_m_add_b_m": "0xb7a9", - "a_m_sub_b_m": "0xb751", - "a_m_mul_b_m": "0x1657c", - "a_eq_b": false, - "a_m_pow_b": "0x15331" - }, - { - "a": "0x78a2", - "b": "0x78a2", - "m": "0x1e240", - "a_m_add_b_m": "0xf144", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x144", - "a_eq_b": true, - "a_m_pow_b": "0x1a1c0" - }, - { - "a": "0x0", - "b": "0x7de", - "m": "0x1e240", - "a_m_add_b_m": "0x7de", - "a_m_sub_b_m": "0x1da62", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x3", - "b": "0xd17d", - "m": "0x1e240", - "a_m_add_b_m": "0xd180", - "a_m_sub_b_m": "0x110c6", - "a_m_mul_b_m": "0x9237", - "a_eq_b": false, - "a_m_pow_b": "0x1d793" - }, - { - "a": "0xb78b", - "b": "0x140bf", - "m": "0x1e240", - "a_m_add_b_m": "0x160a", - "a_m_sub_b_m": "0x1590c", - "a_m_mul_b_m": "0x65f5", - "a_eq_b": false, - "a_m_pow_b": "0xefe3" - }, - { - "a": "0xc", - "b": "0x5842", - "m": "0x1e240", - "a_m_add_b_m": "0x584e", - "a_m_sub_b_m": "0x18a0a", - "a_m_mul_b_m": "0x5e98", - "a_eq_b": false, - "a_m_pow_b": "0x12180" - }, - { - "a": "0x13", - "b": "0x315", - "m": "0x1e240", - "a_m_add_b_m": "0x328", - "a_m_sub_b_m": "0x1df3e", - "a_m_mul_b_m": "0x3a8f", - "a_eq_b": false, - "a_m_pow_b": "0x14ec3" - }, - { - "a": "0x76e", - "b": "0x5eb", - "m": "0x1e240", - "a_m_add_b_m": "0xd59", - "a_m_sub_b_m": "0x183", - "a_m_mul_b_m": "0xa43a", - "a_eq_b": false, - "a_m_pow_b": "0x126c0" - }, - { - "a": "0x1dfec", - "b": "0x1643d", - "m": "0x1e240", - "a_m_add_b_m": "0x161e9", - "a_m_sub_b_m": "0x7baf", - "a_m_mul_b_m": "0x1623c", - "a_eq_b": false, - "a_m_pow_b": "0x88c0" - }, - { - "a": "0xe", - "b": "0x0", - "m": "0x1e240", - "a_m_add_b_m": "0xe", - "a_m_sub_b_m": "0xe", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x276", - "b": "0x3a55", - "m": "0x1e240", - "a_m_add_b_m": "0x3ccb", - "a_m_sub_b_m": "0x1aa61", - "a_m_mul_b_m": "0x622e", - "a_eq_b": false, - "a_m_pow_b": "0x12600" - }, - { - "a": "0x3", - "b": "0x290b", - "m": "0x1e240", - "a_m_add_b_m": "0x290e", - "a_m_sub_b_m": "0x1b938", - "a_m_mul_b_m": "0x7b21", - "a_eq_b": false, - "a_m_pow_b": "0xfebb" - }, - { - "a": "0x6", - "b": "0x15", - "m": "0x1e240", - "a_m_add_b_m": "0x1b", - "a_m_sub_b_m": "0x1e231", - "a_m_mul_b_m": "0x7e", - "a_eq_b": false, - "a_m_pow_b": "0x19ec0" - }, - { - "a": "0x24f", - "b": "0xc1b", - "m": "0x1e240", - "a_m_add_b_m": "0xe6a", - "a_m_sub_b_m": "0x1d874", - "a_m_mul_b_m": "0x192d5", - "a_eq_b": false, - "a_m_pow_b": "0x13daf" - }, - { - "a": "0x17231", - "b": "0xe", - "m": "0x1e240", - "a_m_add_b_m": "0x1723f", - "a_m_sub_b_m": "0x17223", - "a_m_mul_b_m": "0x1682e", - "a_eq_b": false, - "a_m_pow_b": "0x2221" - }, - { - "a": "0x1d0a7", - "b": "0x1d0a7", - "m": "0x1e240", - "a_m_add_b_m": "0x1bf0e", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0xbc71", - "a_eq_b": true, - "a_m_pow_b": "0xfa57" - }, - { - "a": "0x34f", - "b": "0x1", - "m": "0x1e240", - "a_m_add_b_m": "0x350", - "a_m_sub_b_m": "0x34e", - "a_m_mul_b_m": "0x34f", - "a_eq_b": false, - "a_m_pow_b": "0x34f" - }, - { - "a": "0x31", - "b": "0x31", - "m": "0x1e240", - "a_m_add_b_m": "0x62", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x961", - "a_eq_b": true, - "a_m_pow_b": "0x24f1" - }, - { - "a": "0x19", - "b": "0x1595a", - "m": "0x1e240", - "a_m_add_b_m": "0x15973", - "a_m_sub_b_m": "0x88ff", - "a_m_mul_b_m": "0x1b38a", - "a_eq_b": false, - "a_m_pow_b": "0x4d71" - }, - { - "a": "0x9c4", - "b": "0x1a155", - "m": "0x1e240", - "a_m_add_b_m": "0x1ab19", - "a_m_sub_b_m": "0x4aaf", - "a_m_mul_b_m": "0xdf54", - "a_eq_b": false, - "a_m_pow_b": "0x19000" - }, - { - "a": "0x192a5", - "b": "0x0", - "m": "0x1e240", - "a_m_add_b_m": "0x192a5", - "a_m_sub_b_m": "0x192a5", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x1a", - "b": "0x10", - "m": "0x1e240", - "a_m_add_b_m": "0x2a", - "a_m_sub_b_m": "0xa", - "a_m_mul_b_m": "0x1a0", - "a_eq_b": false, - "a_m_pow_b": "0x4cc0" - }, - { - "a": "0x15", - "b": "0x2", - "m": "0x1e240", - "a_m_add_b_m": "0x17", - "a_m_sub_b_m": "0x13", - "a_m_mul_b_m": "0x2a", - "a_eq_b": false, - "a_m_pow_b": "0x1b9" - }, - { - "a": "0xebd7", - "b": "0x1f52e", - "m": "0x1e240", - "a_m_add_b_m": "0xfec5", - "a_m_sub_b_m": "0xd8e9", - "a_m_mul_b_m": "0x1ada2", - "a_eq_b": false, - "a_m_pow_b": "0xbab1" - }, - { - "a": "0x145", - "b": "0x29f", - "m": "0x1e240", - "a_m_add_b_m": "0x3e4", - "a_m_sub_b_m": "0x1e0e6", - "a_m_mul_b_m": "0x1719b", - "a_eq_b": false, - "a_m_pow_b": "0x1c8cd" - }, - { - "a": "0xf05", - "b": "0x14e85", - "m": "0x1e240", - "a_m_add_b_m": "0x15d8a", - "a_m_sub_b_m": "0xa2c0", - "a_m_mul_b_m": "0x42d9", - "a_eq_b": false, - "a_m_pow_b": "0xbeb5" - }, - { - "a": "0xd7", - "b": "0x6d95", - "m": "0x1e240", - "a_m_add_b_m": "0x6e6c", - "a_m_sub_b_m": "0x17582", - "a_m_mul_b_m": "0x19c23", - "a_eq_b": false, - "a_m_pow_b": "0x9137" - }, - { - "a": "0x1dc5a", - "b": "0x14ade", - "m": "0x1e240", - "a_m_add_b_m": "0x144f8", - "a_m_sub_b_m": "0x917c", - "a_m_mul_b_m": "0x18c", - "a_eq_b": false, - "a_m_pow_b": "0x73c0" - }, - { - "a": "0xa7", - "b": "0x1a745", - "m": "0x1e240", - "a_m_add_b_m": "0x1a7ec", - "a_m_sub_b_m": "0x3ba2", - "a_m_mul_b_m": "0x11583", - "a_eq_b": false, - "a_m_pow_b": "0x8687" - }, - { - "a": "0x23", - "b": "0x6", - "m": "0x1e240", - "a_m_add_b_m": "0x29", - "a_m_sub_b_m": "0x1d", - "a_m_mul_b_m": "0xd2", - "a_eq_b": false, - "a_m_pow_b": "0x1699" - }, - { - "a": "0x6ade", - "b": "0x6619", - "m": "0x1e240", - "a_m_add_b_m": "0xd0f7", - "a_m_sub_b_m": "0x4c5", - "a_m_mul_b_m": "0x1ddee", - "a_eq_b": false, - "a_m_pow_b": "0x8980" - }, - { - "a": "0xbbe", - "b": "0x3782", - "m": "0x1e240", - "a_m_add_b_m": "0x4340", - "a_m_sub_b_m": "0x1b67c", - "a_m_mul_b_m": "0x1e03c", - "a_eq_b": false, - "a_m_pow_b": "0xd440" - }, - { - "a": "0xa", - "b": "0x32", - "m": "0x1e240", - "a_m_add_b_m": "0x3c", - "a_m_sub_b_m": "0x1e218", - "a_m_mul_b_m": "0x1f4", - "a_eq_b": false, - "a_m_pow_b": "0xae40" - }, - { - "a": "0x1", - "b": "0x1", - "m": "0x1e240", - "a_m_add_b_m": "0x2", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x1", - "a_eq_b": true, - "a_m_pow_b": "0x1" - }, - { - "a": "0x592", - "b": "0x32", - "m": "0x1e240", - "a_m_add_b_m": "0x5c4", - "a_m_sub_b_m": "0x560", - "a_m_mul_b_m": "0x11684", - "a_eq_b": false, - "a_m_pow_b": "0x580" - }, - { - "a": "0x1b2e", - "b": "0x5d5", - "m": "0x1e240", - "a_m_add_b_m": "0x2103", - "a_m_sub_b_m": "0x1559", - "a_m_mul_b_m": "0x4646", - "a_eq_b": false, - "a_m_pow_b": "0x1180" - }, - { - "a": "0x1b791", - "b": "0x1b791", - "m": "0x1e240", - "a_m_add_b_m": "0x18ce2", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x43e1", - "a_eq_b": true, - "a_m_pow_b": "0x18e51" - }, - { - "a": "0x1", - "b": "0x7", - "m": "0x1e240", - "a_m_add_b_m": "0x8", - "a_m_sub_b_m": "0x1e23a", - "a_m_mul_b_m": "0x7", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x1d3", - "b": "0x1238a", - "m": "0x1e240", - "a_m_add_b_m": "0x1255d", - "a_m_sub_b_m": "0xc089", - "a_m_mul_b_m": "0x9a3e", - "a_eq_b": false, - "a_m_pow_b": "0x37c9" - }, - { - "a": "0xf", - "b": "0x13b1d", - "m": "0x1e240", - "a_m_add_b_m": "0x13b2c", - "a_m_sub_b_m": "0xa732", - "a_m_mul_b_m": "0x18273", - "a_eq_b": false, - "a_m_pow_b": "0x10c8f" - }, - { - "a": "0x3", - "b": "0x21e9", - "m": "0x1e240", - "a_m_add_b_m": "0x21ec", - "a_m_sub_b_m": "0x1c05a", - "a_m_mul_b_m": "0x65bb", - "a_eq_b": false, - "a_m_pow_b": "0x5e23" - }, - { - "a": "0xcf71", - "b": "0x2a", - "m": "0x1e240", - "a_m_add_b_m": "0xcf9b", - "a_m_sub_b_m": "0xcf47", - "a_m_mul_b_m": "0x200a", - "a_eq_b": false, - "a_m_pow_b": "0xb761" - }, - { - "a": "0x2", - "b": "0x31d4", - "m": "0x1e240", - "a_m_add_b_m": "0x31d6", - "a_m_sub_b_m": "0x1b06e", - "a_m_mul_b_m": "0x63a8", - "a_eq_b": false, - "a_m_pow_b": "0x1900" - }, - { - "a": "0x117", - "b": "0x186e0", - "m": "0x1e240", - "a_m_add_b_m": "0x187f7", - "a_m_sub_b_m": "0x5c77", - "a_m_mul_b_m": "0x41a0", - "a_eq_b": false, - "a_m_pow_b": "0xe9c1" - }, - { - "a": "0x1abc", - "b": "0xa", - "m": "0x1e240", - "a_m_add_b_m": "0x1ac6", - "a_m_sub_b_m": "0x1ab2", - "a_m_mul_b_m": "0x10b58", - "a_eq_b": false, - "a_m_pow_b": "0x166c0" - }, - { - "a": "0x1", - "b": "0x1c8b", - "m": "0x1e240", - "a_m_add_b_m": "0x1c8c", - "a_m_sub_b_m": "0x1c5b6", - "a_m_mul_b_m": "0x1c8b", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x12895", - "b": "0x52", - "m": "0x1e240", - "a_m_add_b_m": "0x128e7", - "a_m_sub_b_m": "0x12843", - "a_m_mul_b_m": "0xcf3a", - "a_eq_b": false, - "a_m_pow_b": "0x5e39" - }, - { - "a": "0x22e", - "b": "0x35", - "m": "0x1e240", - "a_m_add_b_m": "0x263", - "a_m_sub_b_m": "0x1f9", - "a_m_mul_b_m": "0x7386", - "a_eq_b": false, - "a_m_pow_b": "0xe640" - }, - { - "a": "0x3f", - "b": "0x1c8", - "m": "0x1e240", - "a_m_add_b_m": "0x207", - "a_m_sub_b_m": "0x1e0b7", - "a_m_mul_b_m": "0x7038", - "a_eq_b": false, - "a_m_pow_b": "0x1a901" - }, - { - "a": "0x1a802", - "b": "0x41f2", - "m": "0x1e240", - "a_m_add_b_m": "0x7b4", - "a_m_sub_b_m": "0x16610", - "a_m_mul_b_m": "0x3f24", - "a_eq_b": false, - "a_m_pow_b": "0x6cc0" - }, - { - "a": "0x1a07", - "b": "0x1681", - "m": "0x1e240", - "a_m_add_b_m": "0x3088", - "a_m_sub_b_m": "0x386", - "a_m_mul_b_m": "0x1be07", - "a_eq_b": false, - "a_m_pow_b": "0x9807" - }, - { - "a": "0x1", - "b": "0x1a277", - "m": "0x1e240", - "a_m_add_b_m": "0x1a278", - "a_m_sub_b_m": "0x3fca", - "a_m_mul_b_m": "0x1a277", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x28", - "b": "0xa7d", - "m": "0x1e240", - "a_m_add_b_m": "0xaa5", - "a_m_sub_b_m": "0x1d7eb", - "a_m_mul_b_m": "0x1a388", - "a_eq_b": false, - "a_m_pow_b": "0x85c0" - }, - { - "a": "0xbc", - "b": "0x243", - "m": "0x1e240", - "a_m_add_b_m": "0x2ff", - "a_m_sub_b_m": "0x1e0b9", - "a_m_mul_b_m": "0x1a934", - "a_eq_b": false, - "a_m_pow_b": "0x8000" - }, - { - "a": "0x2ba", - "b": "0x1c", - "m": "0x1e240", - "a_m_add_b_m": "0x2d6", - "a_m_sub_b_m": "0x29e", - "a_m_mul_b_m": "0x4c58", - "a_eq_b": false, - "a_m_pow_b": "0x10fc0" - }, - { - "a": "0x22", - "b": "0x16fb3", - "m": "0x1e240", - "a_m_add_b_m": "0x16fd5", - "a_m_sub_b_m": "0x72af", - "a_m_mul_b_m": "0x1bd86", - "a_eq_b": false, - "a_m_pow_b": "0x400" - }, - { - "a": "0xdb6", - "b": "0x2050", - "m": "0x1e240", - "a_m_add_b_m": "0x2e06", - "a_m_sub_b_m": "0x1cfa6", - "a_m_mul_b_m": "0x5820", - "a_eq_b": false, - "a_m_pow_b": "0x17040" - }, - { - "a": "0x30e", - "b": "0x1706c", - "m": "0x1e240", - "a_m_add_b_m": "0x1737a", - "a_m_sub_b_m": "0x74e2", - "a_m_mul_b_m": "0xcaa8", - "a_eq_b": false, - "a_m_pow_b": "0x18dc0" - }, - { - "a": "0x30", - "b": "0x3e5", - "m": "0x1e240", - "a_m_add_b_m": "0x415", - "a_m_sub_b_m": "0x1de8b", - "a_m_mul_b_m": "0xbaf0", - "a_eq_b": false, - "a_m_pow_b": "0x16c80" - }, - { - "a": "0x0", - "b": "0x6d1b", - "m": "0x1e240", - "a_m_add_b_m": "0x6d1b", - "a_m_sub_b_m": "0x17525", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x13b52", - "b": "0x5", - "m": "0x1e240", - "a_m_add_b_m": "0x13b57", - "a_m_sub_b_m": "0x13b4d", - "a_m_mul_b_m": "0x81da", - "a_eq_b": false, - "a_m_pow_b": "0x4ea0" - }, - { - "a": "0x25", - "b": "0x25", - "m": "0x1e240", - "a_m_add_b_m": "0x4a", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x559", - "a_eq_b": true, - "a_m_pow_b": "0x4915" - }, - { - "a": "0x3", - "b": "0x17532", - "m": "0x1e240", - "a_m_add_b_m": "0x17535", - "a_m_sub_b_m": "0x6d11", - "a_m_mul_b_m": "0x9b16", - "a_eq_b": false, - "a_m_pow_b": "0x1f89" - }, - { - "a": "0x1", - "b": "0x26", - "m": "0x1e240", - "a_m_add_b_m": "0x27", - "a_m_sub_b_m": "0x1e21b", - "a_m_mul_b_m": "0x26", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x2", - "b": "0xb", - "m": "0x1e240", - "a_m_add_b_m": "0xd", - "a_m_sub_b_m": "0x1e237", - "a_m_mul_b_m": "0x16", - "a_eq_b": false, - "a_m_pow_b": "0x800" - }, - { - "a": "0x76", - "b": "0x1e5", - "m": "0x1e240", - "a_m_add_b_m": "0x25b", - "a_m_sub_b_m": "0x1e0d1", - "a_m_mul_b_m": "0xdf8e", - "a_eq_b": false, - "a_m_pow_b": "0x12dc0" - }, - { - "a": "0x7981", - "b": "0x1c487", - "m": "0x1e240", - "a_m_add_b_m": "0x5bc8", - "a_m_sub_b_m": "0x973a", - "a_m_mul_b_m": "0x1b047", - "a_eq_b": false, - "a_m_pow_b": "0x16081" - }, - { - "a": "0x5c2", - "b": "0x6", - "m": "0x1e240", - "a_m_add_b_m": "0x5c8", - "a_m_sub_b_m": "0x5bc", - "a_m_mul_b_m": "0x228c", - "a_eq_b": false, - "a_m_pow_b": "0xa240" - }, - { - "a": "0x51c8", - "b": "0x17e39", - "m": "0x1e240", - "a_m_add_b_m": "0x1d001", - "a_m_sub_b_m": "0xb5cf", - "a_m_mul_b_m": "0xef48", - "a_eq_b": false, - "a_m_pow_b": "0x143c0" - }, - { - "a": "0xf5", - "b": "0x87a", - "m": "0x1e240", - "a_m_add_b_m": "0x96f", - "a_m_sub_b_m": "0x1dabb", - "a_m_mul_b_m": "0x93c2", - "a_eq_b": false, - "a_m_pow_b": "0x141d9" - }, - { - "a": "0x8a", - "b": "0x123", - "m": "0x1e240", - "a_m_add_b_m": "0x1ad", - "a_m_sub_b_m": "0x1e1a7", - "a_m_mul_b_m": "0x9cde", - "a_eq_b": false, - "a_m_pow_b": "0x123c0" - }, - { - "a": "0x30e", - "b": "0x8df", - "m": "0x1e240", - "a_m_add_b_m": "0xbed", - "a_m_sub_b_m": "0x1dc6f", - "a_m_mul_b_m": "0xb9b2", - "a_eq_b": false, - "a_m_pow_b": "0x16340" - }, - { - "a": "0x18f02", - "b": "0x235", - "m": "0x1e240", - "a_m_add_b_m": "0x19137", - "a_m_sub_b_m": "0x18ccd", - "a_m_mul_b_m": "0xe4aa", - "a_eq_b": false, - "a_m_pow_b": "0x1e80" - }, - { - "a": "0x1a", - "b": "0x1a", - "m": "0x1e240", - "a_m_add_b_m": "0x34", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x2a4", - "a_eq_b": true, - "a_m_pow_b": "0xdc0" - }, - { - "a": "0x3f", - "b": "0x13fa8", - "m": "0x1e240", - "a_m_add_b_m": "0x13fe7", - "a_m_sub_b_m": "0xa2d7", - "a_m_mul_b_m": "0x16e18", - "a_eq_b": false, - "a_m_pow_b": "0x5181" - }, - { - "a": "0x2", - "b": "0x17", - "m": "0x1e240", - "a_m_add_b_m": "0x19", - "a_m_sub_b_m": "0x1e22b", - "a_m_mul_b_m": "0x2e", - "a_eq_b": false, - "a_m_pow_b": "0x1c940" - }, - { - "a": "0x0", - "b": "0x0", - "m": "0x1e240", - "a_m_add_b_m": "0x0", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x0", - "a_eq_b": true, - "a_m_pow_b": "0x1" - }, - { - "a": "0x0", - "b": "0x6", - "m": "0x1e240", - "a_m_add_b_m": "0x6", - "a_m_sub_b_m": "0x1e23a", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0xd", - "b": "0x0", - "m": "0x1e240", - "a_m_add_b_m": "0xd", - "a_m_sub_b_m": "0xd", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x5", - "b": "0x5", - "m": "0x1e240", - "a_m_add_b_m": "0xa", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x19", - "a_eq_b": true, - "a_m_pow_b": "0xc35" - }, - { - "a": "0x983b", - "b": "0x21e0", - "m": "0x1e240", - "a_m_add_b_m": "0xba1b", - "a_m_sub_b_m": "0x765b", - "a_m_mul_b_m": "0xe060", - "a_eq_b": false, - "a_m_pow_b": "0x11281" - }, - { - "a": "0x307e", - "b": "0x2a", - "m": "0x1e240", - "a_m_add_b_m": "0x30a8", - "a_m_sub_b_m": "0x3054", - "a_m_mul_b_m": "0x6bac", - "a_eq_b": false, - "a_m_pow_b": "0x12e40" - }, - { - "a": "0xa", - "b": "0x2874", - "m": "0x1e240", - "a_m_add_b_m": "0x287e", - "a_m_sub_b_m": "0x1b9d6", - "a_m_mul_b_m": "0x19488", - "a_eq_b": false, - "a_m_pow_b": "0x2800" - }, - { - "a": "0x1de", - "b": "0x84", - "m": "0x1e240", - "a_m_add_b_m": "0x262", - "a_m_sub_b_m": "0x15a", - "a_m_mul_b_m": "0xf678", - "a_eq_b": false, - "a_m_pow_b": "0x10000" - }, - { - "a": "0x6", - "b": "0xc708", - "m": "0x1e240", - "a_m_add_b_m": "0xc70e", - "a_m_sub_b_m": "0x11b3e", - "a_m_mul_b_m": "0xe5b0", - "a_eq_b": false, - "a_m_pow_b": "0x1d700" - }, - { - "a": "0x2d5", - "b": "0x1861d", - "m": "0x1e240", - "a_m_add_b_m": "0x188f2", - "a_m_sub_b_m": "0x5ef8", - "a_m_mul_b_m": "0xe9a1", - "a_eq_b": false, - "a_m_pow_b": "0x11a65" - }, - { - "a": "0x1", - "b": "0x0", - "m": "0x1e240", - "a_m_add_b_m": "0x1", - "a_m_sub_b_m": "0x1", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x691", - "b": "0x1c", - "m": "0x1e240", - "a_m_add_b_m": "0x6ad", - "a_m_sub_b_m": "0x675", - "a_m_mul_b_m": "0xb7dc", - "a_eq_b": false, - "a_m_pow_b": "0x99c1" - }, - { - "a": "0x3", - "b": "0x49f", - "m": "0x1e240", - "a_m_add_b_m": "0x4a2", - "a_m_sub_b_m": "0x1dda4", - "a_m_mul_b_m": "0xddd", - "a_eq_b": false, - "a_m_pow_b": "0x10c6b" - }, - { - "a": "0x9191", - "b": "0x17", - "m": "0x1e240", - "a_m_add_b_m": "0x91a8", - "a_m_sub_b_m": "0x917a", - "a_m_mul_b_m": "0x1c687", - "a_eq_b": false, - "a_m_pow_b": "0x1e131" - }, - { - "a": "0x14a94", - "b": "0x98d7", - "m": "0x1e240", - "a_m_add_b_m": "0x12b", - "a_m_sub_b_m": "0xb1bd", - "a_m_mul_b_m": "0x670c", - "a_eq_b": false, - "a_m_pow_b": "0xd3c0" - }, - { - "a": "0xb", - "b": "0x12d0c", - "m": "0x1e240", - "a_m_add_b_m": "0x12d17", - "a_m_sub_b_m": "0xb53f", - "a_m_mul_b_m": "0x1a204", - "a_eq_b": false, - "a_m_pow_b": "0x4b91" - }, - { - "a": "0x2a6", - "b": "0x56", - "m": "0x1e240", - "a_m_add_b_m": "0x2fc", - "a_m_sub_b_m": "0x250", - "a_m_mul_b_m": "0xe3c4", - "a_eq_b": false, - "a_m_pow_b": "0x72c0" - }, - { - "a": "0x434", - "b": "0xb8", - "m": "0x1e240", - "a_m_add_b_m": "0x4ec", - "a_m_sub_b_m": "0x37c", - "a_m_mul_b_m": "0x12320", - "a_eq_b": false, - "a_m_pow_b": "0xe200" - }, - { - "a": "0x17c24", - "b": "0x456d", - "m": "0x1e240", - "a_m_add_b_m": "0x1c191", - "a_m_sub_b_m": "0x136b7", - "a_m_mul_b_m": "0x18f14", - "a_eq_b": false, - "a_m_pow_b": "0x6680" - }, - { - "a": "0x1", - "b": "0x3", - "m": "0x1e240", - "a_m_add_b_m": "0x4", - "a_m_sub_b_m": "0x1e23e", - "a_m_mul_b_m": "0x3", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x4", - "b": "0x103f", - "m": "0x1e240", - "a_m_add_b_m": "0x1043", - "a_m_sub_b_m": "0x1d205", - "a_m_mul_b_m": "0x40fc", - "a_eq_b": false, - "a_m_pow_b": "0xb8c0" - }, - { - "a": "0xdf5", - "b": "0x4c64", - "m": "0x1e240", - "a_m_add_b_m": "0x5a59", - "a_m_sub_b_m": "0x1a3d1", - "a_m_mul_b_m": "0x1d874", - "a_eq_b": false, - "a_m_pow_b": "0x56f1" - }, - { - "a": "0x1cee4", - "b": "0x1d905", - "m": "0x1e240", - "a_m_add_b_m": "0x1c5a9", - "a_m_sub_b_m": "0x1d81f", - "a_m_mul_b_m": "0x19eb4", - "a_eq_b": false, - "a_m_pow_b": "0xdec0" - }, - { - "a": "0x5b2", - "b": "0x36", - "m": "0x1e240", - "a_m_add_b_m": "0x5e8", - "a_m_sub_b_m": "0x57c", - "a_m_mul_b_m": "0x1338c", - "a_eq_b": false, - "a_m_pow_b": "0x126c0" - }, - { - "a": "0x2c", - "b": "0x9a6", - "m": "0x1e240", - "a_m_add_b_m": "0x9d2", - "a_m_sub_b_m": "0x1d8c6", - "a_m_mul_b_m": "0x1a888", - "a_eq_b": false, - "a_m_pow_b": "0x12640" - }, - { - "a": "0x685", - "b": "0x0", - "m": "0x1e240", - "a_m_add_b_m": "0x685", - "a_m_sub_b_m": "0x685", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x43", - "b": "0x47", - "m": "0x1e240", - "a_m_add_b_m": "0x8a", - "a_m_sub_b_m": "0x1e23c", - "a_m_mul_b_m": "0x1295", - "a_eq_b": false, - "a_m_pow_b": "0x1118b" - }, - { - "a": "0x0", - "b": "0x741e", - "m": "0x1e240", - "a_m_add_b_m": "0x741e", - "a_m_sub_b_m": "0x16e22", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x179da", - "b": "0x179da", - "m": "0x1e240", - "a_m_add_b_m": "0x11174", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x15064", - "a_eq_b": true, - "a_m_pow_b": "0x12f40" - }, - { - "a": "0x80f", - "b": "0x1", - "m": "0x1e240", - "a_m_add_b_m": "0x810", - "a_m_sub_b_m": "0x80e", - "a_m_mul_b_m": "0x80f", - "a_eq_b": false, - "a_m_pow_b": "0x80f" - }, - { - "a": "0x1", - "b": "0x1617", - "m": "0x1e240", - "a_m_add_b_m": "0x1618", - "a_m_sub_b_m": "0x1cc2a", - "a_m_mul_b_m": "0x1617", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0xdc6", - "b": "0x7cb", - "m": "0x1e240", - "a_m_add_b_m": "0x1591", - "a_m_sub_b_m": "0x5fb", - "a_m_mul_b_m": "0x1d802", - "a_eq_b": false, - "a_m_pow_b": "0x11140" - }, - { - "a": "0x0", - "b": "0x0", - "m": "0x1e240", - "a_m_add_b_m": "0x0", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x0", - "a_eq_b": true, - "a_m_pow_b": "0x1" - }, - { - "a": "0x11f61", - "b": "0x3", - "m": "0x1e240", - "a_m_add_b_m": "0x11f64", - "a_m_sub_b_m": "0x11f5e", - "a_m_mul_b_m": "0x17be3", - "a_eq_b": false, - "a_m_pow_b": "0x46a1" - }, - { - "a": "0x31f", - "b": "0x20b", - "m": "0x1e240", - "a_m_add_b_m": "0x52a", - "a_m_sub_b_m": "0x114", - "a_m_mul_b_m": "0xb995", - "a_eq_b": false, - "a_m_pow_b": "0xe41f" - }, - { - "a": "0x456", - "b": "0x181", - "m": "0x1e240", - "a_m_add_b_m": "0x5d7", - "a_m_sub_b_m": "0x2d5", - "a_m_mul_b_m": "0xde96", - "a_eq_b": false, - "a_m_pow_b": "0x13ec0" - }, - { - "a": "0x0", - "b": "0x4c59", - "m": "0x1e240", - "a_m_add_b_m": "0x4c59", - "a_m_sub_b_m": "0x195e7", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x35", - "b": "0x12b8f", - "m": "0x1e240", - "a_m_add_b_m": "0x12bc4", - "a_m_sub_b_m": "0xb6e6", - "a_m_mul_b_m": "0x1bc9b", - "a_eq_b": false, - "a_m_pow_b": "0x799d" - }, - { - "a": "0x8e2", - "b": "0xe", - "m": "0x1e240", - "a_m_add_b_m": "0x8f0", - "a_m_sub_b_m": "0x8d4", - "a_m_mul_b_m": "0x7c5c", - "a_eq_b": false, - "a_m_pow_b": "0x11e80" - }, - { - "a": "0x1bb9f", - "b": "0x10", - "m": "0x1e240", - "a_m_add_b_m": "0x1bbaf", - "a_m_sub_b_m": "0x1bb8f", - "a_m_mul_b_m": "0x15a70", - "a_eq_b": false, - "a_m_pow_b": "0x2941" - }, - { - "a": "0x11756", - "b": "0xd92", - "m": "0x1e240", - "a_m_add_b_m": "0x124e8", - "a_m_sub_b_m": "0x109c4", - "a_m_mul_b_m": "0x7e0c", - "a_eq_b": false, - "a_m_pow_b": "0x1dd40" - }, - { - "a": "0xf16", - "b": "0x1ebfa", - "m": "0x1e240", - "a_m_add_b_m": "0x18d0", - "a_m_sub_b_m": "0x55c", - "a_m_mul_b_m": "0x1aebc", - "a_eq_b": false, - "a_m_pow_b": "0x4000" - }, - { - "a": "0x595", - "b": "0xb42", - "m": "0x1e240", - "a_m_add_b_m": "0x10d7", - "a_m_sub_b_m": "0x1dc93", - "a_m_mul_b_m": "0xad2a", - "a_eq_b": false, - "a_m_pow_b": "0x2479" - }, - { - "a": "0x141", - "b": "0x4b", - "m": "0x1e240", - "a_m_add_b_m": "0x18c", - "a_m_sub_b_m": "0xf6", - "a_m_mul_b_m": "0x5e0b", - "a_eq_b": false, - "a_m_pow_b": "0x741" - }, - { - "a": "0x3be8", - "b": "0x17524", - "m": "0x1e240", - "a_m_add_b_m": "0x1b10c", - "a_m_sub_b_m": "0xa904", - "a_m_mul_b_m": "0x6a20", - "a_eq_b": false, - "a_m_pow_b": "0x16ec0" - }, - { - "a": "0x1033f", - "b": "0x95", - "m": "0x1e240", - "a_m_add_b_m": "0x103d4", - "a_m_sub_b_m": "0x102aa", - "a_m_mul_b_m": "0x2fab", - "a_eq_b": false, - "a_m_pow_b": "0x1717f" - }, - { - "a": "0x9185", - "b": "0x1", - "m": "0x1e240", - "a_m_add_b_m": "0x9186", - "a_m_sub_b_m": "0x9184", - "a_m_mul_b_m": "0x9185", - "a_eq_b": false, - "a_m_pow_b": "0x9185" - }, - { - "a": "0x14d41", - "b": "0xe38", - "m": "0x1e240", - "a_m_add_b_m": "0x15b79", - "a_m_sub_b_m": "0x13f09", - "a_m_mul_b_m": "0xb978", - "a_eq_b": false, - "a_m_pow_b": "0x14401" - }, - { - "a": "0x1f", - "b": "0x151", - "m": "0x1e240", - "a_m_add_b_m": "0x170", - "a_m_sub_b_m": "0x1e10e", - "a_m_mul_b_m": "0x28cf", - "a_eq_b": false, - "a_m_pow_b": "0x181f" - }, - { - "a": "0x5e8", - "b": "0x5e8", - "m": "0x1e240", - "a_m_add_b_m": "0xbd0", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0xf9c0", - "a_eq_b": true, - "a_m_pow_b": "0xd500" - }, - { - "a": "0xa", - "b": "0x4a15", - "m": "0x1e240", - "a_m_add_b_m": "0x4a1f", - "a_m_sub_b_m": "0x19835", - "a_m_mul_b_m": "0x10292", - "a_eq_b": false, - "a_m_pow_b": "0x1e1c0" - }, - { - "a": "0x8", - "b": "0xcb", - "m": "0x1e240", - "a_m_add_b_m": "0xd3", - "a_m_sub_b_m": "0x1e17d", - "a_m_mul_b_m": "0x658", - "a_eq_b": false, - "a_m_pow_b": "0x14240" - }, - { - "a": "0xd2", - "b": "0xac", - "m": "0x1e240", - "a_m_add_b_m": "0x17e", - "a_m_sub_b_m": "0x26", - "a_m_mul_b_m": "0x8d18", - "a_eq_b": false, - "a_m_pow_b": "0xe400" - }, - { - "a": "0x5f68", - "b": "0x0", - "m": "0x1e240", - "a_m_add_b_m": "0x5f68", - "a_m_sub_b_m": "0x5f68", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0xaf", - "b": "0xaf", - "m": "0x1e240", - "a_m_add_b_m": "0x15e", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x77a1", - "a_eq_b": true, - "a_m_pow_b": "0x328f" - }, - { - "a": "0x221", - "b": "0x37", - "m": "0x1e240", - "a_m_add_b_m": "0x258", - "a_m_sub_b_m": "0x1ea", - "a_m_mul_b_m": "0x7517", - "a_eq_b": false, - "a_m_pow_b": "0xa8a1" - }, - { - "a": "0x3", - "b": "0x1", - "m": "0x1e240", - "a_m_add_b_m": "0x4", - "a_m_sub_b_m": "0x2", - "a_m_mul_b_m": "0x3", - "a_eq_b": false, - "a_m_pow_b": "0x3" - }, - { - "a": "0x41", - "b": "0x17b", - "m": "0x1e240", - "a_m_add_b_m": "0x1bc", - "a_m_sub_b_m": "0x1e106", - "a_m_mul_b_m": "0x603b", - "a_eq_b": false, - "a_m_pow_b": "0x18d01" - }, - { - "a": "0x2", - "b": "0x238", - "m": "0x1e240", - "a_m_add_b_m": "0x23a", - "a_m_sub_b_m": "0x1e00a", - "a_m_mul_b_m": "0x470", - "a_eq_b": false, - "a_m_pow_b": "0x28c0" - }, - { - "a": "0x76", - "b": "0xcc", - "m": "0x1e240", - "a_m_add_b_m": "0x142", - "a_m_sub_b_m": "0x1e1ea", - "a_m_mul_b_m": "0x5e08", - "a_eq_b": false, - "a_m_pow_b": "0xa480" - }, - { - "a": "0x401", - "b": "0x78", - "m": "0x1e240", - "a_m_add_b_m": "0x479", - "a_m_sub_b_m": "0x389", - "a_m_mul_b_m": "0x1e078", - "a_eq_b": false, - "a_m_pow_b": "0x6c1" - }, - { - "a": "0x212", - "b": "0x18c11", - "m": "0x1e240", - "a_m_add_b_m": "0x18e23", - "a_m_sub_b_m": "0x5841", - "a_m_mul_b_m": "0x8872", - "a_eq_b": false, - "a_m_pow_b": "0x17000" - }, - { - "a": "0x19c06", - "b": "0xca9f", - "m": "0x1e240", - "a_m_add_b_m": "0x8465", - "a_m_sub_b_m": "0xd167", - "a_m_mul_b_m": "0xc27a", - "a_eq_b": false, - "a_m_pow_b": "0x12700" - }, - { - "a": "0x2a42", - "b": "0xb", - "m": "0x1e240", - "a_m_add_b_m": "0x2a4d", - "a_m_sub_b_m": "0x2a37", - "a_m_mul_b_m": "0x1d0d6", - "a_eq_b": false, - "a_m_pow_b": "0x11100" - }, - { - "a": "0xd31", - "b": "0x1b6cf", - "m": "0x1e240", - "a_m_add_b_m": "0x1c400", - "a_m_sub_b_m": "0x38a2", - "a_m_mul_b_m": "0x1809f", - "a_eq_b": false, - "a_m_pow_b": "0x19151" - }, - { - "a": "0x15968", - "b": "0x15968", - "m": "0x1e240", - "a_m_add_b_m": "0xd090", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x15940", - "a_eq_b": true, - "a_m_pow_b": "0x1aa40" - }, - { - "a": "0x54", - "b": "0x517", - "m": "0x1e240", - "a_m_add_b_m": "0x56b", - "a_m_sub_b_m": "0x1dd7d", - "a_m_mul_b_m": "0x1ab8c", - "a_eq_b": false, - "a_m_pow_b": "0x7500" - }, - { - "a": "0x66", - "b": "0x5e3", - "m": "0x1e240", - "a_m_add_b_m": "0x649", - "a_m_sub_b_m": "0x1dcc3", - "a_m_mul_b_m": "0x7632", - "a_eq_b": false, - "a_m_pow_b": "0x9b40" - }, - { - "a": "0x5c", - "b": "0x5", - "m": "0x1e240", - "a_m_add_b_m": "0x61", - "a_m_sub_b_m": "0x57", - "a_m_mul_b_m": "0x1cc", - "a_eq_b": false, - "a_m_pow_b": "0x1c7c0" - }, - { - "a": "0x14", - "b": "0xd2e2", - "m": "0x1e240", - "a_m_add_b_m": "0xd2f6", - "a_m_sub_b_m": "0x10f72", - "a_m_mul_b_m": "0x167a8", - "a_eq_b": false, - "a_m_pow_b": "0x10000" - }, - { - "a": "0x11e8e", - "b": "0x1013", - "m": "0x1e240", - "a_m_add_b_m": "0x12ea1", - "a_m_sub_b_m": "0x10e7b", - "a_m_mul_b_m": "0x474a", - "a_eq_b": false, - "a_m_pow_b": "0x18440" - }, - { - "a": "0x133dc", - "b": "0x95", - "m": "0x1e240", - "a_m_add_b_m": "0x13471", - "a_m_sub_b_m": "0x13347", - "a_m_mul_b_m": "0x394c", - "a_eq_b": false, - "a_m_pow_b": "0xecc0" - }, - { - "a": "0x18787", - "b": "0x825", - "m": "0x1e240", - "a_m_add_b_m": "0x18fac", - "a_m_sub_b_m": "0x17f62", - "a_m_mul_b_m": "0x16f83", - "a_eq_b": false, - "a_m_pow_b": "0x11227" - }, - { - "a": "0x7b2", - "b": "0xfb", - "m": "0x1e240", - "a_m_add_b_m": "0x8ad", - "a_m_sub_b_m": "0x6b7", - "a_m_mul_b_m": "0x286", - "a_eq_b": false, - "a_m_pow_b": "0x10e80" - }, - { - "a": "0x1b90f", - "b": "0x1b90f", - "m": "0x1e240", - "a_m_add_b_m": "0x18fde", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x15261", - "a_eq_b": true, - "a_m_pow_b": "0xd3ef" - }, - { - "a": "0x211", - "b": "0x211", - "m": "0x1e240", - "a_m_add_b_m": "0x422", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x80a1", - "a_eq_b": true, - "a_m_pow_b": "0x1a9d1" - }, - { - "a": "0x425e", - "b": "0x6", - "m": "0x1e240", - "a_m_add_b_m": "0x4264", - "a_m_sub_b_m": "0x4258", - "a_m_mul_b_m": "0x18e34", - "a_eq_b": false, - "a_m_pow_b": "0x19000" - }, - { - "a": "0xde19", - "b": "0x1cebb", - "m": "0x1e240", - "a_m_add_b_m": "0xca94", - "a_m_sub_b_m": "0xf19e", - "a_m_mul_b_m": "0x13d83", - "a_eq_b": false, - "a_m_pow_b": "0x1ac89" - }, - { - "a": "0x9a", - "b": "0x18a7", - "m": "0x1e240", - "a_m_add_b_m": "0x1941", - "a_m_sub_b_m": "0x1ca33", - "a_m_mul_b_m": "0x1a4b6", - "a_eq_b": false, - "a_m_pow_b": "0x1b040" - }, - { - "a": "0x1a7", - "b": "0x1a7", - "m": "0x1e240", - "a_m_add_b_m": "0x34e", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0xd8b1", - "a_eq_b": true, - "a_m_pow_b": "0x18057" - }, - { - "a": "0xf7", - "b": "0x931", - "m": "0x1e240", - "a_m_add_b_m": "0xa28", - "a_m_sub_b_m": "0x1da06", - "a_m_mul_b_m": "0x15547", - "a_eq_b": false, - "a_m_pow_b": "0x45f7" - }, - { - "a": "0x12b3", - "b": "0x4f", - "m": "0x1e240", - "a_m_add_b_m": "0x1302", - "a_m_sub_b_m": "0x1264", - "a_m_mul_b_m": "0x1e7d", - "a_eq_b": false, - "a_m_pow_b": "0x64bb" - }, - { - "a": "0x8", - "b": "0x115", - "m": "0x1e240", - "a_m_add_b_m": "0x11d", - "a_m_sub_b_m": "0x1e133", - "a_m_mul_b_m": "0x8a8", - "a_eq_b": false, - "a_m_pow_b": "0x1f40" - }, - { - "a": "0x11019", - "b": "0x36", - "m": "0x1e240", - "a_m_add_b_m": "0x1104f", - "a_m_sub_b_m": "0x10fe3", - "a_m_mul_b_m": "0xe1c6", - "a_eq_b": false, - "a_m_pow_b": "0x4311" - }, - { - "a": "0x87", - "b": "0x117", - "m": "0x1e240", - "a_m_add_b_m": "0x19e", - "a_m_sub_b_m": "0x1e1b0", - "a_m_mul_b_m": "0x9321", - "a_eq_b": false, - "a_m_pow_b": "0x1bfb7" - }, - { - "a": "0x13124", - "b": "0x13124", - "m": "0x1e240", - "a_m_add_b_m": "0x8008", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0xc250", - "a_eq_b": true, - "a_m_pow_b": "0x8b00" - }, - { - "a": "0x6", - "b": "0x5536", - "m": "0x1e240", - "a_m_add_b_m": "0x553c", - "a_m_sub_b_m": "0x18d10", - "a_m_mul_b_m": "0x1d04", - "a_eq_b": false, - "a_m_pow_b": "0xd80" - }, - { - "a": "0x6", - "b": "0x1e38", - "m": "0x1e240", - "a_m_add_b_m": "0x1e3e", - "a_m_sub_b_m": "0x1c40e", - "a_m_mul_b_m": "0xb550", - "a_eq_b": false, - "a_m_pow_b": "0x14400" - }, - { - "a": "0x11c1b", - "b": "0x101cc", - "m": "0x1e240", - "a_m_add_b_m": "0x3ba7", - "a_m_sub_b_m": "0x1a4f", - "a_m_mul_b_m": "0x1aac4", - "a_eq_b": false, - "a_m_pow_b": "0x23d1" - }, - { - "a": "0x12e10", - "b": "0x1882e", - "m": "0x1e240", - "a_m_add_b_m": "0xd3fe", - "a_m_sub_b_m": "0x18822", - "a_m_mul_b_m": "0xb3a0", - "a_eq_b": false, - "a_m_pow_b": "0x19a40" - }, - { - "a": "0x4c46", - "b": "0x4", - "m": "0x1e240", - "a_m_add_b_m": "0x4c4a", - "a_m_sub_b_m": "0x4c42", - "a_m_mul_b_m": "0x13118", - "a_eq_b": false, - "a_m_pow_b": "0x1d410" - }, - { - "a": "0x30", - "b": "0x5da", - "m": "0x1e240", - "a_m_add_b_m": "0x60a", - "a_m_sub_b_m": "0x1dc96", - "a_m_mul_b_m": "0x118e0", - "a_eq_b": false, - "a_m_pow_b": "0x17640" - }, - { - "a": "0x40b", - "b": "0x0", - "m": "0x1e240", - "a_m_add_b_m": "0x40b", - "a_m_sub_b_m": "0x40b", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x108ad", - "b": "0x9f6", - "m": "0x1e240", - "a_m_add_b_m": "0x112a3", - "a_m_sub_b_m": "0xfeb7", - "a_m_mul_b_m": "0xff7e", - "a_eq_b": false, - "a_m_pow_b": "0x47b9" - }, - { - "a": "0x0", - "b": "0x19", - "m": "0x1e240", - "a_m_add_b_m": "0x19", - "a_m_sub_b_m": "0x1e227", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x148", - "b": "0x559b", - "m": "0x1e240", - "a_m_add_b_m": "0x56e3", - "a_m_sub_b_m": "0x18ded", - "a_m_mul_b_m": "0x6c18", - "a_eq_b": false, - "a_m_pow_b": "0x1900" - }, - { - "a": "0xa", - "b": "0x1", - "m": "0x1e240", - "a_m_add_b_m": "0xb", - "a_m_sub_b_m": "0x9", - "a_m_mul_b_m": "0xa", - "a_eq_b": false, - "a_m_pow_b": "0xa" - }, - { - "a": "0xbf14", - "b": "0x1123e", - "m": "0x1e240", - "a_m_add_b_m": "0x1d152", - "a_m_sub_b_m": "0x18f16", - "a_m_mul_b_m": "0x5298", - "a_eq_b": false, - "a_m_pow_b": "0x3580" - }, - { - "a": "0xf1a8", - "b": "0x0", - "m": "0x1e240", - "a_m_add_b_m": "0xf1a8", - "a_m_sub_b_m": "0xf1a8", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x13814", - "b": "0x64", - "m": "0x1e240", - "a_m_add_b_m": "0x13878", - "a_m_sub_b_m": "0x137b0", - "a_m_mul_b_m": "0x157d0", - "a_eq_b": false, - "a_m_pow_b": "0x19240" - }, - { - "a": "0xaf", - "b": "0x22a7", - "m": "0x1e240", - "a_m_add_b_m": "0x2356", - "a_m_sub_b_m": "0x1c048", - "a_m_mul_b_m": "0x11529", - "a_eq_b": false, - "a_m_pow_b": "0x19f0f" - }, - { - "a": "0x349f", - "b": "0x1189", - "m": "0x1e240", - "a_m_add_b_m": "0x4628", - "a_m_sub_b_m": "0x2316", - "a_m_mul_b_m": "0x18bd7", - "a_eq_b": false, - "a_m_pow_b": "0x1069f" - }, - { - "a": "0xb", - "b": "0x74b", - "m": "0x1e240", - "a_m_add_b_m": "0x756", - "a_m_sub_b_m": "0x1db00", - "a_m_mul_b_m": "0x5039", - "a_eq_b": false, - "a_m_pow_b": "0x6413" - }, - { - "a": "0x6933", - "b": "0x3d0a", - "m": "0x1e240", - "a_m_add_b_m": "0xa63d", - "a_m_sub_b_m": "0x2c29", - "a_m_mul_b_m": "0x14efe", - "a_eq_b": false, - "a_m_pow_b": "0x14109" - }, - { - "a": "0x1c258", - "b": "0x4", - "m": "0x1e240", - "a_m_add_b_m": "0x1c25c", - "a_m_sub_b_m": "0x1c254", - "a_m_mul_b_m": "0x162a0", - "a_eq_b": false, - "a_m_pow_b": "0x52c0" - }, - { - "a": "0x60e", - "b": "0x1", - "m": "0x1e240", - "a_m_add_b_m": "0x60f", - "a_m_sub_b_m": "0x60d", - "a_m_mul_b_m": "0x60e", - "a_eq_b": false, - "a_m_pow_b": "0x60e" - }, - { - "a": "0x4", - "b": "0x4c", - "m": "0x1e240", - "a_m_add_b_m": "0x50", - "a_m_sub_b_m": "0x1e1f8", - "a_m_mul_b_m": "0x130", - "a_eq_b": false, - "a_m_pow_b": "0x3580" - }, - { - "a": "0x122c", - "b": "0x3896", - "m": "0x1e240", - "a_m_add_b_m": "0x4ac2", - "a_m_sub_b_m": "0x1bbd6", - "a_m_mul_b_m": "0x19b88", - "a_eq_b": false, - "a_m_pow_b": "0x5e00" - }, - { - "a": "0x17832", - "b": "0xa", - "m": "0x1e240", - "a_m_add_b_m": "0x1783c", - "a_m_sub_b_m": "0x17828", - "a_m_mul_b_m": "0x18234", - "a_eq_b": false, - "a_m_pow_b": "0x13f80" - }, - { - "a": "0x1d386", - "b": "0x1c923", - "m": "0x1e240", - "a_m_add_b_m": "0x1ba69", - "a_m_sub_b_m": "0xa63", - "a_m_mul_b_m": "0x9c12", - "a_eq_b": false, - "a_m_pow_b": "0xd600" - }, - { - "a": "0xa118", - "b": "0x231", - "m": "0x1e240", - "a_m_add_b_m": "0xa349", - "a_m_sub_b_m": "0x9ee7", - "a_m_mul_b_m": "0xc0d8", - "a_eq_b": false, - "a_m_pow_b": "0x173c0" - }, - { - "a": "0x11d87", - "b": "0x24", - "m": "0x1e240", - "a_m_add_b_m": "0x11dab", - "a_m_sub_b_m": "0x11d63", - "a_m_mul_b_m": "0x97bc", - "a_eq_b": false, - "a_m_pow_b": "0x14361" - }, - { - "a": "0x3e", - "b": "0x0", - "m": "0x1e240", - "a_m_add_b_m": "0x3e", - "a_m_sub_b_m": "0x3e", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x0", - "b": "0x115f3", - "m": "0x1e240", - "a_m_add_b_m": "0x115f3", - "a_m_sub_b_m": "0xcc4d", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x152f", - "b": "0x358f", - "m": "0x1e240", - "a_m_add_b_m": "0x4abe", - "a_m_sub_b_m": "0x1c1e0", - "a_m_mul_b_m": "0x85c1", - "a_eq_b": false, - "a_m_pow_b": "0x1de4f" - }, - { - "a": "0x673", - "b": "0xeb", - "m": "0x1e240", - "a_m_add_b_m": "0x75e", - "a_m_sub_b_m": "0x588", - "a_m_mul_b_m": "0x44d1", - "a_eq_b": false, - "a_m_pow_b": "0x1b38b" - }, - { - "a": "0x50b", - "b": "0x547", - "m": "0x1e240", - "a_m_add_b_m": "0xa52", - "a_m_sub_b_m": "0x1e204", - "a_m_mul_b_m": "0x3d8d", - "a_eq_b": false, - "a_m_pow_b": "0x9d03" - }, - { - "a": "0x2c", - "b": "0x17", - "m": "0x1e240", - "a_m_add_b_m": "0x43", - "a_m_sub_b_m": "0x15", - "a_m_mul_b_m": "0x3f4", - "a_eq_b": false, - "a_m_pow_b": "0xd880" - }, - { - "a": "0xc", - "b": "0x166e6", - "m": "0x1e240", - "a_m_add_b_m": "0x166f2", - "a_m_sub_b_m": "0x7b66", - "a_m_mul_b_m": "0x1c0c8", - "a_eq_b": false, - "a_m_pow_b": "0x13980" - } - ], - "montgomery_17": [ - { - "a": "0x1", - "b": "0x5", - "m": "0x1e241", - "a_m_add_b_m": "0x6", - "a_m_sub_b_m": "0x1e23d", - "a_m_mul_b_m": "0x5", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x39c8", - "b": "0x2", - "m": "0x1e241", - "a_m_add_b_m": "0x39ca", - "a_m_sub_b_m": "0x39c6", - "a_m_mul_b_m": "0x7390", - "a_eq_b": false, - "a_m_pow_b": "0x9254" - }, - { - "a": "0x1", - "b": "0x30d", - "m": "0x1e241", - "a_m_add_b_m": "0x30e", - "a_m_sub_b_m": "0x1df35", - "a_m_mul_b_m": "0x30d", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x1e3", - "b": "0x3", - "m": "0x1e241", - "a_m_add_b_m": "0x1e6", - "a_m_sub_b_m": "0x1e0", - "a_m_mul_b_m": "0x5a9", - "a_eq_b": false, - "a_m_pow_b": "0x14f2b" - }, - { - "a": "0x839", - "b": "0x19", - "m": "0x1e241", - "a_m_add_b_m": "0x852", - "a_m_sub_b_m": "0x820", - "a_m_mul_b_m": "0xcd91", - "a_eq_b": false, - "a_m_pow_b": "0x1908" - }, - { - "a": "0x1e1", - "b": "0x7d", - "m": "0x1e241", - "a_m_add_b_m": "0x25e", - "a_m_sub_b_m": "0x164", - "a_m_mul_b_m": "0xeadd", - "a_eq_b": false, - "a_m_pow_b": "0x18023" - }, - { - "a": "0x38", - "b": "0x3f9", - "m": "0x1e241", - "a_m_add_b_m": "0x431", - "a_m_sub_b_m": "0x1de80", - "a_m_mul_b_m": "0xde78", - "a_eq_b": false, - "a_m_pow_b": "0x18015" - }, - { - "a": "0x1", - "b": "0x1", - "m": "0x1e241", - "a_m_add_b_m": "0x2", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x1", - "a_eq_b": true, - "a_m_pow_b": "0x1" - }, - { - "a": "0xeab9", - "b": "0x2", - "m": "0x1e241", - "a_m_add_b_m": "0xeabb", - "a_m_sub_b_m": "0xeab7", - "a_m_mul_b_m": "0x1d572", - "a_eq_b": false, - "a_m_pow_b": "0xfbf3" - }, - { - "a": "0x7e47", - "b": "0x7e47", - "m": "0x1e241", - "a_m_add_b_m": "0xfc8e", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x172a1", - "a_eq_b": true, - "a_m_pow_b": "0x16cb5" - }, - { - "a": "0x6938", - "b": "0xe", - "m": "0x1e241", - "a_m_add_b_m": "0x6946", - "a_m_sub_b_m": "0x692a", - "a_m_mul_b_m": "0x1a4d", - "a_eq_b": false, - "a_m_pow_b": "0x12015" - }, - { - "a": "0x10", - "b": "0x1c", - "m": "0x1e241", - "a_m_add_b_m": "0x2c", - "a_m_sub_b_m": "0x1e235", - "a_m_mul_b_m": "0x1c0", - "a_eq_b": false, - "a_m_pow_b": "0x1d665" - }, - { - "a": "0x3a", - "b": "0xf", - "m": "0x1e241", - "a_m_add_b_m": "0x49", - "a_m_sub_b_m": "0x2b", - "a_m_mul_b_m": "0x366", - "a_eq_b": false, - "a_m_pow_b": "0x2cc6" - }, - { - "a": "0xd2", - "b": "0x4", - "m": "0x1e241", - "a_m_add_b_m": "0xd6", - "a_m_sub_b_m": "0xce", - "a_m_mul_b_m": "0x348", - "a_eq_b": false, - "a_m_pow_b": "0x1c288" - }, - { - "a": "0x13206", - "b": "0x11d02", - "m": "0x1e241", - "a_m_add_b_m": "0x6cc7", - "a_m_sub_b_m": "0x1504", - "a_m_mul_b_m": "0xd071", - "a_eq_b": false, - "a_m_pow_b": "0x5f9a" - }, - { - "a": "0x2b", - "b": "0x1388b", - "m": "0x1e241", - "a_m_add_b_m": "0x138b6", - "a_m_sub_b_m": "0xa9e1", - "a_m_mul_b_m": "0x1a27e", - "a_eq_b": false, - "a_m_pow_b": "0x1a4e5" - }, - { - "a": "0x8", - "b": "0x766", - "m": "0x1e241", - "a_m_add_b_m": "0x76e", - "a_m_sub_b_m": "0x1dae3", - "a_m_mul_b_m": "0x3b30", - "a_eq_b": false, - "a_m_pow_b": "0x792" - }, - { - "a": "0x160e4", - "b": "0x10ec1", - "m": "0x1e241", - "a_m_add_b_m": "0x8d64", - "a_m_sub_b_m": "0x5223", - "a_m_mul_b_m": "0x1d805", - "a_eq_b": false, - "a_m_pow_b": "0x99d0" - }, - { - "a": "0x0", - "b": "0x89f5", - "m": "0x1e241", - "a_m_add_b_m": "0x89f5", - "a_m_sub_b_m": "0x1584c", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x0", - "b": "0x1d", - "m": "0x1e241", - "a_m_add_b_m": "0x1d", - "a_m_sub_b_m": "0x1e224", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x134", - "b": "0x134", - "m": "0x1e241", - "a_m_add_b_m": "0x268", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x17290", - "a_eq_b": true, - "a_m_pow_b": "0xe21d" - }, - { - "a": "0x27", - "b": "0x84eb", - "m": "0x1e241", - "a_m_add_b_m": "0x8512", - "a_m_sub_b_m": "0x15d7d", - "a_m_mul_b_m": "0x16943", - "a_eq_b": false, - "a_m_pow_b": "0x6344" - }, - { - "a": "0x496a", - "b": "0xc1", - "m": "0x1e241", - "a_m_add_b_m": "0x4a2b", - "a_m_sub_b_m": "0x48a9", - "a_m_mul_b_m": "0xb78d", - "a_eq_b": false, - "a_m_pow_b": "0x5f06" - }, - { - "a": "0xe6", - "b": "0x9f", - "m": "0x1e241", - "a_m_add_b_m": "0x185", - "a_m_sub_b_m": "0x47", - "a_m_mul_b_m": "0x8eda", - "a_eq_b": false, - "a_m_pow_b": "0xc9b7" - }, - { - "a": "0x827", - "b": "0xc6", - "m": "0x1e241", - "a_m_add_b_m": "0x8ed", - "a_m_sub_b_m": "0x761", - "a_m_mul_b_m": "0xa767", - "a_eq_b": false, - "a_m_pow_b": "0x1dea0" - }, - { - "a": "0x1", - "b": "0x37c", - "m": "0x1e241", - "a_m_add_b_m": "0x37d", - "a_m_sub_b_m": "0x1dec6", - "a_m_mul_b_m": "0x37c", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x0", - "b": "0x198d2", - "m": "0x1e241", - "a_m_add_b_m": "0x198d2", - "a_m_sub_b_m": "0x496f", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x3c0f", - "b": "0x54b5", - "m": "0x1e241", - "a_m_add_b_m": "0x90c4", - "a_m_sub_b_m": "0x1c99b", - "a_m_mul_b_m": "0x11d0f", - "a_eq_b": false, - "a_m_pow_b": "0x8abf" - }, - { - "a": "0x31", - "b": "0x6", - "m": "0x1e241", - "a_m_add_b_m": "0x37", - "a_m_sub_b_m": "0x2b", - "a_m_mul_b_m": "0x126", - "a_eq_b": false, - "a_m_pow_b": "0x71af" - }, - { - "a": "0x5d", - "b": "0x384e", - "m": "0x1e241", - "a_m_add_b_m": "0x38ab", - "a_m_sub_b_m": "0x1aa50", - "a_m_mul_b_m": "0x19dcc", - "a_eq_b": false, - "a_m_pow_b": "0xda41" - }, - { - "a": "0xcf", - "b": "0x221", - "m": "0x1e241", - "a_m_add_b_m": "0x2f0", - "a_m_sub_b_m": "0x1e0ef", - "a_m_mul_b_m": "0x1b8af", - "a_eq_b": false, - "a_m_pow_b": "0xed53" - }, - { - "a": "0xbb1", - "b": "0x15cff", - "m": "0x1e241", - "a_m_add_b_m": "0x168b0", - "a_m_sub_b_m": "0x90f3", - "a_m_mul_b_m": "0x1d19a", - "a_eq_b": false, - "a_m_pow_b": "0xc23b" - }, - { - "a": "0x4", - "b": "0x10", - "m": "0x1e241", - "a_m_add_b_m": "0x14", - "a_m_sub_b_m": "0x1e235", - "a_m_mul_b_m": "0x40", - "a_eq_b": false, - "a_m_pow_b": "0x54db" - }, - { - "a": "0xd", - "b": "0x1d859", - "m": "0x1e241", - "a_m_add_b_m": "0x1d866", - "a_m_sub_b_m": "0x9f5", - "a_m_mul_b_m": "0x16179", - "a_eq_b": false, - "a_m_pow_b": "0x5d2c" - }, - { - "a": "0x13c", - "b": "0x3e73", - "m": "0x1e241", - "a_m_add_b_m": "0x3faf", - "a_m_sub_b_m": "0x1a50a", - "a_m_mul_b_m": "0x1bbcc", - "a_eq_b": false, - "a_m_pow_b": "0x16a6c" - }, - { - "a": "0xfaf6", - "b": "0x5e4", - "m": "0x1e241", - "a_m_add_b_m": "0x100da", - "a_m_sub_b_m": "0xf512", - "a_m_mul_b_m": "0x16a08", - "a_eq_b": false, - "a_m_pow_b": "0x131d7" - }, - { - "a": "0x3", - "b": "0x8", - "m": "0x1e241", - "a_m_add_b_m": "0xb", - "a_m_sub_b_m": "0x1e23c", - "a_m_mul_b_m": "0x18", - "a_eq_b": false, - "a_m_pow_b": "0x19a1" - }, - { - "a": "0x120", - "b": "0x120", - "m": "0x1e241", - "a_m_add_b_m": "0x240", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x14400", - "a_eq_b": true, - "a_m_pow_b": "0x17e62" - }, - { - "a": "0x37", - "b": "0x30a", - "m": "0x1e241", - "a_m_add_b_m": "0x341", - "a_m_sub_b_m": "0x1df6e", - "a_m_mul_b_m": "0xa726", - "a_eq_b": false, - "a_m_pow_b": "0x10f72" - }, - { - "a": "0x76", - "b": "0x76", - "m": "0x1e241", - "a_m_add_b_m": "0xec", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x3664", - "a_eq_b": true, - "a_m_pow_b": "0x91de" - }, - { - "a": "0x75b", - "b": "0x1bf30", - "m": "0x1e241", - "a_m_add_b_m": "0x1c68b", - "a_m_sub_b_m": "0x2a6c", - "a_m_mul_b_m": "0x26be", - "a_eq_b": false, - "a_m_pow_b": "0xc920" - }, - { - "a": "0x18861", - "b": "0x2", - "m": "0x1e241", - "a_m_add_b_m": "0x18863", - "a_m_sub_b_m": "0x1885f", - "a_m_mul_b_m": "0x12e81", - "a_eq_b": false, - "a_m_pow_b": "0x1a581" - }, - { - "a": "0x5c", - "b": "0x10", - "m": "0x1e241", - "a_m_add_b_m": "0x6c", - "a_m_sub_b_m": "0x4c", - "a_m_mul_b_m": "0x5c0", - "a_eq_b": false, - "a_m_pow_b": "0x1ba9f" - }, - { - "a": "0x82", - "b": "0x10a01", - "m": "0x1e241", - "a_m_add_b_m": "0x10a83", - "a_m_sub_b_m": "0xd8c2", - "a_m_mul_b_m": "0x1547b", - "a_eq_b": false, - "a_m_pow_b": "0x11d0e" - }, - { - "a": "0x4", - "b": "0x4", - "m": "0x1e241", - "a_m_add_b_m": "0x8", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x10", - "a_eq_b": true, - "a_m_pow_b": "0x100" - }, - { - "a": "0x16", - "b": "0xd", - "m": "0x1e241", - "a_m_add_b_m": "0x23", - "a_m_sub_b_m": "0x9", - "a_m_mul_b_m": "0x11e", - "a_eq_b": false, - "a_m_pow_b": "0x2d1b" - }, - { - "a": "0x2a2", - "b": "0x54", - "m": "0x1e241", - "a_m_add_b_m": "0x2f6", - "a_m_sub_b_m": "0x24e", - "a_m_mul_b_m": "0xdd28", - "a_eq_b": false, - "a_m_pow_b": "0x13ebb" - }, - { - "a": "0x2", - "b": "0x53", - "m": "0x1e241", - "a_m_add_b_m": "0x55", - "a_m_sub_b_m": "0x1e1f0", - "a_m_mul_b_m": "0xa6", - "a_eq_b": false, - "a_m_pow_b": "0x12d90" - }, - { - "a": "0x707", - "b": "0x14818", - "m": "0x1e241", - "a_m_add_b_m": "0x14f1f", - "a_m_sub_b_m": "0xa130", - "a_m_mul_b_m": "0x1bc21", - "a_eq_b": false, - "a_m_pow_b": "0xf3e0" - }, - { - "a": "0x1c203", - "b": "0x2", - "m": "0x1e241", - "a_m_add_b_m": "0x1c205", - "a_m_sub_b_m": "0x1c201", - "a_m_mul_b_m": "0x1a1c5", - "a_eq_b": false, - "a_m_pow_b": "0x1951d" - }, - { - "a": "0x129", - "b": "0x23e", - "m": "0x1e241", - "a_m_add_b_m": "0x367", - "a_m_sub_b_m": "0x1e12c", - "a_m_mul_b_m": "0xb7ad", - "a_eq_b": false, - "a_m_pow_b": "0xad21" - }, - { - "a": "0x2", - "b": "0xdb", - "m": "0x1e241", - "a_m_add_b_m": "0xdd", - "a_m_sub_b_m": "0x1e168", - "a_m_mul_b_m": "0x1b6", - "a_eq_b": false, - "a_m_pow_b": "0x191c7" - }, - { - "a": "0x2c0", - "b": "0x2c0", - "m": "0x1e241", - "a_m_add_b_m": "0x580", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x6fc", - "a_eq_b": true, - "a_m_pow_b": "0x1af8" - }, - { - "a": "0x71", - "b": "0xa5d9", - "m": "0x1e241", - "a_m_add_b_m": "0xa64a", - "a_m_sub_b_m": "0x13cd9", - "a_m_mul_b_m": "0x19f23", - "a_eq_b": false, - "a_m_pow_b": "0xee84" - }, - { - "a": "0x733f", - "b": "0xa15", - "m": "0x1e241", - "a_m_add_b_m": "0x7d54", - "a_m_sub_b_m": "0x692a", - "a_m_mul_b_m": "0x17dc3", - "a_eq_b": false, - "a_m_pow_b": "0x1bbcb" - }, - { - "a": "0x10453", - "b": "0x0", - "m": "0x1e241", - "a_m_add_b_m": "0x10453", - "a_m_sub_b_m": "0x10453", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x831", - "b": "0x1f5", - "m": "0x1e241", - "a_m_add_b_m": "0xa26", - "a_m_sub_b_m": "0x63c", - "a_m_mul_b_m": "0xf5dd", - "a_eq_b": false, - "a_m_pow_b": "0x14e07" - }, - { - "a": "0x2", - "b": "0x1", - "m": "0x1e241", - "a_m_add_b_m": "0x3", - "a_m_sub_b_m": "0x1", - "a_m_mul_b_m": "0x2", - "a_eq_b": false, - "a_m_pow_b": "0x2" - }, - { - "a": "0x10f7", - "b": "0x3f", - "m": "0x1e241", - "a_m_add_b_m": "0x1136", - "a_m_sub_b_m": "0x10b8", - "a_m_mul_b_m": "0x6847", - "a_eq_b": false, - "a_m_pow_b": "0x14590" - }, - { - "a": "0x1c51", - "b": "0x16a48", - "m": "0x1e241", - "a_m_add_b_m": "0x18699", - "a_m_sub_b_m": "0x944a", - "a_m_mul_b_m": "0x13043", - "a_eq_b": false, - "a_m_pow_b": "0x5150" - }, - { - "a": "0x1b6", - "b": "0x1f54", - "m": "0x1e241", - "a_m_add_b_m": "0x210a", - "a_m_sub_b_m": "0x1c4a3", - "a_m_mul_b_m": "0xda9c", - "a_eq_b": false, - "a_m_pow_b": "0x1cc1e" - }, - { - "a": "0x3", - "b": "0x1", - "m": "0x1e241", - "a_m_add_b_m": "0x4", - "a_m_sub_b_m": "0x2", - "a_m_mul_b_m": "0x3", - "a_eq_b": false, - "a_m_pow_b": "0x3" - }, - { - "a": "0x4", - "b": "0xe0a", - "m": "0x1e241", - "a_m_add_b_m": "0xe0e", - "a_m_sub_b_m": "0x1d43b", - "a_m_mul_b_m": "0x3828", - "a_eq_b": false, - "a_m_pow_b": "0x10754" - }, - { - "a": "0xd8ec", - "b": "0x25", - "m": "0x1e241", - "a_m_add_b_m": "0xd911", - "a_m_sub_b_m": "0xd8c7", - "a_m_mul_b_m": "0x1360c", - "a_eq_b": false, - "a_m_pow_b": "0xd712" - }, - { - "a": "0x1b83d", - "b": "0xe", - "m": "0x1e241", - "a_m_add_b_m": "0x1b84b", - "a_m_sub_b_m": "0x1b82f", - "a_m_mul_b_m": "0x1784a", - "a_eq_b": false, - "a_m_pow_b": "0xdc4e" - }, - { - "a": "0x113c", - "b": "0xe8", - "m": "0x1e241", - "a_m_add_b_m": "0x1224", - "a_m_sub_b_m": "0x1054", - "a_m_mul_b_m": "0x8c58", - "a_eq_b": false, - "a_m_pow_b": "0x2482" - }, - { - "a": "0x1929", - "b": "0x1", - "m": "0x1e241", - "a_m_add_b_m": "0x192a", - "a_m_sub_b_m": "0x1928", - "a_m_mul_b_m": "0x1929", - "a_eq_b": false, - "a_m_pow_b": "0x1929" - }, - { - "a": "0x25", - "b": "0x249", - "m": "0x1e241", - "a_m_add_b_m": "0x26e", - "a_m_sub_b_m": "0x1e01d", - "a_m_mul_b_m": "0x548d", - "a_eq_b": false, - "a_m_pow_b": "0x9bfe" - }, - { - "a": "0x4", - "b": "0x209", - "m": "0x1e241", - "a_m_add_b_m": "0x20d", - "a_m_sub_b_m": "0x1e03c", - "a_m_mul_b_m": "0x824", - "a_eq_b": false, - "a_m_pow_b": "0x1033e" - }, - { - "a": "0x12598", - "b": "0x1", - "m": "0x1e241", - "a_m_add_b_m": "0x12599", - "a_m_sub_b_m": "0x12597", - "a_m_mul_b_m": "0x12598", - "a_eq_b": false, - "a_m_pow_b": "0x12598" - }, - { - "a": "0x516", - "b": "0x354", - "m": "0x1e241", - "a_m_add_b_m": "0x86a", - "a_m_sub_b_m": "0x1c2", - "a_m_mul_b_m": "0x1db30", - "a_eq_b": false, - "a_m_pow_b": "0xb650" - }, - { - "a": "0x459", - "b": "0x483", - "m": "0x1e241", - "a_m_add_b_m": "0x8dc", - "a_m_sub_b_m": "0x1e217", - "a_m_mul_b_m": "0xc701", - "a_eq_b": false, - "a_m_pow_b": "0x739" - }, - { - "a": "0x4", - "b": "0x21", - "m": "0x1e241", - "a_m_add_b_m": "0x25", - "a_m_sub_b_m": "0x1e224", - "a_m_mul_b_m": "0x84", - "a_eq_b": false, - "a_m_pow_b": "0x516b" - }, - { - "a": "0x130", - "b": "0x4df", - "m": "0x1e241", - "a_m_add_b_m": "0x60f", - "a_m_sub_b_m": "0x1de92", - "a_m_mul_b_m": "0x220d", - "a_eq_b": false, - "a_m_pow_b": "0x11c8f" - }, - { - "a": "0x15ea4", - "b": "0x65", - "m": "0x1e241", - "a_m_add_b_m": "0x15f09", - "a_m_sub_b_m": "0x15e3f", - "a_m_mul_b_m": "0xd22b", - "a_eq_b": false, - "a_m_pow_b": "0x1afc1" - }, - { - "a": "0x69f", - "b": "0x1681", - "m": "0x1e241", - "a_m_add_b_m": "0x1d20", - "a_m_sub_b_m": "0x1d25f", - "a_m_mul_b_m": "0x2e10", - "a_eq_b": false, - "a_m_pow_b": "0x1868" - }, - { - "a": "0x1b79c", - "b": "0xa9", - "m": "0x1e241", - "a_m_add_b_m": "0x1b845", - "a_m_sub_b_m": "0x1b6f3", - "a_m_mul_b_m": "0x1ae2", - "a_eq_b": false, - "a_m_pow_b": "0x16458" - }, - { - "a": "0x0", - "b": "0x19", - "m": "0x1e241", - "a_m_add_b_m": "0x19", - "a_m_sub_b_m": "0x1e228", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x5b", - "b": "0x10acc", - "m": "0x1e241", - "a_m_add_b_m": "0x10b27", - "a_m_sub_b_m": "0xd7d0", - "a_m_mul_b_m": "0xa5d2", - "a_eq_b": false, - "a_m_pow_b": "0xb647" - }, - { - "a": "0x202", - "b": "0x2", - "m": "0x1e241", - "a_m_add_b_m": "0x204", - "a_m_sub_b_m": "0x200", - "a_m_mul_b_m": "0x404", - "a_eq_b": false, - "a_m_pow_b": "0x4382" - }, - { - "a": "0x1947d", - "b": "0x33c", - "m": "0x1e241", - "a_m_add_b_m": "0x197b9", - "a_m_sub_b_m": "0x19141", - "a_m_mul_b_m": "0xe816", - "a_eq_b": false, - "a_m_pow_b": "0x14eb6" - }, - { - "a": "0x3", - "b": "0x1e4e", - "m": "0x1e241", - "a_m_add_b_m": "0x1e51", - "a_m_sub_b_m": "0x1c3f6", - "a_m_mul_b_m": "0x5aea", - "a_eq_b": false, - "a_m_pow_b": "0x11aa9" - }, - { - "a": "0x5", - "b": "0x1aff", - "m": "0x1e241", - "a_m_add_b_m": "0x1b04", - "a_m_sub_b_m": "0x1c747", - "a_m_mul_b_m": "0x86fb", - "a_eq_b": false, - "a_m_pow_b": "0xa755" - }, - { - "a": "0x1dd", - "b": "0xb2c", - "m": "0x1e241", - "a_m_add_b_m": "0xd09", - "a_m_sub_b_m": "0x1d8f2", - "a_m_mul_b_m": "0x1831", - "a_eq_b": false, - "a_m_pow_b": "0x1bd46" - }, - { - "a": "0x1b60", - "b": "0x147c", - "m": "0x1e241", - "a_m_add_b_m": "0x2fdc", - "a_m_sub_b_m": "0x6e4", - "a_m_mul_b_m": "0x14517", - "a_eq_b": false, - "a_m_pow_b": "0x18b47" - }, - { - "a": "0x10252", - "b": "0x10252", - "m": "0x1e241", - "a_m_add_b_m": "0x2263", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x14466", - "a_eq_b": true, - "a_m_pow_b": "0x340c" - }, - { - "a": "0x729", - "b": "0xd", - "m": "0x1e241", - "a_m_add_b_m": "0x736", - "a_m_sub_b_m": "0x71c", - "a_m_mul_b_m": "0x5d15", - "a_eq_b": false, - "a_m_pow_b": "0x1160f" - }, - { - "a": "0x4d", - "b": "0x3191", - "m": "0x1e241", - "a_m_add_b_m": "0x31de", - "a_m_sub_b_m": "0x1b0fd", - "a_m_mul_b_m": "0x1b8d6", - "a_eq_b": false, - "a_m_pow_b": "0x20d4" - }, - { - "a": "0x71d", - "b": "0x51b", - "m": "0x1e241", - "a_m_add_b_m": "0xc38", - "a_m_sub_b_m": "0x202", - "a_m_mul_b_m": "0x863c", - "a_eq_b": false, - "a_m_pow_b": "0x159ce" - }, - { - "a": "0xc3", - "b": "0x11101", - "m": "0x1e241", - "a_m_add_b_m": "0x111c4", - "a_m_sub_b_m": "0xd203", - "a_m_mul_b_m": "0xbbd5", - "a_eq_b": false, - "a_m_pow_b": "0x6dfc" - }, - { - "a": "0x0", - "b": "0x3", - "m": "0x1e241", - "a_m_add_b_m": "0x3", - "a_m_sub_b_m": "0x1e23e", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0x19", - "b": "0x3", - "m": "0x1e241", - "a_m_add_b_m": "0x1c", - "a_m_sub_b_m": "0x16", - "a_m_mul_b_m": "0x4b", - "a_eq_b": false, - "a_m_pow_b": "0x3d09" - }, - { - "a": "0x2d8b", - "b": "0x23eb", - "m": "0x1e241", - "a_m_add_b_m": "0x5176", - "a_m_sub_b_m": "0x9a0", - "a_m_mul_b_m": "0xab35", - "a_eq_b": false, - "a_m_pow_b": "0xe6f0" - }, - { - "a": "0x5224", - "b": "0x1dbca", - "m": "0x1e241", - "a_m_add_b_m": "0x4bad", - "a_m_sub_b_m": "0x589b", - "a_m_mul_b_m": "0x34de", - "a_eq_b": false, - "a_m_pow_b": "0x119ee" - }, - { - "a": "0x107", - "b": "0x18", - "m": "0x1e241", - "a_m_add_b_m": "0x11f", - "a_m_sub_b_m": "0xef", - "a_m_mul_b_m": "0x18a8", - "a_eq_b": false, - "a_m_pow_b": "0x108b5" - }, - { - "a": "0x7", - "b": "0x36", - "m": "0x1e241", - "a_m_add_b_m": "0x3d", - "a_m_sub_b_m": "0x1e212", - "a_m_mul_b_m": "0x17a", - "a_eq_b": false, - "a_m_pow_b": "0x6faa" - }, - { - "a": "0xdf52", - "b": "0x3b7", - "m": "0x1e241", - "a_m_add_b_m": "0xe309", - "a_m_sub_b_m": "0xdb9b", - "a_m_mul_b_m": "0xb9e6", - "a_eq_b": false, - "a_m_pow_b": "0x1b8c0" - }, - { - "a": "0x1ca2b", - "b": "0x1ca2b", - "m": "0x1e241", - "a_m_add_b_m": "0x1b215", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x1cdf1", - "a_eq_b": true, - "a_m_pow_b": "0xb2ea" - }, - { - "a": "0x975", - "b": "0x30", - "m": "0x1e241", - "a_m_add_b_m": "0x9a5", - "a_m_sub_b_m": "0x945", - "a_m_mul_b_m": "0x1c5f0", - "a_eq_b": false, - "a_m_pow_b": "0x1ad8c" - }, - { - "a": "0x14bf6", - "b": "0x4", - "m": "0x1e241", - "a_m_add_b_m": "0x14bfa", - "a_m_sub_b_m": "0x14bf2", - "a_m_mul_b_m": "0x16b56", - "a_eq_b": false, - "a_m_pow_b": "0x1b7d8" - }, - { - "a": "0x778", - "b": "0x0", - "m": "0x1e241", - "a_m_add_b_m": "0x778", - "a_m_sub_b_m": "0x778", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x19", - "b": "0x1de58", - "m": "0x1e241", - "a_m_add_b_m": "0x1de71", - "a_m_sub_b_m": "0x402", - "a_m_mul_b_m": "0x18080", - "a_eq_b": false, - "a_m_pow_b": "0x16139" - }, - { - "a": "0x83", - "b": "0x323", - "m": "0x1e241", - "a_m_add_b_m": "0x3a6", - "a_m_sub_b_m": "0x1dfa1", - "a_m_mul_b_m": "0x19ae9", - "a_eq_b": false, - "a_m_pow_b": "0xd0b3" - }, - { - "a": "0x14ac1", - "b": "0x8ca3", - "m": "0x1e241", - "a_m_add_b_m": "0x1d764", - "a_m_sub_b_m": "0xbe1e", - "a_m_mul_b_m": "0x13f6f", - "a_eq_b": false, - "a_m_pow_b": "0x1d295" - }, - { - "a": "0xd459", - "b": "0x7f", - "m": "0x1e241", - "a_m_add_b_m": "0xd4d8", - "a_m_sub_b_m": "0xd3da", - "a_m_mul_b_m": "0x1bc30", - "a_eq_b": false, - "a_m_pow_b": "0x144e3" - }, - { - "a": "0xe34f", - "b": "0x3", - "m": "0x1e241", - "a_m_add_b_m": "0xe352", - "a_m_sub_b_m": "0xe34c", - "a_m_mul_b_m": "0xc7ac", - "a_eq_b": false, - "a_m_pow_b": "0x13643" - }, - { - "a": "0x1b622", - "b": "0x3", - "m": "0x1e241", - "a_m_add_b_m": "0x1b625", - "a_m_sub_b_m": "0x1b61f", - "a_m_mul_b_m": "0x15de4", - "a_eq_b": false, - "a_m_pow_b": "0x127e4" - }, - { - "a": "0x7", - "b": "0x104", - "m": "0x1e241", - "a_m_add_b_m": "0x10b", - "a_m_sub_b_m": "0x1e144", - "a_m_mul_b_m": "0x71c", - "a_eq_b": false, - "a_m_pow_b": "0xd90" - }, - { - "a": "0x2504", - "b": "0x29d", - "m": "0x1e241", - "a_m_add_b_m": "0x27a1", - "a_m_sub_b_m": "0x2267", - "a_m_mul_b_m": "0xa881", - "a_eq_b": false, - "a_m_pow_b": "0x1d7b1" - }, - { - "a": "0x1b26c", - "b": "0x1", - "m": "0x1e241", - "a_m_add_b_m": "0x1b26d", - "a_m_sub_b_m": "0x1b26b", - "a_m_mul_b_m": "0x1b26c", - "a_eq_b": false, - "a_m_pow_b": "0x1b26c" - }, - { - "a": "0x0", - "b": "0x1d109", - "m": "0x1e241", - "a_m_add_b_m": "0x1d109", - "a_m_sub_b_m": "0x1138", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x0" - }, - { - "a": "0xfa", - "b": "0x46", - "m": "0x1e241", - "a_m_add_b_m": "0x140", - "a_m_sub_b_m": "0xb4", - "a_m_mul_b_m": "0x445c", - "a_eq_b": false, - "a_m_pow_b": "0x1b06e" - }, - { - "a": "0x1b9", - "b": "0x66f", - "m": "0x1e241", - "a_m_add_b_m": "0x828", - "a_m_sub_b_m": "0x1dd8b", - "a_m_mul_b_m": "0x1a9f2", - "a_eq_b": false, - "a_m_pow_b": "0x159c2" - }, - { - "a": "0x3", - "b": "0x1b", - "m": "0x1e241", - "a_m_add_b_m": "0x1e", - "a_m_sub_b_m": "0x1e229", - "a_m_mul_b_m": "0x51", - "a_eq_b": false, - "a_m_pow_b": "0x12cf9" - }, - { - "a": "0xa", - "b": "0xa", - "m": "0x1e241", - "a_m_add_b_m": "0x14", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x64", - "a_eq_b": true, - "a_m_pow_b": "0x19fd9" - }, - { - "a": "0x1", - "b": "0x7", - "m": "0x1e241", - "a_m_add_b_m": "0x8", - "a_m_sub_b_m": "0x1e23b", - "a_m_mul_b_m": "0x7", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x47c", - "b": "0x1", - "m": "0x1e241", - "a_m_add_b_m": "0x47d", - "a_m_sub_b_m": "0x47b", - "a_m_mul_b_m": "0x47c", - "a_eq_b": false, - "a_m_pow_b": "0x47c" - }, - { - "a": "0x1", - "b": "0x42", - "m": "0x1e241", - "a_m_add_b_m": "0x43", - "a_m_sub_b_m": "0x1e200", - "a_m_mul_b_m": "0x42", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x68a8", - "b": "0x2b8", - "m": "0x1e241", - "a_m_add_b_m": "0x6b60", - "a_m_sub_b_m": "0x65f0", - "a_m_mul_b_m": "0x1469", - "a_eq_b": false, - "a_m_pow_b": "0x7fb1" - }, - { - "a": "0xa", - "b": "0x99", - "m": "0x1e241", - "a_m_add_b_m": "0xa3", - "a_m_sub_b_m": "0x1e1b2", - "a_m_mul_b_m": "0x5fa", - "a_eq_b": false, - "a_m_pow_b": "0x95eb" - }, - { - "a": "0x79", - "b": "0xa1df", - "m": "0x1e241", - "a_m_add_b_m": "0xa258", - "a_m_sub_b_m": "0x140db", - "a_m_mul_b_m": "0x1283f", - "a_eq_b": false, - "a_m_pow_b": "0x11bcf" - }, - { - "a": "0x45d2", - "b": "0x959b", - "m": "0x1e241", - "a_m_add_b_m": "0xdb6d", - "a_m_sub_b_m": "0x19278", - "a_m_mul_b_m": "0x1b07e", - "a_eq_b": false, - "a_m_pow_b": "0x1212f" - }, - { - "a": "0x91", - "b": "0x88", - "m": "0x1e241", - "a_m_add_b_m": "0x119", - "a_m_sub_b_m": "0x9", - "a_m_mul_b_m": "0x4d08", - "a_eq_b": false, - "a_m_pow_b": "0x174ce" - }, - { - "a": "0xe3", - "b": "0xe3", - "m": "0x1e241", - "a_m_add_b_m": "0x1c6", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0xc949", - "a_eq_b": true, - "a_m_pow_b": "0x14c58" - }, - { - "a": "0x1", - "b": "0x1a4b3", - "m": "0x1e241", - "a_m_add_b_m": "0x1a4b4", - "a_m_sub_b_m": "0x3d8f", - "a_m_mul_b_m": "0x1a4b3", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x96f1", - "b": "0x2", - "m": "0x1e241", - "a_m_add_b_m": "0x96f3", - "a_m_sub_b_m": "0x96ef", - "a_m_mul_b_m": "0x12de2", - "a_eq_b": false, - "a_m_pow_b": "0x9423" - }, - { - "a": "0x8", - "b": "0x1923e", - "m": "0x1e241", - "a_m_add_b_m": "0x19246", - "a_m_sub_b_m": "0x500b", - "a_m_mul_b_m": "0x1446a", - "a_eq_b": false, - "a_m_pow_b": "0x1d684" - }, - { - "a": "0x14", - "b": "0x12134", - "m": "0x1e241", - "a_m_add_b_m": "0x12148", - "a_m_sub_b_m": "0xc121", - "a_m_mul_b_m": "0x1df45", - "a_eq_b": false, - "a_m_pow_b": "0x156f7" - }, - { - "a": "0x1218d", - "b": "0x5f73", - "m": "0x1e241", - "a_m_add_b_m": "0x18100", - "a_m_sub_b_m": "0xc21a", - "a_m_mul_b_m": "0x1a48", - "a_eq_b": false, - "a_m_pow_b": "0x10519" - }, - { - "a": "0xe", - "b": "0x1d9", - "m": "0x1e241", - "a_m_add_b_m": "0x1e7", - "a_m_sub_b_m": "0x1e076", - "a_m_mul_b_m": "0x19de", - "a_eq_b": false, - "a_m_pow_b": "0x12362" - }, - { - "a": "0x75c9", - "b": "0x24", - "m": "0x1e241", - "a_m_add_b_m": "0x75ed", - "a_m_sub_b_m": "0x75a5", - "a_m_mul_b_m": "0x17e3c", - "a_eq_b": false, - "a_m_pow_b": "0xef72" - }, - { - "a": "0x2", - "b": "0x3f8", - "m": "0x1e241", - "a_m_add_b_m": "0x3fa", - "a_m_sub_b_m": "0x1de4b", - "a_m_mul_b_m": "0x7f0", - "a_eq_b": false, - "a_m_pow_b": "0x7ca4" - }, - { - "a": "0x1", - "b": "0x4a", - "m": "0x1e241", - "a_m_add_b_m": "0x4b", - "a_m_sub_b_m": "0x1e1f8", - "a_m_mul_b_m": "0x4a", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x11b1b", - "b": "0x6", - "m": "0x1e241", - "a_m_add_b_m": "0x11b21", - "a_m_sub_b_m": "0x11b15", - "a_m_mul_b_m": "0xfbdf", - "a_eq_b": false, - "a_m_pow_b": "0x1227e" - }, - { - "a": "0x132f5", - "b": "0x56a", - "m": "0x1e241", - "a_m_add_b_m": "0x1385f", - "a_m_sub_b_m": "0x12d8b", - "a_m_mul_b_m": "0x5e80", - "a_eq_b": false, - "a_m_pow_b": "0x17d5a" - }, - { - "a": "0x496c", - "b": "0x10", - "m": "0x1e241", - "a_m_add_b_m": "0x497c", - "a_m_sub_b_m": "0x495c", - "a_m_mul_b_m": "0xd23e", - "a_eq_b": false, - "a_m_pow_b": "0x8fd8" - }, - { - "a": "0x82", - "b": "0x1b7d", - "m": "0x1e241", - "a_m_add_b_m": "0x1bff", - "a_m_sub_b_m": "0x1c746", - "a_m_mul_b_m": "0xc5b3", - "a_eq_b": false, - "a_m_pow_b": "0x44e0" - }, - { - "a": "0x4d65", - "b": "0x73b7", - "m": "0x1e241", - "a_m_add_b_m": "0xc11c", - "a_m_sub_b_m": "0x1bbef", - "a_m_mul_b_m": "0x1721", - "a_eq_b": false, - "a_m_pow_b": "0xbf25" - }, - { - "a": "0x40c8", - "b": "0x2eb", - "m": "0x1e241", - "a_m_add_b_m": "0x43b3", - "a_m_sub_b_m": "0x3ddd", - "a_m_mul_b_m": "0xa634", - "a_eq_b": false, - "a_m_pow_b": "0x6c48" - }, - { - "a": "0x93", - "b": "0x126", - "m": "0x1e241", - "a_m_add_b_m": "0x1b9", - "a_m_sub_b_m": "0x1e1ae", - "a_m_mul_b_m": "0xa8d2", - "a_eq_b": false, - "a_m_pow_b": "0x1a0aa" - }, - { - "a": "0x11af", - "b": "0x1d4ef", - "m": "0x1e241", - "a_m_add_b_m": "0x45d", - "a_m_sub_b_m": "0x1f01", - "a_m_mul_b_m": "0x1cef0", - "a_eq_b": false, - "a_m_pow_b": "0x16b4d" - }, - { - "a": "0x5a", - "b": "0x4", - "m": "0x1e241", - "a_m_add_b_m": "0x5e", - "a_m_sub_b_m": "0x56", - "a_m_mul_b_m": "0x168", - "a_eq_b": false, - "a_m_pow_b": "0xd43d" - }, - { - "a": "0x28", - "b": "0x4", - "m": "0x1e241", - "a_m_add_b_m": "0x2c", - "a_m_sub_b_m": "0x24", - "a_m_mul_b_m": "0xa0", - "a_eq_b": false, - "a_m_pow_b": "0x162ec" - }, - { - "a": "0x3f", - "b": "0xa5a", - "m": "0x1e241", - "a_m_add_b_m": "0xa99", - "a_m_sub_b_m": "0x1d826", - "a_m_mul_b_m": "0xa9e5", - "a_eq_b": false, - "a_m_pow_b": "0x6ac6" - }, - { - "a": "0x169f2", - "b": "0x33", - "m": "0x1e241", - "a_m_add_b_m": "0x16a25", - "a_m_sub_b_m": "0x169bf", - "a_m_mul_b_m": "0x8590", - "a_eq_b": false, - "a_m_pow_b": "0x13f84" - }, - { - "a": "0x9", - "b": "0x1", - "m": "0x1e241", - "a_m_add_b_m": "0xa", - "a_m_sub_b_m": "0x8", - "a_m_mul_b_m": "0x9", - "a_eq_b": false, - "a_m_pow_b": "0x9" - }, - { - "a": "0x26", - "b": "0x66", - "m": "0x1e241", - "a_m_add_b_m": "0x8c", - "a_m_sub_b_m": "0x1e201", - "a_m_mul_b_m": "0xf24", - "a_eq_b": false, - "a_m_pow_b": "0x6049" - }, - { - "a": "0x2", - "b": "0x2", - "m": "0x1e241", - "a_m_add_b_m": "0x4", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x4", - "a_eq_b": true, - "a_m_pow_b": "0x4" - }, - { - "a": "0x16476", - "b": "0x16d", - "m": "0x1e241", - "a_m_add_b_m": "0x165e3", - "a_m_sub_b_m": "0x16309", - "a_m_mul_b_m": "0x17df1", - "a_eq_b": false, - "a_m_pow_b": "0x6759" - }, - { - "a": "0x263", - "b": "0x3", - "m": "0x1e241", - "a_m_add_b_m": "0x266", - "a_m_sub_b_m": "0x260", - "a_m_mul_b_m": "0x729", - "a_eq_b": false, - "a_m_pow_b": "0x12144" - }, - { - "a": "0x1", - "b": "0x1", - "m": "0x1e241", - "a_m_add_b_m": "0x2", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x1", - "a_eq_b": true, - "a_m_pow_b": "0x1" - }, - { - "a": "0x1", - "b": "0x11", - "m": "0x1e241", - "a_m_add_b_m": "0x12", - "a_m_sub_b_m": "0x1e231", - "a_m_mul_b_m": "0x11", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x3d1c", - "b": "0x462a", - "m": "0x1e241", - "a_m_add_b_m": "0x8346", - "a_m_sub_b_m": "0x1d933", - "a_m_mul_b_m": "0x24b4", - "a_eq_b": false, - "a_m_pow_b": "0xb39d" - }, - { - "a": "0x9", - "b": "0x17304", - "m": "0x1e241", - "a_m_add_b_m": "0x1730d", - "a_m_sub_b_m": "0x6f46", - "a_m_mul_b_m": "0x1bd9e", - "a_eq_b": false, - "a_m_pow_b": "0xe2cf" - }, - { - "a": "0x5", - "b": "0x14", - "m": "0x1e241", - "a_m_add_b_m": "0x19", - "a_m_sub_b_m": "0x1e232", - "a_m_mul_b_m": "0x64", - "a_eq_b": false, - "a_m_pow_b": "0x276e" - }, - { - "a": "0xaf", - "b": "0x8a4", - "m": "0x1e241", - "a_m_add_b_m": "0x953", - "a_m_sub_b_m": "0x1da4c", - "a_m_mul_b_m": "0x4159", - "a_eq_b": false, - "a_m_pow_b": "0x19e25" - }, - { - "a": "0x37", - "b": "0x23", - "m": "0x1e241", - "a_m_add_b_m": "0x5a", - "a_m_sub_b_m": "0x14", - "a_m_mul_b_m": "0x785", - "a_eq_b": false, - "a_m_pow_b": "0x2777" - }, - { - "a": "0x709e", - "b": "0x709e", - "m": "0x1e241", - "a_m_add_b_m": "0xe13c", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0xdc38", - "a_eq_b": true, - "a_m_pow_b": "0x14259" - }, - { - "a": "0x15ea5", - "b": "0x12e03", - "m": "0x1e241", - "a_m_add_b_m": "0xaa67", - "a_m_sub_b_m": "0x30a2", - "a_m_mul_b_m": "0xb298", - "a_eq_b": false, - "a_m_pow_b": "0x10e18" - }, - { - "a": "0xffb5", - "b": "0xffb5", - "m": "0x1e241", - "a_m_add_b_m": "0x1d29", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x11f24", - "a_eq_b": true, - "a_m_pow_b": "0xb9c3" - }, - { - "a": "0x19", - "b": "0x55b", - "m": "0x1e241", - "a_m_add_b_m": "0x574", - "a_m_sub_b_m": "0x1dcff", - "a_m_mul_b_m": "0x85e3", - "a_eq_b": false, - "a_m_pow_b": "0x806b" - }, - { - "a": "0x14077", - "b": "0x1c3", - "m": "0x1e241", - "a_m_add_b_m": "0x1423a", - "a_m_sub_b_m": "0x13eb4", - "a_m_mul_b_m": "0x14fba", - "a_eq_b": false, - "a_m_pow_b": "0x4ab7" - }, - { - "a": "0x4a5", - "b": "0x1", - "m": "0x1e241", - "a_m_add_b_m": "0x4a6", - "a_m_sub_b_m": "0x4a4", - "a_m_mul_b_m": "0x4a5", - "a_eq_b": false, - "a_m_pow_b": "0x4a5" - }, - { - "a": "0x19fd", - "b": "0x371b", - "m": "0x1e241", - "a_m_add_b_m": "0x5118", - "a_m_sub_b_m": "0x1c523", - "a_m_mul_b_m": "0x67b7", - "a_eq_b": false, - "a_m_pow_b": "0x13c16" - }, - { - "a": "0x7297", - "b": "0xf", - "m": "0x1e241", - "a_m_add_b_m": "0x72a6", - "a_m_sub_b_m": "0x7288", - "a_m_mul_b_m": "0x11016", - "a_eq_b": false, - "a_m_pow_b": "0x1d273" - }, - { - "a": "0x1a", - "b": "0x1a", - "m": "0x1e241", - "a_m_add_b_m": "0x34", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x2a4", - "a_eq_b": true, - "a_m_pow_b": "0x138aa" - }, - { - "a": "0x5", - "b": "0x14", - "m": "0x1e241", - "a_m_add_b_m": "0x19", - "a_m_sub_b_m": "0x1e232", - "a_m_mul_b_m": "0x64", - "a_eq_b": false, - "a_m_pow_b": "0x276e" - }, - { - "a": "0x288", - "b": "0x121", - "m": "0x1e241", - "a_m_add_b_m": "0x3a9", - "a_m_sub_b_m": "0x167", - "a_m_mul_b_m": "0xf947", - "a_eq_b": false, - "a_m_pow_b": "0x519b" - }, - { - "a": "0xf", - "b": "0xf", - "m": "0x1e241", - "a_m_add_b_m": "0x1e", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0xe1", - "a_eq_b": true, - "a_m_pow_b": "0xa477" - }, - { - "a": "0x319", - "b": "0xfdbe", - "m": "0x1e241", - "a_m_add_b_m": "0x100d7", - "a_m_sub_b_m": "0xe79c", - "a_m_mul_b_m": "0x75ad", - "a_eq_b": false, - "a_m_pow_b": "0xf538" - }, - { - "a": "0x129a3", - "b": "0x45fb", - "m": "0x1e241", - "a_m_add_b_m": "0x16f9e", - "a_m_sub_b_m": "0xe3a8", - "a_m_mul_b_m": "0x16aa1", - "a_eq_b": false, - "a_m_pow_b": "0x187c" - }, - { - "a": "0x1", - "b": "0x117c1", - "m": "0x1e241", - "a_m_add_b_m": "0x117c2", - "a_m_sub_b_m": "0xca81", - "a_m_mul_b_m": "0x117c1", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x1cba5", - "b": "0x3", - "m": "0x1e241", - "a_m_add_b_m": "0x1cba8", - "a_m_sub_b_m": "0x1cba2", - "a_m_mul_b_m": "0x19e6d", - "a_eq_b": false, - "a_m_pow_b": "0x12778" - }, - { - "a": "0x113cb", - "b": "0xf974", - "m": "0x1e241", - "a_m_add_b_m": "0x2afe", - "a_m_sub_b_m": "0x1a57", - "a_m_mul_b_m": "0xe254", - "a_eq_b": false, - "a_m_pow_b": "0x8ada" - }, - { - "a": "0x24ad", - "b": "0x4432", - "m": "0x1e241", - "a_m_add_b_m": "0x68df", - "a_m_sub_b_m": "0x1c2bc", - "a_m_mul_b_m": "0x14edb", - "a_eq_b": false, - "a_m_pow_b": "0x11021" - }, - { - "a": "0x59e", - "b": "0x41a", - "m": "0x1e241", - "a_m_add_b_m": "0x9b8", - "a_m_sub_b_m": "0x184", - "a_m_mul_b_m": "0x6f00", - "a_eq_b": false, - "a_m_pow_b": "0x6858" - }, - { - "a": "0x1d87a", - "b": "0x21d", - "m": "0x1e241", - "a_m_add_b_m": "0x1da97", - "a_m_sub_b_m": "0x1d65d", - "a_m_mul_b_m": "0xf40", - "a_eq_b": false, - "a_m_pow_b": "0x1c928" - }, - { - "a": "0x269b", - "b": "0x523", - "m": "0x1e241", - "a_m_add_b_m": "0x2bbe", - "a_m_sub_b_m": "0x2178", - "a_m_mul_b_m": "0x8188", - "a_eq_b": false, - "a_m_pow_b": "0x77d5" - }, - { - "a": "0x5", - "b": "0x157", - "m": "0x1e241", - "a_m_add_b_m": "0x15c", - "a_m_sub_b_m": "0x1e0ef", - "a_m_mul_b_m": "0x6b3", - "a_eq_b": false, - "a_m_pow_b": "0x19e4a" - }, - { - "a": "0x1ab7", - "b": "0xe8b3", - "m": "0x1e241", - "a_m_add_b_m": "0x1036a", - "a_m_sub_b_m": "0x11445", - "a_m_mul_b_m": "0x1da52", - "a_eq_b": false, - "a_m_pow_b": "0xa3ec" - }, - { - "a": "0x1b5d6", - "b": "0x1b5d6", - "m": "0x1e241", - "a_m_add_b_m": "0x1896b", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x9ce2", - "a_eq_b": true, - "a_m_pow_b": "0x14c3c" - }, - { - "a": "0x1582f", - "b": "0x4023", - "m": "0x1e241", - "a_m_add_b_m": "0x19852", - "a_m_sub_b_m": "0x1180c", - "a_m_mul_b_m": "0x6327", - "a_eq_b": false, - "a_m_pow_b": "0x16fb" - }, - { - "a": "0x135", - "b": "0x163a7", - "m": "0x1e241", - "a_m_add_b_m": "0x164dc", - "a_m_sub_b_m": "0x7fcf", - "a_m_mul_b_m": "0x1a8f0", - "a_eq_b": false, - "a_m_pow_b": "0x10211" - }, - { - "a": "0x46c", - "b": "0x43", - "m": "0x1e241", - "a_m_add_b_m": "0x4af", - "a_m_sub_b_m": "0x429", - "a_m_mul_b_m": "0x12844", - "a_eq_b": false, - "a_m_pow_b": "0x17a8" - }, - { - "a": "0x18542", - "b": "0x182", - "m": "0x1e241", - "a_m_add_b_m": "0x186c4", - "a_m_sub_b_m": "0x183c0", - "a_m_mul_b_m": "0x1108d", - "a_eq_b": false, - "a_m_pow_b": "0x17e3" - }, - { - "a": "0x9f38", - "b": "0x28", - "m": "0x1e241", - "a_m_add_b_m": "0x9f60", - "a_m_sub_b_m": "0x9f10", - "a_m_mul_b_m": "0x6373", - "a_eq_b": false, - "a_m_pow_b": "0x1b4c" - }, - { - "a": "0x7", - "b": "0x9", - "m": "0x1e241", - "a_m_add_b_m": "0x10", - "a_m_sub_b_m": "0x1e23f", - "a_m_mul_b_m": "0x3f", - "a_eq_b": false, - "a_m_pow_b": "0x1a081" - }, - { - "a": "0x2cd", - "b": "0x174", - "m": "0x1e241", - "a_m_add_b_m": "0x441", - "a_m_sub_b_m": "0x159", - "a_m_mul_b_m": "0x4d62", - "a_eq_b": false, - "a_m_pow_b": "0x1ce7b" - }, - { - "a": "0x12a16", - "b": "0x12a16", - "m": "0x1e241", - "a_m_add_b_m": "0x71eb", - "a_m_sub_b_m": "0x0", - "a_m_mul_b_m": "0x1d3e5", - "a_eq_b": true, - "a_m_pow_b": "0x2c4d" - }, - { - "a": "0x6b", - "b": "0x0", - "m": "0x1e241", - "a_m_add_b_m": "0x6b", - "a_m_sub_b_m": "0x6b", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x15", - "b": "0xe6", - "m": "0x1e241", - "a_m_add_b_m": "0xfb", - "a_m_sub_b_m": "0x1e170", - "a_m_mul_b_m": "0x12de", - "a_eq_b": false, - "a_m_pow_b": "0x4454" - }, - { - "a": "0x3e", - "b": "0x74d", - "m": "0x1e241", - "a_m_add_b_m": "0x78b", - "a_m_sub_b_m": "0x1db32", - "a_m_mul_b_m": "0x1c4a6", - "a_eq_b": false, - "a_m_pow_b": "0x23e3" - }, - { - "a": "0x1cf", - "b": "0x53", - "m": "0x1e241", - "a_m_add_b_m": "0x222", - "a_m_sub_b_m": "0x17c", - "a_m_mul_b_m": "0x961d", - "a_eq_b": false, - "a_m_pow_b": "0xf2cd" - }, - { - "a": "0x574a", - "b": "0x5b6b", - "m": "0x1e241", - "a_m_add_b_m": "0xb2b5", - "a_m_sub_b_m": "0x1de20", - "a_m_mul_b_m": "0x1e0a3", - "a_eq_b": false, - "a_m_pow_b": "0x1b722" - }, - { - "a": "0x7", - "b": "0x698", - "m": "0x1e241", - "a_m_add_b_m": "0x69f", - "a_m_sub_b_m": "0x1dbb0", - "a_m_mul_b_m": "0x2e28", - "a_eq_b": false, - "a_m_pow_b": "0x1abf5" - }, - { - "a": "0x28a7", - "b": "0xb7", - "m": "0x1e241", - "a_m_add_b_m": "0x295e", - "a_m_sub_b_m": "0x27f0", - "a_m_mul_b_m": "0xcd92", - "a_eq_b": false, - "a_m_pow_b": "0x8550" - }, - { - "a": "0x6e1", - "b": "0x0", - "m": "0x1e241", - "a_m_add_b_m": "0x6e1", - "a_m_sub_b_m": "0x6e1", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - }, - { - "a": "0x16b", - "b": "0x8c1f", - "m": "0x1e241", - "a_m_add_b_m": "0x8d8a", - "a_m_sub_b_m": "0x1578d", - "a_m_mul_b_m": "0xe34c", - "a_eq_b": false, - "a_m_pow_b": "0x4627" - }, - { - "a": "0x18be0", - "b": "0x204", - "m": "0x1e241", - "a_m_add_b_m": "0x18de4", - "a_m_sub_b_m": "0x189dc", - "a_m_mul_b_m": "0x11619", - "a_eq_b": false, - "a_m_pow_b": "0x1bf29" - }, - { - "a": "0x13f11", - "b": "0x0", - "m": "0x1e241", - "a_m_add_b_m": "0x13f11", - "a_m_sub_b_m": "0x13f11", - "a_m_mul_b_m": "0x0", - "a_eq_b": false, - "a_m_pow_b": "0x1" - } - ] -} \ No newline at end of file From 1b01b722dcaae88d8c329b5f8658d8246724764c Mon Sep 17 00:00:00 2001 From: Andrey Nefedov Date: Fri, 20 Dec 2024 03:14:10 +0000 Subject: [PATCH 29/29] multiprecision: rename benchmarks --- crypto3/benchmarks/CMakeLists.txt | 2 +- .../{big_int.cpp => big_mod.cpp} | 140 ++++++++---------- .../multiprecision/modular_adaptor_fixed.cpp | 2 +- 3 files changed, 62 insertions(+), 82 deletions(-) rename crypto3/benchmarks/multiprecision/{big_int.cpp => big_mod.cpp} (70%) diff --git a/crypto3/benchmarks/CMakeLists.txt b/crypto3/benchmarks/CMakeLists.txt index d0fa4ea99..3c46cd64d 100644 --- a/crypto3/benchmarks/CMakeLists.txt +++ b/crypto3/benchmarks/CMakeLists.txt @@ -60,7 +60,7 @@ set(BENCHMARK_NAMES "math/polynomial_dfs" "multiprecision/modular_adaptor_fixed" - "multiprecision/big_int" + "multiprecision/big_mod" "zk/lpc" ) diff --git a/crypto3/benchmarks/multiprecision/big_int.cpp b/crypto3/benchmarks/multiprecision/big_mod.cpp similarity index 70% rename from crypto3/benchmarks/multiprecision/big_int.cpp rename to crypto3/benchmarks/multiprecision/big_mod.cpp index eee9e5923..ce6f081ad 100644 --- a/crypto3/benchmarks/multiprecision/big_int.cpp +++ b/crypto3/benchmarks/multiprecision/big_mod.cpp @@ -7,18 +7,18 @@ // http://www.boost.org/LICENSE_1_0.txt //---------------------------------------------------------------------------// -#define BOOST_TEST_MODULE big_int_benchmark_test +#define BOOST_TEST_MODULE big_mod_benchmark -#include -#include #include +#include +#include #include #include +#include #include #include -#include #include @@ -29,21 +29,25 @@ using namespace nil::crypto3::multiprecision::literals; constexpr std::size_t Bits = 256; using standart_number = nil::crypto3::multiprecision::big_uint; -constexpr standart_number modulus_odd = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f_big_uint256; -constexpr standart_number modulus_even = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e_big_uint256; +constexpr standart_number modulus_odd = + 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f_big_uint256; +constexpr standart_number modulus_even = + 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e_big_uint256; using modular_number_ct_odd = nil::crypto3::multiprecision::montgomery_big_mod; using modular_number_ct_even = nil::crypto3::multiprecision::big_mod; using modular_number_rt_montgomery = nil::crypto3::multiprecision::montgomery_big_mod_rt; using modular_number_rt = nil::crypto3::multiprecision::big_mod_rt; -constexpr standart_number x = 0xb5d724ce6f44c3c587867bbcb417e9eb6fa05e7e2ef029166568f14eb3161387_big_uint256; +constexpr standart_number x = + 0xb5d724ce6f44c3c587867bbcb417e9eb6fa05e7e2ef029166568f14eb3161387_big_uint256; constexpr modular_number_ct_odd x_mod_ct_odd = x; constexpr modular_number_ct_even x_mod_ct_even = x; constexpr modular_number_rt_montgomery x_mod_rt_odd{x, modulus_odd}; constexpr modular_number_rt x_mod_rt_even{x, modulus_even}; -constexpr standart_number y = 0xad6e1fcc680392abfb075838eafa513811112f14c593e0efacb6e9d0d7770b4_big_uint256; +constexpr standart_number y = + 0xad6e1fcc680392abfb075838eafa513811112f14c593e0efacb6e9d0d7770b4_big_uint256; constexpr modular_number_ct_odd y_mod_ct_odd = y; constexpr modular_number_ct_even y_mod_ct_even = y; constexpr modular_number_rt_montgomery y_mod_rt_odd{y, modulus_odd}; @@ -68,12 +72,10 @@ BOOST_AUTO_TEST_CASE(montgomery_mul_perf_test) { BOOST_AUTO_TEST_CASE(big_mod_sub_perf_test) { auto x_modular = x_mod_rt_odd; - nil::crypto3::bench::run_benchmark<>( - "[odd modulus][runtime] big_mod_subtract", - [&]() { - x_modular -= y_mod_rt_odd; - return x_modular; - }); + nil::crypto3::bench::run_benchmark<>("[odd modulus][runtime] big_mod_subtract", [&]() { + x_modular -= y_mod_rt_odd; + return x_modular; + }); // Print something so the whole computation is not optimized out. std::cout << x_modular << std::endl; @@ -82,12 +84,10 @@ BOOST_AUTO_TEST_CASE(big_mod_sub_perf_test) { BOOST_AUTO_TEST_CASE(big_mod_add_perf_test) { auto x_modular = x_mod_rt_odd; - nil::crypto3::bench::run_benchmark<>( - "[odd modulus][runtime] big_mod_add", - [&]() { - x_modular += y_mod_rt_odd; - return x_modular; - }); + nil::crypto3::bench::run_benchmark<>("[odd modulus][runtime] big_mod_add", [&]() { + x_modular += y_mod_rt_odd; + return x_modular; + }); // Print something so the whole computation is not optimized out. std::cout << x_modular << std::endl; @@ -96,12 +96,10 @@ BOOST_AUTO_TEST_CASE(big_mod_add_perf_test) { BOOST_AUTO_TEST_CASE(big_mod_mul_perf_test) { auto x_modular = x_mod_rt_odd; - nil::crypto3::bench::run_benchmark<>( - "[odd modulus][runtime] big_mod_multiply", - [&]() { - x_modular *= y_mod_rt_odd; - return x_modular; - }); + nil::crypto3::bench::run_benchmark<>("[odd modulus][runtime] big_mod_multiply", [&]() { + x_modular *= y_mod_rt_odd; + return x_modular; + }); // Print something so the whole computation is not optimized out. std::cout << x_modular << std::endl; @@ -128,12 +126,10 @@ BOOST_AUTO_TEST_CASE(montgomery_mul_perf_test) { BOOST_AUTO_TEST_CASE(big_mod_sub_perf_test) { auto x_modular = x_mod_ct_odd; - nil::crypto3::bench::run_benchmark<>( - "[odd modulus][compile time] big_mod_subtract", - [&]() { - x_modular -= y_mod_ct_odd; - return x_modular; - }); + nil::crypto3::bench::run_benchmark<>("[odd modulus][compile time] big_mod_subtract", [&]() { + x_modular -= y_mod_ct_odd; + return x_modular; + }); // Print something so the whole computation is not optimized out. std::cout << x_modular << std::endl; @@ -142,12 +138,10 @@ BOOST_AUTO_TEST_CASE(big_mod_sub_perf_test) { BOOST_AUTO_TEST_CASE(big_mod_add_perf_test) { auto x_modular = x_mod_ct_odd; - nil::crypto3::bench::run_benchmark<>( - "[odd modulus][compile time] big_mod_add", - [&]() { - x_modular += y_mod_ct_odd; - return x_modular; - }); + nil::crypto3::bench::run_benchmark<>("[odd modulus][compile time] big_mod_add", [&]() { + x_modular += y_mod_ct_odd; + return x_modular; + }); // Print something so the whole computation is not optimized out. std::cout << x_modular << std::endl; @@ -156,12 +150,10 @@ BOOST_AUTO_TEST_CASE(big_mod_add_perf_test) { BOOST_AUTO_TEST_CASE(big_mod_mul_perf_test) { auto x_modular = x_mod_ct_odd; - nil::crypto3::bench::run_benchmark<>( - "[odd modulus][compile time] big_mod_multiply", - [&]() { - x_modular *= y_mod_ct_odd; - return x_modular; - }); + nil::crypto3::bench::run_benchmark<>("[odd modulus][compile time] big_mod_multiply", [&]() { + x_modular *= y_mod_ct_odd; + return x_modular; + }); // Print something so the whole computation is not optimized out. std::cout << x_modular << std::endl; @@ -189,12 +181,10 @@ BOOST_AUTO_TEST_CASE(barrett_mul_perf_test) { BOOST_AUTO_TEST_CASE(big_mod_sub_perf_test) { auto x_modular = x_mod_rt_even; - nil::crypto3::bench::run_benchmark<>( - "[even modulus][runtime] big_mod_subtract", - [&]() { - x_modular -= y_mod_rt_even; - return x_modular; - }); + nil::crypto3::bench::run_benchmark<>("[even modulus][runtime] big_mod_subtract", [&]() { + x_modular -= y_mod_rt_even; + return x_modular; + }); // Print something so the whole computation is not optimized out. std::cout << x_modular << std::endl; @@ -203,12 +193,10 @@ BOOST_AUTO_TEST_CASE(big_mod_sub_perf_test) { BOOST_AUTO_TEST_CASE(big_mod_add_perf_test) { auto x_modular = x_mod_rt_even; - nil::crypto3::bench::run_benchmark<>( - "[even modulus][runtime] big_mod_add", - [&]() { - x_modular += y_mod_rt_even; - return x_modular; - }); + nil::crypto3::bench::run_benchmark<>("[even modulus][runtime] big_mod_add", [&]() { + x_modular += y_mod_rt_even; + return x_modular; + }); // Print something so the whole computation is not optimized out. std::cout << x_modular << std::endl; @@ -217,12 +205,10 @@ BOOST_AUTO_TEST_CASE(big_mod_add_perf_test) { BOOST_AUTO_TEST_CASE(big_mod_mul_perf_test) { auto x_modular = x_mod_rt_even; - nil::crypto3::bench::run_benchmark<>( - "[even modulus][runtime] big_mod_multiply", - [&]() { - x_modular *= y_mod_rt_even; - return x_modular; - }); + nil::crypto3::bench::run_benchmark<>("[even modulus][runtime] big_mod_multiply", [&]() { + x_modular *= y_mod_rt_even; + return x_modular; + }); // Print something so the whole computation is not optimized out. std::cout << x_modular << std::endl; @@ -250,12 +236,10 @@ BOOST_AUTO_TEST_CASE(barrett_mul_perf_test) { BOOST_AUTO_TEST_CASE(big_mod_sub_perf_test) { auto x_modular = x_mod_ct_even; - nil::crypto3::bench::run_benchmark<>( - "[even modulus][compile time] big_mod_subtract", - [&]() { - x_modular -= y_mod_ct_even; - return x_modular; - }); + nil::crypto3::bench::run_benchmark<>("[even modulus][compile time] big_mod_subtract", [&]() { + x_modular -= y_mod_ct_even; + return x_modular; + }); // Print something so the whole computation is not optimized out. std::cout << x_modular << std::endl; @@ -264,12 +248,10 @@ BOOST_AUTO_TEST_CASE(big_mod_sub_perf_test) { BOOST_AUTO_TEST_CASE(big_mod_add_perf_test) { auto x_modular = x_mod_ct_even; - nil::crypto3::bench::run_benchmark<>( - "[even modulus][compile time] big_mod_add", - [&]() { - x_modular += y_mod_ct_even; - return x_modular; - }); + nil::crypto3::bench::run_benchmark<>("[even modulus][compile time] big_mod_add", [&]() { + x_modular += y_mod_ct_even; + return x_modular; + }); // Print something so the whole computation is not optimized out. std::cout << x_modular << std::endl; @@ -278,12 +260,10 @@ BOOST_AUTO_TEST_CASE(big_mod_add_perf_test) { BOOST_AUTO_TEST_CASE(big_mod_mul_perf_test) { auto x_modular = x_mod_ct_even; - nil::crypto3::bench::run_benchmark<>( - "[even modulus][compile time] big_mod_multiply", - [&]() { - x_modular *= y_mod_ct_even; - return x_modular; - }); + nil::crypto3::bench::run_benchmark<>("[even modulus][compile time] big_mod_multiply", [&]() { + x_modular *= y_mod_ct_even; + return x_modular; + }); // Print something so the whole computation is not optimized out. std::cout << x_modular << std::endl; diff --git a/crypto3/benchmarks/multiprecision/modular_adaptor_fixed.cpp b/crypto3/benchmarks/multiprecision/modular_adaptor_fixed.cpp index a7e0ff3c2..a465c60a6 100644 --- a/crypto3/benchmarks/multiprecision/modular_adaptor_fixed.cpp +++ b/crypto3/benchmarks/multiprecision/modular_adaptor_fixed.cpp @@ -7,7 +7,7 @@ // http://www.boost.org/LICENSE_1_0.txt //---------------------------------------------------------------------------// -#define BOOST_TEST_MODULE modular_fixed_multiprecision_test +#define BOOST_TEST_MODULE modular_adaptor_fixed_benchmark #define TEST_CPP_INT