pub struct EvaluationDomain<F: Field> { /* private fields */ }
Expand description
This structure contains precomputed constants and other details needed for performing operations on an evaluation domain of size $2^k$ and an extended domain of size $2^{k} * j$ with $j \neq 0$.
Implementations§
Source§impl<F: WithSmallOrderMulGroup<3>> EvaluationDomain<F>
impl<F: WithSmallOrderMulGroup<3>> EvaluationDomain<F>
Sourcepub fn new(j: u32, k: u32) -> Self
pub fn new(j: u32, k: u32) -> Self
This constructs a new evaluation domain object based on the provided values $j, k$.
Sourcepub fn lagrange_from_vec(&self, values: Vec<F>) -> Polynomial<F, LagrangeCoeff>
pub fn lagrange_from_vec(&self, values: Vec<F>) -> Polynomial<F, LagrangeCoeff>
Obtains a polynomial in Lagrange form when given a vector of Lagrange
coefficients of size n
; panics if the provided vector is the wrong
length.
pub fn lagrange_assigned_from_vec( &self, values: Vec<Assigned<F>>, ) -> Polynomial<Assigned<F>, LagrangeCoeff>
Sourcepub fn coeff_from_vec(&self, values: Vec<F>) -> Polynomial<F, Coeff>
pub fn coeff_from_vec(&self, values: Vec<F>) -> Polynomial<F, Coeff>
Obtains a polynomial in coefficient form when given a vector of
coefficients of size n
; panics if the provided vector is the wrong
length.
Sourcepub fn lagrange_vec_to_extended(
&self,
values: Vec<Polynomial<F, LagrangeCoeff>>,
) -> Polynomial<F, ExtendedLagrangeCoeff>
pub fn lagrange_vec_to_extended( &self, values: Vec<Polynomial<F, LagrangeCoeff>>, ) -> Polynomial<F, ExtendedLagrangeCoeff>
Obtains a polynomial in ExtendedLagrange form when given a vector of
Lagrange polynomials with total size extended_n
; panics if the
provided vector is the wrong length.
Sourcepub fn extended_from_lagrange_vec(
&self,
values: Vec<Polynomial<F, LagrangeCoeff>>,
) -> Polynomial<F, ExtendedLagrangeCoeff>
pub fn extended_from_lagrange_vec( &self, values: Vec<Polynomial<F, LagrangeCoeff>>, ) -> Polynomial<F, ExtendedLagrangeCoeff>
Obtains a polynomial in ExtendedLagrange form when given a vector of
Lagrange polynomials with total size extended_n
; panics if the
provided vector is the wrong length.
Sourcepub fn empty_coeff(&self) -> Polynomial<F, Coeff>
pub fn empty_coeff(&self) -> Polynomial<F, Coeff>
Returns an empty (zero) polynomial in the coefficient basis
Sourcepub fn empty_lagrange(&self) -> Polynomial<F, LagrangeCoeff>
pub fn empty_lagrange(&self) -> Polynomial<F, LagrangeCoeff>
Returns an empty (zero) polynomial in the Lagrange coefficient basis
Sourcepub fn constant_lagrange(&self, scalar: F) -> Polynomial<F, LagrangeCoeff>
pub fn constant_lagrange(&self, scalar: F) -> Polynomial<F, LagrangeCoeff>
Returns a constant polynomial in the Lagrange coefficient basis
Sourcepub fn empty_extended(&self) -> Polynomial<F, ExtendedLagrangeCoeff>
pub fn empty_extended(&self) -> Polynomial<F, ExtendedLagrangeCoeff>
Returns an empty (zero) polynomial in the extended Lagrange coefficient basis
Sourcepub fn constant_extended(
&self,
scalar: F,
) -> Polynomial<F, ExtendedLagrangeCoeff>
pub fn constant_extended( &self, scalar: F, ) -> Polynomial<F, ExtendedLagrangeCoeff>
Returns a constant polynomial in the extended Lagrange coefficient basis
Sourcepub fn lagrange_to_coeff(
&self,
a: Polynomial<F, LagrangeCoeff>,
) -> Polynomial<F, Coeff>
pub fn lagrange_to_coeff( &self, a: Polynomial<F, LagrangeCoeff>, ) -> Polynomial<F, Coeff>
This takes us from an n-length vector into the coefficient form.
This function will panic if the provided vector is not the correct length.
Sourcepub fn coeff_to_extended(
&self,
p: &Polynomial<F, Coeff>,
) -> Polynomial<F, ExtendedLagrangeCoeff>
pub fn coeff_to_extended( &self, p: &Polynomial<F, Coeff>, ) -> Polynomial<F, ExtendedLagrangeCoeff>
This takes us from an n-length coefficient vector into a coset of the extended
evaluation domain, rotating by rotation
if desired.
Sourcepub fn coeff_to_extended_parts(
&self,
a: &Polynomial<F, Coeff>,
) -> Vec<Polynomial<F, LagrangeCoeff>>
pub fn coeff_to_extended_parts( &self, a: &Polynomial<F, Coeff>, ) -> Vec<Polynomial<F, LagrangeCoeff>>
This takes us from an n-length coefficient vector into parts of the
extended evaluation domain. For example, for a polynomial with size n,
and an extended domain of size mn, we can compute all parts
independently, which are
FFT(f(zeta * X), n)
FFT(f(zeta * extended_omega * X), n)
…
FFT(f(zeta * extended_omega^{m-1} * X), n)
Sourcepub fn batched_coeff_to_extended_parts(
&self,
a: &[Polynomial<F, Coeff>],
) -> Vec<Vec<Polynomial<F, LagrangeCoeff>>>
pub fn batched_coeff_to_extended_parts( &self, a: &[Polynomial<F, Coeff>], ) -> Vec<Vec<Polynomial<F, LagrangeCoeff>>>
This takes us from several n-length coefficient vectors each into parts
of the extended evaluation domain. For example, for a polynomial with
size n, and an extended domain of size mn, we can compute all parts
independently, which are
FFT(f(zeta * X), n)
FFT(f(zeta * extended_omega * X), n)
…
FFT(f(zeta * extended_omega^{m-1} * X), n)
Sourcepub fn coeff_to_extended_part(
&self,
a: Polynomial<F, Coeff>,
extended_omega_factor: F,
) -> Polynomial<F, LagrangeCoeff>
pub fn coeff_to_extended_part( &self, a: Polynomial<F, Coeff>, extended_omega_factor: F, ) -> Polynomial<F, LagrangeCoeff>
This takes us from an n-length coefficient vector into a part of the
extended evaluation domain. For example, for a polynomial with size n,
and an extended domain of size mn, we can compute one of the m parts
separately, which is
FFT(f(zeta * extended_omega_factor * X), n)
where extended_omega_factor
is extended_omega^i
with i
in [0, m)
.
Sourcepub fn rotate_extended(
&self,
poly: &Polynomial<F, ExtendedLagrangeCoeff>,
rotation: Rotation,
) -> Polynomial<F, ExtendedLagrangeCoeff>
pub fn rotate_extended( &self, poly: &Polynomial<F, ExtendedLagrangeCoeff>, rotation: Rotation, ) -> Polynomial<F, ExtendedLagrangeCoeff>
Rotate the extended domain polynomial over the original domain.
Sourcepub fn extended_to_coeff(
&self,
a: Polynomial<F, ExtendedLagrangeCoeff>,
) -> Vec<F>
pub fn extended_to_coeff( &self, a: Polynomial<F, ExtendedLagrangeCoeff>, ) -> Vec<F>
This takes us from the extended evaluation domain and gets us the quotient polynomial coefficients.
This function will panic if the provided vector is not the correct length.
Sourcepub fn lagrange_vecs_to_extended(
&self,
a: Vec<Vec<Polynomial<F, LagrangeCoeff>>>,
) -> Polynomial<F, ExtendedLagrangeCoeff>
pub fn lagrange_vecs_to_extended( &self, a: Vec<Vec<Polynomial<F, LagrangeCoeff>>>, ) -> Polynomial<F, ExtendedLagrangeCoeff>
This takes us from the a list of lagrange-based polynomials with different degrees and gets their extended lagrange-based summation.
Sourcepub fn divide_by_vanishing_poly(
&self,
a: Polynomial<F, ExtendedLagrangeCoeff>,
) -> Polynomial<F, ExtendedLagrangeCoeff>
pub fn divide_by_vanishing_poly( &self, a: Polynomial<F, ExtendedLagrangeCoeff>, ) -> Polynomial<F, ExtendedLagrangeCoeff>
This divides the polynomial (in the extended domain) by the vanishing polynomial of the $2^k$ size domain.
Sourcepub fn extended_k(&self) -> u32
pub fn extended_k(&self) -> u32
Get the size of the extended domain
Sourcepub fn extended_len(&self) -> usize
pub fn extended_len(&self) -> usize
Get the size of the extended domain
Sourcepub fn get_omega(&self) -> F
pub fn get_omega(&self) -> F
Get $\omega$, the generator of the $2^k$ order multiplicative subgroup.
Sourcepub fn get_omega_inv(&self) -> F
pub fn get_omega_inv(&self) -> F
Get $\omega^{-1}$, the inverse of the generator of the $2^k$ order multiplicative subgroup.
Sourcepub fn get_extended_omega(&self) -> F
pub fn get_extended_omega(&self) -> F
Get the generator of the extended domain’s multiplicative subgroup.
Sourcepub fn rotate_omega(&self, value: F, rotation: Rotation) -> F
pub fn rotate_omega(&self, value: F, rotation: Rotation) -> F
Multiplies a value by some power of $\omega$, essentially rotating over the domain.
Sourcepub fn l_i_range<I: IntoIterator<Item = i32> + Clone>(
&self,
x: F,
xn: F,
rotations: I,
) -> Vec<F>
pub fn l_i_range<I: IntoIterator<Item = i32> + Clone>( &self, x: F, xn: F, rotations: I, ) -> Vec<F>
Computes evaluations (at the point x
, where xn = x^n
) of Lagrange
basis polynomials l_i(X)
defined such that l_i(omega^i) = 1
and
l_i(omega^j) = 0
for all j != i
at each provided rotation i
.
§Implementation
The polynomial $$\prod_{j=0,j \neq i}^{n - 1} (X - \omega^j)$$ has a root at all points in the domain except $\omega^i$, where it evaluates to $$\prod_{j=0,j \neq i}^{n - 1} (\omega^i - \omega^j)$$ and so we divide that polynomial by this value to obtain $l_i(X)$. Since $$\prod_{j=0,j \neq i}^{n - 1} (X - \omega^j) = \frac{X^n - 1}{X - \omega^i}$$ then $l_i(x)$ for some $x$ is evaluated as $$\left(\frac{x^n - 1}{x - \omega^i}\right) \cdot \left(\frac{1}{\prod_{j=0,j \neq i}^{n - 1} (\omega^i - \omega^j)}\right).$$ We refer to $$1 \over \prod_{j=0,j \neq i}^{n - 1} (\omega^i - \omega^j)$$ as the barycentric weight of $\omega^i$.
We know that for $i = 0$ $$\frac{1}{\prod_{j=0,j \neq i}^{n - 1} (\omega^i - \omega^j)} = \frac{1}{n}.$$
If we multiply $(1 / n)$ by $\omega^i$ then we obtain $$\frac{1}{\prod_{j=0,j \neq 0}^{n - 1} (\omega^i - \omega^j)} = \frac{1}{\prod_{j=0,j \neq i}^{n - 1} (\omega^i - \omega^j)}$$ which is the barycentric weight of $\omega^i$.
Sourcepub fn get_quotient_poly_degree(&self) -> usize
pub fn get_quotient_poly_degree(&self) -> usize
Gets the quotient polynomial’s degree (as a multiple of n)
Sourcepub fn pinned(&self) -> PinnedEvaluationDomain<'_, F>
pub fn pinned(&self) -> PinnedEvaluationDomain<'_, F>
Obtain a pinned version of this evaluation domain; a structure with the minimal parameters needed to determine the rest of the evaluation domain.
Sourcepub fn get_fft_data(&self, l: usize) -> &FFTData<F>
pub fn get_fft_data(&self, l: usize) -> &FFTData<F>
Get the private fft_data
Trait Implementations§
Source§impl<F: Clone + Field> Clone for EvaluationDomain<F>
impl<F: Clone + Field> Clone for EvaluationDomain<F>
Source§fn clone(&self) -> EvaluationDomain<F>
fn clone(&self) -> EvaluationDomain<F>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreAuto Trait Implementations§
impl<F> Freeze for EvaluationDomain<F>where
F: Freeze,
impl<F> RefUnwindSafe for EvaluationDomain<F>where
F: RefUnwindSafe,
impl<F> Send for EvaluationDomain<F>
impl<F> Sync for EvaluationDomain<F>
impl<F> Unpin for EvaluationDomain<F>where
F: Unpin,
impl<F> UnwindSafe for EvaluationDomain<F>where
F: 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,
Source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§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.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.Source§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.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§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 moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§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 moreSource§fn 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 moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read moreSource§fn 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.Source§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.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.