diff --git a/plonky2/src/gates/base_sum.rs b/plonky2/src/gates/base_sum.rs index a7f4fcb3..37f03414 100644 --- a/plonky2/src/gates/base_sum.rs +++ b/plonky2/src/gates/base_sum.rs @@ -32,7 +32,8 @@ impl BaseSumGate { } pub fn new_from_config(config: &CircuitConfig) -> Self { - let num_limbs = F::BITS.min(config.num_routed_wires - Self::START_LIMBS); + let num_limbs = + logarithm(F::ORDER as usize, B).min(config.num_routed_wires - Self::START_LIMBS); Self::new(num_limbs) } @@ -192,6 +193,23 @@ impl SimpleGenerator for BaseSplitGenerator } } +/// Returns the largest `i` such that `base**i < n`. +const fn logarithm(n: usize, base: usize) -> usize { + assert!(n > 0); + assert!(base > 1); + let mut i = 0; + let mut cur: usize = 1; + loop { + let (mul, overflow) = cur.overflowing_mul(base); + if overflow || mul >= n { + return i; + } else { + i += 1; + cur = mul; + } + } +} + #[cfg(test)] mod tests { use anyhow::Result;