From 439303458df319d0ffbae6c47595f63afd31c486 Mon Sep 17 00:00:00 2001 From: Nicholas Ward Date: Mon, 12 Jul 2021 11:56:53 -0700 Subject: [PATCH 1/2] fix --- src/gadgets/insert.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/gadgets/insert.rs b/src/gadgets/insert.rs index 1f69cb24..f618eb2b 100644 --- a/src/gadgets/insert.rs +++ b/src/gadgets/insert.rs @@ -37,8 +37,7 @@ impl, const D: usize> CircuitBuilder { self.sub(one, not_equal) } - /// Inserts a `Target` in a vector at a non-deterministic index. This is done by rotating to the - /// left, inserting at 0 and then rotating to the right. + /// Inserts a `Target` in a vector at a non-deterministic index. /// Note: `index` is not range-checked. pub fn insert( &mut self, @@ -49,7 +48,11 @@ impl, const D: usize> CircuitBuilder { let mut already_inserted = self.zero(); let mut new_list = Vec::new(); - for i in 0..v.len() { + // Add a dummy value at the end (which will never be used). + let mut new_v = v.clone(); + new_v.push(ExtensionTarget([Target::PublicInput{index: 0}; D])); + + for i in 0..new_v.len() { let one = self.one(); let cur_index = self.constant(F::from_canonical_usize(i)); @@ -58,12 +61,14 @@ impl, const D: usize> CircuitBuilder { let mut new_item = self.zero_extension(); new_item = self.scalar_mul_add_extension(insert_here, element, new_item); if i > 0 { - new_item = self.scalar_mul_add_extension(already_inserted, v[i - 1], new_item); + new_item = self.scalar_mul_add_extension(already_inserted, new_v[i - 1], new_item); } already_inserted = self.add(already_inserted, insert_here); let not_already_inserted = self.sub(one, already_inserted); - new_item = self.scalar_mul_add_extension(not_already_inserted, v[i], new_item); + // On the last round, v[i] is the dummy value, but by that round not_already_inserted + // will always be 0. + new_item = self.scalar_mul_add_extension(not_already_inserted, new_v[i], new_item); new_list.push(new_item); } From 2df81e15c81caa30ab31c317d8b2eea0ebc3ef4f Mon Sep 17 00:00:00 2001 From: Nicholas Ward Date: Mon, 12 Jul 2021 12:16:13 -0700 Subject: [PATCH 2/2] switched to William's way, and len assert in test --- src/gadgets/insert.rs | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/gadgets/insert.rs b/src/gadgets/insert.rs index f618eb2b..6632eae7 100644 --- a/src/gadgets/insert.rs +++ b/src/gadgets/insert.rs @@ -48,31 +48,27 @@ impl, const D: usize> CircuitBuilder { let mut already_inserted = self.zero(); let mut new_list = Vec::new(); - // Add a dummy value at the end (which will never be used). - let mut new_v = v.clone(); - new_v.push(ExtensionTarget([Target::PublicInput{index: 0}; D])); - - for i in 0..new_v.len() { - let one = self.one(); - + let one = self.one(); + for i in 0..=v.len() { let cur_index = self.constant(F::from_canonical_usize(i)); let insert_here = self.is_equal(cur_index, index); let mut new_item = self.zero_extension(); new_item = self.scalar_mul_add_extension(insert_here, element, new_item); if i > 0 { - new_item = self.scalar_mul_add_extension(already_inserted, new_v[i - 1], new_item); + new_item = self.scalar_mul_add_extension(already_inserted, v[i - 1], new_item); } already_inserted = self.add(already_inserted, insert_here); let not_already_inserted = self.sub(one, already_inserted); - // On the last round, v[i] is the dummy value, but by that round not_already_inserted - // will always be 0. - new_item = self.scalar_mul_add_extension(not_already_inserted, new_v[i], new_item); + if i < v.len() { + new_item = self.scalar_mul_add_extension(not_already_inserted, v[i], new_item); + } new_list.push(new_item); } + new_list } } @@ -111,6 +107,8 @@ mod tests { let inserted = real_insert(i, elem, &v); let purported_inserted = builder.insert(it, elem, v.clone()); + assert_eq!(inserted.len(), purported_inserted.len()); + for (x, y) in inserted.into_iter().zip(purported_inserted) { builder.route_extension(x, y); }