NTTConvolution

Struct NTTConvolution 

Source
pub struct NTTConvolution<R_main, R_twiddle, H, A = Global>
where R_main: ?Sized + ZnRing, R_twiddle: ?Sized + ZnRing, H: Homomorphism<R_twiddle, R_main> + Clone, A: Allocator + Clone,
{ /* private fields */ }
Available on crate feature unstable-enable only.
Expand description

Computes the convolution over a finite field that has suitable roots of unity using a power-of-two length FFT (sometimes called Number-Theoretic Transform, NTT in this context).

§Availability

This API is marked as unstable and is only available when the unstable-enable crate feature is enabled. This comes with no stability guarantees, and could be changed or removed at any time.

Implementations§

Source§

impl<R> NTTConvolution<R::Type, R::Type, Identity<R>>
where R: RingStore + Clone, R::Type: ZnRing,

Source

pub fn new(ring: R) -> Self

Creates a new NTTConvolution.

Note that this convolution will be able to compute convolutions whose output is of length <= n, where n is the largest power of two such that the given ring has a primitive n-th root of unity.

§Availability

This API is marked as unstable and is only available when the unstable-enable crate feature is enabled. This comes with no stability guarantees, and could be changed or removed at any time.

Source§

impl<R_main, R_twiddle, H, A> NTTConvolution<R_main, R_twiddle, H, A>
where R_main: ?Sized + ZnRing, R_twiddle: ?Sized + ZnRing, H: Homomorphism<R_twiddle, R_main> + Clone, A: Allocator + Clone,

Source

pub fn new_with_hom(hom: H, allocator: A) -> Self

Creates a new NTTConvolution.

Note that this convolution will be able to compute convolutions whose output is of length <= n, where n is the largest power of two such that the domain of the given homomorphism has a primitive n-th root of unity.

Internally, twiddle factors for the underlying NTT will be stored as elements of the domain of the given homomorphism, while the convolutions are performed over the codomain. This can be used for more efficient NTTs, see e.g. zn_64::ZnFastmul.

§Availability

This API is marked as unstable and is only available when the unstable-enable crate feature is enabled. This comes with no stability guarantees, and could be changed or removed at any time.

Source

pub fn ring(&self) -> RingRef<'_, R_main>

Returns the ring over which this object can compute convolutions.

§Availability

This API is marked as unstable and is only available when the unstable-enable crate feature is enabled. This comes with no stability guarantees, and could be changed or removed at any time.

Trait Implementations§

Source§

impl<R_main, R_twiddle, H, A> ConvolutionAlgorithm<R_main> for NTTConvolution<R_main, R_twiddle, H, A>
where R_main: ?Sized + ZnRing, R_twiddle: ?Sized + ZnRing, H: Homomorphism<R_twiddle, R_main> + Clone, A: Allocator + Clone,

Source§

type PreparedConvolutionOperand = PreparedConvolutionOperand<R_main, A>

Additional data associated to a list of ring elements, which can be used to compute a convolution where this list is one of the operands faster. Read more
Source§

fn supports_ring<S: RingStore<Type = R_main> + Copy>(&self, ring: S) -> bool

Returns whether this convolution algorithm supports computations of the given ring. Read more
Source§

fn compute_convolution<S: RingStore<Type = R_main> + Copy, V1: VectorView<<R_main as RingBase>::Element>, V2: VectorView<<R_main as RingBase>::Element>>( &self, lhs: V1, rhs: V2, dst: &mut [R_main::Element], ring: S, )

Elementwise adds the convolution of lhs and rhs to dst. Read more
Source§

fn prepare_convolution_operand<S, V>( &self, val: V, length_hint: Option<usize>, ring: S, ) -> Self::PreparedConvolutionOperand
where S: RingStore<Type = R_main> + Copy, V: VectorView<R_main::Element>,

Takes an input list of values and computes an opaque ConvolutionAlgorithm::PreparedConvolutionOperand, which can be used to compute future convolutions with this list of values faster. Read more
Source§

fn compute_convolution_prepared<S, V1, V2>( &self, lhs: V1, lhs_prep: Option<&Self::PreparedConvolutionOperand>, rhs: V2, rhs_prep: Option<&Self::PreparedConvolutionOperand>, dst: &mut [R_main::Element], ring: S, )
where S: RingStore<Type = R_main> + Copy, V1: VectorView<R_main::Element>, V2: VectorView<R_main::Element>,

Elementwise adds the convolution of lhs and rhs to dst. If provided, the given prepared convolution operands are used for a faster computation. Read more
Source§

fn compute_convolution_sum<'a, S, I, V1, V2>( &self, values: I, dst: &mut [R_main::Element], ring: S, )
where S: RingStore<Type = R_main> + Copy, I: ExactSizeIterator<Item = (V1, Option<&'a Self::PreparedConvolutionOperand>, V2, Option<&'a Self::PreparedConvolutionOperand>)>, V1: VectorView<R_main::Element>, V2: VectorView<R_main::Element>, Self: 'a, R_main: 'a,

Computes a convolution for each tuple in the given sequence, and sums the result of each convolution to dst. Read more

Auto Trait Implementations§

§

impl<R_main, R_twiddle, H, A = Global> !Freeze for NTTConvolution<R_main, R_twiddle, H, A>

§

impl<R_main, R_twiddle, H, A = Global> !RefUnwindSafe for NTTConvolution<R_main, R_twiddle, H, A>

§

impl<R_main, R_twiddle, H, A> Send for NTTConvolution<R_main, R_twiddle, H, A>
where H: Send, A: Send, <R_main as RingBase>::Element: Send, <R_twiddle as RingBase>::Element: Send, R_main: ?Sized, R_twiddle: ?Sized,

§

impl<R_main, R_twiddle, H, A> Sync for NTTConvolution<R_main, R_twiddle, H, A>
where H: Sync + Send, A: Sync, <R_main as RingBase>::Element: Sync + Send, <R_twiddle as RingBase>::Element: Sync + Send, R_main: ?Sized, R_twiddle: ?Sized,

§

impl<R_main, R_twiddle, H, A> Unpin for NTTConvolution<R_main, R_twiddle, H, A>
where H: Unpin, A: Unpin, R_main: ?Sized, R_twiddle: ?Sized,

§

impl<R_main, R_twiddle, H, A> UnwindSafe for NTTConvolution<R_main, R_twiddle, H, A>
where H: UnwindSafe + RefUnwindSafe, A: UnwindSafe, <R_main as RingBase>::Element: RefUnwindSafe + UnwindSafe, <R_twiddle as RingBase>::Element: RefUnwindSafe + UnwindSafe, R_main: ?Sized, R_twiddle: ?Sized,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.