@IceTDrinker
I am unable to compute multiplication using the shortint_sk.smart_mul_lsb_assign(). I get error current parameters can’t be used to make a bivariate function evaluation.
Same code was working earlier. I am using standard shortint parameters and have tried with different shortint parameters, to get same error for all.
What could be the reason
The carry modulus needs to be >= to the message modulus for bivariate functions
How do I make sure this happens?
Also in version 0.6.1 I see that for integers operation scalar_eq_parallelized function the return structure is a BooleanBlock instead of RadicCiphertext. The question is saying I want to use the result from scalar_eq_parallelized to multiply/add with a RadixCipher, earlier it used to be a direct operation. How do you suggest I do it now?
It is in the API reference
1 Like
Here is my code snippet
let cipher = sks.smart_scalar_eq_parallelized(&ip, 0u64);
cipher.into_radix(&num_blocks, &sks);
let blocks = cipher.blocks()
This results in error method not found for BooleanBlock in last line of code. What am I doing wrong here?
If you need access to the blocks you need to import the following trait
with use tfhe::integer::IntegerCiphertext
if you just want the ciphertext in the boolean block you can call into_inner
I am already using
use::tfhe::integer::IntegerCiphertext
The concern is into_radix function is not converting the BooleanBlock into a RadixCiphertext, because if it was, i would not get the error that BooleanBlocks doesn’t have blocks method
I want to use multiply 2 shortint ciphertexts and then add the result to a radixCiphertext, that is why I am using blocks
Please share a github repository with the code causing problems
Thanks
a version that compiles, you were misusing the into_radix function which returns a value.
I added a comment that you should read as you seem to be using the wrong block of the boolean as a radix to get the data you are interested in
use tfhe::integer::{gen_keys_radix, IntegerCiphertext, RadixCiphertext};
use tfhe::shortint::parameters::PARAM_MESSAGE_2_CARRY_2;
fn main() {
let num_blocks = 4;
let (cks, sks) = gen_keys_radix(PARAM_MESSAGE_2_CARRY_2, num_blocks);
let num = 47u8;
let mut cipher = cks.encrypt(num);
let shortint_sk: tfhe::shortint::ServerKey = sks.clone().into();
let mut output: RadixCiphertext = sks.create_trivial_radix(0u64, num_blocks);
let mut res1 = sks.smart_scalar_eq_parallelized(&mut cipher, 47);
let mut res2 = shortint_sk.create_trivial(1);
let mut res1_as_radix: RadixCiphertext = res1.into_radix(num_blocks, &sks);
let res1_blocks = res1_as_radix.blocks_mut();
// Warning data is stored in Little endian order, if you want to have access to the 0 or the 1
// from the boolean block you need to use res1_blocks[0]
shortint_sk.smart_mul_lsb_assign(&mut res1_blocks[num_blocks - 1], &mut res2);
sks.smart_add_assign_parallelized(&mut output, &mut res1_as_radix);
}
1 Like
Say I have another encrypted Boolean like
let b1 = cks.encrypt_bool(true)
Now I want to do a boolean operation with variable res1, how do I generate the Boolean supported server_key to this operation?
The tfhe::integer::ServerKey
supports operations with BooleanBlock, they are prefixed with boolean_
Hmm, interesting. So say I have compared two FheUint8 variables, the result is stored in BooleanBlock. What will be the size of this BooleanBlock? Is it one bit or 8 bit? To be more precise how are these BooleanBlock represented in terms of LWE ciphers?
They are just 1 block, so 1 LWE
1 Like