Function concrete_core::crypto::cross::bootstrap[][src]

pub fn bootstrap<OutCont, InCont, BskCont, AccCont, Scalar>(
    lwe_out: &mut LweCiphertext<OutCont>,
    lwe_in: &LweCiphertext<InCont>,
    bootstrap_key: &BootstrapKey<BskCont>,
    accumulator: &mut GlweCiphertext<AccCont>
) where
    LweCiphertext<OutCont>: AsMutTensor<Element = Scalar>,
    LweCiphertext<InCont>: AsRefTensor<Element = Scalar>,
    BootstrapKey<BskCont>: AsMutTensor<Element = Complex64>,
    GlweCiphertext<AccCont>: AsMutTensor<Element = Scalar>,
    Scalar: UnsignedTorus

Performs the bootstrapping of an LWE ciphertext, with a bootstrapping key.

Example

use concrete_core::crypto::bootstrap::BootstrapKey;
use concrete_core::crypto::{GlweSize, LweSize, LweDimension, GlweDimension};
use concrete_core::math::decomposition::{DecompositionLevelCount, DecompositionBaseLog};
use concrete_core::math::polynomial::PolynomialSize;
use concrete_core::crypto::secret::{LweSecretKey, GlweSecretKey};
use concrete_core::math::dispersion::LogStandardDev;
use concrete_core::crypto::lwe::LweCiphertext;
use concrete_core::crypto::glwe::GlweCiphertext;
use concrete_core::crypto::cross::bootstrap;
use concrete_core::math::fft::Complex64;
let (lwe_dim, glwe_dim, poly_size) = (LweDimension(4), GlweDimension(6), PolynomialSize(512));
let (dec_lc, dec_bl) = (DecompositionLevelCount(3), DecompositionBaseLog(5));
let mut bsk = BootstrapKey::allocate(
    9u32,
    glwe_dim.to_glwe_size(),
    poly_size,
    dec_lc,
    dec_bl,
    lwe_dim
);
let lwe_sk = LweSecretKey::generate(lwe_dim);
let glwe_sk = GlweSecretKey::generate(glwe_dim, poly_size);
bsk.fill_with_new_key(&lwe_sk, &glwe_sk, LogStandardDev::from_log_standard_dev(-15.));
let mut frr_bsk = BootstrapKey::allocate_complex(
    Complex64::new(0.,0.),
    glwe_dim.to_glwe_size(),
    poly_size,
    dec_lc,
    dec_bl,
    lwe_dim
);
frr_bsk.fill_with_forward_fourier(&bsk);
let lwe_in = LweCiphertext::allocate(9u32, lwe_dim.to_lwe_size());
let mut lwe_out = LweCiphertext::allocate(9u32, LweSize(glwe_dim.0 * poly_size.0 + 1));
let mut accumulator = GlweCiphertext::allocate(0u32, poly_size, glwe_dim.to_glwe_size());
bootstrap(&mut lwe_out, &lwe_in, &frr_bsk, &mut accumulator);