This commit is contained in:
Nicholas Ward 2021-07-12 11:56:53 -07:00
parent 2841b3860b
commit 439303458d

View File

@ -37,8 +37,7 @@ impl<F: Extendable<D>, const D: usize> CircuitBuilder<F, D> {
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<F: Extendable<D>, const D: usize> CircuitBuilder<F, D> {
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<F: Extendable<D>, const D: usize> CircuitBuilder<F, D> {
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);
}