I have been trying to find multiplication between two ciphertexts, but it seems like a possible way is to use a function ‘mul_from_bootstrap_nth’ located in ‘concrete/src/vector_lwe’.

The problem is that this operation allows multiplication between two ciphertexts while performing two additional bootstrapping procedures which makes the runtime longer than expected.

So, I was wondering if there is a multiplication operation between two ciphertexts that does not require bootstrapping, more precisely, leveled version of multiplication between two ciphertexts.

You are right: currently concrete does not implement ciphertext multiplications without using bootstrappings. However, we will release this feature very soon! More precisely, the solution is based on the article (https://eprint.iacr.org/2021/729.pdf) showing that it is possible to use the BFV leveled multiplication within TFHE.

I was aware of the paper(https://eprint.iacr.org/2021/729.pdf) that you’ve mentioned about regarding BFV-style ciphertext multiplication of TFHE. So, I assumed that Concrete library would probably include this operation at certain part of the library.

Since you’ve said that the BFV-style multiplication operation would be in release very soon, I was wondering if you could kindly give us a bit of hint when this update will be held. Our team is working on a project that requires ciphertext multiplication and it would be a great help to know if the update is held before the mid of April. Otherwise, our team would have to find the other way.

Thank you very much for the reply and hope to hear from you soon.

Hi @alex, we have found some of the difficulties in using the Concrete library, and here is one of the significant issues that we would like to share.

→ After using ‘mul_from_bootstrap_nth’, the padding bits and precision are lost, likely to provide inaccurate results. Thus, we found it hard to reach a certain level of accuracy. For example, suppose if we want to divide by plaintext n to the result of the ‘mul_from_bootstrap_nth’ operation, then we would multiply plaintext 1/n to the result. Since there are not enough padding bits, the outcome of plaintext multiplication is inaccurate. In summary, the bootstrapping after ciphertext multiplication reduces the padding bits and precision, and as a result, other homomorphic operations cannot be performed well.

I guess if we want to perform ciphertext multiplication, we would have to wait till the update. Otherwise, for now, with the current API, it is a bit hard to adjust encoding parameters (sorry if we are mistakenly wrong).

Hello! We’re actively working on it! The leveled multiplication is composed of a tensor product between two GLWE ciphertexts and then a relinearization. The tensor product PR is under review, and we’re preparing the relinearization one. Then we’ll be able to expose the leveled multiplication itself. We’ll keep you updated!