Comment on page
One of the most common operations in Concrete is
Table Lookups(TLUs). TLUs are performed with an FHE operation called
Programmable Bootstrapping(PBS). PBS's have a certain probability of error, which, when triggered, result in inaccurate results.
Let's say you have the table:
lut = [0, 1, 4, 9, 16, 25, 36, 49, 64]
And you perform a Table Lookup using
4. The result you should get is
lut = 16, but because of the possibility of error, you could get any other value in the table.
The probability of this error can be configured through the
global_p_errorconfiguration options. The difference between these two options is that,
p_erroris for individual TLUs but
global_p_erroris for the whole circuit.
If you set
0.01, for example, it means every TLU in the circuit will have a 99% chance of being exact with a 1% probability of error. If you have a single TLU in the circuit,
global_p_errorwould be 1% as well. But if you have 2 TLUs for example,
global_p_errorwould be almost 2% (
1 - (0.99 * 0.99)).
However, if you set
0.01, the whole circuit will have 1% probability of error, no matter how many Table Lookups are included.
If you set both of them, both will be satisfied. Essentially, the stricter one will be used.
By default, both
global_p_erroris set to
None, which results in a
1 / 100_000being used.
Configuring either of those variables impacts computation time (compilation, keys generation, circuit execution) and space requirements (size of the keys on disk and in memory). Lower error probabilities would result in longer computation times and larger space requirements.