Start accumulator at Z(x)

This commit is contained in:
wborgeaud 2021-11-10 18:36:35 +01:00
parent 32f09ac2df
commit 3084367133
3 changed files with 16 additions and 13 deletions

View File

@ -100,7 +100,7 @@ pub(crate) fn prove<F: RichField + Extendable<D>, const D: usize>(
let plonk_z_vecs = timed!(
timing,
"compute Z's",
compute_zs(&partial_products, common_data)
compute_zs(&mut partial_products, common_data)
);
// The first polynomial in `partial_products` represent the final product used in the
@ -286,24 +286,26 @@ fn wires_permutation_partial_products<F: RichField + Extendable<D>, const D: usi
}
fn compute_zs<F: RichField + Extendable<D>, const D: usize>(
partial_products: &[Vec<PolynomialValues<F>>],
partial_products: &mut [Vec<PolynomialValues<F>>],
common_data: &CommonCircuitData<F, D>,
) -> Vec<PolynomialValues<F>> {
(0..common_data.config.num_challenges)
.map(|i| compute_z(&partial_products[i], common_data))
.map(|i| compute_z(&mut partial_products[i], common_data))
.collect()
}
/// Compute the `Z` polynomial by reusing the computations done in `wires_permutation_partial_products`.
fn compute_z<F: RichField + Extendable<D>, const D: usize>(
partial_products: &[PolynomialValues<F>],
partial_products: &mut [PolynomialValues<F>],
common_data: &CommonCircuitData<F, D>,
) -> PolynomialValues<F> {
let mut plonk_z_points = vec![F::ONE];
for i in 1..common_data.degree() {
let quotient = partial_products[0].values[i - 1];
let last = *plonk_z_points.last().unwrap();
plonk_z_points.push(last * quotient);
for q in partial_products.iter_mut() {
q.values[i - 1] *= last;
}
plonk_z_points.push(partial_products[0].values[i - 1]);
}
plonk_z_points.into()
}

View File

@ -70,13 +70,13 @@ pub(crate) fn eval_vanishing_poly<F: RichField + Extendable<D>, const D: usize>(
&numerator_values,
&denominator_values,
current_partial_products,
z_x,
max_degree,
);
vanishing_partial_products_terms.extend(partial_product_checks);
let v_shift_term = *current_partial_products.last().unwrap()
* numerator_values[final_num_prod..].iter().copied().product()
* z_x
- z_gz
* denominator_values[final_num_prod..]
.iter()
@ -180,13 +180,13 @@ pub(crate) fn eval_vanishing_poly_base_batch<F: RichField + Extendable<D>, const
&numerator_values,
&denominator_values,
current_partial_products,
z_x,
max_degree,
);
vanishing_partial_products_terms.extend(partial_product_checks);
let v_shift_term = *current_partial_products.last().unwrap()
* numerator_values[final_num_prod..].iter().copied().product()
* z_x
- z_gz
* denominator_values[final_num_prod..]
.iter()
@ -376,6 +376,7 @@ pub(crate) fn eval_vanishing_poly_recursively<F: RichField + Extendable<D>, cons
&numerator_values,
&denominator_values,
current_partial_products,
z_x,
max_degree,
);
vanishing_partial_products_terms.extend(partial_product_checks);
@ -390,7 +391,7 @@ pub(crate) fn eval_vanishing_poly_recursively<F: RichField + Extendable<D>, cons
v.push(z_gz);
v
});
let v_shift_term = builder.mul_sub_extension(nume_acc, z_x, z_gz_denominators);
let v_shift_term = builder.sub_extension(nume_acc, z_gz_denominators);
vanishing_v_shift_terms.push(v_shift_term);
}

View File

@ -34,12 +34,12 @@ pub fn check_partial_products<F: Field>(
numerators: &[F],
denominators: &[F],
partials: &[F],
mut acc: F,
max_degree: usize,
) -> Vec<F> {
debug_assert!(max_degree > 1);
let mut partials = partials.iter();
let mut res = Vec::new();
let mut acc = F::ONE;
let chunk_size = max_degree;
for (nume_chunk, deno_chunk) in numerators
.chunks_exact(chunk_size)
@ -60,12 +60,12 @@ pub fn check_partial_products_recursively<F: RichField + Extendable<D>, const D:
numerators: &[ExtensionTarget<D>],
denominators: &[ExtensionTarget<D>],
partials: &[ExtensionTarget<D>],
mut acc: ExtensionTarget<D>,
max_degree: usize,
) -> Vec<ExtensionTarget<D>> {
debug_assert!(max_degree > 1);
let mut partials = partials.iter();
let mut res = Vec::new();
let mut acc = builder.one_extension();
let chunk_size = max_degree;
for (nume_chunk, deno_chunk) in numerators
.chunks_exact(chunk_size)
@ -108,7 +108,7 @@ mod tests {
let nums = num_partial_products(v.len(), 2);
assert_eq!(p.len(), nums.0);
assert!(check_partial_products(&v, &denominators, &p, 2)
assert!(check_partial_products(&v, &denominators, &p, F::ONE, 2)
.iter()
.all(|x| x.is_zero()));
assert_eq!(
@ -130,7 +130,7 @@ mod tests {
);
let nums = num_partial_products(v.len(), 3);
assert_eq!(p.len(), nums.0);
assert!(check_partial_products(&v, &denominators, &p, 3)
assert!(check_partial_products(&v, &denominators, &p, F::ONE, 3)
.iter()
.all(|x| x.is_zero()));
assert_eq!(