arnaucube
arnaucube/ark-r1cs-stdPublic Self-hosted repository
Fix `mul_by_inverse` for constants
Pratyush Mishra pratyushmishra@berkeley.edu
Fri, 08 Jan 2021 16:53:56 -0800
commit

a44643ed76e8bfeebc8a4ae05d021b7d5aeecf56

parent

f52b866e59814bd3fb999b82e9c1f4214752e726

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`.