diff --git a/src/plonk/vanishing_poly.rs b/src/plonk/vanishing_poly.rs index b9b4d241..7b9d0c6c 100644 --- a/src/plonk/vanishing_poly.rs +++ b/src/plonk/vanishing_poly.rs @@ -396,20 +396,39 @@ pub(crate) fn eval_vanishing_poly_recursively, cons ); // The first checks are of the form `q - n/d` which is a rational function not a polynomial. // We multiply them by `d` to get checks of the form `q*d - n` which low-degree polynomials. - denominator_values - .chunks(max_degree) - .zip(partial_product_check.iter_mut()) - .for_each(|(d, q)| { - let mut v = d.to_vec(); + // denominator_values + // .chunks(max_degree) + // .zip(partial_product_check.iter_mut()) + // .for_each(|(d, q)| { + // let mut v = d.to_vec(); + // v.push(*q); + // *q = builder.mul_many_extension(&v); + // }); + for (j, q) in partial_product_check.iter_mut().enumerate() { + let range = j * max_degree..(j + 1) * max_degree; + *q = builder.mul_many_extension(&{ + let mut v = denominator_values[range].to_vec(); v.push(*q); - *q = builder.mul_many_extension(&v); + v }); + } vanishing_partial_products_terms.extend(partial_product_check); // The quotient final product is the product of the last `final_num_prod` elements. - let quotient = - builder.mul_many_extension(¤t_partial_products[num_prods - final_num_prod..]); - vanishing_v_shift_terms.push(builder.mul_sub_extension(quotient, z_x, z_gz)); + // let quotient = + // builder.mul_many_extension(¤t_partial_products[num_prods - final_num_prod..]); + let quotient = builder.mul_many_extension(&{ + let mut v = quotient_values[final_num_prod..].to_vec(); + v.push(*current_partial_products.last().unwrap()); + v + }); + let mut wanted = builder.mul_sub_extension(quotient, z_x, z_gz); + wanted = builder.mul_many_extension(&{ + let mut v = denominator_values[final_num_prod..].to_vec(); + v.push(wanted); + v + }); + vanishing_v_shift_terms.push(wanted); } let vanishing_terms = [ diff --git a/src/util/partial_products.rs b/src/util/partial_products.rs index bc5fce45..398ec35f 100644 --- a/src/util/partial_products.rs +++ b/src/util/partial_products.rs @@ -14,7 +14,7 @@ pub fn partial_products(v: &[F], max_degree: usize) -> Vec { let mut res = Vec::new(); let mut acc = F::ONE; let chunk_size = max_degree; - let num_chunks = ceil_div_usize(v.len(), chunk_size) - 1; + let num_chunks = v.len() / chunk_size; for i in 0..num_chunks { acc *= v[i * chunk_size..(i + 1) * chunk_size] .iter() @@ -31,7 +31,7 @@ pub fn partial_products(v: &[F], max_degree: usize) -> Vec { pub fn num_partial_products(n: usize, max_degree: usize) -> (usize, usize) { debug_assert!(max_degree > 1); let chunk_size = max_degree; - let num_chunks = ceil_div_usize(n, chunk_size) - 1; + let num_chunks = n / chunk_size; (num_chunks, num_chunks * chunk_size) } @@ -44,15 +44,15 @@ pub fn check_partial_products(v: &[F], mut partials: &[F], max_degree: let mut res = Vec::new(); let mut acc = F::ONE; let chunk_size = max_degree; - let num_chunks = ceil_div_usize(v.len(), chunk_size) - 1; + let num_chunks = v.len() / chunk_size; for i in 0..num_chunks { acc *= v[i * chunk_size..(i + 1) * chunk_size] .iter() .copied() .product(); - let bacc = *partials.next().unwrap(); - res.push(acc - bacc); - acc = bacc; + let new_acc = *partials.next().unwrap(); + res.push(acc - new_acc); + acc = new_acc; } debug_assert!(partials.next().is_none()); @@ -68,15 +68,16 @@ pub fn check_partial_products_recursively, const D: debug_assert!(max_degree > 1); let mut partials = partials.iter(); let mut res = Vec::new(); - let mut acc = v[0]; - let chunk_size = max_degree - 1; - let num_chunks = ceil_div_usize(v.len() - 1, chunk_size) - 1; + let mut acc = builder.one_extension(); + let chunk_size = max_degree; + let num_chunks = v.len() / chunk_size; for i in 0..num_chunks { - let mut chunk = v[1 + i * chunk_size..1 + (i + 1) * chunk_size].to_vec(); + let mut chunk = v[i * chunk_size..(i + 1) * chunk_size].to_vec(); chunk.push(acc); acc = builder.mul_many_extension(&chunk); - - res.push(builder.sub_extension(acc, *partials.next().unwrap())); + let new_acc = *partials.next().unwrap(); + res.push(builder.sub_extension(acc, new_acc)); + acc = new_acc; } debug_assert!(partials.next().is_none());