diff --git a/evm/src/permutation.rs b/evm/src/permutation.rs index a951489b..35bd92e5 100644 --- a/evm/src/permutation.rs +++ b/evm/src/permutation.rs @@ -12,7 +12,9 @@ use plonky2::iop::ext_target::ExtensionTarget; use plonky2::iop::target::Target; use plonky2::plonk::circuit_builder::CircuitBuilder; use plonky2::plonk::config::{AlgebraicHasher, GenericConfig, Hasher}; -use plonky2::plonk::plonk_common::reduce_with_powers; +use plonky2::plonk::plonk_common::{ + reduce_with_powers, reduce_with_powers_circuit, reduce_with_powers_ext_circuit, +}; use plonky2::util::reducing::{ReducingFactor, ReducingFactorTarget}; use rayon::prelude::*; @@ -74,10 +76,9 @@ impl GrandProductChallenge { builder: &mut CircuitBuilder, terms: &[ExtensionTarget], ) -> ExtensionTarget { - let zero = builder.zero(); - let mut factor = ReducingFactorTarget::new(self.beta.to_ext_target(zero)); - let reduced = factor.reduce(terms, builder); - builder.add_extension(reduced, self.gamma.to_ext_target(zero)) + let reduced = reduce_with_powers_ext_circuit(builder, terms, self.beta); + let gamma = builder.convert_to_ext(self.gamma); + builder.add_extension(reduced, gamma) } pub(crate) fn combine_base_circuit, const D: usize>( @@ -85,12 +86,8 @@ impl GrandProductChallenge { builder: &mut CircuitBuilder, terms: &[Target], ) -> Target { - let zero = builder.zero(); - let combination = terms - .iter() - .rev() - .fold(zero, |acc, &t| builder.mul_add(self.beta, acc, t)); - builder.add(combination, self.gamma) + let reduced = reduce_with_powers_circuit(builder, terms, self.beta); + builder.add(reduced, self.gamma) } } diff --git a/plonky2/src/plonk/plonk_common.rs b/plonky2/src/plonk/plonk_common.rs index 1cf14cda..e4d7b8b5 100644 --- a/plonky2/src/plonk/plonk_common.rs +++ b/plonky2/src/plonk/plonk_common.rs @@ -4,6 +4,7 @@ use plonky2_field::packed_field::PackedField; use crate::fri::oracle::SALT_SIZE; use crate::fri::structure::FriOracleInfo; +use crate::gates::arithmetic_base::ArithmeticGate; use crate::hash::hash_types::RichField; use crate::iop::ext_target::ExtensionTarget; use crate::iop::target::Target; @@ -138,6 +139,25 @@ where sum } +pub fn reduce_with_powers_circuit, const D: usize>( + builder: &mut CircuitBuilder, + terms: &[Target], + alpha: Target, +) -> Target { + if terms.len() <= ArithmeticGate::new_from_config(&builder.config).num_ops + 1 { + terms + .iter() + .rev() + .fold(builder.zero(), |acc, &t| builder.mul_add(alpha, acc, t)) + } else { + let terms_ext = terms + .iter() + .map(|&t| builder.convert_to_ext(t)) + .collect::>(); + reduce_with_powers_ext_circuit(builder, &terms_ext, alpha).0[0] + } +} + pub fn reduce_with_powers_ext_circuit, const D: usize>( builder: &mut CircuitBuilder, terms: &[ExtensionTarget],