diff --git a/src/gadgets/arithmetic.rs b/src/gadgets/arithmetic.rs index d8dce53d..0931cc88 100644 --- a/src/gadgets/arithmetic.rs +++ b/src/gadgets/arithmetic.rs @@ -1,5 +1,7 @@ use std::borrow::Borrow; +use itertools::Itertools; + use crate::field::extension_field::Extendable; use crate::field::field_types::{PrimeField, RichField}; use crate::gates::arithmetic_base::ArithmeticGate; @@ -206,11 +208,11 @@ impl, const D: usize> CircuitBuilder { /// Multiply `n` `Target`s. pub fn mul_many(&mut self, terms: &[Target]) -> Target { - let mut product = self.one(); - for &term in terms { - product = self.mul(product, term); - } - product + terms + .iter() + .copied() + .fold1(|acc, t| self.mul(acc, t)) + .unwrap_or_else(|| self.one()) } /// Exponentiate `base` to the power of `2^power_log`. diff --git a/src/gadgets/arithmetic_extension.rs b/src/gadgets/arithmetic_extension.rs index 7489ed4c..e4f05c0f 100644 --- a/src/gadgets/arithmetic_extension.rs +++ b/src/gadgets/arithmetic_extension.rs @@ -1,3 +1,5 @@ +use itertools::Itertools; + use crate::field::extension_field::target::{ExtensionAlgebraTarget, ExtensionTarget}; use crate::field::extension_field::FieldExtension; use crate::field::extension_field::{Extendable, OEF}; @@ -294,11 +296,11 @@ impl, const D: usize> CircuitBuilder { /// Multiply `n` `ExtensionTarget`s. pub fn mul_many_extension(&mut self, terms: &[ExtensionTarget]) -> ExtensionTarget { - let mut product = self.one_extension(); - for &term in terms { - product = self.mul_extension(product, term); - } - product + terms + .iter() + .copied() + .fold1(|acc, t| self.mul_extension(acc, t)) + .unwrap_or_else(|| self.one_extension()) } /// Like `mul_add`, but for `ExtensionTarget`s.