pub fn compute_zerofier(
        &self,
        primitive_root: &FieldElement<F>,
        col: usize,
    ) -> Polynomial<FieldElement<F>> {
        self.steps(col).into_iter().fold(
            Polynomial::new_monomial(FieldElement::<F>::one(), 0),
            |zerofier, step| {
                let binomial =
                    Polynomial::new(&[-primitive_root.pow(step), FieldElement::<F>::one()]);
                // TODO: Implement the MulAssign trait for Polynomials?
                zerofier * binomial
            },
        )
    }
Computes the zerofier of the boundary quotient. The result is the
multiplication of each binomial that evaluates to zero in the domain
values where the boundary constraints must hold.

Example: If there are boundary conditions in the third and fifth steps,
then the zerofier will be (x - w^3) * (x - w^5)
crates/provers/stark/src/constraints/boundary.rs