diff --git a/src/gates/reducing.rs b/src/gates/reducing.rs index 930f0456..65b09d60 100644 --- a/src/gates/reducing.rs +++ b/src/gates/reducing.rs @@ -20,6 +20,10 @@ impl ReducingGate { Self { num_coeffs } } + pub fn max_coeffs_len(num_wires: usize, num_routed_wires: usize) -> usize { + (num_routed_wires - 3 * D).min((num_wires - 3 * D) / (D + 1)) + } + pub fn wires_output() -> Range { 0..D } diff --git a/src/util/reducing.rs b/src/util/reducing.rs index f69d6675..ae15ef4b 100644 --- a/src/util/reducing.rs +++ b/src/util/reducing.rs @@ -100,7 +100,10 @@ impl ReducingFactorTarget { where F: Extendable, { - let max_coeffs = 21; + let max_coeffs_len = ReducingGate::::max_coeffs_len( + builder.config.num_wires, + builder.config.num_routed_wires, + ); self.count += terms.len() as u64; let zero = builder.zero(); let zero_ext = builder.zero_extension(); @@ -108,12 +111,12 @@ impl ReducingFactorTarget { let mut gate_index; let mut acc = zero_ext; let mut reversed_terms = terms.to_vec(); - while reversed_terms.len() % max_coeffs != 0 { + while reversed_terms.len() % max_coeffs_len != 0 { reversed_terms.push(zero); } reversed_terms.reverse(); - for chunk in reversed_terms.chunks_exact(max_coeffs) { - gate = ReducingGate::new(max_coeffs); + for chunk in reversed_terms.chunks_exact(max_coeffs_len) { + gate = ReducingGate::new(max_coeffs_len); gate_index = builder.add_gate(gate.clone(), Vec::new()); builder.route_extension(