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 9143c0c274..3fd76e74ac 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_mod.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_mod.hpp @@ -1,6 +1,6 @@ #pragma once -#include "nil/crypto3/multiprecision/modular/big_mod_impl.hpp" // IWYU pragma: export -#include "nil/crypto3/multiprecision/modular/ops/inverse.hpp" // IWYU pragma: export -#include "nil/crypto3/multiprecision/modular/ops/pow.hpp" // IWYU pragma: export -#include "nil/crypto3/multiprecision/modular/ops/ressol.hpp" // IWYU pragma: export +#include "nil/crypto3/multiprecision/detail/big_mod/big_mod_impl.hpp" // IWYU pragma: export +#include "nil/crypto3/multiprecision/detail/big_mod/ops/inverse.hpp" // IWYU pragma: export +#include "nil/crypto3/multiprecision/detail/big_mod/ops/pow.hpp" // IWYU pragma: export +#include "nil/crypto3/multiprecision/detail/big_mod/ops/ressol.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 46b468de01..277bf05888 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_uint.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_uint.hpp @@ -1,13 +1,13 @@ #pragma once -#include "nil/crypto3/multiprecision/big_uint_impl.hpp" // IWYU pragma: export -#include "nil/crypto3/multiprecision/limits.hpp" // IWYU pragma: export -#include "nil/crypto3/multiprecision/ops/gcd_inverse.hpp" // IWYU pragma: export -#include "nil/crypto3/multiprecision/ops/import_export.hpp" // IWYU pragma: export -#include "nil/crypto3/multiprecision/ops/jacobi.hpp" // IWYU pragma: export -#include "nil/crypto3/multiprecision/ops/powm.hpp" // IWYU pragma: export -#include "nil/crypto3/multiprecision/ops/ressol.hpp" // IWYU pragma: export -#include "nil/crypto3/multiprecision/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/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 +#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/big_uint_impl.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_uint_impl.hpp deleted file mode 100644 index 1ccd224209..0000000000 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_uint_impl.hpp +++ /dev/null @@ -1,1674 +0,0 @@ -#pragma once - -// IWYU pragma: private; include "nil/crypto3/multiprecision/big_uint.hpp" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "nil/crypto3/multiprecision/detail/assert.hpp" -#include "nil/crypto3/multiprecision/detail/config.hpp" -#include "nil/crypto3/multiprecision/detail/endian.hpp" -#include "nil/crypto3/multiprecision/detail/intel_intrinsics.hpp" -#include "nil/crypto3/multiprecision/storage.hpp" - -namespace nil::crypto3::multiprecision { - template - class big_uint; - - namespace detail { - constexpr bool is_valid_hex_digit(char c) { - return ('0' <= c && c <= '9') || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F'); - } - - constexpr unsigned parse_hex_digit(char c) { - if ('0' <= c && c <= '9') { - return c - '0'; - } - if ('a' <= c && c <= 'f') { - return (c - 'a') + 10; - } - return (c - 'A') + 10; - } - - template - constexpr big_uint parse_int_hex(std::string_view str) { - if (str.size() < 2 || str[0] != '0' || str[1] != 'x') { - throw std::invalid_argument("hex literal should start with 0x"); - } - - big_uint result{0}; - - std::size_t bits = 0; - for (std::size_t i = 2; i < str.size(); ++i) { - char c = str[i]; - if (!is_valid_hex_digit(c)) { - throw std::invalid_argument("non-hex character in literal"); - } - result <<= 4; - if (bits != 0) { - bits += 4; - } - unsigned digit = parse_hex_digit(c); - result += digit; - if (bits == 0 && digit != 0) { - bits += std::bit_width(digit); - } - } - if (bits > Bits) { - throw std::invalid_argument("not enough bits to store literal"); - } - return result; - } - - template - constexpr big_uint parse_int_decimal(std::string_view str) { - big_uint result{0}; - - for (std::size_t i = 0; i < str.size(); ++i) { - char c = str[i]; - if (c < '0' || c > '9') { - throw std::invalid_argument("non decimal character in literal"); - } - result *= 10; - result += c - '0'; - } - return result; - } - - template - constexpr big_uint parse_int(std::string_view str) { - if (str.size() >= 2 && str[0] == '0' && str[1] == 'x') { - return parse_int_hex(str); - } - return parse_int_decimal(str); - } - } // namespace detail - - /** - * @brief Big unsigned integer type - * - * @tparam Bits Number of bits - * - * @details - * This is a class that represents a big unsigned integer with a fixed size in bits. - * - * @note - * Addition and subtraction operations are optimized, while multiplication and division are not. - * Multiplication and division should be used in compile time or in non-performance critical - * code. - * If you need fast arithmetic, you probably are looking for big_mod, which implements fast - * modular arithmetic. - */ - template - class big_uint { - public: - static constexpr std::size_t Bits = Bits_; - using self_type = big_uint; - - 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; - static constexpr limb_type max_limb_value = detail::max_limb_value; - - static constexpr std::size_t internal_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)); - - // - // 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 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 void zero_after(std::size_t start_index) { - auto pr = this->limbs(); - for (std::size_t i = start_index; i < this->limbs_count(); ++i) { - pr[i] = 0; - } - } - - public: - // TODO(ioxid): this should be private - constexpr void normalize() noexcept { limbs()[internal_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; } - - // Constructor - - constexpr big_uint() noexcept {} - - constexpr big_uint(const char* str) { *this = str; } - - constexpr big_uint(std::string_view 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"); - do_assign_integral(static_cast>(val)); - } - - template && std::is_unsigned_v, int> = 0> - constexpr big_uint(T val) noexcept { - do_assign_integral(val); - } - - // TODO(ioxid): make this explicit for the case when Bits2 > Bits - template - constexpr big_uint(const big_uint& other) noexcept { - do_assign(other); - if constexpr (Bits2 > Bits) { - NIL_CO3_MP_ASSERT(other.compare(*this) == 0); - } - } - - template - constexpr big_uint(const std::array& bytes) noexcept { - *this = bytes; - } - - // Assignment - - constexpr big_uint& operator=(const char* str) { - *this = detail::parse_int(str); - return *this; - } - - constexpr big_uint& operator=(std::string_view 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"); - 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); - return *this; - } - - template - constexpr big_uint& operator=(const big_uint& other) noexcept { - do_assign(other); - if constexpr (Bits2 > Bits) { - NIL_CO3_MP_ASSERT(other.compare(*this) == 0); - } - return *this; - } - - template - constexpr big_uint& operator=(const std::array& bytes) { - std::size_t bits = 0; - for (std::size_t i = 0; i < bytes.size(); ++i) { - *this <<= 8; - if (bits != 0) { - bits += 8; - } - unsigned b = bytes[i]; - *this += b; - if (bits == 0 && b != 0) { - bits += std::bit_width(b); - } - } - if (bits > Bits) { - throw std::invalid_argument("not enough bits"); - } - return *this; - } - - // 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 % 10) + '0'); - copy /= 10; - } - std::reverse(result.begin(), result.end()); - if (result.empty()) { - result += '0'; - } - return result; - } - if (!(flags & std::ios_base::hex)) { - throw std::invalid_argument("big_uint: unsupported format flags"); - } - std::string result; - result.reserve(used_limbs() * limb_bits / 4); - bool found_first = false; - for (int i = internal_limb_count - 1; i >= 0; --i) { - auto limb = limbs()[i]; - bool should_pad = found_first; - found_first = found_first || limb != 0; - if (found_first) { - std::size_t len = limb == 0 ? 1 : (std::bit_width(limb) + 3) / 4; - std::size_t padded_len = len; - if (should_pad) { - padded_len = sizeof(limb_type) * 2; - } - for (std::size_t j = 0; j < padded_len - len; ++j) { - result += '0'; - } - std::size_t start_offset = result.size(); - result.resize(result.size() + len); - auto ec = std::to_chars(result.data() + start_offset, - result.data() + result.size(), limb, 16) - .ec; - NIL_CO3_MP_ASSERT(ec == std::errc{}); - } - } - 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; - } - return result; - } - - template = 0> - constexpr big_uint truncate() const noexcept { - big_uint result; - result.do_assign(*this); - return result; - } - - // Cast to integral types - - template && std::is_integral_v && - std::is_unsigned_v, - int> = 0> - explicit constexpr operator T() const { - if constexpr (sizeof(T) <= sizeof(limb_type)) { - return static_cast(this->limbs()[0]); - } else { - constexpr std::size_t n = - std::min(sizeof(T) / sizeof(limb_type), internal_limb_count); - T result = 0; - for (std::size_t i = 0; i < n; ++i) { - result <<= limb_bits; - result |= limbs()[n - i - 1]; - } - return result; - } - } - - template && std::is_signed_v, int> = 0> - explicit constexpr operator T() const { - return static_cast(static_cast>(*this)); - } - - explicit constexpr operator bool() const { return !is_zero(); } - - // Comparisions - - constexpr int compare(const big_uint& b) const noexcept { - auto pa = limbs(); - auto pb = b.limbs(); - for (int i = limbs_count() - 1; i >= 0; --i) { - if (pa[i] != pb[i]) { - return pa[i] > pb[i] ? 1 : -1; - } - } - return 0; - } - - // Arithmetic operations - - // Addition/subtraction - - private: - static constexpr void add_constexpr(big_uint& result, const big_uint& a, - const big_uint& b) noexcept { - // - // This is the generic, C++ only version of addition. - // It's also used for all constexpr branches, hence the name. - // Nothing fancy, just let uintmax_t take the strain: - // - double_limb_type carry = 0; - std::size_t s = a.limbs_count(); - if (s == 1) { - double_limb_type r = static_cast(*a.limbs()) + - static_cast(*b.limbs()); - double_limb_type mask = big_uint::upper_limb_mask; - if (r & ~mask) { - result = r & mask; - result.set_carry(true); - } else { - result = r; - } - return; - } - - const_limb_pointer pa = a.limbs(); - const_limb_pointer pb = b.limbs(); - limb_pointer pr = result.limbs(); - - // First where a and b overlap: - for (std::size_t i = 0; i < s; ++i) { - carry += static_cast(*pa) + static_cast(*pb); - *pr = static_cast(carry); - carry >>= big_uint::limb_bits; - ++pr, ++pa, ++pb; - } - if constexpr (Bits % big_uint::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()[s - 1] & ~mask) { - result.limbs()[s - 1] &= mask; - result.set_carry(true); - } - } - } - - // - // Core subtraction routine: - // It is the caller's responsibility to make sure that a >= b. - // - static constexpr void subtract_constexpr(big_uint& result, const big_uint& a, - const big_uint& b) noexcept { - NIL_CO3_MP_ASSERT(a >= b); - - // - // This is the generic, C++ only version of subtraction. - // It's also used for all constexpr branches, hence the name. - // Nothing fancy, just let uintmax_t take the strain: - // - std::size_t s = a.limbs_count(); - if (s == 1) { - result = *a.limbs() - *b.limbs(); - return; - } - const_limb_pointer pa = a.limbs(); - const_limb_pointer pb = b.limbs(); - limb_pointer pr = result.limbs(); - - double_limb_type borrow = 0; - // First where a and b overlap: - for (std::size_t i = 0; i < s; ++i) { - borrow = static_cast(pa[i]) - - static_cast(pb[i]) - borrow; - pr[i] = static_cast(borrow); - borrow = (borrow >> big_uint::limb_bits) & 1u; - } - // if a > b, then borrow must be 0 at the end. - NIL_CO3_MP_ASSERT(0 == borrow); - } - - public: -#ifdef NIL_CO3_MP_HAS_IMMINTRIN_H - // - // This is the key addition routine: - // - // - // This optimization is limited to: GCC, LLVM, ICC (Intel), MSVC for x86_64 and i386. - // If your architecture and compiler supports ADC intrinsic, please file a bug. - // - // As of May, 2020 major compilers don't recognize carry chain though adc - // intrinsics are used to hint compilers to use ADC and still compilers don't - // unroll the loop efficiently (except LLVM) so manual unrolling is done. - // - // Also note that these intrinsics were only introduced by Intel as part of the - // ADX processor extensions, even though the addc instruction has been available - // for basically all x86 processors. That means gcc-9, clang-9, msvc-14.2 and up - // are required to support these intrinsics. - // - static constexpr void add(big_uint& result, const big_uint& a, const big_uint& b) noexcept { - if (std::is_constant_evaluated()) { - add_constexpr(result, a, b); - } else { - // Nothing fancy, just let uintmax_t take the strain: - 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.limbs_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(); - - if (as < bs) { - std::swap(pa, pb); - } - - 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 (internal_limb_count > x) { - result.limbs()[x] = static_cast(1u); - } - } else if (x != i) { - // Copy remaining digits only if we need to: - std::copy(pa + i, pa + x, pr + i); - } - - if constexpr (Bits % big_uint::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.limbs_count() - 1] & ~mask) { - result.limbs()[result.limbs_count() - 1] &= mask; - result.set_carry(true); - } - } - } - } - - // It is the caller's responsibility to make sure that a > b. - static constexpr void subtract(big_uint& result, const big_uint& a, - const big_uint& b) noexcept { - NIL_CO3_MP_ASSERT(a.compare(b) >= 0); - - if (std::is_constant_evaluated()) { - subtract_constexpr(result, a, b); - } else { - // Nothing fancy, just let uintmax_t take the strain: - std::size_t m = b.used_limbs(); - std::size_t x = a.used_limbs(); - - // - // special cases for small limb counts: - // - if (x == 1) { - result = *a.limbs() - *b.limbs(); - return; - } - // Now that a, b, and result are stable, get pointers to their limbs: - const_limb_pointer pa = a.limbs(); - const_limb_pointer pb = b.limbs(); - limb_pointer pr = result.limbs(); - - 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); - } - 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); - } - NIL_CO3_MP_ASSERT(0 == borrow); - } // constexpr. - } - -#else - - static constexpr void add(big_uint& result, const big_uint& a, const big_uint& b) noexcept { - add_constexpr(result, a, b); - } - - static constexpr void subtract(big_uint& result, const big_uint& a, - const big_uint& b) noexcept { - subtract_constexpr(result, a, b); - } - -#endif - - static constexpr void add(big_uint& result, const big_uint& a, - const limb_type& o) noexcept { - // Addition using modular arithmetic. - // Nothing fancy, just let uintmax_t take the strain: - - double_limb_type carry = o; - 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.limbs_count()); ++i) { - carry += static_cast(pa[i]); - pr[i] = static_cast(carry); - carry >>= big_uint::limb_bits; - } - // Just copy any remaining digits: - if (&a != &result) { - std::copy(pa + i, pa + a.limbs_count(), pr + i); - } - if constexpr (Bits % big_uint::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 (pr[result.limbs_count() - 1] & ~mask) { - pr[result.limbs_count() - 1] &= mask; - result.set_carry(true); - } - } - } - - // - // And again to subtract a single limb: caller is responsible to check that a > b and - // the result is non-negative. - // - static constexpr void subtract(big_uint& result, const big_uint& a, - const limb_type& b) noexcept { - NIL_CO3_MP_ASSERT(a >= b); - - // Subtract one limb. - // Nothing fancy, just let uintmax_t take the strain: - constexpr double_limb_type borrow = - static_cast(big_uint::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 + a.limbs_count(), pr + 1); - } - } else if (result.limbs_count() == 1) { - *pr = b - *pa; - } else { - *pr = static_cast((borrow + *pa) - b); - std::size_t i = 1; - while (!pa[i]) { - pr[i] = big_uint::max_limb_value; - ++i; - } - pr[i] = pa[i] - 1; - if (&result != &a) { - ++i; - std::copy(pa + i, pa + a.limbs_count(), pr + i); - } - } - } - - NIL_CO3_MP_FORCEINLINE constexpr void increment() noexcept { - if (limbs()[0] < big_uint::max_limb_value) { - ++limbs()[0]; - } else { - add(*this, *this, static_cast(1u)); - } - } - - NIL_CO3_MP_FORCEINLINE constexpr void decrement() noexcept { - if (limbs()[0]) { - --limbs()[0]; - } else { - subtract(*this, *this, static_cast(1u)); - } - } - - // Bitwise - - template - static constexpr void bitwise_op(big_uint& result, const big_uint& o, Op op) noexcept { - // - // Both arguments are unsigned types, very simple case handled as a special case. - // - // First figure out how big the result needs to be and set up some data: - // - std::size_t rs = result.limbs_count(); - std::size_t os = o.limbs_count(); - auto [m, x] = std::minmax(rs, os); - limb_pointer pr = result.limbs(); - const_limb_pointer po = o.limbs(); - for (std::size_t i = rs; i < x; ++i) { - pr[i] = 0; - } - - for (std::size_t i = 0; i < os; ++i) { - pr[i] = op(pr[i], po[i]); - } - for (std::size_t i = os; i < x; ++i) { - pr[i] = op(pr[i], limb_type(0)); - } - result.normalize(); - } - - NIL_CO3_MP_FORCEINLINE static constexpr void bitwise_and(big_uint& result, - const big_uint& o) noexcept { - bitwise_op(result, o, std::bit_and()); - } - - NIL_CO3_MP_FORCEINLINE static constexpr void bitwise_or(big_uint& result, - const big_uint& o) noexcept { - bitwise_op(result, o, std::bit_or()); - } - - NIL_CO3_MP_FORCEINLINE static constexpr void bitwise_xor(big_uint& result, - const big_uint& o) noexcept { - bitwise_op(result, o, std::bit_xor()); - } - // - // Again for operands which are single limbs: - // - NIL_CO3_MP_FORCEINLINE static constexpr void bitwise_and(big_uint& result, - limb_type l) noexcept { - result.limbs()[0] &= l; - result.zero_after(1); - } - - NIL_CO3_MP_FORCEINLINE static constexpr void bitwise_or(big_uint& result, - limb_type l) noexcept { - result.limbs()[0] |= l; - } - - NIL_CO3_MP_FORCEINLINE static constexpr void bitwise_xor(big_uint& result, - limb_type l) noexcept { - result.limbs()[0] ^= l; - } - - NIL_CO3_MP_FORCEINLINE static constexpr void complement(big_uint& result, - const big_uint& o) noexcept { - std::size_t os = o.limbs_count(); - for (std::size_t i = 0; i < os; ++i) { - result.limbs()[i] = ~o.limbs()[i]; - } - result.normalize(); - } - - // Left shift will throw away upper Bits. - // This function must be called only when s % 8 == 0, i.e. we shift bytes. - static void left_shift_byte(big_uint& result, double_limb_type s) { - limb_pointer pr = result.limbs(); - - std::size_t bytes = static_cast(s / CHAR_BIT); - if (s >= Bits) { - // Set result to 0. - result.zero_after(0); - } else { - unsigned char* pc = reinterpret_cast(pr); - std::memmove(pc + bytes, pc, result.limbs_count() * sizeof(limb_type) - bytes); - std::memset(pc, 0, bytes); - } - } - - // Left shift will throw away upper Bits. - // This function must be called only when s % limb_bits == 0, i.e. we shift limbs, which - // are normally 64 bit. - static constexpr void left_shift_limb(big_uint& result, double_limb_type s) { - limb_type offset = static_cast(s / limb_bits); - NIL_CO3_MP_ASSERT(static_cast(s % limb_bits) == 0); - - limb_pointer pr = result.limbs(); - - if (s >= Bits) { - // Set result to 0. - result.zero_after(0); - } else { - std::size_t i = offset; - std::size_t rs = result.limbs_count() + offset; - for (; i < result.limbs_count(); ++i) { - pr[rs - 1 - i] = pr[result.limbs_count() - 1 - i]; - } - for (; i < rs; ++i) { - pr[rs - 1 - i] = 0; - } - } - } - - // Left shift will throw away upper Bits. - static constexpr void left_shift_generic(big_uint& result, double_limb_type s) { - if (s >= Bits) { - // Set result to 0. - result.zero_after(0); - } else { - limb_type offset = static_cast(s / limb_bits); - limb_type shift = static_cast(s % limb_bits); - - limb_pointer pr = result.limbs(); - std::size_t i = 0; - std::size_t rs = result.limbs_count(); - // This code only works when shift is non-zero, otherwise we invoke undefined - // behaviour! - NIL_CO3_MP_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); - } - if (rs - i >= 1 + offset) { - pr[rs - 1 - i] = pr[rs - 1 - i - offset] << shift; - ++i; - } - for (; i < rs; ++i) { - pr[rs - 1 - i] = 0; - } - } - } - - // Shifting left throws away upper Bits. - static constexpr void left_shift(big_uint& result, double_limb_type s) noexcept { - if (!s) { - return; - } - -#if NIL_CO3_MP_ENDIAN_LITTLE_BYTE && defined(NIL_CO3_MP_USE_LIMB_SHIFT) - constexpr limb_type limb_shift_mask = big_uint::limb_bits - 1; - constexpr limb_type byte_shift_mask = CHAR_BIT - 1; - - if ((s & limb_shift_mask) == 0) { - left_shift_limb(result, s); - } else if (((s & byte_shift_mask) == 0) && !std::is_constant_evaluated()) { - left_shift_byte(result, s); - } -#elif NIL_CO3_MP_ENDIAN_LITTLE_BYTE - constexpr limb_type limb_shift_mask = big_uint::limb_bits - 1; - constexpr limb_type byte_shift_mask = CHAR_BIT - 1; - - if (std::is_constant_evaluated() && ((s & limb_shift_mask) == 0)) { - left_shift_limb(result, s); - } else if (((s & byte_shift_mask) == 0) && !std::is_constant_evaluated()) { - left_shift_byte(result, s); - } -#else - constexpr limb_type limb_shift_mask = big_uint::limb_bits - 1; - - if ((s & limb_shift_mask) == 0) { - left_shift_limb(result, s); - } -#endif - else { - left_shift_generic(result, s); - } - result.normalize(); - } - - static void right_shift_byte(big_uint& result, double_limb_type s) { - limb_type offset = static_cast(s / limb_bits); - NIL_CO3_MP_ASSERT((s % CHAR_BIT) == 0); - std::size_t ors = result.limbs_count(); - std::size_t rs = ors; - if (offset >= rs) { - result.zero_after(0); - return; - } - rs -= offset; - limb_pointer pr = result.limbs(); - unsigned char* pc = reinterpret_cast(pr); - limb_type shift = static_cast(s / CHAR_BIT); - std::memmove(pc, pc + shift, ors * sizeof(pr[0]) - shift); - shift = (sizeof(limb_type) - shift % sizeof(limb_type)) * CHAR_BIT; - if (shift < limb_bits) { - pr[ors - offset - 1] &= (static_cast(1u) << shift) - 1; - if (!pr[ors - offset - 1] && (rs > 1)) { - --rs; - } - } - // Set zeros after 'rs', alternative to resizing to size 'rs'. - result.zero_after(rs); - } - - static constexpr void right_shift_limb(big_uint& result, double_limb_type s) { - limb_type offset = static_cast(s / limb_bits); - NIL_CO3_MP_ASSERT((s % limb_bits) == 0); - std::size_t ors = result.limbs_count(); - std::size_t rs = ors; - if (offset >= rs) { - result.zero_after(0); - return; - } - rs -= offset; - limb_pointer pr = result.limbs(); - std::size_t i = 0; - for (; i < rs; ++i) { - pr[i] = pr[i + offset]; - } - // Set zeros after 'rs', alternative to resizing to size 'rs'. - result.zero_after(rs); - } - - static constexpr void right_shift_generic(big_uint& result, double_limb_type s) { - limb_type offset = static_cast(s / limb_bits); - limb_type shift = static_cast(s % limb_bits); - std::size_t ors = result.limbs_count(); - std::size_t rs = ors; - - if (offset >= rs) { - result = limb_type(0); - return; - } - rs -= offset; - limb_pointer pr = result.limbs(); - if ((pr[ors - 1] >> shift) == 0) { - if (--rs == 0) { - result = limb_type(0); - return; - } - } - std::size_t i = 0; - - // This code only works for non-zero shift, otherwise we invoke undefined behaviour! - NIL_CO3_MP_ASSERT(shift); - for (; i + offset + 1 < ors; ++i) { - pr[i] = pr[i + offset] >> shift; - pr[i] |= pr[i + offset + 1] << (limb_bits - shift); - } - pr[i] = pr[i + offset] >> shift; - - // We cannot resize any more, so we need to set all the limbs to zero. - result.zero_after(rs); - } - - static constexpr void right_shift(big_uint& result, double_limb_type s) noexcept { - if (!s) { - return; - } - -#if NIL_CO3_MP_ENDIAN_LITTLE_BYTE && defined(NIL_CO3_MP_USE_LIMB_SHIFT) - constexpr limb_type limb_shift_mask = big_uint::limb_bits - 1; - constexpr limb_type byte_shift_mask = CHAR_BIT - 1; - - if ((s & limb_shift_mask) == 0) { - right_shift_limb(result, s); - } else if (((s & byte_shift_mask) == 0) && !std::is_constant_evaluated()) { - right_shift_byte(result, s); - } -#elif NIL_CO3_MP_ENDIAN_LITTLE_BYTE - constexpr limb_type byte_shift_mask = CHAR_BIT - 1; - - constexpr limb_type limb_shift_mask = big_uint::limb_bits - 1; - if (std::is_constant_evaluated() && ((s & limb_shift_mask) == 0)) { - right_shift_limb(result, s); - } else if (((s & byte_shift_mask) == 0) && !std::is_constant_evaluated()) { - right_shift_byte(result, s); - } -#else - constexpr limb_type limb_shift_mask = big_uint::limb_bits - 1; - - if ((s & limb_shift_mask) == 0) { - right_shift_limb(result, s); - } -#endif - else { - right_shift_generic(result, s); - } - } - - constexpr std::size_t used_limbs() const noexcept { - for (int i = internal_limb_count - 1; i >= 0; --i) { - if (limbs()[i] != 0) { - return i + 1; - } - } - return 0; - } - - constexpr std::size_t order() const noexcept { - for (int i = internal_limb_count - 1; i >= 0; --i) { - if (limbs()[i] != 0) { - return i; - } - } - return 0; - } - - // Modulus/divide - - // This should be called only for creation of Montgomery and Barett - // params, not during "normal" execution, so we do not care about the execution speed. - - template - static constexpr void divide(big_uint* div, const big_uint& x, const big_uint& y, - big_uint& rem) { - /* - Very simple long division. - Start by setting the remainder equal to x, and the - result equal to 0. Then in each loop we calculate our - "best guess" for how many times y divides into rem, - add our guess to the result, and subtract guess*y - from the remainder rem. One wrinkle is that the remainder - may go negative, in which case we subtract the current guess - from the result rather than adding. The value of the guess - is determined by dividing the most-significant-limb of the - current remainder by the most-significant-limb of y. - - Note that there are more efficient algorithms than this - available, in particular see Knuth Vol 2. However for small - numbers of limbs this generally outperforms the alternatives - and avoids the normalisation step which would require extra storage. - */ - - if (y.is_zero()) { - throw std::overflow_error("integer division by zero"); - } - - const_limb_pointer px = x.limbs(); - const_limb_pointer py = y.limbs(); - - if (x.is_zero()) { - // x is zero, so is the result: - rem = x; - if (div) { - *div = x; - } - return; - } - - rem = x; - std::size_t rem_order = rem.order(); - std::size_t y_order = y.order(); - if (div) { - *div = 0u; - } - // - // Check if the remainder is already less than the divisor, if so - // we already have the result. Note we try and avoid a full compare - // if we can: - // - if (rem < y) { - return; - } - - big_uint t; - bool rem_neg = false; - - // - // See if we can short-circuit long division, and use basic arithmetic instead: - // - if (rem_order == 0) { - if (div) { - *div = px[0] / py[0]; - } - rem = px[0] % py[0]; - return; - } - if (rem_order == 1) { - double_limb_type a = (static_cast(px[1]) << limb_bits) | px[0]; - double_limb_type b = - y_order ? (static_cast(py[1]) << limb_bits) | py[0] : py[0]; - if (div) { - *div = a / b; - } - rem = a % b; - return; - } - const_limb_pointer prem = rem.limbs(); - // This is initialised just to keep the compiler from emitting useless warnings later - // on: - limb_pointer pdiv = limb_pointer(); - if (div) { - pdiv = div->limbs(); - for (std::size_t i = 1; i < 1 + rem_order - y_order; ++i) { - pdiv[i] = 0; - } - } - bool first_pass = true; - - do { - // - // Calculate our best guess for how many times y divides into rem: - // - limb_type guess = 1; - if (rem_order > 0 && prem[rem_order] <= py[y_order]) { - double_limb_type a = - (static_cast(prem[rem_order]) << limb_bits) | - prem[rem_order - 1]; - double_limb_type b = py[y_order]; - double_limb_type v = a / b; - if (v <= max_limb_value) { - guess = static_cast(v); - --rem_order; - } - } else if (rem_order == 0) { - guess = prem[0] / py[y_order]; - } else { - double_limb_type a = - (static_cast(prem[rem_order]) << limb_bits) | - prem[rem_order - 1]; - double_limb_type b = - (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); - 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.... - // - // Update result: - // - std::size_t shift = rem_order - y_order; - if (div) { - if (rem_neg) { - if (pdiv[shift] > guess) { - pdiv[shift] -= guess; - } else { - t = 0u; - t.limbs()[shift] = guess; - *div -= t; - } - } else if (max_limb_value - pdiv[shift] > guess) { - pdiv[shift] += guess; - } else { - t = 0u; - t.limbs()[shift] = guess; - *div += t; - } - } - // - // Calculate guess * y, we use a fused mutiply-shift 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 > internal_limb_count; - t = 0u; - limb_pointer pt = t.limbs(); - for (std::size_t i = 0; i < y_order + 1; ++i) { - carry += - static_cast(py[i]) * static_cast(guess); - pt[i + shift] = static_cast(carry); - carry >>= limb_bits; - } - 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() - 1); - } - // - // Update rem in a way that won't actually produce a negative result - // in case the argument types are unsigned: - // - if (truncated_t && carry) { - NIL_CO3_MP_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 and incrementing - // rem, then add t to it. - for (std::size_t i = 0; i <= rem_order; ++i) { - rem.limbs()[i] = ~prem[i]; - } - rem.normalize(); - ++rem; - rem += t; - rem_neg = !rem_neg; - } else if (rem > t) { - rem -= t; - } else { - std::swap(rem, t); - rem -= t; - prem = rem.limbs(); - rem_neg = !rem_neg; - } - // - // First time through we need to strip any leading zero, otherwise - // the termination condition goes belly-up: - // - // if (div && first_pass) { - // first_pass = false; - // // while (pdiv[div->limbs_count() - 1] == 0) - // // div->resize(div->limbs_count() - 1, div->limbs_count() - 1); - // } - // - // Update rem_order: - // - rem_order = rem.order(); - } - // Termination condition is really just a check that rem > y, but with a common - // short-circuit case handled first: - while ((rem_order >= y_order) && ((rem_order > y_order) || (rem >= y))); - - // - // We now just have to normalise the result: - // - if (rem_neg && !rem.is_zero()) { - // We have one too many in the result: - if (div) { - --*div; - } - rem = y - rem; - } - - // remainder must be less than the divisor or our code has failed - NIL_CO3_MP_ASSERT(rem < y); - } - - // 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 - static constexpr void multiply(big_uint& result, const big_uint& a, - const big_uint& b) noexcept { - 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.limbs_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); - std::size_t j = 0; - for (; j < inner_limit; ++j) { - NIL_CO3_MP_ASSERT(i + j < result.limbs_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])); - 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.limbs_count() > i + j); - if (i + j < result.limbs_count()) { - pr[i + j] = static_cast(carry); - } - } - carry = 0; - } - result.normalize(); - } - - // Misc ops - - NIL_CO3_MP_FORCEINLINE constexpr bool is_zero() const noexcept { - for (std::size_t i = 0; i < limbs_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 < limbs_count()) && !limbs()[index]) { - ++index; - } - - if (index == limbs_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 = limbs_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; - } - - private: - // Assignment - - template && std::is_unsigned_v, int> = 0> - constexpr void do_assign_integral(const T& a) noexcept { - if constexpr (sizeof(T) <= sizeof(limb_type)) { - this->limbs()[0] = a; - this->zero_after(1); - } else { - static_assert(sizeof(T) % sizeof(limb_type) == 0); - constexpr std::size_t n = - std::min(internal_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)); - a_copy >>= limb_bits; - } - zero_after(n); - } - this->normalize(); - if constexpr (sizeof(T) * CHAR_BIT > Bits) { - NIL_CO3_MP_ASSERT(big_uint(a).compare(*this) == 0); - } - } - - template - constexpr void do_assign(const big_uint& other) noexcept { - std::size_t count = (std::min)(other.limbs_count(), this->limbs_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 - // of other was less, we have 0s at the end. - this->zero_after((std::min)(other.limbs_count(), this->limbs_count())); - this->normalize(); - } - - // Data - - // 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; - - template - friend class big_uint; - }; - - namespace detail { - template - static constexpr bool always_false = false; - - template - constexpr bool is_big_uint_v = false; - - template - constexpr bool is_big_uint_v> = true; - - template - constexpr bool is_integral_v = std::is_integral_v || is_big_uint_v; - - template, int> = 0> - constexpr std::size_t get_bits() { - return sizeof(T) * CHAR_BIT; - } - - template, int> = 0> - constexpr std::size_t get_bits() { - return T::Bits; - } - } // namespace detail - -#define NIL_CO3_MP_BIG_UINT_INTEGRAL_TEMPLATE \ - template && detail::is_integral_v && \ - (detail::is_big_uint_v || detail::is_big_uint_v), \ - int> = 0, \ - typename largest_t = \ - big_uint(), detail::get_bits())>> - -#define NIL_CO3_MP_BIG_UINT_INTEGRAL_ASSIGNMENT_TEMPLATE \ - template< \ - typename big_uint_t, typename T, \ - std::enable_if_t && detail::is_integral_v, int> = 0> - -#define NIL_CO3_MP_BIG_UINT_UNARY_TEMPLATE \ - template, int> = 0> - - // Comparison - -#define NIL_CO3_MP_BIG_UINT_IMPL_OPERATOR(op) \ - NIL_CO3_MP_BIG_UINT_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_UINT_IMPL_OPERATOR(<) - NIL_CO3_MP_BIG_UINT_IMPL_OPERATOR(<=) - NIL_CO3_MP_BIG_UINT_IMPL_OPERATOR(>) - NIL_CO3_MP_BIG_UINT_IMPL_OPERATOR(>=) - NIL_CO3_MP_BIG_UINT_IMPL_OPERATOR(==) - NIL_CO3_MP_BIG_UINT_IMPL_OPERATOR(!=) - -#undef NIL_CO3_MP_BIG_UINT_IMPL_OPERATOR - - // Arithmetic operations - - NIL_CO3_MP_BIG_UINT_INTEGRAL_TEMPLATE - constexpr auto operator+(const T1& a, const T2& b) noexcept { - big_uint result = a; - decltype(result)::add(result, result, b); - return result; - } - NIL_CO3_MP_BIG_UINT_INTEGRAL_ASSIGNMENT_TEMPLATE - constexpr auto& operator+=(big_uint_t& a, const T& b) noexcept { - big_uint_t::add(a, a, b); - return a; - } - NIL_CO3_MP_BIG_UINT_UNARY_TEMPLATE - constexpr auto& operator++(big_uint_t& a) noexcept { - a.increment(); - return a; - } - NIL_CO3_MP_BIG_UINT_UNARY_TEMPLATE - constexpr auto operator++(big_uint_t& a, int) noexcept { - auto copy = a; - ++a; - return copy; - } - NIL_CO3_MP_BIG_UINT_UNARY_TEMPLATE - constexpr auto operator+(const big_uint_t& a) noexcept { return a; } - - NIL_CO3_MP_BIG_UINT_INTEGRAL_TEMPLATE - constexpr auto operator-(const T1& a, const T2& b) noexcept { - T1 result; - T1::subtract(result, a, static_cast(b)); - return result; - } - NIL_CO3_MP_BIG_UINT_INTEGRAL_ASSIGNMENT_TEMPLATE - constexpr auto& operator-=(big_uint_t& a, const T& b) { - big_uint_t::subtract(a, a, static_cast(b)); - return a; - } - NIL_CO3_MP_BIG_UINT_UNARY_TEMPLATE - constexpr auto& operator--(big_uint_t& a) noexcept { - a.decrement(); - return a; - } - NIL_CO3_MP_BIG_UINT_UNARY_TEMPLATE - constexpr auto operator--(big_uint_t& a, int) noexcept { - auto copy = a; - --a; - return copy; - } - - NIL_CO3_MP_BIG_UINT_UNARY_TEMPLATE - constexpr big_uint_t operator-(const big_uint_t& /* unused */) noexcept { - static_assert(detail::always_false, "can't negate unsigned type"); - } - - NIL_CO3_MP_BIG_UINT_INTEGRAL_TEMPLATE - constexpr auto operator*(const T1& a, const T2& b) noexcept { - big_uint() + detail::get_bits()> result; - decltype(result)::multiply(result, big_uint()>(a), - big_uint()>(b)); - return result.template truncate(); - } - NIL_CO3_MP_BIG_UINT_INTEGRAL_ASSIGNMENT_TEMPLATE - constexpr auto& operator*=(big_uint_t& a, const T& b) noexcept { - big_uint() + detail::get_bits()> result; - decltype(result)::multiply(result, a, static_cast(b)); - a = result.template truncate(); - return a; - } - - NIL_CO3_MP_BIG_UINT_INTEGRAL_TEMPLATE - constexpr auto operator/(const T1& a, const T2& b) noexcept { - largest_t result; - largest_t modulus; - largest_t::divide(&result, a, static_cast()>>(b), modulus); - return result; - } - NIL_CO3_MP_BIG_UINT_INTEGRAL_ASSIGNMENT_TEMPLATE - constexpr auto& operator/=(big_uint_t& a, const T& b) noexcept { - big_uint_t result; - big_uint_t modulus; - big_uint_t::divide(&result, a, static_cast()>>(b), modulus); - a = result; - return a; - } - - NIL_CO3_MP_BIG_UINT_INTEGRAL_TEMPLATE - constexpr auto operator%(const T1& a, const T2& b) noexcept { - largest_t modulus; - largest_t::divide(nullptr, static_cast(a), static_cast(b), modulus); - return modulus; - } - NIL_CO3_MP_BIG_UINT_INTEGRAL_ASSIGNMENT_TEMPLATE - constexpr auto& operator%=(big_uint_t& a, const T& b) { - big_uint_t modulus; - big_uint_t::divide(nullptr, a, b, modulus); - a = modulus; - return a; - } - - NIL_CO3_MP_BIG_UINT_INTEGRAL_TEMPLATE - constexpr auto operator&(const T1& a, const T2& b) noexcept { - largest_t result = a; - largest_t::bitwise_and(result, b); - return result; - } - NIL_CO3_MP_BIG_UINT_INTEGRAL_ASSIGNMENT_TEMPLATE - constexpr auto& operator&=(big_uint_t& a, const T& b) { - big_uint_t::bitwise_and(a, b); - return a; - } - - NIL_CO3_MP_BIG_UINT_INTEGRAL_TEMPLATE - constexpr auto operator|(const T1& a, const T2& b) noexcept { - largest_t result = a; - largest_t::bitwise_or(result, b); - return result; - } - NIL_CO3_MP_BIG_UINT_INTEGRAL_ASSIGNMENT_TEMPLATE - constexpr auto& operator|=(big_uint_t& a, const T& b) { - big_uint_t::bitwise_or(a, b); - return a; - } - - NIL_CO3_MP_BIG_UINT_INTEGRAL_TEMPLATE - constexpr auto operator^(const T1& a, const T2& b) noexcept { - largest_t result = a; - largest_t::bitwise_xor(result, b); - return result; - } - NIL_CO3_MP_BIG_UINT_INTEGRAL_ASSIGNMENT_TEMPLATE - constexpr auto& operator^=(big_uint_t& a, const T& b) { - big_uint_t::bitwise_or(a, b); - return a; - } - - NIL_CO3_MP_BIG_UINT_UNARY_TEMPLATE - constexpr auto operator~(const big_uint_t& a) noexcept { - big_uint_t result; - big_uint_t::complement(result, a); - return result; - } - - NIL_CO3_MP_BIG_UINT_UNARY_TEMPLATE - constexpr auto operator<<(const big_uint_t& a, std::size_t shift) noexcept { - big_uint_t result = a; - big_uint_t::left_shift(result, shift); - return result; - } - NIL_CO3_MP_BIG_UINT_UNARY_TEMPLATE - constexpr auto& operator<<=(big_uint_t& a, std::size_t shift) noexcept { - big_uint_t::left_shift(a, shift); - return a; - } - - NIL_CO3_MP_BIG_UINT_UNARY_TEMPLATE - constexpr auto operator>>(const big_uint_t& a, std::size_t shift) noexcept { - big_uint_t result = a; - big_uint_t::right_shift(result, shift); - return result; - } - NIL_CO3_MP_BIG_UINT_UNARY_TEMPLATE - constexpr auto& operator>>=(big_uint_t& a, std::size_t shift) noexcept { - big_uint_t::right_shift(a, shift); - return a; - } - -#undef NIL_CO3_MP_BIG_UINT_UNARY_TEMPLATE -#undef NIL_CO3_MP_BIG_UINT_INTEGRAL_ASSIGNMENT_TEMPLATE -#undef NIL_CO3_MP_BIG_UINT_INTEGRAL_TEMPLATE - - // 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.limbs_count(); ++i) { - boost::hash_combine(result, val.limbs()[i]); - } - return result; - } - - // IO - - template - std::ostream& operator<<(std::ostream& os, const big_uint& value) { - os << value.str(os.flags()); - return os; - } - - // Common ops - - template - constexpr std::size_t msb(const big_uint& a) { - return a.msb(); - } - - template - constexpr std::size_t lsb(const big_uint& a) { - return a.lsb(); - } - - template - constexpr bool bit_test(const big_uint& a, std::size_t index) { - return a.bit_test(index); - } - - template - constexpr bool is_zero(const big_uint& a) { - return a.is_zero(); - } - - template - constexpr void divide_qr(big_uint a, big_uint b, big_uint& q, - big_uint& r) { - // TODO(ioxid): make this efficient by using private `divide` - q = a / b; - r = a % b; - } -} // namespace nil::crypto3::multiprecision diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/cpp_int_conversions.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/cpp_int_conversions.hpp deleted file mode 100644 index 5a90dd7db6..0000000000 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/cpp_int_conversions.hpp +++ /dev/null @@ -1,61 +0,0 @@ -#pragma once - -#include -#include -#include - -#include "nil/crypto3/multiprecision/big_int.hpp" -#include "nil/crypto3/multiprecision/big_uint.hpp" -#include "nil/crypto3/multiprecision/storage.hpp" - -// Converting to and from cpp_int. Should be used only in tests. - -namespace nil::crypto3::multiprecision { - template - using unsigned_cpp_int_type = - boost::multiprecision::number>; - template - using signed_cpp_int_type = - boost::multiprecision::number>; - - template - constexpr unsigned_cpp_int_type to_cpp_int(const big_uint& a) { - unsigned_cpp_int_type result; - for (const auto limb : a.limbs_array() | std::views::reverse) { - result <<= detail::limb_bits; - result |= limb; - } - return result; - } - - template - constexpr big_uint to_big_uint(unsigned_cpp_int_type cppint) { - big_uint result; - for (auto& limb : result.limbs_array()) { - limb = static_cast(cppint & static_cast(-1)); - cppint >>= detail::limb_bits; - } - return result; - } - - template - constexpr signed_cpp_int_type to_cpp_int(const big_int& a) { - signed_cpp_int_type result = to_cpp_int(a.abs()); - if (a.sign() < 0) { - result = -result; - } - return result; - } - - template - constexpr big_int to_big_int(const signed_cpp_int_type& cppint) { - big_int result = to_big_uint(abs(cppint)); - if (cppint.sign() < 0) { - result = -result; - } - return result; - } -} // namespace nil::crypto3::multiprecision diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_int.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp similarity index 98% rename from crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_int.hpp rename to crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp index 0f631598c8..21fcfafb81 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/big_int.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_int.hpp @@ -1,6 +1,5 @@ #pragma once -#include #include #include #include @@ -8,8 +7,10 @@ #include #include -#include "nil/crypto3/multiprecision/big_uint_impl.hpp" +#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" namespace nil::crypto3::multiprecision { @@ -126,7 +127,7 @@ namespace nil::crypto3::multiprecision { m_negative = !m_negative; } - // Comparision + // Comparison template constexpr int compare(const big_int& other) const noexcept { @@ -218,9 +219,7 @@ namespace nil::crypto3::multiprecision { // Misc ops - NIL_CO3_MP_FORCEINLINE constexpr bool is_zero() const noexcept { - return abs().is_zero(); - } + NIL_CO3_MP_FORCEINLINE constexpr bool is_zero() const noexcept { return abs().is_zero(); } private: constexpr void normalize() noexcept { 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 new file mode 100644 index 0000000000..12919046f8 --- /dev/null +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/big_mod_impl.hpp @@ -0,0 +1,320 @@ +//---------------------------------------------------------------------------// +// 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 "nil/crypto3/multiprecision/big_mod.hpp" + +#include +#include +#include +#include +#include +#include +#include + +#include "nil/crypto3/multiprecision/detail/assert.hpp" +#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 +#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) + +namespace nil::crypto3::multiprecision { + template + class big_mod_impl { + public: + static constexpr std::size_t Bits = Bits_; + using big_uint_t = big_uint; + using modular_ops_storage_t = modular_ops_storage_t_; + using modular_ops_t = typename modular_ops_storage_t::modular_ops_t; + + // Constructors + + // Only available in compile-time big_mod, initializes to zero + constexpr big_mod_impl() : big_mod_impl(modular_ops_storage_t{}) {} + + // Only available in compile-time big_mod, initializes with the given base + template, int> = 0> + constexpr big_mod_impl(const T& b) : big_mod_impl(b, modular_ops_storage_t{}) {} + + // Only available in runtime big_mod, initializes with the given base and modulus + template && detail::is_integral_v, int> = 0> + constexpr big_mod_impl(const T1& b, const T2& m) + : big_mod_impl(b, modular_ops_storage_t{m}) {} + + // For generic code + + // Avaiable both in compile-time and runtime big_mod, avoids costs of initializing + // modular_ops_storage in runtime case + constexpr big_mod_impl(const modular_ops_storage_t& modular_ops_storage) + : m_modular_ops_storage(modular_ops_storage) { + // NB: m_raw_base is initialized to zero, this is correct for Montgomery form too + } + + // Avaiable both in compile-time and runtime big_mod, avoids costs of initializing + // modular_ops_storage in runtime case + template + constexpr big_mod_impl(const T& b, const modular_ops_storage_t& modular_ops_storage) + : m_modular_ops_storage(modular_ops_storage) { + if (!nil::crypto3::multiprecision::is_zero(b)) { + init_raw_base(m_raw_base, b, ops()); + } + } + + // Components + + constexpr big_uint_t base() const { + big_uint_t result; + ops().adjust_regular(result, m_raw_base); + return result; + } + + constexpr const big_uint_t& mod() const { return ops().mod(); } + + explicit constexpr operator big_uint_t() const { return base(); } + + explicit constexpr operator bool() const { return !is_zero(); } + + // Comparison + +#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())); \ + return raw_base() OP_ o.raw_base(); \ + } \ + \ + template, int> = 0> \ + constexpr bool operator OP_(const T& o) const noexcept { \ + return base() OP_ o; \ + } \ + \ + template, int> = 0> \ + friend constexpr bool operator OP_(const T& a, const big_mod_impl& b) noexcept { \ + return a OP_ b.base(); \ + } + + NIL_CO3_MP_BIG_MOD_COMPARISON_IMPL(==) + NIL_CO3_MP_BIG_MOD_COMPARISON_IMPL(!=) + // TODO(ioxid) remove these + NIL_CO3_MP_BIG_MOD_COMPARISON_IMPL(<) + NIL_CO3_MP_BIG_MOD_COMPARISON_IMPL(<=) + NIL_CO3_MP_BIG_MOD_COMPARISON_IMPL(>) + NIL_CO3_MP_BIG_MOD_COMPARISON_IMPL(>=) + +#undef NIL_CO3_MP_BIG_MOD_COMPARISON_IMPL + + // String conversion + + constexpr std::string str(std::ios_base::fmtflags flags = std::ios_base::hex | + std::ios_base::showbase | + std::ios_base::uppercase) const { + return base().str(flags); + } + + // Arithmetic operations + + constexpr void negate() { ops().negate(m_raw_base); } + + constexpr auto& operator++() noexcept { + ops().increment(raw_base()); + return *this; + } + + constexpr auto operator++(int) noexcept { + auto copy = *this; + ++*this; + return copy; + } + + constexpr auto operator+() const noexcept { return *this; } + + constexpr auto& operator--() noexcept { + ops().decrement(raw_base()); + return *this; + } + + constexpr auto operator--(int) noexcept { + auto copy = *this; + --*this; + return copy; + } + + constexpr auto operator-() const noexcept { + auto result = *this; + result.negate(); + return result; + } + + private: + template, int> = 0> + static big_uint_t convert_to_raw_base(const S& s, const modular_ops_t& ops) { + if (nil::crypto3::multiprecision::is_zero(s)) { + return big_uint_t{}; + } + big_uint_t result; + init_raw_base(result, s, ops); + return result; + } + + static constexpr const big_uint_t& convert_to_raw_base(const big_mod_impl& s, + const modular_ops_t& /*ops*/) { + return s.raw_base(); + } + + public: +#define NIL_CO3_MP_BIG_MOD_OPERATOR_IMPL(OP_, OP_ASSIGN_, METHOD_) \ + template || detail::is_integral_v, int> = \ + 0> \ + constexpr auto operator OP_(const T& b) const noexcept { \ + if constexpr (detail::is_big_mod_v) { \ + NIL_CO3_MP_ASSERT(ops().compare_eq(b.ops())); \ + } \ + big_mod_impl result = *this; \ + ops().METHOD_(result.raw_base(), convert_to_raw_base(b, 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()); \ + return result; \ + } \ + \ + template || detail::is_integral_v, int> = \ + 0> \ + constexpr auto& operator OP_ASSIGN_(const T & b) noexcept { \ + if constexpr (detail::is_big_mod_v) { \ + NIL_CO3_MP_ASSERT(ops().compare_eq(b.ops())); \ + } \ + ops().METHOD_(raw_base(), convert_to_raw_base(b, ops())); \ + return *this; \ + } + + NIL_CO3_MP_BIG_MOD_OPERATOR_IMPL(+, +=, add) + NIL_CO3_MP_BIG_MOD_OPERATOR_IMPL(-, -=, subtract) + NIL_CO3_MP_BIG_MOD_OPERATOR_IMPL(*, *=, mul) + +#undef NIL_CO3_MP_BIG_MOD_OPERATOR_IMPL + + // IO + + friend std::ostream& operator<<(std::ostream& os, const big_mod_impl& value) { + os << value.str(os.flags()); + 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; } + + constexpr const auto& ops_storage() const { return m_modular_ops_storage; } + constexpr const auto& ops() const { return m_modular_ops_storage.ops(); } + + protected: + modular_ops_storage_t m_modular_ops_storage; + big_uint_t m_raw_base; + }; + + template typename modular_ops_template> + using big_mod_ct_impl = + big_mod_impl::Bits, + detail::modular_ops_storage_ct>; + + template typename modular_ops_template> + 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; + } + + // Misc ops + + template, int> = 0> + constexpr bool is_zero(const big_mod_t& a) { + return a.is_zero(); + } + + // Actual big integer modular types + + // Montgomery modular big integer type with compile-time modulus. Modulus should be a static + // big_uint constant. + template + using montgomery_big_mod = big_mod_ct_impl; + + // Montgomery modular big integer type with runtime modulus. + template + using montgomery_big_mod_rt = big_mod_rt_impl; + + // Simple modular big integer type with compile-time modulus. Modulus should be a static + // big_uint constant. Uses barret optimizations. + template + using big_mod = big_mod_ct_impl; + + // Simple modular big integer type with runtime modulus. Uses barret optimizations. + template + using big_mod_rt = big_mod_rt_impl; + + // Modular big integer type with compile-time modulus, which automatically uses montomery form + // whenever possible (i.e. for odd moduli). Modulus should be a static big_uint constant. + template + using auto_big_mod = std::conditional_t, big_mod>; +} // namespace nil::crypto3::multiprecision + +// std::hash specializations + +template typename modular_ops_template> +struct std::hash> { + std::size_t operator()( + const nil::crypto3::multiprecision::big_mod_ct_impl& a) + const noexcept { + return boost::hash< + nil::crypto3::multiprecision::big_mod_ct_impl>{}(a); + } +}; + +template typename modular_ops_template> +struct std::hash> { + std::size_t operator()( + const nil::crypto3::multiprecision::big_mod_rt_impl& a) + const noexcept { + return boost::hash< + nil::crypto3::multiprecision::big_mod_rt_impl>{}(a); + } +}; diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/modular/modular_ops.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp similarity index 94% rename from crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/modular/modular_ops.hpp rename to crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp index 5e3f44347a..35f8fbf95a 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/modular/modular_ops.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops.hpp @@ -19,11 +19,12 @@ #include #include -#include "nil/crypto3/multiprecision/big_uint_impl.hpp" #include "nil/crypto3/multiprecision/detail/assert.hpp" -#include "nil/crypto3/multiprecision/detail/constexpr_support.hpp" -#include "nil/crypto3/multiprecision/integer_ops_base.hpp" -#include "nil/crypto3/multiprecision/storage.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/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 @@ -156,10 +157,11 @@ namespace nil::crypto3::multiprecision::detail { template= big_uint_t::Bits, int> = 0> + Bits2 >= Bits, int> = 0> constexpr void barrett_reduce(big_uint &result, big_uint input) const { if (!input.is_zero()) { if (input.msb() < 2u * mod().msb() + 1u) { + // TODO(ioxid): too small size here big_uint_quadruple_1 t1(input); t1 *= m_barrett_mu; @@ -167,10 +169,10 @@ namespace nil::crypto3::multiprecision::detail { t1 >>= shift_size; t1 *= mod(); - input -= t1; + input -= static_cast>(t1); if (input >= mod()) { - input -= mod(); + input -= static_cast>(mod()); } } else { input %= mod(); @@ -190,12 +192,12 @@ namespace nil::crypto3::multiprecision::detail { barrett_reduce(result, tmp); } - template::Bits >= big_uint_t::Bits && - std::numeric_limits::is_integer, - int> = 0> - constexpr void exp(big_uint &result, const big_uint &a, T exp) const { + 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, + int> = 0> + constexpr void pow(big_uint &result, const big_uint &a, T exp) const { NIL_CO3_MP_ASSERT(a < mod()); if (is_zero(exp)) { @@ -559,12 +561,12 @@ namespace nil::crypto3::multiprecision::detail { } #undef NIL_CO3_MP_MONTGOMERY_MUL_CIOS_LOOP_BODY - template::Bits >= big_uint_t::Bits && - std::numeric_limits::is_integer, - int> = 0> - constexpr void exp(big_uint &result, const big_uint &a, T exp) const { + 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, + 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()); @@ -636,8 +638,7 @@ namespace nil::crypto3::multiprecision::detail { template && std::is_signed_v, int> = 0> constexpr void init_raw_base(big_uint &raw_base, SI b, const modular_ops_t &ops) { - ops.adjust_modular(raw_base, - big_uint(detail::constexpr_support::abs(b))); + ops.adjust_modular(raw_base, detail::as_big_uint(detail::unsigned_abs(b))); if (b < 0) { ops.negate(raw_base); } @@ -646,6 +647,6 @@ namespace nil::crypto3::multiprecision::detail { template && std::is_unsigned_v, int> = 0> constexpr void init_raw_base(big_uint &raw_base, UI b, const modular_ops_t &ops) { - ops.adjust_modular(raw_base, big_uint(b)); + 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/modular/modular_ops_storage.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops_storage.hpp similarity index 96% rename from crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/modular/modular_ops_storage.hpp rename to crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops_storage.hpp index 7dc3b63918..5b80f5df3e 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/modular/modular_ops_storage.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/modular_ops_storage.hpp @@ -16,7 +16,7 @@ #include #include -#include "nil/crypto3/multiprecision/big_uint_impl.hpp" +#include "nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp" namespace nil::crypto3::multiprecision::detail { // Compile-time storage for modular arithmetic operations. Stores them in a constexpr variable. diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/modular/ops/inverse.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/inverse.hpp similarity index 86% rename from crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/modular/ops/inverse.hpp rename to crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/inverse.hpp index 257feb7660..4ac66b42c6 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/modular/ops/inverse.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/inverse.hpp @@ -15,9 +15,8 @@ #include -#include "nil/crypto3/multiprecision/big_uint.hpp" -#include "nil/crypto3/multiprecision/modular/big_mod_impl.hpp" -#include "nil/crypto3/multiprecision/ops/gcd_inverse.hpp" +#include "nil/crypto3/multiprecision/detail/big_mod/big_mod_impl.hpp" +#include "nil/crypto3/multiprecision/detail/big_uint/ops/gcd_inverse.hpp" namespace nil::crypto3::multiprecision { template, int> = 0> diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/modular/ops/pow.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/pow.hpp similarity index 50% rename from crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/modular/ops/pow.hpp rename to crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/pow.hpp index 49ca5c6ef3..31a9aaeb62 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/modular/ops/pow.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/pow.hpp @@ -16,24 +16,29 @@ #include #include -#include "nil/crypto3/multiprecision/modular/big_mod_impl.hpp" -#include "nil/crypto3/multiprecision/modular/ops/inverse.hpp" +#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 && - std::numeric_limits::is_integer, + std::enable_if_t && detail::is_unsigned_integer_v, int> = 0> - constexpr big_mod_t pow(big_mod_t b, T e) { - if constexpr (std::is_signed_v) { - if (e < 0) { - b = inverse_extended_euclidean_algorithm(b); - // TODO(ioxid): this won't work for e == min() - e = -e; - } - } - auto result = b; - result.ops().exp(result.raw_base(), b.raw_base(), std::move(e)); + 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; } + + template && detail::is_integer_v && + std::numeric_limits::is_signed, + 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(b, static_cast>(e)); + } } // namespace nil::crypto3::multiprecision diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/modular/ops/ressol.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/ressol.hpp similarity index 85% rename from crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/modular/ops/ressol.hpp rename to crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/ressol.hpp index 33e94f3b22..0465748016 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/modular/ops/ressol.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/ops/ressol.hpp @@ -15,9 +15,8 @@ #include -#include "nil/crypto3/multiprecision/big_uint.hpp" -#include "nil/crypto3/multiprecision/modular/big_mod_impl.hpp" -#include "nil/crypto3/multiprecision/ops/ressol.hpp" +#include "nil/crypto3/multiprecision/detail/big_mod/big_mod_impl.hpp" +#include "nil/crypto3/multiprecision/detail/big_uint/ops/ressol.hpp" namespace nil::crypto3::multiprecision { template, int> = 0> 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 new file mode 100644 index 0000000000..07e3354429 --- /dev/null +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_mod/type_traits.hpp @@ -0,0 +1,28 @@ +#pragma once + +#include +#include + +#include "nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp" + +namespace nil::crypto3::multiprecision { + template + class big_mod_impl; + + namespace detail { + template + constexpr bool is_big_mod_v = false; + + template + constexpr bool is_big_mod_v> = true; + + template + constexpr bool is_modular_integral_v = + std::is_integral_v || is_big_uint_v || is_big_mod_v; + + template, int> = 0> + constexpr std::size_t get_bits() { + return T::Bits; + } + } // namespace detail +} // namespace nil::crypto3::multiprecision 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 new file mode 100644 index 0000000000..bb89da201c --- /dev/null +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/arithmetic.hpp @@ -0,0 +1,746 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include "nil/crypto3/multiprecision/detail/assert.hpp" +#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" +#include "nil/crypto3/multiprecision/detail/intel_intrinsics.hpp" + +namespace nil::crypto3::multiprecision { + template + class big_uint; + + namespace detail { + + // Addition/subtraction + + template + constexpr void 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. + // It's also used for all constexpr branches, hence the name. + // + double_limb_type carry = 0; + 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.limbs_count() == 1) { + double_limb_type mask = big_uint::upper_limb_mask; + if (v & ~mask) { + v &= mask; + result.set_carry(true); + } + } + result = v; + return; + } + result.zero_after(x); + + const_limb_pointer pa = a.limbs(); + const_limb_pointer pb = b.limbs(); + limb_pointer pr = result.limbs(); + limb_pointer pr_end = pr + m; + + if (as < bs) { + std::swap(pa, pb); + } + + // First where a and b overlap: + while (pr != pr_end) { + carry += static_cast(*pa) + static_cast(*pb); + *pr = static_cast(carry); + carry >>= limb_bits; + ++pr, ++pa, ++pb; + } + pr_end += x - m; + + // Now where only a has digits: + while (pr != pr_end) { + if (!carry) { + if (pa != pr) { + std::copy(pa, pa + (pr_end - pr), pr); + } + break; + } + carry += static_cast(*pa); + *pr = static_cast(carry); + carry >>= limb_bits; + ++pr, ++pa; + } + + if (carry) { + if (result.limbs_count() > x) { + result.limbs()[x] = 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 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; + result.set_carry(true); + } + } + } + + // + // Core subtraction routine: + // + template + constexpr void subtract_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 subtraction. + // It's also used for all constexpr branches, hence the name. + // + double_limb_type borrow = 0; + 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; + } + + std::size_t i = 0; + // First where a and b overlap: + while (i < m) { + borrow = static_cast(pa[i]) - + static_cast(pb[i]) - borrow; + pr[i] = static_cast(borrow); + borrow = (borrow >> limb_bits) & 1u; + ++i; + } + // Now where only a has digits, only as long as we've borrowed: + while (borrow && (i < x)) { + borrow = static_cast(pa[i]) - borrow; + pr[i] = static_cast(borrow); + borrow = (borrow >> limb_bits) & 1u; + ++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); + + // + // We may have lost digits, if so update limb usage count: + // + result.normalize(); + if (swapped) { + result.negate(); + } + } + +#ifdef NIL_CO3_MP_HAS_IMMINTRIN_H + // + // This is the key addition routine: + // + // + // This optimization is limited to: GCC, LLVM, ICC (Intel), MSVC for x86_64 and i386. + // If your architecture and compiler supports ADC intrinsic, please file a bug. + // + // As of May, 2020 major compilers don't recognize carry chain though adc + // intrinsics are used to hint compilers to use ADC and still compilers don't + // unroll the loop efficiently (except LLVM) so manual unrolling is done. + // + // Also note that these intrinsics were only introduced by Intel as part of the + // ADX processor extensions, even though the addc instruction has been available + // for basically all x86 processors. That means gcc-9, clang-9, msvc-14.2 and up + // are required to support these intrinsics. + // + template + constexpr void 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.limbs_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(); + + if (as < bs) { + std::swap(pa, pb); + } + + 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 (big_uint::internal_limb_count > x) { + result.limbs()[x] = static_cast(1u); + } + } else if ((x != i) && (pa != pr)) { + // Copy remaining digits only if we need to: + std::copy(pa + i, pa + x, pr + i); + } + + 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.limbs_count() - 1] & ~mask) { + result.limbs()[result.limbs_count() - 1] &= mask; + result.set_carry(true); + } + } + } + } + + template + constexpr void subtract_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()) { + 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; + } + + 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); + } + NIL_CO3_MP_ASSERT(0 == borrow); + result.normalize(); + if (swapped) { + result.negate(); + } + } // constexpr. + } + +#else + + template + constexpr void add_unsigned(big_uint& result, const big_uint& a, + const big_uint& b) noexcept { + add_constexpr_unsigned(result, a, b); + } + + template + constexpr void subtract_unsigned(big_uint& result, const big_uint& a, + const big_uint& b) noexcept { + subtract_constexpr_unsigned(result, a, b); + } + +#endif + + template + constexpr void 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.limbs_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); + } + + if (carry) { + if (result.limbs_count() > a.limbs_count()) { + result.limbs()[a.limbs_count()] = static_cast(carry); + carry = 0; + } + } + + 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 (pr[result.limbs_count() - 1] & ~mask) { + pr[result.limbs_count() - 1] &= mask; + result.set_carry(true); + } + } + } + + // + // And again to subtract a single limb: + // + template + constexpr void subtract_unsigned(big_uint& result, const big_uint& a, + const limb_type& b) noexcept { + 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) { + *pr = b - *pa; + result.negate(); + } else { + *pr = static_cast((borrow + *pa) - b); + std::size_t i = 1; + while (!pa[i]) { + pr[i] = max_limb_value; + ++i; + } + pr[i] = pa[i] - 1; + if (&result != &a) { + ++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); + 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)); + } + 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)); + } + } + + template + constexpr void subtract(big_uint& result, const big_uint& a, + const T& b) noexcept { + static_assert(detail::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)); + } else { + detail::subtract_unsigned(result, a, detail::as_limb_type_or_big_uint(b_abs)); + } + } else { + detail::subtract_unsigned(result, a, detail::as_limb_type_or_big_uint(b)); + } + } + + // Modulus/divide + + // This should be called only for creation of Montgomery and + // Barett params, not during "normal" execution, so we do not + // care about the execution speed. + + template + constexpr void divide(big_uint* div, const big_uint& x, + const big_uint& y, big_uint& rem) { + /* + Very simple long division. + Start by setting the remainder equal to x, and the + result equal to 0. Then in each loop we calculate our + "best guess" for how many times y divides into rem, + add our guess to the result, and subtract guess*y + from the remainder rem. One wrinkle is that the remainder + may go negative, in which case we subtract the current guess + from the result rather than adding. The value of the guess + is determined by dividing the most-significant-limb of the + current remainder by the most-significant-limb of y. + + Note that there are more efficient algorithms than this + available, in particular see Knuth Vol 2. However for small + numbers of limbs this generally outperforms the alternatives + and avoids the normalisation step which would require extra + storage. + */ + + if (y.is_zero()) { + throw std::overflow_error("integer division by zero"); + } + + const_limb_pointer px = x.limbs(); + const_limb_pointer py = y.limbs(); + + if (x.is_zero()) { + // x is zero, so is the result: + rem = x; + if (div) { + *div = x; + } + return; + } + + rem = x; + std::size_t rem_order = rem.order(); + std::size_t y_order = y.order(); + if (div) { + *div = 0u; + } + // + // Check if the remainder is already less than the divisor, + // if so we already have the result. Note we try and avoid + // a full compare if we can: + // + if (rem < y) { + return; + } + + big_uint t; + bool rem_neg = false; + + // + // See if we can short-circuit long division, and use basic + // arithmetic instead: + // + if (rem_order == 0) { + if (div) { + *div = px[0] / py[0]; + } + rem = px[0] % py[0]; + return; + } + if (rem_order == 1) { + double_limb_type a = (static_cast(px[1]) << limb_bits) | px[0]; + double_limb_type b = + y_order ? (static_cast(py[1]) << limb_bits) | py[0] : py[0]; + if (div) { + *div = a / b; + } + rem = a % b; + return; + } + const_limb_pointer prem = rem.limbs(); + // This is initialised just to keep the compiler from + // emitting useless warnings later on: + limb_pointer pdiv = limb_pointer(); + if (div) { + pdiv = div->limbs(); + for (std::size_t i = 1; i < 1 + rem_order - y_order; ++i) { + pdiv[i] = 0; + } + } + bool first_pass = true; + + do { + // + // Calculate our best guess for how many times y divides + // into rem: + // + limb_type guess = 1; + if (rem_order > 0 && prem[rem_order] <= py[y_order]) { + double_limb_type a = + (static_cast(prem[rem_order]) << limb_bits) | + prem[rem_order - 1]; + double_limb_type b = py[y_order]; + double_limb_type v = a / b; + if (v <= max_limb_value) { + guess = static_cast(v); + --rem_order; + } + } else if (rem_order == 0) { + guess = prem[0] / py[y_order]; + } else { + double_limb_type a = + (static_cast(prem[rem_order]) << limb_bits) | + prem[rem_order - 1]; + double_limb_type b = + (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); + 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.... + // + // Update result: + // + std::size_t shift = rem_order - y_order; + if (div) { + if (rem_neg) { + if (pdiv[shift] > guess) { + pdiv[shift] -= guess; + } else { + t = 0u; + t.limbs()[shift] = guess; + *div -= t; + } + } else if (max_limb_value - pdiv[shift] > guess) { + pdiv[shift] += guess; + } else { + t = 0u; + t.limbs()[shift] = guess; + *div += t; + } + } + // + // Calculate guess * y, we use a fused mutiply-shift + // 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 = 0u; + limb_pointer pt = t.limbs(); + for (std::size_t i = 0; i < y_order + 1; ++i) { + carry += + static_cast(py[i]) * static_cast(guess); + pt[i + shift] = static_cast(carry); + carry >>= limb_bits; + } + 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() - + // 1); + } + // + // Update rem in a way that won't actually produce a + // negative result in case the argument types are + // unsigned: + // + if (truncated_t && carry) { + NIL_CO3_MP_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 + // and incrementing rem, then add t to it. + for (std::size_t i = 0; i <= rem_order; ++i) { + rem.limbs()[i] = ~prem[i]; + } + rem.normalize(); + ++rem; + rem += t; + rem_neg = !rem_neg; + } else if (rem > t) { + rem -= t; + } else { + std::swap(rem, t); + rem -= t; + prem = rem.limbs(); + rem_neg = !rem_neg; + } + // + // First time through we need to strip any leading zero, + // otherwise the termination condition goes belly-up: + // + // if (div && first_pass) { + // first_pass = false; + // // while (pdiv[div->limbs_count() - 1] == 0) + // // div->resize(div->limbs_count() - 1, + // div->limbs_count() - 1); + // } + // + // Update rem_order: + // + rem_order = rem.order(); + } + // Termination condition is really just a check that rem > + // y, but with a common short-circuit case handled first: + while ((rem_order >= y_order) && ((rem_order > y_order) || (rem >= y))); + + // + // We now just have to normalise the result: + // + if (rem_neg && !rem.is_zero()) { + // We have one too many in the result: + if (div) { + --*div; + } + rem = y - rem; + } + + // remainder must be less than the divisor or our code has + // failed + NIL_CO3_MP_ASSERT(rem < y); + } + + // 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 multiply(big_uint& final_result, const big_uint& a, + const T& b_orig) noexcept { + auto b = detail::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.limbs_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); + std::size_t j = 0; + for (; j < inner_limit; ++j) { + NIL_CO3_MP_ASSERT(i + j < result.limbs_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])); + 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.limbs_count() > i + j); + if (i + j < result.limbs_count()) { + pr[i + j] = static_cast(carry); + } + } + carry = 0; + } + result.normalize(); + final_result = result; + } + } // namespace detail +} // namespace nil::crypto3::multiprecision 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 new file mode 100644 index 0000000000..0cd92f4cfb --- /dev/null +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp @@ -0,0 +1,1090 @@ +#pragma once + +// IWYU pragma: private; include "nil/crypto3/multiprecision/big_uint.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#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" +#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 { + /** + * @brief Big unsigned integer type + * + * @tparam Bits Number of bits + * + * @details + * This is a class that represents a big unsigned integer with a fixed size in bits. + * + * @note + * Addition and subtraction operations are optimized, while multiplication and division are not. + * Multiplication and division should be used in compile time or in non-performance critical + * code. + * If you need fast arithmetic, you probably are looking for big_mod, which implements fast + * modular arithmetic. + */ + template + class big_uint { + public: + static constexpr std::size_t Bits = Bits_; + using self_type = big_uint; + + 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; + static constexpr limb_type max_limb_value = detail::max_limb_value; + + static constexpr std::size_t internal_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)); + + // + // 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 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 void zero_after(std::size_t start_index) { + auto pr = this->limbs(); + for (std::size_t i = start_index; i < this->limbs_count(); ++i) { + pr[i] = 0; + } + } + + constexpr std::size_t used_limbs() const noexcept { + for (int i = internal_limb_count - 1; i >= 0; --i) { + if (limbs()[i] != 0) { + return i + 1; + } + } + return 0; + } + + constexpr std::size_t order() const noexcept { + for (int i = internal_limb_count - 1; i >= 0; --i) { + if (limbs()[i] != 0) { + return i; + } + } + return 0; + } + + // Assignment + + template && std::is_unsigned_v, int> = 0> + constexpr void do_assign_integral(const T& a) noexcept { + if constexpr (sizeof(T) <= sizeof(limb_type)) { + this->limbs()[0] = a; + this->zero_after(1); + } else { + static_assert(sizeof(T) % sizeof(limb_type) == 0); + constexpr std::size_t n = + std::min(internal_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)); + a_copy >>= limb_bits; + } + zero_after(n); + } + this->normalize(); + if constexpr (sizeof(T) * CHAR_BIT > Bits) { + NIL_CO3_MP_ASSERT(big_uint(a).compare(*this) == 0); + } + } + + template + constexpr void do_assign(const big_uint& other) noexcept { + std::size_t count = (std::min)(other.limbs_count(), this->limbs_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 + // of other was less, we have 0s at the end. + this->zero_after((std::min)(other.limbs_count(), this->limbs_count())); + this->normalize(); + } + + public: + // TODO(ioxid): this should be private + constexpr void normalize() noexcept { limbs()[internal_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; } + + // Constructor + + constexpr big_uint() noexcept {} + + 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; } + + 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"); + do_assign_integral(static_cast>(val)); + } + + template && std::is_unsigned_v, int> = 0> + constexpr big_uint(T val) noexcept { + do_assign_integral(val); + } + + // TODO(ioxid): make this explicit for the case when Bits2 > Bits + template + constexpr big_uint(const big_uint& other) noexcept { + do_assign(other); + if constexpr (Bits2 > Bits) { + NIL_CO3_MP_ASSERT(other.compare(*this) == 0); + } + } + + template + constexpr big_uint(const std::array& bytes) noexcept { + *this = bytes; + } + + // Assignment + + constexpr big_uint& operator=(std::string_view str) { + *this = detail::parse_int(str); + return *this; + } + constexpr big_uint& operator=(const char* str) { + *this = detail::parse_int(str); + return *this; + } + 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"); + 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); + return *this; + } + + template + constexpr big_uint& operator=(const big_uint& other) noexcept { + do_assign(other); + if constexpr (Bits2 > Bits) { + NIL_CO3_MP_ASSERT(other.compare(*this) == 0); + } + return *this; + } + + template + constexpr big_uint& operator=(const std::array& bytes) { + std::size_t bits = 0; + for (std::size_t i = 0; i < bytes.size(); ++i) { + *this <<= 8; + if (bits != 0) { + bits += 8; + } + unsigned b = bytes[i]; + *this += b; + if (bits == 0 && b != 0) { + bits += std::bit_width(b); + } + } + if (bits > Bits) { + throw std::invalid_argument("not enough bits"); + } + return *this; + } + + // 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; + } + if (!(flags & std::ios_base::hex)) { + throw std::invalid_argument("big_uint: unsupported format flags"); + } + std::string result; + result.reserve(used_limbs() * limb_bits / 4); + bool found_first = false; + for (int i = internal_limb_count - 1; i >= 0; --i) { + auto limb = limbs()[i]; + bool should_pad = found_first; + found_first = found_first || limb != 0; + if (found_first) { + std::size_t len = limb == 0 ? 1 : (std::bit_width(limb) + 3) / 4; + std::size_t padded_len = len; + if (should_pad) { + padded_len = sizeof(limb_type) * 2; + } + for (std::size_t j = 0; j < padded_len - len; ++j) { + result += '0'; + } + std::size_t start_offset = result.size(); + result.resize(result.size() + len); + auto ec = std::to_chars(result.data() + start_offset, + result.data() + result.size(), limb, 16) + .ec; + NIL_CO3_MP_ASSERT(ec == std::errc{}); + } + } + 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; + } + return result; + } + + template = 0> + constexpr big_uint truncate() const noexcept { + big_uint result; + result.do_assign(*this); + return result; + } + + // Cast to integral types + + template && std::is_integral_v && + std::is_unsigned_v, + int> = 0> + explicit constexpr operator T() const { + if constexpr (sizeof(T) <= sizeof(limb_type)) { + return static_cast(this->limbs()[0]); + } else { + constexpr std::size_t n = + std::min(sizeof(T) / sizeof(limb_type), internal_limb_count); + T result = 0; + for (std::size_t i = 0; i < n; ++i) { + result <<= limb_bits; + result |= limbs()[n - i - 1]; + } + return result; + } + } + + template && std::is_signed_v, int> = 0> + explicit constexpr operator T() const { + return static_cast(static_cast>(*this)); + } + + explicit constexpr operator bool() const { return !is_zero(); } + + // Comparison + + 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) { + if (pa[i] != pb[i]) { + return pa[i] > pb[i] ? 1 : -1; + } + } + return 0; + } + + template && std::is_signed_v, int> = 0> + constexpr int compare(const T& b) const noexcept { + if (b < 0) { + return 1; + } + return compare(static_cast>(b)); + } + + template && std::is_unsigned_v, int> = 0> + constexpr int compare(const T& b) const noexcept { + static_assert(sizeof(T) <= sizeof(double_limb_type)); + std::size_t s = used_limbs(); + if constexpr (sizeof(T) <= sizeof(limb_type)) { + if (s > 1) { + return 1; + } + auto lmb = this->limbs()[0]; + return lmb == b ? 0 : lmb > b ? 1 : -1; + } else { + if (s > 2) { + return 1; + } + auto dbl = static_cast(*this); + return dbl == b ? 0 : dbl > b ? 1 : -1; + } + } + + // Comparison + +#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; \ + } \ + \ + template, int> = 0> \ + friend constexpr bool operator OP_(const T& a, const big_uint& b) noexcept { \ + return (-(b.compare(a)))OP_ 0; \ + } + + NIL_CO3_MP_BIG_UINT_IMPL_COMPARISON_OPERATOR(<) + NIL_CO3_MP_BIG_UINT_IMPL_COMPARISON_OPERATOR(<=) + NIL_CO3_MP_BIG_UINT_IMPL_COMPARISON_OPERATOR(>) + NIL_CO3_MP_BIG_UINT_IMPL_COMPARISON_OPERATOR(>=) + NIL_CO3_MP_BIG_UINT_IMPL_COMPARISON_OPERATOR(==) + NIL_CO3_MP_BIG_UINT_IMPL_COMPARISON_OPERATOR(!=) + +#undef NIL_CO3_MP_BIG_UINT_IMPL_COMPARISON_OPERATOR + + // Arithmetic operations + + constexpr void negate() noexcept { + if (is_zero()) { + return; + } + complement(*this); + ++*this; + } + + constexpr auto& operator++() noexcept { + if (limbs()[0] < max_limb_value) { + ++limbs()[0]; + if constexpr (Bits < limb_bits) { + normalize(); + } + } else { + detail::add(*this, *this, static_cast(1u)); + } + return *this; + } + + constexpr auto operator++(int) noexcept { + auto copy = *this; + ++*this; + return copy; + } + + NIL_CO3_MP_FORCEINLINE constexpr void decrement() noexcept {} + + constexpr auto operator+() const noexcept { return *this; } + + constexpr auto& operator--() noexcept { + if (limbs()[0]) { + --limbs()[0]; + } else { + detail::subtract(*this, *this, static_cast(1u)); + } + return *this; + } + constexpr auto operator--(int) noexcept { + auto copy = *this; + --*this; + return copy; + } + + constexpr big_uint operator-() const noexcept { + big_uint result = *this; + result.negate(); + return result; + } + + // Arithmetic operations + + template, int> = 0> + constexpr auto operator+(const T& b) const noexcept { + detail::largest_big_uint_t result; + detail::add(result, *this, b); + return result; + } + + template, int> = 0> + friend constexpr auto operator+(const T& a, const big_uint& b) noexcept { + return b + a; + } + + template, int> = 0> + constexpr auto& operator+=(const T& b) noexcept { + detail::add(*this, *this, b); + return *this; + } + + template, int> = 0> + constexpr auto operator-(const T& b) const noexcept { + detail::largest_big_uint_t result; + detail::subtract(result, *this, b); + return result; + } + + template, int> = 0> + friend constexpr auto operator-(const T& a, const big_uint& b) noexcept { + return (-b) + a; + } + + template, int> = 0> + constexpr auto& operator-=(const T& b) noexcept { + detail::subtract(*this, *this, b); + return *this; + } + + template, int> = 0> + constexpr auto operator*(const T& b) const noexcept { + 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)); + return result; + } + + template, int> = 0> + friend constexpr auto operator*(const T& a, const big_uint& b) noexcept { + return b * a; + } + + template, int> = 0> + constexpr auto& operator*=(const T& b) noexcept { + 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; + } + + 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 { + 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; + big_uint_a result; + big_uint_a modulus; + detail::divide(&result, detail::as_big_uint(a_unsigned), + detail::as_big_uint(b_unsigned), modulus); + return static_cast>(result); + } + + template, int> = 0> + constexpr auto& operator/=(const T& b) noexcept { + 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; + } + + 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) { + 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; + big_uint_a modulus; + detail::divide(static_cast(nullptr), detail::as_big_uint(a_unsigned), + detail::as_big_uint(b_unsigned), modulus); + return static_cast>(modulus); + } + + template, int> = 0> + constexpr auto& operator%=(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), + modulus); + *this = modulus; + return *this; + } + +#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; \ + 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 { \ + 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; \ + } + + NIL_CO3_MP_BIG_UINT_BITWISE_OPERATOR_IMPL(&, &=, bitwise_and) + NIL_CO3_MP_BIG_UINT_BITWISE_OPERATOR_IMPL(|, |=, bitwise_or) + NIL_CO3_MP_BIG_UINT_BITWISE_OPERATOR_IMPL(^, ^=, bitwise_xor) + +#undef NIL_CO3_MP_BIG_UINT_BITWISE_OPERATOR_IMPL + + // Bitwise operations + + private: + template + constexpr void bitwise_op(const big_uint& o, Op op) noexcept { + // + // Both arguments are unsigned types, very simple case handled as a special case. + // + // 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(); + auto [m, x] = std::minmax(rs, os); + limb_pointer pr = limbs(); + const_limb_pointer po = o.limbs(); + for (std::size_t i = rs; i < x; ++i) { + pr[i] = 0; + } + + for (std::size_t i = 0; i < os; ++i) { + pr[i] = op(pr[i], po[i]); + } + for (std::size_t i = os; i < x; ++i) { + pr[i] = op(pr[i], static_cast(0u)); + } + normalize(); + } + + template + NIL_CO3_MP_FORCEINLINE constexpr void bitwise_and(const big_uint& o) noexcept { + bitwise_op(o, std::bit_and()); + } + + template + NIL_CO3_MP_FORCEINLINE constexpr void bitwise_or(const big_uint& o) noexcept { + bitwise_op(o, std::bit_or()); + } + + template + NIL_CO3_MP_FORCEINLINE constexpr void bitwise_xor(const big_uint& o) noexcept { + bitwise_op(o, std::bit_xor()); + } + + // + // Again for operands which are single limbs: + // + + NIL_CO3_MP_FORCEINLINE constexpr void bitwise_and(limb_type l) noexcept { + limbs()[0] &= l; + zero_after(1); + } + + NIL_CO3_MP_FORCEINLINE constexpr void bitwise_or(limb_type l) noexcept { limbs()[0] |= l; } + + 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(); + for (std::size_t i = 0; i < os; ++i) { + limbs()[i] = ~o.limbs()[i]; + } + normalize(); + } + + // Left shift will throw away upper Bits. + // This function must be called only when s % 8 == 0, i.e. we shift bytes. + void left_shift_byte(double_limb_type s) noexcept { + limb_pointer pr = limbs(); + + std::size_t bytes = static_cast(s / CHAR_BIT); + if (s >= Bits) { + // Set result to 0. + zero_after(0); + } else { + unsigned char* pc = reinterpret_cast(pr); + std::memmove(pc + bytes, pc, limbs_count() * sizeof(limb_type) - bytes); + std::memset(pc, 0, bytes); + } + } + + // Left shift will throw away upper Bits. + // This function must be called only when s % limb_bits == 0, i.e. we shift limbs, which + // are normally 64 bit. + + 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); + + limb_pointer pr = limbs(); + + if (s >= Bits) { + // Set result to 0. + 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]; + } + for (; i < rs; ++i) { + pr[rs - 1 - i] = 0; + } + } + } + + // Left shift will throw away upper Bits. + + constexpr void left_shift_generic(double_limb_type s) noexcept { + if (s >= Bits) { + // Set result to 0. + zero_after(0); + } else { + limb_type offset = static_cast(s / limb_bits); + limb_type shift = static_cast(s % limb_bits); + + limb_pointer pr = limbs(); + std::size_t i = 0; + std::size_t rs = limbs_count(); + // This code only works when shift is non-zero, otherwise we invoke undefined + // behaviour! + NIL_CO3_MP_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); + } + if (rs - i >= 1 + offset) { + pr[rs - 1 - i] = pr[rs - 1 - i - offset] << shift; + ++i; + } + for (; i < rs; ++i) { + pr[rs - 1 - i] = 0; + } + } + } + + 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 rs = ors; + if (offset >= rs) { + zero_after(0); + return; + } + rs -= offset; + limb_pointer pr = limbs(); + unsigned char* pc = reinterpret_cast(pr); + limb_type shift = static_cast(s / CHAR_BIT); + std::memmove(pc, pc + shift, ors * sizeof(pr[0]) - shift); + shift = (sizeof(limb_type) - shift % sizeof(limb_type)) * CHAR_BIT; + if (shift < limb_bits) { + pr[ors - offset - 1] &= (static_cast(1u) << shift) - 1; + if (!pr[ors - offset - 1] && (rs > 1)) { + --rs; + } + } + // Set zeros after 'rs', alternative to resizing to size 'rs'. + zero_after(rs); + } + + 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 rs = ors; + if (offset >= rs) { + zero_after(0); + return; + } + rs -= offset; + limb_pointer pr = limbs(); + std::size_t i = 0; + for (; i < rs; ++i) { + pr[i] = pr[i + offset]; + } + // Set zeros after 'rs', alternative to resizing to size 'rs'. + zero_after(rs); + } + + 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 rs = ors; + + if (offset >= rs) { + *this = static_cast(0u); + return; + } + rs -= offset; + limb_pointer pr = limbs(); + if ((pr[ors - 1] >> shift) == 0) { + if (--rs == 0) { + *this = static_cast(0u); + return; + } + } + std::size_t i = 0; + + // This code only works for non-zero shift, otherwise we invoke undefined behaviour! + NIL_CO3_MP_ASSERT(shift); + for (; i + offset + 1 < ors; ++i) { + pr[i] = pr[i + offset] >> shift; + pr[i] |= pr[i + offset + 1] << (limb_bits - shift); + } + pr[i] = pr[i + offset] >> shift; + + // We cannot resize any more, so we need to set all the limbs to zero. + zero_after(rs); + } + + public: + constexpr auto operator~() const noexcept { + big_uint result; + result.complement(*this); + return result; + } + + // Shifting left throws away upper Bits. + constexpr big_uint& operator<<=(double_limb_type s) noexcept { + if (!s) { + return *this; + } + +#if NIL_CO3_MP_ENDIAN_LITTLE_BYTE && defined(NIL_CO3_MP_USE_LIMB_SHIFT) + constexpr limb_type limb_shift_mask = limb_bits - 1; + constexpr limb_type byte_shift_mask = CHAR_BIT - 1; + + if ((s & limb_shift_mask) == 0) { + left_shift_limb(s); + } else if (((s & byte_shift_mask) == 0) && !std::is_constant_evaluated()) { + left_shift_byte(s); + } +#elif NIL_CO3_MP_ENDIAN_LITTLE_BYTE + constexpr limb_type limb_shift_mask = limb_bits - 1; + constexpr limb_type byte_shift_mask = CHAR_BIT - 1; + + if (std::is_constant_evaluated() && ((s & limb_shift_mask) == 0)) { + left_shift_limb(s); + } else if (((s & byte_shift_mask) == 0) && !std::is_constant_evaluated()) { + left_shift_byte(s); + } +#else + constexpr limb_type limb_shift_mask = limb_bits - 1; + + if ((s & limb_shift_mask) == 0) { + left_shift_limb(s); + } +#endif + else { + left_shift_generic(s); + } + normalize(); + return *this; + } + + constexpr big_uint operator<<(double_limb_type s) const noexcept { + big_uint result = *this; + result <<= s; + return result; + } + + constexpr big_uint& operator>>=(double_limb_type s) noexcept { + if (!s) { + return *this; + } + +#if NIL_CO3_MP_ENDIAN_LITTLE_BYTE && defined(NIL_CO3_MP_USE_LIMB_SHIFT) + constexpr limb_type limb_shift_mask = limb_bits - 1; + constexpr limb_type byte_shift_mask = CHAR_BIT - 1; + + if ((s & limb_shift_mask) == 0) { + right_shift_limb(s); + } else if (((s & byte_shift_mask) == 0) && !std::is_constant_evaluated()) { + right_shift_byte(s); + } +#elif NIL_CO3_MP_ENDIAN_LITTLE_BYTE + constexpr limb_type byte_shift_mask = CHAR_BIT - 1; + + constexpr limb_type limb_shift_mask = limb_bits - 1; + if (std::is_constant_evaluated() && ((s & limb_shift_mask) == 0)) { + right_shift_limb(s); + } else if (((s & byte_shift_mask) == 0) && !std::is_constant_evaluated()) { + right_shift_byte(s); + } +#else + constexpr limb_type limb_shift_mask = limb_bits - 1; + + if ((s & limb_shift_mask) == 0) { + right_shift_limb(s); + } +#endif + else { + right_shift_generic(s); + } + return *this; + } + + constexpr big_uint operator>>(double_limb_type s) const noexcept { + big_uint result = *this; + result >>= s; + return result; + } + + // 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 < limbs_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 < limbs_count()) && !limbs()[index]) { + ++index; + } + + if (index == limbs_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 = limbs_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; + } + + private: + // Data + + // 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, + 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) noexcept; + template + friend constexpr void detail::add_unsigned(big_uint& result, + const big_uint& a, + const big_uint& b) noexcept; + template + friend constexpr void detail::subtract_unsigned(big_uint& result, + const big_uint& a, + const big_uint& b) noexcept; + template + friend constexpr void 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, + const limb_type& b) noexcept; + template + friend constexpr void detail::divide(big_uint* div, const big_uint& x, + const big_uint& y, big_uint& rem); + template + friend constexpr void detail::multiply(big_uint& result, const big_uint& a, + const T& b) noexcept; + }; + + // 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.limbs_count(); ++i) { + boost::hash_combine(result, val.limbs()[i]); + } + return result; + } + + // Misc ops + + template + constexpr std::size_t msb(const big_uint& a) { + return a.msb(); + } + + template + constexpr std::size_t lsb(const big_uint& a) { + return a.lsb(); + } + + template + constexpr bool bit_test(const big_uint& a, std::size_t index) { + return a.bit_test(index); + } + + template + constexpr bool is_zero(const big_uint& a) { + return a.is_zero(); + } + + template + constexpr void divide_qr(const big_uint& a, const big_uint& b, big_uint& q, + big_uint& r) { + detail::divide(&q, a, b, r); + } +} // namespace nil::crypto3::multiprecision + +template +struct std::hash> { + std::size_t operator()(const nil::crypto3::multiprecision::big_uint& a) const noexcept { + return boost::hash>{}(a); + } +}; diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/limits.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/limits.hpp similarity index 97% rename from crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/limits.hpp rename to crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/limits.hpp index 1f921eaab1..1e5e90acc9 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/limits.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/limits.hpp @@ -9,7 +9,7 @@ #include #include -#include "nil/crypto3/multiprecision/big_uint_impl.hpp" +#include "nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp" namespace nil::crypto3::multiprecision::detail { template diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/ops/gcd_inverse.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/gcd_inverse.hpp similarity index 96% rename from crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/ops/gcd_inverse.hpp rename to crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/gcd_inverse.hpp index c02a82e87b..92b3a57de6 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/ops/gcd_inverse.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/gcd_inverse.hpp @@ -14,8 +14,8 @@ #include #include -#include "nil/crypto3/multiprecision/big_int.hpp" -#include "nil/crypto3/multiprecision/big_uint_impl.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 { diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/ops/import_export.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/import_export.hpp similarity index 96% rename from crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/ops/import_export.hpp rename to crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/import_export.hpp index 9bea324b66..8ea016d11b 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/ops/import_export.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/import_export.hpp @@ -16,10 +16,10 @@ #include #include -#include "nil/crypto3/multiprecision/big_uint_impl.hpp" #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" -#include "nil/crypto3/multiprecision/storage.hpp" namespace nil::crypto3::multiprecision { namespace detail { @@ -85,7 +85,7 @@ namespace nil::crypto3::multiprecision { bit_location = limb_bits - bit_location; NIL_CO3_MP_ASSERT( - !((bit_location < sizeof(bits) * CHAR_BIT) && (bits >>= bit_location))); + !((bit_location < sizeof(bits) * CHAR_BIT) && (bits >> bit_location))); } template @@ -98,8 +98,7 @@ namespace nil::crypto3::multiprecision { ? ~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 = extract_bits(val, location + limb_bits - shift, count - limb_bits + shift); result <<= limb_bits - shift; } if (limb < val.limbs_count()) { @@ -147,7 +146,7 @@ namespace nil::crypto3::multiprecision { template inline big_uint& import_bits_fast(big_uint& result, T* i, T* j, - std::size_t chunk_size = 0) { + std::size_t chunk_size = 0) { std::size_t byte_len = (j - i) * (chunk_size ? chunk_size / CHAR_BIT : sizeof(*i)); std::size_t limb_len = byte_len / sizeof(limb_type); if (byte_len % sizeof(limb_type)) { diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/ops/jacobi.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/jacobi.hpp similarity index 89% rename from crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/ops/jacobi.hpp rename to crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/jacobi.hpp index 9210b97c7e..530c389bd3 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/ops/jacobi.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/jacobi.hpp @@ -14,7 +14,7 @@ #include #include -#include "nil/crypto3/multiprecision/big_uint_impl.hpp" +#include "nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp" namespace nil::crypto3::multiprecision { @@ -22,7 +22,7 @@ namespace nil::crypto3::multiprecision { constexpr int jacobi(const big_uint &a, const big_uint &n) { using big_uint_t = big_uint; - if (n % 2 == 0 || n <= 1) { + if (n % 2u == 0 || n <= 1) { throw std::invalid_argument("jacobi: second argument must be odd and > 1"); } @@ -39,7 +39,7 @@ namespace nil::crypto3::multiprecision { big_uint_t tmp(y); tmp -= x; x = tmp; - if (y % 4 == 3) { + if (y % 4u == 3) { J = -J; } } @@ -50,13 +50,13 @@ namespace nil::crypto3::multiprecision { std::size_t shifts = x.lsb(); x >>= shifts; if (shifts & 1) { - std::size_t y_mod_8 = static_cast(y % 8); + std::size_t y_mod_8 = static_cast(y % 8u); if (y_mod_8 == 3 || y_mod_8 == 5) { J = -J; } } - if (x % 4 == 3 && y % 4 == 3) { + if (x % 4u == 3 && y % 4u == 3) { J = -J; } diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/ops/powm.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/powm.hpp similarity index 71% rename from crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/ops/powm.hpp rename to crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/powm.hpp index c723fa8bb3..124abf6940 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/ops/powm.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/powm.hpp @@ -14,17 +14,17 @@ // IWYU pragma: private; include "nil/crypto3/multiprecision/big_uint.hpp" #include -#include #include -#include "nil/crypto3/multiprecision/big_uint_impl.hpp" -#include "nil/crypto3/multiprecision/modular/big_mod_impl.hpp" -#include "nil/crypto3/multiprecision/modular/ops/pow.hpp" +#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>::is_integer && - std::numeric_limits>::is_integer, + std::enable_if_t> && + detail::is_integer_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/ops/ressol.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/ressol.hpp similarity index 90% rename from crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/ops/ressol.hpp rename to crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/ressol.hpp index 0a3c5a42ea..204072605b 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/ops/ressol.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/ressol.hpp @@ -15,12 +15,12 @@ #include #include -#include "nil/crypto3/multiprecision/big_uint_impl.hpp" #include "nil/crypto3/multiprecision/detail/assert.hpp" -#include "nil/crypto3/multiprecision/modular/big_mod_impl.hpp" -#include "nil/crypto3/multiprecision/modular/ops/pow.hpp" -#include "nil/crypto3/multiprecision/ops/jacobi.hpp" -#include "nil/crypto3/multiprecision/storage.hpp" +#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/big_uint/ops/jacobi.hpp" +#include "nil/crypto3/multiprecision/detail/big_uint/storage.hpp" namespace nil::crypto3::multiprecision { template @@ -58,7 +58,7 @@ namespace nil::crypto3::multiprecision { montgomery_big_mod_rt a_mod(a, p); - if (p % 4 == 3) { + if (p % 4u == 3) { big_uint_padded_t exp_padded = p; ++exp_padded; diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/ops/wnaf.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/wnaf.hpp similarity index 95% rename from crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/ops/wnaf.hpp rename to crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/wnaf.hpp index 054646f213..d86ed92285 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/ops/wnaf.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/ops/wnaf.hpp @@ -15,8 +15,8 @@ #include #include -#include "nil/crypto3/multiprecision/big_uint_impl.hpp" -#include "nil/crypto3/multiprecision/storage.hpp" +#include "nil/crypto3/multiprecision/detail/big_uint/big_uint_impl.hpp" +#include "nil/crypto3/multiprecision/detail/big_uint/storage.hpp" namespace nil::crypto3::multiprecision { /* Vector version */ 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 new file mode 100644 index 0000000000..9d8bc7b5aa --- /dev/null +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/parsing.hpp @@ -0,0 +1,80 @@ +#pragma once + +#include +#include +#include +#include + +namespace nil::crypto3::multiprecision { + template + class big_uint; + + namespace detail { + constexpr bool is_valid_hex_digit(char c) { + return ('0' <= c && c <= '9') || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F'); + } + + constexpr unsigned parse_hex_digit(char c) { + if ('0' <= c && c <= '9') { + return c - '0'; + } + if ('a' <= c && c <= 'f') { + return (c - 'a') + 10; + } + return (c - 'A') + 10; + } + + template + constexpr big_uint parse_int_hex(std::string_view str) { + if (str.size() < 2 || str[0] != '0' || str[1] != 'x') { + throw std::invalid_argument("hex literal should start with 0x"); + } + + big_uint result{0}; + + std::size_t bits = 0; + for (std::size_t i = 2; i < str.size(); ++i) { + char c = str[i]; + if (!is_valid_hex_digit(c)) { + throw std::invalid_argument("non-hex character in literal"); + } + result <<= 4; + if (bits != 0) { + bits += 4; + } + unsigned digit = parse_hex_digit(c); + result += digit; + if (bits == 0 && digit != 0) { + bits += std::bit_width(digit); + } + } + if (bits > Bits) { + throw std::invalid_argument("not enough bits to store literal"); + } + return result; + } + + template + constexpr big_uint parse_int_decimal(std::string_view str) { + big_uint result{0}; + + for (std::size_t i = 0; i < str.size(); ++i) { + char c = str[i]; + if (c < '0' || c > '9') { + throw std::invalid_argument("non decimal character in literal"); + } + result *= 10u; + result += static_cast(c - '0'); + } + return result; + } + + template + constexpr big_uint parse_int(std::string_view str) { + if (str.size() >= 2 && str[0] == '0' && str[1] == 'x') { + return parse_int_hex(str); + } + return parse_int_decimal(str); + } + } // namespace detail +} // namespace nil::crypto3::multiprecision diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/storage.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/storage.hpp similarity index 98% rename from crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/storage.hpp rename to crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/storage.hpp index f534ee7380..6047d72702 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/storage.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/storage.hpp @@ -1,7 +1,5 @@ #pragma once -// IWYU pragma: private - #include #include #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 new file mode 100644 index 0000000000..412b00533d --- /dev/null +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/big_uint/type_traits.hpp @@ -0,0 +1,71 @@ +#pragma once + +#include +#include +#include +#include + +#include "nil/crypto3/multiprecision/detail/big_uint/storage.hpp" + +namespace nil::crypto3::multiprecision { + template + class big_uint; + + namespace detail { + template + constexpr bool is_big_uint_v = false; + + template + constexpr bool is_big_uint_v> = true; + + template + constexpr bool is_integral_v = std::is_integral_v || is_big_uint_v; + + template, int> = 0> + constexpr std::size_t get_bits() { + return sizeof(T) * CHAR_BIT; + } + + template, int> = 0> + constexpr std::size_t get_bits() { + return T::Bits; + } + + template + using largest_big_uint_t = + std::conditional_t && is_big_uint_v, + big_uint(), get_bits())>, + std::conditional_t, T1, T2>>; + + template && std::is_unsigned_v, int> = 0> + constexpr big_uint as_big_uint(const T& a) { + return static_cast>(a); + } + + template>, int> = 0> + constexpr decltype(auto) as_big_uint(T&& a) { + return std::forward(a); + } + + template && std::is_unsigned_v && + sizeof(T) * CHAR_BIT <= limb_bits, + int> = 0> + constexpr limb_type as_limb_type_or_big_uint(const T& a) { + return static_cast(a); + } + + template && std::is_unsigned_v && + sizeof(T) * CHAR_BIT <= limb_bits) && + !is_big_uint_v, + int> = 0> + constexpr auto as_limb_type_or_big_uint(const T& a) { + return as_big_uint(a); + } + + template>, int> = 0> + constexpr decltype(auto) as_limb_type_or_big_uint(T&& a) { + return std::forward(a); + } + } // namespace detail +} // namespace nil::crypto3::multiprecision diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/constexpr_support.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/constexpr_support.hpp deleted file mode 100644 index d580a4a840..0000000000 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/constexpr_support.hpp +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -#include - -namespace nil::crypto3::multiprecision::detail::constexpr_support { - // std::abs is constexpr only in C++23 - template && std::is_signed_v, int> = 0> - constexpr T abs(T val) { - return val < 0 ? -val : val; - } -} // namespace nil::crypto3::multiprecision::detail::constexpr_support diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/integer_ops_base.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_base.hpp similarity index 67% rename from crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/integer_ops_base.hpp rename to crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_base.hpp index 5d4aefa289..e23ee48b11 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/integer_ops_base.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_base.hpp @@ -3,25 +3,26 @@ #include #include -#include "nil/crypto3/multiprecision/big_uint_impl.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, int> = 0> constexpr std::size_t msb(T a) { // TODO(ioxid): optimize - return static_cast()>>(a).msb(); + return detail::as_big_uint(detail::unsigned_or_throw(a)).msb(); } template, int> = 0> constexpr std::size_t lsb(T a) { // TODO(ioxid): optimize - return static_cast()>>(a).lsb(); + return detail::as_big_uint(detail::unsigned_or_throw(a)).lsb(); } template, int> = 0> constexpr bool bit_test(T a, std::size_t index) { // TODO(ioxid): optimize - return static_cast()>>(a).bit_test(index); + return detail::as_big_uint(detail::unsigned_or_throw(a)).bit_test(index); } template, int> = 0> diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/integer_ops_powm.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_powm.hpp similarity index 65% rename from crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/integer_ops_powm.hpp rename to crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_powm.hpp index 755eebeb7f..42fbefbed3 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/integer_ops_powm.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_ops_powm.hpp @@ -3,8 +3,7 @@ #include #include -#include "nil/crypto3/multiprecision/big_uint_impl.hpp" -#include "nil/crypto3/multiprecision/ops/powm.hpp" +#include "nil/crypto3/multiprecision/detail/big_uint/ops/powm.hpp" namespace nil::crypto3::multiprecision { template = 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), big_uint()>(m))); + 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 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 new file mode 100644 index 0000000000..261cbcf568 --- /dev/null +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/integer_utils.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include + +namespace nil::crypto3::multiprecision::detail { + template && std::is_signed_v, int> = 0> + constexpr std::make_unsigned_t unsigned_abs(T x) { + std::make_unsigned_t ux = x; + return (x < 0) ? -ux : ux; // compare signed x, negate unsigned x + } + +} // namespace nil::crypto3::multiprecision::detail 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 6c9ebfa5c0..6f8d9ed9ef 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,42 +1,13 @@ #pragma once +#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" -#include "nil/crypto3/multiprecision/storage.hpp" #if __has_include() -#define NIL_CO3_MP_HAS_IMMINTRIN_H -#endif - -// -// If the compiler supports the intrinsics used by GCC internally -// inside then we'll use them directly. -// This is a bit of defensive programming, mostly for a modern clang -// sitting on top of an older GCC header install. -// -#if defined(__has_builtin) - -#if __has_builtin(__builtin_ia32_addcarryx_u64) -#define NIL_CO3_MP_ADDC __builtin_ia32_addcarryx_u -#endif - -#if __has_builtin(__builtin_ia32_subborrow_u64) -#define NIL_CO3_MP_SUBB __builtin_ia32_subborrow_u -#elif __has_builtin(__builtin_ia32_sbb_u64) -#define NIL_CO3_MP_SUBB __builtin_ia32_sbb_u -#endif -#endif - -#ifndef NIL_CO3_MP_ADDC -#define NIL_CO3_MP_ADDC _addcarry_u -#endif -#ifndef NIL_CO3_MP_SUBB -#define NIL_CO3_MP_SUBB _subborrow_u -#endif - -#ifdef NIL_CO3_MP_HAS_IMMINTRIN_H +#define NIL_CO3_MP_HAS_IMMINTRIN_H #include // IWYU pragma: keep @@ -48,7 +19,7 @@ namespace nil::crypto3::multiprecision::detail { limb_type b, limb_type* p_result) { using cast_type = unsigned long long; - return NIL_CO3_MP_JOIN(NIL_CO3_MP_ADDC, 64)(carry, a, b, + return NIL_CO3_MP_JOIN(_addcarry_u, 64)(carry, a, b, reinterpret_cast(p_result)); } @@ -56,7 +27,7 @@ namespace nil::crypto3::multiprecision::detail { limb_type b, limb_type* p_result) { using cast_type = unsigned long long; - return NIL_CO3_MP_JOIN(NIL_CO3_MP_SUBB, 64)(carry, a, b, + return NIL_CO3_MP_JOIN(_subborrow_u, 64)(carry, a, b, reinterpret_cast(p_result)); } @@ -68,13 +39,13 @@ 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(NIL_CO3_MP_ADDC, 32)(carry, a, b, + return NIL_CO3_MP_JOIN(_addcarry_u, 32)(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(NIL_CO3_MP_SUBB, 32)(carry, a, b, + return NIL_CO3_MP_JOIN(_subborrow_u, 32)(carry, a, b, reinterpret_cast(p_result)); } 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 new file mode 100644 index 0000000000..8841175bc5 --- /dev/null +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/detail/type_traits.hpp @@ -0,0 +1,27 @@ +#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::invalid_argument("nonnegative value expected"); + } + return static_cast>(a); + } +} // namespace nil::crypto3::multiprecision::detail diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/integer.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/integer.hpp index 07cce6f89a..8225fdf3a2 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/integer.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/integer.hpp @@ -1,4 +1,4 @@ #pragma once -#include "nil/crypto3/multiprecision/integer_ops_base.hpp" // IWYU pragma: export -#include "nil/crypto3/multiprecision/integer_ops_powm.hpp" // IWYU pragma: export \ No newline at end of file +#include "nil/crypto3/multiprecision/detail/integer_ops_base.hpp" // IWYU pragma: export +#include "nil/crypto3/multiprecision/detail/integer_ops_powm.hpp" // IWYU pragma: export 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 59b9d3c7b0..555745e047 100644 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/miller_rabin.hpp +++ b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/miller_rabin.hpp @@ -5,16 +5,18 @@ #pragma once -#include #include #include +#include #include #include #include +#include + #include "nil/crypto3/multiprecision/big_uint.hpp" -#include "nil/crypto3/multiprecision/integer.hpp" #include "nil/crypto3/multiprecision/detail/assert.hpp" +#include "nil/crypto3/multiprecision/integer.hpp" namespace nil::crypto3::multiprecision { namespace detail { @@ -33,7 +35,9 @@ namespace nil::crypto3::multiprecision { for (std::size_t i = 0; i < sizeof(small_factors1) / sizeof(small_factors1[0]); ++i) { NIL_CO3_MP_ASSERT(pp1 % small_factors1[i] == 0); - if (m1 % small_factors1[i] == 0) return false; + if (m1 % small_factors1[i] == 0) { + return false; + } } constexpr std::uint32_t small_factors2[] = {29u, 31u, 37u, 41u, 43u, 47u}; @@ -43,7 +47,9 @@ namespace nil::crypto3::multiprecision { for (std::size_t i = 0; i < sizeof(small_factors2) / sizeof(small_factors2[0]); ++i) { NIL_CO3_MP_ASSERT(pp2 % small_factors2[i] == 0); - if (m1 % small_factors2[i] == 0) return false; + if (m1 % small_factors2[i] == 0) { + return false; + } } constexpr std::uint32_t small_factors3[] = {53u, 59u, 61u, 67u, 71u}; @@ -53,7 +59,9 @@ namespace nil::crypto3::multiprecision { for (std::size_t i = 0; i < sizeof(small_factors3) / sizeof(small_factors3[0]); ++i) { NIL_CO3_MP_ASSERT(pp3 % small_factors3[i] == 0); - if (m1 % small_factors3[i] == 0) return false; + if (m1 % small_factors3[i] == 0) { + return false; + } } constexpr std::uint32_t small_factors4[] = {73u, 79u, 83u, 89u, 97u}; @@ -63,7 +71,9 @@ namespace nil::crypto3::multiprecision { for (std::size_t i = 0; i < sizeof(small_factors4) / sizeof(small_factors4[0]); ++i) { NIL_CO3_MP_ASSERT(pp4 % small_factors4[i] == 0); - if (m1 % small_factors4[i] == 0) return false; + if (m1 % small_factors4[i] == 0) { + return false; + } } constexpr std::uint32_t small_factors5[6][4] = { @@ -76,12 +86,14 @@ namespace nil::crypto3::multiprecision { 181u * 191u * 193u * 197u, 199u * 211u * 223u * 227u}; - for (std::size_t k = 0; k < sizeof(pp5) / sizeof(*pp5); ++k) { + for (std::size_t k = 0; k < std::size(pp5); ++k) { 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); - if (m1 % small_factors5[k][i] == 0) return false; + if (m1 % small_factors5[k][i] == 0) { + return false; + } } } return true; @@ -93,8 +105,10 @@ namespace nil::crypto3::multiprecision { 43u, 47u, 53u, 59u, 61u, 67u, 71u, 73u, 79u, 83u, 89u, 97u, 101u, 103u, 107u, 109u, 113u, 127u, 131u, 137u, 139u, 149u, 151u, 157u, 163u, 167u, 173u, 179u, 181u, 191u, 193u, 197u, 199u, 211u, 223u, 227u}; - for (std::size_t i = 0; i < sizeof(p) / sizeof(*p); ++i) { - if (n == p[i]) return true; + for (std::size_t i = 0; i < std::size(p); ++i) { + if (n == p[i]) { + return true; + } } return false; } @@ -105,27 +119,37 @@ namespace nil::crypto3::multiprecision { const I& n, std::size_t trials, Engine& gen) { using number_type = I; - if (n == 2) return true; // Trivial special case. - if (bit_test(n, 0) == 0) return false; // n is even - if (n <= 227) return detail::is_small_prime(static_cast(n)); + if (n == 2) { + return true; // Trivial special case. + } + if (bit_test(n, 0) == 0) { + return false; // n is even + } + if (n <= 227) { + return detail::is_small_prime(static_cast(n)); + } - if (!detail::check_small_factors(n)) return false; + if (!detail::check_small_factors(n)) { + return false; + } - number_type nm1 = n - 1; + number_type nm1 = n - 1u; // // Begin with a single Fermat test - it excludes a lot of candidates: // number_type q(228), x, y; // We know n is greater than this, as we've excluded small factors x = powm(q, nm1, n); - if (x != 1u) return false; + if (x != 1u) { + return false; + } - q = n - 1; + q = n - 1u; std::size_t k = lsb(q); q >>= k; // Declare our random number generator: - boost::random::uniform_int_distribution dist(2, n - 2); + boost::random::uniform_int_distribution dist(2u, n - 2u); // // Execute the trials: @@ -135,12 +159,18 @@ namespace nil::crypto3::multiprecision { y = powm(x, q, n); std::size_t j = 0; while (true) { - if (y == nm1) break; + if (y == nm1) { + break; + } if (y == 1) { - if (j == 0) break; + if (j == 0) { + break; + } return false; // test failed } - if (++j == k) return false; // failed + if (++j == k) { + return false; // failed + } y = powm(y, 2, n); } } diff --git a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/modular/big_mod_impl.hpp b/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/modular/big_mod_impl.hpp deleted file mode 100644 index 1e4c108447..0000000000 --- a/crypto3/libs/multiprecision/include/nil/crypto3/multiprecision/modular/big_mod_impl.hpp +++ /dev/null @@ -1,397 +0,0 @@ -//---------------------------------------------------------------------------// -// 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 "nil/crypto3/multiprecision/big_mod.hpp" - -#include -#include -#include -#include -#include -#include -#include - -#include "nil/crypto3/multiprecision/big_uint_impl.hpp" -#include "nil/crypto3/multiprecision/detail/assert.hpp" -#include "nil/crypto3/multiprecision/integer_ops_base.hpp" // IWYU pragma: keep (used for is_zero) -#include "nil/crypto3/multiprecision/modular/modular_ops.hpp" -#include "nil/crypto3/multiprecision/modular/modular_ops_storage.hpp" - -namespace nil::crypto3::multiprecision { - namespace detail { - template - class big_mod_impl { - public: - static constexpr std::size_t Bits = Bits_; - using big_uint_t = big_uint; - using modular_ops_storage_t = modular_ops_storage_t_; - using modular_ops_t = typename modular_ops_storage_t::modular_ops_t; - - // Constructors - - protected: - template - constexpr big_mod_impl(const T& b, const modular_ops_storage_t& modular_ops_storage) - : m_modular_ops_storage(modular_ops_storage) { - if (!nil::crypto3::multiprecision::is_zero(b)) { - init_raw_base(m_raw_base, b, ops()); - } - } - - constexpr big_mod_impl(const modular_ops_storage_t& modular_ops_storage) - : m_modular_ops_storage(modular_ops_storage) { - // NB: m_raw_base is initialized to zero, this is correct for Montgomery form too - } - - public: - // Components - - constexpr big_uint_t base() const { - big_uint_t result; - ops().adjust_regular(result, m_raw_base); - return result; - } - - constexpr const big_uint_t& mod() const { return ops().mod(); } - - explicit constexpr operator big_uint_t() const { return base(); } - - explicit constexpr operator bool() const { return !is_zero(); } - - // String conversion - - constexpr std::string str( - std::ios_base::fmtflags flags = std::ios_base::hex | std::ios_base::showbase | - std::ios_base::uppercase) const { - return base().str(flags); - } - - // Mathemetical operations - - constexpr void negate() { ops().negate(m_raw_base); } - - // 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; } - - constexpr const auto& ops_storage() const { return m_modular_ops_storage; } - constexpr const auto& ops() const { return m_modular_ops_storage.ops(); } - - protected: - modular_ops_storage_t m_modular_ops_storage; - big_uint_t m_raw_base; - }; - } // namespace detail - - template typename modular_ops_template> - struct big_mod_ct_impl : public detail::big_mod_impl< - std::decay_t::Bits, - detail::modular_ops_storage_ct> { - using base_type = - detail::big_mod_impl::Bits, - detail::modular_ops_storage_ct>; - - using typename base_type::big_uint_t; - using typename base_type::modular_ops_storage_t; - using typename base_type::modular_ops_t; - - constexpr big_mod_ct_impl() : base_type({}) {} - - template, int> = 0> - constexpr big_mod_ct_impl(const T& b) : base_type(b, {}) {} - - // For generic code - - constexpr big_mod_ct_impl(const modular_ops_storage_t& ops_storage) - : base_type(ops_storage) {} - - template, int> = 0> - constexpr big_mod_ct_impl(const T& b, const modular_ops_storage_t& ops_storage) - : base_type(b, ops_storage) {} - }; - - template typename modular_ops_template> - struct big_mod_rt_impl - : public detail::big_mod_impl> { - using base_type = - detail::big_mod_impl>; - - using typename base_type::big_uint_t; - using typename base_type::modular_ops_storage_t; - using typename base_type::modular_ops_t; - - template, int> = 0> - constexpr big_mod_rt_impl(const T& m) : base_type(m) {} - - template && detail::is_integral_v, int> = 0> - constexpr big_mod_rt_impl(const T1& b, const T2& m) : base_type(b, m) {} - - // For generic code - - constexpr big_mod_rt_impl(const modular_ops_storage_t& ops_storage) - : base_type(ops_storage) {} - - template, int> = 0> - constexpr big_mod_rt_impl(const T& b, const modular_ops_storage_t& ops_storage) - : base_type(b, ops_storage) {} - }; - - namespace detail { - template - constexpr bool is_big_mod_v = false; - - template typename modular_ops_storage_t> - constexpr bool is_big_mod_v> = true; - - template typename modular_ops_storage_t> - constexpr bool is_big_mod_v> = true; - - template - constexpr bool is_modular_integral_v = - std::is_integral_v || detail::is_big_uint_v || is_big_mod_v; - - template, int> = 0> - constexpr std::size_t get_bits() { - return T::Bits; - } - - template, int> = 0> - typename modular_ops_t::big_uint_t convert_to_raw_base(const S& s, - const modular_ops_t& ops) { - if (nil::crypto3::multiprecision::is_zero(s)) { - return typename modular_ops_t::big_uint_t{}; - } - typename modular_ops_t::big_uint_t result; - init_raw_base(result, s, ops); - return result; - } - - template, int> = 0> - constexpr typename T::big_uint_t convert_to_raw_base( - const T& s, const typename T::modular_ops_t& /*ops*/) { - return s.raw_base(); - } - - template - constexpr void assert_equal_ops_in_operands(const T1& a, const T2& b) { - if constexpr (detail::is_big_mod_v && detail::is_big_mod_v) { - NIL_CO3_MP_ASSERT(a.ops().compare_eq(b.ops())); - } - } - - template - constexpr const auto& get_ops_storage_from_operands(const T1& a, const T2& b) { - assert_equal_ops_in_operands(a, b); - if constexpr (detail::is_big_mod_v) { - return a.ops_storage(); - } else if constexpr (detail::is_big_mod_v) { - return b.ops_storage(); - } else { - static_assert(false, "none of the types are big_mod"); - } - } - - template - constexpr bool are_valid_operand_types() { - if (detail::is_big_mod_v && detail::is_big_mod_v) { - return std::is_same_v; - } - return detail::is_modular_integral_v && detail::is_modular_integral_v && - (detail::is_big_mod_v || detail::is_big_mod_v); - } - } // namespace detail - - // Comparison - -#define NIL_CO3_MP_MODULAR_BIG_UINT_COMPARISON_IMPL(OP_) \ - template(), int> = 0> \ - constexpr bool operator OP_(const T1& a, const T2& b) noexcept { \ - const auto& ops_storage = detail::get_ops_storage_from_operands(a, b); \ - return detail::convert_to_raw_base(a, ops_storage.ops()) \ - OP_ detail::convert_to_raw_base(b, ops_storage.ops()); \ - } - - NIL_CO3_MP_MODULAR_BIG_UINT_COMPARISON_IMPL(==) - NIL_CO3_MP_MODULAR_BIG_UINT_COMPARISON_IMPL(!=) - // TODO(ioxid) remove these - NIL_CO3_MP_MODULAR_BIG_UINT_COMPARISON_IMPL(<) - NIL_CO3_MP_MODULAR_BIG_UINT_COMPARISON_IMPL(<=) - NIL_CO3_MP_MODULAR_BIG_UINT_COMPARISON_IMPL(>) - NIL_CO3_MP_MODULAR_BIG_UINT_COMPARISON_IMPL(>=) - -#undef NIL_CO3_MP_MODULAR_BIG_UINT_COMPARISON_IMPL - - // Arithmetic operations - -#define NIL_CO3_MP_MODULAR_BIG_UINT_OPERATOR_IMPL(OP_, OP_ASSIGN_, METHOD_) \ - template(), int> = 0, \ - typename big_mod_t = std::conditional_t, T1, T2>> \ - constexpr auto operator OP_(const T1& a, const T2& b) noexcept { \ - const auto& ops_storage = detail::get_ops_storage_from_operands(a, b); \ - big_mod_t result(ops_storage); \ - result.raw_base() = detail::convert_to_raw_base(a, ops_storage.ops()); \ - ops_storage.ops().METHOD_(result.raw_base(), \ - detail::convert_to_raw_base(b, ops_storage.ops())); \ - return result; \ - } \ - template && \ - (std::is_same_v || detail::is_integral_v), \ - int> = 0> \ - constexpr auto& operator OP_ASSIGN_(big_mod_t & a, const T & b) noexcept { \ - detail::assert_equal_ops_in_operands(a, b); \ - a.ops().METHOD_(a.raw_base(), detail::convert_to_raw_base(b, a.ops())); \ - return a; \ - } - -#define NIL_CO3_MP_MODULAR_BIG_UINT_UNARY_TEMPLATE \ - template, int> = 0> - - NIL_CO3_MP_MODULAR_BIG_UINT_OPERATOR_IMPL(+, +=, add) - - NIL_CO3_MP_MODULAR_BIG_UINT_UNARY_TEMPLATE - constexpr auto& operator++(big_mod_t& a) noexcept { - a.ops().increment(a.raw_base()); - return a; - } - - NIL_CO3_MP_MODULAR_BIG_UINT_UNARY_TEMPLATE - constexpr auto operator++(big_mod_t& a, int) noexcept { - auto copy = a; - ++a; - return copy; - } - - NIL_CO3_MP_MODULAR_BIG_UINT_UNARY_TEMPLATE - constexpr auto operator+(const big_mod_t& a) noexcept { return a; } - - NIL_CO3_MP_MODULAR_BIG_UINT_OPERATOR_IMPL(-, -=, subtract) - - NIL_CO3_MP_MODULAR_BIG_UINT_UNARY_TEMPLATE - constexpr auto& operator--(big_mod_t& a) noexcept { - a.ops().decrement(a.raw_base()); - return a; - } - - NIL_CO3_MP_MODULAR_BIG_UINT_UNARY_TEMPLATE - constexpr auto operator--(big_mod_t& a, int) noexcept { - auto copy = a; - --a; - return copy; - } - - NIL_CO3_MP_MODULAR_BIG_UINT_UNARY_TEMPLATE - constexpr big_mod_t operator-(const big_mod_t& a) noexcept { - big_mod_t result = a; - result.negate(); - return result; - } - - NIL_CO3_MP_MODULAR_BIG_UINT_OPERATOR_IMPL(*, *=, mul) - -#undef NIL_CO3_MP_MODULAR_BIG_UINT_UNARY_TEMPLATE -#undef NIL_CO3_MP_MODULAR_BIG_UINT_OPERATOR_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; - } - - // IO - - template, int> = 0> - std::ostream& operator<<(std::ostream& os, const T& value) { - os << value.str(os.flags()); - return os; - } - - // Common ops - - template, int> = 0> - constexpr bool is_zero(const big_mod_t& a) { - return a.is_zero(); - } - - // Actual big integer modular types - - // Montgomery modular big integer type with compile-time modulus. Modulus should be a static - // big_uint constant. - template - using montgomery_big_mod = big_mod_ct_impl; - - // Montgomery modular big integer type with runtime modulus. - template - using montgomery_big_mod_rt = big_mod_rt_impl; - - // Simple modular big integer type with compile-time modulus. Modulus should be a static - // big_uint constant. Uses barret optimizations. - template - using big_mod = big_mod_ct_impl; - - // Simple modular big integer type with runtime modulus. Uses barret optimizations. - template - using big_mod_rt = big_mod_rt_impl; - - // Modular big integer type with compile-time modulus, which automatically uses montomery form - // whenever possible (i.e. for odd moduli). Modulus should be a static big_uint constant. - template - using auto_big_mod = std::conditional_t, big_mod>; -} // namespace nil::crypto3::multiprecision - -// std::hash specializations - -template typename modular_ops_template> -struct std::hash> { - std::size_t operator()( - const nil::crypto3::multiprecision::big_mod_ct_impl& a) - const noexcept { - return boost::hash< - nil::crypto3::multiprecision::big_mod_ct_impl>{}(a); - } -}; - -template typename modular_ops_template> -struct std::hash> { - std::size_t operator()( - const nil::crypto3::multiprecision::big_mod_rt_impl& a) - const noexcept { - return boost::hash< - nil::crypto3::multiprecision::big_mod_rt_impl>{}(a); - } -}; diff --git a/crypto3/libs/multiprecision/test/CMakeLists.txt b/crypto3/libs/multiprecision/test/CMakeLists.txt index 6aaeb9cbf2..155a181b1f 100644 --- a/crypto3/libs/multiprecision/test/CMakeLists.txt +++ b/crypto3/libs/multiprecision/test/CMakeLists.txt @@ -72,8 +72,7 @@ set(MODULAR_TESTS_NAMES set(BIG_INT_TESTS_NAMES "big_int" - "big_int_comparision" - "big_int_cpp_int_conversions" + "big_int_comparison" "big_int_inverse" "big_int_jacobi" "big_int_miller_rabin" diff --git a/crypto3/libs/multiprecision/test/big_int.cpp b/crypto3/libs/multiprecision/test/big_int.cpp index 75b7ef2e2d..b4403f4ee2 100644 --- a/crypto3/libs/multiprecision/test/big_int.cpp +++ b/crypto3/libs/multiprecision/test/big_int.cpp @@ -45,9 +45,13 @@ BOOST_AUTO_TEST_CASE(to_string_decimal_zero) { BOOST_CHECK_EQUAL((0x0_big_uint60).str(std::ios_base::dec), "0"); } -BOOST_AUTO_TEST_CASE(to_string_decimal_trivial) { BOOST_CHECK_EQUAL((0x1_big_uint60).str(std::ios_base::dec), "1"); } +BOOST_AUTO_TEST_CASE(to_string_decimal_trivial) { + BOOST_CHECK_EQUAL((0x1_big_uint60).str(std::ios_base::dec), "1"); +} -BOOST_AUTO_TEST_CASE(to_string_decimal_small) { BOOST_CHECK_EQUAL((0x20_big_uint60).str(std::ios_base::dec), "32"); } +BOOST_AUTO_TEST_CASE(to_string_decimal_small) { + BOOST_CHECK_EQUAL((0x20_big_uint60).str(std::ios_base::dec), "32"); +} BOOST_AUTO_TEST_CASE(to_string_decimal_medium) { constexpr auto a = 0x123456789ABCDEF1234321_big_uint85; @@ -56,18 +60,19 @@ BOOST_AUTO_TEST_CASE(to_string_decimal_medium) { BOOST_AUTO_TEST_CASE(to_string_decimal_big) { constexpr auto a = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001_big_uint224; - BOOST_CHECK_EQUAL(a.str(std::ios_base::dec), "26959946667150639794667015087019630673557916260026308143510066298881"); + BOOST_CHECK_EQUAL(a.str(std::ios_base::dec), + "26959946667150639794667015087019630673557916260026308143510066298881"); } BOOST_AUTO_TEST_CASE(ops) { nil::crypto3::multiprecision::big_uint<60> a = 2u, b; auto c1{a}; - auto c2{std::move(a)}; + auto c2{std::move(a)}; // NOLINT auto c3{2}; auto c4{2u}; b = a; - b = std::move(a); + b = std::move(a); // NOLINT b = 2; b = 2u; @@ -76,14 +81,14 @@ BOOST_AUTO_TEST_CASE(ops) { b = 32u; \ a = 4; \ b = a op a; \ - /* b = 2 op a; */ \ - /* b = a op 2; */ \ - /* b = 2u op a; */ \ - /* b = a op 2u; */ \ + b = 2 op a; \ + b = a op 2; \ + b = 2u op a; \ + b = a op 2u; \ b = 32u; \ b op## = a; \ - /* b op## = 2; */ \ - /*b op## = 2u; */ \ + b op## = 2; \ + b op## = 2u; \ } while (false) TEST_BINARY_OP(+); @@ -94,7 +99,7 @@ BOOST_AUTO_TEST_CASE(ops) { TEST_BINARY_OP(-); --b; b--; - // b = -b; + b = -b; TEST_BINARY_OP(%); TEST_BINARY_OP(/); @@ -103,6 +108,7 @@ BOOST_AUTO_TEST_CASE(ops) { TEST_BINARY_OP(&); TEST_BINARY_OP(|); TEST_BINARY_OP(^); +#undef TEST_BINARY_OP b = ~a; } @@ -175,13 +181,14 @@ BOOST_AUTO_TEST_CASE(multilimb) { BOOST_AUTO_TEST_CASE(failing) { BOOST_CHECK_EQUAL( - 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001_big_uint256 % 2, 1u); + 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001_big_uint256 % 2u, 1u); } BOOST_AUTO_TEST_CASE(failing2) { - BOOST_CHECK_EQUAL(0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001_big_uint256 % - 0x200000000_big_uint, - 0x100000001_big_uint); + BOOST_CHECK_EQUAL( + 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001_big_uint256 % + 0x200000000_big_uint, + 0x100000001_big_uint); } BOOST_AUTO_TEST_CASE(failing3) { @@ -215,3 +222,17 @@ BOOST_AUTO_TEST_CASE(from_int64_t) { } 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>; + constexpr standart_number x = + 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f_big_uint256; + short_number s = x.truncate<128>(); + // 2nd half of the number must stay. + BOOST_CHECK_EQUAL(s, 0xfffffffffffffffffffffffefffffc2f_big_uint128); +} + +BOOST_AUTO_TEST_SUITE_END() diff --git a/crypto3/libs/multiprecision/test/big_int_comparision.cpp b/crypto3/libs/multiprecision/test/big_int_comparision.cpp deleted file mode 100644 index 0d0ceef37c..0000000000 --- a/crypto3/libs/multiprecision/test/big_int_comparision.cpp +++ /dev/null @@ -1,74 +0,0 @@ -//---------------------------------------------------------------------------// -// Copyright (c) 2024 Martun Karapetyan -// -// 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_comparision_test - -#include -#include -#include -#include -#include - -// We need cpp_int to compare to it. -#include - -#include "nil/crypto3/multiprecision/big_uint.hpp" -#include "nil/crypto3/multiprecision/cpp_int_conversions.hpp" - -using namespace boost::multiprecision; - -using nil::crypto3::multiprecision::big_uint; -using nil::crypto3::multiprecision::to_cpp_int; -using nil::crypto3::multiprecision::unsigned_cpp_int_type; - -// This test case uses normal boost::cpp_int for comparison to our big_uint -template -void value_comparisons_tests(const big_uint& a, const big_uint& b) { - typedef big_uint Backend1; - typedef big_uint Backend2; - typedef unsigned_cpp_int_type cpp_int_number1; - typedef unsigned_cpp_int_type cpp_int_number2; - - // Convert from big_uint to cpp_int_backend numbers. - cpp_int_number1 a_cppint = to_cpp_int(a); - cpp_int_number2 b_cppint = to_cpp_int(b); - - BOOST_CHECK_EQUAL(a > b, a_cppint > b_cppint); - BOOST_CHECK_EQUAL(a >= b, a_cppint >= b_cppint); - BOOST_CHECK_EQUAL(a == b, a_cppint == b_cppint); - BOOST_CHECK_EQUAL(a < b, a_cppint < b_cppint); - BOOST_CHECK_EQUAL(a <= b, a_cppint <= b_cppint); - BOOST_CHECK_EQUAL(a != b, a_cppint != b_cppint); -} - -template -void value_comparisons_tests(const std::size_t N) { - using standard_number1 = big_uint; - using standard_number2 = big_uint; - - int seed = 0; - boost::random::mt19937 gen(seed); - boost::random::uniform_int_distribution d1; - boost::random::uniform_int_distribution d2; - - for (std::size_t i = 0; i < N; ++i) { - standard_number1 a = d1(gen); - standard_number2 b = d2(gen); - value_comparisons_tests(a, b); - } -} - -BOOST_AUTO_TEST_SUITE(static_tests) - -BOOST_AUTO_TEST_CASE(base_test_backend_12_17) { value_comparisons_tests<12, 17>(1000); } - -BOOST_AUTO_TEST_CASE(base_test_backend_260_130) { value_comparisons_tests<260, 130>(1000); } - -BOOST_AUTO_TEST_CASE(base_test_backend_128_256) { value_comparisons_tests<128, 256>(1000); } - -BOOST_AUTO_TEST_SUITE_END() diff --git a/crypto3/libs/multiprecision/test/big_int_comparison.cpp b/crypto3/libs/multiprecision/test/big_int_comparison.cpp new file mode 100644 index 0000000000..a3ad8a59f7 --- /dev/null +++ b/crypto3/libs/multiprecision/test/big_int_comparison.cpp @@ -0,0 +1,94 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2024 Martun Karapetyan +// +// 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_comparison_test + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include "nil/crypto3/multiprecision/big_uint.hpp" + +using namespace nil::crypto3::multiprecision; + +template +std::vector as_vector(const boost::property_tree::ptree &pt) { + std::vector r; + for (const auto &item : pt) { + r.push_back(item.second); + } + return r; +} + +template +auto test_dataset(const std::string &test_name) { + static std::string test_data = std::string(TEST_DATA_DIR) + R"(comparison.json)"; + boost::property_tree::ptree test_dataset; + boost::property_tree::read_json(test_data, test_dataset); + + return as_vector(test_dataset.get_child(test_name)); +} + +template +struct ComparisonSample { + ComparisonSample(const boost::property_tree::ptree &sample) : ptree(sample) { + a = sample.get("a"); + b = sample.get("b"); + cmp_a_b = sample.get("cmp_a_b"); + } + + friend std::ostream &operator<<(std::ostream &os, const ComparisonSample &sample) { + boost::property_tree::json_parser::write_json(os, sample.ptree); + return os; + } + + big_uint a; + big_uint b; + int cmp_a_b; + boost::property_tree::ptree ptree; +}; + +template +void test_comparison(const Sample &sample) { + const auto &a = sample.a; + const auto &b = sample.b; + const auto &cmp_a_b = sample.cmp_a_b; + BOOST_CHECK_EQUAL(a > b, cmp_a_b > 0); + BOOST_CHECK_EQUAL(a >= b, cmp_a_b >= 0); + BOOST_CHECK_EQUAL(a == b, cmp_a_b == 0); + BOOST_CHECK_EQUAL(a < b, cmp_a_b < 0); + BOOST_CHECK_EQUAL(a <= b, cmp_a_b <= 0); + BOOST_CHECK_EQUAL(a != b, cmp_a_b != 0); +} + +BOOST_AUTO_TEST_SUITE(fields_manual_tests) + +BOOST_DATA_TEST_CASE(test_comparison_12_17, + (test_dataset>("test_comparison_12_17"))) { + test_comparison(sample); +} + +BOOST_DATA_TEST_CASE(test_comparison_260_130, + (test_dataset>("test_comparison_260_130"))) { + test_comparison(sample); +} + +BOOST_DATA_TEST_CASE(test_comparison_128_256, + (test_dataset>("test_comparison_128_256"))) { + test_comparison(sample); +} + +BOOST_AUTO_TEST_SUITE_END() diff --git a/crypto3/libs/multiprecision/test/big_int_cpp_int_conversions.cpp b/crypto3/libs/multiprecision/test/big_int_cpp_int_conversions.cpp deleted file mode 100644 index 0c91d4fd28..0000000000 --- a/crypto3/libs/multiprecision/test/big_int_cpp_int_conversions.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#define BOOST_TEST_MODULE big_int_cpp_int_conversions_test - -#include - -#include "nil/crypto3/multiprecision/cpp_int_conversions.hpp" -#include "nil/crypto3/multiprecision/literals.hpp" - -NIL_CO3_MP_DEFINE_BIG_UINT_LITERAL(60) -BOOST_MP_DEFINE_SIZED_CPP_INT_LITERAL(60) - -using namespace nil::crypto3::multiprecision::literals; -using namespace boost::multiprecision::literals; - -BOOST_AUTO_TEST_SUITE(cpp_int_conversion) - -BOOST_AUTO_TEST_CASE(to_cpp_int) { - BOOST_CHECK_EQUAL(nil::crypto3::multiprecision::to_cpp_int(0xFFFFFFFFFFF_big_uint60).str(), - "17592186044415"); -} - -BOOST_AUTO_TEST_CASE(from_cpp_int) { - auto result = nil::crypto3::multiprecision::to_big_uint(0xFFFFFFFFFFF_cppui60); - BOOST_CHECK_EQUAL(result, 0xFFFFFFFFFFF_big_uint60); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/crypto3/libs/multiprecision/test/big_int_inverse.cpp b/crypto3/libs/multiprecision/test/big_int_inverse.cpp index 606f20c272..f73a359a69 100644 --- a/crypto3/libs/multiprecision/test/big_int_inverse.cpp +++ b/crypto3/libs/multiprecision/test/big_int_inverse.cpp @@ -10,13 +10,15 @@ #define BOOST_TEST_MODULE big_int_inverse_test +#include + #include #include #include +#include "nil/crypto3/multiprecision/big_mod.hpp" #include "nil/crypto3/multiprecision/big_uint.hpp" #include "nil/crypto3/multiprecision/literals.hpp" -#include "nil/crypto3/multiprecision/big_mod.hpp" using namespace nil::crypto3::multiprecision; @@ -41,13 +43,13 @@ void test_inverse_extended_euclidean_algorithm() { "00000000000000000000" "0000000000000000000000000")); BOOST_CHECK_EQUAL(inverse_extended_euclidean_algorithm(T(3), T(8)), T(3)); - BOOST_CHECK_EQUAL(inverse_extended_euclidean_algorithm(T(46), T(207)), T(0)); - BOOST_CHECK_EQUAL(inverse_extended_euclidean_algorithm(T(2), T(2)), T(0)); - BOOST_CHECK_EQUAL(inverse_extended_euclidean_algorithm(T(0), T(2)), T(0)); - BOOST_CHECK_EQUAL(inverse_extended_euclidean_algorithm(T(46), T(46)), T(0)); + 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_EQUAL(inverse_extended_euclidean_algorithm(T(37), T(37)), T(0)); + 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)); @@ -261,7 +263,7 @@ BOOST_AUTO_TEST_SUITE(runtime_tests) BOOST_AUTO_TEST_CASE(inverse_tests) { // test_monty_inverse>(); // test_inverse_mod>(); - // test_inverse_extended_euclidean_algorithm>(); + test_inverse_extended_euclidean_algorithm>(); } BOOST_AUTO_TEST_CASE(test_big_mod_6_bits) { diff --git a/crypto3/libs/multiprecision/test/big_int_modular.cpp b/crypto3/libs/multiprecision/test/big_int_modular.cpp index e8b57c5e65..112be3b04e 100644 --- a/crypto3/libs/multiprecision/test/big_int_modular.cpp +++ b/crypto3/libs/multiprecision/test/big_int_modular.cpp @@ -1,10 +1,13 @@ #define BOOST_TEST_MODULE big_int_modular_test -#include +#include #include -#include "nil/crypto3/multiprecision/literals.hpp" +#include + #include "nil/crypto3/multiprecision/big_mod.hpp" +#include "nil/crypto3/multiprecision/big_uint.hpp" +#include "nil/crypto3/multiprecision/literals.hpp" using namespace nil::crypto3::multiprecision; using namespace nil::crypto3::multiprecision::literals; @@ -71,24 +74,24 @@ BOOST_AUTO_TEST_CASE(ops) { big_mod_t a = 2u, b; auto c1{a}; - auto c2{std::move(a)}; + auto c2{std::move(a)}; // NOLINT auto c3{2}; auto c4{2u}; b = a; - b = std::move(a); + b = std::move(a); // NOLINT b = 2; b = 2u; #define TEST_BINARY_OP(op) \ do { \ b = a op a; \ - /* b = 2 op a; */ \ - /* b = a op 2; */ \ - /* b = 2u op a; */ \ - /* b = a op 2u; */ \ + b = 2 op a; \ + b = a op 2; \ + b = 2u op a; \ + b = a op 2u; \ b op## = a; \ - /* b op## = 2; */ \ - /*b op## = 2u; */ \ + b op## = 2; \ + b op## = 2u; \ } while (false) TEST_BINARY_OP(+); @@ -100,6 +103,8 @@ BOOST_AUTO_TEST_CASE(ops) { --b; b--; b = -b; + +#undef TEST_BINARY_OP } BOOST_AUTO_TEST_SUITE_END() @@ -107,8 +112,9 @@ BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE(addition) BOOST_AUTO_TEST_CASE(simple) { - BOOST_CHECK_EQUAL(static_cast(0x2_big_uint64) + static_cast(0x3_big_uint64), - static_cast(0x5_big_uint64)); + BOOST_CHECK_EQUAL( + static_cast(0x2_big_uint64) + static_cast(0x3_big_uint64), + static_cast(0x5_big_uint64)); } BOOST_AUTO_TEST_CASE(multilimb) { @@ -122,8 +128,9 @@ BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE(multiplication) BOOST_AUTO_TEST_CASE(simple) { - BOOST_CHECK_EQUAL(static_cast(0x2_big_uint64) * static_cast(0x3_big_uint64), - static_cast(0x6_big_uint64)); + BOOST_CHECK_EQUAL( + static_cast(0x2_big_uint64) * static_cast(0x3_big_uint64), + static_cast(0x6_big_uint64)); } BOOST_AUTO_TEST_CASE(multilimb) { @@ -133,7 +140,8 @@ BOOST_AUTO_TEST_CASE(multilimb) { } BOOST_AUTO_TEST_CASE(big) { - static constexpr auto mod = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001_big_uint224; + static constexpr auto mod = + 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001_big_uint224; big_mod a = 0xC5067EE5D80302E0561545A8467C6D5C98BC4D37672EB301C38CE9A9_big_uint224; big_mod b = 0xE632329C42040E595D127EB6889D22215DBE56F540425C705D6BF83_big_uint224; @@ -143,7 +151,8 @@ BOOST_AUTO_TEST_CASE(big) { } BOOST_AUTO_TEST_CASE(big_assign) { - static constexpr auto mod = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001_big_uint224; + static constexpr auto mod = + 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001_big_uint224; big_mod a = 0xC5067EE5D80302E0561545A8467C6D5C98BC4D37672EB301C38CE9A9_big_uint224; big_mod b = 0xE632329C42040E595D127EB6889D22215DBE56F540425C705D6BF83_big_uint224; @@ -156,22 +165,49 @@ BOOST_AUTO_TEST_CASE(big_assign) { BOOST_AUTO_TEST_SUITE_END() +BOOST_AUTO_TEST_SUITE(bugs) + +BOOST_AUTO_TEST_CASE(secp256k1_incorrect_multiplication) { + using standart_number = nil::crypto3::multiprecision::big_uint<256>; + using modular_number = nil::crypto3::multiprecision::montgomery_big_mod_rt<256>; + + constexpr standart_number modulus = + 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f_big_uint256; + constexpr standart_number x_standard = + 0xb5d724ce6f44c3c587867bbcb417e9eb6fa05e7e2ef029166568f14eb3161387_big_uint256; + constexpr standart_number res_standard = + 0xad6e1fcc680392abfb075838eafa513811112f14c593e0efacb6e9d0d7770b4_big_uint256; + constexpr modular_number x(x_standard, modulus); + constexpr modular_number res(res_standard, modulus); + BOOST_CHECK_EQUAL(x * x, res); +} + +BOOST_AUTO_TEST_CASE(bad_negation) { + using standart_number = nil::crypto3::multiprecision::big_uint<256>; + using modular_number = nil::crypto3::multiprecision::montgomery_big_mod_rt<256>; + + constexpr standart_number modulus = + 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f_big_uint256; + constexpr modular_number x(0u, modulus); + constexpr modular_number res = -x; + + BOOST_CHECK(res == 0u); + BOOST_CHECK(res == x); + BOOST_CHECK(-res == x); +} + +BOOST_AUTO_TEST_SUITE_END() + BOOST_AUTO_TEST_SUITE(convert) -// BOOST_AUTO_TEST_CASE(to_uint64_t) { -// std::uint64_t a = -// static_cast(static_cast(0x123456789ABCDEF_big_uint64)); -// BOOST_CHECK_EQUAL(a, 0x123456789ABCDEF); -// } - -// BOOST_AUTO_TEST_CASE(from_uint64_t) { -// big_mod_impl a = static_cast(0x123456789ABCDEFull); -// BOOST_CHECK_EQUAL(a, static_cast(0x123456789ABCDEF_big_uint64)); -// } - -// BOOST_AUTO_TEST_CASE(from_int64_t) { -// big_mod_impl a = static_cast(0x123456789ABCDEFull); -// BOOST_CHECK_EQUAL(a, static_cast(0x123456789ABCDEF_big_uint64)); -// } +BOOST_AUTO_TEST_CASE(from_uint64_t) { + big_mod_t a = static_cast(0x123456789ABCDEFull); + BOOST_CHECK_EQUAL(a, static_cast(0x123456789ABCDEF_big_uint64)); +} + +BOOST_AUTO_TEST_CASE(from_int64_t) { + big_mod_t a = static_cast(0x123456789ABCDEFull); + BOOST_CHECK_EQUAL(a, static_cast(0x123456789ABCDEF_big_uint64)); +} BOOST_AUTO_TEST_SUITE_END() diff --git a/crypto3/libs/multiprecision/test/big_int_modular_comprehensive.cpp b/crypto3/libs/multiprecision/test/big_int_modular_comprehensive.cpp index f1e14d4410..8395391b3e 100644 --- a/crypto3/libs/multiprecision/test/big_int_modular_comprehensive.cpp +++ b/crypto3/libs/multiprecision/test/big_int_modular_comprehensive.cpp @@ -10,497 +10,124 @@ #define BOOST_TEST_MODULE big_int_modular_comprehensive_test -#include -#include #include +#include +#include +#include +#include +#include + +#include +#include +#include -// We need cpp_int to compare to it. -#include +#include +#include -#include "nil/crypto3/multiprecision/big_uint.hpp" -#include "nil/crypto3/multiprecision/cpp_int_conversions.hpp" -#include "nil/crypto3/multiprecision/literals.hpp" #include "nil/crypto3/multiprecision/big_mod.hpp" +#include "nil/crypto3/multiprecision/big_uint.hpp" -using namespace nil::crypto3::multiprecision::literals; - -enum test_set_enum : std::size_t { - mod_e, - a_e, - b_e, - // a_add_b_e, a_sub_b_e, a_mul_b_e, a_div_b_e, a_mod_b_e, a_pow_b_e, - test_set_len -}; - -template -constexpr void pow_test(const big_uint_t& a, const big_uint_t& b, const big_uint_t& m) { - typedef nil::crypto3::multiprecision::big_mod_rt modular_number; - typedef nil::crypto3::multiprecision::unsigned_cpp_int_type standard_number; - - modular_number a_m(a, m); - modular_number b_m(b, m); - - standard_number a_cppint = to_cpp_int(a); - standard_number b_cppint = to_cpp_int(b); - standard_number m_cppint = to_cpp_int(m); +using namespace nil::crypto3::multiprecision; - standard_number a_powm_b = powm(a_cppint, b_cppint, m_cppint); - // pow could be used only with modular_numbers - // modular_number a_m_pow_b_m = pow(a_m, b_m); - // powm could be used with mixed types - // modular_number a_m_powm_b_m = powm(a_m, b_m); - modular_number a_m_powm_b = pow(a_m, b); - // BOOST_ASSERT_MSG(standard_number(to_cpp_int(a_m_powm_b_m)) == a_powm_b, "powm error"); - BOOST_ASSERT_MSG(to_cpp_int(a_m_powm_b.base()) == a_powm_b, "powm error"); +template +std::vector as_vector(const boost::property_tree::ptree &pt) { + std::vector r; + for (const auto &item : pt) { + r.push_back(item.second); + } + return r; } -template -bool base_operations_test(std::array test_set) { - typedef - typename nil::crypto3::multiprecision::unsigned_cpp_int_type::backend_type - CppIntBackend; - - typedef nil::crypto3::multiprecision::big_uint Backend_doubled; - typedef typename boost::multiprecision::default_ops::double_precision_type::type - CppIntBackend_doubled; - typedef nil::crypto3::multiprecision::big_mod_rt modular_number; - typedef boost::multiprecision::number standard_number; - typedef boost::multiprecision::number dbl_standard_number; - - // Convert from cpp_int_modular_backend to cpp_int_backend numbers. - standard_number a_cppint = to_cpp_int(test_set[a_e]); - standard_number b_cppint = to_cpp_int(test_set[b_e]); - standard_number e_cppint = to_cpp_int(test_set[mod_e]); - - dbl_standard_number a_add_b_s = - (static_cast(a_cppint) + static_cast(b_cppint)) % - e_cppint; - dbl_standard_number a_sub_b_s = (static_cast(a_cppint) - - static_cast(b_cppint) + e_cppint) % - e_cppint; - dbl_standard_number a_mul_b_s = - (static_cast(a_cppint) * static_cast(b_cppint)) % - e_cppint; - // dbl_standard_number a_mod_b_s = - // (static_cast(a_cppint) % static_cast(b_cppint)) - // % e_cppint; - // standard_number a_and_b_s = (a_cppint & b_cppint) % e_cppint; - // standard_number a_or_b_s = (a_cppint | b_cppint) % e_cppint; - // standard_number a_xor_b_s = (a_cppint ^ b_cppint) % e_cppint; - standard_number a_powm_b_s = powm(a_cppint, b_cppint, e_cppint); - // standard_number a_bit_set_s = a_cppint; - // bit_set(a_bit_set_s, 1); - // a_bit_set_s %= e_cppint; - // standard_number a_bit_unset_s = a_cppint; - // a_bit_unset_s %= e_cppint; - // bit_unset(a_bit_unset_s, 2); - // standard_number a_bit_flip_s = a_cppint; - // bit_flip(a_bit_flip_s, 3); - // a_bit_flip_s %= e_cppint; +template +auto test_dataset(const std::string &test_name) { + static std::string test_data = std::string(TEST_DATA_DIR) + R"(modular_comprehensive.json)"; + boost::property_tree::ptree test_dataset; + boost::property_tree::read_json(test_data, test_dataset); - // int b_msb_s = msb(b_cppint); - // int b_lsb_s = lsb(b_cppint); - - modular_number a(test_set[a_e], test_set[mod_e]); - modular_number b(test_set[b_e], test_set[mod_e]); + return as_vector(test_dataset.get_child(test_name)); +} - modular_number a_add_b = a + b; - modular_number a_sub_b = a - b; - modular_number a_mul_b = a * b; - // modular_number a_and_b = a & b; - // modular_number a_or_b = a | b; - // modular_number a_xor_b = a ^ b; - modular_number a_powm_b = pow(a, b.base()); - // modular_number a_bit_set = a; - // bit_set(a_bit_set, 1); - // modular_number a_bit_unset = a; - // bit_unset(a_bit_unset, 2); - // modular_number a_bit_flip = a; - // bit_flip(a_bit_flip, 3); +template +struct ModularComprehensiveSample { + ModularComprehensiveSample(const boost::property_tree::ptree &sample) : ptree(sample) { + a = sample.get("a"); + b = sample.get("b"); + m = sample.get("m"); + a_m_add_b_m = sample.get("a_m_add_b_m"); + a_m_sub_b_m = sample.get("a_m_sub_b_m"); + a_m_mul_b_m = sample.get("a_m_mul_b_m"); + a_eq_b = sample.get("a_eq_b"); + 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"); + } + } - // int b_msb = msb(b); - // int b_lsb = lsb(b); + friend std::ostream &operator<<(std::ostream &os, const ModularComprehensiveSample &sample) { + boost::property_tree::json_parser::write_json(os, sample.ptree); + return os; + } - // We cannot use convert_to here, because there's a bug inside boost, convert_to is constexpr, - // but it calls function generic_interconvert which is not. - BOOST_ASSERT_MSG(to_cpp_int(a_add_b.base()) == a_add_b_s, "addition error"); - BOOST_ASSERT_MSG(to_cpp_int(a_sub_b.base()) == a_sub_b_s, "subtraction error"); - BOOST_ASSERT_MSG(to_cpp_int(a_mul_b.base()) == a_mul_b_s, "multiplication error"); + big_uint a; + big_uint b; + big_uint m; + big_uint a_m_add_b_m; + big_uint a_m_sub_b_m; + big_uint a_m_mul_b_m; + bool a_eq_b; + big_uint a_m_pow_b; - // BOOST_ASSERT_MSG((a > b) == (a_cppint > b_cppint), "g error"); - // BOOST_ASSERT_MSG((a >= b) == (a_cppint >= b_cppint), "ge error"); - BOOST_ASSERT_MSG((a == b) == (a_cppint == b_cppint), "e error"); - // BOOST_ASSERT_MSG((a < b) == (a_cppint < b_cppint), "l error"); - // BOOST_ASSERT_MSG((a <= b) == (a_cppint <= b_cppint), "le error"); - BOOST_ASSERT_MSG((a != b) == (a_cppint != b_cppint), "ne error"); + boost::property_tree::ptree ptree; +}; - // BOOST_ASSERT_MSG(standard_number(to_cpp_int(a_and_b)) == a_and_b_s, "and error"); - // BOOST_ASSERT_MSG(standard_number(to_cpp_int(a_or_b)) == a_or_b_s, "or error"); - // BOOST_ASSERT_MSG(standard_number(to_cpp_int(a_xor_b)) == a_xor_b_s, "xor error"); +template +void base_operations_test(const ModularComprehensiveSample sample) { + using modular_number = + std::conditional_t, big_mod_rt>; - BOOST_ASSERT_MSG(to_cpp_int(a_powm_b.base()) == a_powm_b_s, "powm error"); - pow_test(test_set[a_e], test_set[b_e], test_set[mod_e]); + const auto &a = sample.a; + const auto &b = sample.b; + const auto &m = sample.m; - // BOOST_ASSERT_MSG(standard_number(to_cpp_int(a_bit_set)) == a_bit_set_s, "bit set error"); - // BOOST_ASSERT_MSG(standard_number(to_cpp_int(a_bit_unset)) == a_bit_unset_s, "bit unset - // error"); BOOST_ASSERT_MSG(standard_number(to_cpp_int(a_bit_flip)) == a_bit_flip_s, "bit flip - // error"); + modular_number a_m(a, m); + modular_number b_m(b, m); - // BOOST_ASSERT_MSG(b_msb_s == b_msb, "msb error"); - // BOOST_ASSERT_MSG(b_lsb_s == b_lsb, "lsb error"); + BOOST_CHECK_EQUAL(a_m + b_m, sample.a_m_add_b_m); + BOOST_CHECK_EQUAL(a_m - b_m, sample.a_m_sub_b_m); + BOOST_CHECK_EQUAL(a_m * b_m, sample.a_m_mul_b_m); - return true; -} + BOOST_CHECK_EQUAL(a_m == b_m, sample.a_eq_b); + BOOST_CHECK_EQUAL(a_m != b_m, !sample.a_eq_b); -template -bool base_operations_test(const std::array, N>& test_data) { - for (const auto& test_set : test_data) { - base_operations_test(test_set); - } - return true; + BOOST_CHECK_EQUAL(pow(a_m, b), sample.a_m_pow_b); } -BOOST_AUTO_TEST_SUITE(static_tests) +BOOST_AUTO_TEST_SUITE(base_operations) -BOOST_AUTO_TEST_CASE(base_ops_prime_mod_backend_130) { - using standard_number = nil::crypto3::multiprecision::big_uint<130>; - using test_set = std::array; - using test_data_t = std::array; - constexpr test_data_t test_data = {{ - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x1902d38b6904893e90b9c5b8732d1f37d_big_uint130, - 0x2b9060b88dea177d5213deb6f3794434_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x20de70b3f1426ef30b2b2c85d75e2ff2a_big_uint130, - 0x1a50227dc3bd742a232db8798e16d1fbb_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x2395c23e8da249dec864da20301b1b64a_big_uint130, - 0xdf185b46a84f318f34160415cc2cc010_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x43c06149ee7c03529dc8a03d091b4e94_big_uint130, - 0x310216180d322187af2c938af5a1ce59_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x26352a54193fd97c1b30ba3e4f624abf3_big_uint130, - 0x271cc74f6ca6cb859a1c1420922eb29ae_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x55cc328d5cc8b9d3362664a61c49d05_big_uint130, - 0x203c88f7c00196a19ca13f3956d823cf9_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x2b7b43b1d5e1d838e06ac851dd57c2921_big_uint130, - 0x1c3e4586b67511bdc48a424ab7934f3e2_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x71bff3e8b1dca8851adc38f3f7949f15_big_uint130, - 0x1aa747f949397fd5dd7c8651e8150552_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x1a2ce759cfc6960d663313054f1bb102f_big_uint130, - 0xc7a66c97d85f5662ffeebbb953476196_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x29e2517b6b554a879c74e8c4e0516f177_big_uint130, - 0x1f1218f45001011d29934c8cf15c52970_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x24633cbd7c7bfc5f2bd53ee68d61c35d2_big_uint130, - 0x144cedf22adfea125bb43d0be11ca1d0c_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0xfa48dc5dd7b4b1489220e933791b4338_big_uint130, - 0x2b234e335952ad1681afa214a74622526_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x15b8a80d1056036fb5b43afa7acf2fba1_big_uint130, - 0x20100f6e5147f7eae0dd456dcb21a8b57_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x11ad3e87c291c9ee81d50b80086315fff_big_uint130, - 0x21f4e281ab8da64819ab4c2311bb5b18e_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x1cac9e60c8ba9fe1dd02a72bd7f302986_big_uint130, - 0x1ca1068fbfa3b573d8f1f189dd5747a16_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x1ed35770d0d86801f43eeb651aff88be9_big_uint130, - 0x1906ec17bd1c75f7427c8c94bd7d1baa8_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x159635b82f84b811c9dd90d5cb6b178b_big_uint130, - 0x140f2dea986ddcb181072cb9211f57a8d_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x27d6f0f737bacbce899e43dc682b5624d_big_uint130, - 0x1011587e1de922107a18d7b925c77dd54_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x280f4c62adaa0ffd674affb50fe2e1695_big_uint130, - 0x1d094e72b514dcbf1c711fdcf3e53cb8_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x6e5882e4497adbf5bb25efec29dfc7d8_big_uint130, - 0x1a842e4abcdeedbc8abc583f41e46b125_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0xdf8e9c5a1aef9fb8a84c47e4c13a8e32_big_uint130, - 0x1a60dcd50617841662e100abea05666b4_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x1f80459133a5f8b5049a346d931edca2e_big_uint130, - 0x130fe586a5ec4e0045a6e16c4ebac2486_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x1f284be48f9037159abfc1c11bd1e06e6_big_uint130, - 0x31251cfead95629cb37cf61595785efa6_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x63766cb772cbaf3e4dfedffb2af6f181_big_uint130, - 0x311d5240457feecb26f8c0e214a1bca75_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x2ce5755bfe84b7cb37503711fe5585523_big_uint130, - 0x1f028047ad558bd3208927b6644ae2ab9_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x2bee37fdda5691f95381d391f9194f3f_big_uint130, - 0xcbba87247175168e5d40dfb270b3427a_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x9bff8375de0961c15151ff7bc1c97589_big_uint130, - 0x4ccf8b525bf3db5773680b031b007029_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x2b861409455060d7b6a5e1d5f6c652548_big_uint130, - 0x220fdc8a8d41a6ef2b2c0a1ec4569300b_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x239d57e467841c5247327e4eaa8d001f8_big_uint130, - 0x10dfd3fb5b333abdaf5529542ce52b843_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x8c555f62b02b7f2c94987bd4e0c400a4_big_uint130, - 0x326eaaaa17ba3ffef1b2622038e4277a_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x2b7199f47c784514517cb65fbc3681820_big_uint130, - 0x53368a9f4b547e43867c3b0fbbb55ba0_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x1c867f8a6c7f7ba691baba7c34c8972c0_big_uint130, - 0x18a36d27f551b90f3b70990c02be4040f_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0xe08f32c086174483eb5c0fd194284789_big_uint130, - 0x232cee45b9fafa3dd99b916f0da6b5b9f_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x2fa93bf0d7dcdd1d2490b228602c11bc4_big_uint130, - 0x313e75ddb32849fc2f920b7dac0784b8e_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0xfa23f38fe8ee768390a947885b402fbb_big_uint130, - 0x1ed41f3daece99382858b91eb9341352_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x19046693c278bc3362c21e3369d28337b_big_uint130, - 0x213100709424048752d19aaba00d597d2_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x1c50381e9fe77faacbb4625d8a73454a9_big_uint130, - 0x4c27748ded9d69446a518953eda5ea0c_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x19038fc207ecfca9a1a474489cd184a6d_big_uint130, - 0xcf46092c1d5ccf5e41dff63f92c079b9_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x248e3a01cf8cd1147bfa3e5ed0b6e4a41_big_uint130, - 0x7388310b8e62700604f76f2d45f98e52_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x282252b232f1c43f5f014529ee6e3134e_big_uint130, - 0xc324f7242a9d93665f3f3d72bf731500_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x136d5cc4b596ecbacbcbea6385708cea8_big_uint130, - 0x2eceb23b47b8beeb5cd704605f0102a27_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0xa41d7a6deba861eb210e76fedf048120_big_uint130, - 0x2b80b6fe5fce48e77bc6529a43670fa89_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0xbe044d7bc860898b4b67f2b0e47b2957_big_uint130, - 0x1385abf4521b731a0ef6585e6fcbe1087_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x15431c536a4b40b7a2def9881b3ed3f65_big_uint130, - 0x2c7a86a326513aec20b909a5b06e1d724_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x22dae6c3c21886db3a222b319df2fcc18_big_uint130, - 0x29874fcdec2d26c29d56990f86e49921e_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x1966a81455bb9ae791b06c79361cb04a9_big_uint130, - 0x1ffebba8847893384f651589275aaceb1_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x2744dda0f21e9343d45d80cf7717947c4_big_uint130, - 0x5559c5bfee5bdd51d7695f8be84aa7e0_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x217faf49e078d4f40e8bed99a20a4e3f4_big_uint130, - 0x21e2c14e9f39cfdfc87a7eddbfa8de653_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x571a667c902421037c8d855907b904fd_big_uint130, - 0x873f600a7769bf94aab70506e04d3dee_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48bb_big_uint130, 0x662ba0a5876b6f5f448563d9194ff704_big_uint130, - 0xc88c6b7366ae5740e6860d5f1c906c00_big_uint130}, - }}; - - bool res = base_operations_test(test_data); +BOOST_DATA_TEST_CASE(prime_mod_montgomery_130, (test_dataset>( + "prime_mod_montgomery_130"))) { + base_operations_test(sample); } -BOOST_AUTO_TEST_CASE(base_ops_even_mod_backend_130) { - using standard_number = nil::crypto3::multiprecision::big_uint<130>; - using test_set = std::array; - using test_data_t = std::array; - constexpr test_data_t test_data = {{ - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0xf6ce85e6f42595ffc6fcb50fdc3c9160_big_uint130, - 0x2f04006a57e467c0d45f180da37f9a602_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x6d9d6fed00c44c3eaa674b2b86004106_big_uint130, - 0x1f811a14b9a0ea15d873e532bb3364548_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x1f72515d6e96f189c58447d4424da9cf5_big_uint130, - 0x1cb8d94653cfbe79c97028957fd6b37d3_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x4c2fe1ff52320c73ec081a03082dfaf7_big_uint130, - 0xb156219a04e9ac54ba60ce2d79d706eb_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0xb6222e4281e459f84c0bd5d77ce3493_big_uint130, - 0x32efd252fec869d766989d986cf31fc2_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x1043b1bfcefc15dbe214d68e1061d8645_big_uint130, - 0x43dede03370eb136ecbfa7ec396f0d6d_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x514c264f84ecf1c6e27d7c7c78e6b4a2_big_uint130, - 0x2e9bae255ae7a67003d91da36a76615b8_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x2ff3bee3f9723332a002b583133320c93_big_uint130, - 0x25283c79b9b1e505f159c2fe560caffc9_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x1446284dc17091cd19bf687b8bcfa8829_big_uint130, - 0xc9e35084ad8092316a3ce0b77b61b998_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0xc447bb62c4287d9f409ab060dae3ae92_big_uint130, - 0x22efe8c2ac2188ad9e638d88bb4c754b5_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x313265520502bb48dceca31b17afa02f0_big_uint130, - 0x109c4589d316e8ec374c1671ed51ee911_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x2d639758db1ae7106138010f0e573079e_big_uint130, - 0x268a07bc08a254c23c9d71e3303352c1b_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x20898a292ba2360df9b8f42651f342554_big_uint130, - 0x13ea3770bbfab80ba966ddc255a419664_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x879758e1d55d9db504d0122b735255ac_big_uint130, - 0x2287b16011ef333a67b1984c1f8d2aa55_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0xeff14b264f211d251f3852bd87ebeae2_big_uint130, - 0x1b5ebb5ef4a47e00cc6a801e5b383b69e_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0xc2723880d0678f28cd177e8792d5ed2d_big_uint130, - 0x2a790884868d6fc5ef87d73d5b80ff46e_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x28a83dffca1513a29489e8835d244d6c5_big_uint130, - 0x15d4f2d8e0949e0aa82f178300c2da5d3_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x25ded52e8495fe687f442ab3579d22963_big_uint130, - 0x2754bb6b9fb861566833f59229e28e0b1_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x1ec91d30d83ac012534a9b7561f390be4_big_uint130, - 0x308d7237b1cfb01b5ca9fa894ae3c6c48_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0xa8b175970e5266b7575376c254c5ad4_big_uint130, - 0x7bd2cb80c703ab2fe711022067a805f1_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x3068f458ab46abf38f3ab53368fefe1b3_big_uint130, - 0x44da306ee50c5462b9910fcba033ec28_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x7347fcf946c50eb24121d2695a74138_big_uint130, - 0x2cc6b5e5400509f854189e73f9e252331_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x13e5c415b09516c96134af94a77018a61_big_uint130, - 0x4b1f1e72fb30cffbef1bbe88d8d6c25_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x157cedbd74cdd229f3b43e8ab59199092_big_uint130, - 0x144db4073011653f19851e3b7231b8eb0_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0xadbf28669d70f71efea08f2b7dcd3929_big_uint130, - 0x2352ba5d47b493e545238dc33f8018555_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x3118fbf21bf8820849498b777ae4369c2_big_uint130, - 0x8e3b38851b87235ab9e415c4f9973cb5_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x2d87b88301585c45369f392edad58ebbb_big_uint130, - 0x17b9f6b9257dc97b99d2b43da9a557a76_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x2836115435665dffa299a2e1dba2bc02_big_uint130, - 0x181aa88e10efd256cebb4563cbfb06436_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x4010011e94719b273a8f657daecb8154_big_uint130, - 0x16aa3735374efa31f48b9f0b63eca9f1e_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0xfd82a47f158cf4773e6177c3b9087ce1_big_uint130, - 0x14686b4ba0accbb93c1fb046e69015338_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x662de620b44deb4469155819375bd2ae_big_uint130, - 0xa1a7f7e023df7165ca899d4366bbc7f5_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0xd12ea24d1261fc11787313ef5906f58d_big_uint130, - 0x1c2a2731db836bc6156689cd762da9364_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x26d99465f1a39a64ef21a46d454161f24_big_uint130, - 0x27c3ed62253a11d4dc15d370704817498_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x2570d84dca037136829b41df4809e3810_big_uint130, - 0x904beba3c2f174a54466d0bed0fb581b_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x1183aa1a729def2d3c7138aae27332134_big_uint130, - 0x208bc970b97cf55008c06fc620d025053_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0xd8c70b07b915682a3d9f01ea5c51d34b_big_uint130, - 0x6584051efd453ff081e2189928a9a9c4_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0xa14b405e334ae992f920fb9373508696_big_uint130, - 0x104aa2d49412388ae364af54a916fb501_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0xe5f1875befdf2bc34c0ef450753afb87_big_uint130, - 0x20f84732af830324ed3949c93704a0ce2_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x22dea1e18f9ec2bdb731db37bcab995ad_big_uint130, - 0x1eb896b7179ab4a60a5cfb051c4f6805b_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x322c6c9cd1a662e0a20738db589ae298_big_uint130, - 0x2872647f25d62d395a64406fdcf9ea04b_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0xbfde51cd756d321a25d54a3909890edb_big_uint130, - 0xbd2e612e27d726d58a8be3a643373147_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0xb63cc77f71d194b5824946e44fe21831_big_uint130, - 0x556942440de628a1b78d70b8ce61cad5_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x28b231976fbb6484e07f1c36b709811c6_big_uint130, - 0x22da443e75ea4b64e4dd5b0e701948b9a_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x2b564befbf84fb99e6d3e96a00e28a111_big_uint130, - 0x2680850f06cffc374d3c98dac2a3522ca_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x19738eb221a6b1cc01159dac5232f5f94_big_uint130, - 0x1888b0fd2c91a44559730f4772021e7ae_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x128cbc897d8a21f0924f0824cc0a2a2af_big_uint130, - 0x1667817727b346d00cfe296b83099260a_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x1176a4938cafb93365f979e0648a9b36d_big_uint130, - 0x1d424e90ed8b1d58a4e5f63a983f66b23_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0xe1d5e0b579b9ffabd79f55a3ad58095a_big_uint130, - 0x28facaa806c45f06b33f90a25a256cb57_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x29492c8c9736c8b22abbe8cc151c0bbe5_big_uint130, - 0x1e2e6cf551c64286202dbc4202eb950b4_big_uint130}, - {0x314107b9ef725f87fa08f9fdadd4f48ba_big_uint130, 0x2d38c6d88e4be77725f5a337fadacb890_big_uint130, - 0x2b711aed3a4d108fd95d3a8c3338bf713_big_uint130}, - }}; - - bool res = base_operations_test(test_data); +BOOST_DATA_TEST_CASE(even_mod_130, + (test_dataset>("even_mod_130"))) { + base_operations_test(sample); } // This one tests 64-bit numbers used in Goldilock fields. -BOOST_AUTO_TEST_CASE(base_ops_even_mod_backend_64) { - using standard_number = nil::crypto3::multiprecision::big_uint<64>; - using test_set = std::array; - using test_data_t = std::array; - constexpr test_data_t test_data = {{ - {0xffffffff00000001_big_uint64, 0x1_big_uint64, 0x2_big_uint64}, - {0xffffffff00000001_big_uint64, 0x7fffffff91725e00_big_uint64, 0x3fffffffe6869400_big_uint64}, - {0xffffffff00000001_big_uint64, 0x7ffaffff91745e00_big_uint64, 0x1fafff0fe6869400_big_uint64}, - {0xffffffff00000001_big_uint64, 0x7ffaffff91745e00_big_uint64, 0x1fafff0fe6869400_big_uint64}, - {0xffffffff00000001_big_uint64, 0x1ffaffff91745e00_big_uint64, 0xffffffff00000000_big_uint64}, - {0xffffffff00000001_big_uint64, 0x00_big_uint64, 0x1_big_uint64}, - }}; - - bool res = base_operations_test(test_data); +BOOST_DATA_TEST_CASE(goldilock, (test_dataset>("goldilock"))) { + base_operations_test(sample); } -// BOOST_AUTO_TEST_CASE(base_ops_even_mod_backend_17) { -// using standard_number = nil::crypto3::multiprecision::big_uint<17>; -// using test_set = std::array; -// using test_data_t = std::array; -// constexpr test_data_t test_data = {{ -// {0x1e240_big_uint17, 0x3a97_big_uint17, 0xc070_big_uint17}, -// {0x1e240_big_uint17, 0x1dea7_big_uint17, 0x1aaab_big_uint17}, -// {0x1e240_big_uint17, 0x1936f_big_uint17, 0xfb0b_big_uint17}, -// {0x1e240_big_uint17, 0x13067_big_uint17, 0x1566c_big_uint17}, -// {0x1e240_big_uint17, 0x1b960_big_uint17, 0x1773f_big_uint17}, -// {0x1e240_big_uint17, 0x101e4_big_uint17, 0x156ca_big_uint17}, -// {0x1e240_big_uint17, 0x167f3_big_uint17, 0x13c52_big_uint17}, -// {0x1e240_big_uint17, 0xc536_big_uint17, 0x14c8e_big_uint17}, -// {0x1e240_big_uint17, 0xed02_big_uint17, 0x1dafc_big_uint17}, -// {0x1e240_big_uint17, 0x126a6_big_uint17, 0x18a8b_big_uint17}, -// {0x1e240_big_uint17, 0x111ac_big_uint17, 0x94c2_big_uint17}, -// {0x1e240_big_uint17, 0x3a03_big_uint17, 0x89d8_big_uint17}, -// {0x1e240_big_uint17, 0x3add_big_uint17, 0x101ae_big_uint17}, -// {0x1e240_big_uint17, 0x8db4_big_uint17, 0x50e2_big_uint17}, -// {0x1e240_big_uint17, 0x1bab_big_uint17, 0x1d5f6_big_uint17}, -// {0x1e240_big_uint17, 0x144dc_big_uint17, 0x172f8_big_uint17}, -// {0x1e240_big_uint17, 0x1cd30_big_uint17, 0x1a5c_big_uint17}, -// {0x1e240_big_uint17, 0x13c3d_big_uint17, 0x4358_big_uint17}, -// {0x1e240_big_uint17, 0x18d68_big_uint17, 0x1299d_big_uint17}, -// {0x1e240_big_uint17, 0x10153_big_uint17, 0x2c8a_big_uint17}, -// }}; - -// bool res = base_operations_test(test_data); -// } - -// BOOST_AUTO_TEST_CASE(base_ops_odd_mod_backend_17) { -// using Backend = cpp_int_modular_backend<17>; -// using standard_number = boost::multiprecision::number; -// using test_set = std::array; -// using test_data_t = std::array; -// constexpr test_data_t test_data = {{ -// {0x1e241_big_uint17, 0x3a97_big_uint17, 0xc070_big_uint17}, -// {0x1e241_big_uint17, 0x1dea7_big_uint17, 0x1aaab_big_uint17}, -// {0x1e241_big_uint17, 0x1936f_big_uint17, 0xfb0b_big_uint17}, -// {0x1e241_big_uint17, 0x13067_big_uint17, 0x1566c_big_uint17}, -// {0x1e241_big_uint17, 0x1b960_big_uint17, 0x1773f_big_uint17}, -// {0x1e241_big_uint17, 0x101e4_big_uint17, 0x156ca_big_uint17}, -// {0x1e241_big_uint17, 0x167f3_big_uint17, 0x13c52_big_uint17}, -// {0x1e241_big_uint17, 0xc536_big_uint17, 0x14c8e_big_uint17}, -// {0x1e241_big_uint17, 0xed02_big_uint17, 0x1dafc_big_uint17}, -// {0x1e241_big_uint17, 0x126a6_big_uint17, 0x18a8b_big_uint17}, -// {0x1e241_big_uint17, 0x111ac_big_uint17, 0x94c2_big_uint17}, -// {0x1e241_big_uint17, 0x3a03_big_uint17, 0x89d8_big_uint17}, -// {0x1e241_big_uint17, 0x3add_big_uint17, 0x101ae_big_uint17}, -// {0x1e241_big_uint17, 0x8db4_big_uint17, 0x50e2_big_uint17}, -// {0x1e241_big_uint17, 0x1bab_big_uint17, 0x1d5f6_big_uint17}, -// {0x1e241_big_uint17, 0x144dc_big_uint17, 0x172f8_big_uint17}, -// {0x1e241_big_uint17, 0x1cd30_big_uint17, 0x1a5c_big_uint17}, -// {0x1e241_big_uint17, 0x13c3d_big_uint17, 0x4358_big_uint17}, -// {0x1e241_big_uint17, 0x18d68_big_uint17, 0x1299d_big_uint17}, -// {0x1e241_big_uint17, 0x10153_big_uint17, 0x2c8a_big_uint17}, -// }}; - -// bool res = base_operations_test(test_data); -// } - -BOOST_AUTO_TEST_SUITE_END() - -BOOST_AUTO_TEST_SUITE(runtime_tests) - -BOOST_AUTO_TEST_CASE(secp256k1_incorrect_multiplication) { - using standart_number = nil::crypto3::multiprecision::big_uint<256>; - using modular_number = nil::crypto3::multiprecision::big_mod_rt<256>; - - constexpr standart_number modulus = - 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f_big_uint256; - constexpr standart_number x_standard = - 0xb5d724ce6f44c3c587867bbcb417e9eb6fa05e7e2ef029166568f14eb3161387_big_uint256; - constexpr standart_number res_standard = - 0xad6e1fcc680392abfb075838eafa513811112f14c593e0efacb6e9d0d7770b4_big_uint256; - constexpr modular_number x(x_standard, modulus); - constexpr modular_number res(res_standard, modulus); - BOOST_CHECK_EQUAL(x * x, res); -} - -BOOST_AUTO_TEST_CASE(bad_negation) { - using standart_number = nil::crypto3::multiprecision::big_uint<256>; - using modular_number = nil::crypto3::multiprecision::big_mod_rt<256>; - - constexpr standart_number modulus = - 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f_big_uint256; - constexpr modular_number x(0u, modulus); - constexpr modular_number res = -x; - // TODO - // BOOST_CHECK(res == 0u); - BOOST_CHECK(res == x); - BOOST_CHECK(-res == x); +BOOST_DATA_TEST_CASE(even_mod_17, + (test_dataset>("even_mod_17"))) { + base_operations_test(sample); } -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>; - constexpr standart_number x = - 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f_big_uint256; - short_number s = x.truncate<128>(); - // 2nd half of the number must stay. - BOOST_CHECK_EQUAL(s, 0xfffffffffffffffffffffffefffffc2f_big_uint128); +BOOST_DATA_TEST_CASE(montgomery_17, + (test_dataset>("montgomery_17"))) { + base_operations_test(sample); } BOOST_AUTO_TEST_SUITE_END() diff --git a/crypto3/libs/multiprecision/test/big_int_ressol.cpp b/crypto3/libs/multiprecision/test/big_int_ressol.cpp index 50ab4afda8..1b2ff9f945 100644 --- a/crypto3/libs/multiprecision/test/big_int_ressol.cpp +++ b/crypto3/libs/multiprecision/test/big_int_ressol.cpp @@ -10,10 +10,11 @@ #define BOOST_TEST_MODULE big_int_ressol_test +#include + #include #include #include -#include #include "nil/crypto3/multiprecision/big_uint.hpp" diff --git a/crypto3/libs/multiprecision/test/data/comparison.json b/crypto3/libs/multiprecision/test/data/comparison.json new file mode 100644 index 0000000000..9639c60167 --- /dev/null +++ b/crypto3/libs/multiprecision/test/data/comparison.json @@ -0,0 +1,15008 @@ +{ + "test_comparison_12_17": [ + { + "a": "0x223", + "b": "0x19d", + "cmp_a_b": 1 + }, + { + "a": "0x2a6", + "b": "0x3c7", + "cmp_a_b": -1 + }, + { + "a": "0x42", + "b": "0x5b4", + "cmp_a_b": -1 + }, + { + "a": "0x78d", + "b": "0xa1a9", + "cmp_a_b": -1 + }, + { + "a": "0x1b0", + "b": "0x104", + "cmp_a_b": 1 + }, + { + "a": "0x25", + "b": "0x15971", + "cmp_a_b": -1 + }, + { + "a": "0x538", + "b": "0x282", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x40ff", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x11", + "cmp_a_b": -1 + }, + { + "a": "0x572", + "b": "0x10", + "cmp_a_b": 1 + }, + { + "a": "0x31c", + "b": "0x2b", + "cmp_a_b": 1 + }, + { + "a": "0x926", + "b": "0x1020", + "cmp_a_b": -1 + }, + { + "a": "0x36b", + "b": "0x4c5", + "cmp_a_b": -1 + }, + { + "a": "0x28", + "b": "0x372", + "cmp_a_b": -1 + }, + { + "a": "0x4", + "b": "0x8f5", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0xcf92", + "cmp_a_b": -1 + }, + { + "a": "0x6dc", + "b": "0x64", + "cmp_a_b": 1 + }, + { + "a": "0x9", + "b": "0x94a3", + "cmp_a_b": -1 + }, + { + "a": "0xa89", + "b": "0x958", + "cmp_a_b": 1 + }, + { + "a": "0x804", + "b": "0x557", + "cmp_a_b": 1 + }, + { + "a": "0xbc", + "b": "0x15a2", + "cmp_a_b": -1 + }, + { + "a": "0x6", + "b": "0x3a81", + "cmp_a_b": -1 + }, + { + "a": "0x3", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x791", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x9a", + "b": "0x4e", + "cmp_a_b": 1 + }, + { + "a": "0x1", + "b": "0x1", + "cmp_a_b": 0 + }, + { + "a": "0x4", + "b": "0x30ee", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x15", + "cmp_a_b": -1 + }, + { + "a": "0xd9", + "b": "0x179", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0xa", + "cmp_a_b": -1 + }, + { + "a": "0x1b7", + "b": "0x7", + "cmp_a_b": 1 + }, + { + "a": "0xc1d", + "b": "0xc1d", + "cmp_a_b": 0 + }, + { + "a": "0x46c", + "b": "0x46c", + "cmp_a_b": 0 + }, + { + "a": "0x4", + "b": "0x331", + "cmp_a_b": -1 + }, + { + "a": "0xd", + "b": "0x13", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x1", + "cmp_a_b": 0 + }, + { + "a": "0x7", + "b": "0x1d", + "cmp_a_b": -1 + }, + { + "a": "0xa49", + "b": "0x11f1", + "cmp_a_b": -1 + }, + { + "a": "0x1f", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x10", + "b": "0x56", + "cmp_a_b": -1 + }, + { + "a": "0x70", + "b": "0xf40", + "cmp_a_b": -1 + }, + { + "a": "0xf6", + "b": "0xf6", + "cmp_a_b": 0 + }, + { + "a": "0x8", + "b": "0x137", + "cmp_a_b": -1 + }, + { + "a": "0x217", + "b": "0x27", + "cmp_a_b": 1 + }, + { + "a": "0x344", + "b": "0x9", + "cmp_a_b": 1 + }, + { + "a": "0xc1", + "b": "0xc1", + "cmp_a_b": 0 + }, + { + "a": "0xe56", + "b": "0x29", + "cmp_a_b": 1 + }, + { + "a": "0x186", + "b": "0x186", + "cmp_a_b": 0 + }, + { + "a": "0x51", + "b": "0x51", + "cmp_a_b": 0 + }, + { + "a": "0xdd", + "b": "0x18d7c", + "cmp_a_b": -1 + }, + { + "a": "0x4bf", + "b": "0x19", + "cmp_a_b": 1 + }, + { + "a": "0x2d8", + "b": "0x1ce", + "cmp_a_b": 1 + }, + { + "a": "0x11", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x11094", + "cmp_a_b": -1 + }, + { + "a": "0x78f", + "b": "0x78f", + "cmp_a_b": 0 + }, + { + "a": "0x155", + "b": "0xa2b3", + "cmp_a_b": -1 + }, + { + "a": "0x16", + "b": "0x3f2", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x2aeb", + "cmp_a_b": -1 + }, + { + "a": "0x10", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0xdc3", + "b": "0x281", + "cmp_a_b": 1 + }, + { + "a": "0x35", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x4d", + "b": "0x4d", + "cmp_a_b": 0 + }, + { + "a": "0xf", + "b": "0xae82", + "cmp_a_b": -1 + }, + { + "a": "0x442", + "b": "0x11a", + "cmp_a_b": 1 + }, + { + "a": "0x22", + "b": "0x9385", + "cmp_a_b": -1 + }, + { + "a": "0xb7", + "b": "0x743", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x4a", + "b": "0x3d8", + "cmp_a_b": -1 + }, + { + "a": "0x21", + "b": "0x15", + "cmp_a_b": 1 + }, + { + "a": "0x24", + "b": "0x6698", + "cmp_a_b": -1 + }, + { + "a": "0x724", + "b": "0x4", + "cmp_a_b": 1 + }, + { + "a": "0x5", + "b": "0x5", + "cmp_a_b": 0 + }, + { + "a": "0x6", + "b": "0x56", + "cmp_a_b": -1 + }, + { + "a": "0x3", + "b": "0x5", + "cmp_a_b": -1 + }, + { + "a": "0x11d", + "b": "0xc0a4", + "cmp_a_b": -1 + }, + { + "a": "0x3f", + "b": "0xa", + "cmp_a_b": 1 + }, + { + "a": "0x6", + "b": "0x9bc1", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x283f", + "cmp_a_b": -1 + }, + { + "a": "0x7f", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x560", + "b": "0x560", + "cmp_a_b": 0 + }, + { + "a": "0x1", + "b": "0x1", + "cmp_a_b": 0 + }, + { + "a": "0xf", + "b": "0x8e5", + "cmp_a_b": -1 + }, + { + "a": "0x42", + "b": "0x360", + "cmp_a_b": -1 + }, + { + "a": "0x329", + "b": "0x19f6", + "cmp_a_b": -1 + }, + { + "a": "0x5", + "b": "0x41a7", + "cmp_a_b": -1 + }, + { + "a": "0x2d0", + "b": "0x58cb", + "cmp_a_b": -1 + }, + { + "a": "0xec", + "b": "0xec", + "cmp_a_b": 0 + }, + { + "a": "0x43", + "b": "0x6239", + "cmp_a_b": -1 + }, + { + "a": "0xc", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x2", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x664a", + "cmp_a_b": -1 + }, + { + "a": "0x10f", + "b": "0x7f", + "cmp_a_b": 1 + }, + { + "a": "0x18", + "b": "0x18", + "cmp_a_b": 0 + }, + { + "a": "0x3", + "b": "0x3", + "cmp_a_b": 0 + }, + { + "a": "0xbc", + "b": "0x3b", + "cmp_a_b": 1 + }, + { + "a": "0x27d", + "b": "0x52d", + "cmp_a_b": -1 + }, + { + "a": "0xc0", + "b": "0xc26", + "cmp_a_b": -1 + }, + { + "a": "0x2c1", + "b": "0x3020", + "cmp_a_b": -1 + }, + { + "a": "0x58a", + "b": "0x1c4", + "cmp_a_b": 1 + }, + { + "a": "0x4", + "b": "0x1d17", + "cmp_a_b": -1 + }, + { + "a": "0x2c7", + "b": "0x2c7", + "cmp_a_b": 0 + }, + { + "a": "0x0", + "b": "0x9f96", + "cmp_a_b": -1 + }, + { + "a": "0xff", + "b": "0x3", + "cmp_a_b": 1 + }, + { + "a": "0x657", + "b": "0x8d", + "cmp_a_b": 1 + }, + { + "a": "0x2", + "b": "0xce5a", + "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": "0xbb0", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x1", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x38c", + "b": "0x38c", + "cmp_a_b": 0 + }, + { + "a": "0x5", + "b": "0xf75b", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x4f5", + "b": "0x39", + "cmp_a_b": 1 + }, + { + "a": "0x2", + "b": "0x108", + "cmp_a_b": -1 + }, + { + "a": "0x97b", + "b": "0x8", + "cmp_a_b": 1 + }, + { + "a": "0x2", + "b": "0x9954", + "cmp_a_b": -1 + }, + { + "a": "0x324", + "b": "0x1c7e", + "cmp_a_b": -1 + }, + { + "a": "0x20", + "b": "0x20", + "cmp_a_b": 0 + }, + { + "a": "0x1", + "b": "0x1", + "cmp_a_b": 0 + }, + { + "a": "0x20", + "b": "0x5", + "cmp_a_b": 1 + }, + { + "a": "0xc7", + "b": "0xc7", + "cmp_a_b": 0 + }, + { + "a": "0x15", + "b": "0x7b", + "cmp_a_b": -1 + }, + { + "a": "0x1ab", + "b": "0x1f", + "cmp_a_b": 1 + }, + { + "a": "0xa94", + "b": "0x2ce", + "cmp_a_b": 1 + }, + { + "a": "0x2ec", + "b": "0x2120", + "cmp_a_b": -1 + }, + { + "a": "0x7", + "b": "0x5", + "cmp_a_b": 1 + }, + { + "a": "0xc8", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0xab", + "b": "0xab", + "cmp_a_b": 0 + }, + { + "a": "0x255", + "b": "0x6", + "cmp_a_b": 1 + }, + { + "a": "0x32", + "b": "0xf", + "cmp_a_b": 1 + }, + { + "a": "0xa", + "b": "0x8213", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x3b3", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0x1c9d", + "cmp_a_b": -1 + }, + { + "a": "0x8d", + "b": "0x8d", + "cmp_a_b": 0 + }, + { + "a": "0xc", + "b": "0x12", + "cmp_a_b": -1 + }, + { + "a": "0x3", + "b": "0x1c9", + "cmp_a_b": -1 + }, + { + "a": "0xb8", + "b": "0x6e8", + "cmp_a_b": -1 + }, + { + "a": "0x289", + "b": "0x4f", + "cmp_a_b": 1 + }, + { + "a": "0x3", + "b": "0x422", + "cmp_a_b": -1 + }, + { + "a": "0x103", + "b": "0x85", + "cmp_a_b": 1 + }, + { + "a": "0x143", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x1ec", + "b": "0x1ec", + "cmp_a_b": 0 + }, + { + "a": "0x1", + "b": "0x1", + "cmp_a_b": 0 + }, + { + "a": "0x1", + "b": "0x1879", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x1", + "cmp_a_b": 0 + }, + { + "a": "0xff5", + "b": "0x148b", + "cmp_a_b": -1 + }, + { + "a": "0x206", + "b": "0xe4", + "cmp_a_b": 1 + }, + { + "a": "0x4", + "b": "0xa8", + "cmp_a_b": -1 + }, + { + "a": "0x16b", + "b": "0xb21d", + "cmp_a_b": -1 + }, + { + "a": "0x2c6", + "b": "0x62", + "cmp_a_b": 1 + }, + { + "a": "0x5", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x7", + "b": "0x7", + "cmp_a_b": 0 + }, + { + "a": "0x1", + "b": "0x537", + "cmp_a_b": -1 + }, + { + "a": "0x15f", + "b": "0x78d3", + "cmp_a_b": -1 + }, + { + "a": "0x2d", + "b": "0x1328b", + "cmp_a_b": -1 + }, + { + "a": "0x8eb", + "b": "0x142", + "cmp_a_b": 1 + }, + { + "a": "0x6", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x1", + "b": "0x2975", + "cmp_a_b": -1 + }, + { + "a": "0xc89", + "b": "0xd1", + "cmp_a_b": 1 + }, + { + "a": "0x2", + "b": "0x2c", + "cmp_a_b": -1 + }, + { + "a": "0xe", + "b": "0xe", + "cmp_a_b": 0 + }, + { + "a": "0x0", + "b": "0x1e3", + "cmp_a_b": -1 + }, + { + "a": "0x5", + "b": "0x27", + "cmp_a_b": -1 + }, + { + "a": "0x8", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x1", + "b": "0x1", + "cmp_a_b": 0 + }, + { + "a": "0xd6c", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x246", + "b": "0xb3", + "cmp_a_b": 1 + }, + { + "a": "0x22", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x3a", + "b": "0xec85", + "cmp_a_b": -1 + }, + { + "a": "0x25", + "b": "0x24b", + "cmp_a_b": -1 + }, + { + "a": "0xb", + "b": "0x22a", + "cmp_a_b": -1 + }, + { + "a": "0x6", + "b": "0x3", + "cmp_a_b": 1 + }, + { + "a": "0x7", + "b": "0x946", + "cmp_a_b": -1 + }, + { + "a": "0x48", + "b": "0x7d3", + "cmp_a_b": -1 + }, + { + "a": "0x1cc", + "b": "0xf8d", + "cmp_a_b": -1 + }, + { + "a": "0x6", + "b": "0x1c0", + "cmp_a_b": -1 + }, + { + "a": "0x6", + "b": "0x7", + "cmp_a_b": -1 + }, + { + "a": "0x63", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x1a", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x299", + "b": "0xe30", + "cmp_a_b": -1 + }, + { + "a": "0x1ba", + "b": "0x40", + "cmp_a_b": 1 + }, + { + "a": "0xbb", + "b": "0x4858", + "cmp_a_b": -1 + }, + { + "a": "0x13", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0xe4", + "b": "0x12767", + "cmp_a_b": -1 + }, + { + "a": "0xd", + "b": "0x4d5", + "cmp_a_b": -1 + }, + { + "a": "0x3a1", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x39", + "cmp_a_b": -1 + }, + { + "a": "0x1a2", + "b": "0xaae", + "cmp_a_b": -1 + }, + { + "a": "0x13", + "b": "0x5", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 + }, + { + "a": "0x0", + "b": "0x2", + "cmp_a_b": -1 + }, + { + "a": "0xcaf", + "b": "0xc", + "cmp_a_b": 1 + }, + { + "a": "0x13", + "b": "0x1b639", + "cmp_a_b": -1 + }, + { + "a": "0x18", + "b": "0x20b", + "cmp_a_b": -1 + }, + { + "a": "0x12e", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x1e", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x55f", + "b": "0x5", + "cmp_a_b": 1 + }, + { + "a": "0x43b", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x4", + "b": "0x7", + "cmp_a_b": -1 + }, + { + "a": "0x8c3", + "b": "0xdb", + "cmp_a_b": 1 + }, + { + "a": "0x95", + "b": "0x15f3", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 + }, + { + "a": "0xb", + "b": "0x42", + "cmp_a_b": -1 + }, + { + "a": "0x1c", + "b": "0x66", + "cmp_a_b": -1 + }, + { + "a": "0x6fe", + "b": "0x233f", + "cmp_a_b": -1 + }, + { + "a": "0x8", + "b": "0x1335", + "cmp_a_b": -1 + }, + { + "a": "0x3d", + "b": "0x3d", + "cmp_a_b": 0 + }, + { + "a": "0x1", + "b": "0x2485", + "cmp_a_b": -1 + }, + { + "a": "0x12c", + "b": "0x37", + "cmp_a_b": 1 + }, + { + "a": "0xca9", + "b": "0x30", + "cmp_a_b": 1 + }, + { + "a": "0x88a", + "b": "0xbfa", + "cmp_a_b": -1 + }, + { + "a": "0x7fa", + "b": "0x1a18", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x123e0", + "cmp_a_b": -1 + }, + { + "a": "0xb6", + "b": "0x4a2", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x8e4", + "b": "0x1112e", + "cmp_a_b": -1 + }, + { + "a": "0x289", + "b": "0x283", + "cmp_a_b": 1 + }, + { + "a": "0xa89", + "b": "0x931", + "cmp_a_b": 1 + }, + { + "a": "0x2", + "b": "0x4e0", + "cmp_a_b": -1 + }, + { + "a": "0x9", + "b": "0x1cba8", + "cmp_a_b": -1 + }, + { + "a": "0xa3b", + "b": "0x1c792", + "cmp_a_b": -1 + }, + { + "a": "0x29f", + "b": "0x1aec", + "cmp_a_b": -1 + }, + { + "a": "0xf4", + "b": "0x46", + "cmp_a_b": 1 + }, + { + "a": "0x6a", + "b": "0x32eb", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0xbd4", + "cmp_a_b": -1 + }, + { + "a": "0xb9", + "b": "0x12", + "cmp_a_b": 1 + }, + { + "a": "0x9", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x1e7", + "b": "0x3490", + "cmp_a_b": -1 + }, + { + "a": "0xb48", + "b": "0xdb26", + "cmp_a_b": -1 + }, + { + "a": "0x9be", + "b": "0x237c", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0x2", + "cmp_a_b": 0 + }, + { + "a": "0x0", + "b": "0x5f", + "cmp_a_b": -1 + }, + { + "a": "0xb5", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x3e2", + "b": "0x2f", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x1", + "cmp_a_b": -1 + }, + { + "a": "0x11", + "b": "0x11", + "cmp_a_b": 0 + }, + { + "a": "0x2", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x468", + "b": "0xa7ad", + "cmp_a_b": -1 + }, + { + "a": "0x242", + "b": "0x45d", + "cmp_a_b": -1 + }, + { + "a": "0xc", + "b": "0xc", + "cmp_a_b": 0 + }, + { + "a": "0x3", + "b": "0x1fc2", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 + }, + { + "a": "0x1e7", + "b": "0x3a", + "cmp_a_b": 1 + }, + { + "a": "0x1", + "b": "0xa", + "cmp_a_b": -1 + }, + { + "a": "0x152", + "b": "0xef7a", + "cmp_a_b": -1 + }, + { + "a": "0x3", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0xcf", + "b": "0xcf", + "cmp_a_b": 0 + }, + { + "a": "0x383", + "b": "0x383", + "cmp_a_b": 0 + }, + { + "a": "0x2c", + "b": "0x6", + "cmp_a_b": 1 + }, + { + "a": "0xe8", + "b": "0x25c", + "cmp_a_b": -1 + }, + { + "a": "0x11", + "b": "0x9a", + "cmp_a_b": -1 + }, + { + "a": "0x2a", + "b": "0x1b88f", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x1", + "b": "0x83", + "cmp_a_b": -1 + }, + { + "a": "0xd", + "b": "0x2117", + "cmp_a_b": -1 + }, + { + "a": "0x13", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x712", + "b": "0x2f6", + "cmp_a_b": 1 + }, + { + "a": "0x1e", + "b": "0x1e", + "cmp_a_b": 0 + }, + { + "a": "0x4", + "b": "0x4", + "cmp_a_b": 0 + }, + { + "a": "0x4", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x64", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x514", + "b": "0x15", + "cmp_a_b": 1 + }, + { + "a": "0x2", + "b": "0x12dcf", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x1d", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x27f", + "cmp_a_b": -1 + }, + { + "a": "0x4", + "b": "0x11", + "cmp_a_b": -1 + }, + { + "a": "0xb4", + "b": "0x88a5", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x7", + "cmp_a_b": -1 + }, + { + "a": "0x6", + "b": "0x777c", + "cmp_a_b": -1 + }, + { + "a": "0x6d", + "b": "0x6d", + "cmp_a_b": 0 + }, + { + "a": "0x1", + "b": "0x1ff49", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x1", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0xaef", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x32", + "cmp_a_b": -1 + }, + { + "a": "0x3", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0xef", + "b": "0xaa", + "cmp_a_b": 1 + }, + { + "a": "0x6", + "b": "0x6b", + "cmp_a_b": -1 + }, + { + "a": "0x413", + "b": "0x4f", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x10", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x14f77", + "cmp_a_b": -1 + }, + { + "a": "0x5c8", + "b": "0x5c8", + "cmp_a_b": 0 + }, + { + "a": "0x1", + "b": "0x66", + "cmp_a_b": -1 + }, + { + "a": "0x178", + "b": "0x37", + "cmp_a_b": 1 + }, + { + "a": "0x87", + "b": "0x179", + "cmp_a_b": -1 + }, + { + "a": "0x11", + "b": "0x690", + "cmp_a_b": -1 + }, + { + "a": "0x5", + "b": "0x3ca", + "cmp_a_b": -1 + }, + { + "a": "0xc3", + "b": "0xc1b", + "cmp_a_b": -1 + }, + { + "a": "0x1a9", + "b": "0x55d", + "cmp_a_b": -1 + }, + { + "a": "0x23", + "b": "0x10f2", + "cmp_a_b": -1 + }, + { + "a": "0x285", + "b": "0x7", + "cmp_a_b": 1 + }, + { + "a": "0x6", + "b": "0x43", + "cmp_a_b": -1 + }, + { + "a": "0x1c7", + "b": "0x4", + "cmp_a_b": 1 + }, + { + "a": "0x4c6", + "b": "0x9c23", + "cmp_a_b": -1 + }, + { + "a": "0x40", + "b": "0xb5e1", + "cmp_a_b": -1 + }, + { + "a": "0x1e6", + "b": "0x1d55a", + "cmp_a_b": -1 + }, + { + "a": "0xa71", + "b": "0x1e799", + "cmp_a_b": -1 + }, + { + "a": "0x126", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x15e", + "b": "0xe62", + "cmp_a_b": -1 + }, + { + "a": "0x5", + "b": "0x3", + "cmp_a_b": 1 + }, + { + "a": "0xa5", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x380", + "b": "0xcf", + "cmp_a_b": 1 + }, + { + "a": "0x8", + "b": "0xcdfd", + "cmp_a_b": -1 + }, + { + "a": "0x3cd", + "b": "0x3cd", + "cmp_a_b": 0 + }, + { + "a": "0x847", + "b": "0x56fb", + "cmp_a_b": -1 + }, + { + "a": "0x49", + "b": "0x106e", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x8455", + "cmp_a_b": -1 + }, + { + "a": "0x7f9", + "b": "0x3ff", + "cmp_a_b": 1 + }, + { + "a": "0x43", + "b": "0x3", + "cmp_a_b": 1 + }, + { + "a": "0x3b", + "b": "0x8", + "cmp_a_b": 1 + }, + { + "a": "0x3", + "b": "0x5", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x2bd", + "cmp_a_b": -1 + }, + { + "a": "0x6", + "b": "0x37c7", + "cmp_a_b": -1 + }, + { + "a": "0x52a", + "b": "0x2d3", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x1ca8", + "cmp_a_b": -1 + }, + { + "a": "0x137", + "b": "0x74f8", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0x2", + "cmp_a_b": 0 + }, + { + "a": "0x42d", + "b": "0x157", + "cmp_a_b": 1 + }, + { + "a": "0x44", + "b": "0x35e", + "cmp_a_b": -1 + }, + { + "a": "0x15", + "b": "0xf", + "cmp_a_b": 1 + }, + { + "a": "0x1e0", + "b": "0x44", + "cmp_a_b": 1 + }, + { + "a": "0x2", + "b": "0x16b", + "cmp_a_b": -1 + }, + { + "a": "0xea", + "b": "0xa2", + "cmp_a_b": 1 + }, + { + "a": "0x1c", + "b": "0x6a35", + "cmp_a_b": -1 + }, + { + "a": "0xb", + "b": "0x11", + "cmp_a_b": -1 + }, + { + "a": "0xb15", + "b": "0x5c", + "cmp_a_b": 1 + }, + { + "a": "0x47", + "b": "0x312", + "cmp_a_b": -1 + }, + { + "a": "0x113", + "b": "0x28", + "cmp_a_b": 1 + }, + { + "a": "0x2", + "b": "0xe", + "cmp_a_b": -1 + }, + { + "a": "0xe06", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x5", + "b": "0x2eef", + "cmp_a_b": -1 + }, + { + "a": "0x6", + "b": "0x6", + "cmp_a_b": 0 + }, + { + "a": "0x1", + "b": "0xede0", + "cmp_a_b": -1 + }, + { + "a": "0x1db", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x472", + "b": "0x472", + "cmp_a_b": 0 + }, + { + "a": "0x7", + "b": "0x34e9", + "cmp_a_b": -1 + }, + { + "a": "0x17", + "b": "0x17", + "cmp_a_b": 0 + }, + { + "a": "0x15c", + "b": "0x76d", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0x18", + "cmp_a_b": -1 + }, + { + "a": "0xae", + "b": "0x359", + "cmp_a_b": -1 + }, + { + "a": "0x5", + "b": "0x3", + "cmp_a_b": 1 + }, + { + "a": "0x2", + "b": "0xd4", + "cmp_a_b": -1 + }, + { + "a": "0x1f", + "b": "0x34", + "cmp_a_b": -1 + }, + { + "a": "0x6", + "b": "0xee42", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 + }, + { + "a": "0x240", + "b": "0x13", + "cmp_a_b": 1 + }, + { + "a": "0x6", + "b": "0x490", + "cmp_a_b": -1 + }, + { + "a": "0xc59", + "b": "0x22", + "cmp_a_b": 1 + }, + { + "a": "0x10e", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x32a", + "b": "0xb7d", + "cmp_a_b": -1 + }, + { + "a": "0x4", + "b": "0x3193", + "cmp_a_b": -1 + }, + { + "a": "0x649", + "b": "0x13ca", + "cmp_a_b": -1 + }, + { + "a": "0x870", + "b": "0xa6", + "cmp_a_b": 1 + }, + { + "a": "0xaa", + "b": "0xc", + "cmp_a_b": 1 + }, + { + "a": "0x7", + "b": "0x2ba", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0xb03", + "cmp_a_b": -1 + }, + { + "a": "0x128", + "b": "0x96", + "cmp_a_b": 1 + }, + { + "a": "0xe86", + "b": "0xc93", + "cmp_a_b": 1 + }, + { + "a": "0x67", + "b": "0xb0", + "cmp_a_b": -1 + }, + { + "a": "0x471", + "b": "0x1c42", + "cmp_a_b": -1 + }, + { + "a": "0xae6", + "b": "0x248", + "cmp_a_b": 1 + }, + { + "a": "0x15d", + "b": "0x15d", + "cmp_a_b": 0 + }, + { + "a": "0x4be", + "b": "0x7f", + "cmp_a_b": 1 + }, + { + "a": "0x1", + "b": "0x79f", + "cmp_a_b": -1 + }, + { + "a": "0x17", + "b": "0x167ae", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x27", + "cmp_a_b": -1 + }, + { + "a": "0x24f", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x47", + "b": "0x441", + "cmp_a_b": -1 + }, + { + "a": "0x42c", + "b": "0x188", + "cmp_a_b": 1 + }, + { + "a": "0x3b4", + "b": "0x6", + "cmp_a_b": 1 + }, + { + "a": "0x6c", + "b": "0x6c", + "cmp_a_b": 0 + }, + { + "a": "0x35", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0xfb", + "b": "0x844d", + "cmp_a_b": -1 + }, + { + "a": "0x23", + "b": "0x23", + "cmp_a_b": 0 + }, + { + "a": "0x18", + "b": "0x324b", + "cmp_a_b": -1 + }, + { + "a": "0x3b7", + "b": "0x29d", + "cmp_a_b": 1 + }, + { + "a": "0x3d", + "b": "0x3d", + "cmp_a_b": 0 + }, + { + "a": "0xf", + "b": "0x562", + "cmp_a_b": -1 + }, + { + "a": "0x2ce", + "b": "0x2ce", + "cmp_a_b": 0 + }, + { + "a": "0x4c", + "b": "0x130", + "cmp_a_b": -1 + }, + { + "a": "0x29b", + "b": "0x1049", + "cmp_a_b": -1 + }, + { + "a": "0x140", + "b": "0x518", + "cmp_a_b": -1 + }, + { + "a": "0x12", + "b": "0x3c", + "cmp_a_b": -1 + }, + { + "a": "0x4ae", + "b": "0x1a62a", + "cmp_a_b": -1 + }, + { + "a": "0xfb", + "b": "0x3ce9", + "cmp_a_b": -1 + }, + { + "a": "0x164", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0xb", + "b": "0x18ffb", + "cmp_a_b": -1 + }, + { + "a": "0x11", + "b": "0x20f", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x7", + "cmp_a_b": -1 + }, + { + "a": "0x25", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0xca", + "b": "0x973", + "cmp_a_b": -1 + }, + { + "a": "0x5f", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x492", + "b": "0x471", + "cmp_a_b": 1 + }, + { + "a": "0x20", + "b": "0x27", + "cmp_a_b": -1 + }, + { + "a": "0x3a", + "b": "0x52", + "cmp_a_b": -1 + }, + { + "a": "0x6", + "b": "0x10", + "cmp_a_b": -1 + }, + { + "a": "0x3b7", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x4f", + "b": "0x1b", + "cmp_a_b": 1 + }, + { + "a": "0x32", + "b": "0x10a1", + "cmp_a_b": -1 + }, + { + "a": "0x13", + "b": "0x22", + "cmp_a_b": -1 + }, + { + "a": "0x62", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x399", + "b": "0x10776", + "cmp_a_b": -1 + }, + { + "a": "0x69", + "b": "0x7", + "cmp_a_b": 1 + }, + { + "a": "0xe6f", + "b": "0x2dbc", + "cmp_a_b": -1 + }, + { + "a": "0x195", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x43", + "b": "0x14e", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0x2", + "cmp_a_b": 0 + }, + { + "a": "0x1", + "b": "0x1994", + "cmp_a_b": -1 + }, + { + "a": "0x9", + "b": "0x6a", + "cmp_a_b": -1 + }, + { + "a": "0x68b", + "b": "0xb", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x2", + "cmp_a_b": -1 + }, + { + "a": "0x2a", + "b": "0x4", + "cmp_a_b": 1 + }, + { + "a": "0x45", + "b": "0x45", + "cmp_a_b": 0 + }, + { + "a": "0x100", + "b": "0x171", + "cmp_a_b": -1 + }, + { + "a": "0x3", + "b": "0x47f6", + "cmp_a_b": -1 + }, + { + "a": "0x1b", + "b": "0x10f", + "cmp_a_b": -1 + }, + { + "a": "0x342", + "b": "0x72d", + "cmp_a_b": -1 + }, + { + "a": "0x7b", + "b": "0xb10", + "cmp_a_b": -1 + }, + { + "a": "0x458", + "b": "0x1ac", + "cmp_a_b": 1 + }, + { + "a": "0x33b", + "b": "0x2540", + "cmp_a_b": -1 + }, + { + "a": "0x3c6", + "b": "0xa5", + "cmp_a_b": 1 + }, + { + "a": "0xdf", + "b": "0xdf", + "cmp_a_b": 0 + }, + { + "a": "0xc48", + "b": "0xa", + "cmp_a_b": 1 + }, + { + "a": "0x8", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x9ad", + "b": "0x15607", + "cmp_a_b": -1 + }, + { + "a": "0x357", + "b": "0x357", + "cmp_a_b": 0 + }, + { + "a": "0x1", + "b": "0x461a", + "cmp_a_b": -1 + }, + { + "a": "0x3a4", + "b": "0x48", + "cmp_a_b": 1 + }, + { + "a": "0x7e", + "b": "0x214c", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0xb", + "cmp_a_b": -1 + }, + { + "a": "0x5", + "b": "0x91c", + "cmp_a_b": -1 + }, + { + "a": "0x43", + "b": "0x63c5", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x900", + "b": "0x31", + "cmp_a_b": 1 + }, + { + "a": "0x8a4", + "b": "0x36", + "cmp_a_b": 1 + }, + { + "a": "0xd6f", + "b": "0x186d6", + "cmp_a_b": -1 + }, + { + "a": "0xf", + "b": "0x32ef", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0x50c", + "cmp_a_b": -1 + }, + { + "a": "0x3", + "b": "0xcb2", + "cmp_a_b": -1 + }, + { + "a": "0x272", + "b": "0x4c8c", + "cmp_a_b": -1 + }, + { + "a": "0x37", + "b": "0x1fdd", + "cmp_a_b": -1 + }, + { + "a": "0x2ad", + "b": "0x229", + "cmp_a_b": 1 + }, + { + "a": "0x1", + "b": "0x1", + "cmp_a_b": 0 + }, + { + "a": "0x3", + "b": "0x189b3", + "cmp_a_b": -1 + }, + { + "a": "0xd", + "b": "0x65", + "cmp_a_b": -1 + }, + { + "a": "0xe45", + "b": "0xe45", + "cmp_a_b": 0 + }, + { + "a": "0x832", + "b": "0x832", + "cmp_a_b": 0 + }, + { + "a": "0x1b", + "b": "0x78", + "cmp_a_b": -1 + }, + { + "a": "0xb11", + "b": "0x4adb", + "cmp_a_b": -1 + }, + { + "a": "0x3", + "b": "0xb", + "cmp_a_b": -1 + }, + { + "a": "0x3ea", + "b": "0x13", + "cmp_a_b": 1 + }, + { + "a": "0x1", + "b": "0x23a4", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x4740", + "cmp_a_b": -1 + }, + { + "a": "0x993", + "b": "0x1803", + "cmp_a_b": -1 + }, + { + "a": "0x3", + "b": "0x51", + "cmp_a_b": -1 + }, + { + "a": "0xf", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x18", + "b": "0x97", + "cmp_a_b": -1 + }, + { + "a": "0x6", + "b": "0x19e", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x30c", + "cmp_a_b": -1 + }, + { + "a": "0x4e", + "b": "0x9f3", + "cmp_a_b": -1 + }, + { + "a": "0x1c", + "b": "0xa6a5", + "cmp_a_b": -1 + }, + { + "a": "0x11", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0xd3c", + "b": "0x12", + "cmp_a_b": 1 + }, + { + "a": "0x2", + "b": "0x26c", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0x2", + "cmp_a_b": 0 + }, + { + "a": "0x9ea", + "b": "0x128", + "cmp_a_b": 1 + }, + { + "a": "0xa4b", + "b": "0xa4b", + "cmp_a_b": 0 + }, + { + "a": "0x7", + "b": "0x876d", + "cmp_a_b": -1 + }, + { + "a": "0x47d", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x4f", + "b": "0x5d", + "cmp_a_b": -1 + }, + { + "a": "0x5d5", + "b": "0x103f", + "cmp_a_b": -1 + }, + { + "a": "0x92", + "b": "0xb6", + "cmp_a_b": -1 + }, + { + "a": "0xd5b", + "b": "0x66d", + "cmp_a_b": 1 + }, + { + "a": "0x19", + "b": "0xc", + "cmp_a_b": 1 + }, + { + "a": "0x56", + "b": "0x10369", + "cmp_a_b": -1 + }, + { + "a": "0x10", + "b": "0x5", + "cmp_a_b": 1 + }, + { + "a": "0x61", + "b": "0x3", + "cmp_a_b": 1 + }, + { + "a": "0x36", + "b": "0x4e3", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0x62", + "cmp_a_b": -1 + }, + { + "a": "0x12", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x97", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x133", + "b": "0xaf3", + "cmp_a_b": -1 + }, + { + "a": "0x597", + "b": "0x3", + "cmp_a_b": 1 + }, + { + "a": "0xde9", + "b": "0x2d3", + "cmp_a_b": 1 + }, + { + "a": "0x6e9", + "b": "0xd", + "cmp_a_b": 1 + }, + { + "a": "0x1a4", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x4c5", + "b": "0x1601", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x3b0", + "b": "0x3fe", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0xcce8", + "cmp_a_b": -1 + }, + { + "a": "0x52e", + "b": "0xae9f", + "cmp_a_b": -1 + }, + { + "a": "0x6", + "b": "0x159", + "cmp_a_b": -1 + }, + { + "a": "0x1c1", + "b": "0x9a4d", + "cmp_a_b": -1 + }, + { + "a": "0xce5", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x36", + "b": "0x18", + "cmp_a_b": 1 + }, + { + "a": "0x150", + "b": "0x2c06", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x386", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x1", + "cmp_a_b": -1 + }, + { + "a": "0x6", + "b": "0x7e4c", + "cmp_a_b": -1 + }, + { + "a": "0xdd", + "b": "0x9", + "cmp_a_b": 1 + }, + { + "a": "0x9", + "b": "0xd", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0xae24", + "cmp_a_b": -1 + }, + { + "a": "0x4b1", + "b": "0xe4", + "cmp_a_b": 1 + }, + { + "a": "0x6be", + "b": "0x8", + "cmp_a_b": 1 + }, + { + "a": "0x27", + "b": "0x39", + "cmp_a_b": -1 + }, + { + "a": "0x1c6", + "b": "0x10c3", + "cmp_a_b": -1 + }, + { + "a": "0x3", + "b": "0x3", + "cmp_a_b": 0 + }, + { + "a": "0x49", + "b": "0xfa", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0xaec", + "cmp_a_b": -1 + }, + { + "a": "0x4", + "b": "0x483", + "cmp_a_b": -1 + }, + { + "a": "0x647", + "b": "0xd", + "cmp_a_b": 1 + }, + { + "a": "0x88d", + "b": "0x88d", + "cmp_a_b": 0 + }, + { + "a": "0x5", + "b": "0xa1", + "cmp_a_b": -1 + }, + { + "a": "0xce", + "b": "0x75d", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0xb", + "cmp_a_b": -1 + }, + { + "a": "0xcf7", + "b": "0xc", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x4d4", + "cmp_a_b": -1 + }, + { + "a": "0xb", + "b": "0x9cc", + "cmp_a_b": -1 + }, + { + "a": "0x5c3", + "b": "0x5c3", + "cmp_a_b": 0 + }, + { + "a": "0x3e", + "b": "0xf", + "cmp_a_b": 1 + }, + { + "a": "0x852", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x49", + "b": "0x5", + "cmp_a_b": 1 + }, + { + "a": "0xe", + "b": "0x374f", + "cmp_a_b": -1 + }, + { + "a": "0xf4f", + "b": "0x1432", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x973", + "cmp_a_b": -1 + }, + { + "a": "0x3e4", + "b": "0x5", + "cmp_a_b": 1 + }, + { + "a": "0x9", + "b": "0x5", + "cmp_a_b": 1 + }, + { + "a": "0x56", + "b": "0x21", + "cmp_a_b": 1 + }, + { + "a": "0x2", + "b": "0x3", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x40d", + "cmp_a_b": -1 + }, + { + "a": "0x8", + "b": "0x2ca9", + "cmp_a_b": -1 + }, + { + "a": "0xb5", + "b": "0x14b4", + "cmp_a_b": -1 + }, + { + "a": "0xaf8", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x94", + "b": "0x717", + "cmp_a_b": -1 + }, + { + "a": "0x23b", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x9", + "b": "0x38f", + "cmp_a_b": -1 + }, + { + "a": "0x169", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0xc8", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x7", + "b": "0x5", + "cmp_a_b": 1 + }, + { + "a": "0x5", + "b": "0x2031", + "cmp_a_b": -1 + }, + { + "a": "0x4b", + "b": "0x11f7", + "cmp_a_b": -1 + }, + { + "a": "0xe82", + "b": "0xbd", + "cmp_a_b": 1 + }, + { + "a": "0x7", + "b": "0x24", + "cmp_a_b": -1 + }, + { + "a": "0x2a", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0xa", + "b": "0x53f", + "cmp_a_b": -1 + }, + { + "a": "0x4a", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x18", + "b": "0x100", + "cmp_a_b": -1 + }, + { + "a": "0x3", + "b": "0x7", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x633b", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0xc86c", + "cmp_a_b": -1 + }, + { + "a": "0x28d", + "b": "0x13", + "cmp_a_b": 1 + }, + { + "a": "0x7b4", + "b": "0x40", + "cmp_a_b": 1 + }, + { + "a": "0x1e", + "b": "0x2ca", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0xf11", + "cmp_a_b": -1 + }, + { + "a": "0x7", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x93", + "b": "0x2cc", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x1be7", + "cmp_a_b": -1 + }, + { + "a": "0x5", + "b": "0xe5", + "cmp_a_b": -1 + }, + { + "a": "0x984", + "b": "0x3", + "cmp_a_b": 1 + }, + { + "a": "0xd", + "b": "0x8a22", + "cmp_a_b": -1 + }, + { + "a": "0xa8", + "b": "0x4ab7", + "cmp_a_b": -1 + }, + { + "a": "0x28", + "b": "0x44a3", + "cmp_a_b": -1 + }, + { + "a": "0x15f", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0xd", + "b": "0x14", + "cmp_a_b": -1 + }, + { + "a": "0x2f", + "b": "0x4c", + "cmp_a_b": -1 + }, + { + "a": "0x331", + "b": "0x4bb", + "cmp_a_b": -1 + }, + { + "a": "0x47", + "b": "0x1739", + "cmp_a_b": -1 + }, + { + "a": "0x187", + "b": "0x6", + "cmp_a_b": 1 + }, + { + "a": "0x6f8", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x2c0", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x1ae", + "b": "0x3ad4", + "cmp_a_b": -1 + }, + { + "a": "0x95", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x30", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x1", + "b": "0x12b1", + "cmp_a_b": -1 + }, + { + "a": "0x9cb", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x17b4", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x6ac1", + "cmp_a_b": -1 + }, + { + "a": "0x20", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x59", + "cmp_a_b": -1 + }, + { + "a": "0x233", + "b": "0x16ef9", + "cmp_a_b": -1 + }, + { + "a": "0xb9", + "b": "0x6", + "cmp_a_b": 1 + }, + { + "a": "0x24", + "b": "0x178d8", + "cmp_a_b": -1 + }, + { + "a": "0x405", + "b": "0xfd", + "cmp_a_b": 1 + }, + { + "a": "0x20", + "b": "0x7", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x2", + "cmp_a_b": -1 + }, + { + "a": "0xf", + "b": "0x6", + "cmp_a_b": 1 + }, + { + "a": "0x3e", + "b": "0x3e", + "cmp_a_b": 0 + }, + { + "a": "0x9f9", + "b": "0x9f9", + "cmp_a_b": 0 + }, + { + "a": "0x4", + "b": "0xc34a", + "cmp_a_b": -1 + }, + { + "a": "0x24", + "b": "0x137d9", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x3", + "cmp_a_b": -1 + }, + { + "a": "0x36d", + "b": "0x23", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0xe5", + "cmp_a_b": -1 + }, + { + "a": "0xe0", + "b": "0xe90d", + "cmp_a_b": -1 + }, + { + "a": "0x5f", + "b": "0x93", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x20", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x1", + "cmp_a_b": 0 + }, + { + "a": "0x554", + "b": "0x5", + "cmp_a_b": 1 + }, + { + "a": "0x6a", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x2", + "b": "0xa4", + "cmp_a_b": -1 + }, + { + "a": "0x187", + "b": "0x88c9", + "cmp_a_b": -1 + }, + { + "a": "0x3", + "b": "0x19e", + "cmp_a_b": -1 + }, + { + "a": "0x43", + "b": "0x43", + "cmp_a_b": 0 + }, + { + "a": "0x7", + "b": "0x96fa", + "cmp_a_b": -1 + }, + { + "a": "0xe", + "b": "0xaecf", + "cmp_a_b": -1 + }, + { + "a": "0x13f", + "b": "0x2528", + "cmp_a_b": -1 + }, + { + "a": "0xa", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x1d9", + "b": "0x5", + "cmp_a_b": 1 + }, + { + "a": "0x3a", + "b": "0x15645", + "cmp_a_b": -1 + }, + { + "a": "0x587", + "b": "0x38af", + "cmp_a_b": -1 + }, + { + "a": "0xe29", + "b": "0xe29", + "cmp_a_b": 0 + }, + { + "a": "0x3", + "b": "0x3", + "cmp_a_b": 0 + }, + { + "a": "0x7", + "b": "0x13602", + "cmp_a_b": -1 + }, + { + "a": "0xeba", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x1a", + "b": "0x18", + "cmp_a_b": 1 + }, + { + "a": "0x835", + "b": "0x835", + "cmp_a_b": 0 + }, + { + "a": "0x197", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x6", + "b": "0x633e", + "cmp_a_b": -1 + }, + { + "a": "0x8", + "b": "0x6da", + "cmp_a_b": -1 + }, + { + "a": "0x5", + "b": "0x7a", + "cmp_a_b": -1 + }, + { + "a": "0x11a", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0xf", + "b": "0x282", + "cmp_a_b": -1 + }, + { + "a": "0xc21", + "b": "0x8d7d", + "cmp_a_b": -1 + }, + { + "a": "0x5e", + "b": "0x33", + "cmp_a_b": 1 + }, + { + "a": "0x14", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x36", + "b": "0x163b", + "cmp_a_b": -1 + }, + { + "a": "0x702", + "b": "0xc97d", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x1a65", + "cmp_a_b": -1 + }, + { + "a": "0x1a", + "b": "0x1fca7", + "cmp_a_b": -1 + }, + { + "a": "0x1ca", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x77a", + "b": "0x77a", + "cmp_a_b": 0 + }, + { + "a": "0x1fb", + "b": "0x1fb", + "cmp_a_b": 0 + }, + { + "a": "0x4", + "b": "0x8f", + "cmp_a_b": -1 + }, + { + "a": "0x22", + "b": "0x28", + "cmp_a_b": -1 + }, + { + "a": "0xa", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x47", + "b": "0x1583", + "cmp_a_b": -1 + }, + { + "a": "0x196", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x176", + "b": "0x176", + "cmp_a_b": 0 + }, + { + "a": "0x349", + "b": "0x103", + "cmp_a_b": 1 + }, + { + "a": "0x1e7", + "b": "0x8", + "cmp_a_b": 1 + }, + { + "a": "0x1", + "b": "0x2", + "cmp_a_b": -1 + }, + { + "a": "0x2c0", + "b": "0xeb37", + "cmp_a_b": -1 + }, + { + "a": "0x26", + "b": "0x2776", + "cmp_a_b": -1 + }, + { + "a": "0x3b", + "b": "0x1d139", + "cmp_a_b": -1 + }, + { + "a": "0x14", + "b": "0x223", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0x5", + "cmp_a_b": -1 + }, + { + "a": "0x5", + "b": "0x5", + "cmp_a_b": 0 + }, + { + "a": "0x76", + "b": "0x76", + "cmp_a_b": 0 + }, + { + "a": "0x6c", + "b": "0x42", + "cmp_a_b": 1 + }, + { + "a": "0x31", + "b": "0x7f2a", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0x4a", + "cmp_a_b": -1 + }, + { + "a": "0xec", + "b": "0xc", + "cmp_a_b": 1 + }, + { + "a": "0x9", + "b": "0x86fe", + "cmp_a_b": -1 + }, + { + "a": "0x349", + "b": "0x9", + "cmp_a_b": 1 + }, + { + "a": "0x3", + "b": "0x36d3", + "cmp_a_b": -1 + }, + { + "a": "0x3", + "b": "0x326e", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0x2a", + "cmp_a_b": -1 + }, + { + "a": "0xd", + "b": "0x1177", + "cmp_a_b": -1 + }, + { + "a": "0x17", + "b": "0x5dcd", + "cmp_a_b": -1 + }, + { + "a": "0x4", + "b": "0x7", + "cmp_a_b": -1 + }, + { + "a": "0x34", + "b": "0x953c", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0xec", + "cmp_a_b": -1 + }, + { + "a": "0x165", + "b": "0x165", + "cmp_a_b": 0 + }, + { + "a": "0xc0", + "b": "0x3", + "cmp_a_b": 1 + }, + { + "a": "0x7d", + "b": "0x23", + "cmp_a_b": 1 + }, + { + "a": "0x716", + "b": "0x1fc2", + "cmp_a_b": -1 + }, + { + "a": "0xd8", + "b": "0x8", + "cmp_a_b": 1 + }, + { + "a": "0x19d", + "b": "0xa053", + "cmp_a_b": -1 + }, + { + "a": "0x1c6", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x2f5", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x3f", + "b": "0xbddb", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0x4", + "cmp_a_b": -1 + }, + { + "a": "0x5e", + "b": "0x412", + "cmp_a_b": -1 + }, + { + "a": "0x36", + "b": "0x18", + "cmp_a_b": 1 + }, + { + "a": "0xb2", + "b": "0xa", + "cmp_a_b": 1 + }, + { + "a": "0x3ff", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x51", + "b": "0x934", + "cmp_a_b": -1 + }, + { + "a": "0xe", + "b": "0x31", + "cmp_a_b": -1 + }, + { + "a": "0x4b", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x330", + "b": "0x330", + "cmp_a_b": 0 + }, + { + "a": "0x1", + "b": "0x1", + "cmp_a_b": 0 + }, + { + "a": "0x101", + "b": "0x1db3", + "cmp_a_b": -1 + }, + { + "a": "0x6ac", + "b": "0x839", + "cmp_a_b": -1 + }, + { + "a": "0x11a", + "b": "0x65", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x858a", + "cmp_a_b": -1 + }, + { + "a": "0x1f", + "b": "0x708", + "cmp_a_b": -1 + }, + { + "a": "0x67e", + "b": "0x20", + "cmp_a_b": 1 + }, + { + "a": "0x11", + "b": "0x17", + "cmp_a_b": -1 + }, + { + "a": "0x28", + "b": "0x34", + "cmp_a_b": -1 + }, + { + "a": "0x6ac", + "b": "0xc", + "cmp_a_b": 1 + }, + { + "a": "0x30", + "b": "0x17d9", + "cmp_a_b": -1 + }, + { + "a": "0x35d", + "b": "0x115", + "cmp_a_b": 1 + }, + { + "a": "0x4", + "b": "0x6dde", + "cmp_a_b": -1 + }, + { + "a": "0x442", + "b": "0x978", + "cmp_a_b": -1 + }, + { + "a": "0x976", + "b": "0x5124", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x19cb", + "cmp_a_b": -1 + }, + { + "a": "0x9af", + "b": "0x7e8", + "cmp_a_b": 1 + }, + { + "a": "0x2", + "b": "0x8d9f", + "cmp_a_b": -1 + }, + { + "a": "0x6", + "b": "0x1d", + "cmp_a_b": -1 + }, + { + "a": "0x438", + "b": "0x438", + "cmp_a_b": 0 + }, + { + "a": "0x9bf", + "b": "0x16", + "cmp_a_b": 1 + }, + { + "a": "0xe", + "b": "0x270", + "cmp_a_b": -1 + }, + { + "a": "0x1b", + "b": "0x1b", + "cmp_a_b": 0 + }, + { + "a": "0x620", + "b": "0x40b", + "cmp_a_b": 1 + }, + { + "a": "0x36", + "b": "0x7053", + "cmp_a_b": -1 + }, + { + "a": "0xf", + "b": "0x1081e", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x5e47", + "cmp_a_b": -1 + }, + { + "a": "0xffb", + "b": "0x520e", + "cmp_a_b": -1 + }, + { + "a": "0x2d1", + "b": "0x1c", + "cmp_a_b": 1 + }, + { + "a": "0x1", + "b": "0x4", + "cmp_a_b": -1 + }, + { + "a": "0xf", + "b": "0xbc", + "cmp_a_b": -1 + }, + { + "a": "0x767", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0xab9", + "b": "0x8f", + "cmp_a_b": 1 + }, + { + "a": "0x525", + "b": "0x780", + "cmp_a_b": -1 + }, + { + "a": "0x20", + "b": "0xe858", + "cmp_a_b": -1 + }, + { + "a": "0x88", + "b": "0x3", + "cmp_a_b": 1 + }, + { + "a": "0x738", + "b": "0x9", + "cmp_a_b": 1 + }, + { + "a": "0x16", + "b": "0xb8", + "cmp_a_b": -1 + }, + { + "a": "0xc83", + "b": "0xc83", + "cmp_a_b": 0 + }, + { + "a": "0x24", + "b": "0x170c", + "cmp_a_b": -1 + }, + { + "a": "0x4c", + "b": "0x1182", + "cmp_a_b": -1 + }, + { + "a": "0x10", + "b": "0x1f", + "cmp_a_b": -1 + }, + { + "a": "0x1a4", + "b": "0x11206", + "cmp_a_b": -1 + }, + { + "a": "0x17", + "b": "0x1f7fe", + "cmp_a_b": -1 + }, + { + "a": "0x535", + "b": "0x535", + "cmp_a_b": 0 + }, + { + "a": "0x3b2", + "b": "0x7f", + "cmp_a_b": 1 + }, + { + "a": "0x72", + "b": "0x189a", + "cmp_a_b": -1 + }, + { + "a": "0x182", + "b": "0x36e5", + "cmp_a_b": -1 + }, + { + "a": "0x9a", + "b": "0xae", + "cmp_a_b": -1 + }, + { + "a": "0x56", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x928", + "cmp_a_b": -1 + }, + { + "a": "0x77", + "b": "0x50", + "cmp_a_b": 1 + }, + { + "a": "0x2cd", + "b": "0x8d8", + "cmp_a_b": -1 + }, + { + "a": "0x2d6", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x1", + "b": "0x3a", + "cmp_a_b": -1 + }, + { + "a": "0x6d", + "b": "0x4b45", + "cmp_a_b": -1 + }, + { + "a": "0x387", + "b": "0x387", + "cmp_a_b": 0 + }, + { + "a": "0x23", + "b": "0x7", + "cmp_a_b": 1 + }, + { + "a": "0x57", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 + }, + { + "a": "0x90", + "b": "0x3", + "cmp_a_b": 1 + }, + { + "a": "0x1a", + "b": "0x58", + "cmp_a_b": -1 + }, + { + "a": "0xbc", + "b": "0x3794", + "cmp_a_b": -1 + }, + { + "a": "0x118", + "b": "0x690", + "cmp_a_b": -1 + }, + { + "a": "0x5", + "b": "0xa", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x30", + "cmp_a_b": -1 + }, + { + "a": "0x3", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x33a", + "b": "0x5f7a", + "cmp_a_b": -1 + }, + { + "a": "0x2d8", + "b": "0x5f", + "cmp_a_b": 1 + }, + { + "a": "0x27", + "b": "0xc50e", + "cmp_a_b": -1 + }, + { + "a": "0x4e", + "b": "0xe", + "cmp_a_b": 1 + }, + { + "a": "0x59", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0xac", + "b": "0x2ad3", + "cmp_a_b": -1 + }, + { + "a": "0x8", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x28", + "b": "0x640f", + "cmp_a_b": -1 + }, + { + "a": "0x206", + "b": "0xa04", + "cmp_a_b": -1 + }, + { + "a": "0x9", + "b": "0x1e66b", + "cmp_a_b": -1 + }, + { + "a": "0x13", + "b": "0x11", + "cmp_a_b": 1 + }, + { + "a": "0x4", + "b": "0x13", + "cmp_a_b": -1 + }, + { + "a": "0xb9a", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x1", + "b": "0x3328", + "cmp_a_b": -1 + }, + { + "a": "0xc", + "b": "0xc", + "cmp_a_b": 0 + }, + { + "a": "0x40", + "b": "0x8", + "cmp_a_b": 1 + }, + { + "a": "0xa", + "b": "0x20", + "cmp_a_b": -1 + }, + { + "a": "0xb", + "b": "0x23d", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x17", + "cmp_a_b": -1 + }, + { + "a": "0x65d", + "b": "0xeb", + "cmp_a_b": 1 + }, + { + "a": "0x43", + "b": "0x43", + "cmp_a_b": 0 + }, + { + "a": "0x1c", + "b": "0x27", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x440", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0x3", + "cmp_a_b": -1 + }, + { + "a": "0xa40", + "b": "0xb051", + "cmp_a_b": -1 + }, + { + "a": "0x1c", + "b": "0xe", + "cmp_a_b": 1 + }, + { + "a": "0x3", + "b": "0x224", + "cmp_a_b": -1 + }, + { + "a": "0x13", + "b": "0x5", + "cmp_a_b": 1 + }, + { + "a": "0x5e5", + "b": "0x922", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x4f4", + "cmp_a_b": -1 + }, + { + "a": "0x1c2", + "b": "0x3", + "cmp_a_b": 1 + }, + { + "a": "0x4d", + "b": "0x1d", + "cmp_a_b": 1 + }, + { + "a": "0x2", + "b": "0x2", + "cmp_a_b": 0 + }, + { + "a": "0x8", + "b": "0x400", + "cmp_a_b": -1 + }, + { + "a": "0x199", + "b": "0x3278", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0x108f", + "cmp_a_b": -1 + }, + { + "a": "0x10", + "b": "0x2c", + "cmp_a_b": -1 + }, + { + "a": "0x12", + "b": "0x11529", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x25", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x1", + "cmp_a_b": 0 + }, + { + "a": "0x410", + "b": "0x410", + "cmp_a_b": 0 + }, + { + "a": "0xb", + "b": "0x11", + "cmp_a_b": -1 + }, + { + "a": "0x23e", + "b": "0x6ce", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x59", + "cmp_a_b": -1 + }, + { + "a": "0x7bc", + "b": "0x7bc", + "cmp_a_b": 0 + }, + { + "a": "0x4", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x102", + "b": "0x27", + "cmp_a_b": 1 + }, + { + "a": "0x1c9", + "b": "0x21d9", + "cmp_a_b": -1 + }, + { + "a": "0x8a1", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x5", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x87", + "b": "0xd0", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x638", + "cmp_a_b": -1 + }, + { + "a": "0x15b", + "b": "0x2ab", + "cmp_a_b": -1 + }, + { + "a": "0x8c", + "b": "0x31c", + "cmp_a_b": -1 + }, + { + "a": "0x8", + "b": "0x3e3f", + "cmp_a_b": -1 + }, + { + "a": "0xce8", + "b": "0xce", + "cmp_a_b": 1 + }, + { + "a": "0x84", + "b": "0x1212", + "cmp_a_b": -1 + }, + { + "a": "0x1e3", + "b": "0x1e7af", + "cmp_a_b": -1 + }, + { + "a": "0x86", + "b": "0xa36", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x1b9", + "cmp_a_b": -1 + }, + { + "a": "0x3f", + "b": "0x1ae", + "cmp_a_b": -1 + }, + { + "a": "0x8", + "b": "0xc1", + "cmp_a_b": -1 + }, + { + "a": "0xf", + "b": "0x4c9", + "cmp_a_b": -1 + }, + { + "a": "0xb", + "b": "0x5d", + "cmp_a_b": -1 + }, + { + "a": "0x12", + "b": "0x1a6f", + "cmp_a_b": -1 + }, + { + "a": "0x4", + "b": "0x110", + "cmp_a_b": -1 + }, + { + "a": "0x12f", + "b": "0x13", + "cmp_a_b": 1 + }, + { + "a": "0xf", + "b": "0xf", + "cmp_a_b": 0 + }, + { + "a": "0x4", + "b": "0x248", + "cmp_a_b": -1 + }, + { + "a": "0x88e", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x3dd", + "b": "0x7", + "cmp_a_b": 1 + }, + { + "a": "0xb", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x12", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x17", + "b": "0x2d", + "cmp_a_b": -1 + }, + { + "a": "0x2d", + "b": "0xf0", + "cmp_a_b": -1 + }, + { + "a": "0x1cf", + "b": "0x5", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x426a", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x33", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x104a", + "cmp_a_b": -1 + }, + { + "a": "0x18", + "b": "0x18", + "cmp_a_b": 0 + }, + { + "a": "0x5", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0xcb9", + "b": "0x34e", + "cmp_a_b": 1 + }, + { + "a": "0x24", + "b": "0x46", + "cmp_a_b": -1 + }, + { + "a": "0x48f", + "b": "0xe", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x1117e", + "cmp_a_b": -1 + }, + { + "a": "0xce1", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x950", + "b": "0x5", + "cmp_a_b": 1 + }, + { + "a": "0x1d", + "b": "0x1d", + "cmp_a_b": 0 + }, + { + "a": "0x28a", + "b": "0xc5eb", + "cmp_a_b": -1 + }, + { + "a": "0x25a", + "b": "0xb47", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x36d", + "cmp_a_b": -1 + }, + { + "a": "0x5", + "b": "0xf97d", + "cmp_a_b": -1 + }, + { + "a": "0x87f", + "b": "0x630", + "cmp_a_b": 1 + }, + { + "a": "0x3", + "b": "0x8", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0x8", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x997", + "cmp_a_b": -1 + }, + { + "a": "0x1f", + "b": "0xe1", + "cmp_a_b": -1 + }, + { + "a": "0xef", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x27", + "b": "0x1936d", + "cmp_a_b": -1 + }, + { + "a": "0xf79", + "b": "0xa0", + "cmp_a_b": 1 + }, + { + "a": "0xa4", + "b": "0x4ec9", + "cmp_a_b": -1 + }, + { + "a": "0x22", + "b": "0x26", + "cmp_a_b": -1 + }, + { + "a": "0x3e7", + "b": "0x6", + "cmp_a_b": 1 + }, + { + "a": "0x6", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x2c2", + "b": "0x18d", + "cmp_a_b": 1 + }, + { + "a": "0x70", + "b": "0x70", + "cmp_a_b": 0 + }, + { + "a": "0x9", + "b": "0x60d", + "cmp_a_b": -1 + }, + { + "a": "0x6", + "b": "0x6", + "cmp_a_b": 0 + }, + { + "a": "0x9e", + "b": "0x11281", + "cmp_a_b": -1 + }, + { + "a": "0x64", + "b": "0x63", + "cmp_a_b": 1 + }, + { + "a": "0x562", + "b": "0x907d", + "cmp_a_b": -1 + }, + { + "a": "0x31", + "b": "0x1936", + "cmp_a_b": -1 + }, + { + "a": "0x3d2", + "b": "0x1e", + "cmp_a_b": 1 + }, + { + "a": "0x1b", + "b": "0x4f98", + "cmp_a_b": -1 + }, + { + "a": "0xa46", + "b": "0x1019e", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0xa", + "cmp_a_b": -1 + }, + { + "a": "0x528", + "b": "0x5", + "cmp_a_b": 1 + }, + { + "a": "0x2", + "b": "0x43a", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0x1d", + "cmp_a_b": -1 + }, + { + "a": "0xa", + "b": "0x82", + "cmp_a_b": -1 + }, + { + "a": "0x8d", + "b": "0x3", + "cmp_a_b": 1 + }, + { + "a": "0x67", + "b": "0x67", + "cmp_a_b": 0 + }, + { + "a": "0x22", + "b": "0xa69", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0x435", + "cmp_a_b": -1 + }, + { + "a": "0x572", + "b": "0x3463", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x1", + "cmp_a_b": 0 + }, + { + "a": "0x49", + "b": "0x3530", + "cmp_a_b": -1 + }, + { + "a": "0x9fe", + "b": "0x2aa", + "cmp_a_b": 1 + }, + { + "a": "0xd1", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x830", + "b": "0x7f", + "cmp_a_b": 1 + }, + { + "a": "0x2", + "b": "0xeb43", + "cmp_a_b": -1 + }, + { + "a": "0x3", + "b": "0x17794", + "cmp_a_b": -1 + }, + { + "a": "0x487", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x20", + "b": "0x3", + "cmp_a_b": 1 + }, + { + "a": "0x14", + "b": "0x1f087", + "cmp_a_b": -1 + }, + { + "a": "0x3f", + "b": "0xa80d", + "cmp_a_b": -1 + }, + { + "a": "0x24", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x2", + "b": "0x11", + "cmp_a_b": -1 + }, + { + "a": "0x2c3", + "b": "0x2c3", + "cmp_a_b": 0 + }, + { + "a": "0x3", + "b": "0x5", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x94", + "cmp_a_b": -1 + }, + { + "a": "0xb2", + "b": "0xb2", + "cmp_a_b": 0 + }, + { + "a": "0xb", + "b": "0x837", + "cmp_a_b": -1 + }, + { + "a": "0x35", + "b": "0x4be", + "cmp_a_b": -1 + }, + { + "a": "0x1c", + "b": "0x4", + "cmp_a_b": 1 + }, + { + "a": "0x3a", + "b": "0x3a", + "cmp_a_b": 0 + }, + { + "a": "0x9", + "b": "0x1941e", + "cmp_a_b": -1 + }, + { + "a": "0x6", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x22", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x5f", + "b": "0x5f", + "cmp_a_b": 0 + }, + { + "a": "0x0", + "b": "0xd0", + "cmp_a_b": -1 + }, + { + "a": "0x6fc", + "b": "0x2dcd", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x8a4", + "cmp_a_b": -1 + }, + { + "a": "0xfa", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0xbd", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x1e", + "b": "0x4", + "cmp_a_b": 1 + }, + { + "a": "0x7", + "b": "0x15", + "cmp_a_b": -1 + }, + { + "a": "0x4c", + "b": "0xe", + "cmp_a_b": 1 + }, + { + "a": "0x941", + "b": "0x73ac", + "cmp_a_b": -1 + }, + { + "a": "0x3", + "b": "0x14", + "cmp_a_b": -1 + }, + { + "a": "0x60", + "b": "0x63", + "cmp_a_b": -1 + }, + { + "a": "0x1dd", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x7f", + "b": "0x3237", + "cmp_a_b": -1 + }, + { + "a": "0xcd", + "b": "0x21", + "cmp_a_b": 1 + }, + { + "a": "0x7", + "b": "0x23", + "cmp_a_b": -1 + }, + { + "a": "0x25", + "b": "0x18db", + "cmp_a_b": -1 + }, + { + "a": "0x3e7", + "b": "0x9", + "cmp_a_b": 1 + }, + { + "a": "0x9f2", + "b": "0x2d02", + "cmp_a_b": -1 + }, + { + "a": "0x7", + "b": "0x6619", + "cmp_a_b": -1 + }, + { + "a": "0x34", + "b": "0x741", + "cmp_a_b": -1 + }, + { + "a": "0x355", + "b": "0xa", + "cmp_a_b": 1 + }, + { + "a": "0x2b6", + "b": "0x99", + "cmp_a_b": 1 + }, + { + "a": "0x1", + "b": "0x353", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 + }, + { + "a": "0xa8", + "b": "0x61a9", + "cmp_a_b": -1 + }, + { + "a": "0x3", + "b": "0x134", + "cmp_a_b": -1 + }, + { + "a": "0x9", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x27", + "b": "0x59", + "cmp_a_b": -1 + }, + { + "a": "0xc81", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x1", + "b": "0x667c", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x193", + "cmp_a_b": -1 + }, + { + "a": "0x17", + "b": "0x13b", + "cmp_a_b": -1 + }, + { + "a": "0xbe", + "b": "0x1de", + "cmp_a_b": -1 + }, + { + "a": "0x175", + "b": "0x6f", + "cmp_a_b": 1 + }, + { + "a": "0x1cd", + "b": "0x1cd", + "cmp_a_b": 0 + }, + { + "a": "0xeb3", + "b": "0x13589", + "cmp_a_b": -1 + }, + { + "a": "0x414", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x25", + "b": "0x7", + "cmp_a_b": 1 + }, + { + "a": "0x1fd", + "b": "0x6a9e", + "cmp_a_b": -1 + }, + { + "a": "0x99", + "b": "0xf", + "cmp_a_b": 1 + }, + { + "a": "0x4f2", + "b": "0xd4", + "cmp_a_b": 1 + }, + { + "a": "0xa1", + "b": "0x52", + "cmp_a_b": 1 + }, + { + "a": "0xd2", + "b": "0x3", + "cmp_a_b": 1 + }, + { + "a": "0x10", + "b": "0x3f", + "cmp_a_b": -1 + }, + { + "a": "0x44", + "b": "0x8e1a", + "cmp_a_b": -1 + }, + { + "a": "0xea", + "b": "0x373", + "cmp_a_b": -1 + }, + { + "a": "0x2d", + "b": "0x2d", + "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": "0xfe", + "b": "0x47d6", + "cmp_a_b": -1 + }, + { + "a": "0x19a", + "b": "0x243", + "cmp_a_b": -1 + }, + { + "a": "0x8bd", + "b": "0x1a8", + "cmp_a_b": 1 + }, + { + "a": "0xa", + "b": "0x22", + "cmp_a_b": -1 + }, + { + "a": "0xb", + "b": "0xb", + "cmp_a_b": 0 + }, + { + "a": "0x13a", + "b": "0x13a", + "cmp_a_b": 0 + }, + { + "a": "0x2", + "b": "0x17", + "cmp_a_b": -1 + }, + { + "a": "0x13", + "b": "0xc", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x1a", + "cmp_a_b": -1 + }, + { + "a": "0x42", + "b": "0x324", + "cmp_a_b": -1 + }, + { + "a": "0x2a9", + "b": "0x8", + "cmp_a_b": 1 + }, + { + "a": "0x1", + "b": "0x68d", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x8e94", + "cmp_a_b": -1 + }, + { + "a": "0x70", + "b": "0x55e", + "cmp_a_b": -1 + }, + { + "a": "0x12", + "b": "0x5bf", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x5f6c", + "cmp_a_b": -1 + }, + { + "a": "0x1d9", + "b": "0xa8e", + "cmp_a_b": -1 + }, + { + "a": "0x5", + "b": "0xb63", + "cmp_a_b": -1 + }, + { + "a": "0x33", + "b": "0x1e5", + "cmp_a_b": -1 + }, + { + "a": "0x1e", + "b": "0x15ee", + "cmp_a_b": -1 + }, + { + "a": "0x251", + "b": "0x9", + "cmp_a_b": 1 + }, + { + "a": "0x2eb", + "b": "0x2eb", + "cmp_a_b": 0 + }, + { + "a": "0xb", + "b": "0xdf18", + "cmp_a_b": -1 + }, + { + "a": "0xea", + "b": "0x1325", + "cmp_a_b": -1 + }, + { + "a": "0x15", + "b": "0x25", + "cmp_a_b": -1 + }, + { + "a": "0xdad", + "b": "0x5", + "cmp_a_b": 1 + }, + { + "a": "0x654", + "b": "0x654", + "cmp_a_b": 0 + }, + { + "a": "0x5", + "b": "0x1d", + "cmp_a_b": -1 + }, + { + "a": "0x1b0", + "b": "0x2102", + "cmp_a_b": -1 + }, + { + "a": "0x57", + "b": "0x1a", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x3f", + "cmp_a_b": -1 + }, + { + "a": "0x156", + "b": "0x156", + "cmp_a_b": 0 + }, + { + "a": "0x25e", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x8f", + "b": "0x7", + "cmp_a_b": 1 + }, + { + "a": "0x1", + "b": "0x1f03", + "cmp_a_b": -1 + }, + { + "a": "0x683", + "b": "0xac1e", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x7e6", + "cmp_a_b": -1 + }, + { + "a": "0xf0", + "b": "0xf0", + "cmp_a_b": 0 + }, + { + "a": "0x6", + "b": "0x16", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x2b9", + "cmp_a_b": -1 + }, + { + "a": "0x1a0", + "b": "0x1948d", + "cmp_a_b": -1 + }, + { + "a": "0x11a", + "b": "0xc", + "cmp_a_b": 1 + }, + { + "a": "0xc", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x5bc", + "b": "0x3", + "cmp_a_b": 1 + }, + { + "a": "0x2", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x1", + "b": "0x354", + "cmp_a_b": -1 + }, + { + "a": "0xd", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x3ce", + "b": "0x10401", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0x1f02", + "cmp_a_b": -1 + }, + { + "a": "0x9", + "b": "0x181ed", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0x47", + "cmp_a_b": -1 + }, + { + "a": "0x810", + "b": "0x810", + "cmp_a_b": 0 + }, + { + "a": "0x9da", + "b": "0x98d7", + "cmp_a_b": -1 + } + ], + "test_comparison_260_130": [ + { + "a": "0x94ea07c420797000000000", + "b": "0x2a7393810d7a420000", + "cmp_a_b": 1 + }, + { + "a": "0x35eda615d842", + "b": "0xba7", + "cmp_a_b": 1 + }, + { + "a": "0x4a07dea52dbd6c0000000000000000000", + "b": "0xc2", + "cmp_a_b": 1 + }, + { + "a": "0x10f8b915fdb64400000000000000000", + "b": "0x33ab59ef560c30000", + "cmp_a_b": 1 + }, + { + "a": "0xc4a18377b88a000000000000000000000000000000000000000000000000000", + "b": "0x33df2e879c08", + "cmp_a_b": 1 + }, + { + "a": "0x2a98317e8c033e0000000", + "b": "0x4e5867c4d9cbdc000000", + "cmp_a_b": 1 + }, + { + "a": "0x5fbf2e8d58db9400000000000000000000000000000000000000", + "b": "0x8b4ae2f41214d0", + "cmp_a_b": 1 + }, + { + "a": "0x2fe4467802b1760000000000000000000000000000000000", + "b": "0x758f6b535362b4", + "cmp_a_b": 1 + }, + { + "a": "0x256ede86d6e492000000000000000000000000000000000000000000", + "b": "0x1b5a94a30a531", + "cmp_a_b": 1 + }, + { + "a": "0x2aed0a505c657400000000000000000000000", + "b": "0x5da7e3db6d69e80000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x3ce245217dba9e00000000000000000000000000000000000000", + "b": "0x1f4a5ac0d286e", + "cmp_a_b": 1 + }, + { + "a": "0x4d2b2cb010020", + "b": "0x225bd10fce7ac", + "cmp_a_b": 1 + }, + { + "a": "0x154b3149ae8621000000000000000000000000000000000000000000", + "b": "0x9f221115c1ba100000", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x3f33b646b04f34", + "cmp_a_b": -1 + }, + { + "a": "0xba7aa06b3930d0000000000000000000000000000000000000", + "b": "0xbfe60bdfff3478", + "cmp_a_b": 1 + }, + { + "a": "0x2ab72605aafdf40000000000000000", + "b": "0x24becc661bc2fa", + "cmp_a_b": 1 + }, + { + "a": "0xc3dfdb582a98c0000000000", + "b": "0xb13a0c88646878000000000", + "cmp_a_b": 1 + }, + { + "a": "0x189c81cc07ccf100000000", + "b": "0x31cb0412b6", + "cmp_a_b": 1 + }, + { + "a": "0x150b267", + "b": "0xbe8312d73ef7380000", + "cmp_a_b": -1 + }, + { + "a": "0xf27536f170cbc00", + "b": "0x3b2", + "cmp_a_b": 1 + }, + { + "a": "0x1517615594257a00000000000000000000000000000", + "b": "0x3713c5d3bb31dc000000", + "cmp_a_b": 1 + }, + { + "a": "0x3", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x2ff7d9aa12bea4000000000", + "b": "0x1499b01b53cc640", + "cmp_a_b": 1 + }, + { + "a": "0x12b1561b0457aa00000000000000000000000000000000", + "b": "0x39ba1b005b4e7e00", + "cmp_a_b": 1 + }, + { + "a": "0xcaa0d8d730e1100000000000000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0xc5e864fb3c7d9800000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x98047f6ebfae68000000000000000000000000000000", + "b": "0x1e96", + "cmp_a_b": 1 + }, + { + "a": "0xf2f7549a36033000000000000000000", + "b": "0x4a59e3e59ae86", + "cmp_a_b": 1 + }, + { + "a": "0x4651f31bb91ac0000000000000000000000", + "b": "0x198fde35e557ed00000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x118c745968fbc900000000000000000", + "b": "0x33acf4ae1aaab6000", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x5a2c6d58576f4", + "cmp_a_b": -1 + }, + { + "a": "0xa8c4bc4a1452a800000000000000000000000000000000000", + "b": "0xf5ee6432cda", + "cmp_a_b": 1 + }, + { + "a": "0x3579494ce291be00000000000000000000000000000", + "b": "0x459c18", + "cmp_a_b": 1 + }, + { + "a": "0xad9d39b95780d0000000000000000000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x1a45b4e8fca366000000000000000000", + "b": "0x490700bfca7e00000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x33c1ebce29ae3", + "cmp_a_b": -1 + }, + { + "a": "0x1b989a8a7c7d120000000000000000000000000", + "b": "0x9f49c813b0dd3000000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x58c19dcb32545c0000000000000000000000000000000000000", + "b": "0x3dcfce51726538000000000", + "cmp_a_b": 1 + }, + { + "a": "0x6973d168efb684000000000000000000000", + "b": "0x1be085c935f64d0", + "cmp_a_b": 1 + }, + { + "a": "0x422fca5c1be4440000000000000000000000000000000000000000000000", + "b": "0x27c879f34", + "cmp_a_b": 1 + }, + { + "a": "0x13a7dfb183dc19000000000000000000000000000", + "b": "0xbe7641aaa5115", + "cmp_a_b": 1 + }, + { + "a": "0xdbdc80f5e8bb58000000000000000000000000000000", + "b": "0x21cf600c84e9f00000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x8e3cc16", + "b": "0xd27449ccb70b", + "cmp_a_b": -1 + }, + { + "a": "0xda85ced9b847b0000000000000", + "b": "0x9e2b88aca65aa800000000", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x103c", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x12edf006b166b0000000", + "cmp_a_b": -1 + }, + { + "a": "0x898c83b76000b800000000000000000000000000000000000000000000000", + "b": "0x88dfaadceec2180000000000", + "cmp_a_b": 1 + }, + { + "a": "0x208146a53381aa00000000000000", + "b": "0x6a630af2e2", + "cmp_a_b": 1 + }, + { + "a": "0x4bc99b6e45325800000000000000000000000000000000000000000000000", + "b": "0x61563a68", + "cmp_a_b": 1 + }, + { + "a": "0x15154523b0834900000000000000000000000000000000000000000000000000", + "b": "0x44aea5a14b", + "cmp_a_b": 1 + }, + { + "a": "0x190ef8ed201", + "b": "0x35eb91cf716ddc00000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2ec6ddb7c543fa000000000000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x153e0e6d88ee3e0000000000000000000000000000000000", + "b": "0x8213cfe3819d7000000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0xa5505818c21768000000000000000000000000000", + "b": "0x198024ed65fbbc0000000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x110ced8aa8f77", + "b": "0x580acb7fb0", + "cmp_a_b": 1 + }, + { + "a": "0x271e61273ac16a000000000000000000000000000000000000000000", + "b": "0x80a29da1139ed80", + "cmp_a_b": 1 + }, + { + "a": "0x21805a36fb5e3400000000000000", + "b": "0x103", + "cmp_a_b": 1 + }, + { + "a": "0x79bbbdd1dc5c78000000000000000000000000000000000000000000", + "b": "0x52", + "cmp_a_b": 1 + }, + { + "a": "0x624326bd2916980000000000000000000000000000", + "b": "0x1b0", + "cmp_a_b": 1 + }, + { + "a": "0x60a3a292684ee800000000000000000000000000000000000", + "b": "0x15e0c4d0f5bbca00000000", + "cmp_a_b": 1 + }, + { + "a": "0x2be941559ba41e000000000000000", + "b": "0x8f4fa5a1abff700", + "cmp_a_b": 1 + }, + { + "a": "0x16580ce12880960000000000000000000000000000000", + "b": "0x30ebf874f06ca6", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x42e4f7815312", + "cmp_a_b": -1 + }, + { + "a": "0x90b6da1214f0c0000000000000000000000000000000000000000000000000", + "b": "0x2d811261c204a2000", + "cmp_a_b": 1 + }, + { + "a": "0x3e9d65f96654100000000000000000000000000000000", + "b": "0xcbf91cf5d5", + "cmp_a_b": 1 + }, + { + "a": "0x62b4a4df184ed", + "b": "0x7936", + "cmp_a_b": 1 + }, + { + "a": "0x6f9abef90a115c0000000000000000000000", + "b": "0x11fd7af143bf", + "cmp_a_b": 1 + }, + { + "a": "0x30f30a69f674000000000000000000000000000000000000", + "b": "0x1667563466e672000000", + "cmp_a_b": 1 + }, + { + "a": "0x2542cbfcab013800000000000000000000000000000000000000000000000000", + "b": "0x1cc07f99320201", + "cmp_a_b": 1 + }, + { + "a": "0xb55606641e076800000000000000000000000000", + "b": "0xc5f8755072f4b000000000", + "cmp_a_b": 1 + }, + { + "a": "0x1138eee5e99277000", + "b": "0x1165a16fc9762000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4d9021e0478f80000000000000000000000000000000000000000000000000000", + "b": "0x1e25191692a3", + "cmp_a_b": 1 + }, + { + "a": "0x5281d0af69f23c000000000000000000000000000000000", + "b": "0x59416896bf4a34000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x2b79554e045c4a", + "b": "0x2f44faa5b45df", + "cmp_a_b": 1 + }, + { + "a": "0x9aaac0e15022180000000000000000000000000000000", + "b": "0x3d0785a765f6300000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x15034ca88376f7000000000000000000000000000000000000000000000000000", + "b": "0xd", + "cmp_a_b": 1 + }, + { + "a": "0x51a4eb9a9a141c000000000000000000000000000000000000000000000000", + "b": "0x10187023a7eb90000", + "cmp_a_b": 1 + }, + { + "a": "0xf35d2b64f8b6f8000000000000000000000000000000", + "b": "0x12809950671b4a00000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x77ebd00e57c6b8000000000000000000000000000", + "b": "0xfe7280964523", + "cmp_a_b": 1 + }, + { + "a": "0x223779275d23fa0000000000000000000000000000000000000", + "b": "0x363914e2fb540c00", + "cmp_a_b": 1 + }, + { + "a": "0x1cfa74d72c3bef00000000000000000000000000000000000000000000", + "b": "0xd67a58dbd44500000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x25562a4d32ee500000000000000000000000000000000", + "b": "0x3b6", + "cmp_a_b": 1 + }, + { + "a": "0xc5f", + "b": "0x34a40b87a528de000", + "cmp_a_b": -1 + }, + { + "a": "0x2794dd77f9526c000000000000", + "b": "0x351d", + "cmp_a_b": 1 + }, + { + "a": "0x7085aead15fad40000000000000000000", + "b": "0x225ba934ea9f9200", + "cmp_a_b": 1 + }, + { + "a": "0x248c067bd06bbe0000000000000000000000", + "b": "0x3001c8efa4def8", + "cmp_a_b": 1 + }, + { + "a": "0xc75409191e7ac00000000000000000000000", + "b": "0x83a2c4c7c202b0000000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0xc46e00f85d30e800000000", + "b": "0x118a4257154284000", + "cmp_a_b": 1 + }, + { + "a": "0xa70626b5e2fd980000000000000000000000000000", + "b": "0x13c62affca2b9d000000", + "cmp_a_b": 1 + }, + { + "a": "0x3cd0693d9e608c00000000000000000", + "b": "0x884a4bc99c5388000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x24715cb579f9880000", + "cmp_a_b": -1 + }, + { + "a": "0x148fce305075510000000000000000000000000000000000000000000000000", + "b": "0xb00d62d50f4d780000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x62356e7f65f6bc00000000000000000000000000000000000000000000", + "b": "0xdd95a", + "cmp_a_b": 1 + }, + { + "a": "0xd97d67b239d830000000000000000000000000000000", + "b": "0x24a1c92bf9bd1a000000000", + "cmp_a_b": 1 + }, + { + "a": "0x3ae", + "b": "0xc99d811a392", + "cmp_a_b": -1 + }, + { + "a": "0xfa87a1959713800000000000000000000000000000000000000000000000", + "b": "0x7065de6424a944000000000000", + "cmp_a_b": 1 + }, + { + "a": "0xf3b963a0abec9000000000000000000000000000000000000000000000000000", + "b": "0xb3be8f69e1a808000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x15945db22fcc3400000000000000000000000000", + "b": "0x24f5c3fa10f6a8000000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x5706ebb0c707380000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x37c256fa60c50800000000000000000000000", + "b": "0x238e11d03805a20000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x235e5cb4795c1e00000000000000000000000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x5a4e24f5779388000000000000000000000000000000000000", + "b": "0x480a6dc8d3696000000000", + "cmp_a_b": 1 + }, + { + "a": "0x3b01c99dc1c11a0000000000000000000000000000000000000000", + "b": "0xd6c65450165d500000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x810dcd823d349000000000000000000000000000000000000000000", + "b": "0x3", + "cmp_a_b": 1 + }, + { + "a": "0xb57b88b163e77000000000000000000000000", + "b": "0xad5df3a19e39480", + "cmp_a_b": 1 + }, + { + "a": "0x9e9bbcbd49f2980000000000000000000000000000000000000", + "b": "0xd2896211768df0", + "cmp_a_b": 1 + }, + { + "a": "0x1cfab1b360a78c000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x2c43eef5edb", + "b": "0x139c15b187dca500000000000", + "cmp_a_b": -1 + }, + { + "a": "0x159d5317e2b79f000000000000000000000000000000000000000000", + "b": "0x2eddf76e57915e0000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x35d13c0bd93", + "b": "0x6dea5c7f82dc1400000000000", + "cmp_a_b": -1 + }, + { + "a": "0xb63c", + "b": "0x2e54", + "cmp_a_b": 1 + }, + { + "a": "0x74edd2efc89aa0000000000000000000000000000000000", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x47107c1436f99c000", + "b": "0x8552cf680d2a68000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x7ed64daf36197400000000000000000000000000000", + "b": "0x2a0e9446ac641000000", + "cmp_a_b": 1 + }, + { + "a": "0x13c58b581545d700000", + "b": "0x150ad27a645da4000", + "cmp_a_b": 1 + }, + { + "a": "0x6b1fad4140e7400000000000000000000000000000000000000000000000", + "b": "0x1659e", + "cmp_a_b": 1 + }, + { + "a": "0x529f9b88a521bc000000000000", + "b": "0x91d709b5103348000000", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 + }, + { + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 + }, + { + "a": "0x19e6f750070ee90000000000000000000000000000000000000000000000", + "b": "0x22fc4b9", + "cmp_a_b": 1 + }, + { + "a": "0x56e67b7f00c62c00000000000", + "b": "0x31049002a0bf0a000000000", + "cmp_a_b": 1 + }, + { + "a": "0xed7cd7298530c8000000000", + "b": "0x4", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x23ae23ee346a6e0", + "cmp_a_b": -1 + }, + { + "a": "0x14b275e3a10ee30000000000000000", + "b": "0x14b275e3a10ee30000000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x4f6f3851be868c00000000000000000000000000000000000000000000000", + "b": "0x339722c900c55c00000000000", + "cmp_a_b": 1 + }, + { + "a": "0xc07252e4b71778000000000000000000000000000000000", + "b": "0x13", + "cmp_a_b": 1 + }, + { + "a": "0x115a4ac095184000000000000000000000000000000000", + "b": "0x1667d5572409a50000000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x554d3ee6ebbc84000000000000000000000000000", + "b": "0xb57", + "cmp_a_b": 1 + }, + { + "a": "0xaeb275504b05400000000000000000000000000", + "b": "0x779fcd4de991b", + "cmp_a_b": 1 + }, + { + "a": "0x20cdb657506a9e000000000000000000000000000000000000000", + "b": "0xc2f0043b2859680", + "cmp_a_b": 1 + }, + { + "a": "0x1d1e6eeb9a4e0e0000000000000000000000000", + "b": "0x9de10f466e64300000", + "cmp_a_b": 1 + }, + { + "a": "0x37a55343156506000000000000000000000000000000000000000", + "b": "0xf693e7", + "cmp_a_b": 1 + }, + { + "a": "0x2f0540c23b9e78000000000000000000000000000000000", + "b": "0xb214a3099b", + "cmp_a_b": 1 + }, + { + "a": "0x1a74a694c709b5000000000000000000000000000000000000000000000000", + "b": "0xf8e16bca1806800000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x171cb3af76531e0000000", + "b": "0x424b74c39054d40000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x37bb20dc399cba0000000000000000000", + "b": "0x75d", + "cmp_a_b": 1 + }, + { + "a": "0x195d0b4aeca91a0000000000000000000000000000000000000000", + "b": "0x1d5f7024", + "cmp_a_b": 1 + }, + { + "a": "0x2542d22dac097e0000000000000000000", + "b": "0x1540fbbe80f5d6000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x486aa4cac2f8", + "b": "0x9788f380d2f470000000", + "cmp_a_b": -1 + }, + { + "a": "0x1547189d423995000000000000000000000000000000000", + "b": "0x10801f9bd7a31b00000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x2fd51105a2a05a0000000000000000000000", + "b": "0xcd466ea7effe700000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x72f8e5211925f40", + "b": "0x59", + "cmp_a_b": 1 + }, + { + "a": "0x255ce855414b3600000000000000000000000000", + "b": "0x2c", + "cmp_a_b": 1 + }, + { + "a": "0x3f091e2c2def9e0000000", + "b": "0x1d6e07911721100000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x819db", + "b": "0xdf46096b696d600000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x18d66a10f178880000000000000", + "b": "0x91e539", + "cmp_a_b": 1 + }, + { + "a": "0xc3d7b2b22a714800000000000000000", + "b": "0x34920c1c47", + "cmp_a_b": 1 + }, + { + "a": "0xb39262d6c9793800000", + "b": "0x5af422c9c1e04400000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 + }, + { + "a": "0x516ef5817ea3ac0000000000000000000000000000000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0xf855a839a5b028000000000000000000000000000000000000000000000000000", + "b": "0x30f", + "cmp_a_b": 1 + }, + { + "a": "0x1c5df5", + "b": "0x16", + "cmp_a_b": 1 + }, + { + "a": "0x1bf09795749fd1000000000000000000000000000000000000000000000000", + "b": "0xef3175f7341ca80000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x49", + "b": "0xa32e6d6c6bf6380000000000", + "cmp_a_b": -1 + }, + { + "a": "0x21da4e8f4ed9840000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0xb4154ed3975ec00000000000000000000000000000000000000000", + "b": "0x1a92cff", + "cmp_a_b": 1 + }, + { + "a": "0xc1", + "b": "0x6885d2a6ad4f0c0000", + "cmp_a_b": -1 + }, + { + "a": "0xade38d3021", + "b": "0x567015e73065840000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1f", + "b": "0x1904035f1374ca00000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4d9b6b5a53ac980", + "b": "0x618b31280a", + "cmp_a_b": 1 + }, + { + "a": "0x22ef1e3d2dd8b800000000000000000000000000000000", + "b": "0x3decc2105b70a000", + "cmp_a_b": 1 + }, + { + "a": "0x1a6", + "b": "0x13b33f12f9bc140000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x19aecee0d3cac400", + "b": "0x16dfd0e0b25e710000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4b684fe35877bc00000000000", + "b": "0x3168f70", + "cmp_a_b": 1 + }, + { + "a": "0x406b4cb33adca00000000000000000000000000000000", + "b": "0xb1a686d1d2cd880000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x181f0c90a2f3b400000000000", + "b": "0xfea996a925cb700000000", + "cmp_a_b": 1 + }, + { + "a": "0xf54f67df7a42a00000000000000000000000000000000000000000000000", + "b": "0x1b35488a0f4eb4000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x1e9d6c85ca2f1d000000000", + "b": "0x137a37afe69", + "cmp_a_b": 1 + }, + { + "a": "0xa7bc085", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x1f4f5279ee08b100000000000000000000000000000000", + "b": "0x2a19eb487274ca00000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x18a5e0769cdfe0000000000000000000000000000000000000000000000000", + "b": "0xe4b", + "cmp_a_b": 1 + }, + { + "a": "0x1c6bc332f1a81c0000000000000000000", + "b": "0x59dcffd591b1a00000", + "cmp_a_b": 1 + }, + { + "a": "0x21ff3b743828600000000000000000000000000000000000000000000", + "b": "0x3139cfa3b60b7e00", + "cmp_a_b": 1 + }, + { + "a": "0x76cb03d7a5ccc80", + "b": "0x989b3154", + "cmp_a_b": 1 + }, + { + "a": "0x4594ffd20285b00000000000000000000000000", + "b": "0x1d065c3283", + "cmp_a_b": 1 + }, + { + "a": "0x8c0b42a52916480000000000000000000000000000000000000000000000000", + "b": "0x1dcc0468eb47d7000000", + "cmp_a_b": 1 + }, + { + "a": "0xe471699908d3880000000000000", + "b": "0xea92371ea556980000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x8a7f4320a63a08000000000000000000000000000000000000000000000000000", + "b": "0x355e017b3", + "cmp_a_b": 1 + }, + { + "a": "0xc904cc4803baf000000000000000000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x1037b1290bfd7a000000", + "b": "0xe012dfbb9dbf4800000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xaf118539da21d80000000", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0xf10d0247d4d858000000000000000000000", + "b": "0x1682d7d9378ba", + "cmp_a_b": 1 + }, + { + "a": "0x1827d3f406e3850000000", + "b": "0x1d19a17ae865da0000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x6986e3dc216c38000", + "b": "0xb4", + "cmp_a_b": 1 + }, + { + "a": "0x136ace56d329f00000000000000000000000000", + "b": "0x30dfc206", + "cmp_a_b": 1 + }, + { + "a": "0x12c03a062c85a20000000000000000000000", + "b": "0x33b00188c0ce280000000000000", + "cmp_a_b": 1 + }, + { + "a": "0xc51f87639171200000000000000000000000000000000000000000000000", + "b": "0xf453284daf4f6800000", + "cmp_a_b": 1 + }, + { + "a": "0x2d8b601be4c0d8000000000000000000000000000000000000000000000000000", + "b": "0x9184a56d92c980000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x14c8194de53b2b00000000000000000000000000000000000000000000", + "b": "0x3a49b5c7920c1600000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x8e2d9f45", + "b": "0x11af13", + "cmp_a_b": 1 + }, + { + "a": "0xbed0c96ffc8470000000", + "b": "0x2eefd", + "cmp_a_b": 1 + }, + { + "a": "0x7ccace57e4e52000000000000000000000000000000000000000000000", + "b": "0x8f32b777f8791800000000000", + "cmp_a_b": 1 + }, + { + "a": "0x35a8d3845d954a000000000000000000000000000000000000000000000000000", + "b": "0xef63f5789b", + "cmp_a_b": 1 + }, + { + "a": "0x3a589120620f8e00000000000000000000000000000000", + "b": "0x23ba9a2f648f58", + "cmp_a_b": 1 + }, + { + "a": "0xf2ca072d14d19800000000000000000000000000", + "b": "0xea19bbeb2515c8000", + "cmp_a_b": 1 + }, + { + "a": "0x2539b0e5ec812a000000000000000000", + "b": "0x329255108fe8ba000000", + "cmp_a_b": 1 + }, + { + "a": "0xf", + "b": "0x520a557707eaa80000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x96ed3dfad440f80000000000000000000000000000000000000000000000000", + "b": "0x4718d6a946acb000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x37519cfe1e8a520000000000000", + "b": "0xd7d0ecc07409880000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x6785bd84722", + "b": "0x40c5458416aaa", + "cmp_a_b": -1 + }, + { + "a": "0x86b43fb0d580b0000000000000000000000", + "b": "0x32134b8006cd520000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x4d90c07e001f300000000000000000000000000000000000000", + "b": "0x36c55d9cff0dbc00000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x7ca43394ee8054000000", + "b": "0x14075b01637c", + "cmp_a_b": 1 + }, + { + "a": "0x46dd30f5a6b45800000000000000000000000000000000000000000000000", + "b": "0x1ba", + "cmp_a_b": 1 + }, + { + "a": "0xd", + "b": "0xf68ef361c", + "cmp_a_b": -1 + }, + { + "a": "0x236e3a6288a8720000000000000000000000000000000000000000000000", + "b": "0x14654cbfa909", + "cmp_a_b": 1 + }, + { + "a": "0x13a043f0a910ec0000000000000000000000000000000000000000000", + "b": "0x1a0225cf651fe2000000", + "cmp_a_b": 1 + }, + { + "a": "0x36839d417381d200000000000000000000", + "b": "0xb8e0213d88dbf000", + "cmp_a_b": 1 + }, + { + "a": "0x61f81aa0395098000000000000", + "b": "0x81fcd0f60dad300000", + "cmp_a_b": 1 + }, + { + "a": "0x1342b0ff24e5d4000000000000000000000000000000000000000000000000", + "b": "0x61c15705e75c140000000000", + "cmp_a_b": 1 + }, + { + "a": "0x2ceaf198b5ada8000000000000000000000000000", + "b": "0x220ef00c2e0", + "cmp_a_b": 1 + }, + { + "a": "0x8d75239f5e", + "b": "0xa72ff8", + "cmp_a_b": 1 + }, + { + "a": "0x1c9d9220b1a192000000000000000000000", + "b": "0xa", + "cmp_a_b": 1 + }, + { + "a": "0x10d4fa3a67fee500000000000000000000000000", + "b": "0x1eb9def126494f000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x205686b93a619c00000000000000000000000000000000000000", + "b": "0x3fe541142fa", + "cmp_a_b": 1 + }, + { + "a": "0x273c547da9deec0000000000000", + "b": "0x273c547da9deec0000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x6bf3d0f6205f900000000000000000000000000000000000000000000000", + "b": "0x17dba8b2170842000000", + "cmp_a_b": 1 + }, + { + "a": "0x166007a", + "b": "0xf487f", + "cmp_a_b": 1 + }, + { + "a": "0x1a56512cd6492a000000000000000000000000000000000000000", + "b": "0x4e3", + "cmp_a_b": 1 + }, + { + "a": "0xea7394758ad820000000", + "b": "0x41bc2a2812738400", + "cmp_a_b": 1 + }, + { + "a": "0x274c2c2c13a2ac00", + "b": "0x3720eb20f19412", + "cmp_a_b": 1 + }, + { + "a": "0x613c", + "b": "0x613c", + "cmp_a_b": 0 + }, + { + "a": "0x0", + "b": "0x1e91a098d1edaa00000000000", + "cmp_a_b": -1 + }, + { + "a": "0x5f4f6bff801e04000000", + "b": "0x44dcf08602f3b8000000", + "cmp_a_b": 1 + }, + { + "a": "0x1c7779e2d9d37a00000000000000000000000000000000000000000", + "b": "0xf2bd748ae4dba0000000000000", + "cmp_a_b": 1 + }, + { + "a": "0xe5235394253b60", + "b": "0x5fa11e5e645ce4000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x14e095dce717c80000000000000000000000000000000000000000", + "b": "0x4fc1bd3e5", + "cmp_a_b": 1 + }, + { + "a": "0x1594290e581e360000000000000000000000000000000000", + "b": "0x350550dfded72400000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x124ae845667bac000000", + "b": "0x80efae16665f3800000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x65295741b5da7", + "b": "0x6b311ea34b081c000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3303760600", + "b": "0x3303760600", + "cmp_a_b": 0 + }, + { + "a": "0x2d4bc99f35a38c000000000000000000000", + "b": "0x108b6308dbac3e000000", + "cmp_a_b": 1 + }, + { + "a": "0x41a4f73d2c02f0000000000000000000000000000000000", + "b": "0x173fb140f89af500000000", + "cmp_a_b": 1 + }, + { + "a": "0x4d006b", + "b": "0x43c08bad4b5b94000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1432504816ed6a00000000000000", + "b": "0x34", + "cmp_a_b": 1 + }, + { + "a": "0xb6814826e5d8c80000", + "b": "0x286e198c4c3cf00000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x8bd31330e59ad0000000000000000000000000000000000000000000000", + "b": "0x12b97c61382a0e000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x1f4a41641e3f170000000000000000000000000000000000000000000000000", + "b": "0xe7f1419a4ba02000000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x164a05b22b5fe300000000000000000000000000000000000", + "b": "0x5cea2a1cb1e22000000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x2", + "b": "0x14d40b17cf801000000000", + "cmp_a_b": -1 + }, + { + "a": "0x10121b54472", + "b": "0x21eb186d929be6", + "cmp_a_b": -1 + }, + { + "a": "0x77de44", + "b": "0x5526ec8d8b21e8000", + "cmp_a_b": -1 + }, + { + "a": "0x69733b430024c4000000000000000000000000000000000000000000000000000", + "b": "0x154762fb87989d0000000000", + "cmp_a_b": 1 + }, + { + "a": "0x1198b063e5e3", + "b": "0x4f08c0", + "cmp_a_b": 1 + }, + { + "a": "0x1175bbe1cfed39000000000000000000000000000000000000", + "b": "0xda44d5b9109e100000000000", + "cmp_a_b": 1 + }, + { + "a": "0xf6806aeda951580000000000000", + "b": "0x7f372766a974240", + "cmp_a_b": 1 + }, + { + "a": "0x167a75b3874b6a000000000000000000000", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x47eb4fd429d06c00000000000000000000000000000000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x1f7b2e8d609e7300000000000000000000000000000000000000000000", + "b": "0x8c6", + "cmp_a_b": 1 + }, + { + "a": "0x1f5a55c4b1249e000000000000000000000000000000000000000", + "b": "0x9fe22c83546a08", + "cmp_a_b": 1 + }, + { + "a": "0x41976dc968b91c000000000000", + "b": "0x41976dc968b91c000000000000", + "cmp_a_b": 0 + }, + { + "a": "0xc42bba62641d400000000000000000000000", + "b": "0x40eb385fa7813c", + "cmp_a_b": 1 + }, + { + "a": "0x95dbff74de9fe800000000000000000000000000000000", + "b": "0x19cde6af3f9da9000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x24f982f8c", + "b": "0x2da92041", + "cmp_a_b": 1 + }, + { + "a": "0x41480aad3fa0c00", + "b": "0x13e036d47c79710", + "cmp_a_b": 1 + }, + { + "a": "0x12b0203c92048c00000000000000000", + "b": "0x1b1999acdabecf00000000000", + "cmp_a_b": 1 + }, + { + "a": "0xbe74e1cfaeda18", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x1aa10fb8a3cf5400000000000000000000000000000000000", + "b": "0x131ccc78", + "cmp_a_b": 1 + }, + { + "a": "0x6d4864b48ebcf400000000000000000000000000000000000000000000", + "b": "0xd0c5f95", + "cmp_a_b": 1 + }, + { + "a": "0x345db297a", + "b": "0x207aeb98b290b200000000", + "cmp_a_b": -1 + }, + { + "a": "0x1d88e627", + "b": "0x1d88e627", + "cmp_a_b": 0 + }, + { + "a": "0xdf4903b58c9ae0000000000000000000000000000000000000000000", + "b": "0xca2b123145", + "cmp_a_b": 1 + }, + { + "a": "0x2f87d7515d82a", + "b": "0x3", + "cmp_a_b": 1 + }, + { + "a": "0x4", + "b": "0x59b68feb791250000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2ced707aeaeb860000000000000000000000000000000000000000000000000", + "b": "0x52a82f38401e60000", + "cmp_a_b": 1 + }, + { + "a": "0x404898489a84e00000000", + "b": "0x307b70d921deae00", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 + }, + { + "a": "0xba86bebafc34d8000", + "b": "0x10ca38c2e4939e00000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x156c6f5ee2d29a0000000000000000000000000000000", + "b": "0x209509ea78c6040000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0xb24598c600cf28000000000000000", + "b": "0x521412bb3e2d4c", + "cmp_a_b": 1 + }, + { + "a": "0x1ce37e32ee7b3600000000000000000000000000000000000", + "b": "0x1982ddd970eb2f00000000", + "cmp_a_b": 1 + }, + { + "a": "0x1dd611c85e9ec000000000000000000000000000000000000000000000", + "b": "0x5", + "cmp_a_b": 1 + }, + { + "a": "0x29", + "b": "0x645a112", + "cmp_a_b": -1 + }, + { + "a": "0xeed", + "b": "0x2bcb300b149d3c000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xb80e46784584680000000000000000000000000000000000000000000000000", + "b": "0x36a6acdd2a1a4", + "cmp_a_b": 1 + }, + { + "a": "0x16e715927", + "b": "0x16e715927", + "cmp_a_b": 0 + }, + { + "a": "0x0", + "b": "0x1b4a509ffab14d00", + "cmp_a_b": -1 + }, + { + "a": "0x169ddf44991e3b000000000000000000000000000000000000000", + "b": "0x558953c2f234", + "cmp_a_b": 1 + }, + { + "a": "0xda927c2057f53800000000000", + "b": "0x3a93f1791f156200000", + "cmp_a_b": 1 + }, + { + "a": "0x3a6f9ba87293cc000", + "b": "0x67611ce94a93640000000", + "cmp_a_b": -1 + }, + { + "a": "0x291d4db765d2040000000000000000000000000000", + "b": "0xbf21d43f1796d000000", + "cmp_a_b": 1 + }, + { + "a": "0x7b6bcd31f1a17c000", + "b": "0x158d9a1d798", + "cmp_a_b": 1 + }, + { + "a": "0x1ec4b5a05342b7000000000000000", + "b": "0x1ec4b5a05342b7000000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x41b6b473ad3a68000000000000000000000000000000000000000000", + "b": "0x3", + "cmp_a_b": 1 + }, + { + "a": "0x3c73e0310c9a0600000000000000000000", + "b": "0x15740325df3dcc00000000000", + "cmp_a_b": 1 + }, + { + "a": "0xa61680c0b6469800000000000", + "b": "0x14d7f4fa86740500000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x26861b8585774a0000000", + "b": "0x1fa99d23921b400000000", + "cmp_a_b": 1 + }, + { + "a": "0x168baff928aa5b0000000000000000000000000000000000000000000000000", + "b": "0x3bbe47a6a00a62", + "cmp_a_b": 1 + }, + { + "a": "0x15c20b6f572b72000000000", + "b": "0x88cff", + "cmp_a_b": 1 + }, + { + "a": "0x48f917cec34f58000", + "b": "0xabb4c77cc0ef500000000000", + "cmp_a_b": -1 + }, + { + "a": "0x25b6e7f9806c7600000", + "b": "0x19e93c68", + "cmp_a_b": 1 + }, + { + "a": "0x4c013b1bb585f8000000000000000000000000000000000000000000000", + "b": "0x29ab9a51002b180000000", + "cmp_a_b": 1 + }, + { + "a": "0x4042eb2626173400000", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x1130c5b551e879000000000000000000000000000000000000000000000000", + "b": "0xa825f7858c038800000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0xb21f", + "b": "0x3172d43b", + "cmp_a_b": -1 + }, + { + "a": "0x1387524d6226510000", + "b": "0x2b3ded3f2de1a200000000000", + "cmp_a_b": -1 + }, + { + "a": "0x25bef9cfa910660000000000000000000000", + "b": "0x998b", + "cmp_a_b": 1 + }, + { + "a": "0x5069c0", + "b": "0x32b13a5f60", + "cmp_a_b": -1 + }, + { + "a": "0x5e6abdb594093800000000000000000000000000000000000000000000000000", + "b": "0x1c4a17aa49cb3500000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x1da8cc14821d6800000000000000000000000000000000000000000000", + "b": "0xa4449ebafdc8100000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0xfb87f11a9b38300000000000000000000000000000000000000000", + "b": "0x34325c731", + "cmp_a_b": 1 + }, + { + "a": "0x65235d04c7732c0000000000000000000000000000000000000", + "b": "0x15b7e6788232db00", + "cmp_a_b": 1 + }, + { + "a": "0x4116c", + "b": "0x2cc206", + "cmp_a_b": -1 + }, + { + "a": "0x31fa4c35d63efa0000000000", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0xb7347feb51caf8000000000000000", + "b": "0x952e45906cd210000000000", + "cmp_a_b": 1 + }, + { + "a": "0x2ecbfcd0c016ca00000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x6f", + "b": "0x11510165b7bc080000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xf6ab7aba8109a800000000000000000000000000000000000000000", + "b": "0x67e", + "cmp_a_b": 1 + }, + { + "a": "0x6b279bc0120c78000000000000000000000000000000000", + "b": "0x18b2f", + "cmp_a_b": 1 + }, + { + "a": "0x10ac343a3c6e040000000000000000", + "b": "0x6ccdb57cef1358000000000", + "cmp_a_b": 1 + }, + { + "a": "0x160b4fbc571f590000000000000000000000", + "b": "0x63dc73b08899580", + "cmp_a_b": 1 + }, + { + "a": "0x14ab2bc8ae9a230000000", + "b": "0x2d01ddaca3ad500000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x6972a1b1f08b8c000000000000000", + "b": "0xbe3cce26da30680000000", + "cmp_a_b": 1 + }, + { + "a": "0x518052fb10c2", + "b": "0x2bdbc4a4e49874", + "cmp_a_b": -1 + }, + { + "a": "0x4245c6b2f8f79000000000", + "b": "0xc5bf2eab", + "cmp_a_b": 1 + }, + { + "a": "0x2429915", + "b": "0x167cefd6c9eef40000000000", + "cmp_a_b": -1 + }, + { + "a": "0x348", + "b": "0x296cc71f8dae640000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x121861501a54820000000000000000000000000", + "b": "0x1006bb38063caf00000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x27aaf697f24528000000000000000000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0xe1e21ddc88a3100000000000000000000000000000000000000000000000000", + "b": "0x61c25202ab", + "cmp_a_b": 1 + }, + { + "a": "0x9de3b5c674f6c000000000000", + "b": "0x2772e0c7", + "cmp_a_b": 1 + }, + { + "a": "0x4042bf4d09fd0c00", + "b": "0x4042bf4d09fd0c00", + "cmp_a_b": 0 + }, + { + "a": "0x0", + "b": "0x22", + "cmp_a_b": -1 + }, + { + "a": "0x2d6a190", + "b": "0xbd62b3ab8646f00000000000", + "cmp_a_b": -1 + }, + { + "a": "0xa740085692a0f0000000000000000000000000000000000000", + "b": "0x72af31d43dc3e0", + "cmp_a_b": 1 + }, + { + "a": "0x206df854cdcc4e0000000", + "b": "0xb0766a9bda7030000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4a4312c26ca89c0000000000000000", + "b": "0x1bc61", + "cmp_a_b": 1 + }, + { + "a": "0xec457dfa4763f80000000000000000000000000000000000000000000000", + "b": "0x2459bd1c5f4", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x2862239aaf3", + "cmp_a_b": -1 + }, + { + "a": "0x26e5a20c58ede40000", + "b": "0xc47c", + "cmp_a_b": 1 + }, + { + "a": "0xa71021907c3bd000000000000000000000000000000000", + "b": "0x1bd265e5aa8", + "cmp_a_b": 1 + }, + { + "a": "0x34d", + "b": "0x34d", + "cmp_a_b": 0 + }, + { + "a": "0x18bf35f", + "b": "0x14aef575c27b1a000", + "cmp_a_b": -1 + }, + { + "a": "0x8e5212d6a5bca00000000000000000000", + "b": "0x459c8a37d14e7c0000000", + "cmp_a_b": 1 + }, + { + "a": "0x1efa7df7637ca80000000000000000000000000000000000000", + "b": "0x28089aed20052e000", + "cmp_a_b": 1 + }, + { + "a": "0x959327fd86d048000000000000000000000000", + "b": "0x403fa5ccd80b7", + "cmp_a_b": 1 + }, + { + "a": "0x3de3", + "b": "0x3d5e17e73738c000000", + "cmp_a_b": -1 + }, + { + "a": "0x811f9b5970", + "b": "0x40d8d975c77d88000", + "cmp_a_b": -1 + }, + { + "a": "0x3eeeb5fd62e1d80000000000000000000000000000000", + "b": "0x6ba4a501d727280000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x223ab975c8ace4000000000000000000000000000000000000000000000000", + "b": "0x2cf4d013cbad90", + "cmp_a_b": 1 + }, + { + "a": "0x3675a564af9cec0000000000", + "b": "0x35770911ad", + "cmp_a_b": 1 + }, + { + "a": "0x116cfbcb551dfd0000000000000000000000000", + "b": "0x3c88feebcbd2a200000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x4f1c19", + "b": "0x15aed80a496f470000", + "cmp_a_b": -1 + }, + { + "a": "0x444f5b3dddc2680000000000000000000000000000000000000", + "b": "0x475926620bd", + "cmp_a_b": 1 + }, + { + "a": "0x4ce8e6975cf128000000000000000000000000000000000", + "b": "0x1ab5f44b66", + "cmp_a_b": 1 + }, + { + "a": "0xbc618593aff3c00000000000000000000000000000000000000000000", + "b": "0xbb5bf5f2089de80000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x86c857f6f392600000000000000000000000000000000000000000", + "b": "0x1a37a17be77cea00000000000", + "cmp_a_b": 1 + }, + { + "a": "0x18cb194", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x3e2f7b", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x26b13ea388f16c000000000000000000000000000000", + "b": "0x20de3", + "cmp_a_b": 1 + }, + { + "a": "0x321dda4e2a2dd800000000000000000000000000000000000", + "b": "0x32b79acf53ab", + "cmp_a_b": 1 + }, + { + "a": "0x12b51dadb9bedd0000000000000000000000000000000000000000000000000", + "b": "0x31ff5449ce9b0600000", + "cmp_a_b": 1 + }, + { + "a": "0x34e1e44cb5a524000000000000000000000000000000000000000", + "b": "0xbace35a7fb260000000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x21b1041c946", + "b": "0x68d0", + "cmp_a_b": 1 + }, + { + "a": "0x85ae0f7d2788080000000000000000000", + "b": "0x2123c41f142bba0000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x5da196bedea9a80000000000000000000000000000000000000000", + "b": "0x14c61", + "cmp_a_b": 1 + }, + { + "a": "0x14aab801a43de8000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x5fa99a6e84fe8c000000000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x1547ad62b8f9ba000000000000000000000", + "b": "0xbcb687cbc143e0000000000", + "cmp_a_b": 1 + }, + { + "a": "0x6f2e2228b17", + "b": "0x46e48ad001e15800000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2a4e5ae0bb", + "b": "0x762be32f0d", + "cmp_a_b": -1 + }, + { + "a": "0x237c25f059914000000000000000000000000000000000000000000", + "b": "0x8b0d323d098f90000000000", + "cmp_a_b": 1 + }, + { + "a": "0x41334b90a8ef2c00", + "b": "0x34214f9de17802", + "cmp_a_b": 1 + }, + { + "a": "0xbd84bd6a1", + "b": "0x8389b6254152280000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4f67c143acf0d800000000000000000000000000000000000000000", + "b": "0x131cb176308f", + "cmp_a_b": 1 + }, + { + "a": "0x919bedf35894600000000000000000000000000000000000000000000", + "b": "0x354d5f1d0f", + "cmp_a_b": 1 + }, + { + "a": "0x87c8e5427", + "b": "0x2002ef10da2ae600000", + "cmp_a_b": -1 + }, + { + "a": "0xddb8debf1578680000000000000000", + "b": "0xb2b3b7849e763000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x2aa94a6db36106000000000000000000", + "b": "0x1d3d8118c173a30000000000", + "cmp_a_b": 1 + }, + { + "a": "0x1883c00a4014470000000000000", + "b": "0x1883c00a4014470000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x18eaf2f9134642", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x184141620569400000000000000000000000", + "b": "0x5f", + "cmp_a_b": 1 + }, + { + "a": "0x35bf2cf10bd582000000000000000000", + "b": "0x35bf2cf10bd582000000000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x64af23c4ea29f800000000000000000000000000000000", + "b": "0x3d3818565e171a00000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x63a1d9874e39740000000000000000", + "b": "0x15fbbff93cda5a000000", + "cmp_a_b": 1 + }, + { + "a": "0x29f003c460b13c000000000000000000000000000000000000000000000", + "b": "0x37c1690111ce74", + "cmp_a_b": 1 + }, + { + "a": "0x4016fe14", + "b": "0x11f52369ec674000000", + "cmp_a_b": -1 + }, + { + "a": "0xfda606644f82d80", + "b": "0x167c1ff3cfd52c00000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x33a80d", + "cmp_a_b": -1 + }, + { + "a": "0xb5994111fd34c00000000000000000000000000", + "b": "0xd", + "cmp_a_b": 1 + }, + { + "a": "0x598b74abd380d0000000000000000000000000000000000000000", + "b": "0x14c7", + "cmp_a_b": 1 + }, + { + "a": "0xb9736d15d72c780000000", + "b": "0xb9736d15d72c780000000", + "cmp_a_b": 0 + }, + { + "a": "0x498fee842c0bd80000000000000000000", + "b": "0x3de4117ebe5a1a00", + "cmp_a_b": 1 + }, + { + "a": "0x207ee9914d8156000000000000000000000000000000000000000", + "b": "0x561a14ff401", + "cmp_a_b": 1 + }, + { + "a": "0x292bebcce8354c000000000000000000000000000000000000000000000", + "b": "0x5", + "cmp_a_b": 1 + }, + { + "a": "0x1745813f2e61be0000000000000000000000000000000000000000000", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x82df8f7325a070000000000000000000000000000000000000000000000000000", + "b": "0xd763eb78", + "cmp_a_b": 1 + }, + { + "a": "0x12ac80d06dc9a", + "b": "0x48d99a819e664c0000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x11b9b095a16e9200000000000000000000000000000000000000000", + "b": "0x8ce6ad701", + "cmp_a_b": 1 + }, + { + "a": "0x1201475d0", + "b": "0x54dd052e0f2bac0", + "cmp_a_b": -1 + }, + { + "a": "0x4", + "b": "0x32", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x1b", + "cmp_a_b": -1 + }, + { + "a": "0x246b19dc25da6e0000000000", + "b": "0x2979bff0d0ad92000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1561a0a0e481b30000000000000", + "b": "0x22801aa", + "cmp_a_b": 1 + }, + { + "a": "0x119f0c6a7084a0000000000000000000000000000000", + "b": "0x2e72d9ea511e960000000000", + "cmp_a_b": 1 + }, + { + "a": "0xaf5", + "b": "0x2ec1fa97d98106000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xa2b4db99677728000000000000000000000000", + "b": "0xb4faf2b66a", + "cmp_a_b": 1 + }, + { + "a": "0xc88a200e93830000000000000000000000000000000000000000000", + "b": "0x471fb5cf19db50000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x8ad705bf3e1b900000000000000000000000", + "b": "0x4d344be615c9fc00000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x88392bad47d598000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x4c605dea3ea7f0000000000", + "b": "0x843ec68d1adfa80000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x20a1066982b2d800000000", + "b": "0x2245713fef46ba00000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3b84629825f248000", + "b": "0xd1adc6549e61d0000", + "cmp_a_b": -1 + }, + { + "a": "0x1add8c81b2cfa20000", + "b": "0x7762252b25306", + "cmp_a_b": 1 + }, + { + "a": "0x5919b4a7b8fa2c00000000000", + "b": "0x1824e564020268", + "cmp_a_b": 1 + }, + { + "a": "0x13450d9ccbd0ed00000000000000000000000000000", + "b": "0x437d7abd5d2c94000000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x1c5b0af96a68da000000000", + "b": "0x10b390c3e9d46d0000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3af3fe32ce63220000000000000000000000", + "b": "0xc9fe5df", + "cmp_a_b": 1 + }, + { + "a": "0x17eae98b43f62600000000", + "b": "0x17eae98b43f62600000000", + "cmp_a_b": 0 + }, + { + "a": "0x1", + "b": "0xc39403d5", + "cmp_a_b": -1 + }, + { + "a": "0x1b3591005c30f10000", + "b": "0x1b3591005c30f10000", + "cmp_a_b": 0 + }, + { + "a": "0x11b43aff298a060000000000000000000000", + "b": "0x786ed3e38", + "cmp_a_b": 1 + }, + { + "a": "0x103", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x59adb4c3490fe000", + "b": "0x7d0e87f9a1639000", + "cmp_a_b": -1 + }, + { + "a": "0x13793dd8e7d31c000000000000", + "b": "0x311de48a1534ce00000000", + "cmp_a_b": 1 + }, + { + "a": "0x102fe9553c45ef0000000000000000000000000000000", + "b": "0xaa7baecd90b3f8000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x3c5d1e28", + "b": "0x22914b9", + "cmp_a_b": 1 + }, + { + "a": "0x90cebdd85262c8000000000000000000000", + "b": "0x13be8ac6317ca90000", + "cmp_a_b": 1 + }, + { + "a": "0xa89422644325480000000000000000000000000000000000000", + "b": "0xc9f842f34", + "cmp_a_b": 1 + }, + { + "a": "0x7299b10aad2c2", + "b": "0x4ce", + "cmp_a_b": 1 + }, + { + "a": "0x701c94c1fd3fd8000000000000000000000000000000000000000000000", + "b": "0x5e5e64efec3d50000000000", + "cmp_a_b": 1 + }, + { + "a": "0x54066", + "b": "0x151cdbd8d3f28b000000", + "cmp_a_b": -1 + }, + { + "a": "0x1b507ea3436e", + "b": "0x805c7cc52ec158000000000", + "cmp_a_b": -1 + }, + { + "a": "0x7ce5c6779387f40000000000000000000000000000000000000", + "b": "0x4cf7bf6abd44e80000000", + "cmp_a_b": 1 + }, + { + "a": "0x588863438d347c00000000000000000000000000", + "b": "0x134f2ff6ccb103", + "cmp_a_b": 1 + }, + { + "a": "0xb0e04901a9c5d00000000000", + "b": "0x1572cfbe321c85000", + "cmp_a_b": 1 + }, + { + "a": "0x4b5b97966575340000000000", + "b": "0x7206f5", + "cmp_a_b": 1 + }, + { + "a": "0x6108be6226bb4000000000000000000000000000000000000000000000000", + "b": "0xc2c98fede3fcb800", + "cmp_a_b": 1 + }, + { + "a": "0x5d0c3", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x2f576303bbd60e00000000000000000000000", + "b": "0x1aa5c340ab49360", + "cmp_a_b": 1 + }, + { + "a": "0x332d20e209cc2a00000000000000000000000000000000000000000000", + "b": "0x2a82127dd0053c000000000000", + "cmp_a_b": 1 + }, + { + "a": "0xf29a875991cef000000000000000000000000000000", + "b": "0xbb3542bbca8e10000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x8efa6b6a6bf4e80000000000000000000000000", + "b": "0x6bbe1970008", + "cmp_a_b": 1 + }, + { + "a": "0x1b89457aafa3a60000000000", + "b": "0x7de95df2a44f84000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xfd57db47ee3d60000000000000000000000000", + "b": "0x3449e79d5fa6fa000", + "cmp_a_b": 1 + }, + { + "a": "0x3976c9ac0c49cc000", + "b": "0x55b2", + "cmp_a_b": 1 + }, + { + "a": "0x3548e670a497ea0000000", + "b": "0x3ae2f8", + "cmp_a_b": 1 + }, + { + "a": "0xf2e250c15022b80000000000000000000000", + "b": "0x140abbb", + "cmp_a_b": 1 + }, + { + "a": "0x83c0a61456dc5000000000000000000", + "b": "0x2414cf94cf292c0000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x61b2e032cb8bd00000000000000000000", + "b": "0x13", + "cmp_a_b": 1 + }, + { + "a": "0x99164d55bb83d800000000000000000000000000000000", + "b": "0x1a19077ef183ba000", + "cmp_a_b": 1 + }, + { + "a": "0x1ccd4be6ecf6b90000000000000", + "b": "0x1b4d8f", + "cmp_a_b": 1 + }, + { + "a": "0x5407c042cd7", + "b": "0x1bfe481411159d000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xb0c0897c094da00000000000000000000000000000000000", + "b": "0x9fc470c57172780000000000000", + "cmp_a_b": 1 + }, + { + "a": "0xeac61c2244a888000000000000000000000", + "b": "0x3230b2b5d1e", + "cmp_a_b": 1 + }, + { + "a": "0x27e7c983109bfc00000000000000000000000000000000000000", + "b": "0x44d6", + "cmp_a_b": 1 + }, + { + "a": "0x107690dda132bb000000", + "b": "0x162332ead9f3330000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x14d84874bbbc4f000000000000", + "b": "0x198701dadd9398000", + "cmp_a_b": 1 + }, + { + "a": "0x49c760d63c67b8000000000000000000000000000000000000", + "b": "0xbf64e6add0b7d0000000000", + "cmp_a_b": 1 + }, + { + "a": "0x14f675a433461400000000000000000000000000000000000000000", + "b": "0x19586", + "cmp_a_b": 1 + }, + { + "a": "0x43f3f04f554b5400000000000000000000", + "b": "0x151b13abe8c23100000", + "cmp_a_b": 1 + }, + { + "a": "0x1ad8467c379aaa00000000000000000000000", + "b": "0x18b27d5df274dd0000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0xbfa0ceb989ab8800000000000000000000000000000000000000000000000000", + "b": "0x3a4890dfc2", + "cmp_a_b": 1 + }, + { + "a": "0x2e", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x13828276b789ab000000000000000000", + "b": "0x2ba1f9f86a9a4200", + "cmp_a_b": 1 + }, + { + "a": "0x3970c281d2ac50000000000000000000000", + "b": "0x3aa0ee8ec49de800", + "cmp_a_b": 1 + }, + { + "a": "0xc8a8c1c48d0c700000", + "b": "0xc8a8c1c48d0c700000", + "cmp_a_b": 0 + }, + { + "a": "0x6ea220", + "b": "0x2824ab09edace600000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x5cb5e0184add5c00000000000000000000000000000", + "b": "0x62fdef2fecac080000", + "cmp_a_b": 1 + }, + { + "a": "0x2c9b793a26537e00000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x72feb51c9c49", + "b": "0x8a514246a4d56800000000", + "cmp_a_b": -1 + }, + { + "a": "0x35e6b811883814000000000000000000000000000000000000000", + "b": "0x105fb", + "cmp_a_b": 1 + }, + { + "a": "0xef99dd2b14fb6000000000000000000000000000000000000000000000000000", + "b": "0x459513fcc8017000000000", + "cmp_a_b": 1 + }, + { + "a": "0x1205c881a56ecf00000000", + "b": "0x160da34d4", + "cmp_a_b": 1 + }, + { + "a": "0x6d36f5bbcc46280000000", + "b": "0x16e8a20f0a396400000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1eaf14757765b800000000", + "b": "0x5ff6b", + "cmp_a_b": 1 + }, + { + "a": "0x2baf347ec77eec00000000000000000000000000000", + "b": "0x2a7a9ea", + "cmp_a_b": 1 + }, + { + "a": "0xcb359635968f8800000000000000000000", + "b": "0xd7d61f0ff9", + "cmp_a_b": 1 + }, + { + "a": "0x4", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0xff0a86244236700000000000000000000000000", + "b": "0x87f1a20f989", + "cmp_a_b": 1 + }, + { + "a": "0x16dc225801eab100000000000000000000000000000000000000", + "b": "0x3f5b6570986b4c000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x1d1c8690fc100200000", + "b": "0x1f4", + "cmp_a_b": 1 + }, + { + "a": "0x95cb2b952bb7380000000000000000000000", + "b": "0x8d5b1202c21a00000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x17d3ccffbe82d10000000000000000000000000000000000000000000000000", + "b": "0x28c9a2f1daa4800000000", + "cmp_a_b": 1 + }, + { + "a": "0xf832876afc026800", + "b": "0xf832876afc026800", + "cmp_a_b": 0 + }, + { + "a": "0x95b4b238ad736000000000000000", + "b": "0xec1fa7568a9c0800000000", + "cmp_a_b": 1 + }, + { + "a": "0x762ad22ce106ec000000000000000", + "b": "0xd66d4deb29492000", + "cmp_a_b": 1 + }, + { + "a": "0x2480e2a49c4152000000000000000000000", + "b": "0x237d", + "cmp_a_b": 1 + }, + { + "a": "0x679152a0a0a5", + "b": "0x194931261a61d7", + "cmp_a_b": -1 + }, + { + "a": "0x7c04", + "b": "0x6c3a7c95f675c4000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xc15a867057c9d000000", + "b": "0x1935d5b3ac9", + "cmp_a_b": 1 + }, + { + "a": "0x4f7c1b1", + "b": "0x91ba85c4aa8e88000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3209235812b6d40000", + "b": "0x9ba05954573af8000000", + "cmp_a_b": -1 + }, + { + "a": "0x41540dec", + "b": "0x4cd3da54bb4fec00000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2010664ebc266200000000000000", + "b": "0x11be728f5d035c0000000", + "cmp_a_b": 1 + }, + { + "a": "0x8add31a4192da0000000000000000000000000000000000000000000000", + "b": "0x3ebd70f5e6aa4c0000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x3052aa2fc46586000000000", + "b": "0x46525723a78448000000", + "cmp_a_b": 1 + }, + { + "a": "0x6a40b34cf257bc000000000000000000000000000000000", + "b": "0x2e04fc9b55757a0000000000", + "cmp_a_b": 1 + }, + { + "a": "0x48a736e48b58fc00000000000", + "b": "0x89bb87e", + "cmp_a_b": 1 + }, + { + "a": "0xbbfa4ee325b8b00000000000000000000000000000000000", + "b": "0x3262464a", + "cmp_a_b": 1 + }, + { + "a": "0x2e7429a30e05d000000000000000000000000000000000000000000000000000", + "b": "0x289cbac12e7d44000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x1ddf808020eaa6000", + "b": "0x9b0f04786", + "cmp_a_b": 1 + }, + { + "a": "0x2c4a762f1", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x300951addd2d74000000000000000000000000", + "b": "0x2fc23d", + "cmp_a_b": 1 + }, + { + "a": "0x16b8ce565c7ccc000000000000000000000000000000000000000000", + "b": "0xf527671aa225", + "cmp_a_b": 1 + }, + { + "a": "0x2c492737b37160000000000000", + "b": "0x1652c47c6c85a6000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x8b30854a6b20f8000000", + "b": "0x8b30854a6b20f8000000", + "cmp_a_b": 0 + }, + { + "a": "0x143d28b54b5c0600000000000000000000000000000000000000000", + "b": "0x567ed239003eac00000", + "cmp_a_b": 1 + }, + { + "a": "0x1558cbe4c2417e000000000000", + "b": "0x2430c54f43f9dc0000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x39f9538a5d6fac000000000000000000000000", + "b": "0x55c74b9d461cf0000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x7aca570c2c41ac0000000000000000", + "b": "0x443d00a922913c00000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x245fe164eda9e400000000000000000000000000000000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0xefe7f51f8f63280000000000000000000000000", + "b": "0x23469dd787e6500000000000", + "cmp_a_b": 1 + }, + { + "a": "0x357b898e86285e0000", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0xcd43aeaccf0688000000000000000000000000000000000000000000", + "b": "0x1f58538", + "cmp_a_b": 1 + }, + { + "a": "0x761", + "b": "0xf9477667", + "cmp_a_b": -1 + }, + { + "a": "0x36c0ee2", + "b": "0x15b8fa2fb1283800000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3f17ad17ebb44a00000000000000000000000000000000000", + "b": "0x6d668b92ef13940000000000000", + "cmp_a_b": 1 + }, + { + "a": "0xff3ab57969a33800000000000000000000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x47ebd9", + "b": "0x69ad793b200b00000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x17967fc237d9140000000", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x1", + "cmp_a_b": 0 + }, + { + "a": "0x8607657a5946180000000000000000000000000000", + "b": "0x5f26e720b8e788000000000", + "cmp_a_b": 1 + }, + { + "a": "0x7fb2f7380307240000000000000000000000000000", + "b": "0x2aeea89ee116c40000000", + "cmp_a_b": 1 + }, + { + "a": "0x89dec5290f92a800000000000000000000000000000000000000", + "b": "0x12ed7b296c83d00000", + "cmp_a_b": 1 + }, + { + "a": "0x1416309a64c981000000000000000", + "b": "0xb49b5427a1f", + "cmp_a_b": 1 + }, + { + "a": "0x9b35bc93ecad7000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x901b6f85f432380000000000000000000000000000000000000000000", + "b": "0x4d6f92a1c8", + "cmp_a_b": 1 + }, + { + "a": "0x51b9aaf29905d000000000000000000000000000000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x33d1130", + "b": "0x16", + "cmp_a_b": 1 + }, + { + "a": "0x1657c191da1ab0000000000000000000000000000000000000000000000000", + "b": "0x24b064ab00d", + "cmp_a_b": 1 + }, + { + "a": "0x1120ef38f726b5000000000000000000000000000000000000", + "b": "0x715043573a61a8000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x3e59bf2ad41ea40000000000000000000", + "b": "0x16d19133e9a5", + "cmp_a_b": 1 + }, + { + "a": "0x198dbe250b4cc60000000000000000000000000000000000000", + "b": "0x60f3f9d528e4f40000", + "cmp_a_b": 1 + }, + { + "a": "0x1f17bf235cdd34000000000", + "b": "0xac73b3ad5795f8000000", + "cmp_a_b": 1 + }, + { + "a": "0x252933dc8d2fb2000000000000000000000000000000000000000", + "b": "0xb7443b0c1c31b000000", + "cmp_a_b": 1 + }, + { + "a": "0xa", + "b": "0x679839e4c1aae00000", + "cmp_a_b": -1 + }, + { + "a": "0x358680f709e8400000000000000000000000000000000000000000000", + "b": "0x4826bb2a0c6e4c", + "cmp_a_b": 1 + }, + { + "a": "0x3cbbd3c2731bd600000000000000000000000000000000000000000000", + "b": "0x19775f66536ac00000000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x1022bdbe", + "b": "0x4", + "cmp_a_b": 1 + }, + { + "a": "0xd5762cf93a9f900000000000000000000000000000", + "b": "0x11a84c4ff63f3f0000000000", + "cmp_a_b": 1 + }, + { + "a": "0x1c78b85b81b53d000000000000000", + "b": "0x605f586", + "cmp_a_b": 1 + }, + { + "a": "0x421fc5372b0db8000000000000000000000000000000000", + "b": "0x1aa", + "cmp_a_b": 1 + }, + { + "a": "0x6e2038d2defb100000000000000000000000000000000000000", + "b": "0x2b448564fb6b12000000000000", + "cmp_a_b": 1 + }, + { + "a": "0xd14442c7cd70f800000000000000000000000000000000", + "b": "0x4138c4d7ff2008000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x170c0b50d3d52200000000000000000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x111e826def0f460000000000000", + "b": "0x22a548e1d97a7e0", + "cmp_a_b": 1 + }, + { + "a": "0x2aadd80578be", + "b": "0x14b25cd19e757200", + "cmp_a_b": -1 + }, + { + "a": "0x344d4ff589142c00000000000000000000000000000000000000000", + "b": "0x9c47", + "cmp_a_b": 1 + }, + { + "a": "0x9e9c6cbbfdc5", + "b": "0x1220c624e11dd400000000000", + "cmp_a_b": -1 + }, + { + "a": "0x102133492374660000000000000000000000000000000000000000000000000", + "b": "0x69eeb1349", + "cmp_a_b": 1 + }, + { + "a": "0x51cfebd85afbd00000000000000000000000000000000000000000", + "b": "0x422ee14035af44", + "cmp_a_b": 1 + }, + { + "a": "0x737796", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x2330e3b040a0ee000000", + "b": "0x166489d439ff58000", + "cmp_a_b": 1 + }, + { + "a": "0xf4458916aefbc000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x27ff62bb939fb80000000000000000000000000000000000000000", + "b": "0x4a7205da274164000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x12b49c67eba86600000", + "b": "0xbe68ec4ec4ebe8000000", + "cmp_a_b": -1 + }, + { + "a": "0x2600aaf560893e00000000000000000000000000000000000000000000000000", + "b": "0x14658c72f5dfb0000", + "cmp_a_b": 1 + }, + { + "a": "0x4ae0", + "b": "0x36", + "cmp_a_b": 1 + }, + { + "a": "0x16745ec172eb45000000000000000000000000000", + "b": "0x32a3a9b5", + "cmp_a_b": 1 + }, + { + "a": "0x6e61d777ab6c1800", + "b": "0x46c353446a30dc0000000000", + "cmp_a_b": -1 + }, + { + "a": "0x64f5fa8391eaa40000000000000000000000000000000000000000", + "b": "0xe236f00", + "cmp_a_b": 1 + }, + { + "a": "0x146fce7bd47c330000000000000000000000000000000000000000000000", + "b": "0x4d2ea957e5e0f000000", + "cmp_a_b": 1 + }, + { + "a": "0x4efbd2f331", + "b": "0x4902342fb61e14", + "cmp_a_b": -1 + }, + { + "a": "0x1235ee07dcf33f0000000000000000000000000000000", + "b": "0x32e11", + "cmp_a_b": 1 + }, + { + "a": "0x30e6a2db9d84080000000000", + "b": "0x16108ce5", + "cmp_a_b": 1 + }, + { + "a": "0x1a", + "b": "0x7fb26623a", + "cmp_a_b": -1 + }, + { + "a": "0xee", + "b": "0x1a24286ef6c47", + "cmp_a_b": -1 + }, + { + "a": "0x2700e4df6afeac0000000000000000000000000000000000000", + "b": "0x39ff7af59", + "cmp_a_b": 1 + }, + { + "a": "0x11b8fa3f09129b000000000000000000000000000000000000000000", + "b": "0x368504097e", + "cmp_a_b": 1 + }, + { + "a": "0x1", + "b": "0x3e260cf9580a0a0000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3065fad3f203d00000000000000000000", + "b": "0xac47fdb3510850000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x65e391c232e53c000000000000", + "b": "0x780363855f29a800000000000", + "cmp_a_b": 1 + }, + { + "a": "0xd576fca059ef880000000000000000000000000000000000000", + "b": "0xdb58dcbb2", + "cmp_a_b": 1 + }, + { + "a": "0x8c124fdc905138000", + "b": "0x125076aa6753620000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x9b1e269133a5200000000000000000000000000000000000000000000000000", + "b": "0x5e0dfc49386ee0000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x119f6d4a655f6e", + "b": "0x50dcc8c", + "cmp_a_b": 1 + }, + { + "a": "0x907", + "b": "0x136ffbbece170900", + "cmp_a_b": -1 + }, + { + "a": "0xa3123c12a4a7580000000000000000000000000000", + "b": "0x7", + "cmp_a_b": 1 + }, + { + "a": "0x92cd49456dbf000000000000000000000", + "b": "0xd21d0b644f89180", + "cmp_a_b": 1 + }, + { + "a": "0xc7fdbfb90f78b80000000000000000000", + "b": "0x110629591a2c7c0000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x89240", + "b": "0xd", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x16c", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x3ef5c0e", + "cmp_a_b": -1 + }, + { + "a": "0x14e31fbd67f5800000000", + "b": "0x14e31fbd67f5800000000", + "cmp_a_b": 0 + }, + { + "a": "0x67ec5e227062c800000000000000000000000000000000000000000000000", + "b": "0x712cc985087b1c00000000000", + "cmp_a_b": 1 + }, + { + "a": "0x29b8978d1596cc000000000", + "b": "0x102", + "cmp_a_b": 1 + }, + { + "a": "0x2ecf72f14cd7d40000000000000000", + "b": "0x30", + "cmp_a_b": 1 + }, + { + "a": "0x386c991560508200000000000000000000000000000000000000000000000", + "b": "0xa4225963", + "cmp_a_b": 1 + }, + { + "a": "0x1038f05f3e5c5000000000000000000000000", + "b": "0x85ceb2d3", + "cmp_a_b": 1 + }, + { + "a": "0x7", + "b": "0x22d7b4c7cdb35a0000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2d2e06c31b901000", + "b": "0x25f1b0e86bad34000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1647144b7064fd0000000000000000000000000000000", + "b": "0x5711fce97c9a3800000", + "cmp_a_b": 1 + }, + { + "a": "0x546b2bba4c894000", + "b": "0x546b2bba4c894000", + "cmp_a_b": 0 + }, + { + "a": "0x345d0132466648000000000000000000", + "b": "0x11211912dc65f50000000000", + "cmp_a_b": 1 + }, + { + "a": "0x1fb1576134de6000000000000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x56c10e6eb18b280", + "b": "0xbe1a09b4751b1", + "cmp_a_b": 1 + }, + { + "a": "0x24221180facdda0000000000000000000", + "b": "0x14dffa64117d74000", + "cmp_a_b": 1 + }, + { + "a": "0xfbbbfd9ba38a98000000000000000000000000000000", + "b": "0x2e1663173b06e40000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x3ad556abb79e08000", + "b": "0x7f718e6cfaaae000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4380759cdc66d40000000000000", + "b": "0x203de78059691a000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x86f9fea39389700000000000000000000000000000", + "b": "0x54a143d20", + "cmp_a_b": 1 + }, + { + "a": "0x4cbf357c323a000000000000000", + "b": "0x92598cd7692348000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x6bc10163ab", + "b": "0x1fb92643539eed0000", + "cmp_a_b": -1 + }, + { + "a": "0x7c6874db8e50e0000000000000000000000000", + "b": "0x2c467cb3ddb07800000000000000", + "cmp_a_b": 1 + }, + { + "a": "0xff40ae26a2e998000000000000", + "b": "0x14aabeebd7c77e0000", + "cmp_a_b": 1 + }, + { + "a": "0x27c8422c1e326400000000000000000000000000000000", + "b": "0x13e1609e26747b000000000", + "cmp_a_b": 1 + }, + { + "a": "0xe1", + "b": "0x7693efb", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x11b1235", + "cmp_a_b": -1 + }, + { + "a": "0x17c44c1412f8b800000", + "b": "0x117d6b21846456000", + "cmp_a_b": 1 + }, + { + "a": "0x290b1979bf7e4400000000000000000000000000000000000000000000", + "b": "0x67966f2c19dd", + "cmp_a_b": 1 + }, + { + "a": "0x14ed1c5c93be02000000000000000000", + "b": "0x14ed1c5c93be02000000000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x1bea20a8140770000000000000000000000", + "b": "0x7c825a", + "cmp_a_b": 1 + }, + { + "a": "0xa46c0316acc35000000000000000000", + "b": "0xdbfb66f297d5", + "cmp_a_b": 1 + }, + { + "a": "0x4c45fdc8f0d8800000000000", + "b": "0x73ba5bc056d5fc0000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x375109ae2903ec00000", + "b": "0x44", + "cmp_a_b": 1 + }, + { + "a": "0x270c09fce8b59a000000000000", + "b": "0x1e3ed6b", + "cmp_a_b": 1 + }, + { + "a": "0x7acd", + "b": "0x7", + "cmp_a_b": 1 + }, + { + "a": "0x236b542b445fe40000000000000000000", + "b": "0x1af33a8c20e19c00000000", + "cmp_a_b": 1 + }, + { + "a": "0x1581478fc9fe27000000000000000000000000000000000", + "b": "0x91ef36778fb8000000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0xfad71bffbcc8900000", + "b": "0x4", + "cmp_a_b": 1 + }, + { + "a": "0x1dd8b08147f8d9000000000000000000000000000000000000000000", + "b": "0x22767bc1fc97340000", + "cmp_a_b": 1 + }, + { + "a": "0x3ed4c67bce10ca000000000000000000000000", + "b": "0xdf301aa15ed85800", + "cmp_a_b": 1 + }, + { + "a": "0x6eab27b8", + "b": "0x45", + "cmp_a_b": 1 + }, + { + "a": "0x265fb2fa5dea84000000000000000000000000000000000000000000", + "b": "0x49c5", + "cmp_a_b": 1 + }, + { + "a": "0x1c88fdf97efdef0000000000000000000000000000000000000000000", + "b": "0x6577da", + "cmp_a_b": 1 + }, + { + "a": "0x54", + "b": "0x772bf5b4078", + "cmp_a_b": -1 + }, + { + "a": "0x3e9cad61ab01d200000000000000000000000000000", + "b": "0x42172dcab8d41", + "cmp_a_b": 1 + }, + { + "a": "0x33e9e1d245283e0000", + "b": "0x17b05e88309dc100000000", + "cmp_a_b": -1 + }, + { + "a": "0x2204f7", + "b": "0x849c11d", + "cmp_a_b": -1 + }, + { + "a": "0x113b233afbe80d000000000000000", + "b": "0x2b1661ce141ed60000000", + "cmp_a_b": 1 + }, + { + "a": "0x190f64d087c70100000000000000000000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x291fbdee4d0b3e00000000000000000000000000000", + "b": "0x6639", + "cmp_a_b": 1 + }, + { + "a": "0x32ac", + "b": "0x254e6194e021b40000000000", + "cmp_a_b": -1 + }, + { + "a": "0x80602d099773c8000000000000000000000", + "b": "0x927287a", + "cmp_a_b": 1 + }, + { + "a": "0x44581", + "b": "0x2cf4fea79a08e0000", + "cmp_a_b": -1 + }, + { + "a": "0x282a7e7a", + "b": "0x1945b8bf8da", + "cmp_a_b": -1 + }, + { + "a": "0xcd1ff9dd2f8fe80000000000000000000000000", + "b": "0x7b32f57013", + "cmp_a_b": 1 + }, + { + "a": "0x24e362ea1217a8000000000000000000000000000000000000000000", + "b": "0x2fd", + "cmp_a_b": 1 + }, + { + "a": "0x1305df001a8a270000000000000000000000000000000000000000000", + "b": "0x45a0ead51462c40000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x3df2445bd7820e00000000000000000000000000000000000000", + "b": "0x1070eb89bd7dd900", + "cmp_a_b": 1 + }, + { + "a": "0x4bc2a4e52c60e00000000000000000000000000000000000000000000", + "b": "0x11bceba092d957000000", + "cmp_a_b": 1 + }, + { + "a": "0x53333ef120769c00000000000000000000000000000000000000000000000", + "b": "0x37c13df144455400000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0xc51113fac1c0180000000000000000000000000000000000000000000000000", + "b": "0x75a99227a3280400000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x315bef8e3feea800000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x3b0f6", + "cmp_a_b": -1 + }, + { + "a": "0x1c41540de5d0c4000000000000000000000000000000000000000000000", + "b": "0x1d0017d59de1630000000", + "cmp_a_b": 1 + }, + { + "a": "0x114dd588a5fbb800000000000000000000000000000000", + "b": "0x45a2a76f9260040000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x4c656947dbcc1400000000000000000000000000000", + "b": "0x246899d27acea80000000000", + "cmp_a_b": 1 + }, + { + "a": "0x31c608e0b5437e0000000", + "b": "0x327be5158b96cc0000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2b701eb55accf", + "b": "0x3202696b1630d4000000", + "cmp_a_b": -1 + }, + { + "a": "0x4e476e2f56978800", + "b": "0x186741cde3d4a20", + "cmp_a_b": 1 + }, + { + "a": "0x39ae56574fe4f200000000000000000000000000000000000000", + "b": "0x7912afe59e38c", + "cmp_a_b": 1 + }, + { + "a": "0x350cc6fe0ba686000000000000000000000000000000000000000", + "b": "0x2641", + "cmp_a_b": 1 + }, + { + "a": "0x26", + "b": "0x26", + "cmp_a_b": 0 + }, + { + "a": "0x26c9d0abd0b98a000000000000000000000000000000000000000000000000", + "b": "0x21de915a34e7ee00000", + "cmp_a_b": 1 + }, + { + "a": "0x178dda9", + "b": "0x3a5aa9ab747fdc000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2ab6e959cee93400", + "b": "0x315ea05bdd25ee00000000", + "cmp_a_b": -1 + }, + { + "a": "0x4b707b2e91b06c00000000000000000000000000000", + "b": "0x2d8bd1d13ac98c0000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x10e416176710320000000000000000000000", + "b": "0x278ff2be520f", + "cmp_a_b": 1 + }, + { + "a": "0x67025a55af78cc00000000000000000000000000", + "b": "0x26c7d87f2191d", + "cmp_a_b": 1 + }, + { + "a": "0xadb35e511d4cf000000000000000000000000000000000000000000000000", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x1833027d5ab3480000000000000", + "b": "0x52b4f01b59d26800000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2c21fce2bcfc0e0000", + "b": "0x43e901a876c4f0000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x14c504385b129500000000", + "b": "0x8acfdd", + "cmp_a_b": 1 + }, + { + "a": "0x294231e5d9519c00000000000000000000000000000000000", + "b": "0xdd064ac7b724f000000000", + "cmp_a_b": 1 + }, + { + "a": "0x6ac75df7fbc64", + "b": "0x47ac", + "cmp_a_b": 1 + }, + { + "a": "0x485bb7f80788fc000000000000000000000000000000000000000000", + "b": "0x34fc37211dfae20000000", + "cmp_a_b": 1 + }, + { + "a": "0x1f9d8ae5980e3400000000000000000000000000000000000", + "b": "0x1094a814f5948c0000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x4647618f7d9a1c0000000000", + "b": "0x1c35c57c3c9ad9000000", + "cmp_a_b": 1 + }, + { + "a": "0x194cd065c2143b0000000000000000000000000000000000000000000000", + "b": "0x28816133ffb5", + "cmp_a_b": 1 + }, + { + "a": "0xcb3e3464ae3728000000000000000000000000000000", + "b": "0x9a5f354d6b5758000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x17910534ce8a0200000000000000000000000000000000000000000", + "b": "0x6187687267e6fc00000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x28f60f4858e812000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0xd7c6aa565acbf00000", + "b": "0x1937dfc6a686a800000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x9f697ed154be28000000000000000000000", + "b": "0x657a61fba7f3cc00000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x20680", + "b": "0x21602227235fda00000", + "cmp_a_b": -1 + }, + { + "a": "0x102c86a6ee01c60000000000000000000000000000000000000000000", + "b": "0x4cbf4", + "cmp_a_b": 1 + }, + { + "a": "0x2d4cf2b9323d", + "b": "0x1919e45499055f0000", + "cmp_a_b": -1 + }, + { + "a": "0x125e5e854f703f00000", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x6ffd2b1e43e7a", + "b": "0x3", + "cmp_a_b": 1 + }, + { + "a": "0x1ec28a91bb59de0000", + "b": "0x4c61e", + "cmp_a_b": 1 + }, + { + "a": "0x39403820c4740c00000000000000000000000", + "b": "0x3df8", + "cmp_a_b": 1 + }, + { + "a": "0xd0573617bfc02800000000000000000000000000", + "b": "0x691ef23fdbf11800000000", + "cmp_a_b": 1 + }, + { + "a": "0x518", + "b": "0x518", + "cmp_a_b": 0 + }, + { + "a": "0xee2abc23c90608000000", + "b": "0x593be1d6daca64", + "cmp_a_b": 1 + }, + { + "a": "0x738f74d27e595c00000000000000000000000000", + "b": "0x6aa0", + "cmp_a_b": 1 + }, + { + "a": "0x1e9ae472cc316e0000000000000000", + "b": "0x9856ef8d44c898000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x357b91befb5ec4000000000000000000000000000000000000000000", + "b": "0x2acef87f5703ae0000000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0xdf0d9ca0af56a0000000000000000", + "b": "0x3a2e4a7d291b8c00000", + "cmp_a_b": 1 + }, + { + "a": "0x3f396ba8ba3", + "b": "0xbbffcf9fd2f0c8000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x37cf3869f2de8600000000000000000000000000000000000000", + "b": "0xf20d312ddaece000", + "cmp_a_b": 1 + }, + { + "a": "0x6cc", + "b": "0x11bc509bf185f200000", + "cmp_a_b": -1 + }, + { + "a": "0x28577aeb73985a00000", + "b": "0x4b6b74dc071eb0000000000", + "cmp_a_b": -1 + }, + { + "a": "0x10d7526ba684db00000000000000000000000000000", + "b": "0x25746ddc", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x206e3b1ead63a00000", + "cmp_a_b": -1 + }, + { + "a": "0x16cd76e4803ad80000", + "b": "0x16cd76e4803ad80000", + "cmp_a_b": 0 + }, + { + "a": "0x1c702bf18b5bd8000000000000000000000000000000000", + "b": "0x456541f5c28ee40", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x18a777ebd873b7000", + "cmp_a_b": -1 + }, + { + "a": "0xbbbfb479ffb148000000000", + "b": "0x18f194092ad6a7000", + "cmp_a_b": 1 + }, + { + "a": "0xf60d86f7a00e", + "b": "0x1269f3", + "cmp_a_b": 1 + }, + { + "a": "0xe2d10", + "b": "0x8fc0af0d27ccf8", + "cmp_a_b": -1 + }, + { + "a": "0x143cb56f772e0c0000000000000000", + "b": "0x36ca", + "cmp_a_b": 1 + }, + { + "a": "0x557c51eec8c694000000000000000000000000", + "b": "0x1c7aa74171fb52000", + "cmp_a_b": 1 + }, + { + "a": "0x10b44f62d0a62", + "b": "0x10b44f62d0a62", + "cmp_a_b": 0 + }, + { + "a": "0x45835bdabe2c380000000000000000000000000", + "b": "0x172935", + "cmp_a_b": 1 + }, + { + "a": "0x440cb1b55210d8000000", + "b": "0x6d9b800e2e97980000", + "cmp_a_b": 1 + }, + { + "a": "0x6cecce3a5eabf0000000000000000000000000000", + "b": "0x76ec5", + "cmp_a_b": 1 + }, + { + "a": "0x1b300853a986d80000000000000000000000000000000000000", + "b": "0x243e14f2f9", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x1db02a19a918b70000000", + "cmp_a_b": -1 + }, + { + "a": "0x38e0b62cd1feec", + "b": "0x9", + "cmp_a_b": 1 + }, + { + "a": "0x2f292c96aa23b80000000000000", + "b": "0x5d0fced6f250a40000000000", + "cmp_a_b": 1 + }, + { + "a": "0x4fea265dd30168000000000000000000000000000000", + "b": "0x71913bd92f001c00", + "cmp_a_b": 1 + }, + { + "a": "0xacbcd3bd20a10800000000000000", + "b": "0x503", + "cmp_a_b": 1 + }, + { + "a": "0x3dd956", + "b": "0x46de7725011428", + "cmp_a_b": -1 + }, + { + "a": "0x18f0f7ff151a53000000000000000000000000000000000000000", + "b": "0x1ff4c1458fe", + "cmp_a_b": 1 + }, + { + "a": "0x166de4043bdfde000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x2a7479da2273d2000000000000000000000000000000000000000000", + "b": "0x45034729f92", + "cmp_a_b": 1 + }, + { + "a": "0x224fa98e3e27e40000000000000", + "b": "0x170e1dd0b68a260000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x4583b7cc268f", + "b": "0x50420e547a202800000000000", + "cmp_a_b": -1 + }, + { + "a": "0x8f52f01d54f7780000000000000000000000000000000000000", + "b": "0x25491f327b603c000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x2846ba455c53140000000000000", + "b": "0x168e95ef945ecd00000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x244e4439668808000000000000000000000000000000", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0xde4a6f74be92580", + "b": "0x1943d1f240654a000000000", + "cmp_a_b": -1 + }, + { + "a": "0x50e017471", + "b": "0x8e105ad8641e60", + "cmp_a_b": -1 + }, + { + "a": "0x3e4c1145f8ff72000000000000000000000000000", + "b": "0x25", + "cmp_a_b": 1 + }, + { + "a": "0x1c10aa4bb87948000000000000000000000000000000000000000000000", + "b": "0x27b31", + "cmp_a_b": 1 + }, + { + "a": "0xf23b6cbfbddb60000000000000000000000000000000000000", + "b": "0x378f702", + "cmp_a_b": 1 + }, + { + "a": "0x450904808b7f84000000", + "b": "0x701608cb6e671000000000", + "cmp_a_b": -1 + }, + { + "a": "0x28f742b14a68da000000000000000000000", + "b": "0x3f5567e838a", + "cmp_a_b": 1 + }, + { + "a": "0x65528", + "b": "0x2790c926f37cbe00000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xa9116ab3970d60000000000000000000000000000", + "b": "0x8480aef2ab4c6000000", + "cmp_a_b": 1 + }, + { + "a": "0x63b82d6ff9a2900000000000000000000000000000000000000", + "b": "0x6bff23306634c00000", + "cmp_a_b": 1 + }, + { + "a": "0x56132766b208740000000000000000000000000", + "b": "0x9f", + "cmp_a_b": 1 + }, + { + "a": "0x54d9ef48b7f0080000000000000", + "b": "0x3cb39550332", + "cmp_a_b": 1 + }, + { + "a": "0x2b24a599a3462e0000000000000000000000000", + "b": "0x135b094bbbb4bd000", + "cmp_a_b": 1 + }, + { + "a": "0x1794e7ed3a8f72000000000000000000000000", + "b": "0x15bb984705f3010000000", + "cmp_a_b": 1 + }, + { + "a": "0x3e93cb7acc1d2600000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0xdd61d69aacece0000000000000000000000000000000000000000000000000000", + "b": "0x59527e4b3aa2ac000000000", + "cmp_a_b": 1 + }, + { + "a": "0x65f3", + "b": "0x9e8438bc04bf580", + "cmp_a_b": -1 + }, + { + "a": "0xc152d59559366000000000000000000000000000000000000000", + "b": "0x380a5897", + "cmp_a_b": 1 + }, + { + "a": "0x53f2972b619bd40000000000000000000000000000000000000000000000", + "b": "0xae33d187bb446000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x7f9f52b0e396d80000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0xe8a57bc8565fd800000000000000000000000000000", + "b": "0x120b080d8a52ce00000000000", + "cmp_a_b": 1 + }, + { + "a": "0x27d3236ab890160000000000000000000000", + "b": "0x59782be2e5333c00", + "cmp_a_b": 1 + }, + { + "a": "0x2b38b8518b107e00000000000000000000000000000", + "b": "0x149456d0ff27f60000", + "cmp_a_b": 1 + }, + { + "a": "0x3778ed052088dc", + "b": "0x1ba2f43ba3558e0000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x27c3e65f3d98d200000000000000000", + "b": "0x893a561e19d59000", + "cmp_a_b": 1 + }, + { + "a": "0x12a34a82aa73b3000000000000", + "b": "0x2720134fe44cc8000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3c3eb060e93e4e000000", + "b": "0x3461167691f1720000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3ac1aa9f9a5bee00000000000000000000000000000000000", + "b": "0x4cbcc", + "cmp_a_b": 1 + }, + { + "a": "0xaf1f1", + "b": "0xaf1f1", + "cmp_a_b": 0 + }, + { + "a": "0x846263a8151d480", + "b": "0x846263a8151d480", + "cmp_a_b": 0 + }, + { + "a": "0x339b2b660d4216000000000000000000000000000000", + "b": "0x7d", + "cmp_a_b": 1 + }, + { + "a": "0xb033b25c4e4098000000000000000000000000000000000000", + "b": "0x2eabbe3bacda7e000000", + "cmp_a_b": 1 + }, + { + "a": "0x302e9", + "b": "0x35a935d50317fc0000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x254f69f2089a9000000000000000000000000000000000000000", + "b": "0x145", + "cmp_a_b": 1 + }, + { + "a": "0x60275f5ac6058400000000000000000000000000", + "b": "0x778d3bdea9f02c00000000000", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x6a089bb198eda", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x16f85502cb5b7b0000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4fbff52610f2700000000000000000000000000000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x3df695dfb5aa", + "b": "0x19930a2d49778700000", + "cmp_a_b": -1 + }, + { + "a": "0x58188164ea5d1c0000000000000000000000000000000", + "b": "0x2066b7e81d5f3e000000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x11582b048b693a00000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x28481df", + "b": "0xb65b40a58433100000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x51b18a847719e0000000000000000", + "b": "0x2f3d3ce", + "cmp_a_b": 1 + }, + { + "a": "0x747c3a4f5", + "b": "0x93e16985b30550", + "cmp_a_b": -1 + }, + { + "a": "0x1fed0ff479a4d2000000000000000000000", + "b": "0xae3d41154ba9080000", + "cmp_a_b": 1 + }, + { + "a": "0x183c83f87a566100000000000000000000000000000000000000000000000", + "b": "0x21695e5dd", + "cmp_a_b": 1 + }, + { + "a": "0x209b1c3fd41a7a000000000000000000000000000000", + "b": "0x3b5", + "cmp_a_b": 1 + }, + { + "a": "0x240714d", + "b": "0xcbc37d71f9b", + "cmp_a_b": -1 + }, + { + "a": "0xb19b3c9b57d3680000000000000", + "b": "0x113918f957c", + "cmp_a_b": 1 + }, + { + "a": "0x11cfb756a09dcc0000000000000000000000000", + "b": "0xddfd2eef4c", + "cmp_a_b": 1 + }, + { + "a": "0x3b550aeed9305", + "b": "0x3d9a060cefc49a0000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x9b871f11b2011000000", + "b": "0xd5b09ee5a987680000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3e0990d42e1966000000000000000000000000", + "b": "0x4fbf1cf9f4bd0c000000000", + "cmp_a_b": 1 + }, + { + "a": "0xdd2131f99544580000000", + "b": "0x1be9216ab1a90200000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x1edc87fc99553b0000000000", + "cmp_a_b": -1 + }, + { + "a": "0x88ec55a5fcf77800000000000000", + "b": "0x491e9922c30c7800000", + "cmp_a_b": 1 + }, + { + "a": "0x515fe7e3e8e8ec000000000000000000000000000000000000000000000000000", + "b": "0xf13de26b89c6700", + "cmp_a_b": 1 + }, + { + "a": "0x15e8dcf4d6455500000000000000000000000000000000000", + "b": "0x1f5d9a57f6f31800000000000", + "cmp_a_b": 1 + }, + { + "a": "0x3a73150e14597200000000000000000000000000000000000000000", + "b": "0x88eb66f71e0e080000000000", + "cmp_a_b": 1 + }, + { + "a": "0x21e11755c16b1c00000000000000000000000", + "b": "0x238b6e16eb601400000000000", + "cmp_a_b": 1 + }, + { + "a": "0x24736c6a5a284c0000000000000000000000000000000000000000000000000", + "b": "0x8", + "cmp_a_b": 1 + }, + { + "a": "0x48b09b28428bb40000000000000", + "b": "0x3d30fbb7716e30000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x884fe7e6966b8", + "b": "0x30b42f5f5ed3ac0000000", + "cmp_a_b": -1 + }, + { + "a": "0xed81c297b1b580000000000000000000000000000000", + "b": "0x7e427382e80", + "cmp_a_b": 1 + }, + { + "a": "0x15694b272d1e0d0000000000000000000000000000000000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x197b781ab9757900000000000", + "b": "0x47de11a6", + "cmp_a_b": 1 + }, + { + "a": "0x67629a2034822400000000000000000000000000000000", + "b": "0x18dcc1496b965b00000000", + "cmp_a_b": 1 + }, + { + "a": "0x14", + "b": "0x2016dd83e3b2c000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3ae15222e377ea0000000000", + "b": "0x1106f", + "cmp_a_b": 1 + }, + { + "a": "0x87f5b59339f11800000000000000000000000000000000000000000000000", + "b": "0x97fedbe792d", + "cmp_a_b": 1 + }, + { + "a": "0x164998e", + "b": "0x1a4cb09", + "cmp_a_b": -1 + }, + { + "a": "0x6bce7d5f4f7", + "b": "0xc81ee87d2d6868000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xa31e22955c5940000000", + "b": "0x58cac7ecaa5", + "cmp_a_b": 1 + }, + { + "a": "0x1ac955894718e6000000000000000000000000", + "b": "0x22", + "cmp_a_b": 1 + }, + { + "a": "0x3597598b", + "b": "0xd59433161055000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x45819821fd9e80000000000000000000000000", + "b": "0x62b21d4a24705000000", + "cmp_a_b": 1 + }, + { + "a": "0x79667f8f20b9f800", + "b": "0x9c81c9adea76900000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x43b910ff04a73000000000", + "cmp_a_b": -1 + }, + { + "a": "0x91", + "b": "0x91", + "cmp_a_b": 0 + }, + { + "a": "0x3e8a00d424a31a0000000000", + "b": "0x183270ef60d904000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x58e60ad5b05dbc00000000000000000000000000000000000000000000000", + "b": "0x21dbafd0a3e6bc000000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0xc2f006b56d31980000000000000000000000000000000000", + "b": "0x2534a40f62649a0000000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x54892e07705", + "b": "0x135505373fb7cf000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x426736d7c2740000000000000000000000000000000000000000000", + "b": "0x66", + "cmp_a_b": 1 + }, + { + "a": "0x359ed3dd3234240000000000000000000000000000000000000000", + "b": "0x644b", + "cmp_a_b": 1 + }, + { + "a": "0x17f9da96c572b9000000000000000000000000000000", + "b": "0x38545fd4c1059000000", + "cmp_a_b": 1 + }, + { + "a": "0x1465465bb983c6000000000000000", + "b": "0x18a463e95981ee000", + "cmp_a_b": 1 + }, + { + "a": "0xc0bf", + "b": "0xb98e9689907a600", + "cmp_a_b": -1 + }, + { + "a": "0x17433b228562e40000000000000000000000", + "b": "0x4", + "cmp_a_b": 1 + }, + { + "a": "0x24779ea36e50f200000000000000000000000000000000", + "b": "0x22dca2ca97a94200000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0xd20ab385cb83d80000000000000000000", + "b": "0x12cad4aad", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x3e1da81d6961360000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xa418b5f282875000000000000000000000000000", + "b": "0xaca8c90c8dae", + "cmp_a_b": 1 + }, + { + "a": "0x6989849919e61c0000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0xa9c142abda1698000000000000000000", + "b": "0x21a7f4fe1b844a000000000", + "cmp_a_b": 1 + }, + { + "a": "0x131b5ad3c8ccc0000000000000000000", + "b": "0xa79d9f07a734280000000", + "cmp_a_b": 1 + }, + { + "a": "0x6c6ab98b3691c800000000000000000000000000000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x15fb494561b1b200000", + "b": "0xdfc143ba", + "cmp_a_b": 1 + }, + { + "a": "0x6e881e5a652e6000000", + "b": "0x6a4756fdea0e1c0000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2fa4c1e1602fa6000000000000000000000000000000000000000", + "b": "0xce023", + "cmp_a_b": 1 + }, + { + "a": "0x5a67dc3257afd00000000000000000000000000000000000000000000", + "b": "0xe1adaf993fe50000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x498854a0096c48000000000000000000000000000000000000000000", + "b": "0x2109", + "cmp_a_b": 1 + }, + { + "a": "0x1265d3298fe8a6000", + "b": "0x5fe5aa57196a9", + "cmp_a_b": 1 + }, + { + "a": "0x127cb751c23820000000000000", + "b": "0x127cb751c23820000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x1231c2c7c728ed000000000000000000000000000000000000000000", + "b": "0x1bdac54af0548600000", + "cmp_a_b": 1 + }, + { + "a": "0xec4f7cc8dc02080000000000000000000000000000000000", + "b": "0x37e734879d42b", + "cmp_a_b": 1 + }, + { + "a": "0x8f152f184d44c00000000000000000000000000000000000000000", + "b": "0x1c2fdf7e9fb60b0000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x7304882e393d10000000000000000000000000000000000000000000000", + "b": "0xba682a125143d00000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0xdede121d53915800000000000000000000000000000000000", + "b": "0x261086dd80bac400", + "cmp_a_b": 1 + }, + { + "a": "0x584947c3", + "b": "0x18f2f72f413", + "cmp_a_b": -1 + }, + { + "a": "0x1171e3", + "b": "0xa4cc61800208f8000000", + "cmp_a_b": -1 + }, + { + "a": "0x1d109e923bbab3000", + "b": "0x6ab64a13bbbfb00000000000", + "cmp_a_b": -1 + }, + { + "a": "0x17c2b", + "b": "0x1d62704f1fa1d40000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x60144c1db", + "cmp_a_b": -1 + }, + { + "a": "0x1eba506f780405", + "b": "0x183c66fcb59f95000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x296d5", + "b": "0x41a9e757a3b2", + "cmp_a_b": -1 + }, + { + "a": "0x28991856b52ddc0000000000000000000000000000000000000000000", + "b": "0x13ca6641002ea800000000", + "cmp_a_b": 1 + }, + { + "a": "0x1b744f7566c3e900000000000000000", + "b": "0x2100c6628784cc000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1c6a13a068e289000000000000000000000000000000000000000000000000000", + "b": "0x13360214", + "cmp_a_b": 1 + }, + { + "a": "0x93972", + "b": "0x34b209ec8287380000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x50127dc9159914000000", + "b": "0x26f1d03", + "cmp_a_b": 1 + }, + { + "a": "0x708fa2373afafc000000000000000000000000000000000000000", + "b": "0x443ece6cfea0440000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x2419f51b5838220000000000000000000000000000000", + "b": "0x1aaa1740c7adc70000000", + "cmp_a_b": 1 + }, + { + "a": "0x22246bc5be940600000000000000000000000000000000", + "b": "0xa6faef8eeafcd80000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x26f", + "b": "0x625d6f369582700000000", + "cmp_a_b": -1 + }, + { + "a": "0x6915aa694cb8c00000000000000000000000000000000", + "b": "0x9c41", + "cmp_a_b": 1 + }, + { + "a": "0x280cac6f3f39140000000000000000000000000000000000000000000000", + "b": "0x22f6dcb12a3a0", + "cmp_a_b": 1 + }, + { + "a": "0x292b6d2ac79a2a00000000000000000000000000", + "b": "0x309ed8b24d9ca800000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x829c4849de550800000000000000000", + "b": "0x14cee171", + "cmp_a_b": 1 + }, + { + "a": "0x14963481e370", + "b": "0x14963481e370", + "cmp_a_b": 0 + }, + { + "a": "0x17", + "b": "0x3a6d1d68116fca00000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x5139638804c244000000000000000000000000000000000000000", + "b": "0x4c862c9ebf171", + "cmp_a_b": 1 + }, + { + "a": "0x26c91697", + "b": "0x17d5982ca7302", + "cmp_a_b": -1 + }, + { + "a": "0x94155c1", + "b": "0xa", + "cmp_a_b": 1 + }, + { + "a": "0x355c57c9cdb5860000", + "b": "0x59632d37fde0e8000", + "cmp_a_b": 1 + }, + { + "a": "0x86c443", + "b": "0x19e", + "cmp_a_b": 1 + }, + { + "a": "0x18aa2a67413efe000000000000000000000000000000000000000", + "b": "0x152afe570b79c0000000000", + "cmp_a_b": 1 + }, + { + "a": "0xb7be5f", + "b": "0x138563fbd358a30000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 + }, + { + "a": "0x755da0ddb90a9800000000000000000000000000000000000000000000", + "b": "0x2bd198a8453580", + "cmp_a_b": 1 + }, + { + "a": "0x1c4855cd392aa800000000000000000000000000000000000000000", + "b": "0x2b235c803de1c000000000", + "cmp_a_b": 1 + }, + { + "a": "0x18268abd6a34f70000000000000000000", + "b": "0x1ea", + "cmp_a_b": 1 + }, + { + "a": "0x23e95ad6e05dc200000000000000000000000", + "b": "0x3d5ddfb0", + "cmp_a_b": 1 + }, + { + "a": "0xafd76647", + "b": "0x13bebfec6be3c400000000", + "cmp_a_b": -1 + }, + { + "a": "0xa9f5e491443da0000000000000000000000000000", + "b": "0x1da402a421d88b0000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x176bbf7de7fccc00000000000", + "b": "0x176bbf7de7fccc00000000000", + "cmp_a_b": 0 + }, + { + "a": "0x5a7a34bd3094440000000000000000000000000000", + "b": "0x2ad7a5d102cf680", + "cmp_a_b": 1 + }, + { + "a": "0x19d1ec1d78767c0000000000000000000000000000000", + "b": "0x17d6b27", + "cmp_a_b": 1 + }, + { + "a": "0x2f398f5c6206400000", + "b": "0x77f959f6", + "cmp_a_b": 1 + }, + { + "a": "0x2f50226aedcc62000000000000000000000000000", + "b": "0x43fafd3ef912ac00000000", + "cmp_a_b": 1 + }, + { + "a": "0x5babe8b672b5cc000000000000000000", + "b": "0x5babe8b672b5cc000000000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x804ad5fa51f0e8000000000000000000000000000", + "b": "0xb162a0248a9f580000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x127", + "b": "0x38d32fc8e0b04a00000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x425b4371ce4b78000000000000000000000000000000000", + "b": "0x51791dfb", + "cmp_a_b": 1 + }, + { + "a": "0xc7fadad998123000000000000000000000000000000000000000000", + "b": "0x212c639859367000000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x18b16f3da7a23e00000000000000000000", + "b": "0x580d22857ce8f8000", + "cmp_a_b": 1 + }, + { + "a": "0x5bc4318184ad740000000000000000000000000000", + "b": "0x13d81a2d8e9d6e0000", + "cmp_a_b": 1 + }, + { + "a": "0x2c205c", + "b": "0x606c5a2bb44260000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x40ff7a160da75000000000000000000000", + "b": "0x5c2456a8f1528000000000", + "cmp_a_b": 1 + }, + { + "a": "0x81470193ab9b4000000000000000000000000000000000", + "b": "0x628de96dbc08580000", + "cmp_a_b": 1 + }, + { + "a": "0xbe4b3bd23129b8000000000000000000000000000000000000000000000000", + "b": "0x16e58166d3", + "cmp_a_b": 1 + }, + { + "a": "0x1cc83680664b0d0000000000000000000000000", + "b": "0x18da409d184", + "cmp_a_b": 1 + }, + { + "a": "0x203fdb6021e7c600000000000000000", + "b": "0x25fb", + "cmp_a_b": 1 + }, + { + "a": "0x2a1ad546064b1c000000000000000000000000000000000000000000000000", + "b": "0x2ed1c98d7185d800000000000", + "cmp_a_b": 1 + }, + { + "a": "0x24e51fcb9a8dbc00000000000000000000", + "b": "0x19dc65f", + "cmp_a_b": 1 + }, + { + "a": "0x1fc9411c76dde4000000000000000000000000000000000000000000000", + "b": "0x974632e0e791f80000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x2c0ce02947e8a200000000000000000000000000000000000", + "b": "0x4ec", + "cmp_a_b": 1 + }, + { + "a": "0x23527f1d2abbe80000000000000000000000000000000000", + "b": "0x1b92f12", + "cmp_a_b": 1 + }, + { + "a": "0x1c917076a3474100000000000000000000000000000", + "b": "0x95f92852dc9be000", + "cmp_a_b": 1 + }, + { + "a": "0x24d2e65e54014e0000000000", + "b": "0x3355f7b99cb84400000000000", + "cmp_a_b": -1 + }, + { + "a": "0x26438b24645a7a00000000", + "b": "0x4", + "cmp_a_b": 1 + }, + { + "a": "0x61bf5", + "b": "0x557", + "cmp_a_b": 1 + }, + { + "a": "0xb78f11283e79b8000", + "b": "0x344227168c4a3c000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x310d50b498708e00000000000000000000000000000000000", + "b": "0x371aa2909d24ee00000", + "cmp_a_b": 1 + }, + { + "a": "0x79d10100e2", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x1251a40d2df4b20000000000", + "cmp_a_b": -1 + }, + { + "a": "0x21310228d911fc000000000", + "b": "0x168ef87c20dcbc0", + "cmp_a_b": 1 + }, + { + "a": "0x1de4b18e7e990200000000", + "b": "0x16a932559e", + "cmp_a_b": 1 + }, + { + "a": "0x91117f86f3277800000000000000000000000000000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x56a7a3acc1423400000000000000000000000000000000000000000", + "b": "0xc103433ce6a49000000000", + "cmp_a_b": 1 + }, + { + "a": "0xd77508f21e3980000000000000000000000000000000000000000000000000", + "b": "0x1c404e61fd8c8a00000000000", + "cmp_a_b": 1 + }, + { + "a": "0xfc19fe1a77b990000000000000000000000000000000", + "b": "0x32e8f5e39db7f0000", + "cmp_a_b": 1 + }, + { + "a": "0x12c316b6436d75000000000000", + "b": "0xa614c4b8a2de680000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1173de65", + "b": "0x14201028ffe86c", + "cmp_a_b": -1 + }, + { + "a": "0x26e0b4161", + "b": "0x268272b2cf", + "cmp_a_b": -1 + }, + { + "a": "0x710266b4f4167c0000000000000000000000000000000000000000", + "b": "0x782e16992fe14400000000000", + "cmp_a_b": 1 + }, + { + "a": "0xc5bd77573996b80000000000000000000000000000000000000", + "b": "0x2ba1b3f15235c200000", + "cmp_a_b": 1 + }, + { + "a": "0x64f35e124bf29400000", + "b": "0x275cca6a9370220000000000", + "cmp_a_b": -1 + }, + { + "a": "0x38fa1c8e086e08000000000000000000000000000000000000000000000000", + "b": "0x2f7add47a2cb7c00000000000", + "cmp_a_b": 1 + }, + { + "a": "0x2b89b8d119a1b6000000000000000000000000000000000000000000000", + "b": "0xff3742617c98f0000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x6c32cae55a2c9c0000000000000000000000000000000000000000000000000", + "b": "0x85ce610", + "cmp_a_b": 1 + }, + { + "a": "0x45c735685dddb00000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x21a2a1baa4cf800000000", + "b": "0xc2f95f55565ff", + "cmp_a_b": 1 + }, + { + "a": "0x11ac95fc0", + "b": "0x1341", + "cmp_a_b": 1 + }, + { + "a": "0x17af787a2ff4030", + "b": "0x1e", + "cmp_a_b": 1 + }, + { + "a": "0x139e131e6d683600000000000000000000000000000000000000000000000000", + "b": "0x1123", + "cmp_a_b": 1 + }, + { + "a": "0x3d34659bfbed9", + "b": "0x21fbd6e70", + "cmp_a_b": 1 + }, + { + "a": "0x159bbabc1", + "b": "0x3fa165cc41511c00000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1563981281112c000000000000000000000000", + "b": "0x121", + "cmp_a_b": 1 + }, + { + "a": "0x326c823d969480000000000000000000000000000000000000000", + "b": "0x3313023bcf0c9c", + "cmp_a_b": 1 + }, + { + "a": "0xf3f994abcfb00000000000000000000000", + "b": "0x79861e1f00dab000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x309c17dd414bb80000000000000000000000000000", + "b": "0x20065078d", + "cmp_a_b": 1 + }, + { + "a": "0x7c3e6fca026f40000000000", + "b": "0x2e57df6147bc8c0000", + "cmp_a_b": 1 + }, + { + "a": "0x933cc930c070000000000000000000000000000000", + "b": "0x238841", + "cmp_a_b": 1 + }, + { + "a": "0x19cc9f9", + "b": "0x1e0405a6cc580d00000", + "cmp_a_b": -1 + }, + { + "a": "0x34f34930583e4800000", + "b": "0x2fbd", + "cmp_a_b": 1 + }, + { + "a": "0xcf13c", + "b": "0x6", + "cmp_a_b": 1 + }, + { + "a": "0x29abcf67267d9c0", + "b": "0x3232e03b9b6df0000000", + "cmp_a_b": -1 + }, + { + "a": "0x2bfb4198beeee8000000000000000", + "b": "0x2bfb4198beeee8000000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x20653a016d773e000000000000000000000000000000000000000000", + "b": "0x2984b379d54cb60000000000", + "cmp_a_b": 1 + }, + { + "a": "0x2f4de779029f66000000000000000000000000000000000000000", + "b": "0x1bdd9f0041e6530000000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x24a5fbcfd859ca00", + "b": "0x61c58ccc86b0ac00000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x5bf8e9c", + "b": "0x240d179d7ae656000000000", + "cmp_a_b": -1 + }, + { + "a": "0xc2b03cfeac6e50000000000000000000000", + "b": "0x1201a2810995a", + "cmp_a_b": 1 + }, + { + "a": "0x1020e7bd447af40000000000000000000000000", + "b": "0xd9227033f7f6f00", + "cmp_a_b": 1 + }, + { + "a": "0x11efbb35d76f5a00000", + "b": "0x7287ada65d1f6c0000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x882c32383b7cf0000000000000000000000000000000000000000000", + "b": "0x1f34cbafae8", + "cmp_a_b": 1 + }, + { + "a": "0x2faaeb23481aba000000000000000", + "b": "0x13e7c5e658d01200000000", + "cmp_a_b": 1 + }, + { + "a": "0x3a676", + "b": "0x54", + "cmp_a_b": 1 + }, + { + "a": "0xa6259b3b95f5400000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0xa26f28f67461a8000000000000000000000000000000000000", + "b": "0x168927377063a400000000000", + "cmp_a_b": 1 + }, + { + "a": "0xb2c8766392a53800000000000000000000000", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x4be30b473c3dc0000000000000000000000000000000000000000000", + "b": "0x5b133503e2bf5c0000000000", + "cmp_a_b": 1 + }, + { + "a": "0x5f2dfde1e36f94000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x20ddb766427c", + "b": "0x20ddb766427c", + "cmp_a_b": 0 + }, + { + "a": "0x3b0", + "b": "0x249ab2fd62c63e000", + "cmp_a_b": -1 + }, + { + "a": "0x798333e312a2c0000000000000000000000", + "b": "0x4e49b8c3061a3c000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x2b4b32f2159d180000000000000", + "b": "0x33965d29894a620000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x7e0a76e2", + "b": "0xd70c097285b4b0000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2c6a9b6", + "b": "0x906b89f88b507800000", + "cmp_a_b": -1 + }, + { + "a": "0x713ec5f6011b680000000000000", + "b": "0x713ec5f6011b680000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x616fb36d339090000000000000000000000", + "b": "0x7292474c951b", + "cmp_a_b": 1 + }, + { + "a": "0x3a593095dbcb9e00000000000000000000000000000000000000000000000000", + "b": "0x932bff8db", + "cmp_a_b": 1 + }, + { + "a": "0x84c7519267", + "b": "0xe", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0xe528e85db9c8d80000000000", + "cmp_a_b": -1 + }, + { + "a": "0x15cac8e73c39f8000000000000000000000000", + "b": "0x600de", + "cmp_a_b": 1 + }, + { + "a": "0xf15b1cd263fa5800000000000000000000000000", + "b": "0xf03b72197186000000", + "cmp_a_b": 1 + }, + { + "a": "0x1dafc6b73def60000000000000000000000000000000000000000", + "b": "0xac8115a2931b00000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x5a6785236f", + "b": "0x1af7ddd", + "cmp_a_b": 1 + }, + { + "a": "0x2204e835ddea", + "b": "0x63c77ecf4c", + "cmp_a_b": 1 + }, + { + "a": "0x1083e57cd52", + "b": "0xa", + "cmp_a_b": 1 + }, + { + "a": "0x102d0a4", + "b": "0x1965048702587000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x15c9", + "cmp_a_b": -1 + }, + { + "a": "0x757960af82", + "b": "0x1b8506be59a1ec00000", + "cmp_a_b": -1 + }, + { + "a": "0x7542ef1b8edeb400000000000000000000000000000000000000000", + "b": "0x29465082764840000000", + "cmp_a_b": 1 + }, + { + "a": "0x519d3aa8bb098c000000000", + "b": "0x1255cc3ba94ada0000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x109933dfde7ba800000000000000000000000000", + "b": "0x7cb28", + "cmp_a_b": 1 + }, + { + "a": "0x7dbd4c552826f", + "b": "0x6b48892dc3cd78000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x47e573358d28600000000000000000000000000000000000", + "b": "0x82159af1ecdc680000000", + "cmp_a_b": 1 + }, + { + "a": "0x216a5fe046257", + "b": "0x4ecadd9f0dc2f800000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x17", + "b": "0x3fab8", + "cmp_a_b": -1 + }, + { + "a": "0x32eed32555efce000000000000000000000000000000000", + "b": "0x1e07451e0c70a100", + "cmp_a_b": 1 + }, + { + "a": "0x6a012394c8953c00000000000000000000000000000000000000", + "b": "0x11a3b07025776c000000000", + "cmp_a_b": 1 + }, + { + "a": "0xb8c5de61b3cad0000000000000000000000000", + "b": "0x25806ac36", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x12cb7a7b10fa500000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1a6b2160663df70000000000000000000000000", + "b": "0x13e9", + "cmp_a_b": 1 + }, + { + "a": "0x3f89e1d78c43060000000000000000000", + "b": "0x2e1179afcc4f3", + "cmp_a_b": 1 + }, + { + "a": "0x4", + "b": "0x6a8a75011", + "cmp_a_b": -1 + }, + { + "a": "0x6e5e65cb5f6c9c000000000000000000000000000000000000000000", + "b": "0x13322da3c0", + "cmp_a_b": 1 + }, + { + "a": "0x77fdb5440", + "b": "0xed411b7e3d13a00000000000", + "cmp_a_b": -1 + }, + { + "a": "0x8ba10daaab742000000000000000000000000000000000000000000000000000", + "b": "0x961b866cb05b380000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x1f244305d3e3070", + "b": "0x4a1d33c614f9e4000000", + "cmp_a_b": -1 + }, + { + "a": "0x5086b338b34", + "b": "0x8", + "cmp_a_b": 1 + }, + { + "a": "0x4d91a725b778140000000000000000000000000000000000000", + "b": "0xd6f8701a65cd0800000", + "cmp_a_b": 1 + }, + { + "a": "0x1a1ef78beb152000000000000000", + "b": "0xf", + "cmp_a_b": 1 + }, + { + "a": "0x5296e0e818e", + "b": "0x920200bf0f02d8000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x6c7820a151e888000000000000000000000000", + "b": "0x72f7bed7169bbc00", + "cmp_a_b": 1 + }, + { + "a": "0x57f5a382be299c0000000000000000000000", + "b": "0xe0d5513c51e32000000", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0xa5edb9", + "cmp_a_b": -1 + }, + { + "a": "0x3412905d3469ec00000000000000000000000000000000000000", + "b": "0x25968578a41b7c00000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x5d248a28165a68000000000000000000000000000000000", + "b": "0x8a5b91ad9a70780000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x7edcac1ce5e8dc00000000000000000000000000000", + "b": "0x14fc0f73af1296000000000", + "cmp_a_b": 1 + }, + { + "a": "0x56b416aa5f26e0000000000000000", + "b": "0x1a1fe8d6e8e3290", + "cmp_a_b": 1 + }, + { + "a": "0xf2564c6b182b5000000000000000000000000000000", + "b": "0x409e1b4e3bd13000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x1033aa3cbfeef4000000000000000000000000000000000", + "b": "0x10751d07d00c3f000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x6b6d98344965a80000000000000000000000000000", + "b": "0x615e32ff23c1d80000000000", + "cmp_a_b": 1 + }, + { + "a": "0x1c0f1dfee902070000000000000000000000000000000000000", + "b": "0x691b96", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0xfc57f6da29d73000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xb8e7c06160ca4800000000", + "b": "0x2548b87221391e000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xafbab1", + "b": "0x560c08", + "cmp_a_b": 1 + }, + { + "a": "0x39acc71c3726be000000000000", + "b": "0x6ca", + "cmp_a_b": 1 + }, + { + "a": "0x5fbac560017864000000000000000000000000000000", + "b": "0x276877", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x1404382", + "cmp_a_b": -1 + }, + { + "a": "0x4579618dba65b800000000000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x176ed1c2f2b27b0000000000000000000000000000000000000000000000", + "b": "0x24dc1fdf46cfae000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x756b8841d0ae74000000000000000000000000000000000000", + "b": "0xb78804dd359fd80000000", + "cmp_a_b": 1 + }, + { + "a": "0x568354ead1e3f400000000000000000000", + "b": "0x71466", + "cmp_a_b": 1 + } + ], + "test_comparison_128_256": [ + { + "a": "0x126e6ec2dd123f000000000000000", + "b": "0x20bcf8022f157a000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xfe865bb4fe40e00000000000000", + "b": "0x28fbc08c217a9e00", + "cmp_a_b": 1 + }, + { + "a": "0x23d7056818d5ce000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x7378183a5254a40000000", + "b": "0xe3b98fe89c84c80", + "cmp_a_b": 1 + }, + { + "a": "0xba5", + "b": "0x238c0909293968000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x644", + "b": "0x644", + "cmp_a_b": 0 + }, + { + "a": "0x3deedb69e03360000000000000", + "b": "0x3deedb69e03360000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x85bcb47ca8f4d", + "b": "0x84756c1", + "cmp_a_b": 1 + }, + { + "a": "0x3f1dc9a7f241c8000", + "b": "0x1a538a5cd386cd00000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xd55a43eee668380", + "b": "0xd55a43eee668380", + "cmp_a_b": 0 + }, + { + "a": "0x3c9", + "b": "0x13a8f3b288e2b4000000000", + "cmp_a_b": -1 + }, + { + "a": "0xadcc", + "b": "0x1ae1b26cfdb836000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x128fb7e", + "b": "0x1f66218264b6b4000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3186cda", + "b": "0x9117fbfdb63f88000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xbe688579", + "b": "0x2b4e86b6f65288", + "cmp_a_b": -1 + }, + { + "a": "0xe933c3b009de500", + "b": "0x60bbd1d35701ac000000", + "cmp_a_b": -1 + }, + { + "a": "0x71e4b", + "b": "0x5795bff25523dc000", + "cmp_a_b": -1 + }, + { + "a": "0x33faa22beca2680000", + "b": "0x416d510a74a9", + "cmp_a_b": 1 + }, + { + "a": "0x3ba1c9", + "b": "0xd1a84af3", + "cmp_a_b": -1 + }, + { + "a": "0x133604f", + "b": "0x1f9871bad93f2d0000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x8df6a9613630a0000000000000000000", + "b": "0x6020e3ad64ef6c00000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xca9e58a9f", + "b": "0x290373", + "cmp_a_b": 1 + }, + { + "a": "0x25aa92f1068c9", + "b": "0xd4114", + "cmp_a_b": 1 + }, + { + "a": "0xf0c6423dfb81680000000000000", + "b": "0x6017c311ae4fe4000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x295371c9dfa9d40000000000", + "b": "0x918218a85b37c0000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x144b1aebc684d300000000000", + "b": "0x5bde76f67b15f40", + "cmp_a_b": 1 + }, + { + "a": "0x169b", + "b": "0x8012e6259c6", + "cmp_a_b": -1 + }, + { + "a": "0x8c71e66e06e450", + "b": "0x34f898faaab0e0000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x67", + "b": "0x51255de0cf5c", + "cmp_a_b": -1 + }, + { + "a": "0x112c2c44697026000000000", + "b": "0x18a7b04e98661a00000000", + "cmp_a_b": 1 + }, + { + "a": "0x3e4ab85b", + "b": "0xa284796dc18998000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xed4", + "b": "0x6c834f78a5ddd800000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x412bfe553d8f0800000000", + "b": "0x38311cdb29e98200000", + "cmp_a_b": 1 + }, + { + "a": "0x107082a140b73d00", + "b": "0x20", + "cmp_a_b": 1 + }, + { + "a": "0x9dc2b1d32109580000", + "b": "0x451785f936d9a80000", + "cmp_a_b": 1 + }, + { + "a": "0x18", + "b": "0x18", + "cmp_a_b": 0 + }, + { + "a": "0x21da6fc33bde4800", + "b": "0x17742b720927a7000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x8fdb1581a73918000000000", + "b": "0x2991579cc6278e000000", + "cmp_a_b": 1 + }, + { + "a": "0xed8ae6505027", + "b": "0x229b766b01fe6e00000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2bd2ee46", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x8b8c3e9179cea0000000000", + "b": "0x66c747176f18b4", + "cmp_a_b": 1 + }, + { + "a": "0x7168091750311000", + "b": "0x6b36cd57c5b2", + "cmp_a_b": 1 + }, + { + "a": "0x85", + "b": "0x1795736", + "cmp_a_b": -1 + }, + { + "a": "0x130beecd0eaa8000000", + "b": "0x1b1da26ff34374000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x1396e274de9f4b000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4a32bd7629e2800000000000", + "b": "0x92ce6daaa649800000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1f9edaf60e7b9a0000000000", + "b": "0x8250f059f8f3a80000000000", + "cmp_a_b": -1 + }, + { + "a": "0xaa", + "b": "0x13de3613f2285c00000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x7a8f12086e", + "b": "0x26d0e18df8b6", + "cmp_a_b": -1 + }, + { + "a": "0x1c0a8e3090a9ca0000000000", + "b": "0x73bcdcf88065b000000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x37c3debbb98", + "b": "0x291", + "cmp_a_b": 1 + }, + { + "a": "0xa0deeed7c849b0000000", + "b": "0x2cfb79cce9869800000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x49704d2ed776f00000000000", + "b": "0xe934492017f950000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x17850e6c52d35d0000000000000", + "b": "0x37553cdace7acc0000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xd958836e21b02800", + "b": "0x1449eb7c11784f0000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1a17085", + "b": "0x4f13d3ef5e814800000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x1", + "cmp_a_b": 0 + }, + { + "a": "0x80ced8cb24469800000", + "b": "0x15a28ee22eedac0000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x15aec946aac73500000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x375e", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x9dd6d77f5ed0c000000000000000", + "b": "0x1f83a3ef99a4bd0000000", + "cmp_a_b": 1 + }, + { + "a": "0x19a6f5704e6d78000000000000000000", + "b": "0x8e04850c023cb000", + "cmp_a_b": 1 + }, + { + "a": "0xbc912f1d0d62", + "b": "0xbc912f1d0d62", + "cmp_a_b": 0 + }, + { + "a": "0x4cc2df2813988", + "b": "0x7addd857", + "cmp_a_b": 1 + }, + { + "a": "0x4f7de0bbef3a", + "b": "0xc711a677056830000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xf837c77df05fc000", + "b": "0xf837c77df05fc000", + "cmp_a_b": 0 + }, + { + "a": "0xceff162ba91", + "b": "0xcbb2", + "cmp_a_b": 1 + }, + { + "a": "0x1be6", + "b": "0x12b59d634af69b00000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x27463d7dcb", + "b": "0xe7aa92850552c00000000000", + "cmp_a_b": -1 + }, + { + "a": "0xd13d519d9efdc800000000000000", + "b": "0x158c5403d8b80200000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x27b1ac5b6aedbe0000000000000", + "b": "0x61a4fb8cf02028000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x5", + "b": "0x9de4a", + "cmp_a_b": -1 + }, + { + "a": "0x58b14ec34", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x1bb", + "b": "0x2d", + "cmp_a_b": 1 + }, + { + "a": "0x345e49509", + "b": "0x53f70d7c3f843800000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1c64", + "b": "0x3834f4793e4b6800000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 + }, + { + "a": "0x176f77b08e8d75000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x19727c4ba76ce400000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1869b47f23322800000000000000000", + "b": "0x1be9b96da52a0d000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x82736f6bd676", + "b": "0xef7796e0df43d800000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0x2", + "cmp_a_b": 0 + }, + { + "a": "0x524fbc060", + "b": "0xd7f00b26c157600000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x87f0eac7f6878", + "b": "0x32", + "cmp_a_b": 1 + }, + { + "a": "0x7a18bde882d8", + "b": "0x7efc99f9b1f8a0000000000", + "cmp_a_b": -1 + }, + { + "a": "0xb08b75dbc20050", + "b": "0x2480365950a5520000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x37fe24fee8", + "b": "0x1444895bd303", + "cmp_a_b": -1 + }, + { + "a": "0x4", + "b": "0x539f6b82f400ec00", + "cmp_a_b": -1 + }, + { + "a": "0x154961541cc14400", + "b": "0x11188e8d56b23f0000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x6e35ec1d613454000", + "b": "0x2d291d10ff75ec0000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4169968e35d", + "b": "0x3204f994ceb4e40000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x715e844e24bdb8000000000000000000", + "b": "0x257e2a946730580000000", + "cmp_a_b": 1 + }, + { + "a": "0xd3e2a64a977940000000000000000000", + "b": "0x9bc85e2a5534f80000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x5a7b8735bf04e8", + "b": "0x913528473b37a80000000", + "cmp_a_b": -1 + }, + { + "a": "0x6e074", + "b": "0xa722f98f1db1a", + "cmp_a_b": -1 + }, + { + "a": "0x10caa17", + "b": "0x10caa17", + "cmp_a_b": 0 + }, + { + "a": "0x31c0f68460f85a", + "b": "0x9a2d03991f466800000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x34c6ab653d5", + "b": "0x5e8fe357a6acbc00000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1ac58a0c2c40440000000000000", + "b": "0x511658b6f77e", + "cmp_a_b": 1 + }, + { + "a": "0x4c169a", + "b": "0xb82a171296910800000000000", + "cmp_a_b": -1 + }, + { + "a": "0xcaaa8", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x1fe", + "b": "0x4da3ecb979fe3c0000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4aee9d8", + "b": "0x1765faa68", + "cmp_a_b": -1 + }, + { + "a": "0x17a2ced7e9552", + "b": "0xcad7933c6d2b6800000000000", + "cmp_a_b": -1 + }, + { + "a": "0x14b8db5a6348a0", + "b": "0x265b63b2f406", + "cmp_a_b": 1 + }, + { + "a": "0x1ece04ea299716000", + "b": "0x187463f75e904a00000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x36495", + "b": "0xf0", + "cmp_a_b": 1 + }, + { + "a": "0x4601b49a248844000", + "b": "0xbc25ec74971fd80", + "cmp_a_b": 1 + }, + { + "a": "0xe6589f1baf59c80", + "b": "0x2bd3cfcb96955c00000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x173cb6f9676", + "cmp_a_b": -1 + }, + { + "a": "0x76496d43faae0c00000000", + "b": "0x27f", + "cmp_a_b": 1 + }, + { + "a": "0x221018c9db4d26000000000000", + "b": "0x691e8d6ed5f4e800", + "cmp_a_b": 1 + }, + { + "a": "0xbd7536f059774", + "b": "0xbd7536f059774", + "cmp_a_b": 0 + }, + { + "a": "0x28556f9514341a000000000", + "b": "0x97219b1d3b0f700000000", + "cmp_a_b": 1 + }, + { + "a": "0x1352159fea1fa20000", + "b": "0x4ed939876b4504000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xb7ccae7304b3a000000000000", + "b": "0xb7ccae7304b3a000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x627263", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x9bcab22bc8e56800000000000000000", + "b": "0x11cdfaae6f6e2f000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3d459dc09508620000000000", + "b": "0x19c3589572135900000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1a4ee9bc53684", + "b": "0x5a2c49a405f0d400000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x6ec8dd114d7b3c00000", + "b": "0x7386edce902b9c00000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x905868c36d7fe000", + "b": "0x905868c36d7fe000", + "cmp_a_b": 0 + }, + { + "a": "0x0", + "b": "0x22b29b761b1", + "cmp_a_b": -1 + }, + { + "a": "0xa1242e0ff22a9000000000000", + "b": "0x10eadbe365e8660000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x74156", + "b": "0x33bfea541f7b3c0000000", + "cmp_a_b": -1 + }, + { + "a": "0x186f8a1f32c26c00000000", + "b": "0x41fa723af6b01000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x452d4", + "b": "0xd7a57607bb3160000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1efadb4bcf8d", + "b": "0x5c5012c", + "cmp_a_b": 1 + }, + { + "a": "0x7b595a29f07d", + "b": "0xb6b", + "cmp_a_b": 1 + }, + { + "a": "0x1328622d6ade3f0000000000000000", + "b": "0x14e3fd29ba41be0000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x45785ec8cd5d3c000000000000000", + "b": "0x3fb7729b49f060000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x43b290f9465fac0000000000000000", + "b": "0x29861bb4", + "cmp_a_b": 1 + }, + { + "a": "0xb81c69577d28c80000000", + "b": "0xb81c69577d28c80000000", + "cmp_a_b": 0 + }, + { + "a": "0x143f65d4ffdb87000000000000000000", + "b": "0x8b0764db6437a00000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xb4c2e", + "b": "0x12bff10b918e9700000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x207ed4980f7580000", + "b": "0x207ed4980f7580000", + "cmp_a_b": 0 + }, + { + "a": "0x6d18fa01b1ad60", + "b": "0x6ddbb608fe03ac0", + "cmp_a_b": -1 + }, + { + "a": "0x3f9f89d67fdf340000000000000000", + "b": "0x2b44ece943544600000000", + "cmp_a_b": 1 + }, + { + "a": "0x13e3c49b84", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x4280d4b4d", + "b": "0x2b30546f1bcca60000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xbbed61ce20196000000000000000000", + "b": "0x6f0f64c0cac81800000000000000", + "cmp_a_b": 1 + }, + { + "a": "0xc0", + "b": "0xecc9065dd27c0800", + "cmp_a_b": -1 + }, + { + "a": "0x75ffe160c633b0000000000000", + "b": "0x80e65204d1dd300000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x8bcd7b80ec9e000000000000000", + "b": "0x40baad7c21031400000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2c63210142c47200000000000", + "b": "0x1913b326e09c73000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x41449e9421517c000000000", + "b": "0x41449e9421517c000000000", + "cmp_a_b": 0 + }, + { + "a": "0x0", + "b": "0x5183b661a7c56400000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x7028db", + "b": "0x9dc9cccb3fb0000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1a76396f4cadba00", + "b": "0x1be", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x10eb1465476c1800000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1c437", + "b": "0x2286d42c7ac7fa000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xbd94f", + "b": "0x3872305cdfcb2", + "cmp_a_b": -1 + }, + { + "a": "0x10f954ead4927b00000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x889371e35", + "b": "0x1e36b36ed39", + "cmp_a_b": -1 + }, + { + "a": "0x42e96eb7d148440000000000", + "b": "0x42e96eb7d148440000000000", + "cmp_a_b": 0 + }, + { + "a": "0x57578a5d4978f00000000000", + "b": "0x8", + "cmp_a_b": 1 + }, + { + "a": "0x14", + "b": "0x14", + "cmp_a_b": 0 + }, + { + "a": "0x179603ed", + "b": "0x179603ed", + "cmp_a_b": 0 + }, + { + "a": "0x9bfa943fcb37b8000000", + "b": "0xf0a637e6fa04180000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x25049ecdb74076000000000000", + "b": "0x1358cf29d1", + "cmp_a_b": 1 + }, + { + "a": "0xecee183dc86440", + "b": "0x19fdedc7ac91740000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xc781135936bf80000000000", + "b": "0xa", + "cmp_a_b": 1 + }, + { + "a": "0x7d06cc173b6ab400000", + "b": "0x224c1d4a2", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x55d29a8bc960cc0000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x16a324ef43647c", + "b": "0x12f5090fba22e10000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x5", + "b": "0x4fcc60cb6e37680000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x266", + "b": "0x266", + "cmp_a_b": 0 + }, + { + "a": "0x1c08e8b7168a1700000000000000000", + "b": "0x1c08e8b7168a1700000000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x5a733", + "b": "0x7df7476d11fb480000000", + "cmp_a_b": -1 + }, + { + "a": "0x8b04f89997edd0000000000", + "b": "0x1f84197c7fd016000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x514b", + "b": "0xa02bc00613e828000000", + "cmp_a_b": -1 + }, + { + "a": "0x177ed9acd206d000", + "b": "0x5cc044225ca64800000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1c3a45264ef40", + "b": "0x1c3a45264ef40", + "cmp_a_b": 0 + }, + { + "a": "0x6b7e4c88a07b", + "b": "0x32dcb3899f06cc000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x5", + "b": "0x1086ca397918", + "cmp_a_b": -1 + }, + { + "a": "0x10b0e090e7", + "b": "0x10b0e090e7", + "cmp_a_b": 0 + }, + { + "a": "0x2a7314249301040000000000", + "b": "0x3e4f7f903ff9ba0000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x83f", + "b": "0x3dc7e91a4", + "cmp_a_b": -1 + }, + { + "a": "0x9", + "b": "0x44b78859", + "cmp_a_b": -1 + }, + { + "a": "0xf439e7b6b926e80000000000000", + "b": "0x296e2d6add6a060000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x39b35f39", + "b": "0x39b35f39", + "cmp_a_b": 0 + }, + { + "a": "0x2e0d27feec2fb20000000000000", + "b": "0x20599f285cd9ac00000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1b89c33fd1db0f000000000000000", + "b": "0x1cfbc4e2bc726f0000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x585498", + "b": "0x2e717643b74e0c000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1ea2f075fd79670000000000000", + "b": "0x1ea2f075fd79670000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x3956fb149e6b5a00000000000000000", + "b": "0x3956fb149e6b5a00000000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x2c1d955", + "b": "0x28379f8c5960a200000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x127169b222", + "b": "0x7", + "cmp_a_b": 1 + }, + { + "a": "0x7212acf2ca29e000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x3a5846c658c77400000", + "b": "0x7eb6ac976949e00000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x953e2ad4fe9d180", + "b": "0x35c1b640f45e74000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x4a99112ab907600", + "cmp_a_b": -1 + }, + { + "a": "0x991075e338f", + "b": "0x75483aac23", + "cmp_a_b": 1 + }, + { + "a": "0x4c2cb9952b4f94000000000000000", + "b": "0x2d288a0ba6959200000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x2f5524a4e8b92a000000000", + "b": "0x1", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x191232243c176a000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x95dd7d7d31ddb00000000000000", + "b": "0x1e0c133205618e0000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x14f8d1653f29a3000000000", + "b": "0x1e767df82758bb00000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x2b3dc9d47f3a34000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x694402586030f0", + "b": "0x694402586030f0", + "cmp_a_b": 0 + }, + { + "a": "0x3a1ed9e6d", + "b": "0x2c8d472723802800000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1a23f52698fe", + "b": "0xb36d3f4beccc600000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x10979dfd00b60a00000", + "b": "0x10979dfd00b60a00000", + "cmp_a_b": 0 + }, + { + "a": "0x6a1", + "b": "0x6a6de4d89f7", + "cmp_a_b": -1 + }, + { + "a": "0x51a6302f062da800000000", + "b": "0x2848d7cbb872ac000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xe135fa42369f9800000", + "b": "0x4f1732b0321d100000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x3a12fb5493c9", + "cmp_a_b": -1 + }, + { + "a": "0x2d7af605a", + "b": "0x2d7af605a", + "cmp_a_b": 0 + }, + { + "a": "0x10e51", + "b": "0x1b59b1a5a52ed70000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x7b1addaf29", + "b": "0x12dc190f50adf6000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x86f3b17c6d93500000000", + "b": "0x86f3b17c6d93500000000", + "cmp_a_b": 0 + }, + { + "a": "0x1350ca496c0e490000000000", + "b": "0x1350ca496c0e490000000000", + "cmp_a_b": 0 + }, + { + "a": "0x37df3bb", + "b": "0x92a5ff5", + "cmp_a_b": -1 + }, + { + "a": "0x54185d1", + "b": "0x324f82d44888920000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x664428599e738", + "b": "0x83735c2871f18000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x40a819a53df23", + "b": "0x100dcc7407cd7d000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xeeb9cdbe837b780000000000", + "b": "0xeeb9cdbe837b780000000000", + "cmp_a_b": 0 + }, + { + "a": "0x1cdf5d27f7f0820000000000", + "b": "0x28c0276a30db66000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xf71", + "b": "0x173c683415c108000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x111b7029eb743", + "b": "0x2528d7b2395190000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 + }, + { + "a": "0x6cedb1dafc85e00000", + "b": "0x3da0c6130dd50c000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x72d267e8a24da4000000000", + "b": "0x3da3987d7bc6c4000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x26a17a13c7ea540000000000000", + "b": "0x2f142646f751800", + "cmp_a_b": 1 + }, + { + "a": "0x89072a53f7c53", + "b": "0x1699be828e762100000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x73f8706ae37c7c00000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0xd64c435c2f85480000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1e08eaeb1bd0dc0", + "b": "0x9137c5a609b4c8000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x518ab19f5780ac00000", + "cmp_a_b": -1 + }, + { + "a": "0x798ba52e1bab840000", + "b": "0xc7797f7f7553a800000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x5711deea339bec0000000000000", + "b": "0x7f97c09de710a40000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x18d9f05", + "b": "0x57b94163875614000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x6a5ed43dbec81800000000000", + "b": "0x953d357ceed1c00000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xa8a08304e2b9e0000000000000000", + "b": "0x36888326d3c50a00000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x83e47480ce6e38", + "b": "0x15e8bd7f921c1400000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x5d6", + "b": "0x5d6", + "cmp_a_b": 0 + }, + { + "a": "0x14e1e69", + "b": "0x8e602eb222af080000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4a1fc53c3138a8000000000", + "b": "0x76efc28167910c00000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x48d82e426838e400000000000", + "b": "0xcc38047f2606700000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x308a0c5d3", + "b": "0x415ead74aec", + "cmp_a_b": -1 + }, + { + "a": "0x1f", + "b": "0xbafe5cd6a3f7c80000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x24e2a3aa502dda000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x2fc826a0e6f2d200000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x95c90416183538000000000", + "b": "0x12cd51040c24ec00000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x8d15736c7", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x419a1579275e34", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x69478738ec5a", + "b": "0x42ba636a761a08000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x6ffbbc62a1aca0000", + "b": "0x563fac10111e68000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x653fd87f3713", + "b": "0x114910efe50b61000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x10db72da5bbbea0000000000", + "b": "0x6d2e3a870c", + "cmp_a_b": 1 + }, + { + "a": "0x255e3bf342e2980000000000", + "b": "0x255e3bf342e2980000000000", + "cmp_a_b": 0 + }, + { + "a": "0x0", + "b": "0x4a", + "cmp_a_b": -1 + }, + { + "a": "0x60353e5a61c43c000000000", + "b": "0x297efb92ebf91e000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x179ee205c12fa400000000", + "b": "0x179ee205c12fa400000000", + "cmp_a_b": 0 + }, + { + "a": "0x6d73eba9cf", + "b": "0x6d73eba9cf", + "cmp_a_b": 0 + }, + { + "a": "0x53fee81308f53", + "b": "0x23", + "cmp_a_b": 1 + }, + { + "a": "0x12117378b4a10e000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x12e40b99d40c3d0000000000000", + "b": "0x5cfbb44f34c9500000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x42a", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0xdf4c327f36b6000000", + "b": "0x30cd", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0xce583cf97d7228000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1b07300b76778a000000000000", + "b": "0x65503fe31401640000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x29bc914b0e0f7600000000", + "b": "0x92cb31e59e17080000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x225ded2c2af5360000000000", + "b": "0x225ded2c2af5360000000000", + "cmp_a_b": 0 + }, + { + "a": "0x29148829", + "b": "0x100839cc14", + "cmp_a_b": -1 + }, + { + "a": "0x3ff8b0170414a2000000000000000", + "b": "0x8", + "cmp_a_b": 1 + }, + { + "a": "0xbde735fb6bbac0", + "b": "0x2861680514beca000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xbe4e", + "b": "0xe516e42fcdd0500000000", + "cmp_a_b": -1 + }, + { + "a": "0x1508a592a4f46300000000000", + "b": "0xdf63d34d971", + "cmp_a_b": 1 + }, + { + "a": "0x286bc4ddc91164000000000000000000", + "b": "0x24408d6f25bf8a000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x14161e68b1a456", + "b": "0x508dd23afc5cd0000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xb", + "b": "0x103ec47", + "cmp_a_b": -1 + }, + { + "a": "0x152d1c94084e9300000000000000", + "b": "0x449c5641bfec88000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0x24219ad674190e00000", + "cmp_a_b": -1 + }, + { + "a": "0xb54364a65", + "b": "0x108f1acc10ac1000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x6a2928f2fcd94400000", + "b": "0x6a2928f2fcd94400000", + "cmp_a_b": 0 + }, + { + "a": "0xed8ddd1fe1646000", + "b": "0x93be875e42a9f00000", + "cmp_a_b": -1 + }, + { + "a": "0x1ee979", + "b": "0x2676eeac34c1c00000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0xb3655f29f45e5800000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x519490ee231d1400000000000000000", + "b": "0x4692b50b5a90a800000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1a014fc5fc55110", + "b": "0x10b41f2837d9fe0000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x76459b9887", + "b": "0x389c226a1b6892000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xb6b6ad50ff184", + "b": "0x48002636877810000", + "cmp_a_b": -1 + }, + { + "a": "0x67ae777170bb6800000000", + "b": "0xcc87136621c0a000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1339911147d9e3000000000000000000", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0xcb22f36db738", + "b": "0x83bcd5007ba46000", + "cmp_a_b": -1 + }, + { + "a": "0x5a5ca86f3e0b80000000000", + "b": "0x69b9dd673c13fc000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x7e4e56cbe32c9", + "b": "0x3d427ee2fe6eae000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x580e07eed8cd4000000000000", + "b": "0xf2c32d11b042800000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2e3795ff839ca60000000000000", + "b": "0x3c3c280e9846580000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x25964a4a189f4e00000", + "b": "0x8cfed885497b4800000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x223b38", + "b": "0xc263e911f8939800000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0xa9e44ae6d79d8000000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xa56aa555cc8d98000000000000000000", + "b": "0x4268bafda71dac00000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3230d53e01720c000000000000", + "b": "0x833ffc99ad25b000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x3c70b4f199bb840000000000", + "b": "0x1994e9618066450000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xa", + "b": "0x115b17c37e45e80000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xe15774a0a5c430000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x26c85145bf", + "b": "0x3c7604ee9c9aa80000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x179f87ca265b63", + "b": "0x117f3761684e030000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0xbf255e4fecbe80000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4613865e8041e00000000", + "b": "0x4613865e8041e00000000", + "cmp_a_b": 0 + }, + { + "a": "0xc21835d085e658000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x3e606c80", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0xf3d1d84e658ac8000", + "b": "0x3f5f1bbabdb17000", + "cmp_a_b": 1 + }, + { + "a": "0x2fd6b9288b", + "b": "0x23da276a6021e60000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1b48754aa3d81e000", + "b": "0xb87099c8bb28d000000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x612733c547f0180", + "b": "0x17150bebda95e7000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x6607da7ca8", + "b": "0x558c9f33e4b9cc000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x8ef1897aea4c08000000000000", + "b": "0x368694f4000d260000000000", + "cmp_a_b": 1 + }, + { + "a": "0x242", + "b": "0x116c69b22d22c300000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2a82e712d", + "b": "0x945e48a9945820000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1c1976c39839ce000000000000000", + "b": "0x8725321df30ab8000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3bb95e7", + "b": "0xd09c4ce764c528000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x8351eafeacfa980000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x842d0439c5bdd0000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x476b02cc1b4ed", + "b": "0x476b02cc1b4ed", + "cmp_a_b": 0 + }, + { + "a": "0x1b20cf842d97", + "b": "0x3ef5a47a078f380000", + "cmp_a_b": -1 + }, + { + "a": "0xbbc844796e5798000000000000000000", + "b": "0xd24767558a497000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x789b713e754ffc000000", + "b": "0x789b713e754ffc000000", + "cmp_a_b": 0 + }, + { + "a": "0x18b534cdd", + "b": "0x3ea671df6384d4000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x65198cd35a034400000000000000000", + "b": "0x76a366c503c", + "cmp_a_b": 1 + }, + { + "a": "0x68b5", + "b": "0x216a1203030ede000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x6b435ea", + "b": "0xab2ea5f2d91360000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x11b417dc7ff94e00000000000000000", + "b": "0x538f8c001ef514000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x33ba22b7f74bb400000000000000", + "b": "0x1a626a2923570f0000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x86db8f7584edf0000000", + "b": "0x211e2c932cd330000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x8df4991cf11a88000000000000000", + "b": "0x1903fb746c01ee0000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xb1c7d8cecf7c600", + "b": "0xe8701a24a28ac000000000", + "cmp_a_b": -1 + }, + { + "a": "0x316600480d7b2a00000", + "b": "0x316600480d7b2a00000", + "cmp_a_b": 0 + }, + { + "a": "0x43", + "b": "0xd4439adff0fa9000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x7182d9a2aba00800000000000000", + "b": "0xb5bb69ca39b03000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x99e86aad534040000000", + "b": "0x49a6e185d91fd00000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x44d64e1d3a4b200000", + "b": "0x42b5810580dfe8000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3b20bb99c0671400000", + "b": "0x4d1dbb40", + "cmp_a_b": 1 + }, + { + "a": "0x73e6a5cadeb3740000000", + "b": "0x17e1cdd325d323000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x5", + "b": "0x5c5c96dd27214000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x11bc46a7babe7600000000000000", + "b": "0x5175297306b350000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x14fbc282c39f7900000000000", + "b": "0x14fbc282c39f7900000000000", + "cmp_a_b": 0 + }, + { + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 + }, + { + "a": "0x366cc4f2abf7fc000000000", + "b": "0x366cc4f2abf7fc000000000", + "cmp_a_b": 0 + }, + { + "a": "0x7b593fa2b", + "b": "0x15296d9a7aa22e000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2f4ecc347c491e0000", + "b": "0xc", + "cmp_a_b": 1 + }, + { + "a": "0x26eb64a39c847c", + "b": "0x10e86f2e0c2f7e0000000000", + "cmp_a_b": -1 + }, + { + "a": "0x5c06c940a860940000000000000000", + "b": "0xcc5de3ee4ee6a0000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x377d8436be959a", + "cmp_a_b": -1 + }, + { + "a": "0x13c30ed22d584700000", + "b": "0x3bcb58f6defa5400000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x108019058", + "b": "0x65421a0507673000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x111153c9f8c1c40000", + "b": "0x728ee3fb1", + "cmp_a_b": 1 + }, + { + "a": "0x300c09bafeb3600000000000", + "b": "0x4530330a6e0c", + "cmp_a_b": 1 + }, + { + "a": "0x2a78284236428600000000000000", + "b": "0x28cbddc17b2fb20000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1d58b0645fefa", + "b": "0x46ba1a4ad5cd400000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x10449b7e4da7d0000000000000000000", + "b": "0x10449b7e4da7d0000000000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x2a4d82f926e", + "b": "0x1919df4b4954040000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1adddaf4826e9c000000000", + "b": "0x1adddaf4826e9c000000000", + "cmp_a_b": 0 + }, + { + "a": "0x56721b1dcbed84000000000000000000", + "b": "0x1845eb746b8fb300000000000", + "cmp_a_b": 1 + }, + { + "a": "0x15", + "b": "0x3dc64513c6e814000", + "cmp_a_b": -1 + }, + { + "a": "0x5", + "b": "0xc6a78e9b51521000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x10101b", + "b": "0xacf24e4c6b6df0000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2f", + "b": "0x33d6bda9dcb8f8000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x107ea64", + "b": "0xa14f64041c957800000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xeb03315e73833000", + "b": "0x67f92558eccde400000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2f9f6e2af7630a", + "b": "0x1e2fc927e0db43000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x355049b38c8c8", + "b": "0x355049b38c8c8", + "cmp_a_b": 0 + }, + { + "a": "0x5c", + "b": "0x5c", + "cmp_a_b": 0 + }, + { + "a": "0x10e6c82cc2f40d0000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x199499650761c80000000000", + "b": "0x70c8", + "cmp_a_b": 1 + }, + { + "a": "0x3086d9f8f754840000000000000", + "b": "0x97212b9991a638000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x53ed0e6b5d941c000000000000000", + "b": "0xf6d9f2a86e3928000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xb40c92d0da0eb80000000000000", + "b": "0x5fd4b95617eed8000", + "cmp_a_b": 1 + }, + { + "a": "0x1a64f524cb7fd900000000000000000", + "b": "0x5e86524096650800000", + "cmp_a_b": 1 + }, + { + "a": "0x4a2867ea6d3b68000000", + "b": "0x54f80a64bf9db400000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xabc", + "b": "0xaa75d60ca852b0000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x5149167", + "b": "0xadd", + "cmp_a_b": 1 + }, + { + "a": "0x3c417ca6dcde", + "b": "0x2f6648f4aeb76e0000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x6e12ec89a15148000000000000000000", + "b": "0x6e12ec89a15148000000000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x8bf28b3b54ed000000000000", + "b": "0x1137b550e08feb00000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xbb4a8bef9668b80", + "b": "0xcd88718358f9d00000000", + "cmp_a_b": -1 + }, + { + "a": "0x13dd31d6c222c6000000", + "b": "0x13dd31d6c222c6000000", + "cmp_a_b": 0 + }, + { + "a": "0x160b24dd8d41e4000000000000", + "b": "0x10dbf8a86e400a000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x699a1d5c", + "b": "0x106f8cf2328c47000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x24d63a5a0a1c2200000000000000", + "b": "0xf6ee7a6681bf380000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x18b", + "b": "0x366d0c8b34b2200000000000", + "cmp_a_b": -1 + }, + { + "a": "0xa8156273c2c10800", + "b": "0x2bc922", + "cmp_a_b": 1 + }, + { + "a": "0xed4", + "b": "0xf", + "cmp_a_b": 1 + }, + { + "a": "0xcd5819b6de9aa8000000000000000000", + "b": "0xcd5819b6de9aa8000000000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x19", + "b": "0x315d291c842ba40000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x485e0498a", + "b": "0x4d015f42caaed4000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1efa52f949a5ff00000000", + "b": "0x8c3e0f7b17ef900000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x5e4e9", + "b": "0x243", + "cmp_a_b": 1 + }, + { + "a": "0x1c220110c7dce000000", + "b": "0x4a2238de097e9800000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x11c9aea352", + "b": "0xd7522fe215f630000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2b2fa19e5bbb640000000000000000", + "b": "0x87459633f7f", + "cmp_a_b": 1 + }, + { + "a": "0x6333f3e1183e4800000000000000000", + "b": "0x510d78590ba0300000000000", + "cmp_a_b": 1 + }, + { + "a": "0x1477f18acbb827000000", + "b": "0x1477f18acbb827000000", + "cmp_a_b": 0 + }, + { + "a": "0xef7f9ef295f69800000000000", + "b": "0x2a0df4df4548da00000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x17ef134211", + "b": "0x863307506191000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x571d92", + "b": "0x2dae6a84ae7e540000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1fb8e13af40bc80000000", + "b": "0x9d6866422619400000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x50b389d3a806fc0", + "b": "0x6df5ef", + "cmp_a_b": 1 + }, + { + "a": "0x10b2392572d23b000", + "b": "0x1c3a851541f", + "cmp_a_b": 1 + }, + { + "a": "0x8cfbf87317fb4800000000000", + "b": "0x8a81abafd926a000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x681aa9e31d617000000000", + "b": "0x17a4ff70f603040000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x753b5b463ccda40000000", + "b": "0x753b5b463ccda40000000", + "cmp_a_b": 0 + }, + { + "a": "0x3a2067b7dcdea4000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x136346805492c8", + "b": "0x197a08b31946ff0000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xf0ab9c1907347000000000000000000", + "b": "0x7a15cdb1cff0c8000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x13a95bef2d98240000000000000000", + "b": "0x123df500768d3c00000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xa146afdc12f85800000000000000", + "b": "0xe83b3538a273c", + "cmp_a_b": 1 + }, + { + "a": "0x338ea10c1a0cc8000000000000000", + "b": "0x227cb892a4682e00000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 + }, + { + "a": "0x73b7f82aaa43d", + "b": "0xb791eb8701f7f80000000000", + "cmp_a_b": -1 + }, + { + "a": "0x90def5834d95b000000000000000000", + "b": "0x44b584295b1364000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xe066f4ee9ba2", + "b": "0x14e282987d42f700000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1727", + "b": "0xe6ccf44f3cb740000000", + "cmp_a_b": -1 + }, + { + "a": "0x1f3123bce307e9000", + "b": "0x5ae5a481a8c73c000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xf3107cb973c748000000000000", + "b": "0x6620f", + "cmp_a_b": 1 + }, + { + "a": "0x68a6c73469b9d0000000000000000000", + "b": "0x78d89e54d81aac00000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4b9dd8", + "b": "0x4984f17d4f34f800", + "cmp_a_b": -1 + }, + { + "a": "0xe9c887808d683", + "b": "0xb934a75350e430000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2e5ddeb17198300000000000", + "b": "0xaf255d10d0", + "cmp_a_b": 1 + }, + { + "a": "0x25690dfc90a69", + "b": "0x1216660e3c818d0000000", + "cmp_a_b": -1 + }, + { + "a": "0x39e57b74cf43f", + "b": "0x323f9f1e3b76d20000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x105bda142e9023000000", + "b": "0x105bda142e9023000000", + "cmp_a_b": 0 + }, + { + "a": "0x291b80ce4e20080", + "b": "0x6", + "cmp_a_b": 1 + }, + { + "a": "0x5b105919f214600000000000000000", + "b": "0x2be750456", + "cmp_a_b": 1 + }, + { + "a": "0x1e9c452734290500000000", + "b": "0x7fdd78bdd1cd100000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x289658356989d20000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x209a0ecdec08120000000000000", + "b": "0x51876b3f8eb3900000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xa6ec7289176418000000000", + "b": "0x211da92b4b2df600000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x17e048f", + "b": "0x7f1985a", + "cmp_a_b": -1 + }, + { + "a": "0x538cc434ab1a600000", + "b": "0x17023e74c53bd500000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x494bb", + "b": "0xa6efbf861f513800000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x140aed4bff37560", + "b": "0x593f61f7670e440000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x438b01c6763d0c00000000", + "b": "0x22efa008f2a0fa0000000", + "cmp_a_b": 1 + }, + { + "a": "0x287217548867de0", + "b": "0x95e79de391cf40000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2258121d9a36540", + "b": "0xd5eb359c79010000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xcd81fba849366800000000000000000", + "b": "0x1634e8cebc3941", + "cmp_a_b": 1 + }, + { + "a": "0x79cee62f79425400000000", + "b": "0x2e88037ce396200000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4ef49997bb1fb800000000000", + "b": "0x52365e1d08bb800000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1130847", + "b": "0x146b50e", + "cmp_a_b": -1 + }, + { + "a": "0x14ad50780", + "b": "0x688fa409c60d5000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1e1d1ccddd71e300", + "b": "0x12c175af157b5f000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x72ec80df2", + "b": "0x6641e09e2aa3ac0000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1e015c48d6e4b7000000000000000000", + "b": "0x1e015c48d6e4b7000000000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x10fe036610cfb0000000000000000", + "b": "0xa78a3bc1c91e9000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3012d6bcbec3200000000000000", + "b": "0x141f15ccb6a08f0000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xed9694d8e", + "b": "0x92e31cf61d47380000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1dd75ba4f33d0", + "b": "0x5bb163e130924000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x188029", + "b": "0x129174efe88efd0000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x2e331544bf05d2000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xf1395d130003200000000", + "b": "0x1c173706c244660000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1a0c89c09e74", + "b": "0x290f51241773a2000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x36a6abcec76b5e0000000000000", + "b": "0xc210e7415c4ea000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xb79fe", + "b": "0x322ca21a93ca2800000000", + "cmp_a_b": -1 + }, + { + "a": "0x85afaaae69df58000000", + "b": "0xf25f462155", + "cmp_a_b": 1 + }, + { + "a": "0xad", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0xee", + "b": "0x36de7c0a8f67e80000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3ad5ef4a25", + "b": "0x37e230e41b46100000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x16665bd7725b", + "b": "0x28", + "cmp_a_b": 1 + }, + { + "a": "0x5a48081dab6b6400000000000000", + "b": "0x12e3c52d9db0d50000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x286457bc7f132e0", + "b": "0x4823025a4f8ca400000", + "cmp_a_b": -1 + }, + { + "a": "0xa61508a6352", + "b": "0xa61508a6352", + "cmp_a_b": 0 + }, + { + "a": "0x8a3bdd17d6b", + "b": "0x210d1cafba780800000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x38a4d3eb0d5af8", + "cmp_a_b": -1 + }, + { + "a": "0x2b62d93d3", + "b": "0x4aed8d4d9d9a940000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x14be05ae5bb", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x13f6bd970e43dd00", + "b": "0x1161a317f1d69500000000", + "cmp_a_b": -1 + }, + { + "a": "0x1d64dff0894953000000000000000000", + "b": "0x96df0ff86f0cf8000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x11ad69271caed", + "b": "0xee58252a79efa0000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xd385b12d3eb688000000000000000000", + "b": "0x1f4625aef6d3310000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xb82223ed382ac8000000000000000", + "b": "0x1454862a0b794500000000", + "cmp_a_b": 1 + }, + { + "a": "0xa45ff1a8cdfa", + "b": "0xbb5893dd5a84b800000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x31f24cd9825dfe00000000", + "b": "0x2a3d8f0a44913e0000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x226895af57027c000000000000000000", + "b": "0x5de3813f65d7500000000000", + "cmp_a_b": 1 + }, + { + "a": "0xdb9ce6ce4b365800000000000000000", + "b": "0x5fc1f1a533fe", + "cmp_a_b": 1 + }, + { + "a": "0x218ebf44bce3f600000", + "b": "0x1610ff66e9f1f600000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x21ac0094f95af80000", + "b": "0x126d49d1a0", + "cmp_a_b": 1 + }, + { + "a": "0xd0d3281a955378000000000", + "b": "0x1a76b5fd56b9c700000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x9e9c", + "b": "0x283abfee4d191200000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xda953c11fa1ee000000000", + "b": "0xda953c11fa1ee000000000", + "cmp_a_b": 0 + }, + { + "a": "0x43302870d11320000000000000000000", + "b": "0x6ea216893668580000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x20e34f", + "b": "0x27103b4cc0", + "cmp_a_b": -1 + }, + { + "a": "0x52bebabb5a4b380", + "b": "0xd1cdbf755f8290000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x14", + "b": "0x14", + "cmp_a_b": 0 + }, + { + "a": "0x0", + "b": "0x5d982c9ce338b00000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4f21656c1939d8000", + "b": "0x13501669512fd100000", + "cmp_a_b": -1 + }, + { + "a": "0x13e9", + "b": "0x19261a24beb68c000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4ace1a734b6b6c0000000000000", + "b": "0x56b2c5c375bd280000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x45631cf9826ffc000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x124", + "b": "0x29809d4edfc11000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3ce4b9", + "b": "0x13b3abe15aab54000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x6f7590a7f9e5b40000", + "b": "0x10dbe72ef41292000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x10a9567f062dfb0000000000000000", + "b": "0x10a9567f062dfb0000000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x34eda6aa7f2f7800000000000", + "b": "0x2e76bce18421c600000000000", + "cmp_a_b": 1 + }, + { + "a": "0x68ed62567", + "b": "0x16e93b4526346b000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1fb743b46651ea00000000", + "b": "0x591212553bc5d00000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4", + "b": "0x71b687ab87", + "cmp_a_b": -1 + }, + { + "a": "0x14fb93d2f2dab90000", + "b": "0xa9975f1", + "cmp_a_b": 1 + }, + { + "a": "0x73a97881356604000000000", + "b": "0x3f545c5919b7140000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x102db6295f636f000000", + "b": "0x165fc03b235a550000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x10b3c8a6dc653700", + "b": "0xbcfcd40d4f3160000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x165e4f6125", + "b": "0x1017e3e1cb38e70000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x421923", + "b": "0x6ed2c76fa50ac8000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x28cdc2a11043c80000000000000", + "b": "0x48d1bf394635640000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x11e1eecff8716d", + "b": "0x6505ffe57aeacc00000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x614ba9e", + "b": "0x85c36ef32fdb300000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x17acdb6eb6a4e600000", + "b": "0x17acdb6eb6a4e600000", + "cmp_a_b": 0 + }, + { + "a": "0xa40f102a675318000000000000000000", + "b": "0x15a63060afca530000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x22e20ba09ce0a0000000000000", + "b": "0x8f07f50f3787b000000", + "cmp_a_b": 1 + }, + { + "a": "0x512ada0ed61740000000000", + "b": "0x2bebca6f78f91a000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1aec5e51cb06f000000", + "b": "0x67c72a6ddf69fc00", + "cmp_a_b": 1 + }, + { + "a": "0x307e54a3ffa21200", + "b": "0x142694c039269e00000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2f61f", + "b": "0x67aed986c5bc74000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x35505e0b553b780000000", + "b": "0x2a9d4aec94", + "cmp_a_b": 1 + }, + { + "a": "0x32fdaf19bbf6e80000000000000000", + "b": "0x32fdaf19bbf6e80000000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x419a0", + "b": "0xae763990817aa80", + "cmp_a_b": -1 + }, + { + "a": "0x1b996b3ca6deed0", + "b": "0x20ecc5f5d8ccc200", + "cmp_a_b": -1 + }, + { + "a": "0x8830fb63ba", + "b": "0x5c64d890c69ddc000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xdad98b1144a", + "b": "0xf5", + "cmp_a_b": 1 + }, + { + "a": "0x11a145cf68d40e00000000000", + "b": "0x21e35d6c9c133c0000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x35f7", + "b": "0x2df8186c", + "cmp_a_b": -1 + }, + { + "a": "0x140db75abc46d20000000", + "b": "0x2a75ae5f7b34140000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x35b1ab", + "b": "0x76a8b418e5f8bc0000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1c324e169b3671000000", + "b": "0xaa9ad2390b1", + "cmp_a_b": 1 + }, + { + "a": "0x3ce55a8acddf7e", + "b": "0x8defe390689110000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x493a5b1d7bef40000000000000", + "b": "0x493a5b1d7bef40000000000000", + "cmp_a_b": 0 + }, + { + "a": "0xb0e8002c05373800000000000", + "b": "0xb0e8002c05373800000000000", + "cmp_a_b": 0 + }, + { + "a": "0x337848ae7ea84c0000000000000000", + "b": "0x31", + "cmp_a_b": 1 + }, + { + "a": "0x27cf5b58ba", + "b": "0xe29527f5a19cd80000", + "cmp_a_b": -1 + }, + { + "a": "0x3da4149e036dc400000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x2602991dd2134c00000000000000", + "b": "0xf5b0ac138c213800000000", + "cmp_a_b": 1 + }, + { + "a": "0xe5e84", + "b": "0x1cc8598cf981de000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x33f1a", + "b": "0x33f1a", + "cmp_a_b": 0 + }, + { + "a": "0xce47b5c5", + "b": "0x24859b", + "cmp_a_b": 1 + }, + { + "a": "0x1a07c2c9847cb1000000", + "b": "0x388a8b4ba2d7b6000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x9baaa4f8ed40500000000000000000", + "b": "0x9baaa4f8ed40500000000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x1c930bf48781bf00000", + "b": "0xa165", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x7270128604460000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3065e34", + "b": "0xd5324f0e8508d000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x968e7d698", + "b": "0x6", + "cmp_a_b": 1 + }, + { + "a": "0x8f779279bdf4", + "b": "0x14a5", + "cmp_a_b": 1 + }, + { + "a": "0x2842e582bf59d00000000000000000", + "b": "0x111ed9232", + "cmp_a_b": 1 + }, + { + "a": "0xb780a1fc597398000000", + "b": "0x85c1de2d8ee248000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4929b0ac", + "b": "0x4929b0ac", + "cmp_a_b": 0 + }, + { + "a": "0x311b4feae35f5e00000000000000000", + "b": "0xdebd374b47d1680000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1990c7253db701000000000000000000", + "b": "0x13c0d35bc73e06000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 + }, + { + "a": "0x3b3e4ee4bf7d", + "b": "0x69be", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x137ca8e457fe23000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x58d58df9a90d500", + "b": "0x1382a1c378f43e", + "cmp_a_b": 1 + }, + { + "a": "0x78c8a6a", + "b": "0x1807840cdeff5f000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x293f12ee65986c0000000000000000", + "b": "0x293f12ee65986c0000000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x7876cdb5dc78ac0000000000000000", + "b": "0x76", + "cmp_a_b": 1 + }, + { + "a": "0x5", + "b": "0x2b79f43760532c00000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x5c5582352ab5", + "b": "0x4330e4444f26b400000000", + "cmp_a_b": -1 + }, + { + "a": "0x19222ddda496d700000", + "b": "0x32129ba8c20cec000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x69efd5301", + "b": "0x12", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x1d3c77f5ca0544", + "cmp_a_b": -1 + }, + { + "a": "0x26019146afc35c000000", + "b": "0x3fbf4635", + "cmp_a_b": 1 + }, + { + "a": "0x30e7def7014c", + "b": "0x1e3f2619710320000", + "cmp_a_b": -1 + }, + { + "a": "0x21720d94db2cf000000000000000", + "b": "0x77f19a9cb2e0a40000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x50f67a", + "b": "0x14a5514746a02c00000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xa28", + "b": "0x303a0cd814d61c0000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xcd0", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x7c482322", + "b": "0x57a2897020b0a0000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x585fab278f812c000000000000000", + "b": "0x104700f14f5edb00", + "cmp_a_b": 1 + }, + { + "a": "0x83a5d187665cf000", + "b": "0x56274e446f613400000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3cce", + "b": "0x3cce", + "cmp_a_b": 0 + }, + { + "a": "0x0", + "b": "0x3287", + "cmp_a_b": -1 + }, + { + "a": "0x4b", + "b": "0x8afe4cdab0186000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xf1c9cf81f1fe100000000000000", + "b": "0x2", + "cmp_a_b": 1 + }, + { + "a": "0x1e217f33f", + "b": "0x44a523d94ccae80000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x10", + "b": "0x10", + "cmp_a_b": 0 + }, + { + "a": "0x122b2da8907a940000000", + "b": "0x12e97", + "cmp_a_b": 1 + }, + { + "a": "0x3418217978ebc0000000000", + "b": "0x2640fd4f5932440000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xe6987ce10dd5a00000000", + "b": "0x9155abecb3187000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x262b75625a8ef600000000", + "b": "0x2019fae231e158000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x34771aafbebd58000000", + "b": "0xe31922fd0cd50800000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x37f301bebfcddc0000000000000", + "b": "0x1a6725f6b18dbf0000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2c0fc7d9", + "b": "0xb5d00d2bb0f4d000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4076da80599df4000000000000000000", + "b": "0x1089eb041be137000", + "cmp_a_b": 1 + }, + { + "a": "0xa330a8ed87bbb0000", + "b": "0x1b81b9efc54e580000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x97feed3ffd3", + "b": "0x18e0521fda6ec5000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xf121ba8c94b0c00000000000000000", + "b": "0x35c4", + "cmp_a_b": 1 + }, + { + "a": "0xf27", + "b": "0x6c76bfdc62a5580000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x9d8dc59f51db480000", + "b": "0xf9f780723d30180000000000000", + "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": "0x2dcfb9fba54d8c00000000000000000", + "b": "0xb70eb53876bf00000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x1b7e6205d6679f0000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x5abdb4d4cca25400", + "b": "0x9d5df7cd7544e00000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1a23483d1abf2", + "b": "0x1a23483d1abf2", + "cmp_a_b": 0 + }, + { + "a": "0x4653223f", + "b": "0x235b279cce9306000", + "cmp_a_b": -1 + }, + { + "a": "0x19a2f5b6c9", + "b": "0x7462ae12", + "cmp_a_b": 1 + }, + { + "a": "0x1390319b8a5631000000000", + "b": "0x2006a927c4ab500000000", + "cmp_a_b": 1 + }, + { + "a": "0x13c93354ad765a000000000000000000", + "b": "0x3287e928b926700000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1a948fd", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x12f9f3e", + "b": "0x7a239dbe2f43d800000", + "cmp_a_b": -1 + }, + { + "a": "0xc2096cebcca2180000", + "b": "0x136dce1", + "cmp_a_b": 1 + }, + { + "a": "0x3346633764deb4000000", + "b": "0xb781578745d9300000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x49eadd1a", + "b": "0xed95361b48314000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xe422eac34245e800000", + "b": "0x54ac", + "cmp_a_b": 1 + }, + { + "a": "0x7cc36bf28fa", + "b": "0x17c027eb32d5340000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x77", + "b": "0x2235599f91de46000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4", + "b": "0xb27f225413b1a000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x16fce41a655a7f000", + "b": "0x13", + "cmp_a_b": 1 + }, + { + "a": "0x27f5570802f208000000", + "b": "0x3387907a11292e0000", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 + }, + { + "a": "0x56e764b65ab6d8000000000000000", + "b": "0x5d8e43ac3c996000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x23f8da4c9", + "b": "0x23f8da4c9", + "cmp_a_b": 0 + }, + { + "a": "0x4121f36ae42fa000", + "b": "0x6c89f71e0021b0000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x12ca9668b6d4b0000", + "b": "0x2aa0ed19eddb7e00000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1d93c56b1e028a0000000000000000", + "b": "0x2a7d19ff48ab82000000000", + "cmp_a_b": 1 + }, + { + "a": "0x828f", + "b": "0x828f", + "cmp_a_b": 0 + }, + { + "a": "0x16fe44e5bf09570000", + "b": "0x705d2a73cbb978000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x11907cf8b7519a0000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0xbc0c", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x1185b48eb75abd0000", + "b": "0x18b2", + "cmp_a_b": 1 + }, + { + "a": "0xb8c9812f2501b0000000000000", + "b": "0xa4cd932b9c46180000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1fd10f4d8721c5000000", + "b": "0x40c2da736ead380", + "cmp_a_b": 1 + }, + { + "a": "0x3", + "b": "0x72c53625fc8bd00000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xe261c9341a64e00000000", + "b": "0x1cacef5072306f0000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x86a64cf3efc7b80000", + "b": "0x4baf42a29976f4000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x888d11e28a1a2", + "b": "0x20e49c42feda8400000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x198e9a019117a0000000000000000", + "b": "0x358ee2347e5b1e0", + "cmp_a_b": 1 + }, + { + "a": "0x60e55bccb9a1b40000000000000", + "b": "0x161580ee5cc9510000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3b50d64f2f5434000", + "b": "0x36f424caf12504000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xa38b540257ef0800000000", + "b": "0x19edac3d54ea350000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x42f1dbc2751fd400000000000000000", + "b": "0x41266b0d2b43f8000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xac48219db94ed80000000000000000", + "b": "0x3618dbd931f020000000", + "cmp_a_b": 1 + }, + { + "a": "0x5008da1f2aad6c0000000000", + "b": "0x107d3606f12a8500000000", + "cmp_a_b": 1 + }, + { + "a": "0xa8b60", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0xc", + "b": "0xc", + "cmp_a_b": 0 + }, + { + "a": "0x59cbac99079c4000000000000", + "b": "0xefa484", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x8dc6b447d40de80000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4a2b22127baa1000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0xafc", + "b": "0xb8b37beb3c43a000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x63b66f709251ec000000000000", + "b": "0x97909712c52728000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xaa89", + "b": "0x7cd10fd", + "cmp_a_b": -1 + }, + { + "a": "0x7cba197a", + "b": "0x4be7cd4485be240000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xee6b681c48", + "b": "0x70c2da9f9f1e10000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x7e488aa92f4e3c000000", + "b": "0x10", + "cmp_a_b": 1 + }, + { + "a": "0x5c1918767843a00000000000000000", + "b": "0x1c62d", + "cmp_a_b": 1 + }, + { + "a": "0x14", + "b": "0x4023091cd343f800000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x6533", + "b": "0x997a955dfedf88000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x2acd81dc6dfe42000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x889090ed93dd7000000000", + "b": "0x5f2ba24e", + "cmp_a_b": 1 + }, + { + "a": "0x5853efa", + "b": "0x100714ede8b8c6000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1448e69532d84d000000000000", + "b": "0x273c1f28191cea0", + "cmp_a_b": 1 + }, + { + "a": "0xb186b537e53da800000", + "b": "0xa96ae545cf461800000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3dc406b9d2ff", + "b": "0xb16384106e65f00", + "cmp_a_b": -1 + }, + { + "a": "0x1376bc742f59610000000000000000", + "b": "0x21a30658d498fe000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3", + "b": "0x391daa9fb4230a0000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x141f718ac9", + "b": "0x3e04fe724d729400000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xaaca69cedea8000000000000", + "b": "0xe850378aeabfd00000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x301656e5af847a", + "b": "0x27", + "cmp_a_b": 1 + }, + { + "a": "0x94c6e03c793e1800000000000", + "b": "0x6da28cbc5d53e000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x6c14f04bf", + "b": "0x6c14f04bf", + "cmp_a_b": 0 + }, + { + "a": "0xdef7c753728db800000000000000", + "b": "0x19a45751b8486300000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1998c2747bed530000", + "b": "0x59ca3ecc959ad4000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3820b18", + "b": "0x20bf94527c115c0000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3bd5f8b17c0d520", + "b": "0x1e0ab41b0fef64000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x326fef3fca4ac20000000000000000", + "b": "0x4006a5cb24d33c0000", + "cmp_a_b": 1 + }, + { + "a": "0xcf1", + "b": "0x37aaf67fefc76800000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x52524188b0ef380000000000000000", + "b": "0x52524188b0ef380000000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x2d54129e0", + "b": "0x1388ea557b7a120000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x84a95023b15f400000", + "b": "0x204a148ef46d3c0000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x1c22cfa69a9d", + "cmp_a_b": -1 + }, + { + "a": "0x37e53ca438f292000000000000000000", + "b": "0xc147af535fbb00000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x7359d4817eef60000000000000000000", + "b": "0x26427f9", + "cmp_a_b": 1 + }, + { + "a": "0xb66", + "b": "0x90ec01b9f4b1c00000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x12ed80fb1c1e0600", + "b": "0x3dffbb381", + "cmp_a_b": 1 + }, + { + "a": "0x280c09df3", + "b": "0x1874f25c01922", + "cmp_a_b": -1 + }, + { + "a": "0x28", + "b": "0x28", + "cmp_a_b": 0 + }, + { + "a": "0x22732949e874660000000000", + "b": "0xb12145f6da86d800000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4584a753ca2b700000000000", + "b": "0x39bef8808e5e660000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x77d5b6689a980800000", + "b": "0x1ee03776f48df3", + "cmp_a_b": 1 + }, + { + "a": "0x8daba2b0c", + "b": "0x1a569dafbd674c0000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xf1a3acb14a9100000000000000000000", + "b": "0x1ad3a060", + "cmp_a_b": 1 + }, + { + "a": "0x54c6286", + "b": "0x412a3de81536f0000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x9d8a5a5c445a50000000", + "b": "0x269c033ea8c2fa00000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2768dc347", + "b": "0x3bae8c558a54a40000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x5cac105abbaf10000000", + "b": "0xab824bfbecea380000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xe1a279ce60ab8000", + "b": "0x1a9aa", + "cmp_a_b": 1 + }, + { + "a": "0x3829bf19661bde000000000", + "b": "0x1f0a76eecb71f300", + "cmp_a_b": 1 + }, + { + "a": "0x365b2d8fbd834a000000000000", + "b": "0x181303903c34f", + "cmp_a_b": 1 + }, + { + "a": "0x1c4d30393a236a00000000000000", + "b": "0x1c4d30393a236a00000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x1f23aa", + "b": "0x17783a416f31f50000000000", + "cmp_a_b": -1 + }, + { + "a": "0x29d05c4fdb20da00000000", + "b": "0x7408138e3fcb940000000", + "cmp_a_b": 1 + }, + { + "a": "0x2f3b7fc78dd6f600000000000000", + "b": "0x56f21930decf7c00000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4d1231e99c536800000000000000", + "b": "0x33ee6c27db933e00000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3a30112782db74", + "b": "0x3a30112782db74", + "cmp_a_b": 0 + }, + { + "a": "0x36e", + "b": "0x8b277cde2", + "cmp_a_b": -1 + }, + { + "a": "0x1db0bcd03debf600000", + "b": "0x13399456b8acc90000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x10e3", + "b": "0x280cd4dfe7e5e", + "cmp_a_b": -1 + }, + { + "a": "0x2991b6ca893", + "b": "0x509f495703e1040000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1a8de11084bd0a00000", + "b": "0x18dfd345af45270000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x12ee970a591c6600", + "b": "0xd8987bb", + "cmp_a_b": 1 + }, + { + "a": "0x263d", + "b": "0x8c61007f6eddd80000000", + "cmp_a_b": -1 + }, + { + "a": "0x1a5be8a918", + "b": "0xeee4212a940dd800000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 + }, + { + "a": "0x880386e9", + "b": "0x44381764bb36000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xf2ff5e0560cb6000000000000000000", + "b": "0x55", + "cmp_a_b": 1 + }, + { + "a": "0x31a95", + "b": "0x53120aa7ea652400000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xb38a2dd65ec4900000000000000", + "b": "0xe58d46c75b7958000", + "cmp_a_b": 1 + }, + { + "a": "0xe73112aff", + "b": "0x205e2769040b", + "cmp_a_b": -1 + }, + { + "a": "0x26fbc0", + "b": "0x93d93e5a4c99f00000000", + "cmp_a_b": -1 + }, + { + "a": "0x94be47ba93", + "b": "0x321d50e97", + "cmp_a_b": 1 + }, + { + "a": "0x135e47cc86d3880000", + "b": "0x1f344", + "cmp_a_b": 1 + }, + { + "a": "0x41c32f3ca035ac000000000000000", + "b": "0xd6a103027531b8000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1176d23e1bc0d000000000000000000", + "b": "0x24f815ae5e25be000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x10de6ecb7702", + "b": "0x7546f59f2273b4000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xbfe68", + "b": "0x4", + "cmp_a_b": 1 + }, + { + "a": "0x30407945f35f1e0", + "b": "0x11433477892561000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x36e7241c02f35c0000000000000000", + "b": "0x95817fd3f38910000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x1748c6a7af6df70000000000000000", + "b": "0x960bbaadc331e00000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x6f2ce42244b9a40", + "b": "0x21bfab85673eaa0000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x102", + "b": "0x374df306050d0c", + "cmp_a_b": -1 + }, + { + "a": "0xdd230b3917a3400000000000", + "b": "0xdd230b3917a3400000000000", + "cmp_a_b": 0 + }, + { + "a": "0x255", + "b": "0x5204d6f104856c00000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x498a79", + "b": "0x637bf5332565e40000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xfb81f5108b7", + "b": "0x408fc78d06bb7c0000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xd1bb5293b722700000000000", + "b": "0x19b739446a7", + "cmp_a_b": 1 + }, + { + "a": "0x13f85f29815a7c0", + "b": "0x13f85f29815a7c0", + "cmp_a_b": 0 + }, + { + "a": "0x14dee747dcf6df", + "b": "0x69a68209edc1dc0000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x238f812e6e6a9a0000000000", + "b": "0x4e8c0", + "cmp_a_b": 1 + }, + { + "a": "0x353c16244c1", + "b": "0x5114b3808", + "cmp_a_b": 1 + }, + { + "a": "0x795ad272381", + "b": "0x10c210", + "cmp_a_b": 1 + }, + { + "a": "0xb84b461903", + "b": "0x1880bae434cbc4000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4d6fdef3f7801000000", + "b": "0x49fbbacc467ff8000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x5aa44fd877b2e800000000000000000", + "b": "0x372dd298aaa46000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x30d86dcbf3", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x58b2821d4e09", + "b": "0xc00f911f80daf000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1f0c9ba2", + "b": "0x393227aab9f9180000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0xcad5d80a0094380000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x13b413a35873b20000000", + "b": "0x13b413a35873b20000000", + "cmp_a_b": 0 + }, + { + "a": "0x263673da", + "b": "0x4134d2dbb39ff4000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3f48ed98db177800000", + "b": "0x26bd185c9915fa0000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x6bd755e9a93f88000000000", + "b": "0x148caffee6f7280000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x13c0020e25e9b8000000000000000000", + "b": "0x7d5", + "cmp_a_b": 1 + }, + { + "a": "0x47d29c2f19a494000000000000", + "b": "0x1c9574d157d35d0000", + "cmp_a_b": 1 + }, + { + "a": "0x1418dffdd7f8b30000", + "b": "0x1418dffdd7f8b30000", + "cmp_a_b": 0 + }, + { + "a": "0xa50b64e57", + "b": "0x488ab72806e31800000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3", + "b": "0x24b7c2", + "cmp_a_b": -1 + }, + { + "a": "0x9d8d676b0a7ef000000", + "b": "0x52e2474a1547a00000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1702296df2f2ab0000000000", + "b": "0xf456f2c383f2e000000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x93a8afbd565f180", + "b": "0x52f8c8f3792cc0000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x36bad4557f484600000000", + "b": "0x1858d3916abbca00000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x20bc51314aa2c20", + "b": "0x9f85e7699980f0000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x38ba3", + "b": "0xc43b8eac6aedf800000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x1352c2bf2955d5", + "cmp_a_b": -1 + }, + { + "a": "0x67c99acb64", + "b": "0x1794bf036315c70000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x70afb", + "b": "0xf254c16ab903880000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xc8eb71", + "b": "0x233", + "cmp_a_b": 1 + }, + { + "a": "0x2", + "b": "0x2", + "cmp_a_b": 0 + }, + { + "a": "0x0", + "b": "0x1c5c7d2531450d000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3336c4d353835c0000000000000", + "b": "0x6aa402736da5240000000", + "cmp_a_b": 1 + }, + { + "a": "0x141281991a27ce0", + "b": "0x901bca8c2742c000000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x7ef9ee9572", + "b": "0x20b18c86ef6f7a0000", + "cmp_a_b": -1 + }, + { + "a": "0x31de9a8d60eed60000000000", + "b": "0x9464cd", + "cmp_a_b": 1 + }, + { + "a": "0x7f2d943ff034a80000", + "b": "0xbfb28d8f750eb00000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x38", + "b": "0x139", + "cmp_a_b": -1 + }, + { + "a": "0x1e054fcc338719000000000000000", + "b": "0x152186bcc", + "cmp_a_b": 1 + }, + { + "a": "0xd1", + "b": "0x31abf3e2ac2bcc000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x9e8b9cd71920080", + "b": "0x5d11a1a2fd70fc00000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x13e64beb5ebe370000000", + "b": "0x2e9dd248abfc6a000000", + "cmp_a_b": 1 + }, + { + "a": "0x7b", + "b": "0x2ae08da5fb12d80000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2540f8b1", + "b": "0xba6e446ac78cb80000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x22", + "b": "0x366bf27dbfaeb0000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1ddea1", + "b": "0x34cf47bd081568000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x21e427b8260a22000000000000000000", + "b": "0x10dd1a8ed751e", + "cmp_a_b": 1 + }, + { + "a": "0x109a6eac6860b500000000000000", + "b": "0x109a6eac6860b500000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x3ba5180d9af2300000000000000", + "b": "0x27cc4f157", + "cmp_a_b": 1 + }, + { + "a": "0x1423de8b08251c000000000000", + "b": "0x77d7cbb3030fc0000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xd7", + "b": "0x5b67fa0bea471c000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xa5ee9075ad8d10000000000000000000", + "b": "0xd4a4e505a1e0a80000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xfa9a7d70", + "b": "0x10677720b77d94000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x69e5bb631bb8bc000000", + "cmp_a_b": -1 + }, + { + "a": "0x1114", + "b": "0x1114", + "cmp_a_b": 0 + }, + { + "a": "0x821621cde6a3f00000000000000", + "b": "0x3269f963a3fe4400000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x131489cd6", + "b": "0x131489cd6", + "cmp_a_b": 0 + }, + { + "a": "0x3aea38f4f", + "b": "0x635d84e83ad6ac00000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x97a6b318598880000", + "b": "0x15b0b04cf18cdc00000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x565cd5f6f227bc0000000", + "b": "0x22f6cb86ad84a8000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1acec50404ea", + "b": "0xd1e83", + "cmp_a_b": 1 + }, + { + "a": "0x225055361", + "b": "0x7c90c5193889940000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x58205c0f1fe3", + "b": "0x28deb8aea5270400000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x257c5bc1b5893000000000", + "b": "0x186176e41f06300000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x206df57d32bec0000000000000", + "b": "0xe523755c252b2800000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x36a562aae97da4000000", + "b": "0x36a562aae97da4000000", + "cmp_a_b": 0 + }, + { + "a": "0x44c45", + "b": "0x1607b9f369a84a0000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xa41afbd2815d5000000", + "b": "0x35dc1b6196703800000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4486c10fa2", + "b": "0x1307b0a113e66e00000", + "cmp_a_b": -1 + }, + { + "a": "0x1dd9", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x6fe9a796afa0340000000000", + "b": "0xac", + "cmp_a_b": 1 + }, + { + "a": "0x3651d82f7cfcbe000000000000000000", + "b": "0x3651d82f7cfcbe000000000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x1620185c847f100", + "b": "0x1620185c847f100", + "cmp_a_b": 0 + }, + { + "a": "0x4834728a9", + "b": "0x488c472580e6e40000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xa14570da0", + "b": "0xd8215ff95b9d1000000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x5f4360d14c9e74000000000000", + "b": "0x12edcad222cc28000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x6e36", + "b": "0x4a4c302dd63c2400000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xc2636a09168c90000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x55c60aa32981a8000", + "b": "0x55c60aa32981a8000", + "cmp_a_b": 0 + }, + { + "a": "0x6b9df52b818ad0000000000000", + "b": "0x33959694f4823e00000", + "cmp_a_b": 1 + }, + { + "a": "0x11183a08b1cbbb00000000000", + "b": "0x540b816659c3f800000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x7", + "b": "0x439f9fb6fb30c0000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x14654a131e4", + "cmp_a_b": -1 + }, + { + "a": "0x57d0c8b2613e64000000000000000", + "b": "0x57d0c8b2613e64000000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x3a621268", + "b": "0x9b8a37abc3c0680000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x13e78eaf2beb36000", + "b": "0x13e78eaf2beb36000", + "cmp_a_b": 0 + }, + { + "a": "0x1eb09214bcbeae00000000000000", + "b": "0x22130f1b579c500000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xfd85cfebc09ab000", + "b": "0x1915a", + "cmp_a_b": 1 + }, + { + "a": "0x32dbf0b89", + "b": "0x1cfa1b6614fc4900", + "cmp_a_b": -1 + }, + { + "a": "0xb23c1ae959b900000000000000000000", + "b": "0xbb157242a7fc880000000000", + "cmp_a_b": 1 + }, + { + "a": "0x4a4d07", + "b": "0xb370e52736e7080000000000", + "cmp_a_b": -1 + }, + { + "a": "0x12c7e61dae3291000000000000000000", + "b": "0x7463c04b58d6ec00000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1741929dfa896d0000000000000", + "b": "0x8b578a0c364a900000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x1e0cc5", + "cmp_a_b": -1 + }, + { + "a": "0x54cc08eb5659e800000000000000000", + "b": "0x8209261f0954280000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x6b4f2be85163a4", + "b": "0x3a91f1f059585", + "cmp_a_b": 1 + }, + { + "a": "0x722bb21bcbdc000000", + "b": "0x11d743ee665f1b0000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2beadd87e33f", + "b": "0x41a3d061c02a6800000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4c5ccea46d3d40000000000000000000", + "b": "0x3186161", + "cmp_a_b": 1 + }, + { + "a": "0x954b737b1826200000000000000", + "b": "0x2ccd10e13d42d40000000000", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x86b97fab9b8a080000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x6b71ef", + "b": "0x22528130df329a0000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x5518c177383da0000000", + "b": "0x51", + "cmp_a_b": 1 + }, + { + "a": "0xb9d748144f822000000000000", + "b": "0x543d70b22", + "cmp_a_b": 1 + }, + { + "a": "0xc0c08ab78fc070000000000000", + "b": "0x409ff", + "cmp_a_b": 1 + }, + { + "a": "0x8", + "b": "0x435df5bcfa9b44000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1cf", + "b": "0x4b47d2703d09f000000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x27a20345", + "b": "0x7544cd34f09a7400000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xc708e142b", + "b": "0x1ddb64d480d4850000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x5887fbc274dd2000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xfbec51ad8d2f280000000000000000", + "b": "0x3316a88573510a000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1dcb524014d4ff0000000000000000", + "b": "0x2699324f729408000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x960f3a7c10c280000", + "b": "0x13959271c4fa23000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x6603405670d2ac0", + "b": "0x5d15e90908175400000", + "cmp_a_b": -1 + }, + { + "a": "0x9103b3cdec8a980000000", + "b": "0x91684a746b71600000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x37ebc17631936e000000000000", + "b": "0x2cc69e642730ca0", + "cmp_a_b": 1 + }, + { + "a": "0x33ba3903612094", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x8a0fc990f73e30000", + "b": "0x6802f45c3b4b5", + "cmp_a_b": 1 + }, + { + "a": "0x682dff8c5786d800000", + "b": "0x8f63c1f347a2e800000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x11b23a81957db900000000000000", + "b": "0xcf77daa358bc9000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x37933c3fc9039e00000000000", + "b": "0x2d032ea69f090e0000000", + "cmp_a_b": 1 + }, + { + "a": "0x2759c9970b94240000000000000", + "b": "0x195ce20b310d3300000", + "cmp_a_b": 1 + }, + { + "a": "0x1a67ae99d9a95a00000000", + "b": "0x16121ee6f57", + "cmp_a_b": 1 + }, + { + "a": "0x4b920248d051c4000000", + "b": "0x77569da6c36044000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1f10d0bd62577a0000", + "b": "0x2d99434f3b3b440000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 + }, + { + "a": "0xbb105832a844780000000", + "b": "0x3b86309d7e6eca000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x29208061b842b60000000000000000", + "b": "0xebad18aa29e44800000", + "cmp_a_b": 1 + }, + { + "a": "0xd0d1cd9cde1688", + "b": "0x24f448aae044c40000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x19", + "b": "0x1a60caa82f0d180000000000", + "cmp_a_b": -1 + }, + { + "a": "0x25bbe7cc3e41be0000000", + "b": "0x887d7d0e38", + "cmp_a_b": 1 + }, + { + "a": "0x303c5ad", + "b": "0x17290a92d7292f0000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1c265477fc08650000", + "b": "0x1f00a24974fa190000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x880185fd537", + "b": "0xcbab7632e1e7a000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x273fb67fac78b400000000000", + "b": "0x1d6f0535d968f60000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2fb5768c489b", + "b": "0xbab6f93ffdf270000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4ee52e22123b40000000000000000", + "b": "0x111ef71a48769c000000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x194f7e4", + "b": "0x130d59aac2b3ba0000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x7b2a1e0", + "b": "0x189379608f87c9000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x25d1f156932e5000000000000", + "b": "0x3480eff649a95c0000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x6f5fdc8c074df8000000", + "b": "0xb372cefd4ce740000", + "cmp_a_b": 1 + }, + { + "a": "0x13089b55eea7a400000000", + "b": "0x348d1b3bf079a80000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x30ca904d6f4df80000000000000", + "b": "0x428474b839b9fc0000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x98c11e2d0f049", + "b": "0x3037a0a9e56f4400000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x277283fc1c00000000000000", + "b": "0x1aa71", + "cmp_a_b": 1 + }, + { + "a": "0x108bdacfca27850000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x1613571ada1cfc00000000000000000", + "b": "0x4b8235c47941140000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xa338616201b0", + "b": "0x7b2", + "cmp_a_b": 1 + }, + { + "a": "0xdc19de", + "b": "0x21a7e3a44ce7340000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 + }, + { + "a": "0x1", + "b": "0x6297a8c73c6bf", + "cmp_a_b": -1 + }, + { + "a": "0x275fcf67fc5ed400000000000000000", + "b": "0xa716c16f23ecc800000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x17d760f521", + "b": "0x29e9370ee6033a0000000", + "cmp_a_b": -1 + }, + { + "a": "0xa1d7d7b7d32bf0000000000", + "b": "0x354ee39b36559c00000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xfd9c68beb3b610000000000", + "b": "0xfd9c68beb3b610000000000", + "cmp_a_b": 0 + }, + { + "a": "0x279c0addd67fca0000000", + "b": "0xa0e81d40", + "cmp_a_b": 1 + }, + { + "a": "0x890ae04d1b5700000", + "b": "0x39ad9f999101f80000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x5030bed9", + "b": "0x672af34f4aec0400000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x170f83735e40", + "b": "0xdc65480c50cfa00000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2c466f028b03b6000000000000000", + "b": "0x4712e6c4908120", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0xb153ea5921b0b800000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xb345f4d4", + "b": "0x1d6e8721b6c", + "cmp_a_b": -1 + }, + { + "a": "0x129a82672d1ada000000000000000", + "b": "0x3ed81d51b353ec0000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3b", + "b": "0x7b174791f2e26000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2c807993e2cf6c000", + "b": "0xbc0043faeabae", + "cmp_a_b": 1 + }, + { + "a": "0x4a1fa5dde5ce30000000", + "b": "0x142bb895a9e3fe0000000", + "cmp_a_b": -1 + }, + { + "a": "0xa087654779be1800000", + "b": "0x26ebebc09eab120000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1748792b2c6", + "b": "0x182f9aa375d9", + "cmp_a_b": -1 + }, + { + "a": "0xc60b4cf5c2e50000000000000000000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x160c20696583fc0000000000", + "b": "0x7c507", + "cmp_a_b": 1 + }, + { + "a": "0x968cbdc348", + "b": "0x9952a0df0cf4580000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2eb5ae9926fc", + "b": "0x5c70ff1b84850800000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x20de53c8a60a140", + "b": "0x20de53c8a60a140", + "cmp_a_b": 0 + }, + { + "a": "0x0", + "b": "0xc1fa9526d4d5800000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x4355a6082", + "b": "0x37bffef0441a9a000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1a518bb52e88f00", + "b": "0x5ab02dd521626c000000000", + "cmp_a_b": -1 + }, + { + "a": "0x356", + "b": "0x2c8925432d9fba000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x50ff6061fa0c780000000", + "b": "0x8ba31e2774bb18000000000", + "cmp_a_b": -1 + }, + { + "a": "0x11a003cc0ae93a000000000000000", + "b": "0xc4b312fbe7abe0000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x387", + "b": "0x235470f26a25c200000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0xb6d6", + "cmp_a_b": -1 + }, + { + "a": "0xfdc", + "b": "0x87c", + "cmp_a_b": 1 + }, + { + "a": "0x2ce4c04465186400000000000000", + "b": "0x2dcaa8a00104a6000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x83eed85d2049100000000000000000", + "b": "0x27aa9bed5526ae00000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x7b4076e86176d40000000", + "b": "0x1c485cc578a96000000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x31381c", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0xa97b361a41287", + "b": "0x27e694c", + "cmp_a_b": 1 + }, + { + "a": "0x4603f65fb5390000000", + "b": "0x8144ac8f577ea800000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x13f1f20cd31ea5000000000", + "b": "0x13f1f20cd31ea5000000000", + "cmp_a_b": 0 + }, + { + "a": "0x43fb72190fe54c0000000000", + "b": "0xe1b", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x6e4e3690d5bff4000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x11820d5c3d3a100000000", + "b": "0x3a813ee73873ee000000", + "cmp_a_b": 1 + }, + { + "a": "0x4", + "b": "0x199e65acf1324c00000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x35ff", + "b": "0x34", + "cmp_a_b": 1 + }, + { + "a": "0xca760d929e5a0000000", + "b": "0x42f8ff40cbee4000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x9c5b3", + "b": "0xcb60fbc77ab6a00000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x85819b948e60f00000000000", + "b": "0x1db47f11f8f119000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xb1a54c3b6dad", + "b": "0x510b2e085c31e00000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x32b175", + "b": "0x590782231e8ae8000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xcd8f7d7578", + "b": "0x6791cd5a373f1000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3", + "b": "0x6322c904531d1c000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2", + "b": "0x59dcf99628f6a8000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x675e2aebd1f98400000000000000000", + "b": "0x3cf516501594660000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x6c35c7155b1", + "b": "0x6c35c7155b1", + "cmp_a_b": 0 + }, + { + "a": "0x3e70dc1886c3a6000", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x47a6199", + "b": "0x3158280", + "cmp_a_b": 1 + }, + { + "a": "0x3b95", + "b": "0x44f0c90715876000000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x48a7921739", + "b": "0xb7b55251", + "cmp_a_b": 1 + }, + { + "a": "0x363dcc9f729912000000000", + "b": "0x279f1", + "cmp_a_b": 1 + }, + { + "a": "0x13b912a9a1eada000000000", + "b": "0x12f5bd2ecf41440000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x8fa7d", + "b": "0x3d7984d43d812a000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2f8275cd91751a0000000000", + "b": "0x34c56cb5eeccd000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3dd962ba2b", + "b": "0x27a3a4", + "cmp_a_b": 1 + }, + { + "a": "0x1207f739d045c60000000000000", + "b": "0x3949054ce72b4a0000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2e1395cb09e2b6", + "b": "0xfa92d32fc89d080000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x8951a2a439e7e8000000000000000000", + "b": "0xc4eb18ca825f3000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3f90cd58f70fb00", + "b": "0x7296b804ce9f7800000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x16", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x2b423a79aab804000", + "b": "0x81d2ce1211edc8000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3a774eceeb", + "b": "0x49f441122273bc000000000", + "cmp_a_b": -1 + }, + { + "a": "0xd4e694a6", + "b": "0x209d93c3d7a83e0000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x108437222ad2be000000000", + "b": "0x822bec09f7", + "cmp_a_b": 1 + }, + { + "a": "0xb59c5089e", + "b": "0xa95deef2d42680000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2698", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0xa61b4be834343800000000000000000", + "b": "0x5d517c8982fec8000000000000", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 + }, + { + "a": "0x18c4ae349a", + "b": "0x18c4ae349a", + "cmp_a_b": 0 + }, + { + "a": "0x30c9e4f89e3e2e00000000000000", + "b": "0x83a8484b2922f000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x3851c72933511", + "b": "0x22ab062cbe41ee0000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xca37077035d7c800000000000", + "b": "0x1b263b6410711f0000", + "cmp_a_b": 1 + }, + { + "a": "0x27b04c3a5097", + "b": "0x1e6bbc97e04b430000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x50baa4c327d7700000000000", + "b": "0x51dd3e8951ac28000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x12329f1494eea400000000000000", + "b": "0x8fa1c4010d47300000000000", + "cmp_a_b": 1 + }, + { + "a": "0x13004772ecfd34000000", + "b": "0xe188358696efb800000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xa5f1c9179aae1", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x65fa459784759c00000000000000000", + "b": "0xb345d8f73e82580000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x11d8347", + "b": "0x5362bcebf7e608000000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x381472e460c16c000000000", + "b": "0x2647d15be268a2", + "cmp_a_b": 1 + }, + { + "a": "0x0", + "b": "0x1ccd2e68f", + "cmp_a_b": -1 + }, + { + "a": "0xc97f78e893c1f0000", + "b": "0xb2a3d5f4395e58", + "cmp_a_b": 1 + }, + { + "a": "0x8", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x427c0709", + "b": "0x27e", + "cmp_a_b": 1 + }, + { + "a": "0x26f730a22cb9ae0000000000000000", + "b": "0x1448657a4dce5b0000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xba00a", + "b": "0x13c", + "cmp_a_b": 1 + }, + { + "a": "0x148c0598972e5c000000000000000", + "b": "0xff0fe65522ce18", + "cmp_a_b": 1 + }, + { + "a": "0x8ab45", + "b": "0x2b20170b8e1d48000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x26e0d0165dbe80000000", + "cmp_a_b": -1 + }, + { + "a": "0x98dd774e", + "b": "0xfd81324718cd70000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xba697d4cd5", + "b": "0xc2cce886ef0248", + "cmp_a_b": -1 + }, + { + "a": "0xca3fc518ae70300000", + "b": "0xca3fc518ae70300000", + "cmp_a_b": 0 + }, + { + "a": "0x6454a9ee4655180000000000", + "b": "0x6c5a49218671880000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x6b892283e031a400000000000000", + "b": "0x6222df3e8b4870000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x2dc9385b8b", + "b": "0x14b14f87fde584000", + "cmp_a_b": -1 + }, + { + "a": "0x3fd784f", + "b": "0xcab3af75b88bc80000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x16cbb66b2d5a00000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x14e7417", + "b": "0xa805e3ba9913e000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xba12962ecae05", + "b": "0x1a06", + "cmp_a_b": 1 + }, + { + "a": "0x2e0a6feee1d834000000000000000000", + "b": "0x255c39911caa22000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xd2e721a8e0f820000000000", + "b": "0x1f4e96d3cc9769000000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0xa9903f89af", + "b": "0x45404db6a8ae8c000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x36", + "b": "0xc46a6ab37306980000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x32cb93ccd", + "cmp_a_b": -1 + }, + { + "a": "0x2cb2aa1bee5aa6000000000000", + "b": "0x25edee1770eec2000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x281dbc436a35bc0000000000", + "b": "0xafc30", + "cmp_a_b": 1 + }, + { + "a": "0xae6fb762f367580000000", + "b": "0xa9104bfe8531f000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x0", + "cmp_a_b": 0 + }, + { + "a": "0x84b", + "b": "0x1ce2519129b67e0000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x17a67e0257ee7500000000000000", + "b": "0x1c3a474041e2900000000000000000000000000000000000000000000", + "cmp_a_b": -1 + }, + { + "a": "0x0", + "b": "0x7c83eb3c974c8400000000", + "cmp_a_b": -1 + }, + { + "a": "0x1", + "b": "0x248ba10091f8200000000000", + "cmp_a_b": -1 + }, + { + "a": "0x25d862a3a", + "b": "0x0", + "cmp_a_b": 1 + }, + { + "a": "0x3e35a3185c784400000000000", + "b": "0x1fdaaf427b2a3a00000", + "cmp_a_b": 1 + }, + { + "a": "0x192a4706ea54a90000000000000000", + "b": "0x192a4706ea54a90000000000000000", + "cmp_a_b": 0 + }, + { + "a": "0x14eedfb2aa3b6b00000000000000", + "b": "0x2002420c3fb7ce00000000", + "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 new file mode 100644 index 0000000000..3dcc3c431f --- /dev/null +++ b/crypto3/libs/multiprecision/test/data/generate_test_data.py @@ -0,0 +1,97 @@ +import random +import math +import json +from pathlib import Path + +SOURCE_DIR = Path(__file__).resolve().parent + + +def generate_comparison_test_data(): + ZERO_PROB = 0.05 + EQ_PROB = 0.1 + TEST_CASES = 1000 + + def gen_arg(bits, rnd): + if rnd.random() < ZERO_PROB: + return 0 + log2 = rnd.random() * bits + result = math.floor(2**log2) + assert result < 2**bits + return result + + rnd = random.Random(0) + + bits = [[12, 17], [260, 130], [128, 256]] + + with open(SOURCE_DIR / "comparison.json", "w") as f: + tests = {} + for a_bits, b_bits in bits: + cases = [] + for i in range(TEST_CASES): + a = gen_arg(a_bits, rnd) + if a < 2 ** b_bits and rnd.random() < EQ_PROB: + b = a + else: + b = gen_arg(b_bits, rnd) + cmp_a_b = -1 if a < b else (0 if a == b else 1) + cases.append({"a": hex(a), "b": hex(b), "cmp_a_b": cmp_a_b}) + tests[f"test_comparison_{a_bits}_{b_bits}"] = cases + f.write(json.dumps(tests, indent=4)) + + +def generate_modular_comprehensive_test_data(): + ZERO_PROB = 0.05 + MAX_BITS_PROB = 0.1 + EQ_PROB = 0.1 + TEST_CASES = 200 + + 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) + assert result < 2**bits + return result + + rnd = random.Random(0) + + params = [ + ["prime_mod_montgomery_130", 0x314107B9EF725F87FA08F9FDADD4F48BB, 130], + ["even_mod_130", 0x314107B9EF725F87FA08F9FDADD4F48BA, 130], + ["goldilock", 0xFFFFFFFF00000001, 64], + ["even_mod_17", 0x1E240, 17], + ["montgomery_17", 0x1E241, 17], + ] + + with open(SOURCE_DIR / "modular_comprehensive.json", "w") as f: + tests = {} + for test_name, m, bits in params: + assert math.ceil(math.log2(m)) == bits + cases = [] + for i in range(TEST_CASES): + a = gen_arg(bits, m, rnd) + if rnd.random() < EQ_PROB: + b = a + else: + b = gen_arg(bits, m, rnd) + cases.append( + { + "a": hex(a), + "b": hex(b), + "m": hex(m), + "a_m_add_b_m": hex((a + b) % m), + "a_m_sub_b_m": hex((a - b + m) % m), + "a_m_mul_b_m": hex((a * b) % m), + "a_eq_b": a == b, + "a_m_pow_b": hex(pow(a, b, m)), + } + ) + tests[test_name] = cases + f.write(json.dumps(tests, indent=4)) + + +if __name__ == "__main__": + generate_comparison_test_data() + generate_modular_comprehensive_test_data() diff --git a/crypto3/libs/multiprecision/test/data/modular_comprehensive.json b/crypto3/libs/multiprecision/test/data/modular_comprehensive.json new file mode 100644 index 0000000000..4f385d33e3 --- /dev/null +++ b/crypto3/libs/multiprecision/test/data/modular_comprehensive.json @@ -0,0 +1,10012 @@ +{ + "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