From 702eab158345bfde6931cc641fc59401b88d2b98 Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Thu, 12 Aug 2021 16:03:13 +0200 Subject: [PATCH] Add `wide_arithmetic` --- src/gadgets/arithmetic_extension.rs | 18 +++++++++---- src/plonk/vanishing_poly.rs | 39 +++-------------------------- 2 files changed, 16 insertions(+), 41 deletions(-) diff --git a/src/gadgets/arithmetic_extension.rs b/src/gadgets/arithmetic_extension.rs index 03395211..8b7c11e3 100644 --- a/src/gadgets/arithmetic_extension.rs +++ b/src/gadgets/arithmetic_extension.rs @@ -152,6 +152,18 @@ impl, const D: usize> CircuitBuilder { None } + /// Returns `a*b + c*d + e`. + pub fn wide_arithmetic_extension( + &mut self, + a: ExtensionTarget, + b: ExtensionTarget, + c: ExtensionTarget, + d: ExtensionTarget, + e: ExtensionTarget, + ) -> ExtensionTarget { + self.inner_product_extension(F::ONE, e, vec![(a, b), (c, d)]) + } + /// Returns `sum_{(a,b) in vecs} constant * a * b`. pub fn inner_product_extension( &mut self, @@ -230,11 +242,7 @@ impl, const D: usize> CircuitBuilder { c: ExtensionTarget, ) -> ExtensionTarget { let one = self.one_extension(); - let gate = self.num_gates(); - let first_out = - ExtensionTarget::from_range(gate, ArithmeticExtensionGate::::wires_first_output()); - self.double_arithmetic_extension(F::ONE, F::ONE, one, a, b, one, c, first_out) - .1 + self.wide_arithmetic_extension(one, a, one, b, c) } /// Add `n` `ExtensionTarget`s with `n/2` `ArithmeticExtensionGate`s. diff --git a/src/plonk/vanishing_poly.rs b/src/plonk/vanishing_poly.rs index 30101d3f..a0e00395 100644 --- a/src/plonk/vanishing_poly.rs +++ b/src/plonk/vanishing_poly.rs @@ -328,50 +328,17 @@ pub(crate) fn eval_vanishing_poly_recursively, const D: usize>( let wire_value = vars.local_wires[j]; let beta_ext = builder.convert_to_ext(betas[i]); let gamma_ext = builder.convert_to_ext(gammas[i]); - let gate = builder.num_gates(); - let first_out = ExtensionTarget::from_range( - gate, - ArithmeticExtensionGate::::wires_first_output(), - ); - // `beta * s_ids[j] + wire_value + gamma` - builder - .double_arithmetic_extension( - F::ONE, - F::ONE, - beta_ext, - s_ids[j], - wire_value, - one, - first_out, - gamma_ext, - ) - .1 + // `beta * s_id + wire_value + gamma` + builder.wide_arithmetic_extension(beta_ext, s_ids[j], one, wire_value, gamma_ext) }) .collect::>(); let denominator_values = (0..common_data.config.num_routed_wires) .map(|j| { let wire_value = vars.local_wires[j]; - let s_sigma = s_sigmas[j]; let beta_ext = builder.convert_to_ext(betas[i]); let gamma_ext = builder.convert_to_ext(gammas[i]); - let gate = builder.num_gates(); - let first_out = ExtensionTarget::from_range( - gate, - ArithmeticExtensionGate::::wires_first_output(), - ); // `beta * s_sigma + wire_value + gamma` - builder - .double_arithmetic_extension( - F::ONE, - F::ONE, - beta_ext, - s_sigma, - wire_value, - one, - first_out, - gamma_ext, - ) - .1 + builder.wide_arithmetic_extension(beta_ext, s_sigmas[j], one, wire_value, gamma_ext) }) .collect::>(); let quotient_values = (0..common_data.config.num_routed_wires)