diff --git a/cpp/src/barretenberg/ecc/curves/secp256k1/c_bind.cpp b/cpp/src/barretenberg/ecc/curves/secp256k1/c_bind.cpp index 107d889d4c..cdc247afa3 100644 --- a/cpp/src/barretenberg/ecc/curves/secp256k1/c_bind.cpp +++ b/cpp/src/barretenberg/ecc/curves/secp256k1/c_bind.cpp @@ -14,7 +14,7 @@ WASM_EXPORT void ecc_secp256k1__mul(uint8_t const* point_buf, uint8_t const* sca WASM_EXPORT void ecc_secp256k1__get_random_scalar_mod_circuit_modulus(uint8_t* result) { - barretenberg::fr output = barretenberg::fr::random_element(); + secp256k1::fr output = secp256k1::fr::random_element(); write(result, output); } @@ -22,7 +22,7 @@ WASM_EXPORT void ecc_secp256k1__reduce512_buffer_mod_circuit_modulus(uint8_t* in { uint512_t bigint_input = from_buffer(input); - uint512_t barretenberg_modulus(barretenberg::fr::modulus); + uint512_t barretenberg_modulus(secp256k1::fr::modulus); uint512_t target_output = bigint_input % barretenberg_modulus; write(result, target_output.lo); diff --git a/cpp/src/barretenberg/ecc/curves/secp256k1/secp256k1.hpp b/cpp/src/barretenberg/ecc/curves/secp256k1/secp256k1.hpp index 070222911c..9761389b33 100644 --- a/cpp/src/barretenberg/ecc/curves/secp256k1/secp256k1.hpp +++ b/cpp/src/barretenberg/ecc/curves/secp256k1/secp256k1.hpp @@ -1,36 +1,11 @@ #pragma once -#include "barretenberg/numeric/uint256/uint256.hpp" -#include "barretenberg/numeric/uintx/uintx.hpp" - #include "../../fields/field.hpp" #include "../../groups/group.hpp" -#include "../bn254/fq.hpp" -#include "../bn254/fr.hpp" #include "../types.hpp" namespace secp256k1 { -constexpr uint256_t get_r_squared(const uint256_t prime_256) -{ - uint512_t R(0, 1); - uint1024_t R_1024 = uint1024_t(R); - uint1024_t R_squared = R_1024 * R_1024; - uint1024_t modulus = uint1024_t(uint512_t(prime_256)); - - uint1024_t R_squared_mod_p = R_squared % modulus; - return R_squared_mod_p.lo.lo; -} - -constexpr uint64_t get_r_inv(const uint256_t prime_256) -{ - uint512_t r{ 0, 1 }; - // -(1/q) mod r - uint512_t q{ -prime_256, 0 }; - uint256_t q_inv = q.invmod(r).lo; - return (q_inv).data[0]; -} - struct Secp256k1FqParams { static constexpr uint64_t modulus_0 = 0xFFFFFFFEFFFFFC2FULL; static constexpr uint64_t modulus_1 = 0xFFFFFFFFFFFFFFFFULL; diff --git a/cpp/src/barretenberg/ecc/curves/secp256r1/secp256r1.hpp b/cpp/src/barretenberg/ecc/curves/secp256r1/secp256r1.hpp index 2d04e47c90..ef6b431ab4 100644 --- a/cpp/src/barretenberg/ecc/curves/secp256r1/secp256r1.hpp +++ b/cpp/src/barretenberg/ecc/curves/secp256r1/secp256r1.hpp @@ -1,35 +1,10 @@ #pragma once -#include "barretenberg/numeric/uint256/uint256.hpp" -#include "barretenberg/numeric/uintx/uintx.hpp" - #include "../../fields/field.hpp" #include "../../groups/group.hpp" -#include "../bn254/fq.hpp" -#include "../bn254/fr.hpp" namespace secp256r1 { -constexpr uint256_t get_r_squared(const uint256_t prime_256) -{ - uint512_t R(0, 1); - uint1024_t R_1024 = uint1024_t(R); - uint1024_t R_squared = R_1024 * R_1024; - uint1024_t modulus = uint1024_t(uint512_t(prime_256)); - - uint1024_t R_squared_mod_p = R_squared % modulus; - return R_squared_mod_p.lo.lo; -} - -constexpr uint64_t get_r_inv(const uint256_t prime_256) -{ - uint512_t r{ 0, 1 }; - // -(1/q) mod r - uint512_t q{ -prime_256, 0 }; - uint256_t q_inv = q.invmod(r).lo; - return (q_inv).data[0]; -} - struct Secp256r1FqParams { static constexpr uint64_t modulus_0 = 0xFFFFFFFFFFFFFFFFULL; static constexpr uint64_t modulus_1 = 0x00000000FFFFFFFFULL; diff --git a/cpp/src/barretenberg/honk/flavor/standard.hpp b/cpp/src/barretenberg/honk/flavor/standard.hpp index 47c2d3b6da..a61f2c06af 100644 --- a/cpp/src/barretenberg/honk/flavor/standard.hpp +++ b/cpp/src/barretenberg/honk/flavor/standard.hpp @@ -62,9 +62,6 @@ class Standard { static constexpr size_t MAX_RANDOM_RELATION_LENGTH = MAX_RELATION_LENGTH + 1; static constexpr size_t NUM_RELATIONS = std::tuple_size::value; - // Instantiate the BarycentricData needed to extend each Relation Univariate - static_assert(instantiate_barycentric_utils()); - // define the containers for storing the contributions from each relation in Sumcheck using RelationUnivariates = decltype(create_relation_univariates_container()); using RelationValues = decltype(create_relation_values_container()); diff --git a/cpp/src/barretenberg/honk/flavor/standard_grumpkin.hpp b/cpp/src/barretenberg/honk/flavor/standard_grumpkin.hpp index b1d17e252d..7d63df89bd 100644 --- a/cpp/src/barretenberg/honk/flavor/standard_grumpkin.hpp +++ b/cpp/src/barretenberg/honk/flavor/standard_grumpkin.hpp @@ -53,9 +53,6 @@ class StandardGrumpkin { static constexpr size_t MAX_RANDOM_RELATION_LENGTH = MAX_RELATION_LENGTH + 1; static constexpr size_t NUM_RELATIONS = std::tuple_size::value; - // Instantiate the BarycentricData needed to extend each Relation Univariate - static_assert(instantiate_barycentric_utils()); - // define the containers for storing the contributions from each relation in Sumcheck using RelationUnivariates = decltype(create_relation_univariates_container()); using RelationValues = decltype(create_relation_values_container()); diff --git a/cpp/src/barretenberg/honk/flavor/ultra.hpp b/cpp/src/barretenberg/honk/flavor/ultra.hpp index c7b207afd4..a98405ab53 100644 --- a/cpp/src/barretenberg/honk/flavor/ultra.hpp +++ b/cpp/src/barretenberg/honk/flavor/ultra.hpp @@ -67,9 +67,6 @@ class Ultra { static constexpr size_t MAX_RANDOM_RELATION_LENGTH = MAX_RELATION_LENGTH + 1; static constexpr size_t NUM_RELATIONS = std::tuple_size::value; - // Instantiate the BarycentricData needed to extend each Relation Univariate - static_assert(instantiate_barycentric_utils()); - // define the container for storing the univariate contribution from each relation in Sumcheck using RelationUnivariates = decltype(create_relation_univariates_container()); using RelationValues = decltype(create_relation_values_container()); diff --git a/cpp/src/barretenberg/honk/flavor/ultra_grumpkin.hpp b/cpp/src/barretenberg/honk/flavor/ultra_grumpkin.hpp index 05ed113d80..5619db3603 100644 --- a/cpp/src/barretenberg/honk/flavor/ultra_grumpkin.hpp +++ b/cpp/src/barretenberg/honk/flavor/ultra_grumpkin.hpp @@ -65,9 +65,6 @@ class UltraGrumpkin { static constexpr size_t MAX_RANDOM_RELATION_LENGTH = MAX_RELATION_LENGTH + 1; static constexpr size_t NUM_RELATIONS = std::tuple_size::value; - // Instantiate the BarycentricData needed to extend each Relation Univariate - static_assert(instantiate_barycentric_utils()); - // define the container for storing the univariate contribution from each relation in Sumcheck using RelationUnivariates = decltype(create_relation_univariates_container()); using RelationValues = decltype(create_relation_values_container()); diff --git a/cpp/src/barretenberg/honk/sumcheck/polynomials/barycentric_data.hpp b/cpp/src/barretenberg/honk/sumcheck/polynomials/barycentric_data.hpp index f7e13ceabf..bb63d8be9e 100644 --- a/cpp/src/barretenberg/honk/sumcheck/polynomials/barycentric_data.hpp +++ b/cpp/src/barretenberg/honk/sumcheck/polynomials/barycentric_data.hpp @@ -51,6 +51,34 @@ template class BarycentricData return result; } + static constexpr std::array batch_invert( + const std::array& coeffs) + { + constexpr size_t n = domain_size * num_evals; + std::array temporaries{}; + std::array skipped{}; + Fr accumulator = 1; + for (size_t i = 0; i < n; ++i) { + temporaries[i] = accumulator; + if (coeffs[i] == 0) { + skipped[i] = true; + } else { + skipped[i] = false; + accumulator *= coeffs[i]; + } + } + accumulator = Fr(1) / accumulator; + std::array result{}; + Fr T0; + for (size_t i = n - 1; i < n; --i) { + if (!skipped[i]) { + T0 = accumulator * temporaries[i]; + accumulator *= coeffs[i]; + result[i] = T0; + } + } + return result; + } // for each x_k in the big domain, build set of domain size-many denominator inverses // 1/(d_i*(x_k - x_j)). will multiply against each of these (rather than to divide by something) // for each barycentric evaluation @@ -62,11 +90,10 @@ template class BarycentricData for (size_t j = 0; j < domain_size; ++j) { Fr inv = lagrange_denominators[j]; inv *= (big_domain[k] - big_domain[j]); - inv = Fr(1) / inv; // prob have self_inverse method; should be part of Field concept result[k * domain_size + j] = inv; } } - return result; + return batch_invert(result); } // get full numerator values