Add wide_arithmetic

This commit is contained in:
wborgeaud 2021-08-12 16:03:13 +02:00
parent 08e457458d
commit 702eab1583
2 changed files with 16 additions and 41 deletions

View File

@ -152,6 +152,18 @@ impl<F: Extendable<D>, const D: usize> CircuitBuilder<F, D> {
None
}
/// Returns `a*b + c*d + e`.
pub fn wide_arithmetic_extension(
&mut self,
a: ExtensionTarget<D>,
b: ExtensionTarget<D>,
c: ExtensionTarget<D>,
d: ExtensionTarget<D>,
e: ExtensionTarget<D>,
) -> ExtensionTarget<D> {
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<F: Extendable<D>, const D: usize> CircuitBuilder<F, D> {
c: ExtensionTarget<D>,
) -> ExtensionTarget<D> {
let one = self.one_extension();
let gate = self.num_gates();
let first_out =
ExtensionTarget::from_range(gate, ArithmeticExtensionGate::<D>::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.

View File

@ -328,50 +328,17 @@ pub(crate) fn eval_vanishing_poly_recursively<F: Extendable<D>, 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::<D>::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::<Vec<_>>();
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::<D>::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::<Vec<_>>();
let quotient_values = (0..common_data.config.num_routed_wires)