From e8eca780ae9bd1751b170fa40413bc1b5638c056 Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Tue, 13 Sep 2022 13:06:47 +0200 Subject: [PATCH] Fix num_limbs in BaseSumGate --- plonky2/src/gates/base_sum.rs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) 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;