pub struct BinarySubspace<F, Data: Deref<Target = [F]> = Vec<F>> { /* private fields */ }Expand description
An $\mathbb{F}_2$-linear subspace of a binary field.
The subspace is the span of an ordered basis under XOR. The basis order fixes an order on the subspace’s own elements too.
Implementations§
Source§impl<F: BinaryField, Data: Deref<Target = [F]>> BinarySubspace<F, Data>
impl<F: BinaryField, Data: Deref<Target = [F]>> BinarySubspace<F, Data>
Sourcepub const fn new_unchecked(basis: Data) -> Self
pub const fn new_unchecked(basis: Data) -> Self
Creates a new subspace from a vector of ordered basis elements.
This constructor does not check that the basis elements are linearly independent.
Sourcepub fn isomorphic<FIso>(&self) -> BinarySubspace<FIso>where
FIso: BinaryField + From<F>,
pub fn isomorphic<FIso>(&self) -> BinarySubspace<FIso>where
FIso: BinaryField + From<F>,
Creates a new subspace isomorphic to this one, over a different field type.
Maps each basis element into FIso via From, keeping the same order.
Sourcepub fn get(&self, index: usize) -> F
pub fn get(&self, index: usize) -> F
Returns the subspace element selected by index.
Bit i of index selects whether basis element i is included in the sum.
Basis elements combine over $\mathbb{F}_2$, so “included” means XORed in.
§Arguments
index: which subspace element to return, in0..2^dim.
§Panics
Panics if index is at least 2^dim. Once dim reaches usize::BITS, every usize
is below 2^dim, so no index can panic.
Sourcepub fn iter(&self) -> BinarySubspaceIterator<'_, F> ⓘ
pub fn iter(&self) -> BinarySubspaceIterator<'_, F> ⓘ
Returns an iterator over every element of the subspace, in index order.
§Panics
Panics if the subspace’s dimension is at least usize::BITS.
An index that large would not fit in a usize.
Source§impl<F: BinaryField> BinarySubspace<F>
impl<F: BinaryField> BinarySubspace<F>
Sourcepub fn with_dim(dim: usize) -> Self
pub fn with_dim(dim: usize) -> Self
Creates a subspace spanned by the field’s first dim default basis elements.
Uses a prefix of the field’s own canonical $\mathbb{F}_2$ basis. So a smaller dimension is always a prefix of a larger one’s basis.
§Panics
Panics if dim is greater than F::DEGREE.
Sourcepub fn reduce_dim(&self, dim: usize) -> Self
pub fn reduce_dim(&self, dim: usize) -> Self
Creates a smaller subspace using a prefix of this subspace’s basis.
§Panics
Panics if dim is greater than this subspace’s own dimension.
Trait Implementations§
Source§impl<F: Clone, Data: Clone + Deref<Target = [F]>> Clone for BinarySubspace<F, Data>
impl<F: Clone, Data: Clone + Deref<Target = [F]>> Clone for BinarySubspace<F, Data>
Source§fn clone(&self) -> BinarySubspace<F, Data>
fn clone(&self) -> BinarySubspace<F, Data>
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<F: BinaryField> Default for BinarySubspace<F>
impl<F: BinaryField> Default for BinarySubspace<F>
impl<F: Eq, Data: Eq + Deref<Target = [F]>> Eq for BinarySubspace<F, Data>
Source§impl<F: BinaryField, Data: Deref<Target = [F]>> EvaluationDomain<F> for BinarySubspace<F, Data>
impl<F: BinaryField, Data: Deref<Target = [F]>> EvaluationDomain<F> for BinarySubspace<F, Data>
Source§fn lagrange_evals<E: FieldOps + From<F>>(&self, z: &E) -> Vec<E>
fn lagrange_evals<E: FieldOps + From<F>>(&self, z: &E) -> Vec<E>
Two sweeps build every entry without ever dividing:
backward: r_i <- w * prod_{j > i} (z - d_j)
forward: r_i <- r_i * prod_{j < i} (z - d_j)That is about 4n multiplications and the single inversion the weight costs.
Source§fn extrapolate<E: FieldOps + From<F>>(&self, values: &[E], z: &E) -> E
fn extrapolate<E: FieldOps + From<F>>(&self, values: &[E], z: &E) -> E
One prefix-product accumulator carries the whole sum in a single pass, so the extra space
is constant rather than O(n).
Source§fn lagrange_evals_buffer(&self, z: F) -> FieldBuffer<F>
fn lagrange_evals_buffer(&self, z: F) -> FieldBuffer<F>
z, packed into a buffer instead of a vector. Read moreSource§impl<F: PartialEq, Data: PartialEq + Deref<Target = [F]>> PartialEq for BinarySubspace<F, Data>
impl<F: PartialEq, Data: PartialEq + Deref<Target = [F]>> PartialEq for BinarySubspace<F, Data>
Source§fn eq(&self, other: &BinarySubspace<F, Data>) -> bool
fn eq(&self, other: &BinarySubspace<F, Data>) -> bool
self and other values to be equal, and is used by ==.impl<F: PartialEq, Data: PartialEq + Deref<Target = [F]>> StructuralPartialEq for BinarySubspace<F, Data>
Auto Trait Implementations§
impl<F, Data> Freeze for BinarySubspace<F, Data>where
Data: Freeze,
impl<F, Data> RefUnwindSafe for BinarySubspace<F, Data>where
Data: RefUnwindSafe,
impl<F, Data> Send for BinarySubspace<F, Data>where
Data: Send,
impl<F, Data> Sync for BinarySubspace<F, Data>where
Data: Sync,
impl<F, Data> Unpin for BinarySubspace<F, Data>where
Data: Unpin,
impl<F, Data> UnsafeUnpin for BinarySubspace<F, Data>where
Data: UnsafeUnpin,
impl<F, Data> UnwindSafe for BinarySubspace<F, Data>where
Data: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more