From 6c598ddcfd66658289a17e3d781568d36b997dc5 Mon Sep 17 00:00:00 2001 From: Nicholas Ward Date: Wed, 30 Jun 2021 07:08:36 -0700 Subject: [PATCH] very initial attempt --- src/gadgets/insert.rs | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/src/gadgets/insert.rs b/src/gadgets/insert.rs index 64cf7299..8cb4614d 100644 --- a/src/gadgets/insert.rs +++ b/src/gadgets/insert.rs @@ -4,6 +4,16 @@ use crate::field::extension_field::Extendable; use crate::target::Target; impl, const D: usize> CircuitBuilder { + /// Evaluates to 1 if `x` and `y` are equal, 0 otherwise. + pub fn is_equal( + &mut self, + x: Target, + y: Target, + ) -> Target { + + } + + /// 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. /// Note: `index` is not range-checked. @@ -13,9 +23,24 @@ impl, const D: usize> CircuitBuilder { element: ExtensionTarget, v: Vec>, ) -> Vec> { - let mut v = self.rotate_left(index, &v); - v.insert(0, element); - self.rotate_right(index, &v) + let mut already_inserted = self.zero(); + let mut new_list = Vec::new(); + + let mut cur_index = self.zero(); + for i in 0..v.len() { + cur_index = self.add(cur_index, self.one()); + let insert_here = self.is_equal(cur_index, index); + + let mut new_item = self.zero(); + new_item = self.add(new_item, self.mul(insert_here, element)); + new_item = self.add(new_item, self.mul(already_inserted, v[i-1])); + already_inserted = self.add(already_inserted, insert_here); + new_item = self.add(new_item, self.mul(self.sub(self.one(), already_inserted), v[i])); + + new_list.push(new_item); + } + + new_list } } #[cfg(test)]