# Crate concrete_npe

Expand description

Welcome the the concrete-npe documentation!

## Description

This library makes it possible to estimate the noise propagation after homomorphic operations. It makes it possible to obtain characteristics of the output distribution of the noise, that we call dispersion, which regroups the variance and expectation. This is particularly useful to track the noise growth during the homomorphic evaluation of a circuit. The explanations and the proofs of these formula can be found in the appendices of the article Improved Programmable Bootstrapping with Larger Precision and Efficient Arithmetic Circuits for TFHE by Ilaria Chillotti, Damien Ligier, Jean-Baptiste Orfila and Samuel Tap.

## Quick Example

The following piece of code shows how to obtain the variance $\sigma_{add}$ of the noise after a simulated homomorphic addition between two ciphertexts which have variances $\sigma_{ct_1}$ and $\sigma_{ct_2}$, respectively.

## Example:

use concrete_commons::dispersion::{DispersionParameter, Variance};
//We suppose that the two ciphertexts have the same variance.
let var1 = Variance(2_f64.powf(-25.));
let var2 = Variance(2_f64.powf(-25.));

//We call the npe to estimate characteristics of the noise after an addition
//between these two variances.
//Here, we assume that ciphertexts are encoded over 64 bits.
let var_out = estimate_addition_noise::<u64, _, _>(var1, var2);
println!("Expect Variance (2^24) =  {}", f64::powi(2., -24));
println!("Output Variance {}", var_out.get_variance());
assert!((f64::powi(2., -24) - var_out.get_variance()).abs() < 0.0001);

## Traits

This trait contains functions related to the dispersion of secret key coefficients, and operations related to the secret keys (e.g., products of secret keys).

## Functions

Computes the dispersion of an addition of two uncorrelated ciphertexts.

Computes the dispersion of a CMUX controlled with a GGSW encrypting binary keys.

Computes the dispersion of an external product (between and RLWE and a GGSW) encrypting a binary keys (i.e., as in TFHE PBS).

Computes the dispersion of a multiplication of a ciphertext by a scalar.

Computes the dispersion of the constant terms of a GLWE after an LWE to GLWE keyswitch.

Computes the dispersion of the non-constant GLWE terms after an LWE to GLWE keyswitch.

Computes the dispersion of a modulus switching of an LWE encrypted with binary keys.

Computes the dispersion of the bits greater than $q$ after a modulus switching.

Computes the dispersion of a GLWE multiplication between two GLWEs (i.e., a tensor product followed by a relinearization).

Computes the number of bits affected by the noise with a dispersion describing a normal distribution.

Computes the dispersion of a PBS a la TFHE (i.e., the GGSW encrypts a binary keys, and the initial noise for the RLWE is equal to zero).

Computes the dispersion of a multiplication between an RLWE ciphertext and a scalar polynomial.

Computes the dispersion of a GLWE after relinearization.

Computes the dispersion of an addition of several uncorrelated ciphertexts.

Computes the dispersion of a tensor product between two independent GLWEs given a set of parameters.

Computes the dispersion of a multisum between uncorrelated ciphertexts and scalar weights $w_i$ i.e., $\sigma_{out}^2 = \sum_i w_i^2 * \sigma_i^2$.