8 releases

0.3.0 Oct 19, 2022
0.2.2 Jul 6, 2022
0.2.1 Apr 6, 2022
0.2.0 Feb 1, 2022
0.1.6 Mar 25, 2021

#2303 in Cryptography

Download history 37/week @ 2023-10-26 16/week @ 2023-11-02 39/week @ 2023-11-09 48/week @ 2023-11-16 28/week @ 2023-11-23 51/week @ 2023-11-30 19/week @ 2023-12-07 23/week @ 2023-12-14 46/week @ 2023-12-21 22/week @ 2023-12-28 26/week @ 2024-01-04 22/week @ 2024-01-11 40/week @ 2024-01-18 68/week @ 2024-01-25 21/week @ 2024-02-01 36/week @ 2024-02-08

167 downloads per month
Used in concrete-core-experimenta…


48K SLoC

Concrete Noise Propagation Estimator

This crate contains tools to estimate the propagation of noise in ciphertexts, for the homomorphic operators defined in the concrete-core library, you can find it here in this repo.


This software is distributed under the BSD-3-Clause-Clear license. If you have any questions, please contact us at hello@zama.ai.


Welcome the the concrete-npe documentation!


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.


use concrete_core::prelude::{DispersionParameter, Variance};
use concrete_npe::estimate_addition_noise;
//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::<_, _>(var1, var2, 64);
println!("Expect Variance (2^24) =  {}", 2_f64.powi(-24));
println!("Output Variance {}", var_out.get_variance());
assert!((2_f64.powi(-24) - var_out.get_variance()).abs() < 0.0001);