diff --git a/src/gadgets/nonnative.rs b/src/gadgets/nonnative.rs index 2217af74..7faa6d4e 100644 --- a/src/gadgets/nonnative.rs +++ b/src/gadgets/nonnative.rs @@ -118,21 +118,32 @@ impl, const D: usize> CircuitBuilder { let num_limbs = a.limbs.len(); debug_assert!(b.limbs.len() == num_limbs); - /*let mut combined_limbs = self.add_virtual_u32_targets(2 * num_limbs - 1); + let mut combined_limbs = self.add_virtual_u32_targets(2 * num_limbs - 1); + let mut to_add = vec![vec![]; 2 * num_limbs]; for i in 0..num_limbs { for j in 0..num_limbs { - let sum = self.add_u32(a.limbs[i], b.limbs[j]); - combined_limbs[i + j] = self.add_u32(combined_limbs[i + j], sum); + let (product, carry) = self.mul_u32(a.limbs[i], b.limbs[j]); + to_add[i + j].push(product); + to_add[i + j + 1].push(carry); } } + let mut combined_limbs = vec![]; + let mut carry = self.zero_u32(); + for i in 0..2 * num_limbs { + to_add[i].push(carry); + let (new_result, new_carry) = self.add_many_u32(to_add[i]); + combined_limbs.push(new_result); + carry = new_carry; + } + combined_limbs.push(carry); + let reduced_limbs = self.reduce_mul_result::(combined_limbs); ForeignFieldTarget { limbs: reduced_limbs, _phantom: PhantomData, - }*/ - todo!() + } } pub fn reduce_mul_result(&mut self, limbs: Vec) -> Vec {