diff --git a/src/gadgets/split_base.rs b/src/gadgets/split_base.rs index 54fd8cf2..0e135c05 100644 --- a/src/gadgets/split_base.rs +++ b/src/gadgets/split_base.rs @@ -29,14 +29,6 @@ impl, const D: usize> CircuitBuilder { self.range_check(x, (64 - leading_zeros) as usize); } - pub(crate) fn reverse_limbs(&mut self, x: Target, num_limbs: usize) -> Target { - let gate = self.add_gate(BaseSumGate::::new(num_limbs), vec![]); - let sum = Target::wire(gate, BaseSumGate::::WIRE_SUM); - self.route(x, sum); - - Target::wire(gate, BaseSumGate::::WIRE_REVERSED_SUM) - } - /// Takes an iterator of bits `(b_i)` and returns `sum b_i * 2^i`, i.e., /// the number with little-endian bit representation given by `bits`. pub(crate) fn le_sum( @@ -119,9 +111,6 @@ mod tests { builder.route(limbs[1], three); builder.route(limbs[2], five); builder.route(limbs[3], one); - let rev = builder.constant(F::from_canonical_u64(11)); - let revt = builder.reverse_limbs::<2>(xt, 9); - builder.route(revt, rev); builder.assert_leading_zeros(xt, 64 - 9); let data = builder.build(); diff --git a/src/gates/base_sum.rs b/src/gates/base_sum.rs index 89edc7fa..fe4e51a2 100644 --- a/src/gates/base_sum.rs +++ b/src/gates/base_sum.rs @@ -11,8 +11,7 @@ use crate::plonk::circuit_builder::CircuitBuilder; use crate::plonk::plonk_common::{reduce_with_powers, reduce_with_powers_ext_recursive}; use crate::plonk::vars::{EvaluationTargets, EvaluationVars, EvaluationVarsBase}; -/// A gate which can decompose a number into base B little-endian limbs, -/// and compute the limb-reversed (i.e. big-endian) sum. +/// A gate which can decompose a number into base B little-endian limbs. #[derive(Clone, Debug)] pub struct BaseSumGate { num_limbs: usize, @@ -24,8 +23,7 @@ impl BaseSumGate { } pub const WIRE_SUM: usize = 0; - pub const WIRE_REVERSED_SUM: usize = 1; - pub const START_LIMBS: usize = 2; + pub const START_LIMBS: usize = 1; /// Returns the index of the `i`th limb wire. pub fn limbs(&self) -> Range { @@ -40,13 +38,9 @@ impl, const D: usize, const B: usize> Gate for BaseSumGat fn eval_unfiltered(&self, vars: EvaluationVars) -> Vec { let sum = vars.local_wires[Self::WIRE_SUM]; - let reversed_sum = vars.local_wires[Self::WIRE_REVERSED_SUM]; - let mut limbs = vars.local_wires[self.limbs()].to_vec(); + let limbs = vars.local_wires[self.limbs()].to_vec(); let computed_sum = reduce_with_powers(&limbs, F::Extension::from_canonical_usize(B)); - limbs.reverse(); - let computed_reversed_sum = - reduce_with_powers(&limbs, F::Extension::from_canonical_usize(B)); - let mut constraints = vec![computed_sum - sum, computed_reversed_sum - reversed_sum]; + let mut constraints = vec![computed_sum - sum]; for limb in limbs { constraints.push( (0..B) @@ -59,12 +53,9 @@ impl, const D: usize, const B: usize> Gate for BaseSumGat fn eval_unfiltered_base(&self, vars: EvaluationVarsBase) -> Vec { let sum = vars.local_wires[Self::WIRE_SUM]; - let reversed_sum = vars.local_wires[Self::WIRE_REVERSED_SUM]; - let mut limbs = vars.local_wires[self.limbs()].to_vec(); + let limbs = vars.local_wires[self.limbs()].to_vec(); let computed_sum = reduce_with_powers(&limbs, F::from_canonical_usize(B)); - limbs.reverse(); - let computed_reversed_sum = reduce_with_powers(&limbs, F::from_canonical_usize(B)); - let mut constraints = vec![computed_sum - sum, computed_reversed_sum - reversed_sum]; + let mut constraints = vec![computed_sum - sum]; for limb in limbs { constraints.push((0..B).map(|i| limb - F::from_canonical_usize(i)).product()); } @@ -78,15 +69,9 @@ impl, const D: usize, const B: usize> Gate for BaseSumGat ) -> Vec> { let base = builder.constant(F::from_canonical_usize(B)); let sum = vars.local_wires[Self::WIRE_SUM]; - let reversed_sum = vars.local_wires[Self::WIRE_REVERSED_SUM]; - let mut limbs = vars.local_wires[self.limbs()].to_vec(); + let limbs = vars.local_wires[self.limbs()].to_vec(); let computed_sum = reduce_with_powers_ext_recursive(builder, &limbs, base); - limbs.reverse(); - let computed_reversed_sum = reduce_with_powers_ext_recursive(builder, &limbs, base); - let mut constraints = vec![ - builder.sub_extension(computed_sum, sum), - builder.sub_extension(computed_reversed_sum, reversed_sum), - ]; + let mut constraints = vec![builder.sub_extension(computed_sum, sum)]; for limb in limbs { constraints.push({ let mut acc = builder.one_extension(); @@ -116,9 +101,9 @@ impl, const D: usize, const B: usize> Gate for BaseSumGat vec![Box::new(gen)] } - // 2 for the sum and reversed sum, then `num_limbs` for the limbs. + // 1 for the sum then `num_limbs` for the limbs. fn num_wires(&self) -> usize { - self.num_limbs + 2 + 1 + self.num_limbs } fn num_constants(&self) -> usize { @@ -130,9 +115,9 @@ impl, const D: usize, const B: usize> Gate for BaseSumGat B } - // 2 for checking the sum and reversed sum, then `num_limbs` for range-checking the limbs. + // 1 for checking the sum then `num_limbs` for range-checking the limbs. fn num_constraints(&self) -> usize { - 2 + self.num_limbs + 1 + self.num_limbs } } @@ -167,15 +152,6 @@ impl SimpleGenerator for BaseSplitGenerator { }) .collect::>(); - let b_field = F::from_canonical_usize(B); - let reversed_sum = limbs_value - .iter() - .fold(F::ZERO, |acc, &x| acc * b_field + x); - - out_buffer.set_target( - Target::wire(self.gate_index, BaseSumGate::::WIRE_REVERSED_SUM), - reversed_sum, - ); for (b, b_value) in limbs.zip(limbs_value) { out_buffer.set_target(b, b_value); }