From f639dd3359550048f92eafbea5004519e8e8da2b Mon Sep 17 00:00:00 2001 From: Nicholas Ward Date: Tue, 26 Oct 2021 11:04:31 -0700 Subject: [PATCH] fixes to nonnative --- src/gadgets/mod.rs | 2 +- src/gadgets/multiple_comparison.rs | 8 ++++++++ src/gadgets/nonnative.rs | 21 ++++----------------- src/gadgets/permutation.rs | 1 - 4 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src/gadgets/mod.rs b/src/gadgets/mod.rs index cf6f6ed4..8b6e60f6 100644 --- a/src/gadgets/mod.rs +++ b/src/gadgets/mod.rs @@ -6,7 +6,7 @@ pub mod hash; pub mod insert; pub mod interpolation; pub mod multiple_comparison; -//pub mod nonnative; +pub mod nonnative; pub mod permutation; pub mod polynomial; pub mod random_access; diff --git a/src/gadgets/multiple_comparison.rs b/src/gadgets/multiple_comparison.rs index e5f70a9e..579708c8 100644 --- a/src/gadgets/multiple_comparison.rs +++ b/src/gadgets/multiple_comparison.rs @@ -1,3 +1,4 @@ +use super::arithmetic_u32::U32Target; use crate::field::extension_field::Extendable; use crate::field::field_types::RichField; use crate::gates::comparison::ComparisonGate; @@ -52,6 +53,13 @@ impl, const D: usize> CircuitBuilder { BoolTarget::new_unsafe(result) } + + /// Helper function for comparing, specifically, lists of `U32Target`s. + pub fn list_le_u32(&mut self, a: Vec, b: Vec) -> BoolTarget { + let a_targets = a.iter().map(|&t| t.0).collect(); + let b_targets = b.iter().map(|&t| t.0).collect(); + self.list_le(a_targets, b_targets, 32) + } } #[cfg(test)] diff --git a/src/gadgets/nonnative.rs b/src/gadgets/nonnative.rs index e41f8fb5..406d6852 100644 --- a/src/gadgets/nonnative.rs +++ b/src/gadgets/nonnative.rs @@ -1,6 +1,5 @@ use std::marker::PhantomData; - use crate::field::field_types::RichField; use crate::field::{extension_field::Extendable, field_types::Field}; use crate::gadgets::arithmetic_u32::U32Target; @@ -21,16 +20,6 @@ impl, const D: usize> CircuitBuilder { .collect() } - fn power_of_2_mod_order(&mut self, i: usize) -> Vec { - - } - - pub fn powers_of_2_mod_order(&mut self, max: usize) -> Vec> { - for i in 0..max { - - } - } - // Add two `ForeignFieldTarget`s. pub fn add_nonnative( &mut self, @@ -62,14 +51,14 @@ impl, const D: usize> CircuitBuilder { let num_limbs = limbs.len(); let mut modulus_limbs = self.order_u32_limbs::(); - modulus_limbs.append(self.zero_u32()); + modulus_limbs.push(self.zero_u32()); - let needs_reduce = self.list_le(modulus_limbs, limbs); + let needs_reduce = self.list_le_u32(modulus_limbs, limbs); let mut to_subtract = vec![]; for i in 0..num_limbs { - let (low, _high) = self.mul_u32(modulus_limbs[i], needs_reduce); - to_subtract.append(low); + let (low, _high) = self.mul_u32(modulus_limbs[i], U32Target(needs_reduce.target)); + to_subtract.push(low); } let mut reduced_limbs = vec![]; @@ -110,7 +99,6 @@ impl, const D: usize> CircuitBuilder { } } - pub fn mul_nonnative( &mut self, a: ForeignFieldTarget, @@ -148,7 +136,6 @@ impl, const D: usize> CircuitBuilder { } pub fn reduce_mul_result(&mut self, limbs: Vec) -> Vec { - todo!() } } diff --git a/src/gadgets/permutation.rs b/src/gadgets/permutation.rs index ae0e411b..aa06294a 100644 --- a/src/gadgets/permutation.rs +++ b/src/gadgets/permutation.rs @@ -35,7 +35,6 @@ impl, const D: usize> CircuitBuilder { self.assert_permutation_2x2(a[0].clone(), a[1].clone(), b[0].clone(), b[1].clone()) } // For larger lists, we recursively use two smaller permutation networks. - //_ => self.assert_permutation_recursive(a, b) _ => self.assert_permutation_recursive(a, b), } }