From e8eca780ae9bd1751b170fa40413bc1b5638c056 Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Tue, 13 Sep 2022 13:06:47 +0200 Subject: [PATCH 1/4] 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; From 2a37aeca5db2852aa84955e1bb1ccbe94a2ba0fd Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Wed, 14 Sep 2022 05:48:37 +0200 Subject: [PATCH 2/4] Move to `util` and rename --- plonky2/src/gates/base_sum.rs | 20 ++------------------ util/src/lib.rs | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/plonky2/src/gates/base_sum.rs b/plonky2/src/gates/base_sum.rs index 37f03414..43ae2fd2 100644 --- a/plonky2/src/gates/base_sum.rs +++ b/plonky2/src/gates/base_sum.rs @@ -3,6 +3,7 @@ use std::ops::Range; use plonky2_field::extension::Extendable; use plonky2_field::packed::PackedField; use plonky2_field::types::{Field, Field64}; +use plonky2_util::log_floor; use crate::gates::gate::Gate; use crate::gates::packed_util::PackedEvaluableBase; @@ -33,7 +34,7 @@ impl BaseSumGate { pub fn new_from_config(config: &CircuitConfig) -> Self { let num_limbs = - logarithm(F::ORDER as usize, B).min(config.num_routed_wires - Self::START_LIMBS); + log_floor(F::ORDER as usize, B).min(config.num_routed_wires - Self::START_LIMBS); Self::new(num_limbs) } @@ -193,23 +194,6 @@ 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; diff --git a/util/src/lib.rs b/util/src/lib.rs index 61677ff0..33fe7ab4 100644 --- a/util/src/lib.rs +++ b/util/src/lib.rs @@ -38,6 +38,23 @@ pub fn log2_strict(n: usize) -> usize { res as usize } +/// Returns the largest `i` such that `base**i < n`. +pub const fn log_floor(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; + } + } +} + /// Permutes `arr` such that each index is mapped to its reverse in binary. pub fn reverse_index_bits(arr: &[T]) -> Vec { let n = arr.len(); From 0aecc2a3cf28a6a0733e1dd84b338db8ba4215c1 Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Wed, 14 Sep 2022 06:19:06 +0200 Subject: [PATCH 3/4] Feedback --- plonky2/src/gates/base_sum.rs | 2 +- util/src/lib.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plonky2/src/gates/base_sum.rs b/plonky2/src/gates/base_sum.rs index 43ae2fd2..93ac7e8d 100644 --- a/plonky2/src/gates/base_sum.rs +++ b/plonky2/src/gates/base_sum.rs @@ -34,7 +34,7 @@ impl BaseSumGate { pub fn new_from_config(config: &CircuitConfig) -> Self { let num_limbs = - log_floor(F::ORDER as usize, B).min(config.num_routed_wires - Self::START_LIMBS); + log_floor(F::ORDER as usize - 1, B).min(config.num_routed_wires - Self::START_LIMBS); Self::new(num_limbs) } diff --git a/util/src/lib.rs b/util/src/lib.rs index 33fe7ab4..3136a4b2 100644 --- a/util/src/lib.rs +++ b/util/src/lib.rs @@ -38,7 +38,7 @@ pub fn log2_strict(n: usize) -> usize { res as usize } -/// Returns the largest `i` such that `base**i < n`. +/// Returns the largest integer `i` such that `base**i <= n`. pub const fn log_floor(n: usize, base: usize) -> usize { assert!(n > 0); assert!(base > 1); @@ -46,7 +46,7 @@ pub const fn log_floor(n: usize, base: usize) -> usize { let mut cur: usize = 1; loop { let (mul, overflow) = cur.overflowing_mul(base); - if overflow || mul >= n { + if overflow || mul > n { return i; } else { i += 1; From ee54b295d9c478ab4e0c1175c788fefbaea237a3 Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Thu, 29 Sep 2022 15:24:43 +0200 Subject: [PATCH 4/4] Use u64 instead of usize --- plonky2/src/gates/base_sum.rs | 2 +- util/src/lib.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plonky2/src/gates/base_sum.rs b/plonky2/src/gates/base_sum.rs index 93ac7e8d..5be54eeb 100644 --- a/plonky2/src/gates/base_sum.rs +++ b/plonky2/src/gates/base_sum.rs @@ -34,7 +34,7 @@ impl BaseSumGate { pub fn new_from_config(config: &CircuitConfig) -> Self { let num_limbs = - log_floor(F::ORDER as usize - 1, B).min(config.num_routed_wires - Self::START_LIMBS); + log_floor(F::ORDER - 1, B as u64).min(config.num_routed_wires - Self::START_LIMBS); Self::new(num_limbs) } diff --git a/util/src/lib.rs b/util/src/lib.rs index 3136a4b2..bbc2af98 100644 --- a/util/src/lib.rs +++ b/util/src/lib.rs @@ -39,11 +39,11 @@ pub fn log2_strict(n: usize) -> usize { } /// Returns the largest integer `i` such that `base**i <= n`. -pub const fn log_floor(n: usize, base: usize) -> usize { +pub const fn log_floor(n: u64, base: u64) -> usize { assert!(n > 0); assert!(base > 1); let mut i = 0; - let mut cur: usize = 1; + let mut cur: u64 = 1; loop { let (mul, overflow) = cur.overflowing_mul(base); if overflow || mul > n {