pub struct RangeChip<F: ScalarField> {
pub gate: GateChip<F>,
pub lookup_bits: usize,
pub limb_bases: Vec<QuantumCell<F>>,
/* private fields */
}
Expand description
A chip that implements RangeInstructions which provides methods to constrain a field element x
is within a range of bits.
Fields
gate: GateChip<F>
Underlying GateChip for this chip.
lookup_bits: usize
Defines the number of bits represented in the lookup table [0,2lookup_bits).
limb_bases: Vec<QuantumCell<F>>
Vec of powers of 2 ** lookup_bits
represented as QuantumCell::Constant.
These are precomputed and cached as a performance optimization for later limb decompositions. We precompute up to the higher power that fits in F
, which is 2 ** ((F::CAPACITY / lookup_bits) * lookup_bits)
.
Implementations
sourceimpl<F: ScalarField> RangeChip<F>
impl<F: ScalarField> RangeChip<F>
sourcepub fn new(strategy: RangeStrategy, lookup_bits: usize) -> Self
pub fn new(strategy: RangeStrategy, lookup_bits: usize) -> Self
Creates a new RangeChip with the given strategy and lookup_bits.
- strategy: GateStrategy for advice values in this chip
- lookup_bits: number of bits represented in the lookup table [0,2lookup_bits)
Trait Implementations
sourceimpl<F: Clone + ScalarField> Clone for RangeChip<F>
impl<F: Clone + ScalarField> Clone for RangeChip<F>
sourceimpl<F: Debug + ScalarField> Debug for RangeChip<F>
impl<F: Debug + ScalarField> Debug for RangeChip<F>
sourceimpl<F: ScalarField> RangeInstructions<F> for RangeChip<F>
impl<F: ScalarField> RangeInstructions<F> for RangeChip<F>
sourcefn strategy(&self) -> RangeStrategy
fn strategy(&self) -> RangeStrategy
Returns the GateStrategy for this range.
sourcefn lookup_bits(&self) -> usize
fn lookup_bits(&self) -> usize
Defines the number of bits represented in the lookup table [0,2lookup_bits).
sourcefn range_check(&self, ctx: &mut Context<F>, a: AssignedValue<F>, range_bits: usize)
fn range_check(&self, ctx: &mut Context<F>, a: AssignedValue<F>, range_bits: usize)
Checks and constrains that a
lies in the range [0, 2range_bits).
This is done by decomposing a
into k
limbs, where k = ceil(range_bits / lookup_bits)
.
Each limb is constrained to be within the range [0, 2lookup_bits).
The limbs are then combined to form a
again with the last limb having rem_bits
number of bits.
a
: AssignedValue value to be range checkedrange_bits
: number of bits in the rangelookup_bits
: number of bits in the lookup table
Assumptions
ceil(range_bits / lookup_bits) * lookup_bits <= F::CAPACITY
sourcefn check_less_than(
&self,
ctx: &mut Context<F>,
a: impl Into<QuantumCell<F>>,
b: impl Into<QuantumCell<F>>,
num_bits: usize
)
fn check_less_than(
&self,
ctx: &mut Context<F>,
a: impl Into<QuantumCell<F>>,
b: impl Into<QuantumCell<F>>,
num_bits: usize
)
Constrains that ‘a’ is less than ‘b’.
Assumes thata
and b
are known to have <= num_bits bits.
Note: This may fail silently if a or b have more than num_bits
- a: QuantumCell value to check
- b: upper bound expressed as a QuantumCell
- num_bits: number of bits to represent the values
sourcefn is_less_than(
&self,
ctx: &mut Context<F>,
a: impl Into<QuantumCell<F>>,
b: impl Into<QuantumCell<F>>,
num_bits: usize
) -> AssignedValue<F>
fn is_less_than(
&self,
ctx: &mut Context<F>,
a: impl Into<QuantumCell<F>>,
b: impl Into<QuantumCell<F>>,
num_bits: usize
) -> AssignedValue<F>
Constrains whether a
is in [0, b)
, and returns 1 if a
< b
, otherwise 0.
- a: first QuantumCell to compare
- b: second QuantumCell to compare
- num_bits: number of bits to represent the values
Assumptions
a
andb
are known to have<= num_bits
bits.- (
ceil(num_bits / lookup_bits) + 1) * lookup_bits <= F::CAPACITY
sourcefn check_less_than_safe(&self, ctx: &mut Context<F>, a: AssignedValue<F>, b: u64)
fn check_less_than_safe(&self, ctx: &mut Context<F>, a: AssignedValue<F>, b: u64)
a
has at most bit_length(b)
bits and then constrains that a
is less than b
. Read moresourcefn check_big_less_than_safe(
&self,
ctx: &mut Context<F>,
a: AssignedValue<F>,
b: BigUint
)where
F: BigPrimeField,
fn check_big_less_than_safe(
&self,
ctx: &mut Context<F>,
a: AssignedValue<F>,
b: BigUint
)where
F: BigPrimeField,
a
has at most bit_length(b)
bits and then constrains that a
is less than b
. Read moresourcefn is_less_than_safe(
&self,
ctx: &mut Context<F>,
a: AssignedValue<F>,
b: u64
) -> AssignedValue<F>
fn is_less_than_safe(
&self,
ctx: &mut Context<F>,
a: AssignedValue<F>,
b: u64
) -> AssignedValue<F>
a
has at most ceil(bit_length(b) / lookup_bits) * lookup_bits
and then constrains that a
is in [0,b)
. Read moresourcefn is_big_less_than_safe(
&self,
ctx: &mut Context<F>,
a: AssignedValue<F>,
b: BigUint
) -> AssignedValue<F>where
F: BigPrimeField,
fn is_big_less_than_safe(
&self,
ctx: &mut Context<F>,
a: AssignedValue<F>,
b: BigUint
) -> AssignedValue<F>where
F: BigPrimeField,
a
has at most ceil(b.bits() / lookup_bits) * lookup_bits
bits and then constrains that a
is in [0,b)
. Read moresourcefn div_mod(
&self,
ctx: &mut Context<F>,
a: impl Into<QuantumCell<F>>,
b: impl Into<BigUint>,
a_num_bits: usize
) -> (AssignedValue<F>, AssignedValue<F>)where
F: BigPrimeField,
fn div_mod(
&self,
ctx: &mut Context<F>,
a: impl Into<QuantumCell<F>>,
b: impl Into<BigUint>,
a_num_bits: usize
) -> (AssignedValue<F>, AssignedValue<F>)where
F: BigPrimeField,
sourcefn div_mod_var(
&self,
ctx: &mut Context<F>,
a: impl Into<QuantumCell<F>>,
b: impl Into<QuantumCell<F>>,
a_num_bits: usize,
b_num_bits: usize
) -> (AssignedValue<F>, AssignedValue<F>)where
F: BigPrimeField,
fn div_mod_var(
&self,
ctx: &mut Context<F>,
a: impl Into<QuantumCell<F>>,
b: impl Into<QuantumCell<F>>,
a_num_bits: usize,
b_num_bits: usize
) -> (AssignedValue<F>, AssignedValue<F>)where
F: BigPrimeField,
sourcefn get_last_bit(
&self,
ctx: &mut Context<F>,
a: AssignedValue<F>,
limb_bits: usize
) -> AssignedValue<F>
fn get_last_bit(
&self,
ctx: &mut Context<F>,
a: AssignedValue<F>,
limb_bits: usize
) -> AssignedValue<F>
a
. Read moreAuto Trait Implementations
impl<F> RefUnwindSafe for RangeChip<F>where
F: RefUnwindSafe,
impl<F> Send for RangeChip<F>
impl<F> Sync for RangeChip<F>
impl<F> Unpin for RangeChip<F>where
F: Unpin,
impl<F> UnwindSafe for RangeChip<F>where
F: UnwindSafe,
Blanket Implementations
sourceimpl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<T> FmtForward for T
impl<T> FmtForward for T
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
sourceimpl<T> Instrument for T
impl<T> Instrument for T
sourcefn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
sourcefn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read morefn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read morefn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> Rwhere
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> Rwhere
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
self
, then passes self.as_ref()
into the pipe function.fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> Rwhere
Self: Deref<Target = T>,
T: 'a + ?Sized,
R: 'a,
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> Rwhere
Self: Deref<Target = T>,
T: 'a + ?Sized,
R: 'a,
self
, then passes self.deref()
into the pipe function.impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Tap for T
impl<T> Tap for T
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
Borrow<B>
of a value. Read morefn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
BorrowMut<B>
of a value. Read morefn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
AsRef<R>
view of a value. Read morefn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
AsMut<R>
view of a value. Read morefn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere
Self: Deref<Target = T>,
T: ?Sized,
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere
Self: Deref<Target = T>,
T: ?Sized,
Deref::Target
of a value. Read morefn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
Deref::Target
of a value. Read morefn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds. Read morefn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
.tap_borrow()
only in debug builds, and is erased in release
builds. Read morefn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
.tap_borrow_mut()
only in debug builds, and is erased in release
builds. Read morefn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
.tap_ref()
only in debug builds, and is erased in release
builds. Read morefn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
.tap_ref_mut()
only in debug builds, and is erased in release
builds. Read more