diff --git a/src/fri/recursive_verifier.rs b/src/fri/recursive_verifier.rs index 9b3cdd6e..7592bc1f 100644 --- a/src/fri/recursive_verifier.rs +++ b/src/fri/recursive_verifier.rs @@ -271,8 +271,7 @@ impl, const D: usize> CircuitBuilder { let g = self.constant(F::MULTIPLICATIVE_GROUP_GENERATOR); let phi = self.constant(F::primitive_root_of_unity(n_log)); - let reversed_x = self.le_sum(x_index_bits.iter().rev()); - let phi = self.exp(phi, reversed_x, n_log); + let phi = self.exp_from_bits(phi, x_index_bits.iter().rev()); self.mul(g, phi) }); diff --git a/src/gadgets/arithmetic.rs b/src/gadgets/arithmetic.rs index 7afa9319..cfeef82e 100644 --- a/src/gadgets/arithmetic.rs +++ b/src/gadgets/arithmetic.rs @@ -170,13 +170,17 @@ impl, const D: usize> CircuitBuilder { // TODO: Optimize this, maybe with a new gate. // TODO: Test /// Exponentiate `base` to the power of `exponent`, given by its little-endian bits. - pub fn exp_from_bits(&mut self, base: Target, exponent_bits: &[Target]) -> Target { + pub fn exp_from_bits( + &mut self, + base: Target, + exponent_bits: impl Iterator>, + ) -> Target { let mut current = base; let one = self.one(); let mut product = one; - for &bit in exponent_bits { - let multiplicand = self.select(bit, current, one); + for bit in exponent_bits { + let multiplicand = self.select(*bit.borrow(), current, one); product = self.mul(product, multiplicand); current = self.mul(current, current); } @@ -210,7 +214,7 @@ impl, const D: usize> CircuitBuilder { /// Exponentiate `base` to the power of `exponent`, where `exponent < 2^num_bits`. pub fn exp(&mut self, base: Target, exponent: Target, num_bits: usize) -> Target { let exponent_bits = self.split_le(exponent, num_bits); - self.exp_from_bits(base, &exponent_bits) + self.exp_from_bits(base, exponent_bits.iter()) } /// Exponentiate `base` to the power of a known `exponent`.