|
@ -2,7 +2,7 @@ |
|
|
|
|
|
|
|
|
use crate::poly_iop::{errors::PolyIOPErrors, structs::IOPProof, zero_check::ZeroCheck, PolyIOP};
|
|
|
use crate::poly_iop::{errors::PolyIOPErrors, structs::IOPProof, zero_check::ZeroCheck, PolyIOP};
|
|
|
use arithmetic::{get_index, VirtualPolynomial};
|
|
|
use arithmetic::{get_index, VirtualPolynomial};
|
|
|
use ark_ff::PrimeField;
|
|
|
|
|
|
|
|
|
use ark_ff::{batch_inversion, PrimeField};
|
|
|
use ark_poly::DenseMultilinearExtension;
|
|
|
use ark_poly::DenseMultilinearExtension;
|
|
|
use ark_std::{end_timer, start_timer};
|
|
|
use ark_std::{end_timer, start_timer};
|
|
|
use std::sync::Arc;
|
|
|
use std::sync::Arc;
|
|
@ -31,13 +31,15 @@ pub(super) fn compute_frac_poly( |
|
|
*g_eval *= gi;
|
|
|
*g_eval *= gi;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
batch_inversion(&mut g_evals[..]);
|
|
|
|
|
|
|
|
|
for (f_eval, g_eval) in f_evals.iter_mut().zip(g_evals.iter()) {
|
|
|
for (f_eval, g_eval) in f_evals.iter_mut().zip(g_evals.iter()) {
|
|
|
if *g_eval == F::zero() {
|
|
|
if *g_eval == F::zero() {
|
|
|
return Err(PolyIOPErrors::InvalidParameters(
|
|
|
return Err(PolyIOPErrors::InvalidParameters(
|
|
|
"gxs has zero entries in the boolean hypercube".to_string(),
|
|
|
"gxs has zero entries in the boolean hypercube".to_string(),
|
|
|
));
|
|
|
));
|
|
|
}
|
|
|
}
|
|
|
*f_eval /= g_eval;
|
|
|
|
|
|
|
|
|
*f_eval *= g_eval;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
end_timer!(start);
|
|
|
end_timer!(start);
|
|
|