Fix `mul_by_inverse` for constants
Pratyush Mishra pratyushmishra@berkeley.edu
Fri, 08 Jan 2021 16:53:56 -0800
1 files changed,
11 insertions(+),
7 deletions(-)
jump to
M
src/fields/mod.rs
→
src/fields/mod.rs
@@ -160,14 +160,18 @@ /// `self * denominator.inverse()`.
/// It is up to the caller to ensure that denominator is non-zero, /// since in that case the result is unconstrained. fn mul_by_inverse(&self, denominator: &Self) -> Result<Self, SynthesisError> { - let result = Self::new_witness(self.cs(), || { - let denominator_inv_native = denominator.value()?.inverse().get()?; - let result = self.value()? * &denominator_inv_native; - Ok(result) - })?; - result.mul_equals(&denominator, &self)?; + if self.is_constant() && denominator.is_constant() { + Ok(self.clone() * denominator.value()?.inverse().unwrap()) + } else { + let result = Self::new_witness(self.cs(), || { + let denominator_inv_native = denominator.value()?.inverse().get()?; + let result = self.value()? * &denominator_inv_native; + Ok(result) + })?; + result.mul_equals(&denominator, &self)?; - Ok(result) + Ok(result) + } } /// Computes the frobenius map over `self`.