in prover/src/constraints/evaluation_table.rs [380:413]
fn validate_column_degree<B: StarkField, E: FieldElement<BaseField = B>>(
column: &[E],
divisor: &ConstraintDivisor<B>,
domain_offset: B,
expected_degree: usize,
) -> Result<(), ProverError> {
// build domain for divisor evaluation, and evaluate it over this domain
let g = B::get_root_of_unity(column.len().trailing_zeros());
let domain = math::get_power_series_with_offset(g, domain_offset, column.len());
let div_values = domain
.into_iter()
.map(|x| E::from(divisor.evaluate_at(x)))
.collect::<Vec<_>>();
// divide column values by the divisor
let mut evaluations = column
.iter()
.zip(div_values)
.map(|(&c, d)| c / d)
.collect::<Vec<_>>();
// interpolate evaluations into a polynomial in coefficient form
let inv_twiddles = fft::get_inv_twiddles::<B>(evaluations.len());
fft::interpolate_poly_with_offset(&mut evaluations, &inv_twiddles, domain_offset);
let poly = evaluations;
if expected_degree != math::polynom::degree_of(&poly) {
return Err(ProverError::MismatchedConstraintPolynomialDegree(
expected_degree,
math::polynom::degree_of(&poly),
));
}
Ok(())
}