From a44643ed76e8bfeebc8a4ae05d021b7d5aeecf56 Mon Sep 17 00:00:00 2001 From: Pratyush Mishra Date: Fri, 8 Jan 2021 16:53:56 -0800 Subject: [PATCH] Fix `mul_by_inverse` for constants --- src/fields/mod.rs | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/fields/mod.rs b/src/fields/mod.rs index 41bab8f..9e95002 100644 --- a/src/fields/mod.rs +++ b/src/fields/mod.rs @@ -160,14 +160,18 @@ pub trait FieldVar: /// 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 { - 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`.