diff --git a/cpp/src/barretenberg/stdlib/primitives/field/field.cpp b/cpp/src/barretenberg/stdlib/primitives/field/field.cpp index a351157c2a..29d7d1d133 100644 --- a/cpp/src/barretenberg/stdlib/primitives/field/field.cpp +++ b/cpp/src/barretenberg/stdlib/primitives/field/field.cpp @@ -525,6 +525,9 @@ template field_t field_t::add_two(const fie */ template field_t field_t::normalize() const { + if (context && context->has_normalized(witness_index, multiplicative_constant, additive_constant)) { + return context->get_normalized(witness_index, multiplicative_constant, additive_constant); + } if (witness_index == IS_CONSTANT || ((multiplicative_constant == bb::fr::one()) && (additive_constant == bb::fr::zero()))) { return *this; @@ -557,6 +560,7 @@ template field_t field_t::normalize() const .c_scaling = bb::fr::neg_one(), .const_scaling = additive_constant }); result.tag = tag; + context->cache_normalized(witness_index, multiplicative_constant, additive_constant, result); return result; } diff --git a/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.cpp b/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.cpp index 82d031905f..f5b9d9e5c5 100644 --- a/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.cpp +++ b/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.cpp @@ -736,6 +736,28 @@ uint32_t UltraCircuitBuilder_::put_constant_variable(const FF& v } } +template +field_t> UltraCircuitBuilder_::get_normalized( + uint32_t witness_index, const bb::fr& mul, const bb::fr& add) const +{ + return normalized_cache.at({witness_index, mul, add}); +} + +template +bool UltraCircuitBuilder_::has_normalized( + uint32_t witness_index, const bb::fr& mul, const bb::fr& add) const +{ + return normalized_cache.contains({witness_index, mul, add}); +} + +template +void UltraCircuitBuilder_::cache_normalized( + uint32_t witness_index, const bb::fr& mul, const bb::fr& add, + const field_t>& normalized) +{ + normalized_cache[{witness_index, mul, add}] = normalized; +} + /** * @brief Get the basic table with provided ID from the set of tables for the present circuit; create it if it doesnt * yet exist diff --git a/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp b/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp index 0268ad676d..051f63c704 100644 --- a/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp +++ b/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp @@ -330,6 +330,8 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase used_witnesses; std::vector cached_partial_non_native_field_multiplications; + std::unordered_map, field_t, boost::hash>> normalized_cache; + bool circuit_finalized = false; std::vector ipa_proof; @@ -718,6 +720,19 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase get_normalized(uint32_t witness_index, const bb::fr& mul, const bb::fr& add) const { + return normalized_cache.at({witness_index, mul, add}); + } + + bool has_normalized(uint32_t witness_index, const bb::fr& mul, const bb::fr& add) const { + return normalized_cache.contains({witness_index, mul, add}); + } + + void cache_normalized(uint32_t witness_index, const bb::fr& mul, const bb::fr& add, const field_t& normalized) { + normalized_cache[{witness_index, mul, add}] = normalized; + } + + /**x * @brief Print the number and composition of gates in the circuit *