diff --git a/src/plonk/prover.rs b/src/plonk/prover.rs index 288f4c29..06670a08 100644 --- a/src/plonk/prover.rs +++ b/src/plonk/prover.rs @@ -249,17 +249,27 @@ fn wires_permutation_partial_products, const D: usize>( .enumerate() .map(|(i, &x)| { let s_sigmas = &prover_data.sigmas[i]; - let quotient_values = (0..common_data.config.num_routed_wires) + let numerators = (0..common_data.config.num_routed_wires) .map(|j| { let wire_value = witness.get_wire(i, j); let k_i = k_is[j]; let s_id = k_i * x; - let s_sigma = s_sigmas[j]; - let numerator = wire_value + beta * s_id + gamma; - let denominator = wire_value + beta * s_sigma + gamma; - numerator / denominator + wire_value + beta * s_id + gamma }) .collect::>(); + let denominators = (0..common_data.config.num_routed_wires) + .map(|j| { + let wire_value = witness.get_wire(i, j); + let s_sigma = s_sigmas[j]; + wire_value + beta * s_sigma + gamma + }) + .collect::>(); + let denominator_invs = F::batch_multiplicative_inverse(&denominators); + let quotient_values = numerators + .into_iter() + .zip(denominator_invs) + .map(|(num, den_inv)| num * den_inv) + .collect::>(); let quotient_partials = partial_products("ient_values, degree);