mirror of
https://github.com/logos-storage/plonky2.git
synced 2026-01-15 04:03:13 +00:00
Start accumulator at Z(x)
This commit is contained in:
parent
32f09ac2df
commit
3084367133
@ -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()
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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!(
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user