diff --git a/src/gadgets/arithmetic_extension.rs b/src/gadgets/arithmetic_extension.rs index 608a412c..93cb7bc8 100644 --- a/src/gadgets/arithmetic_extension.rs +++ b/src/gadgets/arithmetic_extension.rs @@ -550,8 +550,19 @@ impl, const D: usize> CircuitBuilder { x: ExtensionTarget, y: ExtensionTarget, ) -> ExtensionTarget { - let y_inv = self.inverse_extension(y); - self.mul_extension(x, y_inv) + let inv = self.add_virtual_extension_target(); + let one = self.one_extension(); + self.add_generator(QuotientGeneratorExtension { + numerator: one, + denominator: y, + quotient: inv, + }); + + // Enforce that x times its purported inverse equals 1. + let (y_inv, res) = self.mul_two_extension(y, inv, x, inv); + self.assert_equal_extension(y_inv, one); + + res } /// Computes `q = x / y` by witnessing `q` and requiring that `q * y = x`. This can be unsafe in diff --git a/src/gadgets/interpolation.rs b/src/gadgets/interpolation.rs index cc547d88..3bcecdae 100644 --- a/src/gadgets/interpolation.rs +++ b/src/gadgets/interpolation.rs @@ -16,8 +16,17 @@ impl, const D: usize> CircuitBuilder { // b0 -> b1 // x -> a1 + (x-a0)*(b1-a1)/(b0-a0) - let x_m_a0 = self.sub_extension(evaluation_point, interpolation_points[0].0); - let b1_m_a1 = self.sub_extension(interpolation_points[1].1, interpolation_points[0].1); + let one = self.one_extension(); + let (x_m_a0, b1_m_a1) = self.double_arithmetic_extension( + F::ONE, + F::NEG_ONE, + one, + evaluation_point, + interpolation_points[0].0, + one, + interpolation_points[1].1, + interpolation_points[0].1, + ); let b0_m_a0 = self.sub_extension(interpolation_points[1].0, interpolation_points[0].0); let quotient = self.div_extension(b1_m_a1, b0_m_a0);