All tests pass

This commit is contained in:
wborgeaud 2021-11-09 15:18:43 +01:00
parent 9617c22173
commit 7cf965ded5
2 changed files with 41 additions and 21 deletions

View File

@ -396,20 +396,39 @@ pub(crate) fn eval_vanishing_poly_recursively<F: RichField + Extendable<D>, 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(&current_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(&current_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 = [

View File

@ -14,7 +14,7 @@ pub fn partial_products<F: Field>(v: &[F], max_degree: usize) -> Vec<F> {
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<F: Field>(v: &[F], max_degree: usize) -> Vec<F> {
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<F: Field>(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<F: RichField + Extendable<D>, 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());