From 5418026082c68d5004b160a041803f7e4d2a5769 Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Thu, 5 Aug 2021 13:47:33 +0200 Subject: [PATCH 1/4] Remove reversed sum from `BaseSumGate` --- src/gadgets/split_base.rs | 11 ----------- src/gates/base_sum.rs | 39 ++++++++------------------------------- 2 files changed, 8 insertions(+), 42 deletions(-) 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 f580bf16..a73ef185 100644 --- a/src/gates/base_sum.rs +++ b/src/gates/base_sum.rs @@ -24,8 +24,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 +39,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 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 +54,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 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 +70,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 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(); @@ -113,9 +99,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 + self.num_limbs + 1 } fn num_constants(&self) -> usize { @@ -127,9 +113,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 } } @@ -164,15 +150,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); } From 83fe4d5cc06060a6dca8730f610b9aed50a7b8ea Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Thu, 5 Aug 2021 13:48:37 +0200 Subject: [PATCH 2/4] Update comment --- src/gates/base_sum.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/gates/base_sum.rs b/src/gates/base_sum.rs index a73ef185..ecb1e6e6 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, From 693fd4f8d67683b56201cd2668073ff5bcd46a93 Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Thu, 5 Aug 2021 13:51:26 +0200 Subject: [PATCH 3/4] Minor --- src/gates/base_sum.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gates/base_sum.rs b/src/gates/base_sum.rs index ecb1e6e6..2dd6cf15 100644 --- a/src/gates/base_sum.rs +++ b/src/gates/base_sum.rs @@ -100,7 +100,7 @@ impl, const D: usize, const B: usize> Gate for BaseSumGat // 1 for the sum then `num_limbs` for the limbs. fn num_wires(&self) -> usize { - self.num_limbs + 1 + 1 + self.num_limbs } fn num_constants(&self) -> usize { From fcc717e92374520416a3e2f7b2fed4e1778f84f6 Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Thu, 5 Aug 2021 16:06:48 +0200 Subject: [PATCH 4/4] Remove useless mut --- src/gates/base_sum.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/gates/base_sum.rs b/src/gates/base_sum.rs index 2dd6cf15..7af12cbe 100644 --- a/src/gates/base_sum.rs +++ b/src/gates/base_sum.rs @@ -38,7 +38,7 @@ 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 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)); let mut constraints = vec![computed_sum - sum]; for limb in limbs { @@ -53,7 +53,7 @@ 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 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)); let mut constraints = vec![computed_sum - sum]; for limb in limbs { @@ -69,7 +69,7 @@ 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 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); let mut constraints = vec![builder.sub_extension(computed_sum, sum)]; for limb in limbs {