From 56b62f19642303faeb149d1d459aee7cfb8438d0 Mon Sep 17 00:00:00 2001 From: Nicholas Ward Date: Thu, 29 Jul 2021 10:26:46 -0700 Subject: [PATCH 1/3] new exp gate takes in CircuitConfig and determines num_bits --- src/gadgets/arithmetic.rs | 2 +- src/gates/exponentiation.rs | 22 ++++++++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/gadgets/arithmetic.rs b/src/gadgets/arithmetic.rs index 5597499d..bf16a820 100644 --- a/src/gadgets/arithmetic.rs +++ b/src/gadgets/arithmetic.rs @@ -178,7 +178,7 @@ impl, const D: usize> CircuitBuilder { exponent_bits: impl Iterator>, ) -> Target { let exp_bits_vec: Vec = exponent_bits.map(|b| *b.borrow()).collect(); - let gate = ExponentiationGate::new(exp_bits_vec.len()); + let gate = ExponentiationGate::new(self.config.clone()); let gate_index = self.add_gate(gate.clone(), vec![]); let two = self.constant(F::TWO); diff --git a/src/gates/exponentiation.rs b/src/gates/exponentiation.rs index 900559e6..a7cd8b1c 100644 --- a/src/gates/exponentiation.rs +++ b/src/gates/exponentiation.rs @@ -1,6 +1,7 @@ use std::marker::PhantomData; use crate::circuit_builder::CircuitBuilder; +use crate::circuit_data::CircuitConfig; use crate::field::extension_field::target::ExtensionTarget; use crate::field::extension_field::Extendable; use crate::field::field::Field; @@ -20,7 +21,8 @@ pub(crate) struct ExponentiationGate, const D: usize> { } impl, const D: usize> ExponentiationGate { - pub fn new(num_power_bits: usize) -> Self { + pub fn new(config: CircuitConfig) -> Self { + let num_power_bits = Self::max_power_bits(config.num_wires, config.num_routed_wires); Self { num_power_bits, _phantom: PhantomData, @@ -281,9 +283,11 @@ mod tests { use rand::{thread_rng, Rng}; + use crate::circuit_data::CircuitConfig; use crate::field::crandall_field::CrandallField; use crate::field::extension_field::quartic::QuarticCrandallField; use crate::field::field::Field; + use crate::fri::FriConfig; use crate::gates::exponentiation::ExponentiationGate; use crate::gates::gate::Gate; use crate::gates::gate_testing::test_low_degree; @@ -311,7 +315,21 @@ mod tests { #[test] fn low_degree() { - test_low_degree::(ExponentiationGate::new(5)); + let config = CircuitConfig { + num_wires: 120, + num_routed_wires: 30, + security_bits: 0, + rate_bits: 0, + num_challenges: 0, + zero_knowledge: false, + fri_config: FriConfig { + proof_of_work_bits: 0, + reduction_arity_bits: Vec::new(), + num_query_rounds: 0, + }, + }; + + test_low_degree::(ExponentiationGate::new(config)); } #[test] From 8440a4cbdf50276bc38ecf52c5e32868a6df1e74 Mon Sep 17 00:00:00 2001 From: Nicholas Ward Date: Thu, 29 Jul 2021 15:15:40 -0700 Subject: [PATCH 2/3] fix --- src/gadgets/arithmetic.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/gadgets/arithmetic.rs b/src/gadgets/arithmetic.rs index a181cb80..bf3c188d 100644 --- a/src/gadgets/arithmetic.rs +++ b/src/gadgets/arithmetic.rs @@ -176,8 +176,12 @@ impl, const D: usize> CircuitBuilder { base: Target, exponent_bits: impl Iterator>, ) -> Target { - let exp_bits_vec: Vec = exponent_bits.map(|b| *b.borrow()).collect(); let gate = ExponentiationGate::new(self.config.clone()); + let num_power_bits = gate.num_power_bits; + let mut exp_bits_vec: Vec = exponent_bits.map(|b| *b.borrow()).collect(); + while exp_bits_vec.len() < num_power_bits { + exp_bits_vec.push(self.constant(F::ZERO)); + } let gate_index = self.add_gate(gate.clone(), vec![]); self.route(base, Target::wire(gate_index, gate.wire_base())); From 9eda81c293a17dbd30ce6e37b4f6f31a069f6188 Mon Sep 17 00:00:00 2001 From: Nicholas Ward Date: Thu, 29 Jul 2021 15:31:04 -0700 Subject: [PATCH 3/3] minor changes --- src/gates/exponentiation.rs | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/gates/exponentiation.rs b/src/gates/exponentiation.rs index ef1786f5..2f33e5d9 100644 --- a/src/gates/exponentiation.rs +++ b/src/gates/exponentiation.rs @@ -28,7 +28,7 @@ impl, const D: usize> ExponentiationGate { } } - pub fn max_power_bits(num_wires: usize, num_routed_wires: usize) -> usize { + fn max_power_bits(num_wires: usize, num_routed_wires: usize) -> usize { let max_for_routed_wires = num_routed_wires - 3; let max_for_wires = (num_wires - 3) / 2; max_for_routed_wires.min(max_for_wires) @@ -297,15 +297,7 @@ mod tests { let config = CircuitConfig { num_wires: 120, num_routed_wires: 30, - security_bits: 0, - rate_bits: 0, - num_challenges: 0, - zero_knowledge: false, - fri_config: FriConfig { - proof_of_work_bits: 0, - reduction_arity_bits: Vec::new(), - num_query_rounds: 0, - }, + ..CircuitConfig::large_config() }; test_low_degree::(ExponentiationGate::new(config));