PR feedback

This commit is contained in:
wborgeaud 2021-08-10 09:07:01 +02:00
parent 3adabbedf1
commit b15e36d29c
3 changed files with 29 additions and 29 deletions

View File

@ -233,7 +233,7 @@ impl<F: Extendable<D>, const D: usize> CircuitBuilder<F, D> {
self.sub_extension(single_composition_eval, precomputed_reduced_evals.single);
// This division is safe because the denominator will be nonzero unless zeta is in the
// codeword domain, which occurs with negligible probability given a large extension field.
sum = self.div_unsafe_add_extension(single_numerator, vanish_zeta, sum);
sum = self.div_add_extension(single_numerator, vanish_zeta, sum);
alpha.reset();
// Polynomials opened at `x` and `g x`, i.e., the Zs polynomials.
@ -260,7 +260,7 @@ impl<F: Extendable<D>, const D: usize> CircuitBuilder<F, D> {
sum = alpha.shift(sum, self);
// This division is safe because the denominator will be nonzero unless zeta is in the
// codeword domain, which occurs with negligible probability given a large extension field.
sum = self.div_unsafe_add_extension(zs_numerator, zs_denominator, sum);
sum = self.div_add_extension(zs_numerator, zs_denominator, sum);
sum
}

View File

@ -566,6 +566,30 @@ impl<F: Extendable<D>, const D: usize> CircuitBuilder<F, D> {
res
}
/// Computes ` x / y + z`.
pub fn div_add_extension(
&mut self,
x: ExtensionTarget<D>,
y: ExtensionTarget<D>,
z: ExtensionTarget<D>,
) -> ExtensionTarget<D> {
let inv = self.add_virtual_extension_target();
let zero = self.zero_extension();
let one = self.one_extension();
self.add_generator(QuotientGeneratorExtension {
numerator: one,
denominator: y,
quotient: inv,
});
// Enforce that x times its purported inverse equals 1.
let (y_inv, res) =
self.double_arithmetic_extension(F::ONE, F::ONE, y, inv, zero, x, inv, z);
self.assert_equal_extension(y_inv, one);
res
}
/// Computes `q = x / y` by witnessing `q` and requiring that `q * y = x`. This can be unsafe in
/// some cases, as it allows `0 / 0 = <anything>`.
pub fn div_unsafe_extension(
@ -587,30 +611,6 @@ impl<F: Extendable<D>, const D: usize> CircuitBuilder<F, D> {
quotient
}
/// Computes ` x / y + z`.
pub fn div_unsafe_add_extension(
&mut self,
x: ExtensionTarget<D>,
y: ExtensionTarget<D>,
z: ExtensionTarget<D>,
) -> ExtensionTarget<D> {
let zero = self.zero_extension();
let one = self.one_extension();
let quotient = self.add_virtual_extension_target();
self.add_generator(QuotientGeneratorExtension {
numerator: x,
denominator: y,
quotient,
});
// Enforce that q y = x.
let (q_y, res) =
self.double_arithmetic_extension(F::ONE, F::ONE, quotient, y, zero, one, quotient, z);
self.assert_equal_extension(q_y, x);
res
}
/// Computes `1 / x`. Results in an unsatisfiable instance if `x = 0`.
pub fn inverse_extension(&mut self, x: ExtensionTarget<D>) -> ExtensionTarget<D> {
let inv = self.add_virtual_extension_target();

View File

@ -197,7 +197,9 @@ impl<F: Extendable<D>, const D: usize, const R: usize> Gate<F, D> for GMiMCGate<
let cubing_input_wire = vars.local_wires[Self::wire_cubing_input(r)];
constraints.push(builder.sub_extension(cubing_input, cubing_input_wire));
let f = builder.cube_extension(cubing_input_wire);
let tmp = builder.double_arithmetic_extension(
// addition_buffer += f
// state[active] -= f
(addition_buffer, state[active]) = builder.double_arithmetic_extension(
F::ONE,
F::ONE,
one,
@ -207,8 +209,6 @@ impl<F: Extendable<D>, const D: usize, const R: usize> Gate<F, D> for GMiMCGate<
f,
state[active],
);
addition_buffer = tmp.0;
state[active] = tmp.1;
}
for i in 0..W {