[−][src]Trait concrete_lib::operators::math::fft::FFT
Required methods
fn reconstruct_half(slice: &mut [CTorus], big_n: usize)
fn split_in_mut_mut(
sli: &mut [CTorus],
big_n: usize
) -> (&mut [CTorus], &mut [CTorus])
sli: &mut [CTorus],
big_n: usize
) -> (&mut [CTorus], &mut [CTorus])
fn split_in_imut_mut(
sli: &mut [CTorus],
big_n: usize
) -> (&[CTorus], &mut [CTorus])
sli: &mut [CTorus],
big_n: usize
) -> (&[CTorus], &mut [CTorus])
fn split_in_mut_imut(
sli: &mut [CTorus],
big_n: usize
) -> (&mut [CTorus], &[CTorus])
sli: &mut [CTorus],
big_n: usize
) -> (&mut [CTorus], &[CTorus])
fn put_in_fft_domain_storus(
fft_b: &mut AlignedVec<CTorus>,
tmp: &mut AlignedVec<CTorus>,
coeff_b: &[Self],
twiddles: &[CTorus],
fft: &mut C2CPlanTorus
)
fft_b: &mut AlignedVec<CTorus>,
tmp: &mut AlignedVec<CTorus>,
coeff_b: &[Self],
twiddles: &[CTorus],
fft: &mut C2CPlanTorus
)
fn put_in_fft_domain_torus(
fft_b: &mut AlignedVec<CTorus>,
tmp: &mut AlignedVec<CTorus>,
coeff_b: &[Self],
twiddles: &[CTorus],
fft: &mut C2CPlanTorus
)
fft_b: &mut AlignedVec<CTorus>,
tmp: &mut AlignedVec<CTorus>,
coeff_b: &[Self],
twiddles: &[CTorus],
fft: &mut C2CPlanTorus
)
fn put_2_in_fft_domain_torus(
fft_a: &mut AlignedVec<CTorus>,
fft_b: &mut AlignedVec<CTorus>,
coeff_a: &[Self],
coeff_b: &[Self],
twiddles: &[CTorus],
fft: &mut C2CPlanTorus
)
fft_a: &mut AlignedVec<CTorus>,
fft_b: &mut AlignedVec<CTorus>,
coeff_a: &[Self],
coeff_b: &[Self],
twiddles: &[CTorus],
fft: &mut C2CPlanTorus
)
fn put_2_in_fft_domain_storus(
fft_a: &mut AlignedVec<CTorus>,
fft_b: &mut AlignedVec<CTorus>,
coeff_a: &[Self],
coeff_b: &[Self],
twiddles: &[CTorus],
fft: &mut C2CPlanTorus
)
fft_a: &mut AlignedVec<CTorus>,
fft_b: &mut AlignedVec<CTorus>,
coeff_a: &[Self],
coeff_b: &[Self],
twiddles: &[CTorus],
fft: &mut C2CPlanTorus
)
fn put_in_coeff_domain(
coeff_b: &mut [Self],
tmp: &mut AlignedVec<CTorus>,
fft_b: &mut AlignedVec<CTorus>,
inverse_twiddles: &[CTorus],
ifft: &mut C2CPlanTorus
)
coeff_b: &mut [Self],
tmp: &mut AlignedVec<CTorus>,
fft_b: &mut AlignedVec<CTorus>,
inverse_twiddles: &[CTorus],
ifft: &mut C2CPlanTorus
)
fn put_2_in_coeff_domain(
coeff_a: &mut [Self],
coeff_b: &mut [Self],
fft_a: &mut AlignedVec<CTorus>,
fft_b: &mut AlignedVec<CTorus>,
inverse_twiddles: &[CTorus],
ifft: &mut C2CPlanTorus
)
coeff_a: &mut [Self],
coeff_b: &mut [Self],
fft_a: &mut AlignedVec<CTorus>,
fft_b: &mut AlignedVec<CTorus>,
inverse_twiddles: &[CTorus],
ifft: &mut C2CPlanTorus
)
fn schoolbook_multiply(
p_res: &mut [Self],
p_tor: &[Self],
p_int: &[Self],
degree: usize
)
p_res: &mut [Self],
p_tor: &[Self],
p_int: &[Self],
degree: usize
)
fn compute_monomial_polynomial_prod_torus(
degree: usize,
p_tor: &[Self],
p_int: &[Self],
monomial: usize
) -> Self
degree: usize,
p_tor: &[Self],
p_int: &[Self],
monomial: usize
) -> Self
Implementations on Foreign Types
impl FFT for u32
[src]
fn reconstruct_half(slice: &mut [CTorus], big_n: usize)
[src]
When dealing with real polynomial of degree big_n - 1, we only need to store half of its fourier transform as one half is the conjuagate of the other half This function reconstruct a vector of size big_n using big_n / 2 values and the conjugate relationship.
Arguments
slice
- fourier representation of a real polynomialbig_n
- number of coefficients of the polynomial e.g. degree + 1
fn split_in_mut_mut(
s: &mut [CTorus],
big_n: usize
) -> (&mut [CTorus], &mut [CTorus])
[src]
s: &mut [CTorus],
big_n: usize
) -> (&mut [CTorus], &mut [CTorus])
Split a slice of CTorus elements in two mutable references
Comments
- This function uses unsafe slice::from_raw_parts_mut and as_mut_ptr
Arguments
s
- slice of CTorus elements to be splitbig_n
- length of the slice s
Example
use concrete_lib::operators::math::FFT; use concrete_lib::types::CTorus; type Torus = u32; let big_n: usize = 1024 ; let mut c: Vec<CTorus> = vec![CTorus::new(0., 0.); big_n] ; let (first, second) = <Torus as FFT>::split_in_mut_mut(&mut c, big_n) ;
fn split_in_imut_mut(
sli: &mut [CTorus],
big_n: usize
) -> (&[CTorus], &mut [CTorus])
[src]
sli: &mut [CTorus],
big_n: usize
) -> (&[CTorus], &mut [CTorus])
Split a slice of CTorus elements in a immutable reference and a mutable reference
Comments
- This function uses unsafe slice::from_raw_parts_mut and as_mut_ptr
Arguments
s
- slice of CTorus elements to be splitbig_n
- length of the slice s
Example
use concrete_lib::operators::math::FFT; use concrete_lib::types::CTorus; type Torus = u32; let big_n: usize = 1024 ; let mut c: Vec<CTorus> = vec![CTorus::new(0., 0.); big_n] ; let (first, second) = <Torus as FFT>::split_in_imut_mut(&mut c, big_n) ;
fn split_in_mut_imut(
sli: &mut [CTorus],
big_n: usize
) -> (&mut [CTorus], &[CTorus])
[src]
sli: &mut [CTorus],
big_n: usize
) -> (&mut [CTorus], &[CTorus])
Split a slice of CTorus elements in a mutable reference and a immutable reference
Comments
- This function uses unsafe slice::from_raw_parts_mut and as_mut_ptr
Arguments
s
- slice of CTorus elements to be splitbig_n
- length of the slice s
Example
use concrete_lib::operators::math::FFT; use concrete_lib::types::CTorus; type Torus = u32; let big_n: usize = 1024 ; let mut c: Vec<CTorus> = vec![CTorus::new(0., 0.); big_n] ; let (first, second) = <Torus as FFT>::split_in_mut_imut(&mut c, big_n) ;
fn put_in_fft_domain_storus(
fft_b: &mut AlignedVec<CTorus>,
tmp: &mut AlignedVec<CTorus>,
coeff_b: &[u32],
twiddles: &[CTorus],
fft: &mut C2CPlanTorus
)
[src]
fft_b: &mut AlignedVec<CTorus>,
tmp: &mut AlignedVec<CTorus>,
coeff_b: &[u32],
twiddles: &[CTorus],
fft: &mut C2CPlanTorus
)
Put a Torus polynomial into the FFT using fftw's c2C algorithm
Arguments
fft_b
- Aligned Vector of FFT(coeff_b) (output)tmp
- Aligned Vector used as temporary variablecoeff_b
- Torus slice representing a signed polynomial with Torus coefficientstwiddles
- CTorus slice containing correcting factor to work with an FFT on T[X] / (X^N-1) instead of T[X] /(X^N +1)fft
- FFTW Plan
Example
#[macro_use] use concrete_lib; use fftw::array::AlignedVec; use fftw::types::{Flag, Sign}; use fftw::plan::C2CPlan; use concrete_lib::operators::math::{Tensor, FFT} ; use concrete_lib::types::{CTorus, C2CPlanTorus}; use concrete_lib::TWIDDLES_TORUS_external; type Torus = u32; let big_n: usize = 1024; let mut fft_b: AlignedVec<CTorus> = AlignedVec::new(big_n); let mut tmp: AlignedVec<CTorus> = AlignedVec::new(big_n); // Creation of FFTW plan let mut fft: C2CPlanTorus = C2CPlan::aligned(&[big_n], Sign::Forward, Flag::Measure).unwrap(); // Create and fill a vector with Torus element let mut coeff_b: Vec<Torus> = vec![0; big_n]; Tensor::uniform_random_default(&mut coeff_b) ; FFT::put_in_fft_domain_storus( &mut fft_b, &mut tmp, &coeff_b, TWIDDLES_TORUS_external!(big_n), &mut fft, );
fn put_in_fft_domain_torus(
fft_b: &mut AlignedVec<CTorus>,
tmp: &mut AlignedVec<CTorus>,
coeff_b: &[u32],
twiddles: &[CTorus],
fft: &mut C2CPlanTorus
)
[src]
fft_b: &mut AlignedVec<CTorus>,
tmp: &mut AlignedVec<CTorus>,
coeff_b: &[u32],
twiddles: &[CTorus],
fft: &mut C2CPlanTorus
)
Put a Torus polynomial into the FFT using fftw's c2C algorithm
Arguments
fft_b
- Aligned Vector of FFT(coeff_b) (output)tmp
- Aligned Vector used as temporary variablecoeff_b
- Torus slice representing a unsigned polynomial with Torus coefficientstwiddles
- CTorus slice containing correcting factor to work with an FFT on T[X] / (X^N-1) instead of T[X] /(X^N +1)fft
- FFTW Plan
Example
#[macro_use] use concrete_lib; use fftw::array::AlignedVec; use fftw::types::{Flag, Sign}; use fftw::plan::C2CPlan; use concrete_lib::operators::math::{Tensor, FFT} ; use concrete_lib::types::{CTorus, C2CPlanTorus}; use concrete_lib::TWIDDLES_TORUS_external; type Torus = u32; let big_n: usize = 1024; let mut fft_b: AlignedVec<CTorus> = AlignedVec::new(big_n); let mut tmp: AlignedVec<CTorus> = AlignedVec::new(big_n); // Creation of FFTW plan let mut fft: C2CPlanTorus = C2CPlan::aligned(&[big_n], Sign::Forward, Flag::Measure).unwrap(); // Create and fill a vector with Torus element let mut coeff_b: Vec<Torus> = vec![0; big_n]; Tensor::uniform_random_default(&mut coeff_b) ; FFT::put_in_fft_domain_torus( &mut fft_b, &mut tmp, &coeff_b, TWIDDLES_TORUS_external!(big_n), &mut fft, );
fn put_2_in_fft_domain_torus(
fft_a: &mut AlignedVec<CTorus>,
fft_b: &mut AlignedVec<CTorus>,
coeff_a: &[u32],
coeff_b: &[u32],
twiddles: &[CTorus],
fft: &mut C2CPlanTorus
)
[src]
fft_a: &mut AlignedVec<CTorus>,
fft_b: &mut AlignedVec<CTorus>,
coeff_a: &[u32],
coeff_b: &[u32],
twiddles: &[CTorus],
fft: &mut C2CPlanTorus
)
Put two Torus polynomials into the FFT using fftw's c2C algorithm
Arguments
fft_a
- Aligned Vector of FFT(coeff_a) (output)fft_b
- Aligned Vector of FFT(coeff_b) (output)coeff_a
- Torus slice representing a polynomialcoeff_b
- Torus slice representing a polynomialtwiddles
- CTorus slice containing correcting factor to work with an FFT on T[X] / (X^N-1) instead of T[X] /(X^N +1)fft
- FFTW Plan
Example
#[macro_use] use concrete_lib; use fftw::array::AlignedVec; use fftw::types::{Flag, Sign}; use fftw::plan::C2CPlan; use concrete_lib::operators::math::{Tensor, FFT} ; use concrete_lib::types::{CTorus, C2CPlanTorus}; use concrete_lib::TWIDDLES_TORUS_external; type Torus = u32; let big_n: usize = 1024; let mut fft_a: AlignedVec<CTorus> = AlignedVec::new(big_n); let mut fft_b: AlignedVec<CTorus> = AlignedVec::new(big_n); // Creation of FFTW plan let mut fft: C2CPlanTorus = C2CPlan::aligned(&[big_n], Sign::Forward, Flag::Measure).unwrap(); // Create and fill a vector with Torus element let mut coeff_a: Vec<Torus> = vec![0; big_n]; Tensor::uniform_random_default(&mut coeff_a) ; let mut coeff_b: Vec<Torus> = vec![0; big_n]; Tensor::uniform_random_default(&mut coeff_b) ; FFT::put_2_in_fft_domain_torus( &mut fft_a, &mut fft_b, &coeff_a, &coeff_b, TWIDDLES_TORUS_external!(big_n), &mut fft, );
fn put_2_in_fft_domain_storus(
fft_a: &mut AlignedVec<CTorus>,
fft_b: &mut AlignedVec<CTorus>,
coeff_a: &[u32],
coeff_b: &[u32],
twiddles: &[CTorus],
fft: &mut C2CPlanTorus
)
[src]
fft_a: &mut AlignedVec<CTorus>,
fft_b: &mut AlignedVec<CTorus>,
coeff_a: &[u32],
coeff_b: &[u32],
twiddles: &[CTorus],
fft: &mut C2CPlanTorus
)
Put two Torus polynomials into the FFT using fftw's c2C algorithm
Arguments
fft_a
- Aligned Vector of FFT(coeff_a) (output)fft_b
- Aligned Vector of FFT(coeff_b) (output)coeff_a
- Torus slice representing a polynomialcoeff_b
- Torus slice representing a polynomialtwiddles
- CTorus slice containing correcting factor to work with an FFT on T[X] / (X^N-1) instead of T[X] /(X^N +1)fft
- FFTW Plan
Example
#[macro_use] use concrete_lib; use fftw::array::AlignedVec; use fftw::types::{Flag, Sign}; use fftw::plan::C2CPlan; use concrete_lib::operators::math::{Tensor, FFT} ; use concrete_lib::types::{CTorus, C2CPlanTorus}; use concrete_lib::TWIDDLES_TORUS_external; type Torus = u32; let big_n: usize = 1024; let mut fft_a: AlignedVec<CTorus> = AlignedVec::new(big_n); let mut fft_b: AlignedVec<CTorus> = AlignedVec::new(big_n); // Creation of FFTW plan let mut fft: C2CPlanTorus = C2CPlan::aligned(&[big_n], Sign::Forward, Flag::Measure).unwrap(); // Create and fill a vector with Torus element let mut coeff_a: Vec<Torus> = vec![0; big_n]; Tensor::uniform_random_default(&mut coeff_a) ; let mut coeff_b: Vec<Torus> = vec![0; big_n]; Tensor::uniform_random_default(&mut coeff_b) ; FFT::put_2_in_fft_domain_storus( &mut fft_a, &mut fft_b, &coeff_a, &coeff_b, TWIDDLES_TORUS_external!(big_n), &mut fft, );
fn put_in_coeff_domain(
coeff_b: &mut [u32],
tmp: &mut AlignedVec<CTorus>,
fft_b: &mut AlignedVec<CTorus>,
inverse_twiddles: &[CTorus],
ifft: &mut C2CPlanTorus
)
[src]
coeff_b: &mut [u32],
tmp: &mut AlignedVec<CTorus>,
fft_b: &mut AlignedVec<CTorus>,
inverse_twiddles: &[CTorus],
ifft: &mut C2CPlanTorus
)
Perform the IFFT using fftw's c2C algorithm
Arguments
coeff_b
- Torus slice representing a polynomial (output)tmp
- Aligned Vector used as temporary variablefft_b
- Aligned Vector of FFT(coeff_b)inverse_twiddles
- CTorus slice containing correcting factor to work with an FFT on T[X] / (X^N-1) instead of T[X] /(X^N +1)ifft
- FFTW Plan for backward FFT
Example
#[macro_use] use concrete_lib; use fftw::array::AlignedVec; use fftw::types::{Flag, Sign}; use fftw::plan::C2CPlan; use concrete_lib::operators::math::{Tensor, FFT} ; use concrete_lib::types::{CTorus, C2CPlanTorus}; use concrete_lib::INVERSE_TWIDDLES_TORUS_external; type Torus = u32; let big_n: usize = 1024; let mut fft_b: AlignedVec<CTorus> = AlignedVec::new(big_n); let mut tmp: AlignedVec<CTorus> = AlignedVec::new(big_n); // Creation of FFTW plan let mut ifft: C2CPlanTorus = C2CPlan::aligned(&[big_n], Sign::Backward, Flag::Measure).unwrap(); let mut coeff_b: Vec<Torus> = vec![0; big_n]; FFT::put_in_coeff_domain( &mut coeff_b, &mut tmp, &mut fft_b, INVERSE_TWIDDLES_TORUS_external!(big_n), &mut ifft, );
fn put_2_in_coeff_domain(
coeff_a: &mut [u32],
coeff_b: &mut [u32],
fft_a: &mut AlignedVec<CTorus>,
fft_b: &mut AlignedVec<CTorus>,
inverse_twiddles: &[CTorus],
ifft: &mut C2CPlanTorus
)
[src]
coeff_a: &mut [u32],
coeff_b: &mut [u32],
fft_a: &mut AlignedVec<CTorus>,
fft_b: &mut AlignedVec<CTorus>,
inverse_twiddles: &[CTorus],
ifft: &mut C2CPlanTorus
)
Perform the IFFT of two polynomials using fftw's c2C algorithm
Arguments
coeff_a
- Torus slice representing a polynomial (output)coeff_b
- Torus slice representing a polynomial (output)fft_a
- Aligned Vector of FFT(coeff_a)fft_b
- Aligned Vector of FFT(coeff_b)inverse_twiddles
- CTorus slice containing correcting factor to work with an FFT on T[X] / (X^N-1) instead of T[X] /(X^N +1)ifft
- FFTW Plan for backward FFT
Example
#[macro_use] use concrete_lib; use fftw::array::AlignedVec; use fftw::types::{Flag, Sign}; use fftw::plan::C2CPlan; use concrete_lib::operators::math::{Tensor, FFT} ; use concrete_lib::types::{CTorus, C2CPlanTorus}; use concrete_lib::INVERSE_TWIDDLES_TORUS_external; type Torus = u32; let big_n: usize = 1024; let mut fft_a: AlignedVec<CTorus> = AlignedVec::new(big_n); let mut fft_b: AlignedVec<CTorus> = AlignedVec::new(big_n); // Creation of FFTW plan let mut ifft: C2CPlanTorus = C2CPlan::aligned(&[big_n], Sign::Backward, Flag::Measure).unwrap(); let mut coeff_a: Vec<Torus> = vec![0; big_n]; let mut coeff_b: Vec<Torus> = vec![0; big_n]; FFT::put_2_in_coeff_domain( &mut coeff_a, &mut coeff_b, &mut fft_a, &mut fft_b, INVERSE_TWIDDLES_TORUS_external!(big_n), &mut ifft, );
fn schoolbook_multiply(
p_res: &mut [u32],
p_tor: &[u32],
p_int: &[u32],
degree: usize
)
[src]
p_res: &mut [u32],
p_tor: &[u32],
p_int: &[u32],
degree: usize
)
stores in p_res (torus polynomial) the result of p_tor * p_int (without FFT, quotient X^big_n + 1) p_tor : torus polynomial p_int : integer polynomial
fn compute_monomial_polynomial_prod_torus(
degree: usize,
p_tor: &[u32],
p_int: &[u32],
monomial: usize
) -> u32
[src]
degree: usize,
p_tor: &[u32],
p_int: &[u32],
monomial: usize
) -> u32
computes the coefficient of the monomial-th monomial of the product of p_tor and p_int (without FFT, quotient X^big_n + 1)
impl FFT for u64
[src]
fn reconstruct_half(slice: &mut [CTorus], big_n: usize)
[src]
When dealing with real polynomial of degree big_n - 1, we only need to store half of its fourier transform as one half is the conjuagate of the other half This function reconstruct a vector of size big_n using big_n / 2 values and the conjugate relationship.
Arguments
slice
- fourier representation of a real polynomialbig_n
- number of coefficients of the polynomial e.g. degree + 1
fn split_in_mut_mut(
s: &mut [CTorus],
big_n: usize
) -> (&mut [CTorus], &mut [CTorus])
[src]
s: &mut [CTorus],
big_n: usize
) -> (&mut [CTorus], &mut [CTorus])
Split a slice of CTorus elements in two mutable references
Comments
- This function uses unsafe slice::from_raw_parts_mut and as_mut_ptr
Arguments
s
- slice of CTorus elements to be splitbig_n
- length of the slice s
Example
use concrete_lib::operators::math::FFT; use concrete_lib::types::CTorus; type Torus = u64; let big_n: usize = 1024 ; let mut c: Vec<CTorus> = vec![CTorus::new(0., 0.); big_n] ; let (first, second) = <Torus as FFT>::split_in_mut_mut(&mut c, big_n) ;
fn split_in_imut_mut(
sli: &mut [CTorus],
big_n: usize
) -> (&[CTorus], &mut [CTorus])
[src]
sli: &mut [CTorus],
big_n: usize
) -> (&[CTorus], &mut [CTorus])
Split a slice of CTorus elements in a immutable reference and a mutable reference
Comments
- This function uses unsafe slice::from_raw_parts_mut and as_mut_ptr
Arguments
s
- slice of CTorus elements to be splitbig_n
- length of the slice s
Example
use concrete_lib::operators::math::FFT; use concrete_lib::types::CTorus; type Torus = u64; let big_n: usize = 1024 ; let mut c: Vec<CTorus> = vec![CTorus::new(0., 0.); big_n] ; let (first, second) = <Torus as FFT>::split_in_imut_mut(&mut c, big_n) ;
fn split_in_mut_imut(
sli: &mut [CTorus],
big_n: usize
) -> (&mut [CTorus], &[CTorus])
[src]
sli: &mut [CTorus],
big_n: usize
) -> (&mut [CTorus], &[CTorus])
Split a slice of CTorus elements in a mutable reference and a immutable reference
Comments
- This function uses unsafe slice::from_raw_parts_mut and as_mut_ptr
Arguments
s
- slice of CTorus elements to be splitbig_n
- length of the slice s
Example
use concrete_lib::operators::math::FFT; use concrete_lib::types::CTorus; type Torus = u64; let big_n: usize = 1024 ; let mut c: Vec<CTorus> = vec![CTorus::new(0., 0.); big_n] ; let (first, second) = <Torus as FFT>::split_in_mut_imut(&mut c, big_n) ;
fn put_in_fft_domain_storus(
fft_b: &mut AlignedVec<CTorus>,
tmp: &mut AlignedVec<CTorus>,
coeff_b: &[u64],
twiddles: &[CTorus],
fft: &mut C2CPlanTorus
)
[src]
fft_b: &mut AlignedVec<CTorus>,
tmp: &mut AlignedVec<CTorus>,
coeff_b: &[u64],
twiddles: &[CTorus],
fft: &mut C2CPlanTorus
)
Put a Torus polynomial into the FFT using fftw's c2C algorithm
Arguments
fft_b
- Aligned Vector of FFT(coeff_b) (output)tmp
- Aligned Vector used as temporary variablecoeff_b
- Torus slice representing a signed polynomial with Torus coefficientstwiddles
- CTorus slice containing correcting factor to work with an FFT on T[X] / (X^N-1) instead of T[X] /(X^N +1)fft
- FFTW Plan
Example
#[macro_use] use concrete_lib; use fftw::array::AlignedVec; use fftw::types::{Flag, Sign}; use fftw::plan::C2CPlan; use concrete_lib::operators::math::{Tensor, FFT} ; use concrete_lib::types::{CTorus, C2CPlanTorus}; use concrete_lib::TWIDDLES_TORUS_external; type Torus = u64; let big_n: usize = 1024; let mut fft_b: AlignedVec<CTorus> = AlignedVec::new(big_n); let mut tmp: AlignedVec<CTorus> = AlignedVec::new(big_n); // Creation of FFTW plan let mut fft: C2CPlanTorus = C2CPlan::aligned(&[big_n], Sign::Forward, Flag::Measure).unwrap(); // Create and fill a vector with Torus element let mut coeff_b: Vec<Torus> = vec![0; big_n]; Tensor::uniform_random_default(&mut coeff_b) ; FFT::put_in_fft_domain_storus( &mut fft_b, &mut tmp, &coeff_b, TWIDDLES_TORUS_external!(big_n), &mut fft, );
fn put_in_fft_domain_torus(
fft_b: &mut AlignedVec<CTorus>,
tmp: &mut AlignedVec<CTorus>,
coeff_b: &[u64],
twiddles: &[CTorus],
fft: &mut C2CPlanTorus
)
[src]
fft_b: &mut AlignedVec<CTorus>,
tmp: &mut AlignedVec<CTorus>,
coeff_b: &[u64],
twiddles: &[CTorus],
fft: &mut C2CPlanTorus
)
Put a Torus polynomial into the FFT using fftw's c2C algorithm
Arguments
fft_b
- Aligned Vector of FFT(coeff_b) (output)tmp
- Aligned Vector used as temporary variablecoeff_b
- Torus slice representing a unsigned polynomial with Torus coefficientstwiddles
- CTorus slice containing correcting factor to work with an FFT on T[X] / (X^N-1) instead of T[X] /(X^N +1)fft
- FFTW Plan
Example
#[macro_use] use concrete_lib; use fftw::array::AlignedVec; use fftw::types::{Flag, Sign}; use fftw::plan::C2CPlan; use concrete_lib::operators::math::{Tensor, FFT} ; use concrete_lib::types::{CTorus, C2CPlanTorus}; use concrete_lib::TWIDDLES_TORUS_external; type Torus = u64; let big_n: usize = 1024; let mut fft_b: AlignedVec<CTorus> = AlignedVec::new(big_n); let mut tmp: AlignedVec<CTorus> = AlignedVec::new(big_n); // Creation of FFTW plan let mut fft: C2CPlanTorus = C2CPlan::aligned(&[big_n], Sign::Forward, Flag::Measure).unwrap(); // Create and fill a vector with Torus element let mut coeff_b: Vec<Torus> = vec![0; big_n]; Tensor::uniform_random_default(&mut coeff_b) ; FFT::put_in_fft_domain_torus( &mut fft_b, &mut tmp, &coeff_b, TWIDDLES_TORUS_external!(big_n), &mut fft, );
fn put_2_in_fft_domain_torus(
fft_a: &mut AlignedVec<CTorus>,
fft_b: &mut AlignedVec<CTorus>,
coeff_a: &[u64],
coeff_b: &[u64],
twiddles: &[CTorus],
fft: &mut C2CPlanTorus
)
[src]
fft_a: &mut AlignedVec<CTorus>,
fft_b: &mut AlignedVec<CTorus>,
coeff_a: &[u64],
coeff_b: &[u64],
twiddles: &[CTorus],
fft: &mut C2CPlanTorus
)
Put two Torus polynomials into the FFT using fftw's c2C algorithm
Arguments
fft_a
- Aligned Vector of FFT(coeff_a) (output)fft_b
- Aligned Vector of FFT(coeff_b) (output)coeff_a
- Torus slice representing a polynomialcoeff_b
- Torus slice representing a polynomialtwiddles
- CTorus slice containing correcting factor to work with an FFT on T[X] / (X^N-1) instead of T[X] /(X^N +1)fft
- FFTW Plan
Example
#[macro_use] use concrete_lib; use fftw::array::AlignedVec; use fftw::types::{Flag, Sign}; use fftw::plan::C2CPlan; use concrete_lib::operators::math::{Tensor, FFT} ; use concrete_lib::types::{CTorus, C2CPlanTorus}; use concrete_lib::TWIDDLES_TORUS_external; type Torus = u64; let big_n: usize = 1024; let mut fft_a: AlignedVec<CTorus> = AlignedVec::new(big_n); let mut fft_b: AlignedVec<CTorus> = AlignedVec::new(big_n); // Creation of FFTW plan let mut fft: C2CPlanTorus = C2CPlan::aligned(&[big_n], Sign::Forward, Flag::Measure).unwrap(); // Create and fill a vector with Torus element let mut coeff_a: Vec<Torus> = vec![0; big_n]; Tensor::uniform_random_default(&mut coeff_a) ; let mut coeff_b: Vec<Torus> = vec![0; big_n]; Tensor::uniform_random_default(&mut coeff_b) ; FFT::put_2_in_fft_domain_torus( &mut fft_a, &mut fft_b, &coeff_a, &coeff_b, TWIDDLES_TORUS_external!(big_n), &mut fft, );
fn put_2_in_fft_domain_storus(
fft_a: &mut AlignedVec<CTorus>,
fft_b: &mut AlignedVec<CTorus>,
coeff_a: &[u64],
coeff_b: &[u64],
twiddles: &[CTorus],
fft: &mut C2CPlanTorus
)
[src]
fft_a: &mut AlignedVec<CTorus>,
fft_b: &mut AlignedVec<CTorus>,
coeff_a: &[u64],
coeff_b: &[u64],
twiddles: &[CTorus],
fft: &mut C2CPlanTorus
)
Put two Torus polynomials into the FFT using fftw's c2C algorithm
Arguments
fft_a
- Aligned Vector of FFT(coeff_a) (output)fft_b
- Aligned Vector of FFT(coeff_b) (output)coeff_a
- Torus slice representing a polynomialcoeff_b
- Torus slice representing a polynomialtwiddles
- CTorus slice containing correcting factor to work with an FFT on T[X] / (X^N-1) instead of T[X] /(X^N +1)fft
- FFTW Plan
Example
#[macro_use] use concrete_lib; use fftw::array::AlignedVec; use fftw::types::{Flag, Sign}; use fftw::plan::C2CPlan; use concrete_lib::operators::math::{Tensor, FFT} ; use concrete_lib::types::{CTorus, C2CPlanTorus}; use concrete_lib::TWIDDLES_TORUS_external; type Torus = u64; let big_n: usize = 1024; let mut fft_a: AlignedVec<CTorus> = AlignedVec::new(big_n); let mut fft_b: AlignedVec<CTorus> = AlignedVec::new(big_n); // Creation of FFTW plan let mut fft: C2CPlanTorus = C2CPlan::aligned(&[big_n], Sign::Forward, Flag::Measure).unwrap(); // Create and fill a vector with Torus element let mut coeff_a: Vec<Torus> = vec![0; big_n]; Tensor::uniform_random_default(&mut coeff_a) ; let mut coeff_b: Vec<Torus> = vec![0; big_n]; Tensor::uniform_random_default(&mut coeff_b) ; FFT::put_2_in_fft_domain_storus( &mut fft_a, &mut fft_b, &coeff_a, &coeff_b, TWIDDLES_TORUS_external!(big_n), &mut fft, );
fn put_in_coeff_domain(
coeff_b: &mut [u64],
tmp: &mut AlignedVec<CTorus>,
fft_b: &mut AlignedVec<CTorus>,
inverse_twiddles: &[CTorus],
ifft: &mut C2CPlanTorus
)
[src]
coeff_b: &mut [u64],
tmp: &mut AlignedVec<CTorus>,
fft_b: &mut AlignedVec<CTorus>,
inverse_twiddles: &[CTorus],
ifft: &mut C2CPlanTorus
)
Perform the IFFT using fftw's c2C algorithm
Arguments
coeff_b
- Torus slice representing a polynomial (output)tmp
- Aligned Vector used as temporary variablefft_b
- Aligned Vector of FFT(coeff_b)inverse_twiddles
- CTorus slice containing correcting factor to work with an FFT on T[X] / (X^N-1) instead of T[X] /(X^N +1)ifft
- FFTW Plan for backward FFT
Example
#[macro_use] use concrete_lib; use fftw::array::AlignedVec; use fftw::types::{Flag, Sign}; use fftw::plan::C2CPlan; use concrete_lib::operators::math::{Tensor, FFT} ; use concrete_lib::types::{CTorus, C2CPlanTorus}; use concrete_lib::INVERSE_TWIDDLES_TORUS_external; type Torus = u64; let big_n: usize = 1024; let mut fft_b: AlignedVec<CTorus> = AlignedVec::new(big_n); let mut tmp: AlignedVec<CTorus> = AlignedVec::new(big_n); // Creation of FFTW plan let mut ifft: C2CPlanTorus = C2CPlan::aligned(&[big_n], Sign::Backward, Flag::Measure).unwrap(); let mut coeff_b: Vec<Torus> = vec![0; big_n]; FFT::put_in_coeff_domain( &mut coeff_b, &mut tmp, &mut fft_b, INVERSE_TWIDDLES_TORUS_external!(big_n), &mut ifft, );
fn put_2_in_coeff_domain(
coeff_a: &mut [u64],
coeff_b: &mut [u64],
fft_a: &mut AlignedVec<CTorus>,
fft_b: &mut AlignedVec<CTorus>,
inverse_twiddles: &[CTorus],
ifft: &mut C2CPlanTorus
)
[src]
coeff_a: &mut [u64],
coeff_b: &mut [u64],
fft_a: &mut AlignedVec<CTorus>,
fft_b: &mut AlignedVec<CTorus>,
inverse_twiddles: &[CTorus],
ifft: &mut C2CPlanTorus
)
Perform the IFFT of two polynomials using fftw's c2C algorithm
Arguments
coeff_a
- Torus slice representing a polynomial (output)coeff_b
- Torus slice representing a polynomial (output)fft_a
- Aligned Vector of FFT(coeff_a)fft_b
- Aligned Vector of FFT(coeff_b)inverse_twiddles
- CTorus slice containing correcting factor to work with an FFT on T[X] / (X^N-1) instead of T[X] /(X^N +1)ifft
- FFTW Plan for backward FFT
Example
#[macro_use] use concrete_lib; use fftw::array::AlignedVec; use fftw::types::{Flag, Sign}; use fftw::plan::C2CPlan; use concrete_lib::operators::math::{Tensor, FFT} ; use concrete_lib::types::{CTorus, C2CPlanTorus}; use concrete_lib::INVERSE_TWIDDLES_TORUS_external; type Torus = u64; let big_n: usize = 1024; let mut fft_a: AlignedVec<CTorus> = AlignedVec::new(big_n); let mut fft_b: AlignedVec<CTorus> = AlignedVec::new(big_n); // Creation of FFTW plan let mut ifft: C2CPlanTorus = C2CPlan::aligned(&[big_n], Sign::Backward, Flag::Measure).unwrap(); let mut coeff_a: Vec<Torus> = vec![0; big_n]; let mut coeff_b: Vec<Torus> = vec![0; big_n]; FFT::put_2_in_coeff_domain( &mut coeff_a, &mut coeff_b, &mut fft_a, &mut fft_b, INVERSE_TWIDDLES_TORUS_external!(big_n), &mut ifft, );
fn schoolbook_multiply(
p_res: &mut [u64],
p_tor: &[u64],
p_int: &[u64],
degree: usize
)
[src]
p_res: &mut [u64],
p_tor: &[u64],
p_int: &[u64],
degree: usize
)
stores in p_res (torus polynomial) the result of p_tor * p_int (without FFT, quotient X^big_n + 1) p_tor : torus polynomial p_int : integer polynomial
fn compute_monomial_polynomial_prod_torus(
degree: usize,
p_tor: &[u64],
p_int: &[u64],
monomial: usize
) -> u64
[src]
degree: usize,
p_tor: &[u64],
p_int: &[u64],
monomial: usize
) -> u64
computes the coefficient of the monomial-th monomial of the product of p_tor and p_int (without FFT, quotient X^big_n + 1)